diff --git a/arduino/libretuya/api/WiFi/WiFi.h b/arduino/libretuya/api/WiFi/WiFi.h index 02015cf..a09b6b6 100644 --- a/arduino/libretuya/api/WiFi/WiFi.h +++ b/arduino/libretuya/api/WiFi/WiFi.h @@ -156,6 +156,7 @@ class WiFiClass { ); int16_t scanComplete(); + uint8_t scanAlloc(uint8_t count); void scanInit(); void scanDelete(); diff --git a/arduino/libretuya/api/WiFi/WiFiScan.cpp b/arduino/libretuya/api/WiFi/WiFiScan.cpp index c0a11fa..aabf052 100644 --- a/arduino/libretuya/api/WiFi/WiFiScan.cpp +++ b/arduino/libretuya/api/WiFi/WiFiScan.cpp @@ -31,39 +31,45 @@ void WiFiClass::scanDelete() { if (!scan) return; for (uint8_t i = 0; i < scan->count; i++) { - free(scan->ssid[i]); + free(scan->ap[i].ssid); } - free(scan->ssid); - free(scan->auth); - free(scan->rssi); - free(scan->bssid); - free(scan->channel); + free(scan->ap); free(scan); scan = NULL; } +uint8_t WiFiClass::scanAlloc(uint8_t count) { + uint8_t last = scan->count; + scan->count = count; + scan->ap = (WiFiScanAP *)realloc(scan->ap, count * sizeof(WiFiScanAP)); + if (!scan->ap) + return 255; + memset(scan->ap + last, 0, sizeof(WiFiScanAP)); + return last; +} + String WiFiClass::SSID(uint8_t networkItem) { if (!scan || networkItem >= scan->count) return ""; - return scan->ssid[networkItem]; + return scan->ap[networkItem].ssid; } WiFiAuthMode WiFiClass::encryptionType(uint8_t networkItem) { if (!scan || networkItem >= scan->count) return WIFI_AUTH_INVALID; - return scan->auth[networkItem]; + return scan->ap[networkItem].auth; } int32_t WiFiClass::RSSI(uint8_t networkItem) { if (!scan || networkItem >= scan->count) return 0; - return scan->rssi[networkItem]; + return scan->ap[networkItem].rssi; } uint8_t *WiFiClass::BSSID(uint8_t networkItem) { if (!scan || networkItem >= scan->count) return NULL; - return scan->bssid[networkItem].addr; + return scan->ap[networkItem].bssid.addr; } String WiFiClass::BSSIDstr(uint8_t networkItem) { @@ -73,5 +79,5 @@ String WiFiClass::BSSIDstr(uint8_t networkItem) { int32_t WiFiClass::channel(uint8_t networkItem) { if (!scan || networkItem >= scan->count) return 0; - return scan->channel[networkItem]; + return scan->ap[networkItem].channel; } diff --git a/arduino/libretuya/api/WiFi/WiFiType.h b/arduino/libretuya/api/WiFi/WiFiType.h index e6299d0..123af55 100644 --- a/arduino/libretuya/api/WiFi/WiFiType.h +++ b/arduino/libretuya/api/WiFi/WiFiType.h @@ -129,13 +129,17 @@ typedef enum { } wifi_err_reason_t; typedef struct { - bool running = false; - uint8_t count = 0; - char **ssid = NULL; - WiFiAuthMode *auth = NULL; - int32_t *rssi = NULL; - WiFiMacAddr *bssid = NULL; - int32_t *channel = NULL; + char *ssid; + WiFiAuthMode auth; + int32_t rssi; + WiFiMacAddr bssid; + int32_t channel; +} WiFiScanAP; + +typedef struct { + bool running = false; + uint8_t count = 0; + WiFiScanAP *ap = NULL; } WiFiScanData; typedef enum { diff --git a/arduino/realtek-ambz/libraries/WiFi/WiFiScan.cpp b/arduino/realtek-ambz/libraries/WiFi/WiFiScan.cpp index 80780bc..50415a8 100644 --- a/arduino/realtek-ambz/libraries/WiFi/WiFiScan.cpp +++ b/arduino/realtek-ambz/libraries/WiFi/WiFiScan.cpp @@ -17,20 +17,13 @@ static rtw_result_t scanHandler(rtw_scan_handler_result_t *result) { rtw_scan_result_t *net = &result->ap_details; net->SSID.val[net->SSID.len] = '\0'; - uint8_t newSize = scan->count + 1; - scan->ssid = (char **)realloc(scan->ssid, newSize * sizeof(char *)); - scan->auth = (WiFiAuthMode *)realloc(scan->auth, newSize * sizeof(WiFiAuthMode)); - scan->rssi = (int32_t *)realloc(scan->rssi, newSize * sizeof(int32_t)); - scan->bssid = (WiFiMacAddr *)realloc(scan->bssid, newSize * sizeof(WiFiMacAddr)); - scan->channel = (int32_t *)realloc(scan->channel, newSize * sizeof(int32_t)); + uint8_t last = cls->scanAlloc(scan->count + 1); - scan->ssid[scan->count] = (char *)malloc((net->SSID.len + 1) * sizeof(char)); - strcpy(scan->ssid[scan->count], (char *)net->SSID.val); - scan->auth[scan->count] = securityTypeToAuthMode(net->security); - scan->rssi[scan->count] = net->signal_strength; - memcpy(scan->bssid[scan->count].addr, net->BSSID.octet, ETH_ALEN); - scan->channel[scan->count] = net->channel; - scan->count++; + scan->ap[last].ssid = strdup((char *)net->SSID.val); + scan->ap[last].auth = securityTypeToAuthMode(net->security); + scan->ap[last].rssi = net->signal_strength; + scan->ap[last].channel = net->channel; + memcpy(scan->ap[last].bssid.addr, net->BSSID.octet, ETH_ALEN); return RTW_SUCCESS; }