From f0d2990894367fa784138ba2be2d82a7a1346301 Mon Sep 17 00:00:00 2001 From: Christian Baars Date: Fri, 27 May 2022 20:51:59 +0200 Subject: [PATCH] fix scan mode switching, return option values --- tasmota/xsns_62_esp32_mi.h | 7 +++- tasmota/xsns_62_esp32_mi.ino | 81 +++++++++++++++++++++++++++--------- 2 files changed, 66 insertions(+), 22 deletions(-) diff --git a/tasmota/xsns_62_esp32_mi.h b/tasmota/xsns_62_esp32_mi.h index ba01d619a..3b5a2e000 100644 --- a/tasmota/xsns_62_esp32_mi.h +++ b/tasmota/xsns_62_esp32_mi.h @@ -169,6 +169,8 @@ struct { uint32_t autoScan:1; uint32_t canScan:1; uint32_t runningScan:1; + uint32_t updateScan:1; + uint32_t deleteScanTask:1; uint32_t canConnect:1; uint32_t willConnect:1; @@ -387,7 +389,7 @@ const char * kMI32DeviceType[] PROGMEM = {kMI32DeviceType1,kMI32DeviceType2,kMI3 const char kMI32_ConnErrorMsg[] PROGMEM = "no Error|could not connect|did disconnect|got no service|got no characteristic|can not read|can not notify|can not write|did not write|notify time out"; -const char kMI32_BLEInfoMsg[] PROGMEM = "Scan ended|Got Notification|Did connect|Did disconnect|Still connected|Start scanning"; +const char kMI32_BLEInfoMsg[] PROGMEM = "Scan ended|Got Notification|Did connect|Did disconnect|Still connected|Start passive scanning|Start active scanning"; const char kMI32_HKInfoMsg[] PROGMEM = "HAP core started|HAP core did not start!!|HAP controller disconnected|HAP controller connected|HAP outlet added"; @@ -426,7 +428,8 @@ enum MI32_BLEInfoMsg { MI32_DID_CONNECT, MI32_DID_DISCONNECT, MI32_STILL_CONNECTED, - MI32_START_SCANNING + MI32_START_SCANNING_PASSIVE, + MI32_START_SCANNING_ACTIVE }; enum MI32_HKInfoMsg { diff --git a/tasmota/xsns_62_esp32_mi.ino b/tasmota/xsns_62_esp32_mi.ino index cf67afb92..1adf5ab08 100644 --- a/tasmota/xsns_62_esp32_mi.ino +++ b/tasmota/xsns_62_esp32_mi.ino @@ -81,7 +81,6 @@ std::vector MIBLEsensors; static BLEScan* MI32Scan; - /*********************************************************************************************\ * Classes \*********************************************************************************************/ @@ -641,6 +640,8 @@ void MI32Init(void) { } if (!MI32.mode.init) { + NimBLEDevice::setScanFilterMode(CONFIG_BTDM_SCAN_DUPL_TYPE_DATA_DEVICE); + NimBLEDevice::setScanDuplicateCacheSize(40); // will not be perfect for every situation (few vs many BLE devices nearby) NimBLEDevice::init(""); AddLog(LOG_LEVEL_INFO,PSTR("M32: Init BLE device")); MI32.mode.init = 1; @@ -1031,13 +1032,11 @@ void MI32StartTask(uint32_t task){ switch(task){ case MI32_TASK_SCAN: if (MI32.mode.connected == 1) return; - if(MI32.option.activeScan){ - AddLog(LOG_LEVEL_INFO,PSTR("M32: Scan mode: active!")); // may have negative side effects!! - } MI32StartScanTask(); break; case MI32_TASK_CONN: if (MI32.mode.canConnect == 0) return; + MI32.mode.deleteScanTask = 1; MI32StartConnectionTask(); break; default: @@ -1063,25 +1062,37 @@ void MI32ScanTask(void *pvParameters){ if(MI32.mode.didGetConfig){ vTaskDelay(5000/ portTICK_PERIOD_MS); } - if (MI32Scan == nullptr) MI32Scan = NimBLEDevice::getScan(); - MI32Scan->setInterval(70); - MI32Scan->setWindow(50); - MI32Scan->setAdvertisedDeviceCallbacks(&MI32ScanCallbacks,true); + MI32Scan = NimBLEDevice::getScan(); + + MI32Scan->setAdvertisedDeviceCallbacks(&MI32ScanCallbacks,false); if(NimBLEDevice::getWhiteListCount()>0){ MI32Scan->setFilterPolicy(BLE_HCI_SCAN_FILT_USE_WL); } else { MI32Scan->setFilterPolicy(BLE_HCI_SCAN_FILT_NO_WL); } - MI32Scan->setActiveScan(MI32.option.activeScan); + + MI32Scan->setActiveScan(MI32.option.activeScan == 1); MI32Scan->setMaxResults(0); MI32Scan->start(0, MI32scanEndedCB, false); // never stop scanning, will pause automatically while connecting - MI32.infoMsg = MI32_START_SCANNING; + MI32.infoMsg = MI32.option.activeScan?MI32_START_SCANNING_ACTIVE:MI32_START_SCANNING_PASSIVE; uint32_t timer = 0; for(;;){ - vTaskDelay(10000/ portTICK_PERIOD_MS); + vTaskDelay(1000/ portTICK_PERIOD_MS); + if(MI32.mode.deleteScanTask){ + MI32Scan->stop(); + MI32.mode.runningScan = 0; + break; + } + if(MI32.mode.updateScan){ + MI32Scan->stop(); + MI32Scan->setActiveScan(MI32.option.activeScan == 1); + MI32Scan->start(0,true); + MI32.mode.updateScan = 0; + MI32.infoMsg = MI32.option.activeScan?MI32_START_SCANNING_ACTIVE:MI32_START_SCANNING_PASSIVE; + } } vTaskDelete( NULL ); } @@ -1742,25 +1753,55 @@ void CmndMi32Option(void){ bool onOff = atoi(XdrvMailbox.data); switch(XdrvMailbox.index) { case 0: - MI32.option.allwaysAggregate = onOff; + if(XdrvMailbox.data_len>0){ + MI32.option.allwaysAggregate = onOff; + } + else{ + onOff = MI32.option.allwaysAggregate; + } break; case 1: - MI32.option.noSummary = onOff; + if(XdrvMailbox.data_len>0){ + MI32.option.noSummary = onOff; + } + else{ + onOff = MI32.option.noSummary; + } break; case 2: - MI32.option.directBridgeMode = onOff; + if(XdrvMailbox.data_len>0){ + MI32.option.directBridgeMode = onOff; + } + else{ + onOff = MI32.option.directBridgeMode; + } break; case 3: - MI32.mode.didGetConfig = onOff; + if(XdrvMailbox.data_len>0){ + MI32.mode.didGetConfig = onOff; + } + else{ + onOff = MI32.mode.didGetConfig; + } break; case 4: - if(MI32.option.activeScan != onOff){ - MI32.option.activeScan = onOff; - MI32StartTask(MI32_TASK_SCAN); + if(XdrvMailbox.data_len>0){ + if(MI32.option.activeScan != onOff){ + MI32.option.activeScan = onOff; + if(MI32.mode.runningScan){ + MI32.mode.updateScan = 1; + } + else{ + MI32StartTask(MI32_TASK_SCAN); + } + } + } + else{ + onOff = MI32.option.activeScan; } break; } - ResponseCmndDone(); + ResponseCmndIdxNumber(onOff?1:0); } /*********************************************************************************************\ @@ -2301,7 +2342,7 @@ int ExtStopBLE(){ if(Settings->flag5.mi32_enable == 0) return 0; if (MI32.ScanTask != nullptr){ MI32Scan->stop(); - vTaskDelete(MI32.ScanTask); + MI32.mode.deleteScanTask = 1; AddLog(LOG_LEVEL_INFO,PSTR("M32: stop BLE")); } #ifdef USE_MI_HOMEKIT