diff --git a/libraries/WiFi/src/WiFi.h b/libraries/WiFi/src/WiFi.h index 221da37..8e16e7c 100755 --- a/libraries/WiFi/src/WiFi.h +++ b/libraries/WiFi/src/WiFi.h @@ -42,6 +42,11 @@ class WiFiClass : public WiFiGenericClass, public WiFiSTAClass, public WiFiScanC using WiFiSTAClass::BSSIDstr; using WiFiScanClass::SSID; + // using WiFiScanClass::encryptionType; + using WiFiScanClass::RSSI; + // using WiFiScanClass::BSSID; + // using WiFiScanClass::BSSIDstr; + using WiFiScanClass::channel; public: void enableProv(bool status); diff --git a/libraries/WiFi/src/WiFiGeneric.cpp b/libraries/WiFi/src/WiFiGeneric.cpp index bbb698e..8e65335 100755 --- a/libraries/WiFi/src/WiFiGeneric.cpp +++ b/libraries/WiFi/src/WiFiGeneric.cpp @@ -199,8 +199,21 @@ int WiFiGenericClass::_eventCallback(arduino_event_t *event) LOG_D("Arduino Event: %d - %s", event->event_id, WiFi.eventName(event->event_id)); - if(event->event_id == ARDUINO_EVENT_WIFI_SCAN_DONE) { - WiFiScanClass::_scanDone(); + // if(event->event_id == ARDUINO_EVENT_WIFI_SCAN_DONE) { + // WiFiScanClass::_scanDone(); + // } + switch (event->event_id) { + case ARDUINO_EVENT_WIFI_SCAN_DONE : { + WiFiScanClass::_scanDone(); + } + break; + // case ARDUINO_EVENT_WIFI_STA_GOT_IP : { + // WiFiSTAClass::_setStatus(); + // } + // break; + + default: + break; } return 0; @@ -349,3 +362,22 @@ int WiFiGenericClass::clearStatusBits(int bits){ } return xEventGroupClearBits(_arduino_event_group, bits); } + +int WiFiGenericClass::getStatusBits(){ + if(!_arduino_event_group){ + return 0; + } + return xEventGroupGetBits(_arduino_event_group); +} + +int WiFiGenericClass::waitStatusBits(int bits, uint32_t timeout_ms){ + if(!_arduino_event_group){ + return 0; + } + return xEventGroupWaitBits( + _arduino_event_group, // The event group being tested. + bits, // The bits within the event group to wait for. + pdFALSE, // BIT_0 and BIT_4 should be cleared before returning. + pdTRUE, // Don't wait for both bits, either bit will do. + timeout_ms / portTICK_PERIOD_MS ) & bits; // Wait a maximum of 100ms for either bit to be set. +} diff --git a/libraries/WiFi/src/WiFiScan.cpp b/libraries/WiFi/src/WiFiScan.cpp index 26229fa..438031a 100755 --- a/libraries/WiFi/src/WiFiScan.cpp +++ b/libraries/WiFi/src/WiFiScan.cpp @@ -32,6 +32,9 @@ void* WiFiScanClass::_scanResult = 0; int16_t WiFiScanClass::scanNetworks(bool async, bool show_hidden, bool passive, uint32_t max_ms_per_chan, uint8_t channel, const char *ssid, const uint8_t *bssid) { + if (WiFiGenericClass::getStatusBits() & WIFI_SCANNING_BIT) { + return WIFI_SCAN_RUNNING; + } WiFiScanClass::_scanTimeout = max_ms_per_chan * 20; WiFiScanClass::_scanAsync = async; @@ -46,9 +49,10 @@ int16_t WiFiScanClass::scanNetworks(bool async, bool show_hidden, bool passive, wifi_mgmr_scan_params_t config; memset(&config, 0 , sizeof(wifi_mgmr_scan_params_t)); - ret = wifi_mgmr_sta_scan(&config); - + WiFiGenericClass::clearStatusBits(WIFI_SCAN_DONE_BIT); + WiFiGenericClass::setStatusBits(WIFI_SCANNING_BIT); + ret = wifi_mgmr_sta_scan(&config); if (ret < 0) { printf("scan failed !\r\n"); @@ -61,9 +65,12 @@ int16_t WiFiScanClass::scanNetworks(bool async, bool show_hidden, bool passive, } -String WiFiScanClass::SSID(uint8_t i) +void * WiFiScanClass::_getScanInfoByIndex(int i) { - + if (!WiFiScanClass::_scanResult || (size_t) i >= WiFiScanClass::_scanCount) { + return 0; + } + return reinterpret_cast(WiFiScanClass::_scanResult) + i; } void WiFiScanClass::_scanDone() @@ -71,12 +78,40 @@ void WiFiScanClass::_scanDone() (WiFiScanClass::_scanCount) = wifi_mgmr_sta_scanlist_nums_get(); if(WiFiScanClass::_scanCount) { // printf("scan done:%d\r\n", WiFiScanClass::_scanCount); - // WiFiScanClass::_scanResult = new wifi_ap_record_t[WiFiScanClass::_scanCount]; - // if(!WiFiScanClass::_scanResult || esp_wifi_scan_get_ap_records(&(WiFiScanClass::_scanCount), (wifi_ap_record_t*)_scanResult) != ESP_OK) { - // WiFiScanClass::_scanCount = 0; - // } + // WiFiScanClass::_scanResult = new wifi_mgmr_scan_item_t[WiFiScanClass::_scanCount]; + wifi_mgmr_scan_item_t _scanResult[50]; // max count 50 + if(!WiFiScanClass::_scanResult || (wifi_mgmr_sta_scanlist_dump((wifi_mgmr_scan_item_t*)_scanResult, (WiFiScanClass::_scanCount)) < 0)) { + WiFiScanClass::_scanResult = 0; + } } WiFiScanClass::_scanStarted=0; //Reset after a scan is completed for normal behavior WiFiGenericClass::setStatusBits(WIFI_SCAN_DONE_BIT); WiFiGenericClass::clearStatusBits(WIFI_SCANNING_BIT); } + +String WiFiScanClass::SSID(uint8_t i) +{ + wifi_mgmr_scan_item_t * it = reinterpret_cast(_getScanInfoByIndex(i)); + if (!it) { + return String(); + } + return String(reinterpret_cast(it->ssid)); +} + +int32_t WiFiScanClass::RSSI(uint8_t i) +{ + wifi_mgmr_scan_item_t * it = reinterpret_cast(_getScanInfoByIndex(i)); + if(!it) { + return 0; + } + return it->rssi; +} + +int32_t WiFiScanClass::channel(uint8_t i) +{ + wifi_mgmr_scan_item_t * it = reinterpret_cast(_getScanInfoByIndex(i)); + if(!it) { + return 0; + } + return it->channel; +} diff --git a/libraries/WiFi/src/WiFiScan.h b/libraries/WiFi/src/WiFiScan.h index 355ee43..07a7f2a 100755 --- a/libraries/WiFi/src/WiFiScan.h +++ b/libraries/WiFi/src/WiFiScan.h @@ -12,6 +12,10 @@ Copyright (c) 2023 Bouffalo Lab Intelligent Technology (Nanjing) Co., Ltd. All r #include "WiFiType.h" #include "WiFiGeneric.h" +// extern "C" { +// #include "wifi_mgmr_ext.h" +// } + class WiFiScanClass { public: @@ -19,6 +23,9 @@ class WiFiScanClass int16_t scanNetworks(bool async = false,bool show_hidden = false, bool passive = false, uint32_t max_ms_per_chan = 300, uint8_t channel = 0, const char * ssid=nullptr, const uint8_t * bssid=nullptr); String SSID(uint8_t networkItem); + int32_t RSSI(uint8_t networkItem); + int32_t channel(uint8_t networkItem); + static void * getScanInfoByIndex(int i) { return _getScanInfoByIndex(i); }; static void _scanDone(); @@ -31,7 +38,9 @@ class WiFiScanClass static uint16_t _scanCount; static void* _scanResult; + // static wifi_mgmr_scan_item_t _scanResult[50]; // max count 50 + static void * _getScanInfoByIndex(int i); }; #endif // BOUFFALOLAB_WIFISCAN_H__ diff --git a/variants/BL618G0/libs/libbl6_os_adapter.a b/variants/BL618G0/libs/libbl6_os_adapter.a index 6a1850e..65e8bad 100755 Binary files a/variants/BL618G0/libs/libbl6_os_adapter.a and b/variants/BL618G0/libs/libbl6_os_adapter.a differ diff --git a/variants/BL618G0/libs/libwifi6.a b/variants/BL618G0/libs/libwifi6.a index 476f415..e75cfa0 100755 Binary files a/variants/BL618G0/libs/libwifi6.a and b/variants/BL618G0/libs/libwifi6.a differ