From 02f01f21991ea73ee43edf96b4cc40e2265520cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Wed, 17 Aug 2022 11:24:32 +0200 Subject: [PATCH] [beken-72xx] Initialize WiFiData when needed, null-terminate SSIDs --- arduino/beken-72xx/libraries/WiFi/WiFi.cpp | 24 ++++++++++++++++++ arduino/beken-72xx/libraries/WiFi/WiFiAP.cpp | 1 + .../beken-72xx/libraries/WiFi/WiFiGeneric.cpp | 23 ++--------------- arduino/beken-72xx/libraries/WiFi/WiFiPriv.h | 16 ++++++++++++ arduino/beken-72xx/libraries/WiFi/WiFiSTA.cpp | 25 ++++++++++--------- arduino/libretuya/api/WiFi/WiFi.cpp | 4 +++ arduino/libretuya/api/WiFi/WiFi.h | 2 ++ arduino/libretuya/api/WiFi/WiFiGeneric.cpp | 3 +++ 8 files changed, 65 insertions(+), 33 deletions(-) diff --git a/arduino/beken-72xx/libraries/WiFi/WiFi.cpp b/arduino/beken-72xx/libraries/WiFi/WiFi.cpp index 47ed5bc..24d6d4a 100644 --- a/arduino/beken-72xx/libraries/WiFi/WiFi.cpp +++ b/arduino/beken-72xx/libraries/WiFi/WiFi.cpp @@ -11,6 +11,30 @@ WiFiClass::~WiFiClass() { vSemaphoreDelete(data.scanSem); } +void WiFiClass::dataInitialize() { + if (data.statusIp) + return; + LT_D_WG("Init data struct"); + data.configSta = zalloc(sizeof(network_InitTypeDef_st)); + data.configAp = zalloc(sizeof(network_InitTypeDef_ap_st)); + data.statusIp = malloc(sizeof(IPStatusTypedef)); + data.statusLink = malloc(sizeof(LinkStatusTypeDef)); + STA_CFG->dhcp_mode = DHCP_CLIENT; + LT_D_WG("data status = %p", data.configSta); +} + +void WiFiClass::dataFree() { + LT_D_WG("Free data struct"); + free(data.configSta); + free(data.configAp); + free(data.statusIp); + free(data.statusLink); + data.configSta = NULL; + data.configAp = NULL; + data.statusIp = NULL; + data.statusLink = NULL; +} + WiFiStatus eventTypeToStatus(uint8_t type) { // rw_msg_pub.h:9 switch (type) { diff --git a/arduino/beken-72xx/libraries/WiFi/WiFiAP.cpp b/arduino/beken-72xx/libraries/WiFi/WiFiAP.cpp index 4e42a4d..58fe897 100644 --- a/arduino/beken-72xx/libraries/WiFi/WiFiAP.cpp +++ b/arduino/beken-72xx/libraries/WiFi/WiFiAP.cpp @@ -40,6 +40,7 @@ bool WiFiClass::softAP(const char *ssid, const char *passphrase, int channel, bo } bool WiFiClass::softAPConfig(IPAddress localIP, IPAddress gateway, IPAddress subnet) { + dataInitialize(); if (!localIP) { localIP = gateway = IPAddress(192, 168, 43, 1); subnet = IPAddress(255, 255, 255, 0); diff --git a/arduino/beken-72xx/libraries/WiFi/WiFiGeneric.cpp b/arduino/beken-72xx/libraries/WiFi/WiFiGeneric.cpp index 99d20e6..23a4803 100644 --- a/arduino/beken-72xx/libraries/WiFi/WiFiGeneric.cpp +++ b/arduino/beken-72xx/libraries/WiFi/WiFiGeneric.cpp @@ -6,16 +6,6 @@ bool WiFiClass::modePriv(WiFiMode mode, WiFiModeAction sta, WiFiModeAction ap) { __wrap_bk_printf_disable(); startWifiTask(); - if (mode && !data.statusIp) { - LT_D_WG("Init data struct"); - data.configSta = zalloc(sizeof(network_InitTypeDef_st)); - data.configAp = zalloc(sizeof(network_InitTypeDef_ap_st)); - data.statusIp = malloc(sizeof(IPStatusTypedef)); - data.statusLink = malloc(sizeof(LinkStatusTypeDef)); - STA_CFG->dhcp_mode = DHCP_CLIENT; - LT_D_WG("data status = %p", data.configSta); - } - if (!__bk_rf_is_init) { LT_D_WG("Initializing func&app"); func_init_extended(); @@ -62,17 +52,8 @@ bool WiFiClass::modePriv(WiFiMode mode, WiFiModeAction sta, WiFiModeAction ap) { // force checking actual mode again mode = getMode(); - if (!mode) { - LT_D_WG("Free data struct"); - free(data.configSta); - free(data.configAp); - free(data.statusIp); - free(data.statusLink); - data.configSta = NULL; - data.configAp = NULL; - data.statusIp = NULL; - data.statusLink = NULL; - } + if (!mode) + dataFree(); LT_HEAP_I(); diff --git a/arduino/beken-72xx/libraries/WiFi/WiFiPriv.h b/arduino/beken-72xx/libraries/WiFi/WiFiPriv.h index 63cc911..2b02cc3 100644 --- a/arduino/beken-72xx/libraries/WiFi/WiFiPriv.h +++ b/arduino/beken-72xx/libraries/WiFi/WiFiPriv.h @@ -55,4 +55,20 @@ extern void wifiEventHandler(rw_evt_type event); #define IP_STATUS ((IPStatusTypedef *)data.statusIp) #define LINK_STATUS ((LinkStatusTypeDef *)data.statusLink) +#define GET_LINK_STATUS_RETURN(ret) \ + { \ + if (!isConnected()) \ + return ret; \ + memset(LINK_STATUS, 0x00, sizeof(LinkStatusTypeDef)); \ + bk_wlan_get_link_status(LINK_STATUS); \ + } + +#define GET_IP_STATUS_RETURN(ret, iface) \ + { \ + if (!isConnected()) \ + return ret; \ + memset(IP_STATUS, 0x00, sizeof(IPStatusTypedef)); \ + bk_wlan_get_ip_status(IP_STATUS, iface); \ + } + } // extern "C" diff --git a/arduino/beken-72xx/libraries/WiFi/WiFiSTA.cpp b/arduino/beken-72xx/libraries/WiFi/WiFiSTA.cpp index 2d66827..b5ff1e4 100644 --- a/arduino/beken-72xx/libraries/WiFi/WiFiSTA.cpp +++ b/arduino/beken-72xx/libraries/WiFi/WiFiSTA.cpp @@ -27,8 +27,7 @@ WiFiClass::begin(const char *ssid, const char *passphrase, int32_t channel, cons } bool WiFiClass::config(IPAddress localIP, IPAddress gateway, IPAddress subnet, IPAddress dns1, IPAddress dns2) { - // need to initialize data struct first - enableSTA(true); + dataInitialize(); STA_CFG->dhcp_mode = localIP ? DHCP_DISABLE : DHCP_CLIENT; if (localIP) { @@ -64,6 +63,7 @@ bool WiFiClass::config(IPAddress localIP, IPAddress gateway, IPAddress subnet, I } bool WiFiClass::reconnect(const uint8_t *bssid) { + dataInitialize(); if (!bssid && !STA_CFG->wifi_ssid[0]) { LT_E("(B)SSID not specified"); goto error; @@ -106,8 +106,9 @@ error: bool WiFiClass::disconnect(bool wifiOff) { #if LT_DEBUG_WIFI + memset(LINK_STATUS, 0x00, sizeof(LinkStatusTypeDef)); bk_wlan_get_link_status(LINK_STATUS); - LT_D_WG("Disconnecting from %s", LINK_STATUS ? LINK_STATUS->ssid : NULL); + LT_D_WG("Disconnecting from %s (wifiOff=%d)", LINK_STATUS ? LINK_STATUS->ssid : NULL, wifiOff); #endif bk_wlan_connection_loss(); if (wifiOff) @@ -124,28 +125,28 @@ bool WiFiClass::getAutoReconnect() { } IPAddress WiFiClass::localIP() { - bk_wlan_get_ip_status(IP_STATUS, BK_STATION); + GET_IP_STATUS_RETURN((uint32_t)0, BK_STATION); IPAddress ip; ip.fromString(IP_STATUS->ip); return ip; } IPAddress WiFiClass::subnetMask() { - bk_wlan_get_ip_status(IP_STATUS, BK_STATION); + GET_IP_STATUS_RETURN((uint32_t)0, BK_STATION); IPAddress ip; ip.fromString(IP_STATUS->mask); return ip; } IPAddress WiFiClass::gatewayIP() { - bk_wlan_get_ip_status(IP_STATUS, BK_STATION); + GET_IP_STATUS_RETURN((uint32_t)0, BK_STATION); IPAddress ip; ip.fromString(IP_STATUS->gate); return ip; } IPAddress WiFiClass::dnsIP(uint8_t dns_no) { - bk_wlan_get_ip_status(IP_STATUS, BK_STATION); + GET_IP_STATUS_RETURN((uint32_t)0, BK_STATION); IPAddress ip; ip.fromString(IP_STATUS->dns); return ip; @@ -189,7 +190,7 @@ bool WiFiClass::setMacAddress(const uint8_t *mac) { } const String WiFiClass::SSID() { - bk_wlan_get_link_status(LINK_STATUS); + GET_LINK_STATUS_RETURN(""); return (char *)LINK_STATUS->ssid; } @@ -203,21 +204,21 @@ const String WiFiClass::psk() { } uint8_t *WiFiClass::BSSID() { - bk_wlan_get_link_status(LINK_STATUS); + GET_LINK_STATUS_RETURN(NULL); return LINK_STATUS->bssid; } int32_t WiFiClass::channel() { - bk_wlan_get_link_status(LINK_STATUS); + GET_LINK_STATUS_RETURN(0); return LINK_STATUS->channel; } int8_t WiFiClass::RSSI() { - bk_wlan_get_link_status(LINK_STATUS); + GET_LINK_STATUS_RETURN(0); return LINK_STATUS->wifi_strength; } WiFiAuthMode WiFiClass::getEncryption() { - bk_wlan_get_link_status(LINK_STATUS); + GET_LINK_STATUS_RETURN(WIFI_AUTH_INVALID); return securityTypeToAuthMode(LINK_STATUS->security); } diff --git a/arduino/libretuya/api/WiFi/WiFi.cpp b/arduino/libretuya/api/WiFi/WiFi.cpp index 0d9db62..eefece8 100644 --- a/arduino/libretuya/api/WiFi/WiFi.cpp +++ b/arduino/libretuya/api/WiFi/WiFi.cpp @@ -63,5 +63,9 @@ bool WiFiClass::validate(const char *ssid, const char *passphrase) { return true; } +__attribute__((weak)) void WiFiClass::dataInitialize() {} + +__attribute__((weak)) void WiFiClass::dataFree() {} + WiFiClass WiFi; WiFiClass *pWiFi = NULL; diff --git a/arduino/libretuya/api/WiFi/WiFi.h b/arduino/libretuya/api/WiFi/WiFi.h index 7e58c26..cd1b8e5 100644 --- a/arduino/libretuya/api/WiFi/WiFi.h +++ b/arduino/libretuya/api/WiFi/WiFi.h @@ -47,6 +47,8 @@ class WiFiClass { ~WiFiClass(); void printDiag(Print &dest); bool validate(const char *ssid, const char *passphrase); + void dataInitialize(); + void dataFree(); public: /* WiFiGeneric.cpp */ bool mode(WiFiMode mode); diff --git a/arduino/libretuya/api/WiFi/WiFiGeneric.cpp b/arduino/libretuya/api/WiFi/WiFiGeneric.cpp index 2928e95..797c2f2 100644 --- a/arduino/libretuya/api/WiFi/WiFiGeneric.cpp +++ b/arduino/libretuya/api/WiFi/WiFiGeneric.cpp @@ -17,6 +17,9 @@ bool WiFiClass::mode(WiFiMode mode) { // change 0/1 to 1/2 sta = WiFiModeAction(sta + sta * (mode & WIFI_MODE_STA)); ap = WiFiModeAction(ap + ap * (mode & WIFI_MODE_AP)); + // initialize data structures if wifi is enabled + if (mode) + dataInitialize(); // actually change the mode LT_HEAP_I(); return modePriv(mode, sta, ap);