diff --git a/firmware/esp32/overland-controller/overland-controller.ino b/firmware/esp32/overland-controller/overland-controller.ino
index 60147d3..fa968d3 100644
--- a/firmware/esp32/overland-controller/overland-controller.ino
+++ b/firmware/esp32/overland-controller/overland-controller.ino
@@ -639,12 +639,15 @@ button[onclick^="scan"]{
+
BMS Polling--
+
+
@@ -1070,6 +1073,46 @@ async function saveDeviceConfig(){
clearConfigTouched(["deviceNameInput"]);
}
+
+async function scanBmsDevices(){
+ const status=$("bmsScanStatus");
+ const box=$("bmsScanResults");
+ if(status) status.textContent="Scanning for BLE BMS devices...";
+ if(box) box.innerHTML="";
+
+ try{
+ const res=await fetch(api("/bms/scan"),{method:"POST"});
+ const data=await res.json();
+ const devices=data.devices||[];
+
+ if(status) status.textContent=devices.length ? `Found ${devices.length} device(s).` : "No BLE devices found.";
+
+ if(box){
+ box.innerHTML=devices.map(d=>`
+
+
+
${d.name||"Unnamed BLE device"}
+
${d.address||""} RSSI ${d.rssi??"--"}
+
+
+
+ `).join("");
+ }
+ }catch(e){
+ if(status) status.textContent="BMS scan failed.";
+ }
+}
+
+function selectScannedBms(address,name){
+ setConfigValue("bmsNameInput",name||"BMS",true);
+ setConfigValue("bmsAddressInput",address||"",true);
+ setConfigValue("bmsAddressTypeInput","public",true);
+ markConfigFieldTouched("bmsNameInput");
+ markConfigFieldTouched("bmsAddressInput");
+ markConfigFieldTouched("bmsAddressTypeInput");
+}
+
+
async function saveBmsFullConfig(){
const name=$("bmsNameInput")?.value.trim()||"BMS";
const address=$("bmsAddressInput")?.value.trim()||"";