[realtek-ambz] Simplify WiFi scan result handler

This commit is contained in:
Kuba Szczodrzyński
2022-06-27 13:01:06 +02:00
parent b625f636be
commit 4c6bbb8aae
4 changed files with 35 additions and 31 deletions

View File

@@ -156,6 +156,7 @@ class WiFiClass {
);
int16_t scanComplete();
uint8_t scanAlloc(uint8_t count);
void scanInit();
void scanDelete();

View File

@@ -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;
}

View File

@@ -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 {

View File

@@ -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;
}