From 6d47e3cb76165b91ca385b56517dfdcd40e503e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Wed, 27 Apr 2022 23:41:41 +0200 Subject: [PATCH] [realtek-ambz] Fix (some) WiFi crashes --- arduino/libretuya/api/WiFiClient.h | 5 +---- arduino/realtek-ambz/cores/arduino/hooks.c | 7 ++++++- arduino/realtek-ambz/libraries/WiFi/WiFiAP.cpp | 2 ++ arduino/realtek-ambz/libraries/WiFi/WiFiClient.cpp | 9 ++++++--- arduino/realtek-ambz/libraries/WiFi/WiFiClient.h | 1 + arduino/realtek-ambz/libraries/WiFi/WiFiServer.cpp | 2 +- 6 files changed, 17 insertions(+), 9 deletions(-) diff --git a/arduino/libretuya/api/WiFiClient.h b/arduino/libretuya/api/WiFiClient.h index 562a59b..b209570 100644 --- a/arduino/libretuya/api/WiFiClient.h +++ b/arduino/libretuya/api/WiFiClient.h @@ -28,9 +28,7 @@ class IWiFiClient : public Client { IWiFiClient(int sock) {} - ~IWiFiClient() { - stop(); - } + ~IWiFiClient() {} virtual int connect(IPAddress ip, uint16_t port, int32_t timeout) = 0; virtual int connect(const char *host, uint16_t port, int32_t timeout) = 0; @@ -70,5 +68,4 @@ class IWiFiClient : public Client { virtual uint16_t localPort(int sock) const = 0; using Print::write; - using Client::stop; }; diff --git a/arduino/realtek-ambz/cores/arduino/hooks.c b/arduino/realtek-ambz/cores/arduino/hooks.c index aa16d11..677ed74 100644 --- a/arduino/realtek-ambz/cores/arduino/hooks.c +++ b/arduino/realtek-ambz/cores/arduino/hooks.c @@ -28,7 +28,12 @@ static void __empty() { // Empty } -void yield(void) __attribute__ ((weak, alias("__empty"))); + +#include "cmsis_os.h" + +void yield(void) { + taskYIELD(); +} /** * SysTick hook diff --git a/arduino/realtek-ambz/libraries/WiFi/WiFiAP.cpp b/arduino/realtek-ambz/libraries/WiFi/WiFiAP.cpp index 96d78d7..27c312c 100644 --- a/arduino/realtek-ambz/libraries/WiFi/WiFiAP.cpp +++ b/arduino/realtek-ambz/libraries/WiFi/WiFiAP.cpp @@ -5,6 +5,8 @@ bool WiFiClass::softAP(const char *ssid, const char *passphrase, int channel, bo if (!enableAP(true)) return false; + vTaskDelay(20); + if (!ssid || *ssid == 0x00 || strlen(ssid) > 32) return false; diff --git a/arduino/realtek-ambz/libraries/WiFi/WiFiClient.cpp b/arduino/realtek-ambz/libraries/WiFi/WiFiClient.cpp index 5ab2a0f..cd1171f 100644 --- a/arduino/realtek-ambz/libraries/WiFi/WiFiClient.cpp +++ b/arduino/realtek-ambz/libraries/WiFi/WiFiClient.cpp @@ -2,7 +2,6 @@ #include "WiFiPriv.h" WiFiClient::WiFiClient() { - DiagPrintf("WiFiClient()\r\n"); _sock = -1; _connected = false; _rxBuffer = NULL; @@ -16,6 +15,10 @@ WiFiClient::WiFiClient(int sock) { _timeout = WIFI_CLIENT_CONNECT_TIMEOUT; } +WiFiClient::~WiFiClient() { + stop(); +} + WiFiClient &WiFiClient::operator=(const IWiFiClient &other) { stop(); WiFiClient *oth = (WiFiClient *)&other; @@ -254,14 +257,14 @@ void WiFiClient::stop() { lwip_close(_sock); _sock = -1; _connected = false; - free(_rxBuffer); + delete _rxBuffer; _rxBuffer = NULL; } uint8_t WiFiClient::connected() { if (_connected) { uint8_t dummy; - if (lwip_recv(_sock, &dummy, 0, MSG_DONTWAIT) < 0) { + if (lwip_recv(_sock, &dummy, 0, MSG_DONTWAIT) <= 0) { switch (errno) { case EWOULDBLOCK: case ENOENT: // caused by vfs diff --git a/arduino/realtek-ambz/libraries/WiFi/WiFiClient.h b/arduino/realtek-ambz/libraries/WiFi/WiFiClient.h index 3c69aef..6ff04a8 100644 --- a/arduino/realtek-ambz/libraries/WiFi/WiFiClient.h +++ b/arduino/realtek-ambz/libraries/WiFi/WiFiClient.h @@ -12,6 +12,7 @@ class WiFiClient : public IWiFiClient { public: WiFiClient(); WiFiClient(int sock); + ~WiFiClient(); int connect(IPAddress ip, uint16_t port); int connect(const char *host, uint16_t port); diff --git a/arduino/realtek-ambz/libraries/WiFi/WiFiServer.cpp b/arduino/realtek-ambz/libraries/WiFi/WiFiServer.cpp index 52f2997..b7fc0a3 100644 --- a/arduino/realtek-ambz/libraries/WiFi/WiFiServer.cpp +++ b/arduino/realtek-ambz/libraries/WiFi/WiFiServer.cpp @@ -51,7 +51,7 @@ WiFiClient WiFiServer::accept() { return WiFiClient(); int sock; - if (_sockAccepted) { + if (_sockAccepted >= 0) { sock = _sockAccepted; _sockAccepted = -1; } else {