From b0d9e75d5049e5cfaffdee652035b4cfc28c1338 Mon Sep 17 00:00:00 2001 From: David Refoua Date: Sun, 17 Mar 2024 21:28:39 +0330 Subject: [PATCH 01/50] LwipIntf - typo (#9103) --- cores/esp8266/LwipIntf.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/esp8266/LwipIntf.cpp b/cores/esp8266/LwipIntf.cpp index e142730df0..675063cd62 100644 --- a/cores/esp8266/LwipIntf.cpp +++ b/cores/esp8266/LwipIntf.cpp @@ -43,7 +43,7 @@ extern "C" // can return nullptr when STA is down // - Because WiFi is started in off mode at boot time, // wifi_station_set/get_hostname() is now no more used -// because setting hostname firt does not work anymore +// because setting hostname first does not work anymore // - wifi_station_hostname is overwritten by SDK when wifi is // woken up in WiFi::mode() // From 2064d437a310ec552e2ecc5c8c9c0e40638a2f38 Mon Sep 17 00:00:00 2001 From: Max Prokhorov Date: Sun, 17 Mar 2024 21:11:32 +0300 Subject: [PATCH 02/50] ESP8266WiFi - document event handler lifetime, add [[nodiscard]] (#9087) * disallow not assigning wifieventhandler somewhere * fix markdown syntax in rst * mention lifetime in example and docs --- doc/esp8266wifi/generic-examples.rst | 25 ++++++++++++++----- .../soft-access-point-examples.rst | 4 ++- .../examples/WiFiEvents/WiFiEvents.ino | 7 ++++-- .../ESP8266WiFi/src/ESP8266WiFiGeneric.h | 18 ++++++------- 4 files changed, 36 insertions(+), 18 deletions(-) diff --git a/doc/esp8266wifi/generic-examples.rst b/doc/esp8266wifi/generic-examples.rst index bbac0cd839..e139e3e5b5 100644 --- a/doc/esp8266wifi/generic-examples.rst +++ b/doc/esp8266wifi/generic-examples.rst @@ -38,16 +38,29 @@ Register the Events To get events to work we need to complete just two steps: -1. Declare the event handler: +1. Declare the event handler in global scope. -``cpp WiFiEventHandler disconnectedEventHandler;`` +.. code:: cpp + WiFiEventHandler disconnectedEventHandler; + +Alternatively, it can be declared as ``static`` in both function and global scopes. -2. Select particular event (in this case ``onStationModeDisconnected``) - and add the code to be executed when event is fired. -``cpp disconnectedEventHandler = WiFi.onStationModeDisconnected([](const WiFiEventStationModeDisconnected& event) { Serial.println("Station disconnected"); });`` If this event is fired the code will print out information that station has been disconnected. +2. Select particular event (in this case ``onStationModeDisconnected``). + When this event is fired the code will print out information that station has been disconnected: + +.. code:: cpp + disconnectedEventHandler = WiFi.onStationModeDisconnected( + [](auto&& event) { + Serial.println("Station disconnected"); + }); + +3. Disable ``disconnectedEventHandler``, so the event is no longer handled by our callback: + +.. code:: cpp + disconnectedEventHandler = nullptr; -That's it. It is all we need to do. +Take note that lifetime of the callback handler is up to the app. e.g. if ``onStationModeDisconnected`` is declared in the function scope, it would be discarded immediately after the function exists. The Code ~~~~~~~~ diff --git a/doc/esp8266wifi/soft-access-point-examples.rst b/doc/esp8266wifi/soft-access-point-examples.rst index c4cf39c6c2..2c9fee762c 100644 --- a/doc/esp8266wifi/soft-access-point-examples.rst +++ b/doc/esp8266wifi/soft-access-point-examples.rst @@ -79,7 +79,9 @@ Sketch is small so analysis shouldn't be difficult. In first line we are includi Setting up of the access point ``ESPsoftAP_01`` is done by executing: -``cpp boolean result = WiFi.softAP("ESPsoftAP_01", "pass-to-soft-AP");`` +.. code:: cpp + + boolean result = WiFi.softAP("ESPsoftAP_01", "pass-to-soft-AP"); If this operation is successful then ``result`` will be ``true`` or ``false`` if otherwise. Basing on that either ``Ready`` or ``Failed!`` will be printed out by the following ``if - else`` conditional statement. diff --git a/libraries/ESP8266WiFi/examples/WiFiEvents/WiFiEvents.ino b/libraries/ESP8266WiFi/examples/WiFiEvents/WiFiEvents.ino index dddfde9f5b..7d66553b61 100644 --- a/libraries/ESP8266WiFi/examples/WiFiEvents/WiFiEvents.ino +++ b/libraries/ESP8266WiFi/examples/WiFiEvents/WiFiEvents.ino @@ -24,6 +24,9 @@ const char* ssid = APSSID; const char* password = APPSK; +// WiFi.on* methods **must** only be called **after** entering setup(). +// Assigning immediately in global scope is not adviced, neither is assigning them within any other object constructors. +// These variables **may** exist in function block, but **only** if they are declared as `static` WiFiEventHandler stationConnectedHandler; WiFiEventHandler stationDisconnectedHandler; WiFiEventHandler probeRequestPrintHandler; @@ -43,12 +46,12 @@ void setup() { WiFi.mode(WIFI_AP); WiFi.softAP(ssid, password); - // Register event handlers. - // Callback functions will be called as long as these handler objects exist. // Call "onStationConnected" each time a station connects stationConnectedHandler = WiFi.onSoftAPModeStationConnected(&onStationConnected); + // Call "onStationDisconnected" each time a station disconnects stationDisconnectedHandler = WiFi.onSoftAPModeStationDisconnected(&onStationDisconnected); + // Call "onProbeRequestPrint" and "onProbeRequestBlink" each time // a probe request is received. // Former will print MAC address of the station and RSSI to Serial, diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h index d0525176bd..e0ad560d0e 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiGeneric.h @@ -71,15 +71,15 @@ class ESP8266WiFiGenericClass { void onEvent(WiFiEventCb cb, WiFiEvent_t event = WIFI_EVENT_ANY) __attribute__((deprecated)); // Subscribe to specific event and get event information as an argument to the callback - WiFiEventHandler onStationModeConnected(std::function); - WiFiEventHandler onStationModeDisconnected(std::function); - WiFiEventHandler onStationModeAuthModeChanged(std::function); - WiFiEventHandler onStationModeGotIP(std::function); - WiFiEventHandler onStationModeDHCPTimeout(std::function); - WiFiEventHandler onSoftAPModeStationConnected(std::function); - WiFiEventHandler onSoftAPModeStationDisconnected(std::function); - WiFiEventHandler onSoftAPModeProbeRequestReceived(std::function); - WiFiEventHandler onWiFiModeChange(std::function); + [[nodiscard]] WiFiEventHandler onStationModeConnected(std::function); + [[nodiscard]] WiFiEventHandler onStationModeDisconnected(std::function); + [[nodiscard]] WiFiEventHandler onStationModeAuthModeChanged(std::function); + [[nodiscard]] WiFiEventHandler onStationModeGotIP(std::function); + [[nodiscard]] WiFiEventHandler onStationModeDHCPTimeout(std::function); + [[nodiscard]] WiFiEventHandler onSoftAPModeStationConnected(std::function); + [[nodiscard]] WiFiEventHandler onSoftAPModeStationDisconnected(std::function); + [[nodiscard]] WiFiEventHandler onSoftAPModeProbeRequestReceived(std::function); + [[nodiscard]] WiFiEventHandler onWiFiModeChange(std::function); uint8_t channel(void); From 760dbeeda9305d1f50c64be1668354cefbecdb20 Mon Sep 17 00:00:00 2001 From: david gauchard Date: Sun, 17 Mar 2024 19:52:26 +0100 Subject: [PATCH 03/50] emulation-on-host: +memcmp_P (#9093) --- tests/host/sys/pgmspace.h | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/host/sys/pgmspace.h b/tests/host/sys/pgmspace.h index ef878eaaff..ac60cb15be 100644 --- a/tests/host/sys/pgmspace.h +++ b/tests/host/sys/pgmspace.h @@ -82,5 +82,6 @@ inline int vsnprintf_P(char* str, size_t size, const char* format, va_list ap) #define strncmp_P strncmp #define strncasecmp_P strncasecmp #define strcat_P strcat +#define memcmp_P memcmp #endif From 1248d3874e0da70186925ec85cada6230de7b145 Mon Sep 17 00:00:00 2001 From: David Refoua Date: Mon, 18 Mar 2024 00:25:29 +0330 Subject: [PATCH 04/50] Updater - missing error codes (#9104) Adds the two missing error states when beginning an Update. There were debugging logs for this but the error state was not set which would lead to confusion --- cores/esp8266/Updater.cpp | 20 ++++++++++++++------ cores/esp8266/Updater.h | 8 +++++--- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/cores/esp8266/Updater.cpp b/cores/esp8266/Updater.cpp index 91f2a9e6ae..b4961b616d 100644 --- a/cores/esp8266/Updater.cpp +++ b/cores/esp8266/Updater.cpp @@ -70,6 +70,7 @@ bool UpdaterClass::begin(size_t size, int command, int ledPin, uint8_t ledOn) { #ifdef DEBUG_UPDATER DEBUG_UPDATER.println(F("[begin] already running")); #endif + _setError(UPDATE_ERROR_RUNNING_ALREADY); return false; } @@ -86,7 +87,7 @@ bool UpdaterClass::begin(size_t size, int command, int ledPin, uint8_t ledOn) { _setError(UPDATE_ERROR_BOOTSTRAP); return false; } - + #ifdef DEBUG_UPDATER if (command == U_FS) { DEBUG_UPDATER.println(F("[begin] Update Filesystem.")); @@ -133,7 +134,7 @@ bool UpdaterClass::begin(size_t size, int command, int ledPin, uint8_t ledOn) { //make sure that the size of both sketches is less than the total space (updateEndAddress) if(updateStartAddress < currentSketchSize) { - _setError(UPDATE_ERROR_SPACE); + _setError(UPDATE_ERROR_SPACE); return false; } } @@ -162,6 +163,7 @@ bool UpdaterClass::begin(size_t size, int command, int ledPin, uint8_t ledOn) { #ifdef DEBUG_UPDATER DEBUG_UPDATER.println(F("[begin] Unknown update command.")); #endif + _setError(UPDATE_ERROR_UNKNOWN_COMMAND); return false; } @@ -404,7 +406,7 @@ bool UpdaterClass::_writeBuffer(){ modifyFlashMode = true; } } - + if (eraseResult) { if(!_async) yield(); writeResult = ESP.flashWrite(_currentAddress, _buffer, _bufferLen); @@ -488,7 +490,7 @@ bool UpdaterClass::_verifyEnd() { uint8_t buf[4] __attribute__((aligned(4))); if(!ESP.flashRead(_startAddress, (uint32_t *) &buf[0], 4)) { _currentAddress = (_startAddress); - _setError(UPDATE_ERROR_READ); + _setError(UPDATE_ERROR_READ); return false; } @@ -500,7 +502,7 @@ bool UpdaterClass::_verifyEnd() { return true; } else if (buf[0] != 0xE9) { _currentAddress = (_startAddress); - _setError(UPDATE_ERROR_MAGIC_BYTE); + _setError(UPDATE_ERROR_MAGIC_BYTE); return false; } @@ -512,7 +514,7 @@ bool UpdaterClass::_verifyEnd() { // check if new bin fits to SPI flash if(bin_flash_size > ESP.getFlashChipRealSize()) { _currentAddress = (_startAddress); - _setError(UPDATE_ERROR_NEW_FLASH_CONFIG); + _setError(UPDATE_ERROR_NEW_FLASH_CONFIG); return false; } #endif @@ -649,6 +651,12 @@ String UpdaterClass::getErrorString() const { case UPDATE_ERROR_OOM: out = F("Out of memory"); break; + case UPDATE_ERROR_RUNNING_ALREADY: + out = F("Update already running"); + break; + case UPDATE_ERROR_UNKNOWN_COMMAND: + out = F("Unknown update command"); + break; default: out = F("UNKNOWN"); break; diff --git a/cores/esp8266/Updater.h b/cores/esp8266/Updater.h index ad652d3806..7ee1d28311 100644 --- a/cores/esp8266/Updater.h +++ b/cores/esp8266/Updater.h @@ -21,6 +21,8 @@ #define UPDATE_ERROR_SIGN (12) #define UPDATE_ERROR_NO_DATA (13) #define UPDATE_ERROR_OOM (14) +#define UPDATE_ERROR_RUNNING_ALREADY (15) +#define UPDATE_ERROR_UNKNOWN_COMMAND (16) #define U_FLASH 0 #define U_FS 100 @@ -55,7 +57,7 @@ class UpdaterClass { using THandlerFunction_Progress = std::function; using THandlerFunction_Error = std::function; using THandlerFunction = std::function; - + UpdaterClass(); ~UpdaterClass(); @@ -69,7 +71,7 @@ class UpdaterClass { bool begin(size_t size, int command = U_FLASH, int ledPin = -1, uint8_t ledOn = LOW); /* - Run Updater from asynchronous callbacs + Run Updater from asynchronous callbacks */ void runAsync(bool async){ _async = async; } @@ -216,7 +218,7 @@ class UpdaterClass { bool _verifyHeader(uint8_t data); bool _verifyEnd(); - void _setError(int error); + void _setError(int error); bool _async = false; uint8_t _error = 0; From dc9abed8b91de32e36e61d11e4ed829e5ecf5556 Mon Sep 17 00:00:00 2001 From: Holger Lembke Date: Sun, 17 Mar 2024 22:04:44 +0100 Subject: [PATCH 05/50] ESP8266WiFiMulti - get number of APs in the list (#9082) When having some more complex setups it might be helpful to know the number of APs already added to the list. --- libraries/ESP8266WiFi/src/ESP8266WiFiMulti.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.h b/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.h index fab5829afd..3c77df02d4 100644 --- a/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.h +++ b/libraries/ESP8266WiFi/src/ESP8266WiFiMulti.h @@ -69,7 +69,7 @@ class ESP8266WiFiMulti wl_status_t run(uint32_t connectTimeoutMs=WIFI_CONNECT_TIMEOUT_MS); void cleanAPlist(); - + int count() { return _APlist.size(); } private: WifiAPlist _APlist; bool _firstRun; From 2bb1b5a4d5f3a80ce229b6d50d7b03ac2d007cec Mon Sep 17 00:00:00 2001 From: Clemens Kirchgatterer Date: Tue, 19 Mar 2024 16:01:59 +0100 Subject: [PATCH 06/50] Fix semantic typo in generic-examples.rst (#9107) exists -> exits --- doc/esp8266wifi/generic-examples.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/esp8266wifi/generic-examples.rst b/doc/esp8266wifi/generic-examples.rst index e139e3e5b5..8cd919d156 100644 --- a/doc/esp8266wifi/generic-examples.rst +++ b/doc/esp8266wifi/generic-examples.rst @@ -60,7 +60,7 @@ Alternatively, it can be declared as ``static`` in both function and global scop .. code:: cpp disconnectedEventHandler = nullptr; -Take note that lifetime of the callback handler is up to the app. e.g. if ``onStationModeDisconnected`` is declared in the function scope, it would be discarded immediately after the function exists. +Take note that lifetime of the callback handler is up to the app. e.g. if ``onStationModeDisconnected`` is declared in the function scope, it would be discarded immediately after the function exits. The Code ~~~~~~~~ From 877d44059ef05ccc6bfa794ea1e47802b0bedf67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Holger=20M=C3=BCller?= Date: Sun, 24 Mar 2024 23:52:28 +0100 Subject: [PATCH 07/50] Add url redirect (#8970) * added getAvailableVersion(), moved _httpClientTimeout and _followRedirects to protected, added enum HTTPUpdateError * auto numbering of HTTPUpdateError enum * added getAvailableVersion(), debug output current current Sketch MD5 * Revert "added getAvailableVersion(), debug output current current Sketch MD5" This reverts commit 60d2c7762e7fb1fed7fae37fa99be149e12f125c. * Revert "auto numbering of HTTPUpdateError enum" This reverts commit 61785b27da3f2d42f8f95316d78ce22e5b00103a. * Revert "added getAvailableVersion(), moved _httpClientTimeout and _followRedirects to protected, added enum HTTPUpdateError" This reverts commit cec84ed17ab149d3e48082293f9e2723246b7d0b. * add redirect function * enhanced redirect() by cache control and client stop * updated redirect() comment * replaced redirect() API calls in examples * server.client().stop() not needed, redirect() does this --- .../CaptivePortalAdvanced/handleHttp.ino | 11 ++------- .../NAPTCaptivePortal/PortalRedirectHttp.ino | 4 +--- .../examples/WebServer/WebServer.ino | 3 +-- .../ESP8266WebServer/src/ESP8266WebServer.h | 24 +++++++++++++++++++ 4 files changed, 28 insertions(+), 14 deletions(-) diff --git a/libraries/DNSServer/examples/CaptivePortalAdvanced/handleHttp.ino b/libraries/DNSServer/examples/CaptivePortalAdvanced/handleHttp.ino index aec2556a48..c7380017d1 100644 --- a/libraries/DNSServer/examples/CaptivePortalAdvanced/handleHttp.ino +++ b/libraries/DNSServer/examples/CaptivePortalAdvanced/handleHttp.ino @@ -27,9 +27,7 @@ void handleRoot() { boolean captivePortal() { if (!isIp(server.hostHeader()) && server.hostHeader() != (String(myHostname) + ".local")) { Serial.println("Request redirected to captive portal"); - server.sendHeader("Location", String("http://") + toStringIp(server.client().localIP()), true); - server.send(302, "text/plain", ""); // Empty content inhibits Content-length header so we have to close the socket ourselves. - server.client().stop(); // Stop is needed because we sent no content length + server.redirect(String("http://") + toStringIp(server.client().localIP())); return true; } return false; @@ -91,12 +89,7 @@ void handleWifiSave() { Serial.println("wifi save"); server.arg("n").toCharArray(ssid, sizeof(ssid) - 1); server.arg("p").toCharArray(password, sizeof(password) - 1); - server.sendHeader("Location", "wifi", true); - server.sendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); - server.sendHeader("Pragma", "no-cache"); - server.sendHeader("Expires", "-1"); - server.send(302, "text/plain", ""); // Empty content inhibits Content-length header so we have to close the socket ourselves. - server.client().stop(); // Stop is needed because we sent no content length + server.redirect("wifi"); saveCredentials(); connect = strlen(ssid) > 0; // Request WLAN connect with new credentials if there is a SSID } diff --git a/libraries/DNSServer/examples/NAPTCaptivePortal/PortalRedirectHttp.ino b/libraries/DNSServer/examples/NAPTCaptivePortal/PortalRedirectHttp.ino index 286490772d..5de12229a5 100644 --- a/libraries/DNSServer/examples/NAPTCaptivePortal/PortalRedirectHttp.ino +++ b/libraries/DNSServer/examples/NAPTCaptivePortal/PortalRedirectHttp.ino @@ -36,13 +36,11 @@ void sendPortalRedirect(String path, String targetName) { If the "Location" header element works the HTML stuff is never seen. */ // https://tools.ietf.org/html/rfc7231#section-6.4.3 - server.sendHeader("Location", path, true); - addNoCacheHeader(); String reply = FPSTR(portalRedirectHTML); reply.reserve(reply.length() + 2 * path.length() + 80); reply.replace("{t}", targetName); reply.replace("{1}", path); - server.send(302, "text/html", reply); + server.redirect(path, reply); } #endif // LWIP_FEATURES && !LWIP_IPV6 diff --git a/libraries/ESP8266WebServer/examples/WebServer/WebServer.ino b/libraries/ESP8266WebServer/examples/WebServer/WebServer.ino index 81a58478f9..ffadddcca4 100644 --- a/libraries/ESP8266WebServer/examples/WebServer/WebServer.ino +++ b/libraries/ESP8266WebServer/examples/WebServer/WebServer.ino @@ -43,8 +43,7 @@ void handleRedirect() { if (!LittleFS.exists(url)) { url = "/$update.htm"; } - server.sendHeader("Location", url, true); - server.send(302); + server.redirect(url); } // handleRedirect() diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServer.h b/libraries/ESP8266WebServer/src/ESP8266WebServer.h index 397132f161..9f2b8b19c3 100644 --- a/libraries/ESP8266WebServer/src/ESP8266WebServer.h +++ b/libraries/ESP8266WebServer/src/ESP8266WebServer.h @@ -207,6 +207,30 @@ class ESP8266WebServerTemplate sendContent(emptyString); } + /** + * @brief Redirect to another URL, e.g. + * webserver.on("/index.html", HTTP_GET, []() { webserver.redirect("/"); }); + * There are 3 points of redirection here: + * 1) "Location" element in the header + * 2) Disable client caching + * 3) HTML "content" element to redirect + * If the "Location" header element works the HTML content is never seen. + * https://tools.ietf.org/html/rfc7231#section-6.4.3 + * @param url URL to redirect to + * @param content Optional redirect content + */ + void redirect(const String& url, const String& content = emptyString) { + sendHeader(F("Location"), url, true); + sendHeader(F("Cache-Control"), F("no-cache, no-store, must-revalidate")); + sendHeader(F("Pragma"), F("no-cache")); + sendHeader(F("Expires"), F("-1")); + send(302, F("text/html"), content); // send 302: "Found" + if (content.isEmpty()) { + // Empty content inhibits Content-length header so we have to close the socket ourselves. + client().stop(); // Stop is needed because we sent no content length + } + } + // Whether other requests should be accepted from the client on the // same socket after a response is sent. // This will automatically configure the "Connection" header of the response. From 8731f63594c3e77a645c2fd49440e97d7f1454df Mon Sep 17 00:00:00 2001 From: David Refoua Date: Mon, 25 Mar 2024 02:45:29 +0330 Subject: [PATCH 08/50] minor typo fixes (#9106) --- cores/esp8266/WString.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cores/esp8266/WString.h b/cores/esp8266/WString.h index 47a9177534..1a2aebb298 100644 --- a/cores/esp8266/WString.h +++ b/cores/esp8266/WString.h @@ -33,7 +33,7 @@ #include #include -// an abstract class used as a means to proide a unique pointer type +// an abstract class used as a means to provide a unique pointer type // but really has no body class __FlashStringHelper; #define FPSTR(pstr_pointer) (reinterpret_cast(pstr_pointer)) @@ -204,7 +204,7 @@ class String { bool concat(double num); // if there's not enough memory for the concatenated value, the string - // will be left unchanged (but this isn't signalled in any way) + // will be left unchanged (but this isn't signaled in any way) template String &operator +=(const T &rhs) { concat(rhs); @@ -343,7 +343,7 @@ class String { char *wbuffer() { return const_cast(buffer()); } // Writable version of buffer // concatenation is done via non-member functions - // make sure we still have access to internal methods, since we optimize based on capacity of both sides and want to manipulate internal buffers directly + // make sure we still have access to internal methods, since we optimize based on the capacity of both sides and want to manipulate internal buffers directly friend String operator +(const String &lhs, String &&rhs); friend String operator +(String &&lhs, String &&rhs); friend String operator +(char lhs, String &&rhs); From 41ecd65c6a4a711d6d799629699a41400992c376 Mon Sep 17 00:00:00 2001 From: david gauchard Date: Mon, 25 Mar 2024 00:35:19 +0100 Subject: [PATCH 09/50] Stream: +helpers to stream regular String (#9043) This allows to use a String as a destination Stream by using a temporary with streaming helpers. --- cores/esp8266/Stream.h | 4 ++++ cores/esp8266/StreamString.h | 16 +++++++-------- .../examples/StreamString/StreamString.ino | 20 +++++++++++++++---- 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/cores/esp8266/Stream.h b/cores/esp8266/Stream.h index 21f319ee6b..0706bec001 100644 --- a/cores/esp8266/Stream.h +++ b/cores/esp8266/Stream.h @@ -196,21 +196,25 @@ class Stream: public Print { // returns number of transferred bytes size_t sendAvailable (Stream* to) { return sendGeneric(to, -1, -1, oneShotMs::alwaysExpired); } size_t sendAvailable (Stream& to) { return sendAvailable(&to); } + size_t sendAvailable (Stream&& to) { return sendAvailable(&to); } // transfers data until timeout // returns number of transferred bytes size_t sendAll (Stream* to, const oneShotMs::timeType timeoutMs = oneShotMs::neverExpires) { return sendGeneric(to, -1, -1, timeoutMs); } size_t sendAll (Stream& to, const oneShotMs::timeType timeoutMs = oneShotMs::neverExpires) { return sendAll(&to, timeoutMs); } + size_t sendAll (Stream&& to, const oneShotMs::timeType timeoutMs = oneShotMs::neverExpires) { return sendAll(&to, timeoutMs); } // transfers data until a char is encountered (the char is swallowed but not transferred) with timeout // returns number of transferred bytes size_t sendUntil (Stream* to, const int readUntilChar, const oneShotMs::timeType timeoutMs = oneShotMs::neverExpires) { return sendGeneric(to, -1, readUntilChar, timeoutMs); } size_t sendUntil (Stream& to, const int readUntilChar, const oneShotMs::timeType timeoutMs = oneShotMs::neverExpires) { return sendUntil(&to, readUntilChar, timeoutMs); } + size_t sendUntil (Stream&& to, const int readUntilChar, const oneShotMs::timeType timeoutMs = oneShotMs::neverExpires) { return sendUntil(&to, readUntilChar, timeoutMs); } // transfers data until requested size or timeout // returns number of transferred bytes size_t sendSize (Stream* to, const ssize_t maxLen, const oneShotMs::timeType timeoutMs = oneShotMs::neverExpires) { return sendGeneric(to, maxLen, -1, timeoutMs); } size_t sendSize (Stream& to, const ssize_t maxLen, const oneShotMs::timeType timeoutMs = oneShotMs::neverExpires) { return sendSize(&to, maxLen, timeoutMs); } + size_t sendSize (Stream&& to, const ssize_t maxLen, const oneShotMs::timeType timeoutMs = oneShotMs::neverExpires) { return sendSize(&to, maxLen, timeoutMs); } // remaining size (-1 by default = unknown) virtual ssize_t streamRemaining () { return -1; } diff --git a/cores/esp8266/StreamString.h b/cores/esp8266/StreamString.h index 2331a3c51a..dced5aee80 100644 --- a/cores/esp8266/StreamString.h +++ b/cores/esp8266/StreamString.h @@ -29,7 +29,7 @@ #include "WString.h" /////////////////////////////////////////////////////////////// -// S2Stream points to a String and makes it a Stream +// S2Stream ("String to Stream") points to a String and makes it a Stream // (it is also the helper for StreamString) class S2Stream: public Stream @@ -184,19 +184,18 @@ class S2Stream: public Stream return peekPointer < 0 ? string->length() : string->length() - peekPointer; } - // calling setConsume() will consume bytes as the stream is read - // (enabled by default) + // calling setConsume() will make the string consumed as the stream is read. + // (default behaviour) void setConsume() { peekPointer = -1; } - // Reading this stream will mark the string as read without consuming - // (not enabled by default) - // Calling resetPointer() resets the read state and allows rereading. - void resetPointer(int pointer = 0) + // Calling resetPointer() resets the read cursor and allows rereading. + // (this is the opposite of default mode set by setConsume()) + void resetPointer(size_t pointer = 0) { - peekPointer = pointer; + peekPointer = std::min(pointer, (size_t)string->length()); } protected: @@ -204,6 +203,7 @@ class S2Stream: public Stream int peekPointer; // -1:String is consumed / >=0:resettable pointer }; +/////////////////////////////////////////////////////////////// // StreamString is a S2Stream holding the String class StreamString: public String, public S2Stream diff --git a/libraries/esp8266/examples/StreamString/StreamString.ino b/libraries/esp8266/examples/StreamString/StreamString.ino index f177b53edc..73512cf2af 100644 --- a/libraries/esp8266/examples/StreamString/StreamString.ino +++ b/libraries/esp8266/examples/StreamString/StreamString.ino @@ -54,7 +54,7 @@ void testStreamString() { { // We use a a lighter StreamConstPtr(input) to make a read-only Stream out of // a String that obviously should not be modified during the time the - // StreamConstPtr instance is used. It is used as a source to be sent to + // StreamConstPtr instance is used. It is used as a read-only source to be sent to // 'result'. result.clear(); @@ -77,7 +77,7 @@ void testStreamString() { // Now inputString is made into a Stream using S2Stream, // and set in non-consume mode (using ::resetPointer()). - // Then, after that input is read once, it won't be anymore readable + // Then, after input is read once, it won't be anymore readable // until the pointer is reset. S2Stream input(inputString); @@ -87,7 +87,7 @@ void testStreamString() { input.sendAll(result); input.sendAll(result); check("S2Stream.sendAll(StreamString)", result.c_str(), "hello"); - check("unmodified String given to S2Stream", inputString.c_str(), "hello"); + check("String given to S2Stream is unmodified", inputString.c_str(), "hello"); } { @@ -103,6 +103,17 @@ void testStreamString() { check("S2Stream.resetPointer(2):", result.c_str(), "llo"); } + { + // Streaming to a regular String + + String someSource{ F("hello") }; + String someDestString; + + StreamConstPtr(someSource).sendAll(S2Stream(someDestString)); + StreamConstPtr(someSource).sendAll(S2Stream(someDestString)); + check("StreamConstPtr(someSource).sendAll(S2Stream(someDestString))", someDestString.c_str(), "hellohello"); + } + { // inputString made into a Stream // reading the Stream consumes the String @@ -181,7 +192,8 @@ void setup() { testStreamString(); - Serial.printf("sizeof: String:%d Stream:%d StreamString:%d SStream:%d\n", (int)sizeof(String), (int)sizeof(Stream), (int)sizeof(StreamString), (int)sizeof(S2Stream)); + Serial.printf("sizeof: String:%zu Stream:%zu StreamString:%zu S2Stream:%zu StreamConstPtr:%zu\n", + sizeof(String), sizeof(Stream), sizeof(StreamString), sizeof(S2Stream), sizeof(StreamConstPtr)); } #endif From eda4e0855fa5ebcf1d7f621f35f25f6bab503335 Mon Sep 17 00:00:00 2001 From: Max Prokhorov Date: Tue, 26 Mar 2024 10:58:20 +0300 Subject: [PATCH 10/50] CONT stack overflow postmortem (#9083) - check in cont_run() and cont_suspend() whether a1 is out of bounds - in case a1 is broken, postmortem will still report proper context in proper stack boundaries additionally - as suggested in #9069, change stack smashing to a single line that does not mention any Exceptions - reduce overall stack dump length when there are know garbage values i.e. cont stackguard - decoder.py addr search regexp would no longer skip stack lines with '<' - fix decoder.py parsing so it notices both stack smashing and alloc errors --- cores/esp8266/cont.S | 20 +++++-- cores/esp8266/cont.h | 11 +++- cores/esp8266/cont_util.cpp | 27 ++++++---- cores/esp8266/core_esp8266_main.cpp | 2 +- cores/esp8266/core_esp8266_postmortem.cpp | 64 +++++++++++++++++------ cores/esp8266/debug.h | 3 ++ tools/decoder.py | 33 ++++++------ 7 files changed, 112 insertions(+), 48 deletions(-) diff --git a/cores/esp8266/cont.S b/cores/esp8266/cont.S index 4832b39170..ee049d46f5 100644 --- a/cores/esp8266/cont.S +++ b/cores/esp8266/cont.S @@ -26,8 +26,14 @@ cont_suspend: /* a1: sp */ /* a2: void* cont_ctx */ - /* adjust stack and save registers */ + /* adjust stack */ addi a1, a1, -24 + + /* make sure that a1 points after cont_ctx.stack[] */ + addi a4, a2, 32 + bltu a1, a4, cont_overflow + + /* save registers */ s32i a12, a1, 0 s32i a13, a1, 4 s32i a14, a1, 8 @@ -47,6 +53,11 @@ cont_suspend: l32i a1, a2, 4 jx a0 +cont_overflow: + mov.n a3, a1 + movi a4, __stack_overflow + jx a4 + cont_continue: l32i a12, a1, 0 l32i a13, a1, 4 @@ -113,7 +124,7 @@ cont_run: bnez a4, cont_resume /* else */ /* set new stack*/ - l32i a1, a2, 16; + l32i a1, a2, 16 /* goto pfn */ movi a2, cont_wrapper jx a2 @@ -121,12 +132,15 @@ cont_run: cont_resume: /* a1 <- cont_ctx.sp_suspend */ l32i a1, a2, 12 + /* make sure that a1 points after cont_ctx.stack[] */ + addi a5, a2, 32 + bltu a1, a5, cont_overflow /* reset yield flag, 0 -> cont_ctx.pc_suspend */ movi a3, 0 s32i a3, a2, 8 /* jump to saved cont_ctx.pc_suspend */ movi a0, cont_ret - jx a4 + jx a4 cont_norm: /* calculate pointer to cont_ctx.struct_start from sp */ diff --git a/cores/esp8266/cont.h b/cores/esp8266/cont.h index ba6d432a88..4c9578851b 100644 --- a/cores/esp8266/cont.h +++ b/cores/esp8266/cont.h @@ -22,11 +22,16 @@ #define CONT_H_ #include +#include #ifndef CONT_STACKSIZE #define CONT_STACKSIZE 4096 #endif +#ifndef CONT_STACKGUARD +#define CONT_STACKGUARD 0xfeefeffe +#endif + #ifdef __cplusplus extern "C" { #endif @@ -62,8 +67,11 @@ void cont_run(cont_t*, void (*pfn)(void)); // execution state (registers and stack) void cont_suspend(cont_t*); +// Check that cont resume state is valid. Immediately panics on failure. +void cont_check_overflow(cont_t*); + // Check guard bytes around the stack. Immediately panics on failure. -void cont_check(cont_t*); +void cont_check_guard(cont_t*); // Go through stack and check how many bytes are most probably still unchanged // and thus weren't used by the user code. i.e. that stack space is free. (high water mark) @@ -78,7 +86,6 @@ bool cont_can_suspend(cont_t* cont); // free, running the routine, then checking the max free void cont_repaint_stack(cont_t *cont); - #ifdef __cplusplus } #endif diff --git a/cores/esp8266/cont_util.cpp b/cores/esp8266/cont_util.cpp index 746dcccbfd..6c49a38fcf 100644 --- a/cores/esp8266/cont_util.cpp +++ b/cores/esp8266/cont_util.cpp @@ -23,38 +23,45 @@ #include #include -#include "cont.h" +#include "core_esp8266_features.h" #include "debug.h" +#include "cont.h" + extern "C" { -static constexpr unsigned int CONT_STACKGUARD { 0xfeefeffe }; +static constexpr uint32_t CONT_STACKSIZE_U32 { sizeof(cont_t::stack) / sizeof(*cont_t::stack) }; void cont_init(cont_t* cont) { memset(cont, 0, sizeof(cont_t)); cont->stack_guard1 = CONT_STACKGUARD; cont->stack_guard2 = CONT_STACKGUARD; - cont->stack_end = cont->stack + (sizeof(cont->stack) / 4); + cont->stack_end = &cont->stack[0] + CONT_STACKSIZE_U32; cont->struct_start = (unsigned*) cont; // fill stack with magic values to check high water mark - for(int pos = 0; pos < (int)(sizeof(cont->stack) / 4); pos++) + for(int pos = 0; pos < (int)(CONT_STACKSIZE_U32); pos++) { cont->stack[pos] = CONT_STACKGUARD; } } -void IRAM_ATTR cont_check(cont_t* cont) { - if ((cont->stack_guard1 == CONT_STACKGUARD) - && (cont->stack_guard2 == CONT_STACKGUARD)) +void IRAM_ATTR cont_check_guard(cont_t* cont) { + if ((cont->stack_guard1 != CONT_STACKGUARD) + || (cont->stack_guard2 != CONT_STACKGUARD)) { - return; + __stack_chk_fail(); + __builtin_unreachable(); } +} - __stack_chk_fail(); - __builtin_unreachable(); +void IRAM_ATTR cont_check_overflow(cont_t* cont) { + if (cont->sp_suspend && (cont->sp_suspend < &cont->stack[0])) { + __stack_overflow(cont, cont->sp_suspend); + __builtin_unreachable(); + } } // No need for this to be in IRAM, not expected to be IRQ called diff --git a/cores/esp8266/core_esp8266_main.cpp b/cores/esp8266/core_esp8266_main.cpp index d0309cc71f..91a64e0ab8 100644 --- a/cores/esp8266/core_esp8266_main.cpp +++ b/cores/esp8266/core_esp8266_main.cpp @@ -261,7 +261,7 @@ static void loop_wrapper() { } loop(); loop_end(); - cont_check(g_pcont); + cont_check_guard(g_pcont); if (serialEventRun) { serialEventRun(); } diff --git a/cores/esp8266/core_esp8266_postmortem.cpp b/cores/esp8266/core_esp8266_postmortem.cpp index 7fff9d2ff7..95844534e8 100644 --- a/cores/esp8266/core_esp8266_postmortem.cpp +++ b/cores/esp8266/core_esp8266_postmortem.cpp @@ -48,7 +48,7 @@ static const char* s_unhandled_exception = NULL; // Common way to notify about where the stack smashing happened // (but, **only** if caller uses our handler function) -static uint32_t s_stacksmash_addr = 0; +static uint32_t s_stack_chk_addr = 0; void abort() __attribute__((noreturn)); static void uart_write_char_d(char c); @@ -59,6 +59,7 @@ static void print_stack(uint32_t start, uint32_t end); // using numbers different from "REASON_" in user_interface.h (=0..6) enum rst_reason_sw { + REASON_USER_STACK_OVERFLOW = 252, REASON_USER_STACK_SMASH = 253, REASON_USER_SWEXCEPTION_RST = 254 }; @@ -188,7 +189,7 @@ static void postmortem_report(uint32_t sp_dump) { } else if (rst_info.reason == REASON_SOFT_WDT_RST) { ets_printf_P(PSTR("\nSoft WDT reset")); - const char infinite_loop[] = { 0x06, 0xff, 0xff }; // loop: j loop + const uint8_t infinite_loop[] = { 0x06, 0xff, 0xff }; // loop: j loop if (is_pc_valid(rst_info.epc1) && 0 == memcmp_P(infinite_loop, (PGM_VOID_P)rst_info.epc1, 3u)) { // The SDK is riddled with these. They are usually preceded by an ets_printf. ets_printf_P(PSTR(" - deliberate infinite loop detected")); @@ -198,17 +199,23 @@ static void postmortem_report(uint32_t sp_dump) { rst_info.exccause, /* Address executing at time of Soft WDT level-1 interrupt */ rst_info.epc1, 0, 0, 0, 0); } else if (rst_info.reason == REASON_USER_STACK_SMASH) { - ets_printf_P(PSTR("\nStack smashing detected.\n")); - ets_printf_P(PSTR("\nException (%d):\nepc1=0x%08x epc2=0x%08x epc3=0x%08x excvaddr=0x%08x depc=0x%08x\n"), - 5 /* Alloca exception, closest thing to stack fault*/, s_stacksmash_addr, 0, 0, 0, 0); - } + ets_printf_P(PSTR("\nStack smashing detected at 0x%08x\n"), s_stack_chk_addr); + } + else if (rst_info.reason == REASON_USER_STACK_OVERFLOW) { + ets_printf_P(PSTR("\nStack overflow detected\n")); + } else { ets_printf_P(PSTR("\nGeneric Reset\n")); } - uint32_t cont_stack_start = (uint32_t) &(g_pcont->stack); - uint32_t cont_stack_end = (uint32_t) g_pcont->stack_end; - uint32_t stack_end; + uint32_t cont_stack_start; + if (rst_info.reason == REASON_USER_STACK_SMASH) { + cont_stack_start = s_stack_chk_addr; + } else { + cont_stack_start = (uint32_t) (&g_pcont->stack[0]); + } + + uint32_t cont_stack_end = cont_stack_start + CONT_STACKSIZE; // amount of stack taken by interrupt or exception handler // and everything up to __wrap_system_restart_local @@ -249,15 +256,21 @@ static void postmortem_report(uint32_t sp_dump) { sp_dump = stack_thunk_get_cont_sp(); } - if (sp_dump > cont_stack_start && sp_dump < cont_stack_end) { + uint32_t stack_end; + + // above and inside of cont, dump from the sp to the bottom of the stack + if ((rst_info.reason == REASON_USER_STACK_OVERFLOW) + || ((sp_dump > cont_stack_start) && (sp_dump < cont_stack_end))) + { ets_printf_P(PSTR("\nctx: cont\n")); stack_end = cont_stack_end; } + // in system, reposition to a known address + // it's actually 0x3ffffff0, but the stuff below ets_run + // is likely not really relevant to the crash else { ets_printf_P(PSTR("\nctx: sys\n")); stack_end = 0x3fffffb0; - // it's actually 0x3ffffff0, but the stuff below ets_run - // is likely not really relevant to the crash } ets_printf_P(PSTR("sp: %08x end: %08x offset: %04x\n"), sp_dump, stack_end, offset); @@ -296,11 +309,20 @@ static void print_stack(uint32_t start, uint32_t end) { for (uint32_t pos = start; pos < end; pos += 0x10) { uint32_t* values = (uint32_t*)(pos); + // avoid printing irrelevant data + if ((values[0] == CONT_STACKGUARD) + && (values[0] == values[1]) + && (values[1] == values[2]) + && (values[2] == values[3])) + { + continue; + } + // rough indicator: stack frames usually have SP saved as the second word - bool looksLikeStackFrame = (values[2] == pos + 0x10); + const bool looksLikeStackFrame = (values[2] == pos + 0x10); ets_printf_P(PSTR("%08x: %08x %08x %08x %08x %c\n"), - pos, values[0], values[1], values[2], values[3], (looksLikeStackFrame)?'<':' '); + pos, values[0], values[1], values[2], values[3], (looksLikeStackFrame) ? '<' : ' '); } } @@ -370,7 +392,7 @@ void __panic_func(const char* file, int line, const char* func) { uintptr_t __stack_chk_guard = 0x08675309 ^ RANDOM_REG32; void __stack_chk_fail(void) { s_user_reset_reason = REASON_USER_STACK_SMASH; - s_stacksmash_addr = (uint32_t)__builtin_return_address(0); + s_stack_chk_addr = (uint32_t)__builtin_return_address(0); if (gdb_present()) __asm__ __volatile__ ("syscall"); // triggers GDB when enabled @@ -382,4 +404,16 @@ void __stack_chk_fail(void) { __builtin_unreachable(); // never reached, needed to satisfy "noreturn" attribute } +void __stack_overflow(cont_t* cont, uint32_t* sp) { + s_user_reset_reason = REASON_USER_STACK_OVERFLOW; + s_stack_chk_addr = (uint32_t)&cont->stack[0]; + + if (gdb_present()) + __asm__ __volatile__ ("syscall"); // triggers GDB when enabled + + postmortem_report((uint32_t)sp); + + __builtin_unreachable(); // never reached, needed to satisfy "noreturn" attribute +} + } // extern "C" diff --git a/cores/esp8266/debug.h b/cores/esp8266/debug.h index 0e30000c53..437479748c 100644 --- a/cores/esp8266/debug.h +++ b/cores/esp8266/debug.h @@ -4,6 +4,8 @@ #include #include +#include "cont.h" + #define _DEBUG_LEAF_FUNCTION(...) __asm__ __volatile__("" ::: "a0", "memory") #ifdef DEBUG_ESP_CORE @@ -32,6 +34,7 @@ extern "C" { #endif void __stack_chk_fail(void) __attribute__((noreturn)); + void __stack_overflow(cont_t*, uint32_t*) __attribute__((noreturn)); void __unhandled_exception(const char* str) __attribute__((noreturn)); void __panic_func(const char* file, int line, const char* func) __attribute__((noreturn)); #define panic() __panic_func(PSTR(__FILE__), __LINE__, __func__) diff --git a/tools/decoder.py b/tools/decoder.py index 1ed3dcf8ed..0055693648 100755 --- a/tools/decoder.py +++ b/tools/decoder.py @@ -52,6 +52,7 @@ "permit stores", ) + # similar to java version, which used `list` and re-formatted it # instead, simply use an already short-format `info line` # TODO `info symbol`? revert to `list`? @@ -96,12 +97,12 @@ def addresses_addr2line(addr2line, elf, addresses): def decode_lines(format_addresses, elf, lines): - STACK_RE = re.compile(r"^[0-9a-f]{8}:\s+([0-9a-f]{8} ?)+ *$") + ANY_ADDR_RE = re.compile(r"0x[0-9a-fA-F]{8}|[0-9a-fA-F]{8}") + HEX_ADDR_RE = re.compile(r"0x[0-9a-f]{8}") - LAST_ALLOC_RE = re.compile( - r"last failed alloc call: ([0-9a-fA-F]{8})\(([0-9]+)\).*" - ) - LAST_ALLOC = "last failed alloc" + MEM_ERR_LINE_RE = re.compile(r"^(Stack|last failed alloc call)") + + STACK_LINE_RE = re.compile(r"^[0-9a-f]{8}:\s\s+") CUT_HERE_STRING = "CUT HERE FOR EXCEPTION DECODER" EXCEPTION_STRING = "Exception (" @@ -131,13 +132,11 @@ def format_address(address): stack_addresses = print_all_addresses(stack_addresses) last_stack = line.strip() # 3fffffb0: feefeffe feefeffe 3ffe85d8 401004ed - elif in_stack and STACK_RE.match(line): - stack, addrs = line.split(":") - addrs = addrs.strip() - addrs = addrs.split(" ") + elif in_stack and STACK_LINE_RE.match(line): + _, addrs = line.split(":") + addrs = ANY_ADDR_RE.findall(addrs) stack_addresses.setdefault(last_stack, []) - for addr in addrs: - stack_addresses[last_stack].append(addr) + stack_addresses[last_stack].extend(addrs) # epc1=0xfffefefe epc2=0xfefefefe epc3=0xefefefef excvaddr=0xfefefefe depc=0xfefefefe elif EPC_STRING in line: pairs = line.split() @@ -152,13 +151,13 @@ def format_address(address): elif EXCEPTION_STRING in line: number = line.strip()[len(EXCEPTION_STRING) : -2] print(f"Exception ({number}) - {EXCEPTION_CODES[int(number)]}") + # stack smashing detected at # last failed alloc call: ()[@] - elif LAST_ALLOC in line: - values = LAST_ALLOC_RE.match(line) - if values: - addr, size = values.groups() - print() - print(f"Allocation of {size} bytes failed: {format_address(addr)}") + elif MEM_ERR_LINE_RE.match(line): + for addr in ANY_ADDR_RE.findall(line): + line = line.replace(addr, format_address(addr)) + print() + print(line.strip()) # postmortem guards our actual stack dump values with these elif ">>>stack>>>" in line: in_stack = True From d7c50f76aa8a6110c0d7f9c10a10e6a6001b035e Mon Sep 17 00:00:00 2001 From: David Baka Date: Wed, 27 Mar 2024 14:07:29 +0100 Subject: [PATCH 11/50] Updater - fixed signature verification for compressed binaries (#9109) Previously, Arduino Core attempted to read from flash memory without proper consideration for the 4-byte alignment requirement when calculating the hash for the signature verification. This did not present an issue when uncompressed binaries are checked as all compiled binaries are 4-aligned (unconfirmed, just an educated guess), and signature verification appears to work well in these cases. When uploading a compressed binary (based on this) the gzip algorithm makes no attempt to produce a 4-aligned file. The rest of the signing results in a valid signed binary regardless, however when calculating the hash for the verification process there is a ~75% chance that the hash will include some bytes from the signature, thus compromising the whole signature verification process. editorial note: ESP.flashRead for u8 arrays (aka byte arrays) was already updated to properly handle both aligned and unaligned target buffer and / or length, while u32 expects that its arguments are already aligned. Since array pointer in Updater is already aligned, this properly handles unaligned size case. --- cores/esp8266/Updater.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/esp8266/Updater.cpp b/cores/esp8266/Updater.cpp index b4961b616d..ef79a5cbf3 100644 --- a/cores/esp8266/Updater.cpp +++ b/cores/esp8266/Updater.cpp @@ -284,7 +284,7 @@ bool UpdaterClass::end(bool evenIfRemaining){ _hash->begin(); for (uint32_t offset = 0; offset < binSize; offset += sizeof(buff)) { auto len = std::min(sizeof(buff), binSize - offset); - ESP.flashRead(_startAddress + offset, reinterpret_cast(&buff[0]), len); + ESP.flashRead(_startAddress + offset, buff, len); _hash->add(buff, len); } _hash->end(); From 75cd58f64757a7b87e9b9659274c2955346e7ef9 Mon Sep 17 00:00:00 2001 From: David Refoua Date: Thu, 28 Mar 2024 01:28:51 +0330 Subject: [PATCH 12/50] fix minor typo (#9111) --- libraries/ESP8266WiFi/src/enable_wifi_at_boot_time.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/ESP8266WiFi/src/enable_wifi_at_boot_time.cpp b/libraries/ESP8266WiFi/src/enable_wifi_at_boot_time.cpp index 5eb62eec15..a8589c4d25 100644 --- a/libraries/ESP8266WiFi/src/enable_wifi_at_boot_time.cpp +++ b/libraries/ESP8266WiFi/src/enable_wifi_at_boot_time.cpp @@ -21,7 +21,7 @@ extern "C" void __disableWiFiAtBootTime() // Does (almost) nothing: WiFi is enabled by default in nonos-sdk // ... but restores legacy WiFi credentials persistence to true at boot time - // (can be still overrisden by user before setting up WiFi, like before) + // (can be still overridden by user before setting up WiFi, like before) // (note: c++ ctors not called yet at this point) ESP8266WiFiClass::persistent(true); From 685f2c97ff4b3c76b437a43be86d1dfdf6cb33e3 Mon Sep 17 00:00:00 2001 From: david gauchard Date: Sun, 31 Mar 2024 18:24:25 +0200 Subject: [PATCH 13/50] decoder.py: allowing to use it live (#9108) - avoid ctx repetition and hide some useless fw debug lines - hide "DECODE IT" - immediately print stack at closing marker - check for tool executable at startup live command line example > pyserial-miniterm /dev/ttyUSB0 115200 | \ path/to/esp8266/Arduino/tools/decoder.py \ --tool addr2line \ --toolchain-path path/to/esp8266/Arduino/tools/xtensa-lx106-elf/bin \ path/to/build.elf --- tools/decoder.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/tools/decoder.py b/tools/decoder.py index 0055693648..b1f1706767 100755 --- a/tools/decoder.py +++ b/tools/decoder.py @@ -10,6 +10,7 @@ import sys import re import subprocess +import shutil # https://github.com/me-no-dev/EspExceptionDecoder/blob/349d17e4c9896306e2c00b4932be3ba510cad208/src/EspExceptionDecoder.java#L59-L90 EXCEPTION_CODES = ( @@ -104,7 +105,10 @@ def decode_lines(format_addresses, elf, lines): STACK_LINE_RE = re.compile(r"^[0-9a-f]{8}:\s\s+") + IGNORE_FIRMWARE_RE = re.compile(r"^(epc1=0x........, |Fatal exception )") + CUT_HERE_STRING = "CUT HERE FOR EXCEPTION DECODER" + DECODE_IT = "DECODE IT" EXCEPTION_STRING = "Exception (" EPC_STRING = "epc1=" @@ -132,6 +136,8 @@ def format_address(address): stack_addresses = print_all_addresses(stack_addresses) last_stack = line.strip() # 3fffffb0: feefeffe feefeffe 3ffe85d8 401004ed + elif IGNORE_FIRMWARE_RE.match(line): + continue elif in_stack and STACK_LINE_RE.match(line): _, addrs = line.split(":") addrs = ANY_ADDR_RE.findall(addrs) @@ -163,8 +169,10 @@ def format_address(address): in_stack = True # ignore elif "<< Date: Sat, 15 Jun 2024 23:50:13 +0530 Subject: [PATCH 14/50] Implemented support for filters and removable routes in ESP8266WebServer (#9152) * feat: added filters and removeable routes * Update Filters.ino * fix: clang-format * chore: updated docs * chore: updated doc * fix: use new implementation * fix: filters.ino example * fix: filters.ino * fix: formatting * fix: formatting (2) --- libraries/ESP8266WebServer/README.rst | 21 +++- .../examples/Filters/Filters.ino | 101 ++++++++++++++++++ .../src/ESP8266WebServer-impl.h | 87 +++++++++++++-- .../ESP8266WebServer/src/ESP8266WebServer.h | 15 ++- libraries/ESP8266WebServer/src/Parsing-impl.h | 12 +-- .../src/detail/RequestHandler.h | 59 ++++++++-- .../src/detail/RequestHandlersImpl.h | 54 ++++++++-- 7 files changed, 318 insertions(+), 31 deletions(-) create mode 100644 libraries/ESP8266WebServer/examples/Filters/Filters.ino diff --git a/libraries/ESP8266WebServer/README.rst b/libraries/ESP8266WebServer/README.rst index 94bb6c5865..c37c6d5e64 100644 --- a/libraries/ESP8266WebServer/README.rst +++ b/libraries/ESP8266WebServer/README.rst @@ -54,8 +54,10 @@ Client request handlers .. code:: cpp - void on(); + RequestHandler& on(); + bool removeRoute(); void addHandler(); + bool removeHandler(); void onNotFound(); void onFileUpload(); @@ -64,9 +66,26 @@ Client request handlers .. code:: cpp server.on("/", handlerFunction); + server.removeRoute("/"); // Removes any route which points to "/" and has HTTP_ANY attribute + server.removeRoute("/", HTTP_GET); // Removes any route which points to "/" and has HTTP_GET attribute server.onNotFound(handlerFunction); // called when handler is not assigned server.onFileUpload(handlerFunction); // handle file uploads +Client request filters +^^^^^^^^^^^^^^^^^^^^^^ + +.. code:: cpp + + RequestHandler& setFilter(); + +*Example:* + +More details about this in `Filters.ino` example. + +.. code:: cpp + + server.on("/", handlerFunction).setFilter(ON_AP_FILTER) + Sending responses to the client ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/libraries/ESP8266WebServer/examples/Filters/Filters.ino b/libraries/ESP8266WebServer/examples/Filters/Filters.ino new file mode 100644 index 0000000000..24c26fc276 --- /dev/null +++ b/libraries/ESP8266WebServer/examples/Filters/Filters.ino @@ -0,0 +1,101 @@ +#include +#include +#include +#include + +// Your STA WiFi Credentials +// ( This is the AP your ESP will connect to ) +const char *ssid = "..."; +const char *password = "..."; + +// Your AP WiFi Credentials +// ( This is the AP your ESP will broadcast ) +const char *ap_ssid = "ESP8266_Demo"; +const char *ap_password = ""; + +ESP8266WebServer server(80); + +const int led = 13; + +// ON_STA_FILTER - Only accept requests coming from STA interface +bool ON_STA_FILTER(ESP8266WebServer &server) { + return WiFi.localIP() == server.client().localIP(); +} + +// ON_AP_FILTER - Only accept requests coming from AP interface +bool ON_AP_FILTER(ESP8266WebServer &server) { + return WiFi.softAPIP() == server.client().localIP(); +} + +void handleNotFound() { + digitalWrite(led, 1); + String message = "File Not Found\n\n"; + message += "URI: "; + message += server.uri(); + message += "\nMethod: "; + message += (server.method() == HTTP_GET) ? "GET" : "POST"; + message += "\nArguments: "; + message += server.args(); + message += "\n"; + for (uint8_t i = 0; i < server.args(); i++) { + message += " " + server.argName(i) + ": " + server.arg(i) + "\n"; + } + server.send(404, "text/plain", message); + digitalWrite(led, 0); +} + +void setup(void) { + pinMode(led, OUTPUT); + digitalWrite(led, 0); + Serial.begin(115200); + WiFi.mode(WIFI_AP_STA); + // Connect to STA + WiFi.begin(ssid, password); + // Start AP + WiFi.softAP(ap_ssid, ap_password); + Serial.println(""); + + // Wait for connection + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println(""); + Serial.print("Connected to "); + Serial.println(ssid); + Serial.print("IP address: "); + Serial.println(WiFi.localIP()); + + if (MDNS.begin("esp8266")) { + Serial.println("MDNS responder started"); + } + + // This route will be accessible by STA clients only + server.on("/", [&]() { + digitalWrite(led, 1); + server.send(200, "text/plain", "Hi!, This route is accessible for STA clients only"); + digitalWrite(led, 0); + }) + .setFilter(ON_STA_FILTER); + + // This route will be accessible by AP clients only + server.on("/", [&]() { + digitalWrite(led, 1); + server.send(200, "text/plain", "Hi!, This route is accessible for AP clients only"); + digitalWrite(led, 0); + }) + .setFilter(ON_AP_FILTER); + + server.on("/inline", []() { + server.send(200, "text/plain", "this works as well"); + }); + + server.onNotFound(handleNotFound); + + server.begin(); + Serial.println("HTTP server started"); +} + +void loop(void) { + server.handleClient(); +} diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServer-impl.h b/libraries/ESP8266WebServer/src/ESP8266WebServer-impl.h index f7a95da0af..dbcb251135 100644 --- a/libraries/ESP8266WebServer/src/ESP8266WebServer-impl.h +++ b/libraries/ESP8266WebServer/src/ESP8266WebServer-impl.h @@ -230,18 +230,61 @@ void ESP8266WebServerTemplate::requestAuthentication(HTTPAuthMethod } template -void ESP8266WebServerTemplate::on(const Uri &uri, ESP8266WebServerTemplate::THandlerFunction handler) { - on(uri, HTTP_ANY, handler); +RequestHandler& ESP8266WebServerTemplate::on(const Uri &uri, ESP8266WebServerTemplate::THandlerFunction handler) { + return on(uri, HTTP_ANY, handler); } template -void ESP8266WebServerTemplate::on(const Uri &uri, HTTPMethod method, ESP8266WebServerTemplate::THandlerFunction fn) { - on(uri, method, fn, _fileUploadHandler); +RequestHandler& ESP8266WebServerTemplate::on(const Uri &uri, HTTPMethod method, ESP8266WebServerTemplate::THandlerFunction fn) { + return on(uri, method, fn, _fileUploadHandler); } template -void ESP8266WebServerTemplate::on(const Uri &uri, HTTPMethod method, ESP8266WebServerTemplate::THandlerFunction fn, ESP8266WebServerTemplate::THandlerFunction ufn) { - _addRequestHandler(new FunctionRequestHandler(fn, ufn, uri, method)); +RequestHandler& ESP8266WebServerTemplate::on(const Uri &uri, HTTPMethod method, ESP8266WebServerTemplate::THandlerFunction fn, ESP8266WebServerTemplate::THandlerFunction ufn) { + RequestHandler *handler = new FunctionRequestHandler(fn, ufn, uri, method); + _addRequestHandler(handler); + return *handler; +} + +template +bool ESP8266WebServerTemplate::removeRoute(const char *uri) { + return removeRoute(String(uri), HTTP_ANY); +} + +template +bool ESP8266WebServerTemplate::removeRoute(const char *uri, HTTPMethod method) { + return removeRoute(String(uri), method); +} + +template +bool ESP8266WebServerTemplate::removeRoute(const String &uri) { + return removeRoute(uri, HTTP_ANY); +} + +template +bool ESP8266WebServerTemplate::removeRoute(const String &uri, HTTPMethod method) { + bool anyHandlerRemoved = false; + RequestHandlerType *handler = _firstHandler; + RequestHandlerType *previousHandler = nullptr; + + while (handler) { + if (handler->canHandle(method, uri)) { + if (_removeRequestHandler(handler)) { + anyHandlerRemoved = true; + // Move to the next handler + if (previousHandler) { + handler = previousHandler->next(); + } else { + handler = _firstHandler; + } + continue; + } + } + previousHandler = handler; + handler = handler->next(); + } + + return anyHandlerRemoved; } template @@ -249,6 +292,11 @@ void ESP8266WebServerTemplate::addHandler(RequestHandlerType* handle _addRequestHandler(handler); } +template +bool ESP8266WebServerTemplate::removeHandler(RequestHandlerType *handler) { + return _removeRequestHandler(handler); +} + template void ESP8266WebServerTemplate::_addRequestHandler(RequestHandlerType* handler) { if (!_lastHandler) { @@ -261,6 +309,33 @@ void ESP8266WebServerTemplate::_addRequestHandler(RequestHandlerType } } +template +bool ESP8266WebServerTemplate::_removeRequestHandler(RequestHandlerType *handler) { + RequestHandlerType *current = _firstHandler; + RequestHandlerType *previous = nullptr; + + while (current != nullptr) { + if (current == handler) { + if (previous == nullptr) { + _firstHandler = current->next(); + } else { + previous->next(current->next()); + } + + if (current == _lastHandler) { + _lastHandler = previous; + } + + // Delete 'matching' handler + delete current; + return true; + } + previous = current; + current = current->next(); + } + return false; +} + template void ESP8266WebServerTemplate::serveStatic(const char* uri, FS& fs, const char* path, const char* cache_header) { bool is_file = false; diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServer.h b/libraries/ESP8266WebServer/src/ESP8266WebServer.h index 9f2b8b19c3..f9eca1c8bc 100644 --- a/libraries/ESP8266WebServer/src/ESP8266WebServer.h +++ b/libraries/ESP8266WebServer/src/ESP8266WebServer.h @@ -116,11 +116,17 @@ class ESP8266WebServerTemplate typedef std::function THandlerFunction; typedef std::function ETagFunction; - - void on(const Uri &uri, THandlerFunction handler); - void on(const Uri &uri, HTTPMethod method, THandlerFunction fn); - void on(const Uri &uri, HTTPMethod method, THandlerFunction fn, THandlerFunction ufn); + typedef std::function &server)> FilterFunction; + + RequestHandler& on(const Uri &uri, THandlerFunction handler); + RequestHandler& on(const Uri &uri, HTTPMethod method, THandlerFunction fn); + RequestHandler& on(const Uri &uri, HTTPMethod method, THandlerFunction fn, THandlerFunction ufn); + bool removeRoute(const char *uri); + bool removeRoute(const char *uri, HTTPMethod method); + bool removeRoute(const String &uri); + bool removeRoute(const String &uri, HTTPMethod method); void addHandler(RequestHandlerType* handler); + bool removeHandler(RequestHandlerType* handler); void serveStatic(const char* uri, fs::FS& fs, const char* path, const char* cache_header = NULL ); void onNotFound(THandlerFunction fn); //called when handler is not assigned void onFileUpload(THandlerFunction fn); //handle file uploads @@ -306,6 +312,7 @@ class ESP8266WebServerTemplate protected: void _addRequestHandler(RequestHandlerType* handler); + bool _removeRequestHandler(RequestHandlerType *handler); void _handleRequest(); void _finalizeResponse(); ClientFuture _parseRequest(ClientType& client); diff --git a/libraries/ESP8266WebServer/src/Parsing-impl.h b/libraries/ESP8266WebServer/src/Parsing-impl.h index 238b7b72d3..672682706e 100644 --- a/libraries/ESP8266WebServer/src/Parsing-impl.h +++ b/libraries/ESP8266WebServer/src/Parsing-impl.h @@ -106,7 +106,7 @@ typename ESP8266WebServerTemplate::ClientFuture ESP8266WebServerTemp //attach handler RequestHandlerType* handler; for (handler = _firstHandler; handler; handler = handler->next()) { - if (handler->canHandle(_currentMethod, _currentUri)) + if (handler->canHandle(*this, _currentMethod, _currentUri)) break; } _currentHandler = handler; @@ -324,7 +324,7 @@ int ESP8266WebServerTemplate::_parseArgumentsPrivate(const String& d template void ESP8266WebServerTemplate::_uploadWriteByte(uint8_t b){ if (_currentUpload->currentSize == HTTP_UPLOAD_BUFLEN){ - if(_currentHandler && _currentHandler->canUpload(_currentUri)) + if(_currentHandler && _currentHandler->canUpload(*this, _currentUri)) _currentHandler->upload(*this, _currentUri, *_currentUpload); _currentUpload->totalSize += _currentUpload->currentSize; _currentUpload->currentSize = 0; @@ -425,7 +425,7 @@ bool ESP8266WebServerTemplate::_parseForm(ClientType& client, const _currentUpload->currentSize = 0; _currentUpload->contentLength = len; DBGWS("Start File: %s Type: %s\n", _currentUpload->filename.c_str(), _currentUpload->type.c_str()); - if(_currentHandler && _currentHandler->canUpload(_currentUri)) + if(_currentHandler && _currentHandler->canUpload(*this, _currentUri)) _currentHandler->upload(*this, _currentUri, *_currentUpload); _currentUpload->status = UPLOAD_FILE_WRITE; @@ -463,11 +463,11 @@ bool ESP8266WebServerTemplate::_parseForm(ClientType& client, const } } // Found the boundary string, finish processing this file upload - if (_currentHandler && _currentHandler->canUpload(_currentUri)) + if (_currentHandler && _currentHandler->canUpload(*this, _currentUri)) _currentHandler->upload(*this, _currentUri, *_currentUpload); _currentUpload->totalSize += _currentUpload->currentSize; _currentUpload->status = UPLOAD_FILE_END; - if (_currentHandler && _currentHandler->canUpload(_currentUri)) + if (_currentHandler && _currentHandler->canUpload(*this, _currentUri)) _currentHandler->upload(*this, _currentUri, *_currentUpload); DBGWS("End File: %s Type: %s Size: %d\n", _currentUpload->filename.c_str(), @@ -542,7 +542,7 @@ String ESP8266WebServerTemplate::urlDecode(const String& text) template bool ESP8266WebServerTemplate::_parseFormUploadAborted(){ _currentUpload->status = UPLOAD_FILE_ABORTED; - if(_currentHandler && _currentHandler->canUpload(_currentUri)) + if(_currentHandler && _currentHandler->canUpload(*this, _currentUri)) _currentHandler->upload(*this, _currentUri, *_currentUpload); return false; } diff --git a/libraries/ESP8266WebServer/src/detail/RequestHandler.h b/libraries/ESP8266WebServer/src/detail/RequestHandler.h index 4195f0ff3f..c373c58f1b 100644 --- a/libraries/ESP8266WebServer/src/detail/RequestHandler.h +++ b/libraries/ESP8266WebServer/src/detail/RequestHandler.h @@ -12,13 +12,60 @@ class RequestHandler { using WebServerType = ESP8266WebServerTemplate; public: virtual ~RequestHandler() { } - virtual bool canHandle(HTTPMethod method, const String& uri) { (void) method; (void) uri; return false; } - virtual bool canUpload(const String& uri) { (void) uri; return false; } - virtual bool handle(WebServerType& server, HTTPMethod requestMethod, const String& requestUri) { (void) server; (void) requestMethod; (void) requestUri; return false; } - virtual void upload(WebServerType& server, const String& requestUri, HTTPUpload& upload) { (void) server; (void) requestUri; (void) upload; } - RequestHandler* next() { return _next; } - void next(RequestHandler* r) { _next = r; } + /* + note: old handler API for backward compatibility + */ + + virtual bool canHandle(HTTPMethod method, const String& uri) { + (void) method; + (void) uri; + return false; + } + virtual bool canUpload(const String& uri) { + (void) uri; + return false; + } + + /* + note: new handler API with support for filters etc. + */ + + virtual bool canHandle(WebServerType& server, HTTPMethod method, const String& uri) { + (void) server; + (void) method; + (void) uri; + return false; + } + virtual bool canUpload(WebServerType& server, const String& uri) { + (void) server; + (void) uri; + return false; + } + virtual bool handle(WebServerType& server, HTTPMethod requestMethod, const String& requestUri) { + (void) server; + (void) requestMethod; + (void) requestUri; + return false; + } + virtual void upload(WebServerType& server, const String& requestUri, HTTPUpload& upload) { + (void) server; + (void) requestUri; + (void) upload; + } + + RequestHandler* next() { + return _next; + } + + void next(RequestHandler* r) { + _next = r; + } + + virtual RequestHandler& setFilter(std::function&)> filter) { + (void)filter; + return *this; + } private: RequestHandler* _next = nullptr; diff --git a/libraries/ESP8266WebServer/src/detail/RequestHandlersImpl.h b/libraries/ESP8266WebServer/src/detail/RequestHandlersImpl.h index bb06033dea..fb36c5aba4 100644 --- a/libraries/ESP8266WebServer/src/detail/RequestHandlersImpl.h +++ b/libraries/ESP8266WebServer/src/detail/RequestHandlersImpl.h @@ -59,9 +59,22 @@ class FunctionRequestHandler : public RequestHandler { return true; } + bool canHandle(WebServerType& server, HTTPMethod requestMethod, const String& requestUri) override { + if (_method != HTTP_ANY && _method != requestMethod) + return false; + + return _uri->canHandle(requestUri, RequestHandler::pathArgs) && (_filter != NULL ? _filter(server) : true); + } + + bool canUpload(WebServerType& server, const String& requestUri) override { + if (!_ufn || !canHandle(server, HTTP_POST, requestUri)) + return false; + + return true; + } + bool handle(WebServerType& server, HTTPMethod requestMethod, const String& requestUri) override { - (void) server; - if (!canHandle(requestMethod, requestUri)) + if (!canHandle(server, requestMethod, requestUri)) return false; _fn(); @@ -69,15 +82,22 @@ class FunctionRequestHandler : public RequestHandler { } void upload(WebServerType& server, const String& requestUri, HTTPUpload& upload) override { - (void) server; (void) upload; - if (canUpload(requestUri)) + if (canUpload(server, requestUri)) _ufn(); } + FunctionRequestHandler& setFilter(typename WebServerType::FilterFunction filter) { + _filter = filter; + return *this; + } + protected: typename WebServerType::THandlerFunction _fn; typename WebServerType::THandlerFunction _ufn; + // _filter should return 'true' when the request should be handled + // and 'false' when the request should be ignored + typename WebServerType::FilterFunction _filter; Uri *_uri; HTTPMethod _method; }; @@ -115,7 +135,6 @@ class StaticRequestHandler : public RequestHandler { // serve all files within a given directory template class StaticDirectoryRequestHandler : public StaticRequestHandler { - using SRH = StaticRequestHandler; using WebServerType = ESP8266WebServerTemplate; @@ -130,9 +149,12 @@ class StaticDirectoryRequestHandler : public StaticRequestHandler { return SRH::validMethod(requestMethod) && requestUri.startsWith(SRH::_uri); } - bool handle(WebServerType& server, HTTPMethod requestMethod, const String& requestUri) override { + bool canHandle(WebServerType& server, HTTPMethod requestMethod, const String& requestUri) override { + return SRH::validMethod(requestMethod) && requestUri.startsWith(SRH::_uri) && (_filter != NULL ? _filter(server) : true); + } - if (!canHandle(requestMethod, requestUri)) + bool handle(WebServerType& server, HTTPMethod requestMethod, const String& requestUri) override { + if (!canHandle(server, requestMethod, requestUri)) return false; DEBUGV("DirectoryRequestHandler::handle: request=%s _uri=%s\r\n", requestUri.c_str(), SRH::_uri.c_str()); @@ -203,8 +225,14 @@ class StaticDirectoryRequestHandler : public StaticRequestHandler { return true; } + StaticDirectoryRequestHandler& setFilter(typename WebServerType::FilterFunction filter) { + _filter = filter; + return *this; + } + protected: size_t _baseUriLength; + typename WebServerType::FilterFunction _filter; }; @@ -228,8 +256,12 @@ public StaticRequestHandler { return SRH::validMethod(requestMethod) && requestUri == SRH::_uri; } + bool canHandle(WebServerType& server, HTTPMethod requestMethod, const String& requestUri) override { + return SRH::validMethod(requestMethod) && requestUri == SRH::_uri && (_filter != NULL ? _filter(server) : true); + } + bool handle(WebServerType& server, HTTPMethod requestMethod, const String & requestUri) override { - if (!canHandle(requestMethod, requestUri)) + if (!canHandle(server, requestMethod, requestUri)) return false; if (server._eTagEnabled) { @@ -266,8 +298,14 @@ public StaticRequestHandler { return true; } + StaticFileRequestHandler& setFilter(typename WebServerType::FilterFunction filter) { + _filter = filter; + return *this; + } + protected: String _eTagCode; // ETag code calculated for this file as used in http header include quotes. + typename WebServerType::FilterFunction _filter; }; } // namespace From 754324e56e1e815699b7af4d1f4a7e60099d7949 Mon Sep 17 00:00:00 2001 From: Matthias Hertel Date: Sat, 15 Jun 2024 20:32:27 +0200 Subject: [PATCH 15/50] Example WebServer WebServer.ino does not redirect when index.htm does not exist (#9142) --- .../ESP8266WebServer/examples/WebServer/README.md | 12 +++++------- .../examples/WebServer/WebServer.ino | 2 +- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/libraries/ESP8266WebServer/examples/WebServer/README.md b/libraries/ESP8266WebServer/examples/WebServer/README.md index 68999100ab..2ac25c2fcd 100644 --- a/libraries/ESP8266WebServer/examples/WebServer/README.md +++ b/libraries/ESP8266WebServer/examples/WebServer/README.md @@ -21,8 +21,6 @@ It features * Only files in the root folder are supported for simplicity - no directories. - - ## Implementing a web server The ESP8266WebServer library offers a simple path to implement a web server on a ESP8266 board. @@ -90,7 +88,7 @@ that actually has only one line of functionality by sending a string as result t > }); > ``` -Here the text from a static String with html code is returned instead of a file from the filesystem. +Here the text from a static string with html code is returned instead of a file from the filesystem. The content of this string can be found in the file `builtinfiles.h`. It contains a small html+javascript implementation that allows uploading new files into the empty filesystem. @@ -100,14 +98,14 @@ Just open and drag some files from the data folde ## Registering a function to handle requests to the server without a path Often servers are addressed by using the base URL like where no further path details is given. -Of course we like the user to be redirected to something usable. Therefore the `handleRoot()` function is registered: +Of course we like the user to be redirected to something usable. Therefore the `handleRedirect()` function is registered: > ```CPP -> server.on("/$upload.htm", handleRoot); +> server.on("/", HTTP_GET, handleRedirect); > ``` -The `handleRoot()` function checks the filesystem for the file named **/index.htm** and creates a redirect to this file when the file exists. -Otherwise the redirection goes to the built-in **/$upload.htm** web page. +The `handleRedirect()` function checks the filesystem for the file named **/index.htm** and creates a redirect +response to this file when the file exists. Otherwise the redirection goes to the built-in **/$upload.htm** web page. diff --git a/libraries/ESP8266WebServer/examples/WebServer/WebServer.ino b/libraries/ESP8266WebServer/examples/WebServer/WebServer.ino index ffadddcca4..78b82d70e5 100644 --- a/libraries/ESP8266WebServer/examples/WebServer/WebServer.ino +++ b/libraries/ESP8266WebServer/examples/WebServer/WebServer.ino @@ -41,7 +41,7 @@ void handleRedirect() { TRACE("Redirect..."); String url = "/index.htm"; - if (!LittleFS.exists(url)) { url = "/$update.htm"; } + if (!LittleFS.exists(url)) { url = "/$upload.htm"; } server.redirect(url); } // handleRedirect() From 7e3d1bd0d8ddfa61ea41d451005e435117f8c5a0 Mon Sep 17 00:00:00 2001 From: Max Prokhorov Date: Sat, 15 Jun 2024 21:40:36 +0300 Subject: [PATCH 16/50] Broken EspSoftwareSerial example (#9153) --- tests/common.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/common.sh b/tests/common.sh index 1799f7b481..fc716abc66 100755 --- a/tests/common.sh +++ b/tests/common.sh @@ -45,7 +45,8 @@ function skip_ino() *"/TeensySdioDemo/"* | \ *"/TeensySdioLogger/"* | \ *"/UserChipSelectFunction/"* | \ - *"/UserSPIDriver/"*) + *"/UserSPIDriver/"* | \ + *"/onewiretest/"*) return 0 ;; *"Teensy"*) From 338b62577efd353b6aa3effbd474e25342bff9cc Mon Sep 17 00:00:00 2001 From: Vic-Y <62916399+Vic-Y@users.noreply.github.com> Date: Sat, 15 Jun 2024 12:55:27 -0600 Subject: [PATCH 17/50] Fix spelling errors in WebServer source (#9146) --- libraries/ESP8266WebServer/examples/WebServer/README.md | 2 +- libraries/ESP8266WebServer/examples/WebServer/WebServer.ino | 2 +- libraries/ESP8266WebServer/examples/WebServer/builtinfiles.h | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/ESP8266WebServer/examples/WebServer/README.md b/libraries/ESP8266WebServer/examples/WebServer/README.md index 2ac25c2fcd..0c7b1143da 100644 --- a/libraries/ESP8266WebServer/examples/WebServer/README.md +++ b/libraries/ESP8266WebServer/examples/WebServer/README.md @@ -120,7 +120,7 @@ The **serveStatic** plug in is part of the library and handles delivering files > ``` -### Cross-Origin Ressource Sharing (CORS) +### Cross-Origin Resource Sharing (CORS) The `enableCORS(true)` function adds a `Access-Control-Allow-Origin: *` http-header to all responses to the client to inform that it is allowed to call URLs and services on this server from other web sites. diff --git a/libraries/ESP8266WebServer/examples/WebServer/WebServer.ino b/libraries/ESP8266WebServer/examples/WebServer/WebServer.ino index 78b82d70e5..bba7669ad7 100644 --- a/libraries/ESP8266WebServer/examples/WebServer/WebServer.ino +++ b/libraries/ESP8266WebServer/examples/WebServer/WebServer.ino @@ -104,7 +104,7 @@ public: // @brief check incoming request. Can handle POST for uploads and DELETE. // @param requestMethod method of the http request line. - // @param requestUri request ressource from the http request line. + // @param requestUri request resource from the http request line. // @return true when method can be handled. bool canHandle(HTTPMethod requestMethod, const String UNUSED &_uri) override { return ((requestMethod == HTTP_POST) || (requestMethod == HTTP_DELETE)); diff --git a/libraries/ESP8266WebServer/examples/WebServer/builtinfiles.h b/libraries/ESP8266WebServer/examples/WebServer/builtinfiles.h index 210b18c1a5..2daf9e3819 100644 --- a/libraries/ESP8266WebServer/examples/WebServer/builtinfiles.h +++ b/libraries/ESP8266WebServer/examples/WebServer/builtinfiles.h @@ -54,10 +54,10 @@ R"==( static const char notFoundContent[] PROGMEM = R"==( - Ressource not found + Resource not found -

The ressource was not found.

+

The resource was not found.

Start again

)=="; From f741521abc4a200fdb427f7cf9c5a4b5648777bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juraj=20Andr=C3=A1ssy?= <10706773+JAndrassy@users.noreply.github.com> Date: Sat, 15 Jun 2024 21:06:29 +0200 Subject: [PATCH 18/50] LwipIntfDev - legacy Ethernet API methods moved to EthernetCompat (#9133) --- cores/esp8266/LwipIntfDev.h | 18 +++--------------- libraries/lwIP_Ethernet/src/EthernetCompat.h | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/cores/esp8266/LwipIntfDev.h b/cores/esp8266/LwipIntfDev.h index daf63e935d..962d5e1196 100644 --- a/cores/esp8266/LwipIntfDev.h +++ b/cores/esp8266/LwipIntfDev.h @@ -83,15 +83,11 @@ class LwipIntfDev: public LwipIntf, public RawDev return &_netif; } - uint8_t* macAddress(uint8_t* mac) // WiFi lib way + uint8_t* macAddress(uint8_t* mac) { memcpy(mac, &_netif.hwaddr, 6); return mac; } - void MACAddress(uint8_t* mac) // Ethernet lib way - { - macAddress(mac); - } IPAddress localIP() const { return IPAddress(ip4_addr_get_u32(ip_2_ip4(&_netif.ip_addr))); @@ -104,15 +100,11 @@ class LwipIntfDev: public LwipIntf, public RawDev { return IPAddress(ip4_addr_get_u32(ip_2_ip4(&_netif.gw))); } - IPAddress dnsIP(int n = 0) const // WiFi lib way + IPAddress dnsIP(int n = 0) const { return IPAddress(dns_getserver(n)); } - IPAddress dnsServerIP() const // Ethernet lib way - { - return dnsIP(0); - } - void setDNS(IPAddress dns1, IPAddress dns2 = INADDR_ANY) // WiFi lib way + void setDNS(IPAddress dns1, IPAddress dns2 = INADDR_ANY) { if (dns1.isSet()) { @@ -123,10 +115,6 @@ class LwipIntfDev: public LwipIntf, public RawDev dns_setserver(1, dns2); } } - void setDnsServerIP(const IPAddress dnsIP) // Ethernet lib way - { - setDNS(dnsIP); - } // 1. Currently when no default is set, esp8266-Arduino uses the first // DHCP client interface receiving a valid address and gateway to diff --git a/libraries/lwIP_Ethernet/src/EthernetCompat.h b/libraries/lwIP_Ethernet/src/EthernetCompat.h index ee8d1fadc2..9ebd75ca15 100644 --- a/libraries/lwIP_Ethernet/src/EthernetCompat.h +++ b/libraries/lwIP_Ethernet/src/EthernetCompat.h @@ -103,6 +103,21 @@ class ArduinoEthernet: public LwipIntfDev return DHCP_CHECK_NONE; } + void MACAddress(uint8_t* mac) + { + LwipIntfDev::macAddress(mac); + } + + IPAddress dnsServerIP() const + { + return LwipIntfDev::dnsIP(0); + } + + void setDnsServerIP(const IPAddress dnsIP) + { + LwipIntfDev::setDNS(dnsIP); + } + protected: HardwareStatus _hardwareStatus; }; From 96ee7dfb8e31c6e613b17384155f4f8c5eaf4580 Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Sat, 15 Jun 2024 12:31:24 -0700 Subject: [PATCH 19/50] Add creation timestamp to LittleFS directories (#9127) * Add creation timestamp to LittleFS directories Partial fix #9120. This is simple enough to include and does not increase the amount of flash writes on file updates significantly (which a modified-time 't' attribute would). * Fix typo in debug message on error --- libraries/LittleFS/src/LittleFS.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/libraries/LittleFS/src/LittleFS.h b/libraries/LittleFS/src/LittleFS.h index a3afbfe77f..d5203ae6e0 100644 --- a/libraries/LittleFS/src/LittleFS.h +++ b/libraries/LittleFS/src/LittleFS.h @@ -167,6 +167,14 @@ class LittleFSImpl : public FSImpl return false; } int rc = lfs_mkdir(&_lfs, path); + if ((rc == 0) && _timeCallback) { + time_t now = _timeCallback(); + // Add metadata with creation time to the directory marker + int rc = lfs_setattr(&_lfs, path, 'c', (const void *)&now, sizeof(now)); + if (rc < 0) { + DEBUGV("Unable to set creation time on '%s' to %ld\n", path, (long)now); + } + } return (rc==0); } From 7e0d20e2b9034994f573a236364e0aef17fd66de Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Wed, 19 Jun 2024 14:32:06 -0700 Subject: [PATCH 20/50] Update to SDFat upstream 2.2.2 (#9126) * Update to SDFat upstream 2.2.2 Pull in reformatted/slightly refactored SDFat 2.2.2 upstream. Very minor changes, simple testing on other architectures passed w/o incident. * Fix SdFat to build for ESP8266 2.2.2 removed a define from the configuration header which is needed to compile on the ESP8266. Restore the default values there previously. * SDFat Debug tests not compatible, skip --------- Co-authored-by: Max Prokhorov --- libraries/ESP8266SdFat | 2 +- tests/common.sh | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/libraries/ESP8266SdFat b/libraries/ESP8266SdFat index 46151c90a4..eaab1369d5 160000 --- a/libraries/ESP8266SdFat +++ b/libraries/ESP8266SdFat @@ -1 +1 @@ -Subproject commit 46151c90a410a6f983f2f8c147e13086aaecdd8e +Subproject commit eaab1369d5b988d844888bc560967ae143847d5d diff --git a/tests/common.sh b/tests/common.sh index fc716abc66..f05eb6b37a 100755 --- a/tests/common.sh +++ b/tests/common.sh @@ -46,7 +46,8 @@ function skip_ino() *"/TeensySdioLogger/"* | \ *"/UserChipSelectFunction/"* | \ *"/UserSPIDriver/"* | \ - *"/onewiretest/"*) + *"/onewiretest/"* | \ + *"/debug/"*) return 0 ;; *"Teensy"*) From e4887b70ec0affd9c51984c2f540acc96d7f8332 Mon Sep 17 00:00:00 2001 From: Justin Pinkul Date: Thu, 25 Jul 2024 14:36:16 -0600 Subject: [PATCH 21/50] Directly include for std::set_terminate (#8978) I was recently trying to compile this project with a more recent version of GCC and hit an issue with this file. With older versions the std::set_terminate definition was being included via a transitive include of from the C++ standard library implementation. This is no longer the case with newer versions of libstdc++. This fixes the issue by using a direct include instead of relying on an implementation specific transitive include. --- cores/esp8266/core_esp8266_main.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/cores/esp8266/core_esp8266_main.cpp b/cores/esp8266/core_esp8266_main.cpp index 91a64e0ab8..d7f14b02c8 100644 --- a/cores/esp8266/core_esp8266_main.cpp +++ b/cores/esp8266/core_esp8266_main.cpp @@ -24,6 +24,7 @@ //#define CONT_STACKSIZE 4096 #include +#include #include #include "Schedule.h" From c2f136515a396be1101b261fe7b71e137aef0dce Mon Sep 17 00:00:00 2001 From: M Hightower <27247790+mhightower83@users.noreply.github.com> Date: Thu, 25 Jul 2024 14:03:52 -0700 Subject: [PATCH 22/50] Fixes exceptions resulting from using SPI0Command (#9140) * Resolves exceptions occuring when using SPI0Command for flash write operations such as: Write Status Register-1, Sector Eraser, etc. Moved PRECACHE_END to ensure `Wait_SPI_Idlep` and `xt_wsr_ps` are included in the iCache. Added SPIUCSSETUP to give more settling time for #CS. * There was a risk of flash reads inserted between an "enable opcode" and the "target opcode". They are now tightly coupled. Update flash quirks. * When sending instruction Write Enable 0x06, use BootROM API SPI_write_enable for the special handling of the WEL bit. Corrected zero mask for fractional byte returns where the partial byte bits are positioned at the most significant bit position in the byte. --- cores/esp8266/core_esp8266_flash_quirks.cpp | 5 +- cores/esp8266/core_esp8266_spi_utils.cpp | 92 ++++++++++++++++++--- cores/esp8266/esp8266_undocumented.h | 11 +++ cores/esp8266/spi_utils.h | 2 +- 4 files changed, 95 insertions(+), 15 deletions(-) diff --git a/cores/esp8266/core_esp8266_flash_quirks.cpp b/cores/esp8266/core_esp8266_flash_quirks.cpp index 7128fcfe2d..2ae3a39050 100644 --- a/cores/esp8266/core_esp8266_flash_quirks.cpp +++ b/cores/esp8266/core_esp8266_flash_quirks.cpp @@ -66,12 +66,13 @@ void initFlashQuirks() { newSR3=SR3; if (get_flash_mhz()>26) { // >26Mhz? // Set the output drive to 100% + // These definitions are for the XM25QH32B part. On a XM25QH32C + // part, the XM25QH32B's 100% is C's 25% driver strength. newSR3 &= ~(SPI_FLASH_SR3_XMC_DRV_MASK << SPI_FLASH_SR3_XMC_DRV_S); newSR3 |= (SPI_FLASH_SR3_XMC_DRV_100 << SPI_FLASH_SR3_XMC_DRV_S); } if (newSR3 != SR3) { // only write if changed - if (SPI0Command(SPI_FLASH_CMD_WEVSR,NULL,0,0)==SPI_RESULT_OK) // write enable volatile SR - SPI0Command(SPI_FLASH_CMD_WSR3,&newSR3,8,0); // write to SR3 + SPI0Command(SPI_FLASH_CMD_WSR3,&newSR3,8,0,SPI_FLASH_CMD_WEVSR); // write to SR3, use write enable volatile prefix SPI0Command(SPI_FLASH_CMD_WRDI,NULL,0,0); // write disable - probably not needed } } diff --git a/cores/esp8266/core_esp8266_spi_utils.cpp b/cores/esp8266/core_esp8266_spi_utils.cpp index 5f2ea25f92..cd5e153c27 100644 --- a/cores/esp8266/core_esp8266_spi_utils.cpp +++ b/cores/esp8266/core_esp8266_spi_utils.cpp @@ -32,6 +32,7 @@ #include "core_esp8266_features.h" #include "spi_utils.h" +#include "spi_flash_defs.h" extern "C" uint32_t Wait_SPI_Idle(SpiFlashChip *fc); @@ -51,12 +52,12 @@ namespace experimental { static SpiOpResult PRECACHE_ATTR _SPICommand(volatile uint32_t spiIfNum, uint32_t spic,uint32_t spiu,uint32_t spiu1,uint32_t spiu2, - uint32_t *data,uint32_t writeWords,uint32_t readWords) + uint32_t *data,uint32_t writeWords,uint32_t readWords, uint32_t pre_cmd) { if (spiIfNum>1) return SPI_RESULT_ERR; - // force SPI register access via base+offset. + // force SPI register access via base+offset. // Prevents loading individual address constants from flash. uint32_t *spibase = (uint32_t*)(spiIfNum ? &(SPI1CMD) : &(SPI0CMD)); #define SPIREG(reg) (*((volatile uint32_t *)(spibase+(&(reg) - &(SPI0CMD))))) @@ -65,6 +66,7 @@ _SPICommand(volatile uint32_t spiIfNum, // Everything defined here must be volatile or the optimizer can // treat them as constants, resulting in the flash reads we're // trying to avoid + SpiFlashOpResult (* volatile SPI_write_enablep)(SpiFlashChip *) = SPI_write_enable; uint32_t (* volatile Wait_SPI_Idlep)(SpiFlashChip *) = Wait_SPI_Idle; volatile SpiFlashChip *fchip=flashchip; volatile uint32_t spicmdusr=SPICMDUSR; @@ -77,15 +79,30 @@ _SPICommand(volatile uint32_t spiIfNum, PRECACHE_START(); Wait_SPI_Idlep((SpiFlashChip *)fchip); } - + // preserve essential controller state such as incoming/outgoing // data lengths and IO mode. uint32_t oldSPI0U = SPIREG(SPI0U); uint32_t oldSPI0U2= SPIREG(SPI0U2); uint32_t oldSPI0C = SPIREG(SPI0C); - //SPI0S &= ~(SPISE|SPISBE|SPISSE|SPISCD); SPIREG(SPI0C) = spic; + + if (SPI_FLASH_CMD_WREN == pre_cmd) { + // See SPI_write_enable comments in esp8266_undocumented.h + SPI_write_enablep((SpiFlashChip *)fchip); + } else + if (pre_cmd) { + // Send prefix cmd w/o data - sends 8 bits. eg. Volatile SR Write Enable, 0x50 + SPIREG(SPI0U) = (spiu & ~(SPIUMOSI|SPIUMISO)); + SPIREG(SPI0U1) = 0; + SPIREG(SPI0U2) = (spiu2 & ~0xFFFFu) | pre_cmd; + + SPIREG(SPI0CMD) = spicmdusr; //Send cmd + while ((SPIREG(SPI0CMD) & spicmdusr)); + } + + //SPI0S &= ~(SPISE|SPISBE|SPISSE|SPISCD); SPIREG(SPI0U) = spiu; SPIREG(SPI0U1)= spiu1; SPIREG(SPI0U2)= spiu2; @@ -117,11 +134,22 @@ _SPICommand(volatile uint32_t spiIfNum, SPIREG(SPI0U) = oldSPI0U; SPIREG(SPI0U2)= oldSPI0U2; SPIREG(SPI0C) = oldSPI0C; - - PRECACHE_END(); + if (!spiIfNum) { + // w/o a call to Wait_SPI_Idlep, 'Exception 0' or other exceptions (saw + // 28) may occur later after returning to iCache code. This issue was + // observed with non-volatile status register writes. + // + // My guess is: Returning too soon to uncached iCache executable space. An + // iCache read may not complete properly because the Flash or SPI + // interface is still busy with the last write operation. In such a case, + // I expect new reads from iROM to result in zeros. This would explain + // the Exception 0 for code, and Exception 20, 28, and 29 where a literal + // was misread as 0 and then used as a pointer. + Wait_SPI_Idlep((SpiFlashChip *)fchip); xt_wsr_ps(saved_ps); } + PRECACHE_END(); return (timeout>0 ? SPI_RESULT_OK : SPI_RESULT_TIMEOUT); } @@ -139,12 +167,37 @@ _SPICommand(volatile uint32_t spiIfNum, * miso_bits * Number of bits to read from the SPI bus after the outgoing * data has been sent. + * pre_cmd + * A few SPI Flash commands require enable commands to immediately preceed + * them. Since two calls to SPI0Command from ICACHE memory most likely would + * be separated by SPI Flash read request for iCache, use this option to + * supply a prefix command, 8-bits w/o read or write data. + * + * Case in point from the GD25Q32E datasheet: "The Write Enable for Volatile + * Status Register command must be issued prior to a Write Status Register + * command and any other commands can’t be inserted between them." * * Note: This code has only been tested with SPI bus 0, but should work * equally well with other buses. The ESP8266 has bus 0 and 1, * newer chips may have more one day. + * + * Supplemental Notes: + * + * SPI Bus wire view: Think of *data as an array of bytes, byte[0] goes out + * first with the most significant bit shifted out first and so on. When + * thinking of the data as an array of 32bit-words, the least significant byte + * of the first 32bit-word goes out first on the SPI bus with the most + * significant bit of that byte shifted out first onto the wire. + * + * When presenting a 3 or 4-byte address, the byte order will need to be + * reversed. Don't overthink it. For a 3-byte address, view *data as a byte + * array and set the first 3-bytes to the address. eg. byteData[0] MSB, + * byteData[1] middle, and byteData[2] LSB. + * + * When sending a fractional byte, fill in the most significant bit positions + * of the byte first. */ -SpiOpResult SPI0Command(uint8_t cmd, uint32_t *data, uint32_t mosi_bits, uint32_t miso_bits) { +SpiOpResult SPI0Command(uint8_t cmd, uint32_t *data, uint32_t mosi_bits, uint32_t miso_bits, uint32_t pre_cmd) { if (mosi_bits>(64*8)) return SPI_RESULT_ERR; if (miso_bits>(64*8)) @@ -159,8 +212,16 @@ SpiOpResult SPI0Command(uint8_t cmd, uint32_t *data, uint32_t mosi_bits, uint32_ if (miso_bits % 32 != 0) miso_words++; + // Use SPI_CS_SETUP to add time for #CS to settle (ringing) before SPI CLK + // begins. The BootROM does not do this; however, RTOS SDK and NONOS SDK do + // as part of flash init/configuration. + // + // One SPI bus clock cycle time inserted between #CS active and the 1st SPI + // bus clock cycle. The number of clock cycles is in SPI_CNTRL2 + // SPI_SETUP_TIME, which defaults to 1. + // // Select user defined command mode in the controller - uint32_t spiu=SPIUCOMMAND; //SPI_USR_COMMAND + uint32_t spiu=SPIUCOMMAND | SPIUCSSETUP; //SPI_USR_COMMAND | SPI_CS_SETUP // Set the command byte to send uint32_t spiu2 = ((7 & SPIMCOMMAND)<> (miso_bits % 8u)) & 0xFFu) << whole_byte_bits; + } + data[miso_bits/32u] &= mask; } } return rc; diff --git a/cores/esp8266/esp8266_undocumented.h b/cores/esp8266/esp8266_undocumented.h index 5e68e53fa1..d7924333a8 100644 --- a/cores/esp8266/esp8266_undocumented.h +++ b/cores/esp8266/esp8266_undocumented.h @@ -241,6 +241,17 @@ extern fn_c_exception_handler_t _xtos_c_handler_table[XCHAL_EXCCAUSE_NUM]; extern fn_c_exception_handler_t _xtos_set_exception_handler(int cause, fn_c_exception_handler_t fn); #endif +/* + BootROM function that sends the SPI Flash "Write Enable" command, 0x06. + The function internally calls Wait_SPI_Idle before enabling. + Polls status register forever waiting for WEL bit to set. + This function always returns 0; however, most examples test for 0. + + Every function I find that needs WEL set, call this function. I suspect the + waiting for the WEL bit to set is a Flash chip anomaly workaround. +*/ +extern SpiFlashOpResult SPI_write_enable(SpiFlashChip *fc); + extern uint32_t Wait_SPI_Idle(SpiFlashChip *fc); extern void Cache_Read_Disable(); extern int32_t system_func1(uint32_t); diff --git a/cores/esp8266/spi_utils.h b/cores/esp8266/spi_utils.h index bf0928f288..181554a55a 100644 --- a/cores/esp8266/spi_utils.h +++ b/cores/esp8266/spi_utils.h @@ -35,7 +35,7 @@ typedef enum { SPI_RESULT_TIMEOUT } SpiOpResult; -SpiOpResult SPI0Command(uint8_t cmd, uint32_t *data, uint32_t mosi_bits, uint32_t miso_bits); +SpiOpResult SPI0Command(uint8_t cmd, uint32_t *data, uint32_t mosi_bits, uint32_t miso_bits, uint32_t pre_cmd=0); } #ifdef __cplusplus From 1b6f815463ffbb2c4950d2a477b8e28a6f0706e0 Mon Sep 17 00:00:00 2001 From: Max Prokhorov Date: Wed, 31 Jul 2024 01:28:46 +0300 Subject: [PATCH 23/50] Sphinx syntax fixes (#9180) get rid of warnings when converting python -> rst, force quit when they happen fix code-blocks, always need extra line fix invalid headers refs so they actually work --- doc/Makefile | 4 +- doc/boards.rst | 49 +++++++++++--------- doc/conf.py | 2 +- doc/esp8266wifi/generic-examples.rst | 11 +++-- doc/esp8266wifi/server-examples.rst | 1 - doc/faq/a01-espcomm_sync-failed.rst | 2 +- doc/faq/a02-my-esp-crashes.rst | 6 +-- doc/faq/a03-library-does-not-work.rst | 2 +- doc/mmu.rst | 2 - doc/ota_updates/readme.rst | 6 +-- tools/boards.txt.py | 67 ++++++++++++++------------- 11 files changed, 81 insertions(+), 71 deletions(-) diff --git a/doc/Makefile b/doc/Makefile index 36b4923488..cbfd6af2ab 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -2,7 +2,7 @@ # # You can set these variables from the command line. -SPHINXOPTS = +SPHINXOPTS = -W --keep-going -n SPHINXBUILD = sphinx-build SPHINXPROJ = ESP8266ArduinoCore SOURCEDIR = . @@ -17,4 +17,4 @@ help: # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) \ No newline at end of file + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/doc/boards.rst b/doc/boards.rst index c8cd3d6bdb..8c0d876e8f 100644 --- a/doc/boards.rst +++ b/doc/boards.rst @@ -39,25 +39,30 @@ Minimal Hardware Setup for Bootloading and Usage +-----------------+------------+------------------+ | GND | | GND | +-----------------+------------+------------------+ -| TX or GPIO2\* | | RX | +| TX or GPIO2 | | | +| [#tx_or_gpio2]_ | RX | | +-----------------+------------+------------------+ | RX | | TX | +-----------------+------------+------------------+ | GPIO0 | PullUp | DTR | +-----------------+------------+------------------+ -| Reset\* | PullUp | RTS | +| Reset | | | +| [#reset]_ | PullUp | RTS | +-----------------+------------+------------------+ -| GPIO15\* | PullDown | | +| GPIO15 | | | +| [#gpio15]_ | PullDown | | +-----------------+------------+------------------+ -| CH\_PD | PullUp | | +| CH\_PD | | | +| [#ch_pd]_ | PullUp | | +-----------------+------------+------------------+ -- Note -- GPIO15 is also named MTDO -- Reset is also named RSBT or REST (adding PullUp improves the +.. rubric:: Notes + +.. [#tx_or_gpio2] GPIO15 is also named MTDO +.. [#reset] Reset is also named RSBT or REST (adding PullUp improves the stability of the module) -- GPIO2 is alternative TX for the boot loader mode -- **Directly connecting a pin to VCC or GND is not a substitute for a +.. [#gpio15] GPIO2 is alternative TX for the boot loader mode +.. [#ch_pd] **Directly connecting a pin to VCC or GND is not a substitute for a PullUp or PullDown resistor, doing this can break upload management and the serial console, instability has also been noted in some cases.** @@ -88,15 +93,16 @@ ESPxx Hardware +---------------+------------+------------------+ | GPIO0 | | GND | +---------------+------------+------------------+ -| Reset | | RTS\* | +| Reset | | RTS [#rts]_ | +---------------+------------+------------------+ | GPIO15 | PullDown | | +---------------+------------+------------------+ | CH\_PD | PullUp | | +---------------+------------+------------------+ -- Note -- if no RTS is used a manual power toggle is needed +.. rubric:: Notes + +.. [#rts] if no RTS is used a manual power toggle is needed Minimal Hardware Setup for Running only ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -176,7 +182,11 @@ rst cause boot mode ~~~~~~~~~ -the first value respects the pin setup of the Pins 0, 2 and 15. +the first value respects the pin setup of the Pins 0, 2 and 15 + +.. code-block:: + + Number = (GPIO15 << 2) | (GPIO0 << 1) | GPIO2 +----------+----------+---------+---------+-------------+ | Number | GPIO15 | GPIO0 | GPIO2 | Mode | @@ -198,7 +208,6 @@ the first value respects the pin setup of the Pins 0, 2 and 15. | 7 | 3.3V | 3.3V | 3.3V | SDIO | +----------+----------+---------+---------+-------------+ -note: - number = ((GPIO15 << 2) \| (GPIO0 << 1) \| GPIO2); Generic ESP8285 Module ---------------------- @@ -413,14 +422,10 @@ ThaiEasyElec's ESPino ESPino by ThaiEasyElec using WROOM-02 module from Espressif Systems with 4 MB Flash. -We will update an English description soon. - Product page: -http://thaieasyelec.com/products/wireless-modules/wifi-modules/espino-wifi-development-board-detail.html -- Schematics: -www.thaieasyelec.com/downloads/ETEE052/ETEE052\_ESPino\_Schematic.pdf - -Dimensions: -http://thaieasyelec.com/downloads/ETEE052/ETEE052\_ESPino\_Dimension.pdf -- Pinouts: -http://thaieasyelec.com/downloads/ETEE052/ETEE052\_ESPino\_User\_Manual\_TH\_v1\_0\_20160204.pdf (Please see pg. 8) +* Product page (retired product): https://www.thaieasyelec.com/product/%E0%B8%A2%E0%B8%81%E0%B9%80%E0%B8%A5%E0%B8%B4%E0%B8%81%E0%B8%88%E0%B8%B3%E0%B8%AB%E0%B8%99%E0%B9%88%E0%B8%B2%E0%B8%A2-retired-espino-wifi-development-board/11000833173001086 +* Schematics: https://downloads.thaieasyelec.com/ETEE052/ETEE052\_ESPino\_Schematic.pdf +* Dimensions: https://downloads.thaieasyelec.com/ETEE052/ETEE052\_ESPino\_Dimension.pdf +* Pinouts (Please see pg.8): https://downloads.thaieasyelec.com/ETEE052/ETEE052\_ESPino\_User\_Manual\_TH\_v1\_0\_20160204.pdf WifInfo ------- diff --git a/doc/conf.py b/doc/conf.py index 3b05ae5617..958f3cdbd0 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -66,7 +66,7 @@ # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. -language = None +language = 'en' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. diff --git a/doc/esp8266wifi/generic-examples.rst b/doc/esp8266wifi/generic-examples.rst index 8cd919d156..98ccf6c47b 100644 --- a/doc/esp8266wifi/generic-examples.rst +++ b/doc/esp8266wifi/generic-examples.rst @@ -40,7 +40,8 @@ To get events to work we need to complete just two steps: 1. Declare the event handler in global scope. -.. code:: cpp +.. code-block:: cpp + WiFiEventHandler disconnectedEventHandler; Alternatively, it can be declared as ``static`` in both function and global scopes. @@ -49,7 +50,8 @@ Alternatively, it can be declared as ``static`` in both function and global scop 2. Select particular event (in this case ``onStationModeDisconnected``). When this event is fired the code will print out information that station has been disconnected: -.. code:: cpp +.. code-block:: cpp + disconnectedEventHandler = WiFi.onStationModeDisconnected( [](auto&& event) { Serial.println("Station disconnected"); @@ -57,7 +59,8 @@ Alternatively, it can be declared as ``static`` in both function and global scop 3. Disable ``disconnectedEventHandler``, so the event is no longer handled by our callback: -.. code:: cpp +.. code-block:: cpp + disconnectedEventHandler = nullptr; Take note that lifetime of the callback handler is up to the app. e.g. if ``onStationModeDisconnected`` is declared in the function scope, it would be discarded immediately after the function exits. @@ -67,7 +70,7 @@ The Code The complete code, including both methods discussed at the beginning, is provided below. -.. code:: cpp +.. code-block:: cpp #include diff --git a/doc/esp8266wifi/server-examples.rst b/doc/esp8266wifi/server-examples.rst index cbe5c1abf7..c10b5f7eba 100644 --- a/doc/esp8266wifi/server-examples.rst +++ b/doc/esp8266wifi/server-examples.rst @@ -16,7 +16,6 @@ Table of Contents - `The Page is Served <#the-page-is-served>`__ - `Get it Together <#put-it-together>`__ - `Get it Run <#get-it-run>`__ -- `What Else? <#what-else>`__ - `Conclusion <#conclusion>`__ The Object diff --git a/doc/faq/a01-espcomm_sync-failed.rst b/doc/faq/a01-espcomm_sync-failed.rst index df4d0aa177..d47a5d2eeb 100644 --- a/doc/faq/a01-espcomm_sync-failed.rst +++ b/doc/faq/a01-espcomm_sync-failed.rst @@ -9,7 +9,7 @@ I am getting "espcomm\_sync failed" error when trying to upload my ESP. How to r - `Reset Methods <#reset-methods>`__ - `Ck <#ck>`__ - `Nodemcu <#nodemcu>`__ -- `I'm Stuck <#im-stuck>`__ +- `I'm Stuck <#i-m-stuck>`__ - `Conclusion <#conclusion>`__ Introduction diff --git a/doc/faq/a02-my-esp-crashes.rst b/doc/faq/a02-my-esp-crashes.rst index 0134dda666..ec6340e8c7 100644 --- a/doc/faq/a02-my-esp-crashes.rst +++ b/doc/faq/a02-my-esp-crashes.rst @@ -5,7 +5,7 @@ My ESP crashes running some code. How to troubleshoot it? - `Introduction <#introduction>`__ - `What ESP has to Say <#what-esp-has-to-say>`__ -- `Get Your H/W Right <#get-your-hw-right>`__ +- `Get Your H/W Right <#get-your-h-w-right>`__ - `Enable compilation warnings <#enable-compilation-warnings>`__ - `What is the Cause of Restart? <#what-is-the-cause-of-restart>`__ - `Exception <#exception>`__ @@ -148,8 +148,8 @@ table to understand what kind of issue it is. If you have no clues what it's about and where it happens, then use `Arduino ESP8266/ESP32 Exception Stack Trace Decoder `__ to find -out in which line of application it is triggered. Please refer to `Check -Where the Code Crashes <#check-where-the-code-crashes>`__ point below +out in which line of application it is triggered. Please refer to +`Exception decoder <#exception-decoder>`__ point below for a quick example how to do it. **NOTE:** When decoding exceptions be sure to include all lines between diff --git a/doc/faq/a03-library-does-not-work.rst b/doc/faq/a03-library-does-not-work.rst index 8b9b2d6910..6597c1a1dc 100644 --- a/doc/faq/a03-library-does-not-work.rst +++ b/doc/faq/a03-library-does-not-work.rst @@ -7,7 +7,7 @@ This Arduino library doesn't work on ESP. How do I make it working? - `Identify the Issues <#identify-the-issues>`__ - `Fix it Yourself <#fix-it-yourself>`__ - `Compilation Errors <#compilation-errors>`__ -- `Exceptions / Watchdog Resets <#exceptions--watchdog-resets>`__ +- `Exceptions / Watchdog Resets <#exceptions-watchdog-resets>`__ - `Functionality Issues <#functionality-issues>`__ - `Conclusion <#conclusion>`__ diff --git a/doc/mmu.rst b/doc/mmu.rst index 3846bc3f81..27ea4d4d7d 100644 --- a/doc/mmu.rst +++ b/doc/mmu.rst @@ -250,5 +250,3 @@ address range of IRAM or DRAM. uint8_t mmu_set_uint8(void *p8, const uint8_t val); uint16_t mmu_set_uint16(uint16_t *p16, const uint16_t val); int16_t mmu_set_int16(int16_t *p16, const int16_t val); - -:: diff --git a/doc/ota_updates/readme.rst b/doc/ota_updates/readme.rst index ba68506cb0..de351fe3f2 100755 --- a/doc/ota_updates/readme.rst +++ b/doc/ota_updates/readme.rst @@ -216,7 +216,7 @@ Requirements Application Example ~~~~~~~~~~~~~~~~~~~ -Instructions below show configuration of OTA on a NodeMCU 1.0 (ESP-12E Module) board. You can use any other board that meets the `requirements <#basic-requirements>`__ described above. This instruction is valid for all operating systems supported by the Arduino IDE. Screen captures have been made on Windows 7 and you may see small differences (like name of the serial port), if you are using Linux or MacOS. +Instructions below show configuration of OTA on a NodeMCU 1.0 (ESP-12E Module) board. You can use any other board that meets the `requirements <#ota-basic-requirements>`__ described above. This instruction is valid for all operating systems supported by the Arduino IDE. Screen captures have been made on Windows 7 and you may see small differences (like name of the serial port), if you are using Linux or MacOS. 1. Before you begin, please make sure that you have the following software installed: @@ -336,7 +336,7 @@ Select COM port and baud rate on external terminal program as if you were using :alt: Termite settings -Then run OTA from IDE and look what is displayed on terminal. Successful `ArduinoOTA <#arduinoota>`__ process using BasicOTA.ino sketch looks like below (IP address depends on your network configuration): +Then run OTA from IDE and look what is displayed on terminal. Successful `ArduinoOTA <#arduino-ide>`__ process using BasicOTA.ino sketch looks like below (IP address depends on your network configuration): .. figure:: a-ota-external-serial-terminal-output.png :alt: OTA upload successful - output on an external serial terminal @@ -407,7 +407,7 @@ The sample implementation provided below has been done using: ``ESP8266HTTPUpdateServer`` library, - NodeMCU 1.0 (ESP-12E Module). -You can use another module if it meets previously described `requirements <#basic-requirements>`__. +You can use another module if it meets previously described `requirements <#ota-basic-requirements>`__. 1. Before you begin, please make sure that you have the following software installed: diff --git a/tools/boards.txt.py b/tools/boards.txt.py index 681cc0b7b6..87a3f2a8eb 100755 --- a/tools/boards.txt.py +++ b/tools/boards.txt.py @@ -112,25 +112,30 @@ '+-----------------+------------+------------------+', '| GND | | GND |', '+-----------------+------------+------------------+', - '| TX or GPIO2\* | | RX |', + '| TX or GPIO2 | | |', + '| [#tx_or_gpio2]_ | RX | |', '+-----------------+------------+------------------+', '| RX | | TX |', '+-----------------+------------+------------------+', '| GPIO0 | PullUp | DTR |', '+-----------------+------------+------------------+', - '| Reset\* | PullUp | RTS |', + '| Reset | | |', + '| [#reset]_ | PullUp | RTS |', '+-----------------+------------+------------------+', - '| GPIO15\* | PullDown | |', + '| GPIO15 | | |', + '| [#gpio15]_ | PullDown | |', '+-----------------+------------+------------------+', - '| CH\_PD | PullUp | |', + '| CH\\_PD | | |', + '| [#ch_pd]_ | PullUp | |', '+-----------------+------------+------------------+', '', - '- Note', - '- GPIO15 is also named MTDO', - '- Reset is also named RSBT or REST (adding PullUp improves the', + '.. rubric:: Notes', + '', + '.. [#tx_or_gpio2] GPIO15 is also named MTDO', + '.. [#reset] Reset is also named RSBT or REST (adding PullUp improves the', ' stability of the module)', - '- GPIO2 is alternative TX for the boot loader mode', - '- **Directly connecting a pin to VCC or GND is not a substitute for a', + '.. [#gpio15] GPIO2 is alternative TX for the boot loader mode', + '.. [#ch_pd] **Directly connecting a pin to VCC or GND is not a substitute for a', ' PullUp or PullDown resistor, doing this can break upload management', ' and the serial console, instability has also been noted in some', ' cases.**', @@ -161,15 +166,16 @@ '+---------------+------------+------------------+', '| GPIO0 | | GND |', '+---------------+------------+------------------+', - '| Reset | | RTS\* |', + '| Reset | | RTS [#rts]_ |', '+---------------+------------+------------------+', '| GPIO15 | PullDown | |', '+---------------+------------+------------------+', - '| CH\_PD | PullUp | |', + '| CH\\_PD | PullUp | |', '+---------------+------------+------------------+', '', - '- Note', - '- if no RTS is used a manual power toggle is needed', + '.. rubric:: Notes', + '', + '.. [#rts] if no RTS is used a manual power toggle is needed', '', 'Minimal Hardware Setup for Running only', '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~', @@ -187,7 +193,7 @@ '+----------+------------+----------------+', '| GPIO15 | PullDown | |', '+----------+------------+----------------+', - '| CH\_PD | PullUp | |', + '| CH\\_PD | PullUp | |', '+----------+------------+----------------+', '', 'Minimal', @@ -249,7 +255,11 @@ 'boot mode', '~~~~~~~~~', '', - 'the first value respects the pin setup of the Pins 0, 2 and 15.', + 'the first value respects the pin setup of the Pins 0, 2 and 15', + '', + '.. code-block::', + '', + ' Number = (GPIO15 << 2) | (GPIO0 << 1) | GPIO2', '', '+----------+----------+---------+---------+-------------+', '| Number | GPIO15 | GPIO0 | GPIO2 | Mode |', @@ -271,7 +281,6 @@ '| 7 | 3.3V | 3.3V | 3.3V | SDIO |', '+----------+----------+---------+---------+-------------+', '', - 'note: - number = ((GPIO15 << 2) \| (GPIO0 << 1) \| GPIO2);', ], }), ( 'esp8285', { @@ -756,14 +765,10 @@ ], 'desc': [ 'ESPino by ThaiEasyElec using WROOM-02 module from Espressif Systems with 4 MB Flash.', '', - 'We will update an English description soon. - Product page:', - 'http://thaieasyelec.com/products/wireless-modules/wifi-modules/espino-wifi-development-board-detail.html', - '- Schematics:', - 'www.thaieasyelec.com/downloads/ETEE052/ETEE052\_ESPino\_Schematic.pdf -', - 'Dimensions:', - 'http://thaieasyelec.com/downloads/ETEE052/ETEE052\_ESPino\_Dimension.pdf', - '- Pinouts:', - 'http://thaieasyelec.com/downloads/ETEE052/ETEE052\_ESPino\_User\_Manual\_TH\_v1\_0\_20160204.pdf (Please see pg. 8)', + '* Product page (retired product): https://www.thaieasyelec.com/product/%E0%B8%A2%E0%B8%81%E0%B9%80%E0%B8%A5%E0%B8%B4%E0%B8%81%E0%B8%88%E0%B8%B3%E0%B8%AB%E0%B8%99%E0%B9%88%E0%B8%B2%E0%B8%A2-retired-espino-wifi-development-board/11000833173001086', + '* Schematics: https://downloads.thaieasyelec.com/ETEE052/ETEE052\\_ESPino\\_Schematic.pdf', + '* Dimensions: https://downloads.thaieasyelec.com/ETEE052/ETEE052\\_ESPino\\_Dimension.pdf', + '* Pinouts (Please see pg.8): https://downloads.thaieasyelec.com/ETEE052/ETEE052\\_ESPino\\_User\\_Manual\\_TH\\_v1\\_0\\_20160204.pdf', ], }), ( 'wifinfo', { @@ -1626,13 +1631,13 @@ def all_flash_map (): print("generated: flash map config file (in cores/esp8266/FlashMap.h)") return { - 'autoflash': { - '.menu.eesz.autoflash': 'Mapping defined by Hardware and Sketch', - '.menu.eesz.autoflash.build.flash_size': '16M', - '.menu.eesz.autoflash.build.flash_ld': 'eagle.flash.auto.ld', - '.menu.eesz.autoflash.build.extra_flags': '-DFLASH_MAP_SUPPORT=1', - '.menu.eesz.autoflash.upload.maximum_size': '1044464', - }, + 'autoflash': collections.OrderedDict([ + ('.menu.eesz.autoflash', 'Mapping defined by Hardware and Sketch'), + ('.menu.eesz.autoflash.build.flash_size', '16M'), + ('.menu.eesz.autoflash.build.flash_ld', 'eagle.flash.auto.ld'), + ('.menu.eesz.autoflash.build.extra_flags', '-DFLASH_MAP_SUPPORT=1'), + ('.menu.eesz.autoflash.upload.maximum_size', '1044464') + ]), '512K': f512, '1M': f1m, '2M': f2m, From bd136f1c20ade26cd339faa20ad67df20a67d72e Mon Sep 17 00:00:00 2001 From: raliotech Date: Wed, 31 Jul 2024 04:10:57 +0530 Subject: [PATCH 24/50] Boards - add Mercury 1.0 (#9166) Co-authored-by: Gaurang Gupta --- boards.txt | 223 ++++++++++++++++++ doc/boards.rst | 7 + .../package_esp8266com_index.template.json | 3 + tools/boards.txt.py | 17 ++ variants/mercury_v1/pins_arduino.h | 71 ++++++ 5 files changed, 321 insertions(+) create mode 100644 variants/mercury_v1/pins_arduino.h diff --git a/boards.txt b/boards.txt index a1fdd6125d..1b44fe3310 100644 --- a/boards.txt +++ b/boards.txt @@ -5645,6 +5645,229 @@ agruminolemon.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM agruminolemon.menu.iramfloat.yes=allowed in ISR agruminolemon.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM +############################################################## +mercury1.name=Mercury 1.0 +mercury1.build.board=mercury +mercury1.build.variant=mercury_v1 +mercury1.upload.tool=esptool +mercury1.upload.maximum_data_size=81920 +mercury1.upload.wait_for_upload_port=true +mercury1.upload.erase_cmd= +mercury1.serial.disableDTR=true +mercury1.serial.disableRTS=true +mercury1.build.mcu=esp8266 +mercury1.build.core=esp8266 +mercury1.build.spiffs_pagesize=256 +mercury1.build.debug_optim= +mercury1.build.debug_port= +mercury1.build.debug_level= +mercury1.menu.xtal.80=80 MHz +mercury1.menu.xtal.80.build.f_cpu=80000000L +mercury1.menu.xtal.160=160 MHz +mercury1.menu.xtal.160.build.f_cpu=160000000L +mercury1.menu.vt.flash=Flash +mercury1.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH +mercury1.menu.vt.heap=Heap +mercury1.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM +mercury1.menu.vt.iram=IRAM +mercury1.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM +mercury1.menu.exception.disabled=Disabled (new aborts on oom) +mercury1.menu.exception.disabled.build.exception_flags=-fno-exceptions +mercury1.menu.exception.disabled.build.stdcpp_lib=-lstdc++ +mercury1.menu.exception.enabled=Enabled +mercury1.menu.exception.enabled.build.exception_flags=-fexceptions +mercury1.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc +mercury1.menu.stacksmash.disabled=Disabled +mercury1.menu.stacksmash.disabled.build.stacksmash_flags= +mercury1.menu.stacksmash.enabled=Enabled +mercury1.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector +mercury1.menu.ssl.all=All SSL ciphers (most compatible) +mercury1.menu.ssl.all.build.sslflags= +mercury1.menu.ssl.basic=Basic SSL ciphers (lower ROM use) +mercury1.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC +mercury1.menu.mmu.3232=32KB cache + 32KB IRAM (balanced) +mercury1.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 +mercury1.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM) +mercury1.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 +mercury1.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared) +mercury1.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP +mercury1.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared) +mercury1.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000 +mercury1.menu.mmu.ext128k=128K Heap External 23LC1024 +mercury1.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 +mercury1.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM +mercury1.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 +mercury1.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM +mercury1.menu.non32xfer.fast.build.non32xferflags= +mercury1.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow) +mercury1.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER +mercury1.upload.resetmethod=--before default_reset --after hard_reset +mercury1.build.flash_mode=dio +mercury1.build.flash_flags=-DFLASHMODE_DIO +mercury1.build.flash_freq=40 +mercury1.menu.eesz.4M2M=4MB (FS:2MB OTA:~1019KB) +mercury1.menu.eesz.4M2M.build.flash_size=4M +mercury1.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld +mercury1.menu.eesz.4M2M.build.spiffs_pagesize=256 +mercury1.menu.eesz.4M2M.build.rfcal_addr=0x3FC000 +mercury1.menu.eesz.4M2M.build.spiffs_start=0x200000 +mercury1.menu.eesz.4M2M.build.spiffs_end=0x3FA000 +mercury1.menu.eesz.4M2M.build.spiffs_blocksize=8192 +mercury1.menu.eesz.4M3M=4MB (FS:3MB OTA:~512KB) +mercury1.menu.eesz.4M3M.build.flash_size=4M +mercury1.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld +mercury1.menu.eesz.4M3M.build.spiffs_pagesize=256 +mercury1.menu.eesz.4M3M.build.rfcal_addr=0x3FC000 +mercury1.menu.eesz.4M3M.build.spiffs_start=0x100000 +mercury1.menu.eesz.4M3M.build.spiffs_end=0x3FA000 +mercury1.menu.eesz.4M3M.build.spiffs_blocksize=8192 +mercury1.menu.eesz.4M1M=4MB (FS:1MB OTA:~1019KB) +mercury1.menu.eesz.4M1M.build.flash_size=4M +mercury1.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld +mercury1.menu.eesz.4M1M.build.spiffs_pagesize=256 +mercury1.menu.eesz.4M1M.build.rfcal_addr=0x3FC000 +mercury1.menu.eesz.4M1M.build.spiffs_start=0x300000 +mercury1.menu.eesz.4M1M.build.spiffs_end=0x3FA000 +mercury1.menu.eesz.4M1M.build.spiffs_blocksize=8192 +mercury1.menu.eesz.4M=4MB (FS:none OTA:~1019KB) +mercury1.menu.eesz.4M.build.flash_size=4M +mercury1.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld +mercury1.menu.eesz.4M.build.spiffs_pagesize=256 +mercury1.menu.eesz.4M.build.rfcal_addr=0x3FC000 +mercury1.menu.ip.lm2f=v2 Lower Memory +mercury1.menu.ip.lm2f.build.lwip_include=lwip2/include +mercury1.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat +mercury1.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 +mercury1.menu.ip.hb2f=v2 Higher Bandwidth +mercury1.menu.ip.hb2f.build.lwip_include=lwip2/include +mercury1.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat +mercury1.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 +mercury1.menu.ip.lm2n=v2 Lower Memory (no features) +mercury1.menu.ip.lm2n.build.lwip_include=lwip2/include +mercury1.menu.ip.lm2n.build.lwip_lib=-llwip2-536 +mercury1.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 +mercury1.menu.ip.hb2n=v2 Higher Bandwidth (no features) +mercury1.menu.ip.hb2n.build.lwip_include=lwip2/include +mercury1.menu.ip.hb2n.build.lwip_lib=-llwip2-1460 +mercury1.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 +mercury1.menu.ip.lm6f=v2 IPv6 Lower Memory +mercury1.menu.ip.lm6f.build.lwip_include=lwip2/include +mercury1.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat +mercury1.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 +mercury1.menu.ip.hb6f=v2 IPv6 Higher Bandwidth +mercury1.menu.ip.hb6f.build.lwip_include=lwip2/include +mercury1.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat +mercury1.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 +mercury1.menu.dbg.Disabled=Disabled +mercury1.menu.dbg.Disabled.build.debug_port= +mercury1.menu.dbg.Serial=Serial +mercury1.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial +mercury1.menu.dbg.Serial1=Serial1 +mercury1.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1 +mercury1.menu.lvl.None____=None +mercury1.menu.lvl.None____.build.debug_level= +mercury1.menu.optim.Smallest=None +mercury1.menu.optim.Smallest.build.debug_optim=-Os +mercury1.menu.optim.Lite=Lite +mercury1.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls +mercury1.menu.optim.Full=Optimum +mercury1.menu.optim.Full.build.debug_optim=-Og +mercury1.menu.lvl.SSL=SSL +mercury1.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL +mercury1.menu.lvl.TLS_MEM=TLS_MEM +mercury1.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM +mercury1.menu.lvl.HTTP_CLIENT=HTTP_CLIENT +mercury1.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT +mercury1.menu.lvl.HTTP_SERVER=HTTP_SERVER +mercury1.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER +mercury1.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM +mercury1.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM +mercury1.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT +mercury1.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT +mercury1.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER +mercury1.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER +mercury1.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT +mercury1.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT +mercury1.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER +mercury1.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER +mercury1.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER +mercury1.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER +mercury1.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT +mercury1.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT +mercury1.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER +mercury1.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER +mercury1.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER +mercury1.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER +mercury1.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER +mercury1.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER +mercury1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER +mercury1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER +mercury1.menu.lvl.CORE=CORE +mercury1.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE +mercury1.menu.lvl.WIFI=WIFI +mercury1.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI +mercury1.menu.lvl.HTTP_UPDATE=HTTP_UPDATE +mercury1.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE +mercury1.menu.lvl.UPDATER=UPDATER +mercury1.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER +mercury1.menu.lvl.OTA=OTA +mercury1.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA +mercury1.menu.lvl.OOM=OOM +mercury1.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM +mercury1.menu.lvl.MDNS=MDNS +mercury1.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS +mercury1.menu.lvl.HWDT=HWDT +mercury1.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT +mercury1.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K +mercury1.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K +mercury1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS +mercury1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS +mercury1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT +mercury1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT +mercury1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K +mercury1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K +mercury1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS +mercury1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS +mercury1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT +mercury1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT +mercury1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K +mercury1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K +mercury1.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG +mercury1.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG +mercury1.menu.wipe.none=Only Sketch +mercury1.menu.wipe.none.upload.erase_cmd= +mercury1.menu.wipe.sdk=Sketch + WiFi Settings +mercury1.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000 +mercury1.menu.wipe.all=All Flash Contents +mercury1.menu.wipe.all.upload.erase_cmd=erase_flash +mercury1.menu.baud.115200=115200 +mercury1.menu.baud.115200.upload.speed=115200 +mercury1.menu.baud.57600=57600 +mercury1.menu.baud.57600.upload.speed=57600 +mercury1.menu.baud.230400.linux=230400 +mercury1.menu.baud.230400.macosx=230400 +mercury1.menu.baud.230400.upload.speed=230400 +mercury1.menu.baud.256000.windows=256000 +mercury1.menu.baud.256000.upload.speed=256000 +mercury1.menu.baud.460800.linux=460800 +mercury1.menu.baud.460800.macosx=460800 +mercury1.menu.baud.460800.upload.speed=460800 +mercury1.menu.baud.512000.windows=512000 +mercury1.menu.baud.512000.upload.speed=512000 +mercury1.menu.baud.921600=921600 +mercury1.menu.baud.921600.upload.speed=921600 +mercury1.menu.baud.3000000=3000000 +mercury1.menu.baud.3000000.upload.speed=3000000 +mercury1.menu.eesz.autoflash=Mapping defined by Hardware and Sketch +mercury1.menu.eesz.autoflash.build.flash_size=16M +mercury1.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld +mercury1.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1 +mercury1.menu.eesz.autoflash.upload.maximum_size=1044464 +mercury1.menu.iramfloat.no=in IROM +mercury1.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM +mercury1.menu.iramfloat.yes=allowed in ISR +mercury1.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM + ############################################################## nodemcu.name=NodeMCU 0.9 (ESP-12 Module) nodemcu.build.board=ESP8266_NODEMCU_ESP12 diff --git a/doc/boards.rst b/doc/boards.rst index 8c0d876e8f..99421d86b9 100644 --- a/doc/boards.rst +++ b/doc/boards.rst @@ -271,6 +271,13 @@ ESPresso Lite 2.0 ESPresso Lite 2.0 is an Arduino-compatible Wi-Fi development board based on an earlier V1 (beta version). Re-designed together with Cytron Technologies, the newly-revised ESPresso Lite V2.0 features the auto-load/auto-program function, eliminating the previous need to reset the board manually before flashing a new program. It also feature two user programmable side buttons and a reset button. The special distinctive features of on-board pads for I2C sensor and actuator is retained. +Mercury 1.0 +----------- + +Based on ESP8266, Mercury is board developed by Ralio Technologies. Board supports on motor drivers and direct-connect feature for various endpoints. + +Product page: https://www.raliotech.com + Phoenix 1.0 ----------- diff --git a/package/package_esp8266com_index.template.json b/package/package_esp8266com_index.template.json index 323db7081f..3c8d1bed39 100644 --- a/package/package_esp8266com_index.template.json +++ b/package/package_esp8266com_index.template.json @@ -47,6 +47,9 @@ { "name": "ESPresso Lite 2.0" }, + { + "name": "Mercury 1.0" + }, { "name": "Phoenix 1.0" }, diff --git a/tools/boards.txt.py b/tools/boards.txt.py index 87a3f2a8eb..0ccfa8f4d9 100755 --- a/tools/boards.txt.py +++ b/tools/boards.txt.py @@ -445,6 +445,23 @@ ], 'desc': [ 'ESPresso Lite 2.0 is an Arduino-compatible Wi-Fi development board based on an earlier V1 (beta version). Re-designed together with Cytron Technologies, the newly-revised ESPresso Lite V2.0 features the auto-load/auto-program function, eliminating the previous need to reset the board manually before flashing a new program. It also feature two user programmable side buttons and a reset button. The special distinctive features of on-board pads for I2C sensor and actuator is retained.', ] }), +( 'mercury1', { + 'name': 'Mercury 1.0', + 'opts': { + '.build.board': 'mercury', + '.build.variant': 'mercury_v1', + }, + 'macro': [ + 'resetmethod_nodemcu', + 'flashmode_dio', + 'flashfreq_40', + '4M', + ], + 'desc': [ 'Based on ESP8266, Mercury is board developed by Ralio Technologies. Board supports on motor drivers and direct-connect feature for various endpoints.', + '', + 'Product page: https://www.raliotech.com', + ], + }), ( 'phoenix_v1', { 'name': 'Phoenix 1.0', 'opts': { diff --git a/variants/mercury_v1/pins_arduino.h b/variants/mercury_v1/pins_arduino.h new file mode 100644 index 0000000000..747afb5913 --- /dev/null +++ b/variants/mercury_v1/pins_arduino.h @@ -0,0 +1,71 @@ +/* + pins_arduino.h - Pin definition functions for Arduino + Part of Arduino - http://www.arduino.cc/ + + Copyright (c) 2007 David A. Mellis + Modified for ESP8266 platform by Ivan Grokhotkov, 2014-2015. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + $Id: wiring.h 249 2007-02-03 16:52:51Z mellis $ +*/ + +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#include "../generic/common.h" + +#define LED_BUILTIN 0 +#define BUILTIN_LED LED_BUILTIN + +#define A0 (17) + +static const uint8_t D0 = 0; +static const uint8_t D1 = 12; +static const uint8_t D2 = 4; +static const uint8_t D3 = 16; +static const uint8_t D4 = 5; +static const uint8_t D5 = 13; +static const uint8_t D6 = 15; +static const uint8_t D7 = 2; +static const uint8_t D8 = 14; +static const uint8_t D9 = 9; +static const uint8_t D10 = 10; + +#define PIN_WIRE_SDA (2) +#define PIN_WIRE_SCL (14) + +// Brushed DC Motors +#define MOTOR_1_DIR (16) +#define MOTOR_1_PWM (12) +#define MOTOR_2_DIR (5) +#define MOTOR_2_PWM (4) + +//Ultrasonic Sensor +static const uint8_t USST = D7; +static const uint8_t USSE = D8; + +//Servo +static const uint8_t SERVO1 = D4; +static const uint8_t SERVO2 = D6; +static const uint8_t SERVO3 = D3; +static const uint8_t SERVO4 = D5; + +//IR +static const uint8_t IR1 = D9; +static const uint8_t IR2 = D10; + +#endif /* Pins_Arduino_h */ From 05f05d0dab2ec77299fbe7769322493e284aeb8d Mon Sep 17 00:00:00 2001 From: Max Prokhorov Date: Wed, 31 Jul 2024 02:00:47 +0300 Subject: [PATCH 25/50] ESP8266HTTPClient - prefer trust anchors to fingerprinting in examples (#9181) --- .../BasicHttpsClient/BasicHttpsClient.ino | 11 +- .../examples/BasicHttpsClient/certs.h | 16 +- .../StreamHttpsClient/StreamHttpsClient.ino | 29 +-- .../examples/StreamHttpsClient/certUpdate | 2 + .../examples/StreamHttpsClient/certs.h | 173 ++++++++++++++++++ 5 files changed, 207 insertions(+), 24 deletions(-) create mode 100755 libraries/ESP8266HTTPClient/examples/StreamHttpsClient/certUpdate create mode 100644 libraries/ESP8266HTTPClient/examples/StreamHttpsClient/certs.h diff --git a/libraries/ESP8266HTTPClient/examples/BasicHttpsClient/BasicHttpsClient.ino b/libraries/ESP8266HTTPClient/examples/BasicHttpsClient/BasicHttpsClient.ino index 62bfc93a9a..0e174c2790 100644 --- a/libraries/ESP8266HTTPClient/examples/BasicHttpsClient/BasicHttpsClient.ino +++ b/libraries/ESP8266HTTPClient/examples/BasicHttpsClient/BasicHttpsClient.ino @@ -39,10 +39,15 @@ void loop() { // wait for WiFi connection if ((WiFiMulti.run() == WL_CONNECTED)) { - std::unique_ptr client(new BearSSL::WiFiClientSecure); + auto certs = std::make_unique(cert_Cloudflare_Inc_ECC_CA_3); + auto client = std::make_unique(); - client->setFingerprint(fingerprint_sni_cloudflaressl_com); - // Or, if you happy to ignore the SSL certificate, then use the following line instead: + client->setTrustAnchors(certs.get()); + // Or, if you prefer to use fingerprinting: + // client->setFingerprint(fingerprint_w3_org); + // This is *not* a recommended option, as fingerprint changes with the host certificate + + // Or, if you are *absolutely* sure it is ok to ignore the SSL certificate: // client->setInsecure(); HTTPClient https; diff --git a/libraries/ESP8266HTTPClient/examples/BasicHttpsClient/certs.h b/libraries/ESP8266HTTPClient/examples/BasicHttpsClient/certs.h index 0263070421..1ba9cff87f 100644 --- a/libraries/ESP8266HTTPClient/examples/BasicHttpsClient/certs.h +++ b/libraries/ESP8266HTTPClient/examples/BasicHttpsClient/certs.h @@ -1,7 +1,7 @@ // this file is autogenerated - any modification will be overwritten // unused symbols will not be linked in the final binary -// generated on 2023-03-20 23:02:42 +// generated on 2024-07-30 22:46:21 // by ['../../../../tools/cert.py', '-s', 'jigsaw.w3.org', '-n', 'jigsaw'] #pragma once @@ -12,14 +12,14 @@ const char* jigsaw_host = "jigsaw.w3.org"; const uint16_t jigsaw_port = 443; -// CN: sni.cloudflaressl.com => name: sni_cloudflaressl_com -// not valid before: 2023-02-14 00:00:00 -// not valid after: 2024-02-14 23:59:59 -const char fingerprint_sni_cloudflaressl_com [] PROGMEM = "70:7c:82:07:f3:58:18:87:25:42:31:83:45:86:bd:17:86:71:4e:1f"; -const char pubkey_sni_cloudflaressl_com [] PROGMEM = R"PUBKEY( +// CN: w3.org => name: w3_org +// not valid before: 2024-01-26 00:00:00 +// not valid after: 2024-12-31 23:59:59 +const char fingerprint_w3_org [] PROGMEM = "07:f2:bd:4c:d0:ce:58:da:13:03:9d:a9:0d:df:e9:5b:60:5f:7f:a5"; +const char pubkey_w3_org [] PROGMEM = R"PUBKEY( -----BEGIN PUBLIC KEY----- -MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/NU/7vfdymScyhfx81ieO8XiwGqq -TU4tjeWzSosWSpmQwnGmRqiU2h2wyT9uYxRme6uQ0yLedf4nz9ks+4OxtA== +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPwx1EbG8lugJ74owfhQChFkoxc9R +EZ9D7g5JfO7TUZH+nxWxCT7njoKgD9yvJZYTy/oijTdhB7o7knUsBLRj8A== -----END PUBLIC KEY----- )PUBKEY"; diff --git a/libraries/ESP8266HTTPClient/examples/StreamHttpsClient/StreamHttpsClient.ino b/libraries/ESP8266HTTPClient/examples/StreamHttpsClient/StreamHttpsClient.ino index 5c80a1eeb8..df3b2f233f 100644 --- a/libraries/ESP8266HTTPClient/examples/StreamHttpsClient/StreamHttpsClient.ino +++ b/libraries/ESP8266HTTPClient/examples/StreamHttpsClient/StreamHttpsClient.ino @@ -1,7 +1,5 @@ /** - StreamHTTPClient.ino - - Created on: 24.05.2015 + Based on StreamHTTPClient.ino */ @@ -9,9 +7,10 @@ #include #include - #include +#include "certs.h" + ESP8266WiFiMulti WiFiMulti; void setup() { @@ -37,23 +36,27 @@ void loop() { // wait for WiFi connection if ((WiFiMulti.run() == WL_CONNECTED)) { - std::unique_ptr client(new BearSSL::WiFiClientSecure); + auto certs = std::make_unique(cert_Amazon_RSA_2048_M02); + auto client = std::make_unique(); + + client->setTrustAnchors(certs.get()); + // Or, if you prefer to use fingerprinting: + // client->setFingerprint(fingerprint___mbed_com); + // This is *not* a recommended option, as fingerprint changes with the host certificate - bool mfln = client->probeMaxFragmentLength("tls.mbed.org", 443, 1024); - Serial.printf("\nConnecting to https://tls.mbed.org\n"); + // Or, if you are *absolutely* sure it is ok to ignore the SSL certificate: + // client->setInsecure(); + + bool mfln = client->probeMaxFragmentLength(mbed_host, mbed_port, 1024); + Serial.printf("\nConnecting to %s:%hu...\n", mbed_host, mbed_port); Serial.printf("Maximum fragment Length negotiation supported: %s\n", mfln ? "yes" : "no"); if (mfln) { client->setBufferSizes(1024, 1024); } Serial.print("[HTTPS] begin...\n"); - // configure server and url - const uint8_t fingerprint[20] = { 0x15, 0x77, 0xdc, 0x04, 0x7c, 0x00, 0xf8, 0x70, 0x09, 0x34, 0x24, 0xf4, 0xd3, 0xa1, 0x7a, 0x6c, 0x1e, 0xa3, 0xe0, 0x2a }; - - client->setFingerprint(fingerprint); - HTTPClient https; - if (https.begin(*client, "https://tls.mbed.org/")) { + if (https.begin(*client, mbed_host, mbed_port)) { Serial.print("[HTTPS] GET...\n"); // start connection and send HTTP header diff --git a/libraries/ESP8266HTTPClient/examples/StreamHttpsClient/certUpdate b/libraries/ESP8266HTTPClient/examples/StreamHttpsClient/certUpdate new file mode 100755 index 0000000000..cb11cef93c --- /dev/null +++ b/libraries/ESP8266HTTPClient/examples/StreamHttpsClient/certUpdate @@ -0,0 +1,2 @@ +cd ${0%/*} 2>/dev/null +python3 ../../../../tools/cert.py -s tls.mbed.org -n mbed > certs.h diff --git a/libraries/ESP8266HTTPClient/examples/StreamHttpsClient/certs.h b/libraries/ESP8266HTTPClient/examples/StreamHttpsClient/certs.h new file mode 100644 index 0000000000..c06f2d2154 --- /dev/null +++ b/libraries/ESP8266HTTPClient/examples/StreamHttpsClient/certs.h @@ -0,0 +1,173 @@ + +// this file is autogenerated - any modification will be overwritten +// unused symbols will not be linked in the final binary +// generated on 2024-07-30 22:46:02 +// by ['../../../../tools/cert.py', '-s', 'tls.mbed.org', '-n', 'mbed'] + +#pragma once + +//////////////////////////////////////////////////////////// +// certificate chain for tls.mbed.org:443 + +const char* mbed_host = "tls.mbed.org"; +const uint16_t mbed_port = 443; + +// CN: *.mbed.com => name: __mbed_com +// not valid before: 2023-12-15 00:00:00 +// not valid after: 2025-01-12 23:59:59 +const char fingerprint___mbed_com [] PROGMEM = "cf:a3:3a:98:de:77:ee:a0:d8:2d:b1:0e:c9:eb:d3:5d:71:5c:4d:1c"; +const char pubkey___mbed_com [] PROGMEM = R"PUBKEY( +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnte0NyyUAM7CJHORnzqZ +0vYhz9K1wdi0Fkc11gypDgyaEXmLY3m0X+mXayEbhw/Xkn04uQ0/6WyK/pWTeTeu +MPKD1Gr5xjBNELs0GLdRdfZGhUyFkTgQLtDrbEpD8gNO2bfVOiJh/tMZ43NNmJUj +lJftSW3ZivBO5621NC9gbfqAQJZNkMoSV1c9JNIPzZCv4aPR/XuZVeKNWQKzAULf +wRsfz5Ti37EWUQ2BNPUOIYQQvOqI0y4FETIUmA4UhjUmb3/KsOTIUx0HML0MYkxe +SCfSzO8zjJaFujrC82LQvwFfIfRbGCK63GREzT4B5SGUgIgOGe1NSfEBqioRNtig +SwIDAQAB +-----END PUBLIC KEY----- +)PUBKEY"; + +// http://crt.r2m02.amazontrust.com/r2m02.cer +// CN: Amazon RSA 2048 M02 => name: Amazon_RSA_2048_M02 +// not valid before: 2022-08-23 22:25:30 +// not valid after: 2030-08-23 22:25:30 +const char cert_Amazon_RSA_2048_M02 [] PROGMEM = R"CERT( +-----BEGIN CERTIFICATE----- +MIIEXjCCA0agAwIBAgITB3MSSkvL1E7HtTvq8ZSELToPoTANBgkqhkiG9w0BAQsF +ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6 +b24gUm9vdCBDQSAxMB4XDTIyMDgyMzIyMjUzMFoXDTMwMDgyMzIyMjUzMFowPDEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEcMBoGA1UEAxMTQW1hem9uIFJT +QSAyMDQ4IE0wMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALtDGMZa +qHneKei1by6+pUPPLljTB143Si6VpEWPc6mSkFhZb/6qrkZyoHlQLbDYnI2D7hD0 +sdzEqfnuAjIsuXQLG3A8TvX6V3oFNBFVe8NlLJHvBseKY88saLwufxkZVwk74g4n +WlNMXzla9Y5F3wwRHwMVH443xGz6UtGSZSqQ94eFx5X7Tlqt8whi8qCaKdZ5rNak ++r9nUThOeClqFd4oXych//Rc7Y0eX1KNWHYSI1Nk31mYgiK3JvH063g+K9tHA63Z +eTgKgndlh+WI+zv7i44HepRZjA1FYwYZ9Vv/9UkC5Yz8/yU65fgjaE+wVHM4e/Yy +C2osrPWE7gJ+dXMCAwEAAaOCAVowggFWMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYD +VR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAdBgNV +HQ4EFgQUwDFSzVpQw4J8dHHOy+mc+XrrguIwHwYDVR0jBBgwFoAUhBjMhTTsvAyU +lC4IWZzHshBOCggwewYIKwYBBQUHAQEEbzBtMC8GCCsGAQUFBzABhiNodHRwOi8v +b2NzcC5yb290Y2ExLmFtYXpvbnRydXN0LmNvbTA6BggrBgEFBQcwAoYuaHR0cDov +L2NydC5yb290Y2ExLmFtYXpvbnRydXN0LmNvbS9yb290Y2ExLmNlcjA/BgNVHR8E +ODA2MDSgMqAwhi5odHRwOi8vY3JsLnJvb3RjYTEuYW1hem9udHJ1c3QuY29tL3Jv +b3RjYTEuY3JsMBMGA1UdIAQMMAowCAYGZ4EMAQIBMA0GCSqGSIb3DQEBCwUAA4IB +AQAtTi6Fs0Azfi+iwm7jrz+CSxHH+uHl7Law3MQSXVtR8RV53PtR6r/6gNpqlzdo +Zq4FKbADi1v9Bun8RY8D51uedRfjsbeodizeBB8nXmeyD33Ep7VATj4ozcd31YFV +fgRhvTSxNrrTlNpWkUk0m3BMPv8sg381HhA6uEYokE5q9uws/3YkKqRiEz3TsaWm +JqIRZhMbgAfp7O7FUwFIb7UIspogZSKxPIWJpxiPo3TcBambbVtQOcNRWz5qCQdD +slI2yayq0n2TXoHyNCLEH8rpsJRVILFsg0jc7BaFrMnF462+ajSehgj12IidNeRN +4zl+EoNaWdpnWndvSpAEkq2P +-----END CERTIFICATE----- +)CERT"; + +// http://crt.rootca1.amazontrust.com/rootca1.cer +// CN: Amazon Root CA 1 => name: Amazon_Root_CA_1 +// not valid before: 2015-05-25 12:00:00 +// not valid after: 2037-12-31 01:00:00 +const char cert_Amazon_Root_CA_1 [] PROGMEM = R"CERT( +-----BEGIN CERTIFICATE----- +MIIEkjCCA3qgAwIBAgITBn+USionzfP6wq4rAfkI7rnExjANBgkqhkiG9w0BAQsF +ADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNj +b3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4x +OzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1 +dGhvcml0eSAtIEcyMB4XDTE1MDUyNTEyMDAwMFoXDTM3MTIzMTAxMDAwMFowOTEL +MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv +b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj +ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM +9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw +IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6 +VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L +93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm +jgSubJrIqg0CAwEAAaOCATEwggEtMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgGGMB0GA1UdDgQWBBSEGMyFNOy8DJSULghZnMeyEE4KCDAfBgNVHSMEGDAW +gBScXwDfqgHXMCs4iKK4bUqc8hGRgzB4BggrBgEFBQcBAQRsMGowLgYIKwYBBQUH +MAGGImh0dHA6Ly9vY3NwLnJvb3RnMi5hbWF6b250cnVzdC5jb20wOAYIKwYBBQUH +MAKGLGh0dHA6Ly9jcnQucm9vdGcyLmFtYXpvbnRydXN0LmNvbS9yb290ZzIuY2Vy +MD0GA1UdHwQ2MDQwMqAwoC6GLGh0dHA6Ly9jcmwucm9vdGcyLmFtYXpvbnRydXN0 +LmNvbS9yb290ZzIuY3JsMBEGA1UdIAQKMAgwBgYEVR0gADANBgkqhkiG9w0BAQsF +AAOCAQEAYjdCXLwQtT6LLOkMm2xF4gcAevnFWAu5CIw+7bMlPLVvUOTNNWqnkzSW +MiGpSESrnO09tKpzbeR/FoCJbM8oAxiDR3mjEH4wW6w7sGDgd9QIpuEdfF7Au/ma +eyKdpwAJfqxGF4PcnCZXmTA5YpaP7dreqsXMGz7KQ2hsVxa81Q4gLv7/wmpdLqBK +bRRYh5TmOTFffHPLkIhqhBGWJ6bt2YFGpn6jcgAKUj6DiAdjd4lpFw85hdKrCEVN +0FE6/V1dN2RMfjCyVSRCnTawXZwXgWHxyvkQAiSr6w10kY17RSlQOYiypok1JR4U +akcjMS9cmvqtmg5iUaQqqcT5NJ0hGA== +-----END CERTIFICATE----- +)CERT"; + +// http://crt.rootg2.amazontrust.com/rootg2.cer +// CN: Starfield Services Root Certificate Authority - G2 => name: Starfield_Services_Root_Certificate_Authority___G2 +// not valid before: 2009-09-02 00:00:00 +// not valid after: 2034-06-28 17:39:16 +const char cert_Starfield_Services_Root_Certificate_Authority___G2 [] PROGMEM = R"CERT( +-----BEGIN CERTIFICATE----- +MIIEdTCCA12gAwIBAgIJAKcOSkw0grd/MA0GCSqGSIb3DQEBCwUAMGgxCzAJBgNV +BAYTAlVTMSUwIwYDVQQKExxTdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTIw +MAYDVQQLEylTdGFyZmllbGQgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eTAeFw0wOTA5MDIwMDAwMDBaFw0zNDA2MjgxNzM5MTZaMIGYMQswCQYDVQQGEwJV +UzEQMA4GA1UECBMHQXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTElMCMGA1UE +ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjE7MDkGA1UEAxMyU3RhcmZp +ZWxkIFNlcnZpY2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVDDrEKvlO4vW+GZdfjohTsR8/ +y8+fIBNtKTrID30892t2OGPZNmCom15cAICyL1l/9of5JUOG52kbUpqQ4XHj2C0N +Tm/2yEnZtvMaVq4rtnQU68/7JuMauh2WLmo7WJSJR1b/JaCTcFOD2oR0FMNnngRo +Ot+OQFodSk7PQ5E751bWAHDLUu57fa4657wx+UX2wmDPE1kCK4DMNEffud6QZW0C +zyyRpqbn3oUYSXxmTqM6bam17jQuug0DuDPfR+uxa40l2ZvOgdFFRjKWcIfeAg5J +Q4W2bHO7ZOphQazJ1FTfhy/HIrImzJ9ZVGif/L4qL8RVHHVAYBeFAlU5i38FAgMB +AAGjgfAwge0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0O +BBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMB8GA1UdIwQYMBaAFL9ft9HO3R+G9FtV +rNzXEMIOqYjnME8GCCsGAQUFBwEBBEMwQTAcBggrBgEFBQcwAYYQaHR0cDovL28u +c3MyLnVzLzAhBggrBgEFBQcwAoYVaHR0cDovL3guc3MyLnVzL3guY2VyMCYGA1Ud +HwQfMB0wG6AZoBeGFWh0dHA6Ly9zLnNzMi51cy9yLmNybDARBgNVHSAECjAIMAYG +BFUdIAAwDQYJKoZIhvcNAQELBQADggEBACMd44pXyn3pF3lM8R5V/cxTbj5HD9/G +VfKyBDbtgB9TxF00KGu+x1X8Z+rLP3+QsjPNG1gQggL4+C/1E2DUBc7xgQjB3ad1 +l08YuW3e95ORCLp+QCztweq7dp4zBncdDQh/U90bZKuCJ/Fp1U1ervShw3WnWEQt +8jxwmKy6abaVd38PMV4s/KCHOkdp8Hlf9BRUpJVeEXgSYCfOn8J3/yNTd126/+pZ +59vPr5KW7ySaNRB6nJHGDn2Z9j8Z3/VyVOEVqQdZe4O/Ui5GjLIAZHYcSNPYeehu +VsyuLAOQ1xk4meTKCRlb/weWsKh/NEnfVqn3sF/tM+2MR7cwA130A4w= +-----END CERTIFICATE----- +)CERT"; + +// http://x.ss2.us/x.cer +// CN: => name: +// not valid before: 2004-06-29 17:39:16 +// not valid after: 2024-06-29 17:39:16 +const char cert_ [] PROGMEM = R"CERT( +-----BEGIN CERTIFICATE----- +MIIFEjCCBHugAwIBAgICAQwwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1Zh +bGlDZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu +Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24g +QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAe +BgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTA0MDYyOTE3MzkxNloX +DTI0MDYyOTE3MzkxNlowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVs +ZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAy +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0A +MIIBCAKCAQEAtzLI/ulxpgSFrQwRZN/OTe/IAxiHP6Gr+zymn/DDodrU2G4rU5D7 +JKQ+hPCe6F/s5SdE9SimP3ve4CrwyK9TL57KBQGTHo9mHDmnTfpatnMEJWbrd3/n +WcZKmSUUVOsmx/N/GdUwcI+vsEYq/63rKe3Xn6oEh6PU+YmlNF/bQ5GCNtlmPLG4 +uYL9nDo+EMg77wZlZnqbGRg9/3FRPDAuX749d3OyXQZswyNWmiuFJpIcpwKz5D8N +rwh5grg2Peqc0zWzvGnK9cyd6P1kjReAM25eSl2ZyR6HtJ0awNVuEzUjXt+bXz3v +1vd2wuo+u3gNHEJnawTY+Nbab4vyRKABqwIBA6OCAfMwggHvMB0GA1UdDgQWBBS/ +X7fRzt0fhvRbVazc1xDCDqmI5zCB0gYDVR0jBIHKMIHHoYHBpIG+MIG7MSQwIgYD +VQQHExtWYWxpQ2VydCBWYWxpZGF0aW9uIE5ldHdvcmsxFzAVBgNVBAoTDlZhbGlD +ZXJ0LCBJbmMuMTUwMwYDVQQLEyxWYWxpQ2VydCBDbGFzcyAyIFBvbGljeSBWYWxp +ZGF0aW9uIEF1dGhvcml0eTEhMB8GA1UEAxMYaHR0cDovL3d3dy52YWxpY2VydC5j +b20vMSAwHgYJKoZIhvcNAQkBFhFpbmZvQHZhbGljZXJ0LmNvbYIBATAPBgNVHRMB +Af8EBTADAQH/MDkGCCsGAQUFBwEBBC0wKzApBggrBgEFBQcwAYYdaHR0cDovL29j +c3Auc3RhcmZpZWxkdGVjaC5jb20wSgYDVR0fBEMwQTA/oD2gO4Y5aHR0cDovL2Nl +cnRpZmljYXRlcy5zdGFyZmllbGR0ZWNoLmNvbS9yZXBvc2l0b3J5L3Jvb3QuY3Js +MFEGA1UdIARKMEgwRgYEVR0gADA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY2VydGlm +aWNhdGVzLnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkwDgYDVR0PAQH/BAQD +AgEGMA0GCSqGSIb3DQEBBQUAA4GBAKVi8afCXSWlcD284ipxs33kDTcdVWptobCr +mADkhWBKIMuh8D1195TaQ39oXCUIuNJ9MxB73HZn8bjhU3zhxoNbKXuNSm8uf0So +GkVrMgfHeMpkksK0hAzc3S1fTbvdiuo43NlmouxBulVtWmQ9twPMHOKRUJ7jCUSV +FxdzPcwl +-----END CERTIFICATE----- +)CERT"; + + + + +// end of certificate chain for tls.mbed.org:443 +//////////////////////////////////////////////////////////// + From 3a5157e3ba4f2581302ce74649f3bfd9d19b2791 Mon Sep 17 00:00:00 2001 From: Max Prokhorov Date: Wed, 31 Jul 2024 02:24:41 +0300 Subject: [PATCH 26/50] Mock - update func signatures for latest glibc (#9117) glibc 2.38 includes strlcpy and strlcat, attempt to detect them before use --- cores/esp8266/core_esp8266_noniso.cpp | 15 +--- cores/esp8266/stdlib_noniso.cpp | 16 +++- cores/esp8266/stdlib_noniso.h | 35 ++++---- tests/host/Makefile | 26 ++++++ tests/host/common/mock.h | 15 ++-- tests/host/common/noniso.c | 22 +---- tests/host/common/strl.cpp | 118 ++++++++++++-------------- tools/sdk/include/ets_sys.h | 1 - 8 files changed, 129 insertions(+), 119 deletions(-) diff --git a/cores/esp8266/core_esp8266_noniso.cpp b/cores/esp8266/core_esp8266_noniso.cpp index f15fdc0860..fb5d8f573a 100644 --- a/cores/esp8266/core_esp8266_noniso.cpp +++ b/cores/esp8266/core_esp8266_noniso.cpp @@ -28,19 +28,12 @@ #include #include #include + #include "stdlib_noniso.h" extern "C" { -char* ltoa(long value, char* result, int base) { - return itoa((int)value, result, base); -} - -char* ultoa(unsigned long value, char* result, int base) { - return utoa((unsigned int)value, result, base); -} - -char * dtostrf(double number, signed char width, unsigned char prec, char *s) { +char* dtostrf(double number, signed char width, unsigned char prec, char *s) noexcept { bool negative = false; if (isnan(number)) { @@ -125,7 +118,7 @@ char * dtostrf(double number, signed char width, unsigned char prec, char *s) { */ const char* strrstr(const char*__restrict p_pcString, - const char*__restrict p_pcPattern) + const char*__restrict p_pcPattern) noexcept { const char* pcResult = 0; @@ -149,4 +142,4 @@ const char* strrstr(const char*__restrict p_pcString, return pcResult; } -}; +} // extern "C" diff --git a/cores/esp8266/stdlib_noniso.cpp b/cores/esp8266/stdlib_noniso.cpp index 693dfda850..4fed9b615d 100644 --- a/cores/esp8266/stdlib_noniso.cpp +++ b/cores/esp8266/stdlib_noniso.cpp @@ -21,11 +21,13 @@ #include "stdlib_noniso.h" +extern "C" { + // ulltoa() is slower than std::to_char() (1.6 times) // but is smaller by ~800B/flash and ~250B/rodata // ulltoa fills str backwards and can return a pointer different from str -char* ulltoa(unsigned long long val, char* str, int slen, unsigned int radix) +char* ulltoa(unsigned long long val, char* str, int slen, unsigned int radix) noexcept { str += --slen; *str = 0; @@ -39,7 +41,7 @@ char* ulltoa(unsigned long long val, char* str, int slen, unsigned int radix) } // lltoa fills str backwards and can return a pointer different from str -char* lltoa (long long val, char* str, int slen, unsigned int radix) +char* lltoa(long long val, char* str, int slen, unsigned int radix) noexcept { bool neg; if (val < 0) @@ -60,3 +62,13 @@ char* lltoa (long long val, char* str, int slen, unsigned int radix) } return ret; } + +char* ltoa(long value, char* result, int base) noexcept { + return itoa((int)value, result, base); +} + +char* ultoa(unsigned long value, char* result, int base) noexcept { + return utoa((unsigned int)value, result, base); +} + +} // extern "C" diff --git a/cores/esp8266/stdlib_noniso.h b/cores/esp8266/stdlib_noniso.h index f86f78befc..0c8c488ed1 100644 --- a/cores/esp8266/stdlib_noniso.h +++ b/cores/esp8266/stdlib_noniso.h @@ -22,38 +22,35 @@ #ifndef STDLIB_NONISO_H #define STDLIB_NONISO_H +#include + #ifdef __cplusplus -extern "C"{ +extern "C" { #endif -int atoi(const char *s); - -long atol(const char* s); - -double atof(const char* s); - -char* itoa (int val, char *s, int radix); - -char* ltoa (long val, char *s, int radix); +#ifdef __cplusplus +#define __STDLIB_NONISO_NOEXCEPT noexcept +#else +#define __STDLIB_NONISO_NOEXCEPT +#endif -char* lltoa (long long val, char* str, int slen, unsigned int radix); +char* ltoa (long val, char *s, int radix) __STDLIB_NONISO_NOEXCEPT; -char* utoa (unsigned int val, char *s, int radix); +char* lltoa (long long val, char* str, int slen, unsigned int radix) __STDLIB_NONISO_NOEXCEPT; -char* ultoa (unsigned long val, char *s, int radix); +char* ultoa (unsigned long val, char *s, int radix) __STDLIB_NONISO_NOEXCEPT; -char* ulltoa (unsigned long long val, char* str, int slen, unsigned int radix); +char* ulltoa (unsigned long long val, char* str, int slen, unsigned int radix) __STDLIB_NONISO_NOEXCEPT; -char* dtostrf (double val, signed char width, unsigned char prec, char *s); +char* dtostrf (double val, signed char width, unsigned char prec, char *s) __STDLIB_NONISO_NOEXCEPT; -void reverse(char* begin, char* end); +const char* strrstr (const char*__restrict p_pcString, + const char*__restrict p_pcPattern) __STDLIB_NONISO_NOEXCEPT; -const char* strrstr(const char*__restrict p_pcString, - const char*__restrict p_pcPattern); +#undef __STDLIB_NONISO_NOEXCEPT #ifdef __cplusplus } // extern "C" #endif - #endif diff --git a/tests/host/Makefile b/tests/host/Makefile index f819047891..7308b10e60 100644 --- a/tests/host/Makefile +++ b/tests/host/Makefile @@ -30,6 +30,7 @@ GENHTML ?= genhtml CXXFLAGS += -std=gnu++17 CFLAGS += -std=gnu17 +# 32-bit mode is prefered, but not required ifeq ($(FORCE32),1) SIZEOFLONG = $(shell echo 'int main(){return sizeof(long);}'|$(CXX) -m32 -x c++ - -o sizeoflong 2>/dev/null && ./sizeoflong; echo $$?; rm -f sizeoflong;) ifneq ($(SIZEOFLONG),4) @@ -50,6 +51,7 @@ endif OUTPUT_BINARY := $(BINDIR)/host_tests LCOV_DIRECTORY := $(BINDIR)/../lcov +# Hide full build commands by default ifeq ($(V), 0) VERBC = @echo "C $@"; VERBCXX = @echo "C++ $@"; @@ -66,6 +68,30 @@ endif $(shell mkdir -p $(BINDIR)) +# Core files sometimes override libc functions, check when necessary to hide them +# TODO proper configure script / other build system? +ifeq (,$(wildcard $(BINDIR)/.have_strlcpy)) +$(shell echo -e '#include \nint main(){char a[4]{}; char b[4]{}; strlcpy(&a[0], &b[0], sizeof(a)); return 0;}' | \ + $(CXX) -x c++ - -o $(BINDIR)/.have_strlcpy 2>/dev/null || ( echo -e '#!/bin/sh\nexit 1' > $(BINDIR)/.have_strlcpy ; chmod +x $(BINDIR)/.have_strlcpy; )) +endif + +$(shell $(BINDIR)/.have_strlcpy) +ifneq ($(.SHELLSTATUS), 0) +FLAGS += -DSTRLCPY_MISSING +endif + +ifeq (,$(wildcard $(BINDIR)/.have_strlcat)) +$(shell echo -e '#include \nint main(){char a[4]{}; strlcat(&a[0], "test", sizeof(a)); return 0;}' | \ + $(CXX) -x c++ - -o $(BINDIR)/.have_strlcat 2>/dev/null || ( echo -e '#!/bin/sh\nexit 1' > $(BINDIR)/.have_strlcat ; chmod +x $(BINDIR)/.have_strlcat; )) +endif + +$(shell $(BINDIR)/.have_strlcat) +ifneq ($(.SHELLSTATUS), 0) +FLAGS += -DSTRLCAT_MISSING +endif + +# Actual build recipes + CORE_CPP_FILES := \ $(addprefix $(abspath $(CORE_PATH))/,\ debug.cpp \ diff --git a/tests/host/common/mock.h b/tests/host/common/mock.h index b3308282f0..344ce6b10c 100644 --- a/tests/host/common/mock.h +++ b/tests/host/common/mock.h @@ -56,18 +56,23 @@ #define D8 8 #include +#include +#include + +#include #ifdef __cplusplus extern "C" { #endif - // TODO: #include ? - char* itoa(int val, char* s, int radix); - char* ltoa(long val, char* s, int radix); - + char* utoa(unsigned value, char* result, int base); + char* itoa(int value, char* result, int base); +#ifdef STRLCAT_MISSING size_t strlcat(char* dst, const char* src, size_t size); +#endif +#ifdef STRLCPY_MISSING size_t strlcpy(char* dst, const char* src, size_t size); - +#endif #ifdef __cplusplus } #endif diff --git a/tests/host/common/noniso.c b/tests/host/common/noniso.c index 5c4e14b306..20fd3d1d5a 100644 --- a/tests/host/common/noniso.c +++ b/tests/host/common/noniso.c @@ -18,9 +18,10 @@ #include #include #include -#include "stdlib_noniso.h" -void reverse(char* begin, char* end) +#include + +static void reverse(char* begin, char* end) { char* is = begin; char* ie = end - 1; @@ -84,20 +85,3 @@ char* itoa(int value, char* result, int base) utoa(uvalue, result, base); return out; } - -int atoi(const char* s) -{ - return (int)atol(s); -} - -long atol(const char* s) -{ - char* tmp; - return strtol(s, &tmp, 10); -} - -double atof(const char* s) -{ - char* tmp; - return strtod(s, &tmp); -} diff --git a/tests/host/common/strl.cpp b/tests/host/common/strl.cpp index 0b0725b046..b01f6652a8 100644 --- a/tests/host/common/strl.cpp +++ b/tests/host/common/strl.cpp @@ -1,84 +1,78 @@ // https://gist.github.com/Fonger/98cc95ac39fbe1a7e4d9 -#ifndef HAVE_STRLCAT -/* - '_cups_strlcat()' - Safely concatenate two strings. -*/ - -size_t /* O - Length of string */ -strlcat(char* dst, /* O - Destination string */ - const char* src, /* I - Source string */ - size_t size) /* I - Size of destination string buffer */ +#include +#include +#include + +extern "C" { - size_t srclen; /* Length of source string */ - size_t dstlen; /* Length of destination string */ +#ifdef STRLCAT_MISSING + // '_cups_strlcat()' - Safely concatenate two strings. - /* - Figure out how much room is left... - */ + size_t /* O - Length of string */ + strlcat(char* dst, /* O - Destination string */ + const char* src, /* I - Source string */ + size_t size) /* I - Size of destination string buffer */ + { + size_t srclen; /* Length of source string */ + size_t dstlen; /* Length of destination string */ - dstlen = strlen(dst); - size -= dstlen + 1; + // Figure out how much room is left... - if (!size) - { - return (dstlen); /* No room, return immediately... */ - } + dstlen = strlen(dst); + size -= dstlen + 1; - /* - Figure out how much room is needed... - */ + if (!size) + { + return (dstlen); /* No room, return immediately... */ + } - srclen = strlen(src); + // Figure out how much room is needed... - /* - Copy the appropriate amount... - */ + srclen = strlen(src); - if (srclen > size) - { - srclen = size; + // Copy the appropriate amount... + + if (srclen > size) + { + srclen = size; + } + + memcpy(dst + dstlen, src, srclen); + dst[dstlen + srclen] = '\0'; + + return (dstlen + srclen); } +#endif /* STRLCAT_MISSING */ - memcpy(dst + dstlen, src, srclen); - dst[dstlen + srclen] = '\0'; +#ifdef STRLCPY_MISSING + // '_cups_strlcpy()' - Safely copy two strings. - return (dstlen + srclen); -} -#endif /* !HAVE_STRLCAT */ + size_t /* O - Length of string */ + strlcpy(char* dst, /* O - Destination string */ + const char* src, /* I - Source string */ + size_t size) /* I - Size of destination string buffer */ + { + size_t srclen; /* Length of source string */ -#ifndef HAVE_STRLCPY -/* - '_cups_strlcpy()' - Safely copy two strings. -*/ + // Figure out how much room is needed... -size_t /* O - Length of string */ -strlcpy(char* dst, /* O - Destination string */ - const char* src, /* I - Source string */ - size_t size) /* I - Size of destination string buffer */ -{ - size_t srclen; /* Length of source string */ + size--; - /* - Figure out how much room is needed... - */ + srclen = strlen(src); - size--; + // Copy the appropriate amount... - srclen = strlen(src); + if (srclen > size) + { + srclen = size; + } - /* - Copy the appropriate amount... - */ + memcpy(dst, src, srclen); + dst[srclen] = '\0'; - if (srclen > size) - { - srclen = size; + return (srclen); } +#endif /* STRLCPY_MISSING */ - memcpy(dst, src, srclen); - dst[srclen] = '\0'; - - return (srclen); -} -#endif /* !HAVE_STRLCPY */ +} // extern "C" diff --git a/tools/sdk/include/ets_sys.h b/tools/sdk/include/ets_sys.h index 7908f127c3..a199469e0d 100644 --- a/tools/sdk/include/ets_sys.h +++ b/tools/sdk/include/ets_sys.h @@ -208,7 +208,6 @@ void *ets_memset(void *s, int c, size_t n); void ets_timer_arm_new(ETSTimer *a, int b, int c, int isMstimer); void ets_timer_setfn(ETSTimer *t, ETSTimerFunc *fn, void *parg); void ets_timer_disarm(ETSTimer *a); -int atoi(const char *nptr); int ets_strncmp(const char *s1, const char *s2, int len); int ets_strcmp(const char *s1, const char *s2); int ets_strlen(const char *s); From 1d6e50f7d0f2def64ed61867dd4337448ca1e7f5 Mon Sep 17 00:00:00 2001 From: Max Prokhorov Date: Wed, 31 Jul 2024 03:07:18 +0300 Subject: [PATCH 27/50] Mock - compatibility fix for shell calls (#9183) echo does not seem to have escape mode with GH actions runner trying to fix apparently broken makefile funcs from #9117 --- tests/host/Makefile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/host/Makefile b/tests/host/Makefile index 7308b10e60..97a4c671fb 100644 --- a/tests/host/Makefile +++ b/tests/host/Makefile @@ -71,8 +71,8 @@ $(shell mkdir -p $(BINDIR)) # Core files sometimes override libc functions, check when necessary to hide them # TODO proper configure script / other build system? ifeq (,$(wildcard $(BINDIR)/.have_strlcpy)) -$(shell echo -e '#include \nint main(){char a[4]{}; char b[4]{}; strlcpy(&a[0], &b[0], sizeof(a)); return 0;}' | \ - $(CXX) -x c++ - -o $(BINDIR)/.have_strlcpy 2>/dev/null || ( echo -e '#!/bin/sh\nexit 1' > $(BINDIR)/.have_strlcpy ; chmod +x $(BINDIR)/.have_strlcpy; )) +$(shell printf '#include \nint main(){char a[4]{}; char b[4]{}; strlcpy(&a[0], &b[0], sizeof(a)); return 0;}\n' | \ + $(CXX) -x c++ - -o $(BINDIR)/.have_strlcpy 2>/dev/null || ( printf '#!/bin/sh\nexit 1\n' > $(BINDIR)/.have_strlcpy ; chmod +x $(BINDIR)/.have_strlcpy; )) endif $(shell $(BINDIR)/.have_strlcpy) @@ -81,8 +81,8 @@ FLAGS += -DSTRLCPY_MISSING endif ifeq (,$(wildcard $(BINDIR)/.have_strlcat)) -$(shell echo -e '#include \nint main(){char a[4]{}; strlcat(&a[0], "test", sizeof(a)); return 0;}' | \ - $(CXX) -x c++ - -o $(BINDIR)/.have_strlcat 2>/dev/null || ( echo -e '#!/bin/sh\nexit 1' > $(BINDIR)/.have_strlcat ; chmod +x $(BINDIR)/.have_strlcat; )) +$(shell printf '#include \nint main(){char a[4]{}; strlcat(&a[0], "test", sizeof(a)); return 0;}\n' | \ + $(CXX) -x c++ - -o $(BINDIR)/.have_strlcat 2>/dev/null || ( printf '#!/bin/sh\nexit 1\n' > $(BINDIR)/.have_strlcat ; chmod +x $(BINDIR)/.have_strlcat; )) endif $(shell $(BINDIR)/.have_strlcat) From 07feacec4675430a7c0c1f2d1dffc632d4132ec9 Mon Sep 17 00:00:00 2001 From: Max Prokhorov Date: Wed, 31 Jul 2024 03:58:18 +0300 Subject: [PATCH 28/50] Update certs.h (#9182) * Update certs.h not_valid_{after,before} -> not_valid_{after,before}_utc https://cryptography.io/en/latest/x509/reference/#cryptography.x509.Certificate.not_valid_before > This property is deprecated and will be removed in a future version. Please switch to the timezone-aware variant not_valid_before_utc(). * fixup! Update certs.h --- .../examples/BasicHttpsClient/certs.h | 8 +- .../BearSSL_Validation/BearSSL_Validation.ino | 2 +- .../examples/BearSSL_Validation/certs.h | 128 +++++++++--------- .../examples/HTTPSRequest/HTTPSRequest.ino | 5 +- .../ESP8266WiFi/examples/HTTPSRequest/certs.h | 115 ++++++++-------- tools/cert.py | 6 +- 6 files changed, 132 insertions(+), 132 deletions(-) diff --git a/libraries/ESP8266HTTPClient/examples/BasicHttpsClient/certs.h b/libraries/ESP8266HTTPClient/examples/BasicHttpsClient/certs.h index 1ba9cff87f..76451ff76a 100644 --- a/libraries/ESP8266HTTPClient/examples/BasicHttpsClient/certs.h +++ b/libraries/ESP8266HTTPClient/examples/BasicHttpsClient/certs.h @@ -13,8 +13,8 @@ const char* jigsaw_host = "jigsaw.w3.org"; const uint16_t jigsaw_port = 443; // CN: w3.org => name: w3_org -// not valid before: 2024-01-26 00:00:00 -// not valid after: 2024-12-31 23:59:59 +// not valid before: 2024-01-26 00:00:00+00:00 +// not valid after: 2024-12-31 23:59:59+00:00 const char fingerprint_w3_org [] PROGMEM = "07:f2:bd:4c:d0:ce:58:da:13:03:9d:a9:0d:df:e9:5b:60:5f:7f:a5"; const char pubkey_w3_org [] PROGMEM = R"PUBKEY( -----BEGIN PUBLIC KEY----- @@ -25,8 +25,8 @@ EZ9D7g5JfO7TUZH+nxWxCT7njoKgD9yvJZYTy/oijTdhB7o7knUsBLRj8A== // http://cacerts.digicert.com/CloudflareIncECCCA-3.crt // CN: Cloudflare Inc ECC CA-3 => name: Cloudflare_Inc_ECC_CA_3 -// not valid before: 2020-01-27 12:48:08 -// not valid after: 2024-12-31 23:59:59 +// not valid before: 2020-01-27 12:48:08+00:00 +// not valid after: 2024-12-31 23:59:59+00:00 const char cert_Cloudflare_Inc_ECC_CA_3 [] PROGMEM = R"CERT( -----BEGIN CERTIFICATE----- MIIDzTCCArWgAwIBAgIQCjeHZF5ftIwiTv0b7RQMPDANBgkqhkiG9w0BAQsFADBa diff --git a/libraries/ESP8266WiFi/examples/BearSSL_Validation/BearSSL_Validation.ino b/libraries/ESP8266WiFi/examples/BearSSL_Validation/BearSSL_Validation.ino index cc76e5d24e..2f6c08a51a 100644 --- a/libraries/ESP8266WiFi/examples/BearSSL_Validation/BearSSL_Validation.ino +++ b/libraries/ESP8266WiFi/examples/BearSSL_Validation/BearSSL_Validation.ino @@ -12,7 +12,7 @@ #define FINGERPRINT fingerprint_www_example_org #define PUBKEY pubkey_www_example_org -#define CERT cert_DigiCert_TLS_RSA_SHA256_2020_CA1 +#define CERT cert_DigiCert_Global_G2_TLS_RSA_SHA256_2020_CA1 #ifndef STASSID #define STASSID "your-ssid" diff --git a/libraries/ESP8266WiFi/examples/BearSSL_Validation/certs.h b/libraries/ESP8266WiFi/examples/BearSSL_Validation/certs.h index 74f244c4eb..c6b99041a4 100644 --- a/libraries/ESP8266WiFi/examples/BearSSL_Validation/certs.h +++ b/libraries/ESP8266WiFi/examples/BearSSL_Validation/certs.h @@ -1,7 +1,7 @@ // this file is autogenerated - any modification will be overwritten // unused symbols will not be linked in the final binary -// generated on 2023-03-20 23:02:42 +// generated on 2024-07-30 23:28:11 // by ['../../../../tools/cert.py', '-s', 'www.example.com', '-n', 'SSL'] #pragma once @@ -13,82 +13,82 @@ const char* SSL_host = "www.example.com"; const uint16_t SSL_port = 443; // CN: www.example.org => name: www_example_org -// not valid before: 2023-01-13 00:00:00 -// not valid after: 2024-02-13 23:59:59 -const char fingerprint_www_example_org [] PROGMEM = "f2:aa:d7:3d:32:68:3b:71:6d:2a:7d:61:b5:1c:6d:57:64:ab:38:99"; +// not valid before: 2024-01-30 00:00:00+00:00 +// not valid after: 2025-03-01 23:59:59+00:00 +const char fingerprint_www_example_org [] PROGMEM = "4d:a2:5a:6d:5e:f6:2c:5f:95:c7:bd:0a:73:ea:3c:17:7b:36:99:9d"; const char pubkey_www_example_org [] PROGMEM = R"PUBKEY( -----BEGIN PUBLIC KEY----- -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwoB3iVm4RW+6StkR+nut -x1fQevu2+t0Fu6KBcbvhfyHSXy7w0nJOdTT4jWLjStpRkNQBPZwMwHH35i+21gdn -JtDe/xfO8IX9McFmyodlBUcqX8CruIzDv9AXf2OjXPBG+4aq+03XKl5/muATl32+ -+301Vw1dXoGYNeoWQqLTsHT3WS3tOOf+ehuzNuZ+rj+ephaD3lMBToEArrtC9R91 -KTTN6YSAOK48NxTA8CfOMFK5itxfIqB5+E9OSQTidXyqLyoeA+xxTKMqYfxvypEe -k1oueAhY9u67NCBdmuavxtfyvwp7+o6Sd+NsewxAhmRKFexw13KOYzDhC+9aMJcu -JQIDAQAB +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhoUPuw75yl/Z9eAKMiwz +2aoOBymoLwiteL3CBr/3LSumpyc9U6ZMw0uyJ3cg1sFUSbgI2vlwqWH2skmdaVfa ++20kNHIuR/AEP52xW+K8ZjFZMuapfr/UsNRk9WvKe/9yW16a2D/UBrLzyNyPZlpG +hGaoGBV5pwjOBTz7OYnvbfpOcVJ7t+SgpJyWwGE9pApwTcOOzW6zMmzyx0QJBN2g +Vf0jpSB4soVe2DutF/+Fxbl0jTO5uFdutbxpZdsLPJJVmfRztGQkymdMKJnM3Gc9 +eccWnCvmq6qqNXI39oEqSOg/Thmav55GqjKT/6WyWrSxLx5phJIdsLmNr/IxbJWG +8wIDAQAB -----END PUBLIC KEY----- )PUBKEY"; -// http://cacerts.digicert.com/DigiCertTLSRSASHA2562020CA1-1.crt -// CN: DigiCert TLS RSA SHA256 2020 CA1 => name: DigiCert_TLS_RSA_SHA256_2020_CA1 -// not valid before: 2021-04-14 00:00:00 -// not valid after: 2031-04-13 23:59:59 -const char cert_DigiCert_TLS_RSA_SHA256_2020_CA1 [] PROGMEM = R"CERT( +// http://cacerts.digicert.com/DigiCertGlobalG2TLSRSASHA2562020CA1-1.crt +// CN: DigiCert Global G2 TLS RSA SHA256 2020 CA1 => name: DigiCert_Global_G2_TLS_RSA_SHA256_2020_CA1 +// not valid before: 2021-03-30 00:00:00+00:00 +// not valid after: 2031-03-29 23:59:59+00:00 +const char cert_DigiCert_Global_G2_TLS_RSA_SHA256_2020_CA1 [] PROGMEM = R"CERT( -----BEGIN CERTIFICATE----- -MIIEvjCCA6agAwIBAgIQBtjZBNVYQ0b2ii+nVCJ+xDANBgkqhkiG9w0BAQsFADBh +MIIEyDCCA7CgAwIBAgIQDPW9BitWAvR6uFAsI8zwZjANBgkqhkiG9w0BAQsFADBh MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0yMTA0MTQwMDAwMDBaFw0zMTA0MTMyMzU5NTlaME8xCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxKTAnBgNVBAMTIERpZ2lDZXJ0IFRMUyBS -U0EgU0hBMjU2IDIwMjAgQ0ExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAwUuzZUdwvN1PWNvsnO3DZuUfMRNUrUpmRh8sCuxkB+Uu3Ny5CiDt3+PE0J6a -qXodgojlEVbbHp9YwlHnLDQNLtKS4VbL8Xlfs7uHyiUDe5pSQWYQYE9XE0nw6Ddn -g9/n00tnTCJRpt8OmRDtV1F0JuJ9x8piLhMbfyOIJVNvwTRYAIuE//i+p1hJInuW -raKImxW8oHzf6VGo1bDtN+I2tIJLYrVJmuzHZ9bjPvXj1hJeRPG/cUJ9WIQDgLGB -Afr5yjK7tI4nhyfFK3TUqNaX3sNk+crOU6JWvHgXjkkDKa77SU+kFbnO8lwZV21r -eacroicgE7XQPUDTITAHk+qZ9QIDAQABo4IBgjCCAX4wEgYDVR0TAQH/BAgwBgEB -/wIBADAdBgNVHQ4EFgQUt2ui6qiqhIx56rTaD5iyxZV2ufQwHwYDVR0jBBgwFoAU -A95QNVbRTLtm8KPiGxvDl7I90VUwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQG -CCsGAQUFBwMBBggrBgEFBQcDAjB2BggrBgEFBQcBAQRqMGgwJAYIKwYBBQUHMAGG -GGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBABggrBgEFBQcwAoY0aHR0cDovL2Nh -Y2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0R2xvYmFsUm9vdENBLmNydDBCBgNV -HR8EOzA5MDegNaAzhjFodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRH -bG9iYWxSb290Q0EuY3JsMD0GA1UdIAQ2MDQwCwYJYIZIAYb9bAIBMAcGBWeBDAEB -MAgGBmeBDAECATAIBgZngQwBAgIwCAYGZ4EMAQIDMA0GCSqGSIb3DQEBCwUAA4IB -AQCAMs5eC91uWg0Kr+HWhMvAjvqFcO3aXbMM9yt1QP6FCvrzMXi3cEsaiVi6gL3z -ax3pfs8LulicWdSQ0/1s/dCYbbdxglvPbQtaCdB73sRD2Cqk3p5BJl+7j5nL3a7h -qG+fh/50tx8bIKuxT8b1Z11dmzzp/2n3YWzW2fP9NsarA4h20ksudYbj/NhVfSbC -EXffPgK2fPOre3qGNm+499iTcc+G33Mw+nur7SpZyEKEOxEXGlLzyQ4UfaJbcme6 -ce1XR2bFuAJKZTRei9AqPCCcUZlM51Ke92sRKw2Sfh3oius2FkOH6ipjv3U/697E -A7sKPPcw7+uvTPyLNhBzPvOk +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH +MjAeFw0yMTAzMzAwMDAwMDBaFw0zMTAzMjkyMzU5NTlaMFkxCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxMzAxBgNVBAMTKkRpZ2lDZXJ0IEdsb2Jh +bCBHMiBUTFMgUlNBIFNIQTI1NiAyMDIwIENBMTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAMz3EGJPprtjb+2QUlbFbSd7ehJWivH0+dbn4Y+9lavyYEEV +cNsSAPonCrVXOFt9slGTcZUOakGUWzUb+nv6u8W+JDD+Vu/E832X4xT1FE3LpxDy +FuqrIvAxIhFhaZAmunjZlx/jfWardUSVc8is/+9dCopZQ+GssjoP80j812s3wWPc +3kbW20X+fSP9kOhRBx5Ro1/tSUZUfyyIxfQTnJcVPAPooTncaQwywa8WV0yUR0J8 +osicfebUTVSvQpmowQTCd5zWSOTOEeAqgJnwQ3DPP3Zr0UxJqyRewg2C/Uaoq2yT +zGJSQnWS+Jr6Xl6ysGHlHx+5fwmY6D36g39HaaECAwEAAaOCAYIwggF+MBIGA1Ud +EwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFHSFgMBmx9833s+9KTeqAx2+7c0XMB8G +A1UdIwQYMBaAFE4iVCAYlebjbuYP+vq5Eu0GF485MA4GA1UdDwEB/wQEAwIBhjAd +BgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwdgYIKwYBBQUHAQEEajBoMCQG +CCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQAYIKwYBBQUHMAKG +NGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEdsb2JhbFJvb3RH +Mi5jcnQwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybDMuZGlnaWNlcnQuY29t +L0RpZ2lDZXJ0R2xvYmFsUm9vdEcyLmNybDA9BgNVHSAENjA0MAsGCWCGSAGG/WwC +ATAHBgVngQwBATAIBgZngQwBAgEwCAYGZ4EMAQICMAgGBmeBDAECAzANBgkqhkiG +9w0BAQsFAAOCAQEAkPFwyyiXaZd8dP3A+iZ7U6utzWX9upwGnIrXWkOH7U1MVl+t +wcW1BSAuWdH/SvWgKtiwla3JLko716f2b4gp/DA/JIS7w7d7kwcsr4drdjPtAFVS +slme5LnQ89/nD/7d+MS5EHKBCQRfz5eeLjJ1js+aWNJXMX43AYGyZm0pGrFmCW3R +bpD0ufovARTFXFZkAdl9h6g4U5+LXUZtXMYnhIHUfoyMo5tS58aI7Dd8KvvwVVo4 +chDYABPPTHPbqjc1qCmBaZx2vN4Ye5DUys/vZwP9BFohFrH/6j/f3IL16/RZkiMN +JCqVJUzKoZHm1Lesh3Sz8W2jmdv51b2EQJ8HmA== -----END CERTIFICATE----- )CERT"; -// http://cacerts.digicert.com/DigiCertGlobalRootCA.crt -// CN: DigiCert Global Root CA => name: DigiCert_Global_Root_CA -// not valid before: 2006-11-10 00:00:00 -// not valid after: 2031-11-10 00:00:00 -const char cert_DigiCert_Global_Root_CA [] PROGMEM = R"CERT( +// http://cacerts.digicert.com/DigiCertGlobalRootG2.crt +// CN: DigiCert Global Root G2 => name: DigiCert_Global_Root_G2 +// not valid before: 2013-08-01 12:00:00+00:00 +// not valid after: 2038-01-15 12:00:00+00:00 +const char cert_DigiCert_Global_Root_G2 [] PROGMEM = R"CERT( -----BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH +MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI +2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx +1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ +q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz +tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ +vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV +5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY +1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 +NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG +Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 +8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe +pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= -----END CERTIFICATE----- )CERT"; diff --git a/libraries/ESP8266WiFi/examples/HTTPSRequest/HTTPSRequest.ino b/libraries/ESP8266WiFi/examples/HTTPSRequest/HTTPSRequest.ino index 696d513b52..750abfa733 100644 --- a/libraries/ESP8266WiFi/examples/HTTPSRequest/HTTPSRequest.ino +++ b/libraries/ESP8266WiFi/examples/HTTPSRequest/HTTPSRequest.ino @@ -13,6 +13,7 @@ #include #include + #include "certs.h" #ifndef STASSID @@ -23,7 +24,7 @@ const char* ssid = STASSID; const char* password = STAPSK; -X509List cert(cert_DigiCert_Global_Root_CA); +X509List cert(cert_Sectigo_ECC_Domain_Validation_Secure_Server_CA); void setup() { Serial.begin(115200); @@ -62,7 +63,7 @@ void setup() { Serial.print("Connecting to "); Serial.println(github_host); - Serial.printf("Using certificate: %s\n", cert_DigiCert_Global_Root_CA); + Serial.printf("Using certificate: %s\n", cert_Sectigo_ECC_Domain_Validation_Secure_Server_CA); client.setTrustAnchors(&cert); if (!client.connect(github_host, github_port)) { diff --git a/libraries/ESP8266WiFi/examples/HTTPSRequest/certs.h b/libraries/ESP8266WiFi/examples/HTTPSRequest/certs.h index f59ae673b3..97012d7a59 100644 --- a/libraries/ESP8266WiFi/examples/HTTPSRequest/certs.h +++ b/libraries/ESP8266WiFi/examples/HTTPSRequest/certs.h @@ -1,7 +1,7 @@ // this file is autogenerated - any modification will be overwritten // unused symbols will not be linked in the final binary -// generated on 2023-03-20 23:02:43 +// generated on 2024-07-30 23:28:12 // by ['../../../../tools/cert.py', '-s', 'api.github.com', '-n', 'github'] #pragma once @@ -13,73 +13,72 @@ const char* github_host = "api.github.com"; const uint16_t github_port = 443; // CN: *.github.com => name: __github_com -// not valid before: 2023-02-16 00:00:00 -// not valid after: 2024-03-15 23:59:59 -const char fingerprint___github_com [] PROGMEM = "2d:79:6c:90:2d:ad:8a:2e:4f:d1:e2:99:ed:e8:91:29:36:40:f8:58"; +// not valid before: 2024-03-07 00:00:00+00:00 +// not valid after: 2025-03-07 23:59:59+00:00 +const char fingerprint___github_com [] PROGMEM = "0d:f6:ec:50:fa:ed:ae:6e:13:af:82:94:52:f7:11:1b:0a:cf:7c:20"; const char pubkey___github_com [] PROGMEM = R"PUBKEY( -----BEGIN PUBLIC KEY----- -MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEVB9Da7ntQj93REi9YoUrTvO/wrkz -xLleXrDjJGe1OI3tsrk+cWbZYAbwL6unbhZsAqbyBcr5BHK5M3vxZVSGRg== +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEcAMYSUSbAQpBM6MJN5kRD5gVpxvK +QgpD4jQ4jY1CqNOeWP7fOkn+PxdiJq76Qv5bPmv3tTxD6plhoNDYDohvMg== -----END PUBLIC KEY----- )PUBKEY"; -// http://cacerts.digicert.com/DigiCertTLSHybridECCSHA3842020CA1-1.crt -// CN: DigiCert TLS Hybrid ECC SHA384 2020 CA1 => name: DigiCert_TLS_Hybrid_ECC_SHA384_2020_CA1 -// not valid before: 2021-04-14 00:00:00 -// not valid after: 2031-04-13 23:59:59 -const char cert_DigiCert_TLS_Hybrid_ECC_SHA384_2020_CA1 [] PROGMEM = R"CERT( +// http://crt.sectigo.com/SectigoECCDomainValidationSecureServerCA.crt +// CN: Sectigo ECC Domain Validation Secure Server CA => name: Sectigo_ECC_Domain_Validation_Secure_Server_CA +// not valid before: 2018-11-02 00:00:00+00:00 +// not valid after: 2030-12-31 23:59:59+00:00 +const char cert_Sectigo_ECC_Domain_Validation_Secure_Server_CA [] PROGMEM = R"CERT( -----BEGIN CERTIFICATE----- -MIIEFzCCAv+gAwIBAgIQB/LzXIeod6967+lHmTUlvTANBgkqhkiG9w0BAQwFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0yMTA0MTQwMDAwMDBaFw0zMTA0MTMyMzU5NTlaMFYxCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxMDAuBgNVBAMTJ0RpZ2lDZXJ0IFRMUyBI -eWJyaWQgRUNDIFNIQTM4NCAyMDIwIENBMTB2MBAGByqGSM49AgEGBSuBBAAiA2IA -BMEbxppbmNmkKaDp1AS12+umsmxVwP/tmMZJLwYnUcu/cMEFesOxnYeJuq20ExfJ -qLSDyLiQ0cx0NTY8g3KwtdD3ImnI8YDEe0CPz2iHJlw5ifFNkU3aiYvkA8ND5b8v -c6OCAYIwggF+MBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFAq8CCkXjKU5 -bXoOzjPHLrPt+8N6MB8GA1UdIwQYMBaAFAPeUDVW0Uy7ZvCj4hsbw5eyPdFVMA4G -A1UdDwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwdgYI -KwYBBQUHAQEEajBoMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5j -b20wQAYIKwYBBQUHMAKGNGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdp -Q2VydEdsb2JhbFJvb3RDQS5jcnQwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2Ny -bDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0R2xvYmFsUm9vdENBLmNybDA9BgNVHSAE -NjA0MAsGCWCGSAGG/WwCATAHBgVngQwBATAIBgZngQwBAgEwCAYGZ4EMAQICMAgG -BmeBDAECAzANBgkqhkiG9w0BAQwFAAOCAQEAR1mBf9QbH7Bx9phdGLqYR5iwfnYr -6v8ai6wms0KNMeZK6BnQ79oU59cUkqGS8qcuLa/7Hfb7U7CKP/zYFgrpsC62pQsY -kDUmotr2qLcy/JUjS8ZFucTP5Hzu5sn4kL1y45nDHQsFfGqXbbKrAjbYwrwsAZI/ -BKOLdRHHuSm8EdCGupK8JvllyDfNJvaGEwwEqonleLHBTnm8dqMLUeTF0J5q/hos -Vq4GNiejcxwIfZMy0MJEGdqN9A57HSgDKwmKdsp33Id6rHtSJlWncg+d0ohP/rEh -xRqhqjn1VtvChMQ1H3Dau0bwhr9kAMQ+959GG50jBbl9s08PqUU643QwmA== +MIIDqDCCAy6gAwIBAgIRAPNkTmtuAFAjfglGvXvh9R0wCgYIKoZIzj0EAwMwgYgx +CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5MRQwEgYDVQQHEwtKZXJz +ZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMS4wLAYDVQQD +EyVVU0VSVHJ1c3QgRUNDIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTE4MTEw +MjAwMDAwMFoXDTMwMTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAkdCMRswGQYDVQQI +ExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGDAWBgNVBAoT +D1NlY3RpZ28gTGltaXRlZDE3MDUGA1UEAxMuU2VjdGlnbyBFQ0MgRG9tYWluIFZh +bGlkYXRpb24gU2VjdXJlIFNlcnZlciBDQTBZMBMGByqGSM49AgEGCCqGSM49AwEH +A0IABHkYk8qfbZ5sVwAjBTcLXw9YWsTef1Wj6R7W2SUKiKAgSh16TwUwimNJE4xk +IQeV/To14UrOkPAY9z2vaKb71EijggFuMIIBajAfBgNVHSMEGDAWgBQ64QmG1M8Z +wpZ2dEl23OA1xmNjmjAdBgNVHQ4EFgQU9oUKOxGG4QR9DqoLLNLuzGR7e64wDgYD +VR0PAQH/BAQDAgGGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0lBBYwFAYIKwYB +BQUHAwEGCCsGAQUFBwMCMBsGA1UdIAQUMBIwBgYEVR0gADAIBgZngQwBAgEwUAYD +VR0fBEkwRzBFoEOgQYY/aHR0cDovL2NybC51c2VydHJ1c3QuY29tL1VTRVJUcnVz +dEVDQ0NlcnRpZmljYXRpb25BdXRob3JpdHkuY3JsMHYGCCsGAQUFBwEBBGowaDA/ +BggrBgEFBQcwAoYzaHR0cDovL2NydC51c2VydHJ1c3QuY29tL1VTRVJUcnVzdEVD +Q0FkZFRydXN0Q0EuY3J0MCUGCCsGAQUFBzABhhlodHRwOi8vb2NzcC51c2VydHJ1 +c3QuY29tMAoGCCqGSM49BAMDA2gAMGUCMEvnx3FcsVwJbZpCYF9z6fDWJtS1UVRs +cS0chWBNKPFNpvDKdrdKRe+oAkr2jU+ubgIxAODheSr2XhcA7oz9HmedGdMhlrd9 +4ToKFbZl+/OnFFzqnvOhcjHvClECEQcKmc8fmA== -----END CERTIFICATE----- )CERT"; -// http://cacerts.digicert.com/DigiCertGlobalRootCA.crt -// CN: DigiCert Global Root CA => name: DigiCert_Global_Root_CA -// not valid before: 2006-11-10 00:00:00 -// not valid after: 2031-11-10 00:00:00 -const char cert_DigiCert_Global_Root_CA [] PROGMEM = R"CERT( +// http://crt.usertrust.com/USERTrustECCAddTrustCA.crt +// CN: USERTrust ECC Certification Authority => name: USERTrust_ECC_Certification_Authority +// not valid before: 2019-03-12 00:00:00+00:00 +// not valid after: 2028-12-31 23:59:59+00:00 +const char cert_USERTrust_ECC_Certification_Authority [] PROGMEM = R"CERT( -----BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +MIID0zCCArugAwIBAgIQVmcdBOpPmUxvEIFHWdJ1lDANBgkqhkiG9w0BAQwFADB7 +MQswCQYDVQQGEwJHQjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYD +VQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UE +AwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTE5MDMxMjAwMDAwMFoXDTI4 +MTIzMTIzNTk1OVowgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5 +MRQwEgYDVQQHEwtKZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBO +ZXR3b3JrMS4wLAYDVQQDEyVVU0VSVHJ1c3QgRUNDIENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEGqxUWqn5aCPnetUkb1PGWthL +q8bVttHmc3Gu3ZzWDGH926CJA7gFFOxXzu5dP+Ihs8731Ip54KODfi2X0GHE8Znc +JZFjq38wo7Rw4sehM5zzvy5cU7Ffs30yf4o043l5o4HyMIHvMB8GA1UdIwQYMBaA +FKARCiM+lvEH7OKvKe+CpX/QMKS0MB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1 +xmNjmjAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zARBgNVHSAECjAI +MAYGBFUdIAAwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5j +b20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNAYIKwYBBQUHAQEEKDAmMCQG +CCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJKoZIhvcNAQEM +BQADggEBABns652JLCALBIAdGN5CmXKZFjK9Dpx1WywV4ilAbe7/ctvbq5AfjJXy +ij0IckKJUAfiORVsAYfZFhr1wHUrxeZWEQff2Ji8fJ8ZOd+LygBkc7xGEJuTI42+ +FsMuCIKchjN0djsoTI0DQoWz4rIjQtUfenVqGtF8qmchxDM6OW1TyaLtYiKou+JV +bJlsQ2uRl9EMC5MCHdK8aXdJ5htN978UeAOwproLtOGFfy/cQjutdAFI3tZs4RmY +CV4Ks2dH/hzg1cEo70qLRDEmBDeNiXQ2Lu+lIg+DdEmSx/cQwgwp+7e9un/jX9Wf +8qn0dNW44bOwgeThpWOjzOoEeJBuv/c= -----END CERTIFICATE----- )CERT"; diff --git a/tools/cert.py b/tools/cert.py index 7498d5ee62..f319ef0f30 100755 --- a/tools/cert.py +++ b/tools/cert.py @@ -41,8 +41,8 @@ def printData(data, showPub = True): name = re.sub('[^a-zA-Z0-9_]', '_', cn) print('// CN: {} => name: {}'.format(cn, name)) - print('// not valid before:', xcert.not_valid_before) - print('// not valid after: ', xcert.not_valid_after) + print('// not valid before:', xcert.not_valid_before_utc) + print('// not valid after: ', xcert.not_valid_after_utc) if showPub: @@ -114,7 +114,7 @@ def main(): print() print('// this file is autogenerated - any modification will be overwritten') print('// unused symbols will not be linked in the final binary') - print('// generated on {}'.format(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))) + print('// generated on {}'.format(datetime.datetime.now(datetime.UTC).strftime("%Y-%m-%d %H:%M:%S"))) print('// by {}'.format(sys.argv)) print() print('#pragma once') From 27272de6239aed1b117343bd1450659944a8c751 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juraj=20Andr=C3=A1ssy?= <10706773+JAndrassy@users.noreply.github.com> Date: Wed, 31 Jul 2024 04:53:39 +0200 Subject: [PATCH 29/50] LwIpIntfDev.end() - check _started to prevent crash (#9173) --- cores/esp8266/LwipIntfDev.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/cores/esp8266/LwipIntfDev.h b/cores/esp8266/LwipIntfDev.h index 962d5e1196..d69e2d73d8 100644 --- a/cores/esp8266/LwipIntfDev.h +++ b/cores/esp8266/LwipIntfDev.h @@ -349,9 +349,12 @@ boolean LwipIntfDev::begin(const uint8_t* macAddress, const uint16_t mtu template void LwipIntfDev::end() { - netif_remove(&_netif); - _started = false; - RawDev::end(); + if (_started) + { + netif_remove(&_netif); + _started = false; + RawDev::end(); + } } template From bb3360d0ec1ec83f0b48e9b064b5253d9934a6c8 Mon Sep 17 00:00:00 2001 From: Max Prokhorov Date: Thu, 1 Aug 2024 02:47:40 +0300 Subject: [PATCH 30/50] CI - restyle script summary and annotations in PRs (#9184) similar to .ino builder, prepare a short 'diff' summary of all the required changes https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#adding-a-job-summary provide inline annotations, so it is apparent clang-format job is the cause of the PR actions check failure https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#setting-a-notice-message --- .github/workflows/style-check.yml | 1 + tests/host/common/ArduinoCatch.hpp | 8 +- tests/restyle.py | 290 +++++++++++++++++++++++++++++ tests/restyle.sh | 56 +----- tests/test_restyle.py | 182 ++++++++++++++++++ 5 files changed, 487 insertions(+), 50 deletions(-) create mode 100755 tests/restyle.py create mode 100644 tests/test_restyle.py diff --git a/.github/workflows/style-check.yml b/.github/workflows/style-check.yml index 50a99f2e53..263278e14e 100644 --- a/.github/workflows/style-check.yml +++ b/.github/workflows/style-check.yml @@ -26,6 +26,7 @@ jobs: - name: Style check run: | sudo apt update + python ./tests/test_restyle.py --quiet bash ./tests/ci/style_check.sh # Validate orthography diff --git a/tests/host/common/ArduinoCatch.hpp b/tests/host/common/ArduinoCatch.hpp index 8cb81afb7c..d30d30e4ec 100644 --- a/tests/host/common/ArduinoCatch.hpp +++ b/tests/host/common/ArduinoCatch.hpp @@ -24,13 +24,15 @@ std::ostream& operator<<(std::ostream&, const String&); -namespace Catch { +namespace Catch +{ std::string toString(const String&); template<> -struct StringMaker { +struct StringMaker +{ static std::string convert(const String&); }; -} // namespace Catch +} // namespace Catch diff --git a/tests/restyle.py b/tests/restyle.py new file mode 100755 index 0000000000..78a8816000 --- /dev/null +++ b/tests/restyle.py @@ -0,0 +1,290 @@ +#!/usr/bin/env python + +import argparse +import os +import sys +import pathlib +import subprocess +import contextlib + +from dataclasses import dataclass + + +GIT_ROOT = pathlib.Path( + subprocess.check_output( + ["git", "rev-parse", "--show-toplevel"], universal_newlines=True + ).strip() +) + + +def clang_format(clang_format, config, files): + if not files: + raise ValueError("Files list cannot be empty") + + cmd = [clang_format, "--verbose", f"--style=file:{config.as_posix()}", "-i"] + cmd.extend(files) + + subprocess.run(cmd, check=True) + + +def ls_files(patterns): + """Git-only search, but rather poor at matching complex patterns (at least w/ <=py3.12)""" + proc = subprocess.run( + ["git", "--no-pager", "ls-files"], + capture_output=True, + check=True, + universal_newlines=True, + ) + + out = [] + for line in proc.stdout.split("\n"): + path = pathlib.Path(line.strip()) + if any(path.match(pattern) for pattern in patterns): + out.append(path) + + return out + + +def diff_lines(): + proc = subprocess.run( + ["git", "--no-pager", "diff", "--ignore-submodules"], + capture_output=True, + check=True, + universal_newlines=True, + ) + + return proc.stdout.split("\n") + + +def find_files(patterns): + """Filesystem search, matches both git and non-git files""" + return [ + file + for pattern in patterns + for file in [found for found in GIT_ROOT.rglob(pattern)] + ] + + +def find_core_files(): + """Returns a subset of Core files that should be formatted""" + return [ + file + for file in find_files( + ( + "cores/esp8266/Lwip*", + "libraries/ESP8266mDNS/**/*", + "libraries/Wire/**/*", + "libraries/lwIP*/**/*", + "cores/esp8266/debug*", + "cores/esp8266/core_esp8266_si2c*", + "cores/esp8266/StreamString*", + "cores/esp8266/StreamSend*", + "libraries/Netdump/**/*", + "tests/**/*", + ) + ) + if file.is_file() + and file.suffix in (".c", ".cpp", ".h", ".hpp") + and not GIT_ROOT / "tests/host/bin" in file.parents + and not GIT_ROOT / "tests/host/common/catch.hpp" == file + ] + + +def find_arduino_files(): + """Returns every .ino file available in the repository, excluding submodule ones""" + return [ + ino + for library in find_files(("libraries/*",)) + if library.is_dir() and not (library / ".git").exists() + for ino in library.rglob("**/*.ino") + ] + + +FILES_PRESETS = { + "core": find_core_files, + "arduino": find_arduino_files, +} + + +@dataclass +class Changed: + file: str + hunk: str + lines: list[int] + + +class Context: + def __init__(self): + self.append_hunk = False + self.deleted = False + self.file = "" + self.hunk = [] + self.markers = [] + + def reset(self): + self.__init__() + + def reset_with_line(self, line): + self.reset() + self.hunk.append(line) + + def pop(self, out, line): + if self.file and self.hunk and self.markers: + out.append( + Changed(file=self.file, hunk="\n".join(self.hunk), lines=self.markers) + ) + + self.reset_with_line(line) + + +def changed_files_for_diff(lines: list[str] | str) -> list[Changed]: + """ + Naive git-diff output parser. Generates list of objects for every file changed after clang-format. + """ + match lines: + case str(): + lines = lines.split("\n") + case list(): + pass + case _: + raise ValueError("Unknown 'lines' type, can be either list[str] or str") + + ctx = Context() + out = [] + + # TODO: pygit2? + # ref. https://github.com/cpp-linter/cpp-linter/blob/main/cpp_linter/git/__init__.py ::parse_diff + # ref. https://github.com/libgit2/pygit2/blob/master/src/diff.c ::parse_diff + for line in lines: + # '--- a/path/to/changed/file' most likely + # '--- /dev/null' aka created file. should be ignored, same as removed ones + if line.startswith("---"): + ctx.pop(out, line) + + _, file = line.split(" ") + ctx.deleted = "/dev/null" in file + + # '+++ b/path/to/changed/file' most likely + # '+++ /dev/null' aka removed file + elif not ctx.deleted and line.startswith("+++"): + ctx.hunk.append(line) + + _, file = line.split(" ") + ctx.deleted = "/dev/null" in file + if not ctx.deleted: + ctx.file = file[2:] + + # @@ from-file-line-numbers to-file-line-numbers @@ + elif not ctx.deleted and line.startswith("@@"): + ctx.hunk.append(line) + + _, _, numbers, _ = line.split(" ", 3) + if "," in numbers: + numbers, _ = numbers.split(",") # drop count + + numbers = numbers.replace("+", "") + numbers = numbers.replace("-", "") + + ctx.markers.append(int(numbers)) + ctx.append_hunk = True + + # capture diff for the summary + elif ctx.append_hunk and line.startswith(("+", "-", " ")): + ctx.hunk.append(line) + + ctx.pop(out, line) + + return out + + +def changed_files() -> list[Changed]: + return changed_files_for_diff(diff_lines()) + + +def errors_changed(changed: Changed): + all_lines = ", ".join(str(x) for x in changed.lines) + for line in changed.lines: + print( + f"::error file={changed.file},title=Run tests/restyle.sh and re-commit {changed.file},line={line}::File {changed.file} failed clang-format style check. (lines {all_lines})" + ) + + +SUMMARY_PATH = pathlib.Path(os.environ.get("GITHUB_STEP_SUMMARY", os.devnull)) +SUMMARY_OUTPUT = SUMMARY_PATH.open("a") + + +def summary_diff(changed: Changed): + with contextlib.redirect_stdout(SUMMARY_OUTPUT): + print(f"# {changed.file} (suggested change)") + print("```diff") + print(changed.hunk) + print("```") + + +def stdout_diff(): + subprocess.run(["git", "--no-pager", "diff", "--ignore-submodules"]) + + +def assert_unchanged(): + subprocess.run( + ["git", "diff", "--ignore-submodules", "--exit-code"], + check=True, + stdout=subprocess.DEVNULL, + ) + + +def run_format(args): + targets = [] + + for include in args.include: + targets.append( + (GIT_ROOT / f"tests/clang-format-{include}.yaml", FILES_PRESETS[include]()) + ) + + if not targets: + targets.append((args.config, args.files)) + + for target in targets: + clang_format(args.clang_format, *target) + + +def run_assert(args): + for changed in changed_files(): + if args.with_errors: + errors_changed(changed) + if args.with_summary: + summary_diff(changed) + + if args.with_diff: + stdout_diff() + + assert_unchanged() + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + + cmd = parser.add_subparsers(required=True) + format_ = cmd.add_parser("format") + format_.set_defaults(func=run_format) + format_.add_argument("--clang-format", default="clang-format") + + fmt = format_.add_subparsers(required=True) + + preset = fmt.add_parser("preset") + preset.add_argument( + "--include", action="append", required=True, choices=tuple(FILES_PRESETS.keys()) + ) + + files = fmt.add_parser("files") + files.add_argument("--config", type=pathlib.Path, required=True) + files.add_argument("files", type=pathlib.Path, nargs="+") + + assert_ = cmd.add_parser("assert") + assert_.set_defaults(func=run_assert) + assert_.add_argument("--with-diff", action="store_true") + assert_.add_argument("--with-errors", action="store_true") + assert_.add_argument("--with-summary", action="store_true") + + args = parser.parse_args() + args.func(args) diff --git a/tests/restyle.sh b/tests/restyle.sh index ce8e906a76..6e10cab6a2 100755 --- a/tests/restyle.sh +++ b/tests/restyle.sh @@ -1,5 +1,5 @@ #!/bin/sh -# requires clang-format, git, python3 with pyyaml +# requires python3, git, and runnable clang-format (specified below) set -e -x @@ -11,51 +11,13 @@ test -d ${root}/libraries # default to v15, latest stable version from ubuntu-latest Github Actions image CLANG_FORMAT=${CLANG_FORMAT:-clang-format-15} -######################################### -# 'all' variable should be "cores/esp8266 libraries" - -all=${1:-" -cores/esp8266/Lwip* -libraries/ESP8266mDNS -libraries/Wire -libraries/lwIP* -cores/esp8266/debug* -cores/esp8266/core_esp8266_si2c.cpp -cores/esp8266/StreamString.* -cores/esp8266/StreamSend.* -libraries/Netdump -tests -"} - -######################################### -# restyling core & libraries - cd $root - -style=${root}/tests/clang-format-core.yaml -for target in $all; do - if [ -d "$target" ]; then - find $target \ - '(' -name "*.cpp" -o -name "*.c" -o -name "*.h" ')' \ - -exec $CLANG_FORMAT --verbose --style="file:$style" -i {} \; - else - $CLANG_FORMAT --verbose --style="file:$style" -i $target - fi -done - -######################################### -# restyling arduino examples - -# TODO should not be matched, these are formatted externally -# exclude=$(git submodule --quiet foreach git rev-parse --show-toplevel | grep libraries) - -if [ -z $1 ] ; then - style=${root}/tests/clang-format-arduino.yaml - find libraries \ - -path libraries/ESP8266SdFat -prune -o \ - -path libraries/Ethernet -prune -o \ - -path libraries/SoftwareSerial -prune -o \ - -name '*.ino' -exec $CLANG_FORMAT --verbose --style="file:$style" -i {} \; +python $root/tests/restyle.py format --clang-format=$CLANG_FORMAT preset --include core --include arduino + +if [ $CI = "true" ] ; then + echo foo + python $root/tests/restyle.py assert --with-summary --with-errors +else + echo bar + python $root/tests/restyle.py assert --with-diff fi - -######################################### diff --git a/tests/test_restyle.py b/tests/test_restyle.py new file mode 100644 index 0000000000..7264f1c09e --- /dev/null +++ b/tests/test_restyle.py @@ -0,0 +1,182 @@ +import unittest + +from restyle import changed_files_for_diff + +# small git-diff samples from https://queirozf.com/entries/git-diff-reference-and-examples + + +class BaseTest(unittest.TestCase): + def testNewLine(self): + diff = """ +diff --git a/file.txt b/file.txt +index 257cc56..3bd1f0e 100644 +--- a/file.txt ++++ b/file.txt +@@ -1 +1,2 @@ + foo ++bar +""" + changed = changed_files_for_diff(diff) + self.assertEqual(1, len(changed)) + self.assertEqual("file.txt", changed[0].file) + self.assertEqual(1, len(changed[0].lines)) + self.assertEqual(1, changed[0].lines[0]) + + expected = """ +--- a/file.txt ++++ b/file.txt +@@ -1 +1,2 @@ + foo ++bar +""".strip() + self.assertEqual(expected, changed[0].hunk.strip()) + + def testNewLines(self): + diff = """ +diff --git a/file.txt b/file.txt +index 257cc56..3bd1f0e 100644 +--- a/file2.txt ++++ b/file2.txt +@@ -1 +1,2 @@ + foo ++bar + baz +@@ -1 +10,2 @@ + 222 +-222 + 333 +@@ -1 +100,3 @@ + aaa ++bbb ++ccc + ddd +""" + changed = changed_files_for_diff(diff) + self.assertEqual(1, len(changed)) + self.assertEqual("file2.txt", changed[0].file) + + lines = changed[0].lines + self.assertEqual(3, len(lines)) + + first, second, third = lines + self.assertEqual(1, first) + self.assertEqual(10, second) + self.assertEqual(100, third) + + expected = """ +--- a/file2.txt ++++ b/file2.txt +@@ -1 +1,2 @@ + foo ++bar + baz +@@ -1 +10,2 @@ + 222 +-222 + 333 +@@ -1 +100,3 @@ + aaa ++bbb ++ccc + ddd +""".strip() + self.assertEqual(expected, changed[0].hunk.strip()) + + def testRemovedLineAndDeletedFile(self): + diff = """ +diff --git a/file.txt b/file.txt +index 3bd1f0e..257cc56 100644 +--- a/file.txt ++++ b/file.txt +@@ -1,2 +1 @@ + foo +-bar +diff --git a/file2.txt b/file2.txt +deleted file mode 100644 +index 85553e8..0000000 +--- a/file2.txt ++++ /dev/null +@@ -1,2 +0,0 @@ +-aaaaaa +-bbbbbb +""" + changed = changed_files_for_diff(diff) + self.assertEqual(1, len(changed)) + self.assertEqual("file.txt", changed[0].file) + self.assertEqual(1, len(changed[0].lines)) + self.assertEqual(1, changed[0].lines[0]) + + expected = """ +--- a/file.txt ++++ b/file.txt +@@ -1,2 +1 @@ + foo +-bar +""".strip() + self.assertEqual(expected, changed[0].hunk.strip()) + + def testNewLineAndDeletedFile(self): + diff = """ +diff --git a/file.txt b/file.txt +index 3bd1f0e..86e041d 100644 +--- a/file.txt ++++ b/file.txt +@@ -1,2 +1,3 @@ + foo + bar ++baz +diff --git a/file2.txt b/file2.txt +deleted file mode 100644 +index 85553e8..0000000 +--- a/file2.txt ++++ /dev/null +@@ -1,2 +0,0 @@ +-aaaaaa +-bbbbbb +""" + changed = changed_files_for_diff(diff) + self.assertEqual(1, len(changed)) + self.assertEqual("file.txt", changed[0].file) + self.assertEqual(1, len(changed[0].lines)) + self.assertEqual(1, changed[0].lines[0]) + + expected = """ +--- a/file.txt ++++ b/file.txt +@@ -1,2 +1,3 @@ + foo + bar ++baz +""".strip() + self.assertEqual(expected, changed[0].hunk.strip()) + + def testDeletedFile(self): + diff = """ +diff --git a/file2.txt b/file2.txt +deleted file mode 100644 +index 85553e8..0000000 +--- a/file2.txt ++++ /dev/null +@@ -1,2 +0,0 @@ +-aaaaaa +-bbbbbb +""" + changed = changed_files_for_diff(diff) + self.assertEqual(0, len(changed)) + + def testNewFile(self): + diff = """ +diff --git a/file3.txt b/file3.txt +new file mode 100644 +index 0000000..a309e46 +--- /dev/null ++++ b/file3.txt +@@ -0,0 +1 @@ ++this is file3 +""" + changed = changed_files_for_diff(diff) + self.assertEqual(0, len(changed)) + + +if __name__ == '__main__': + unittest.main() From ccea72823ac50290bc05c67350d2be6626e65547 Mon Sep 17 00:00:00 2001 From: Max Prokhorov Date: Thu, 1 Aug 2024 03:46:51 +0300 Subject: [PATCH 31/50] ESP8266WebServer - UriRegex runtime logic within assert() (#9185) --- libraries/ESP8266WebServer/src/uri/UriRegex.h | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/libraries/ESP8266WebServer/src/uri/UriRegex.h b/libraries/ESP8266WebServer/src/uri/UriRegex.h index eef1b516d4..e29eeb5cd6 100644 --- a/libraries/ESP8266WebServer/src/uri/UriRegex.h +++ b/libraries/ESP8266WebServer/src/uri/UriRegex.h @@ -2,8 +2,9 @@ #define URI_REGEX_H #include "Uri.h" + +#include #include -#include #ifndef REGEX_MAX_GROUPS #define REGEX_MAX_GROUPS 10 @@ -12,13 +13,20 @@ class UriRegex : public Uri { private: - regex_t _regexCompiled; + regex_t _regexCompiled{}; + int _regexErr{REG_EMPTY}; public: - explicit UriRegex(const char *uri) : Uri(uri) { - assert(regcomp(&_regexCompiled, uri, REG_EXTENDED) == 0); - }; - explicit UriRegex(const String &uri) : UriRegex(uri.c_str()) {}; + UriRegex() = delete; + + explicit UriRegex(const char *uri) : + Uri(uri), + _regexErr(regcomp(&_regexCompiled, uri, REG_EXTENDED)) + { + assert(_regexErr == 0); + } + + explicit UriRegex(const String &uri) : UriRegex(uri.c_str()) {} ~UriRegex() { regfree(&_regexCompiled); @@ -26,15 +34,17 @@ class UriRegex : public Uri { Uri* clone() const override final { return new UriRegex(_uri); - }; + } bool canHandle(const String &requestUri, std::vector &pathArgs) override final { if (Uri::canHandle(requestUri, pathArgs)) return true; + if (_regexErr != 0) + return false; + regmatch_t groupArray[REGEX_MAX_GROUPS]; if (regexec(&_regexCompiled, requestUri.c_str(), REGEX_MAX_GROUPS, groupArray, 0) == 0) { - // matches pathArgs.clear(); unsigned int g = 1; From 9e3ba2625818682a81c0bf49c55cf5537eb2c33f Mon Sep 17 00:00:00 2001 From: Hasenradball Date: Wed, 20 Nov 2024 17:32:38 +0100 Subject: [PATCH 32/50] SD - examples/listfilesEnhanced (#9206) * add new example for enhanced file listing * adapt Pin * adapt due to clanf format check in line 14 * Adapt further clang findings * additional intention corrections * last clang format issues corrected * case-sensitive, eof line break --- .../listfilesEnhanced/listfilesEnhanced.ino | 134 ++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 libraries/SD/examples/listfilesEnhanced/listfilesEnhanced.ino diff --git a/libraries/SD/examples/listfilesEnhanced/listfilesEnhanced.ino b/libraries/SD/examples/listfilesEnhanced/listfilesEnhanced.ino new file mode 100644 index 0000000000..5daa3294ad --- /dev/null +++ b/libraries/SD/examples/listfilesEnhanced/listfilesEnhanced.ino @@ -0,0 +1,134 @@ +/* + Listfiles Enhanced + + This example demonstrates how to list files on an SDcard in the following way: + 1) collect all directories + 2) build full path of directories and keep in mind + 3) then print all files with the help of the directorie pathes + + Wiring: + SDcard attached to SPI bus as follows: + - MOSI: pin 11 + - MISO: pin 12 + - CLK : pin 13 + - CS : pin 4 + + Created: + 18. Nov 2024 by Frank Häfele + + This example code is in the public domain. + +*/ +#include +#include +#include + +#define SD_CS_PIN 4 + + +void dir(String path) { + std::vector directories; + collectDirectories(path, directories); + for (auto directory : directories) { + printDirectoryName(directory.c_str(), 1); + File fs = SD.open(directory); + printFilesInDirectory(fs); + Serial.println("\n==============="); + fs.close(); + } +} + +void setup() { + // Open serial communications and wait for port to open: + Serial.begin(115200); + + Serial.print("\n\n==== List Directory ====\n\n"); + listDirectory(); + + Serial.println("done!"); +} + +void loop() { + // nothing happens after setup finishes. +} + +void listDirectory() { + Serial.print("\n\nInitializing SD card..."); + if (!SD.begin(SD_CS_PIN)) { + Serial.println("initialization failed!"); + return; + } + Serial.print("initialization successful.\n"); + Serial.print("List Files:\n"); + dir("/"); +} + + +void printDirectoryName(const char *name, uint8_t level) { + for (uint8_t i = 0; i < level; ++i) { + Serial.print(" "); + } + Serial.println(name); +} + + + +// helper function: combine path +String joinPath(const String &base, const String &name) { + if (base.endsWith("/")) { + return base + name; + } + return base + "/" + name; +} + +// recusive function to collect directory names +void collectDirectories(const String &dirname, std::vector &directories) { + File root = SD.open(dirname); + if (!root || !root.isDirectory()) { + Serial.printf("Error: Cannot open %s\n", dirname.c_str()); + return; + } + directories.push_back(dirname); + + File file = root.openNextFile(); + while (file) { + if (file.isDirectory()) { + String fullPath = joinPath(dirname, file.name()); + collectDirectories(fullPath, directories); + } + file = root.openNextFile(); + } + root.close(); +} + +// print filenames +void printFileName(File file) { + Serial.print("\t"); + Serial.printf("%30s", file.name()); + // files have sizes, directories do not + Serial.print(" - "); + Serial.print(file.size(), DEC); + time_t cr = file.getCreationTime(); + time_t lw = file.getLastWrite(); + struct tm *tmstruct = localtime(&cr); + Serial.printf("\tCREATION: %d-%02d-%02d %02d:%02d:%02d", (tmstruct->tm_year) + 1900, (tmstruct->tm_mon) + 1, tmstruct->tm_mday, tmstruct->tm_hour, tmstruct->tm_min, tmstruct->tm_sec); + tmstruct = localtime(&lw); + Serial.printf("\tLAST WRITE: %d-%02d-%02d %02d:%02d:%02d\n", (tmstruct->tm_year) + 1900, (tmstruct->tm_mon) + 1, tmstruct->tm_mday, tmstruct->tm_hour, tmstruct->tm_min, tmstruct->tm_sec); +} + + +// print files in directories +void printFilesInDirectory(File dir) { + while (true) { + auto file = dir.openNextFile(); + if (!file) { + // no more files + break; + } + if (file.isDirectory()) { + continue; + } else { + printFileName(file); + } + } +} From bb79e9076e8402c81c24efbabd19f1baab1c6bd1 Mon Sep 17 00:00:00 2001 From: Greg Sadetsky Date: Wed, 20 Nov 2024 12:07:01 -0500 Subject: [PATCH 33/50] Documentation - fix links in station-class.rst (#9191) --- doc/esp8266wifi/station-class.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/esp8266wifi/station-class.rst b/doc/esp8266wifi/station-class.rst index 30d9cf13f5..06e072adc6 100644 --- a/doc/esp8266wifi/station-class.rst +++ b/doc/esp8266wifi/station-class.rst @@ -473,7 +473,7 @@ Function returns one of the following connection statuses: - ``WL_IDLE_STATUS`` when Wi-Fi is in process of changing between statuses - ``WL_DISCONNECTED`` if module is not configured in station mode -Returned value is type of ``wl_status_t`` defined in `wl\_definitions.h `__ +Returned value is type of ``wl_status_t`` defined in `wl\_definitions.h `__ *Example code:* @@ -511,7 +511,7 @@ Returned value is type of ``wl_status_t`` defined in `wl\_definitions.h `__ as follows: +Particular connection statuses 6 and 3 may be looked up in `wl\_definitions.h `__ as follows: :: From be3035c8531c2c77bccffe0f4ad4ad179ad96ecf Mon Sep 17 00:00:00 2001 From: Max Prokhorov Date: Fri, 24 Jan 2025 09:40:22 +0300 Subject: [PATCH 34/50] CI - clang-format-18 (#9225) * Fix shell variable comparison without $CI present + '[' = true ']' ./tests/restyle.sh: line 16: [: =: unary operator expected vs. + '[' '' = true ']' * Update to clang-format-18 new opt to skip overly eager macro formatting https://clang.llvm.org/docs/ClangFormatStyleOptions.html#skipmacrodefinitionbody minor changes between 15 and 18 for ide examples reference arduino-ide format is still stuck with 15, though https://github.com/arduino/clang-static-binaries/releases * Pin clang-format in CI recipe not the script itself * style --- .github/workflows/style-check.yml | 2 +- .../examples/WebServer/WebServer.ino | 2 +- libraries/ESP8266mDNS/src/LEAmDNS.h | 3 +- libraries/ESP8266mDNS/src/LEAmDNS_Control.cpp | 18 ++++----- libraries/ESP8266mDNS/src/LEAmDNS_Structs.cpp | 39 +++++++------------ .../InputSerialPlotter/InputSerialPlotter.ino | 3 +- .../I2S/examples/SimpleTone/SimpleTone.ino | 3 +- .../examples/tftbmp/tftbmp.ino | 6 +-- .../examples/tftbmp2/tftbmp2.ino | 9 ++--- .../examples/SerialStress/SerialStress.ino | 3 +- tests/clang-format-core.yaml | 1 + tests/device/libraries/BSTest/src/BSTest.h | 3 +- tests/host/common/queue.h | 4 +- tests/restyle.sh | 7 +--- 14 files changed, 40 insertions(+), 63 deletions(-) diff --git a/.github/workflows/style-check.yml b/.github/workflows/style-check.yml index 263278e14e..c371c2f252 100644 --- a/.github/workflows/style-check.yml +++ b/.github/workflows/style-check.yml @@ -27,7 +27,7 @@ jobs: run: | sudo apt update python ./tests/test_restyle.py --quiet - bash ./tests/ci/style_check.sh + env CLANG_FORMAT="clang-format-18" bash ./tests/ci/style_check.sh # Validate orthography diff --git a/libraries/ESP8266WebServer/examples/WebServer/WebServer.ino b/libraries/ESP8266WebServer/examples/WebServer/WebServer.ino index bba7669ad7..9e88e96f1f 100644 --- a/libraries/ESP8266WebServer/examples/WebServer/WebServer.ino +++ b/libraries/ESP8266WebServer/examples/WebServer/WebServer.ino @@ -153,7 +153,7 @@ public: // Close the file if (_fsUploadFile) { _fsUploadFile.close(); } } // if - } // upload() + } // upload() protected: File _fsUploadFile; diff --git a/libraries/ESP8266mDNS/src/LEAmDNS.h b/libraries/ESP8266mDNS/src/LEAmDNS.h index 092fcd5cf2..3fc4dd98da 100644 --- a/libraries/ESP8266mDNS/src/LEAmDNS.h +++ b/libraries/ESP8266mDNS/src/LEAmDNS.h @@ -492,8 +492,7 @@ namespace MDNSImplementation { MDNSServiceInfo(MDNSResponder& p_pM, MDNSResponder::hMDNSServiceQuery p_hS, uint32_t p_u32A) : - p_pMDNSResponder(p_pM), - p_hServiceQuery(p_hS), p_u32AnswerIndex(p_u32A) {}; + p_pMDNSResponder(p_pM), p_hServiceQuery(p_hS), p_u32AnswerIndex(p_u32A) {}; struct CompareKey { bool operator()(char const* a, char const* b) const diff --git a/libraries/ESP8266mDNS/src/LEAmDNS_Control.cpp b/libraries/ESP8266mDNS/src/LEAmDNS_Control.cpp index f575983ef7..2cc32b053b 100644 --- a/libraries/ESP8266mDNS/src/LEAmDNS_Control.cpp +++ b/libraries/ESP8266mDNS/src/LEAmDNS_Control.cpp @@ -631,8 +631,8 @@ namespace MDNSImplementation } } } // service tiebreak possibility - } // for services - } // ANY answers + } // for services + } // ANY answers } else { @@ -955,7 +955,7 @@ namespace MDNSImplementation } pRRAnswer = pRRAnswer->m_pNext; // Next collected answer - } // while (answers) + } // while (answers) } while ((bFoundNewKeyAnswer) && (bResult)); } // else: No answers provided DEBUG_EX_ERR(if (!bResult) { @@ -1110,7 +1110,7 @@ namespace MDNSImplementation } pServiceQuery = pServiceQuery->m_pNext; } // while(service query) - } // else: No p_pSRVAnswer + } // else: No p_pSRVAnswer DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processSRVAnswer: FAILED!\n")); }); @@ -1173,7 +1173,7 @@ namespace MDNSImplementation } pServiceQuery = pServiceQuery->m_pNext; } // while(service query) - } // else: No p_pTXTAnswer + } // else: No p_pTXTAnswer DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processTXTAnswer: FAILED!\n")); }); @@ -1261,7 +1261,7 @@ namespace MDNSImplementation } pServiceQuery = pServiceQuery->m_pNext; } // while(service query) - } // else: No p_pAAnswer + } // else: No p_pAAnswer DEBUG_EX_ERR(if (!bResult) { DEBUG_OUTPUT.printf_P(PSTR("[MDNSResponder] _processAAnswer: FAILED!\n")); }); @@ -1349,7 +1349,7 @@ namespace MDNSImplementation } pServiceQuery = pServiceQuery->m_pNext; } // while(service query) - } // else: No p_pAAAAAnswer + } // else: No p_pAAAAAnswer return bResult; } @@ -2121,7 +2121,7 @@ namespace MDNSImplementation } // IP4 flagged pIP4Address = pNextIP4Address; // Next - } // while + } // while #endif #ifdef MDNS_IP6_SUPPORT // IP6Address (from AAAA) @@ -2185,7 +2185,7 @@ namespace MDNSImplementation } // IP6 flagged pIP6Address = pNextIP6Address; // Next - } // while + } // while #endif pSQAnswer = pNextSQAnswer; } diff --git a/libraries/ESP8266mDNS/src/LEAmDNS_Structs.cpp b/libraries/ESP8266mDNS/src/LEAmDNS_Structs.cpp index 977a924394..637f62869a 100644 --- a/libraries/ESP8266mDNS/src/LEAmDNS_Structs.cpp +++ b/libraries/ESP8266mDNS/src/LEAmDNS_Structs.cpp @@ -55,8 +55,7 @@ namespace MDNSImplementation MDNSResponder::stcMDNSServiceTxt::stcMDNSServiceTxt(const char* p_pcKey /*= 0*/, const char* p_pcValue /*= 0*/, bool p_bTemp /*= false*/) : - m_pNext(0), - m_pcKey(0), m_pcValue(0), m_bTemp(p_bTemp) + m_pNext(0), m_pcKey(0), m_pcValue(0), m_bTemp(p_bTemp) { setKey(p_pcKey); setValue(p_pcValue); @@ -67,8 +66,7 @@ namespace MDNSImplementation */ MDNSResponder::stcMDNSServiceTxt::stcMDNSServiceTxt( const MDNSResponder::stcMDNSServiceTxt& p_Other) : - m_pNext(0), - m_pcKey(0), m_pcValue(0), m_bTemp(false) + m_pNext(0), m_pcKey(0), m_pcValue(0), m_bTemp(false) { operator=(p_Other); } @@ -614,9 +612,8 @@ namespace MDNSImplementation bool p_bRA /*= false*/, unsigned char p_ucRCode /*= 0*/, uint16_t p_u16QDCount /*= 0*/, uint16_t p_u16ANCount /*= 0*/, uint16_t p_u16NSCount /*= 0*/, uint16_t p_u16ARCount /*= 0*/) : - m_u16ID(p_u16ID), - m_1bQR(p_bQR), m_4bOpcode(p_ucOpcode), m_1bAA(p_bAA), m_1bTC(p_bTC), m_1bRD(p_bRD), - m_1bRA(p_bRA), m_3bZ(0), m_4bRCode(p_ucRCode), m_u16QDCount(p_u16QDCount), + m_u16ID(p_u16ID), m_1bQR(p_bQR), m_4bOpcode(p_ucOpcode), m_1bAA(p_bAA), m_1bTC(p_bTC), + m_1bRD(p_bRD), m_1bRA(p_bRA), m_3bZ(0), m_4bRCode(p_ucRCode), m_u16QDCount(p_u16QDCount), m_u16ANCount(p_u16ANCount), m_u16NSCount(p_u16NSCount), m_u16ARCount(p_u16ARCount) { } @@ -813,8 +810,7 @@ namespace MDNSImplementation */ MDNSResponder::stcMDNS_RRAttributes::stcMDNS_RRAttributes( uint16_t p_u16Type /*= 0*/, uint16_t p_u16Class /*= 1 DNS_RRCLASS_IN Internet*/) : - m_u16Type(p_u16Type), - m_u16Class(p_u16Class) + m_u16Type(p_u16Type), m_u16Class(p_u16Class) { } @@ -910,8 +906,7 @@ namespace MDNSImplementation MDNSResponder::stcMDNS_RRAnswer::stcMDNS_RRAnswer( enuAnswerType p_AnswerType, const MDNSResponder::stcMDNS_RRHeader& p_Header, uint32_t p_u32TTL) : - m_pNext(0), - m_AnswerType(p_AnswerType), m_Header(p_Header), m_u32TTL(p_u32TTL) + m_pNext(0), m_AnswerType(p_AnswerType), m_Header(p_Header), m_u32TTL(p_u32TTL) { // Extract 'cache flush'-bit m_bCacheFlush = (m_Header.m_Attributes.m_u16Class & 0x8000); @@ -955,8 +950,7 @@ namespace MDNSImplementation */ MDNSResponder::stcMDNS_RRAnswerA::stcMDNS_RRAnswerA( const MDNSResponder::stcMDNS_RRHeader& p_Header, uint32_t p_u32TTL) : - stcMDNS_RRAnswer(AnswerType_A, p_Header, p_u32TTL), - m_IPAddress(0, 0, 0, 0) + stcMDNS_RRAnswer(AnswerType_A, p_Header, p_u32TTL), m_IPAddress(0, 0, 0, 0) { } @@ -1094,8 +1088,8 @@ namespace MDNSImplementation */ MDNSResponder::stcMDNS_RRAnswerSRV::stcMDNS_RRAnswerSRV( const MDNSResponder::stcMDNS_RRHeader& p_Header, uint32_t p_u32TTL) : - stcMDNS_RRAnswer(AnswerType_SRV, p_Header, p_u32TTL), - m_u16Priority(0), m_u16Weight(0), m_u16Port(0) + stcMDNS_RRAnswer(AnswerType_SRV, p_Header, p_u32TTL), m_u16Priority(0), m_u16Weight(0), + m_u16Port(0) { } @@ -1132,8 +1126,7 @@ namespace MDNSImplementation */ MDNSResponder::stcMDNS_RRAnswerGeneric::stcMDNS_RRAnswerGeneric( const stcMDNS_RRHeader& p_Header, uint32_t p_u32TTL) : - stcMDNS_RRAnswer(AnswerType_Generic, p_Header, p_u32TTL), - m_u16RDLength(0), m_pu8RDData(0) + stcMDNS_RRAnswer(AnswerType_Generic, p_Header, p_u32TTL), m_u16RDLength(0), m_pu8RDData(0) { } @@ -1212,8 +1205,7 @@ namespace MDNSImplementation MDNSResponder::stcMDNSService::stcMDNSService(const char* p_pcName /*= 0*/, const char* p_pcService /*= 0*/, const char* p_pcProtocol /*= 0*/) : - m_pNext(0), - m_pcName(0), m_bAutoName(false), m_pcService(0), m_pcProtocol(0), m_u16Port(0), + m_pNext(0), m_pcName(0), m_bAutoName(false), m_pcService(0), m_pcProtocol(0), m_u16Port(0), m_u8ReplyMask(0), m_fnTxtCallback(0) { setName(p_pcName); @@ -1538,9 +1530,7 @@ namespace MDNSImplementation MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP4Address::stcIP4Address constructor */ MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP4Address::stcIP4Address( - IPAddress p_IPAddress, uint32_t p_u32TTL /*= 0*/) : - m_pNext(0), - m_IPAddress(p_IPAddress) + IPAddress p_IPAddress, uint32_t p_u32TTL /*= 0*/) : m_pNext(0), m_IPAddress(p_IPAddress) { m_TTL.set(p_u32TTL); } @@ -2172,9 +2162,8 @@ namespace MDNSImplementation */ MDNSResponder::stcMDNSSendParameter::stcDomainCacheItem::stcDomainCacheItem( const void* p_pHostnameOrService, bool p_bAdditionalData, uint32_t p_u16Offset) : - m_pNext(0), - m_pHostnameOrService(p_pHostnameOrService), m_bAdditionalData(p_bAdditionalData), - m_u16Offset(p_u16Offset) + m_pNext(0), m_pHostnameOrService(p_pHostnameOrService), + m_bAdditionalData(p_bAdditionalData), m_u16Offset(p_u16Offset) { } diff --git a/libraries/I2S/examples/InputSerialPlotter/InputSerialPlotter.ino b/libraries/I2S/examples/InputSerialPlotter/InputSerialPlotter.ino index 50b3206cc7..18f1cad1f9 100644 --- a/libraries/I2S/examples/InputSerialPlotter/InputSerialPlotter.ino +++ b/libraries/I2S/examples/InputSerialPlotter/InputSerialPlotter.ino @@ -21,8 +21,7 @@ void setup() { // start I2S at 8 kHz with 24-bits per sample if (!I2S.begin(I2S_PHILIPS_MODE, 8000, 24)) { Serial.println("Failed to initialize I2S!"); - while (1) - ; // do nothing + while (1); // do nothing } } diff --git a/libraries/I2S/examples/SimpleTone/SimpleTone.ino b/libraries/I2S/examples/SimpleTone/SimpleTone.ino index 689a50d579..e2dcb7b3f6 100644 --- a/libraries/I2S/examples/SimpleTone/SimpleTone.ino +++ b/libraries/I2S/examples/SimpleTone/SimpleTone.ino @@ -26,8 +26,7 @@ void setup() { // start I2S at the sample rate with 16-bits per sample if (!I2S.begin(I2S_PHILIPS_MODE, sampleRate, 16)) { Serial.println("Failed to initialize I2S!"); - while (1) - ; // do nothing + while (1); // do nothing } } diff --git a/libraries/TFT_Touch_Shield_V2/examples/tftbmp/tftbmp.ino b/libraries/TFT_Touch_Shield_V2/examples/tftbmp/tftbmp.ino index 691f5be7ca..55e4981df9 100644 --- a/libraries/TFT_Touch_Shield_V2/examples/tftbmp/tftbmp.ino +++ b/libraries/TFT_Touch_Shield_V2/examples/tftbmp/tftbmp.ino @@ -55,8 +55,7 @@ void setup() { if (!SD.begin(PIN_SD_CS)) { Serial.println("failed!"); - while (1) - ; // init fail, die here + while (1); // init fail, die here } Serial.println("SD OK!"); @@ -69,8 +68,7 @@ void loop() { bmpFile = SD.open(__Gsbmp_files[i]); if (!bmpFile) { Serial.println("didn't find image"); - while (1) - ; + while (1); } if (!bmpReadHeader(bmpFile)) { diff --git a/libraries/TFT_Touch_Shield_V2/examples/tftbmp2/tftbmp2.ino b/libraries/TFT_Touch_Shield_V2/examples/tftbmp2/tftbmp2.ino index 0a698fb150..8e24600481 100644 --- a/libraries/TFT_Touch_Shield_V2/examples/tftbmp2/tftbmp2.ino +++ b/libraries/TFT_Touch_Shield_V2/examples/tftbmp2/tftbmp2.ino @@ -99,8 +99,7 @@ void setup() { if (!SD.begin(PIN_SD_CS)) { Serial.println("failed!"); - while (1) - ; // init fail, die here + while (1); // init fail, die here } Serial.println("SD OK!"); @@ -141,8 +140,7 @@ void loop() { if (!bmpFile) { Serial.println("didn't find image"); - while (1) - ; + while (1); } if (!bmpReadHeader(bmpFile)) { @@ -153,8 +151,7 @@ void loop() { bmpdraw(bmpFile, 0, 0, 1); bmpFile.close(); - while (1) - ; + while (1); } /*********************************************/ diff --git a/libraries/esp8266/examples/SerialStress/SerialStress.ino b/libraries/esp8266/examples/SerialStress/SerialStress.ino index 68a6122582..f491ba04e5 100644 --- a/libraries/esp8266/examples/SerialStress/SerialStress.ino +++ b/libraries/esp8266/examples/SerialStress/SerialStress.ino @@ -81,8 +81,7 @@ void setup() { // bind RX and TX USC0(0) |= (1 << UCLBE); - while (Serial.read() == -1) - ; + while (Serial.read() == -1); if (Serial.hasOverrun()) { logger->print("overrun?\n"); } timeout = (start_ms = last_ms = millis()) + TIMEOUT; diff --git a/tests/clang-format-core.yaml b/tests/clang-format-core.yaml index 540037d13e..0df633d245 100644 --- a/tests/clang-format-core.yaml +++ b/tests/clang-format-core.yaml @@ -27,3 +27,4 @@ BreakBeforeBraces: Allman IndentWidth: 4 IndentCaseLabels: false ReflowComments: false +SkipMacroDefinitionBody: true diff --git a/tests/device/libraries/BSTest/src/BSTest.h b/tests/device/libraries/BSTest/src/BSTest.h index f73de3e471..ba3c9a5c0d 100644 --- a/tests/device/libraries/BSTest/src/BSTest.h +++ b/tests/device/libraries/BSTest/src/BSTest.h @@ -27,8 +27,7 @@ class TestCase public: TestCase(TestCase* prev, test_case_func_t func, const char* file, size_t line, const char* name, const char* desc) : - m_func(func), - m_file(file), m_line(line), m_name(name), m_desc(desc) + m_func(func), m_file(file), m_line(line), m_name(name), m_desc(desc) { if (prev) { diff --git a/tests/host/common/queue.h b/tests/host/common/queue.h index 0bc4ee7bd5..4919ae9fc4 100644 --- a/tests/host/common/queue.h +++ b/tests/host/common/queue.h @@ -184,7 +184,7 @@ struct name \ { \ struct type* stqh_first; /* first element */ \ - struct type** stqh_last; /* addr of last next element */ \ + struct type** stqh_last; /* addr of last next element */ \ } #define STAILQ_HEAD_INITIALIZER(head) \ @@ -371,7 +371,7 @@ struct name \ { \ struct type* tqh_first; /* first element */ \ - struct type** tqh_last; /* addr of last next element */ \ + struct type** tqh_last; /* addr of last next element */ \ } #define TAILQ_HEAD_INITIALIZER(head) \ diff --git a/tests/restyle.sh b/tests/restyle.sh index 6e10cab6a2..3bc90e52f0 100755 --- a/tests/restyle.sh +++ b/tests/restyle.sh @@ -8,16 +8,13 @@ test -d ${root}/cores/esp8266 test -d ${root}/libraries # allow `env CLANG_FORMAT=clang-format-N`, or some other version -# default to v15, latest stable version from ubuntu-latest Github Actions image -CLANG_FORMAT=${CLANG_FORMAT:-clang-format-15} +CLANG_FORMAT=${CLANG_FORMAT:-clang-format} cd $root python $root/tests/restyle.py format --clang-format=$CLANG_FORMAT preset --include core --include arduino -if [ $CI = "true" ] ; then - echo foo +if [ "$CI" = "true" ] ; then python $root/tests/restyle.py assert --with-summary --with-errors else - echo bar python $root/tests/restyle.py assert --with-diff fi From 1a13ab95fb520e294ebffa4ece6b3a1466762604 Mon Sep 17 00:00:00 2001 From: Max Prokhorov Date: Fri, 24 Jan 2025 10:17:51 +0300 Subject: [PATCH 35/50] Stack thunk yield() fixes (#9224) * Update bearssl builder * Keep bssl stack pointer from confusing yield implement stack_thunk_yield() which is called within bssl stack overflow checks for cont would always fail otherwise --- cores/esp8266/StackThunk.cpp | 43 +++++++++++++++++++++++- cores/esp8266/StackThunk.h | 2 ++ tools/sdk/include/bearssl/bearssl_git.h | 2 +- tools/sdk/lib/libbearssl.a | Bin 4557886 -> 4568226 bytes tools/sdk/ssl/bearssl | 2 +- 5 files changed, 46 insertions(+), 3 deletions(-) diff --git a/cores/esp8266/StackThunk.cpp b/cores/esp8266/StackThunk.cpp index 0d2a8a3541..baa793bdc5 100644 --- a/cores/esp8266/StackThunk.cpp +++ b/cores/esp8266/StackThunk.cpp @@ -27,18 +27,26 @@ #include #include #include -#include "pgmspace.h" + #include "debug.h" #include "StackThunk.h" + +#include #include + #include #include extern "C" { +extern void optimistic_yield(uint32_t); + uint32_t *stack_thunk_ptr = NULL; uint32_t *stack_thunk_top = NULL; + uint32_t *stack_thunk_save = NULL; /* Saved A1 while in BearSSL */ +uint32_t *stack_thunk_yield_save = NULL; /* Saved A1 when yielding from within BearSSL */ + uint32_t stack_thunk_refcnt = 0; /* Largest stack usage seen in the wild at 6120 */ @@ -150,4 +158,37 @@ void stack_thunk_fatal_smashing() __stack_chk_fail(); } +/* Called within bearssl code instead of optimistic_yield(...) */ +void stack_thunk_yield(); +asm( + ".section .text.stack_thunk_yield,\"ax\",@progbits\n\t" + ".literal_position\n\t" + ".align 4\n\t" + ".global stack_thunk_yield\n\t" + ".type stack_thunk_yield, @function\n\t" + "\n" +"stack_thunk_yield:\n\t" +/* Keep the original caller */ + "addi a1, a1, -16\n\t" + "s32i.n a0, a1, 12\n\t" +/* Swap bearssl <-> cont stacks */ + "movi a2, stack_thunk_yield_save\n\t" + "s32i.n a1, a2, 0\n\t" + "movi a2, stack_thunk_save\n\t" + "l32i.n a1, a2, 0\n\t" +/* optimistic_yield(10000) without extra l32r */ + "movi a2, 0x10\n\t" + "addmi a2, a2, 0x2700\n\t" + "call0 optimistic_yield\n\t" +/* Swap bearssl <-> cont stacks, again */ + "movi a2, stack_thunk_yield_save\n\t" + "l32i.n a1, a2, 0\n\t" + "\n" +/* Restore caller */ + "l32i.n a0, a1, 12\n\t" + "addi a1, a1, 16\n\t" + "ret.n\n\t" + ".size stack_thunk_yield, .-stack_thunk_yield\n\t" +); + } diff --git a/cores/esp8266/StackThunk.h b/cores/esp8266/StackThunk.h index e72e0efb9f..350775ec24 100644 --- a/cores/esp8266/StackThunk.h +++ b/cores/esp8266/StackThunk.h @@ -31,6 +31,8 @@ extern "C" { #endif +extern void stack_thunk_yield(void); + extern void stack_thunk_add_ref(); extern void stack_thunk_del_ref(); extern void stack_thunk_repaint(); diff --git a/tools/sdk/include/bearssl/bearssl_git.h b/tools/sdk/include/bearssl/bearssl_git.h index abdd61ac02..37fe2a0d36 100644 --- a/tools/sdk/include/bearssl/bearssl_git.h +++ b/tools/sdk/include/bearssl/bearssl_git.h @@ -1,2 +1,2 @@ // Do not edit -- Automatically generated by tools/sdk/ssl/bearssl/Makefile -#define BEARSSL_GIT b024386 +#define BEARSSL_GIT 5166f2b diff --git a/tools/sdk/lib/libbearssl.a b/tools/sdk/lib/libbearssl.a index 70352ab2fc9947fe53b9cf1eb0a0bb71e815fdc0..6b9a77e3f685d68c0bee03dad9f1c7e4db3fc909 100644 GIT binary patch delta 839142 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%0DQdRlcTt&u0%-`pg%A{R(+^m%LfHa=db0 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
<-f$YA?}n8KQUcWJdo#q(uxZnPo{FNaxLYC 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 ZTevvADu#Hxh*CL+u#42gmvZn3_&Xq delta 828491 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Ü{-ZKeCpVnGsUi8B$vmGVU}RZH_lcsVUTv6s`rCd$XL6}F)tmm6Rw?%SY3 zBRC>AhqpT3E4N0RLl#^SeOT@Qf8_Xc$0y`V(Z<`OGcWZE;x-q>f_GeX1iHH3NPXq{FR*zrowkx;5aINmcNDnkiUn$D+8Q_F`3G~y??@XE)~{u9=3aZ zIZJIAZ{)bS9A-tnQ_;@xC62qx0epvf!6bgJG4L=s9v&l?fp3t@!qeo6@SSoM_>*!r!b+_-7d{|!f|xzw9}C%p`<93cO zc8m)F*e7QD%N^Tm0&t7XiXl$LNXIwGFQAQ`<%BXlQ}G?}Jb4$q$njFgs~kV!_}Q>i zcuD4rwe2!zti2+0#@d_m8}Pd_Gen=toW1s?{4V^x{674X%-L(d%i&K@U~i0{%@Np6 zd4fNO?UX0@7+g_pj>FaDZ(uw732oRjtE)K2W*f^t!L4Mb;)>+o;Lh>5q!6E&g>I_& z1Mcm3pySbwCpezuc)BT?jqTb3C-k6v9;<%D@l!GfPc}N3iC7V@is`wAoQ!yuv(|U5st?@wx{}IJxm_XQk=e9t`0A9yj-poM#XBc06!zA!*;S0R!VPD zyg7W3#@olA4;&wHd`xB++dHG5U1{%(ekQwqLmPYUDGTSd03C;;4L$*#;y6{ViFh5k z4$KKoY+nzy^PA+hiZ?;rJEK1r?xJ`r_C$MJDEO|D*^M3Ic(h!IxSimHCn$z*QT#I4 zJBy#T^PA9y_Ri?%QT`&eX98`hHMVOk*a=Qpfc5EY5aKi z`12{_^1tMAh<_v7k3g=7_;2=AV*wWYI6UUUeB0yY>ad;Egm^lfsyJQSahBsoj$1k| zlryocozsMMh8v?`CpDqa6z;7?JQTXd@h~|b@$2Qb@Xc~DJk{}Rxg+BDIJWbc@LU%o zzRX^G0EI3nJfcQ?+n;p&tm92`f3(>y4}f2Bd_d;M^p4|?y~M|M~#N(+3VO=#B))dOplC=lQV6bRU6-b!O#=f_?ryX2i$>T(7c?*)+1C z8&2$t8->bc=1M#S{%C8~jzV;#`IXT%=Hk(KC@^Mp!7XT0ZVcMIbF~>X25tJ9^4FXie&X|FMI=#GY0-tQm?pt*|y9;$t2}1x_pEOl_Q2$SKY^PjEKsqIqzOa|_uA zz;HXVLZw%a9Ko9C7-m3_WQ&gDkWXAmdw)E8Ofh54lM@OqDtZg{^BK_5##Yb2jLF?3 z=EVFDrtzpfiBHeKPn9M5;W#PKR?y#HL_ z301J?@SMzTnH^-p6VP7jsVDrZ+OQLGSndtmK_;}Pzfk;2_*@-R4C9sxI%N5L)SF>ugv2RY1&E>1-cnO&T#On1zzZ-q*!>+saWZFt>b4Ldnu{OSazG@Q{jD% z4>|TyQf%{y;xqC0=lep1*{C=n-wFRHbANcwaRA?2eguqr7p|ne3s=(BoHiNqBE%cY zi{WN84{%v%qlzW)MeA0WcA@V^iJI1lSSS4Q2L2m!;)hbbV7oM+1pTiG1Uh82CeSXXhlcV5naxC0OPJjodFdSk8o3$l35?a((z2xe>fkZVGRfo5Q>0mhfvbdz**71XmD+k5mzYkIL;} zds-gK9bkJ}9(*x;Ms2#lf614@_JWou_kfep@8ZXFIc!hMgZsd>6%Sv9LY4|w!;R#D zaGuQmTwD2C*q)+?6^($qC_WnQC0_^klgGn@WM*nd$&=s-@%a4t>ZYPFRTcD1c{)7T z@j}NB$xPL*cKn3n=NxZwyi2~5LlXAfJ-moJv7*DJ709v3_aJ^mUH~7H*=hYwUJRdh zd{$n9_+K*9ztK4QM!< z#V%AE=3iII%(Fh}*k-WMo@r2fik`ejZJ3#S6E5lhqhQlnXv7M8QA#)+w&^UGvs%8> z!nC~*rQ)%PCGVC!I&y3?RcMok_6-&1e81K*&VxLZ)S4qRARtJ_D0? z%WX!^WOW*jWdf%7y=GO);(fM9XL#_fGXqf_*j~pbT~=%^ND2H}$86Y)Y)d2aKC8~x zS-hnnJ0`yqHVC*-hWcjV_p)cQ;S7zHTMFuB{axCnWy{=r%)x12&)?e2 zYg02L((2`cv4P}ncp*vLymP>J)xrhMD>Dbj>`i0n<>{%sptLEp5umdBP zeTB~=iTNJ?Xq$>b-@yJP4YM(uifM@m(?v*^zUEQBdjFj%nwhv&2(Kg+6IuRR!M1plac@CIv+eDI zGJ0pyz^daraj_J9`NT9$2}eQb3DTF z4RXBs_0fV%rlCu30zz|Sk*iLEUzC}A;m6N-3e3F&T><_`t_(9B$T&Y0{*BNz;6G$0 zUt;lVFkS~v31Bu43;5>P%?_Od=a|H8mD0leOX#Nd%(2*szi2{_RGfJgJ5302nv>(ve!eNGrN*8qO9j3`&E#y@o8D6o?xHx|({W#!iGFWJ58oksS{t6M z1$>>_6u=W5Pp8>4VTCuPr!zcHjhH4`B=>-q$-QB3Mo(Y(NyP`j8y#H zJ_ZiI?-cBWUA!Pxe69F+_(#XQp&Q>u#=TSu?WI!a^3f%2CcxF@n_w@MLf0#ahkX-K zXr@M!;I{G<_#($%`eYj7mn%LUzFM9EU+Z|RJPYxgmXb5NM8Mss0I zJyh56cVS#~p8Q{GwwoWpY2-dnuDe@SAG07|-u}+bh6c&V<>DV@}+= z*~b#Ze^PuY{F}TCKJPdNUrD}b#uFV^a$Fs@Jrg#{R0UHV4dhjD3&#bHz4Qs&cmd+89i+3m#NkeP^h zNA3@YKXD4jtJ!0jl^Qw4j#_ser(F9k9WepvB);l~|saQu?v?J_eOuQ)#7nXm4BuK<54-w*%G z@z;*+eLV1@*~UwO(4520zi_&Yya={eHA0-OrnrIAV7vWi!QRLNjh4f?YD5=0_EH_I z5bvWn?PWI}fyXJn2A(QE4$pCX{{?6Ima6as8m*GqL0%)j;5Ua}O6p_o-B>W&l$o5L z%lQPck!hz3M*9;|YL@g!Yny{F7Hr4S>H42>JbI})&xcgg{TDoJG%J6>A?vlK>KT;Q zm=Smg9L+JC&J;8VJdt4D7*&*kW8S!5am;#ARiwK8ChymRj6hMfl54MA|0|{i^fF=8 z2j(KiORw-UE4X;_LB{T{W_t8VtzweTqTL{qb{6XyRGrrfHo3`3894W296~s@HD~{W z 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 diff --git a/tools/sdk/ssl/bearssl b/tools/sdk/ssl/bearssl index b024386d46..5166f2bb03 160000 --- a/tools/sdk/ssl/bearssl +++ b/tools/sdk/ssl/bearssl @@ -1 +1 @@ -Subproject commit b024386d461abd1b7b9be3117e2516b7541f1201 +Subproject commit 5166f2bb03fb03597b0f2c8c7fbcf01616df67c9 From 7af5246c12703bb2c1c07a087116f0594a8437e4 Mon Sep 17 00:00:00 2001 From: Max Prokhorov Date: Tue, 11 Mar 2025 00:04:47 +0300 Subject: [PATCH 36/50] Docs - fix sphinx v8 builds (#9235) abnormal version selection w/ nbsphinx causing us to fall down to 5.x.x venv install specific versions, fix arguments provided to the sphinx-build --- .github/workflows/documentation.yml | 7 +++++-- doc/Makefile | 2 +- doc/conf.py | 6 +----- doc/requirements.txt | 14 ++++++-------- tests/ci/build_docs.sh | 2 +- 5 files changed, 14 insertions(+), 17 deletions(-) diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index a7c72a0c41..977570aad8 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -24,5 +24,8 @@ jobs: python-version: '3.x' - name: Build documentation run: | - pip install --user -r doc/requirements.txt - bash ./tests/ci/build_docs.sh + pushd doc/ + python3 -mvenv _venv + ./_venv/bin/pip install -r requirements.txt + env SPHINXBUILD=$(pwd)/_venv/bin/sphinx-build ../tests/ci/build_docs.sh + popd diff --git a/doc/Makefile b/doc/Makefile index cbfd6af2ab..61d3e40b3c 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -2,7 +2,7 @@ # # You can set these variables from the command line. -SPHINXOPTS = -W --keep-going -n +SPHINXOPTS = --fail-on-warning --nitpicky SPHINXBUILD = sphinx-build SPHINXPROJ = ESP8266ArduinoCore SOURCEDIR = . diff --git a/doc/conf.py b/doc/conf.py index 958f3cdbd0..0eef82bc24 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -71,7 +71,7 @@ # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This patterns also effect to html_static_path and html_extra_path -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] +exclude_patterns = ['_venv', '_build', 'Thumbs.db', '.DS_Store'] # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' @@ -162,11 +162,7 @@ # # on_rtd is whether we are on readthedocs.org env_readthedocs = os.environ.get('READTHEDOCS', None) -print(env_readthedocs) if not env_readthedocs: # only import and set the theme if we're building docs locally import sphinx_rtd_theme html_theme = 'sphinx_rtd_theme' - html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] - - diff --git a/doc/requirements.txt b/doc/requirements.txt index 8d90d8f59a..6b2684762d 100644 --- a/doc/requirements.txt +++ b/doc/requirements.txt @@ -1,10 +1,8 @@ # Requirements file for pip # list of Python packages used in documentation build -sphinx -sphinx-rtd-theme -breathe -nbsphinx -docutils<0.17 -testresources -#at the time of writing, requirement is pygments<3,>=2.4.1 -pygments>=2.4.1 +sphinx>=8.1.2,<9.0.0 +sphinx-rtd-theme>=3.0.2,<4.0.0 +breathe>=4.36.0,<5.0.0 +nbsphinx>=0.9.7,<1.0.0 +testresources>=2.0.1,<3.0.0 +pygments>=2.19.1,<3.0.0 diff --git a/tests/ci/build_docs.sh b/tests/ci/build_docs.sh index b26852e553..7a5ae2a632 100755 --- a/tests/ci/build_docs.sh +++ b/tests/ci/build_docs.sh @@ -5,4 +5,4 @@ set -ev root=$(git rev-parse --show-toplevel) -env SPHINXOPTS="-W" make -C $root/doc html +make SPHINXOPTS="--fail-on-warning" SPHINXBUILD="${SPHINXBUILD:?sphinx-build}" -C $root/doc html From 587435110f03a3ad53a0cc7144387a353f478521 Mon Sep 17 00:00:00 2001 From: Max Prokhorov Date: Tue, 11 Mar 2025 01:09:35 +0300 Subject: [PATCH 37/50] Docs - readthedocs.io latest (#9236) --- .readthedocs.yaml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 .readthedocs.yaml diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 0000000000..867f3d40de --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,21 @@ +# Read the Docs configuration file for Sphinx projects +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Set the OS, Python version and other tools you might need +build: + os: ubuntu-24.04 + tools: + python: "3.12" + +# Build documentation in the "doc/" directory with Sphinx +sphinx: + configuration: doc/conf.py + +# Install same versions as our local tools +# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html +python: + install: + - requirements: doc/requirements.txt From cd844b99d90248b2fc94bd6f878332fb18734ffd Mon Sep 17 00:00:00 2001 From: Max Prokhorov Date: Tue, 20 May 2025 16:55:20 +0300 Subject: [PATCH 38/50] Docs - default to sphinx_rtd_theme (#9237) following examples and conf.py from sphinx_rtd_theme itself --- doc/conf.py | 41 ++++++++++++++++++----------------------- 1 file changed, 18 insertions(+), 23 deletions(-) diff --git a/doc/conf.py b/doc/conf.py index 0eef82bc24..58df5eb922 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -34,7 +34,9 @@ extensions = [ 'nbsphinx', 'sphinx.ext.mathjax', + 'sphinx_rtd_theme', ] + # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] @@ -49,8 +51,9 @@ # General information about the project. project = u'ESP8266 Arduino Core' -copyright = u'2017, Ivan Grokhotkov' +slug = re.sub(r'\W+', '-', project.lower()) author = u'Ivan Grokhotkov' +copyright = author # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the @@ -71,7 +74,13 @@ # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This patterns also effect to html_static_path and html_extra_path -exclude_patterns = ['_venv', '_build', 'Thumbs.db', '.DS_Store'] +exclude_patterns = [ + '_readthedocs', + '_venv', + '_build', + 'Thumbs.db', + '.DS_Store', +] # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' @@ -85,7 +94,7 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -html_theme = 'default' +html_theme = 'sphinx_rtd_theme' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the @@ -98,12 +107,12 @@ # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] - # -- Options for HTMLHelp output ------------------------------------------ -# Output file base name for HTML help builder. -htmlhelp_basename = 'ESP8266ArduinoCoredoc' +html_show_sourcelink = True +# Output file base name for HTML help builder. +htmlhelp_basename = slug # -- Options for LaTeX output --------------------------------------------- @@ -129,8 +138,7 @@ # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - (master_doc, 'ESP8266ArduinoCore.tex', u'ESP8266 Arduino Core Documentation', - u'Ivan Grokhotkov', 'manual'), + (master_doc, f'{slug}.tex', f'{project} Documentation', author, 'manual'), ] @@ -139,8 +147,7 @@ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - (master_doc, 'esp8266arduinocore', u'ESP8266 Arduino Core Documentation', - [author], 1) + (master_doc, slug, f'{project} Documentation', [author], 1) ] @@ -150,19 +157,7 @@ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - (master_doc, 'ESP8266ArduinoCore', u'ESP8266 Arduino Core Documentation', - author, 'ESP8266ArduinoCore', 'One line description of project.', - 'Miscellaneous'), + (master_doc, slug, f'{project} Documentation', author, slug, project, 'Miscellaneous'), ] linkcheck_anchors_ignore = ["/#!"] - -# -- Use sphinx_rtd_theme for local builds -------------------------------- -# ref. https://github.com/snide/sphinx_rtd_theme#using-this-theme-locally-then-building-on-read-the-docs -# -# on_rtd is whether we are on readthedocs.org -env_readthedocs = os.environ.get('READTHEDOCS', None) - -if not env_readthedocs: # only import and set the theme if we're building docs locally - import sphinx_rtd_theme - html_theme = 'sphinx_rtd_theme' From 8e2094eb08d7bc6e345e997a852e202b75ca1c14 Mon Sep 17 00:00:00 2001 From: Max Prokhorov Date: Tue, 20 May 2025 18:41:11 +0300 Subject: [PATCH 39/50] CI - build with arduino-cli (#9241) Sync with GCC14 branch test scripts Remove explicit IDE, HARDWARE & LIBRARIES envirnoment in workflows in favour of script defaults Remove explicit dependency on IDE & HARDWARE path, assume arduino-cli default paths Remove explicit library install for platformio, share library path & downloaded libraries with arduino Bump ConfigFile dependencies, set ArduinoJson to v7 & update blob install script --- .github/workflows/build-ide.yml | 5 - .../examples/ConfigFile/ConfigFile.ino | 6 +- tests/build.sh | 49 ++- tests/common.sh | 368 +++++++++--------- tests/dep-arduino-cli.sh | 27 ++ tests/dep-libraries.sh | 6 + tests/lib-skip-ino.sh | 53 +++ 7 files changed, 311 insertions(+), 203 deletions(-) create mode 100644 tests/dep-arduino-cli.sh create mode 100644 tests/dep-libraries.sh create mode 100644 tests/lib-skip-ino.sh diff --git a/.github/workflows/build-ide.yml b/.github/workflows/build-ide.yml index 565b08d392..edc226b4d9 100644 --- a/.github/workflows/build-ide.yml +++ b/.github/workflows/build-ide.yml @@ -52,7 +52,6 @@ jobs: - name: Build Sketches env: ESP8266_ARDUINO_BUILDER: "arduino" - ESP8266_ARDUINO_IDE: "${{ runner.temp }}/arduino_ide" ESP8266_ARDUINO_LWIP: ${{ matrix.lwip }} run: | bash ./tests/build.sh 8 ${{ matrix.chunk }} @@ -75,8 +74,6 @@ jobs: key: ${{ runner.os }}-${{ hashFiles('package/package_esp8266com_index.template.json', 'tests/common.sh', 'tests/build.sh') }} - name: Build Sketch env: - ESP8266_ARDUINO_HARDWARE: "${{ runner.temp }}/hardware" - ESP8266_ARDUINO_IDE: "${{ runner.temp }}/arduino_ide" ESP8266_ARDUINO_SKETCHES: "libraries/esp8266/examples/Blink/Blink.ino" run: | bash ./tests/build.sh @@ -100,8 +97,6 @@ jobs: key: ${{ runner.os }}-${{ hashFiles('package/package_esp8266com_index.template.json', 'tests/common.sh', 'tests/build.sh') }} - name: Build Sketch env: - ESP8266_ARDUINO_HARDWARE: "${{ runner.temp }}/hardware" - ESP8266_ARDUINO_IDE: "${{ runner.temp }}/arduino_ide" ESP8266_ARDUINO_SKETCHES: "libraries/esp8266/examples/Blink/Blink.ino" run: | bash ./tests/build.sh diff --git a/libraries/esp8266/examples/ConfigFile/ConfigFile.ino b/libraries/esp8266/examples/ConfigFile/ConfigFile.ino index d0406a3882..c5d8ee8ed2 100644 --- a/libraries/esp8266/examples/ConfigFile/ConfigFile.ino +++ b/libraries/esp8266/examples/ConfigFile/ConfigFile.ino @@ -12,7 +12,7 @@ #include // more and possibly updated information can be found at: -// https://arduinojson.org/v6/example/config/ +// https://arduinojson.org/v7/example/config/ bool loadConfig() { File configFile = LittleFS.open("/config.json", "r"); @@ -21,7 +21,7 @@ bool loadConfig() { return false; } - StaticJsonDocument<200> doc; + JsonDocument doc; auto error = deserializeJson(doc, configFile); if (error) { Serial.println("Failed to parse config file"); @@ -42,7 +42,7 @@ bool loadConfig() { } bool saveConfig() { - StaticJsonDocument<200> doc; + JsonDocument doc; doc["serverName"] = "api.example.com"; doc["accessToken"] = "128du9as8du12eoue8da98h123ueh9h98"; diff --git a/tests/build.sh b/tests/build.sh index 6e544b9b18..af34287a8a 100755 --- a/tests/build.sh +++ b/tests/build.sh @@ -1,19 +1,40 @@ #!/usr/bin/env bash +# expect to have git available root=$(git rev-parse --show-toplevel) +# general configuration related to the builder itself ESP8266_ARDUINO_BUILD_DIR=${ESP8266_ARDUINO_BUILD_DIR:-$root} ESP8266_ARDUINO_BUILDER=${ESP8266_ARDUINO_BUILDER:-arduino} ESP8266_ARDUINO_PRESERVE_CACHE=${ESP8266_ARDUINO_PRESERVE_CACHE:-} -ESP8266_ARDUINO_IDE=${ESP8266_ARDUINO_IDE:-$HOME/arduino_ide} -ESP8266_ARDUINO_HARDWARE=${ESP8266_ARDUINO_HARDWARE:-$HOME/Arduino/hardware} -ESP8266_ARDUINO_LIBRARIES=${ESP8266_ARDUINO_LIBRARIES:-$HOME/Arduino/libraries} - +# sketch build options ESP8266_ARDUINO_DEBUG=${ESP8266_ARDUINO_DEBUG:-nodebug} ESP8266_ARDUINO_LWIP=${ESP8266_ARDUINO_LWIP:-default} ESP8266_ARDUINO_SKETCHES=${ESP8266_ARDUINO_SKETCHES:-} +ESP8266_ARDUINO_CLI=${ESP8266_ARDUINO_CLI:-$HOME/.local/bin/arduino-cli} + +# ref. https://arduino.github.io/arduino-cli/1.2/configuration/#default-directories +case "${RUNNER_OS:-Linux}" in +"Linux") + ESP8266_ARDUINO_HARDWARE=${ESP8266_ARDUINO_HARDWARE:-$HOME/Arduino/hardware} + ESP8266_ARDUINO_LIBRARIES=${ESP8266_ARDUINO_LIBRARIES:-$HOME/Arduino/libraries} + ;; +"macOS") + ESP8266_ARDUINO_HARDWARE=${ESP8266_ARDUINO_HARDWARE:-$HOME/Documents/Arduino/hardware} + ESP8266_ARDUINO_LIBRARIES=${ESP8266_ARDUINO_LIBRARIES:-$HOME/Documents/Arduino/libraries} + ;; +"Windows") + ESP8266_ARDUINO_HARDWARE=${ESP8266_ARDUINO_HARDWARE:-$HOME/Documents/Arduino/hardware} + ESP8266_ARDUINO_LIBRARIES=${ESP8266_ARDUINO_LIBRARIES:-$HOME/Documents/Arduino/libraries} + ;; +*) + echo 'Unknown ${RUNNER_OS} = "' ${RUNNER_OS} '"' + exit 2 +esac + +source "$root/tests/lib-skip-ino.sh" source "$root/tests/common.sh" cmd=${0##*/} @@ -22,8 +43,7 @@ ENVIRONMENT: ESP8266_ARDUINO_SKETCHES - list of .ino files; defaults to **all available examples** ESP8266_ARDUINO_BUILDER - arduino or platformio - For Arduino IDE: - ESP8266_ARDUINO_IDE - path to the IDE (portable) + For Arduino CLI: ESP8266_ARDUINO_HARDWARE - path to the hardware directory (usually, containing our repo) ESP8266_ARDUINO_LIBRATIES - path to the libraries directory (external dependencies) ESP8266_ARDUINO_DEBUG - debug or nodebug @@ -31,12 +51,14 @@ ENVIRONMENT: USAGE: $cmd <[even | odd]> - build every Nth, when ' % 2' is either even or odd - $cmd - build every Nth, when ' % ' is equal to 'rem' + $cmd <[cnt]> - build every Nth, when ' % ' is equal to 'rem' + optionally, set to start with the Nth sketch $cmd - build every .ino file from ESP8266_ARDUINO_SKETCHES " mod=1 rem=0 +cnt=0 if [ "$#" -eq 1 ] ; then case "$1" in @@ -60,6 +82,10 @@ if [ "$#" -eq 1 ] ; then elif [ "$#" -eq 2 ] ; then mod=$1 rem=$2 +elif [ "$#" -eq 3 ] ; then + mod=$1 + rem=$2 + cnt=$3 elif [ "$#" -gt 2 ] ; then echo "$usage" exit 1 @@ -72,14 +98,17 @@ fi case "$ESP8266_ARDUINO_BUILDER" in "arduino") install_arduino "$ESP8266_ARDUINO_DEBUG" - build_sketches_with_arduino "$mod" "$rem" "$ESP8266_ARDUINO_LWIP" + build_sketches_with_arduino "$ESP8266_ARDUINO_LWIP" "$mod" "$rem" "$cnt" ;; "platformio") install_platformio nodemcuv2 - build_sketches_with_platformio "$mod" "$rem" + build_sketches_with_platformio "$mod" "$rem" "$cnt" + ;; +"print") + print_sketch_info "$mod" "$rem" ;; *) - echo "Unknown builder! Must be either arduino or platformio" + echo "Unknown builder! Must be one of - arduino, platformio or print" exit 1 ;; esac diff --git a/tests/common.sh b/tests/common.sh index f05eb6b37a..aa75422358 100755 --- a/tests/common.sh +++ b/tests/common.sh @@ -16,6 +16,16 @@ function trap_exit() exit $exit_code } +if [ "${CI-}" = "true" ] ; then + ci_group="::group::" + ci_end_group="::endgroup::" + ci_error="::error::" +else + ci_group="==> " + ci_end_group="" + ci_error=">>> " +fi + function step_summary() { local header=$1 @@ -31,50 +41,6 @@ function step_summary() fi } -# return 0 if this sketch should not be built in CI (for other archs, not needed, etc.) -function skip_ino() -{ - case $1 in - *"/#attic/"* | \ - *"/AvrAdcLogger/"* | \ - *"/examplesV1/"* | \ - *"/RtcTimestampTest/"* | \ - *"/SoftwareSpi/"* | \ - *"/TeensyDmaAdcLogger/"* | \ - *"/TeensyRtcTimestamp/"* | \ - *"/TeensySdioDemo/"* | \ - *"/TeensySdioLogger/"* | \ - *"/UserChipSelectFunction/"* | \ - *"/UserSPIDriver/"* | \ - *"/onewiretest/"* | \ - *"/debug/"*) - return 0 - ;; - *"Teensy"*) - return 0 - ;; - *) - ;; - esac - - return 1 -} - -# return reason if this sketch is not the main one or it is explicitly disabled with .test.skip in its directory -function skip_sketch() -{ - local sketch=$1 - local sketchname=$2 - local sketchdir=$3 - local sketchdirname=$4 - - if [[ "${sketchdirname}.ino" != "$sketchname" ]]; then - echo "Skipping $sketch (not the main sketch file)" - fi - if skip_ino "$sketch" || [[ -f "$sketchdir/.test.skip" ]]; then - echo "Skipping $sketch" - fi -} function print_size_info_header() { @@ -107,37 +73,74 @@ END { awk -v sketch_name="${elf_name%.*}" "$awk_script" - } +function print_sketch_info() +{ + local build_mod=$1 + local build_rem=$2 + + local testcnt=0 + local cnt=0 + + for sketch in $ESP8266_ARDUINO_SKETCHES; do + testcnt=$(( ($testcnt + 1) % $build_mod )) + if [ $testcnt -ne $build_rem ]; then + continue # Not ours to do + fi + + local skip + skip=$(skip_sketch "$sketch") + if [ -n "$skip" ]; then + continue # Should be skipped / cannot be built + fi + + cnt=$(( $cnt + 1 )) + printf '%2d\t%s\n' "$cnt" "$sketch" + done +} + +function format_fqbn() +{ + local board_name=$1 + local flash_size=$2 + local lwip=$3 + + echo "esp8266com:esp8266:${board_name}:"\ +"eesz=${flash_size},"\ +"ip=${lwip}" +} + function build_sketches() { local core_path=$1 - local ide_path=$2 - local hardware_path=$3 - local library_path=$4 + local cli_path=$2 + local library_path=$3 + local lwip=$4 local build_mod=$5 local build_rem=$6 - local lwip=$7 + local build_cnt=$7 local build_dir="$cache_dir"/build mkdir -p "$build_dir" - local build_cache="$cache_dir"/cache - mkdir -p "$build_cache" + local build_out="$cache_dir"/out + mkdir -p "$build_out" + + local fqbn=$(format_fqbn "generic" "4M1M" "$lwip") + echo "FQBN: $fqbn" local build_cmd - build_cmd="python3 tools/build.py"\ -" --build_cache $build_cache"\ -" --build_path $build_dir"\ -" --hardware_path $hardware_path"\ -" --ide_path $ide_path"\ -" --library_path $library_path"\ -" --lwIP $lwip"\ -" --board_name generic --verbose --warnings all"\ -" --flash_size 4M1M --keep" + build_cmd+=${cli_path} + build_cmd+=" compile"\ +" --build-path $build_dir"\ +" --fqbn $fqbn"\ +" --libraries $library_path"\ +" --output-dir $build_out" print_size_info_header >"$cache_dir"/size.log - local mk_clean_core=1 + local clean_core=1 local testcnt=0 + local cnt=0 for sketch in $ESP8266_ARDUINO_SKETCHES; do testcnt=$(( ($testcnt + 1) % $build_mod )) @@ -145,44 +148,24 @@ function build_sketches() continue # Not ours to do fi - # mkbuildoptglobals.py is optimized around the Arduino IDE 1.x - # behaviour. One way the CI differs from the Arduino IDE is in the - # handling of core and caching core. With the Arduino IDE, each sketch - # has a private copy of core and contributes to a core cache. With the - # CI, there is one shared copy of core for all sketches. When global - # options are used, the shared copy of core and cache are removed before - # and after the build. - # - # Do we need a clean core build? $build_dir/core/* cannot be shared - # between sketches when global options are present. - if [ -s ${sketch}.globals.h ]; then - mk_clean_core=1 - fi - if [ $mk_clean_core -ne 0 ]; then - rm -rf "$build_dir"/core/* - else - # Remove sketch specific files from ./core/ between builds. - rm -rf "$build_dir/core/build.opt" "$build_dir"/core/*.ino.globals.h + local skip + skip=$(skip_sketch "$sketch") + if [ -n "$skip" ]; then + echo "$skip" + continue # Should be skipped / cannot be built fi - if [ -e $cache_dir/core/*.a ]; then - # We need to preserve the build.options.json file and replace the last .ino - # with this sketch's ino file, or builder will throw everything away. - jq '."sketchLocation" = "'$sketch'"' $build_dir/build.options.json \ - > "$build_dir"/build.options.json.tmp - mv "$build_dir"/build.options.json.tmp "$build_dir"/build.options.json - if [ $mk_clean_core -ne 0 ]; then - # Hack workaround for CI not handling core rebuild for global options - rm $cache_dir/core/*.a + cnt=$(( $cnt + 1 )) + if [ $build_cnt != 0 ] ; then + if [ $build_cnt != $cnt ] ; then + continue # Haven't reached the $cnt yet fi + build_cnt=0 fi - if [ -s ${sketch}.globals.h ]; then - # Set to cleanup core at the start of the next build. - mk_clean_core=1 - else - mk_clean_core=0 - fi + # Do we need a clean core build? $build_dir/core/* cannot be shared + # between sketches when global options are present. + clean_core=$(arduino_mkbuildoptglobals_cleanup "$clean_core" "$build_dir" "$sketch") # Clear out the last built sketch, map, elf, bin files, but leave the compiled # objects in the core and libraries available for use so we don't need to rebuild @@ -192,23 +175,7 @@ function build_sketches() "$build_dir"/*.map \ "$build_dir"/*.elf - local sketchdir - sketchdir=$(dirname $sketch) - - local sketchdirname - sketchdirname=$(basename $sketchdir) - - local sketchname - sketchname=$(basename $sketch) - - local skip - skip=$(skip_sketch "$sketch" "$sketchname" "$sketchdir" "$sketchdirname") - if [ -n "$skip" ]; then - echo "$skip" - continue - fi - - echo ::group::Building $sketch + echo ${ci_group}Building $cnt $sketch echo "$build_cmd $sketch" local result @@ -216,9 +183,9 @@ function build_sketches() && result=0 || result=1 if [ $result -ne 0 ]; then - echo ::error::Build failed for $sketch + echo ${ci_error}Build failed for $cnt $sketch cat "$cache_dir/build.log" - echo ::endgroup:: + echo $ci_end_group return $result else grep -s -c warning: "$cache_dir"/build.log \ @@ -228,7 +195,7 @@ function build_sketches() print_size_info "$core_path"/tools/xtensa-lx106-elf/bin/xtensa-lx106-elf-size \ $build_dir/*.elf >>$cache_dir/size.log - echo ::endgroup:: + echo $ci_end_group done } @@ -278,14 +245,15 @@ function install_library() { local lib_path=$1 local name=$2 - local archive=$3 - local hash=$4 - local url=$5 + local extract=$3 + local archive=$4 + local hash=$5 + local url=$6 fetch_and_unpack "$archive" "$hash" "$url" mkdir -p "$lib_path" rm -rf "$lib_path/$name" - mv "$name" "$lib_path/$name" + mv "$extract" "$lib_path/$name" } function install_libraries() @@ -296,49 +264,30 @@ function install_libraries() mkdir -p "$core_path"/tools/dist pushd "$core_path"/tools/dist - install_library "$lib_path" \ - "ArduinoJson" \ - "ArduinoJson-v6.11.5.zip" \ - "8b836c862e69e60c4357a5ed7cbcf1310a3bb1c6bd284fe028faaa3d9d7eed319d10febc8a6a3e06040d1c73aaba5ca487aeffe87ae9388dc4ae1677a64d602c" \ - "https://github.com/bblanchon/ArduinoJson/releases/download/v6.11.5/ArduinoJson-v6.11.5.zip" + source "$root/tests/dep-libraries.sh" popd } -function install_ide() +function install_arduino_cli() { - # TODO replace ide distribution + arduino-builder with arduino-cli - local idever='1.8.19' - local ideurl="https://downloads.arduino.cc/arduino-$idever" + local path=$1 + local core_path=$2 - echo "Arduino IDE ${idever}" + local ver='1.2.2' + local urlbase="https://github.com/arduino/arduino-cli/releases/download/v${ver}/arduino-cli_${ver}_" - local core_path=$1 - local ide_path=$2 + echo "Arduino CLI ${ver}" - mkdir -p ${core_path}/tools/dist - pushd ${core_path}/tools/dist + mkdir -p ${core_path}/dist + pushd ${core_path}/dist - if [ "${RUNNER_OS-}" = "Windows" ]; then - fetch_and_unpack "arduino-windows.zip" \ - "c4072d808aea3848bceff5772f9d1e56a0fde02366b5aa523d10975c54eee2ca8def25ee466abbc88995aa323d475065ad8eb30bf35a2aaf07f9473f9168e2da" \ - "${ideurl}-windows.zip" - mv arduino-$idever arduino-distrib - elif [ "${RUNNER_OS-}" = "macOS" ]; then - fetch_and_unpack "arduino-macos.zip" \ - "053b0c1e70da9176680264e40fcb9502f45ca5a879aeb8b6f71282b38bfdb87c63ebc6b88e35ea70a73720ad439d828cc8cb110e4c6ab07357126a36ee396325" \ - "${ideurl}-macosx.zip" - # Hack to place arduino-builder in the same spot as sane OSes - mv Arduino.app arduino-distrib - mv arduino-distrib/Contents/Java/* arduino-distrib/. - else - fetch_and_unpack "arduino-linux.tar.xz" \ - "9328abf8778200019ed40d4fc0e6afb03a4cee8baaffbcea7dd3626477e14243f779eaa946c809fb153a542bf2ed60cf11a5f135c91ecccb1243c1387be95328" \ - "${ideurl}-linux64.tar.xz" - mv arduino-$idever arduino-distrib - fi + source "$root/tests/dep-arduino-cli.sh" + + mkdir -p $(dirname $path) + cp -v arduino-cli $path + chmod +x $path - mv arduino-distrib "$ide_path" popd } @@ -385,19 +334,19 @@ function install_core() function install_arduino() { - echo ::group::Install arduino + echo ${ci_group}Install arduino local debug=$1 - test -d "$ESP8266_ARDUINO_IDE" \ - || install_ide "$ESP8266_ARDUINO_BUILD_DIR" "$ESP8266_ARDUINO_IDE" - local hardware_core_path="$ESP8266_ARDUINO_HARDWARE/esp8266com/esp8266" test -d "$hardware_core_path" \ || install_core "$ESP8266_ARDUINO_BUILD_DIR" "$hardware_core_path" "$debug" + command -v "${ESP8266_ARDUINO_CLI}" \ + || install_arduino_cli "${ESP8266_ARDUINO_CLI}" "$hardware_core_path" + install_libraries "$ESP8266_ARDUINO_BUILD_DIR" "$ESP8266_ARDUINO_LIBRARIES" - echo ::endgroup:: + echo $ci_end_group } function arduino_lwip_menu_option() @@ -412,25 +361,71 @@ function arduino_lwip_menu_option() esac } -function build_sketches_with_arduino() +# mkbuildoptglobals.py is optimized around the Arduino IDE 1.x +# behaviour. One way the CI differs from the Arduino IDE is in the +# handling of core and caching core. With the Arduino IDE, each sketch +# has a private copy of core and contributes to a core cache. With the +# CI, there is one shared copy of core for all sketches. When global +# options are used, the shared copy of core and cache are removed before +# and after the build. +function arduino_mkbuildoptglobals_cleanup() { - local build_mod=$1 - local build_rem=$2 + local clean_core=$1 + local build_dir=$2 + local sketch=$3 + + if [ -s ${sketch}.globals.h ]; then + clean_core=1 + fi + + # Remove sketch specific files from ./core/ between builds. + if [ $clean_core -ne 0 ]; then + rm -rf "$build_dir"/core/* + else + rm -rf "$build_dir/core/build.opt" "$build_dir"/core/*.ino.globals.h + fi + if [ -e ${build_dir}/core/*.a ]; then + # We need to preserve the build.options.json file and replace the last .ino + # with this sketch's ino file, or builder will throw everything away. + jq '."sketchLocation" = "'$sketch'"' $build_dir/build.options.json \ + > "$build_dir"/build.options.json.tmp + mv "$build_dir"/build.options.json.tmp "$build_dir"/build.options.json + if [ $clean_core -ne 0 ]; then + # Hack workaround for CI not handling core rebuild for global options + rm ${build_dir}/core/*.a + fi + fi + + if [ -s ${sketch}.globals.h ]; then + # Set to cleanup core at the start of the next build. + clean_core=1 + else + clean_core=0 + fi + + echo $clean_core +} + +function build_sketches_with_arduino() +{ local lwip - lwip=$(arduino_lwip_menu_option $3) + lwip=$(arduino_lwip_menu_option $1) + + local build_mod=$2 + local build_rem=$3 + local build_cnt=$4 build_sketches "$ESP8266_ARDUINO_BUILD_DIR" \ - "$ESP8266_ARDUINO_IDE" \ - "$ESP8266_ARDUINO_HARDWARE" \ + "$ESP8266_ARDUINO_CLI" \ "$ESP8266_ARDUINO_LIBRARIES" \ - "$build_mod" "$build_rem" "$lwip" + "$lwip" "$build_mod" "$build_rem" "$build_cnt" step_summary "Size report" "$cache_dir/size.log" } function install_platformio() { - echo ::group::Install PlatformIO + echo ${ci_group}Install PlatformIO local board=$1 @@ -438,6 +433,8 @@ function install_platformio() python3 get.py -q popd + install_libraries "$ESP8266_ARDUINO_BUILD_DIR" "$ESP8266_ARDUINO_LIBRARIES" + # we should reference our up-to-date build tools # ref. https://docs.platformio.org/en/latest/core/userguide/pkg/cmd_install.html pio pkg install --global --skip-dependencies --platform "https://github.com/platformio/platform-espressif8266.git" @@ -445,9 +442,11 @@ function install_platformio() local framework_symlink="framework-arduinoespressif8266 @ symlink://${ESP8266_ARDUINO_BUILD_DIR}" local toolchain_symlink="toolchain-xtensa @ symlink://${ESP8266_ARDUINO_BUILD_DIR}/tools/xtensa-lx106-elf/" - # pre-generate config; pio-ci with multiple '-O' replace each other instead of appending to the same named list - # (and, it is much nicer to write this instead of a multi-line cmdline with several large strings) + # pre-generate config; pio-ci with multiple '-O' options replace each other instead of appending to the same named list cat < $cache_dir/platformio.ini +[platformio] +lib_dir = + ${ESP8266_ARDUINO_LIBRARIES} [env:$board] platform = espressif8266 board = $board @@ -457,17 +456,14 @@ platform_packages = ${toolchain_symlink} EOF - # Install dependencies: - # - esp8266/examples/ConfigFile - pio pkg install --global --library "ArduinoJson@^6.11.0" - - echo ::endgroup:: + echo $ci_end_group } function build_sketches_with_platformio() { local build_mod=$1 local build_rem=$2 + local build_cnt=$3 local testcnt=0 for sketch in $ESP8266_ARDUINO_SKETCHES; do @@ -476,23 +472,25 @@ function build_sketches_with_platformio() continue # Not ours to do fi - local sketchdir - sketchdir=$(dirname $sketch) - - local sketchdirname - sketchdirname=$(basename $sketchdir) - - local sketchname - sketchname=$(basename $sketch) - local skip - skip=$(skip_sketch "$sketch" "$sketchname" "$sketchdir" "$sketchdirname") + skip=$(skip_sketch "$sketch") if [ -n "$skip" ]; then echo "$skip" - continue + continue # Should be skipped / cannot be built fi - echo ::group::Building $sketch + cnt=$(( $cnt + 1 )) + if [ $build_cnt != 0 ] ; then + if [ $build_cnt != $cnt ] ; then + continue # Haven't reached the $cnt yet + fi + build_cnt=0 + fi + + echo ${ci_group}Building $sketch + + local sketchdir + sketchdir=$(dirname $sketch) local result time pio ci \ @@ -502,13 +500,13 @@ function build_sketches_with_platformio() && result=0 || result=1 if [ $result -ne 0 ]; then - echo ::error::Build failed for $sketch + echo ${ci_error}Build failed for $sketch cat "$cache_dir/build.log" - echo ::endgroup:: + echo $ci_end_group return $result fi - echo ::endgroup:: + echo $ci_end_group done } diff --git a/tests/dep-arduino-cli.sh b/tests/dep-arduino-cli.sh new file mode 100644 index 0000000000..aa46e3d458 --- /dev/null +++ b/tests/dep-arduino-cli.sh @@ -0,0 +1,27 @@ +case "${RUNNER_OS-}" in +"Linux") + fetch_and_unpack "Linux_64bit.tar.gz" \ + "d421e2b1cbef59c41e46cf06d077214a1d24cb784030462763781c9d3911cc55257fbcc02a7ee6a2ddda5b459101dc83aeda6b3b5198805bfdce856f82774c93" \ + "${urlbase}Linux_64bit.tar.gz" + ;; +"Windows") + fetch_and_unpack "Windows_64bit.zip" \ + "05b4eb5820fbaf670de00399d40513ecf2de9d0c2c5593a1227be03b2d11ba53e9d14cf6f934110447d6fd15c6a09769606a34fcab32ec3c2dbaa42f4627b072" \ + "${urlbase}Windows_64bit.zip" + ;; +"macOS") + if [ "${RUNNER_ARCH-}" = "ARM64" ] ; then + fetch_and_unpack "macOS_ARM64.tar.gz" \ + "672693418b730d8ebc57cae2c892553e821706bee06312cc77a598e834afcba7d380df4d337138ecc03a4013a349d89b744b2a3b97fafc214b619856d9162827" \ + "${urlbase}macOS_ARM64.tar.gz" + else + fetch_and_unpack "macOS_64bit.tar.gz" \ + "5659f08d787840aa6689fd063477402b4ed572663fea20de496b249d86a440059e3e6f377bd8020fb6b67202c1bdea6f98a4c4e052c31f01b2c9027ebec10b04" \ + "${urlbase}macOS_64bit.tar.gz" + fi + ;; +*) + echo 'Unknown ${RUNNER_OS} = "' ${RUNNER_OS} '"' + exit 2 +esac + diff --git a/tests/dep-libraries.sh b/tests/dep-libraries.sh new file mode 100644 index 0000000000..cd3b2124c8 --- /dev/null +++ b/tests/dep-libraries.sh @@ -0,0 +1,6 @@ +install_library "$lib_path" \ + "ArduinoJson" \ + "ArduinoJson-7.4.1" \ + "ArduinoJson-v7.4.1.zip" \ + "1bfbc4aa3e4aa3c8e38f660333b6d5129b0443dbd0fd1eb448d14c7f041ffd2df782951ce622c6da50e2a07dcfcd268727b1f0a000211b9a5a92a806b1645bc0" \ + "https://github.com/bblanchon/ArduinoJson/archive/refs/tags/v7.4.1.zip" diff --git a/tests/lib-skip-ino.sh b/tests/lib-skip-ino.sh new file mode 100644 index 0000000000..6bcfe15a6c --- /dev/null +++ b/tests/lib-skip-ino.sh @@ -0,0 +1,53 @@ +# return 0 if this sketch should not be built in CI (for other archs, not needed, etc.) +function skip_ino() +{ + local ino=$1 + + case "$ino" in + *"/#attic/"* | \ + *"/AvrAdcLogger/"* | \ + *"/RtcTimestampTest/"* | \ + *"/SoftwareSpi/"* | \ + *"/TeensyDmaAdcLogger/"* | \ + *"/TeensyRtcTimestamp/"* | \ + *"/TeensySdioDemo/"* | \ + *"/TeensySdioLogger/"* | \ + *"/UnicodeFilenames/"* | \ + *"/UserChipSelectFunction/"* | \ + *"/UserSPIDriver/"* | \ + *"/debug/"* | \ + *"/examplesV1/"* | \ + *"/onewiretest/"*) + return 0 + ;; + *"Teensy"*) + return 0 + ;; + *) + ;; + esac + + return 1 +} + +# return reason if this sketch is not the main one or it is explicitly disabled with .test.skip in its directory +function skip_sketch() +{ + local sketch=$1 + + local sketchdir + sketchdir=$(dirname $sketch) + + local sketchdirname + sketchdirname=$(basename $sketchdir) + + local sketchname + sketchname=$(basename $sketch) + + if [[ "${sketchdirname}.ino" != "$sketchname" ]]; then + echo "Skipping $sketch (not the main sketch file)" + fi + if skip_ino "$sketch" || [[ -f "$sketchdir/.test.skip" ]]; then + echo "Skipping $sketch" + fi +} From 606324ccf8d18c273734aa4c67ae9630a6674c6d Mon Sep 17 00:00:00 2001 From: Max Prokhorov Date: Tue, 20 May 2025 19:18:27 +0300 Subject: [PATCH 40/50] CI - Python deprecations (#9242) py3.13 - https://docs.python.org/3/library/re.html#re.sub > Deprecated since version 3.13: Passing count and flags as positional arguments is deprecated. In future Python versions they will be keyword-only parameters. py3.12 - https://docs.python.org/3/library/tarfile.html#tarfile.TarFile.extraction_filter > If extraction_filter is None (the default), calling an extraction method without a filter argument will raise a DeprecationWarning, and fall back to the fully_trusted filter, whose dangerous behavior matches previous versions of Python. --- tools/boards.txt.py | 2 +- tools/get.py | 16 +++++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/tools/boards.txt.py b/tools/boards.txt.py index 0ccfa8f4d9..576e02a614 100755 --- a/tools/boards.txt.py +++ b/tools/boards.txt.py @@ -1877,7 +1877,7 @@ def package (): substitution += ',\n'.join(board_items) substitution += '\n ],' - newfilestr = re.sub(r'"boards":[^\]]*\],', substitution, filestr, re.MULTILINE) + newfilestr = re.sub(r'"boards":[^\]]*\],', substitution, filestr, flags=re.MULTILINE) # To get consistent indent/formatting read the JSON and write it out programmatically if packagegen: diff --git a/tools/get.py b/tools/get.py index 8276a46f21..81de20e1b9 100755 --- a/tools/get.py +++ b/tools/get.py @@ -18,11 +18,12 @@ verbose = True -if sys.version_info[0] == 3: - from urllib.request import urlretrieve +from urllib.request import urlretrieve + +if sys.version_info >= (3,12): + TARFILE_EXTRACT_ARGS = {'filter': 'data'} else: - # Not Python 3 - today, it is most likely to be Python 2 - from urllib import urlretrieve + TARFILE_EXTRACT_ARGS = {} dist_dir = 'dist/' @@ -51,9 +52,10 @@ def report_progress(count, blockSize, totalSize): def unpack(filename, destination): dirname = '' print('Extracting {0}'.format(filename)) - if filename.endswith('tar.gz'): - tfile = tarfile.open(filename, 'r:gz') - tfile.extractall(destination) + extension = filename.split('.')[-1] + if filename.endswith((f'.tar.{extension}', f'.t{extension}')): + tfile = tarfile.open(filename, f'r:{extension}') + tfile.extractall(destination, **TARFILE_EXTRACT_ARGS) dirname= tfile.getnames()[0] elif filename.endswith('zip'): zfile = zipfile.ZipFile(filename) From 2c72e6f015f799980593f888c945dc07582da618 Mon Sep 17 00:00:00 2001 From: Max Prokhorov Date: Tue, 20 May 2025 19:40:21 +0300 Subject: [PATCH 41/50] =?UTF-8?q?Libraries=20-=20fix=20some=20warnings=20w?= =?UTF-8?q?ith=20gcc=20=E2=89=A512=20(#9244)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ESP8266WebServer - unused templated code throws out unused statics currently, only w/ mock build because it is using gcc>=12 > ../../libraries/ESP8266WebServer/src/detail/RequestHandlersImpl.h:14:15: warning: ‘String esp8266webserver::calcETag(fs::FS&, const String&)’ defined but not used [-Wunused-function] > 14 | static String calcETag(FS &fs, const String &path) { > | ^~~~~~~~ * ESP8266WiFiMesh - fix classes used as aggregates > error: designated initializers cannot be used with a non-aggregate type '...' gcc10.3 allowed this construct for some reason * LEAmDNS - consistent const <-> non-const accessors > error: infinite recursion detected [-Werror=infinite-recursion] --- .../src/detail/RequestHandlersImpl.h | 22 ++--------------- .../ESP8266WebServer/src/detail/etag.cpp | 24 +++++++++++++++++++ .../ESP8266WiFiMesh/src/ESP8266WiFiMesh.cpp | 4 ++-- .../ESP8266WiFiMesh/src/EspnowMeshBackend.cpp | 4 ++-- .../ESP8266WiFiMesh/src/TcpIpMeshBackend.cpp | 4 ++-- libraries/ESP8266mDNS/src/LEAmDNS_Structs.cpp | 22 +++++++++-------- 6 files changed, 44 insertions(+), 36 deletions(-) create mode 100644 libraries/ESP8266WebServer/src/detail/etag.cpp diff --git a/libraries/ESP8266WebServer/src/detail/RequestHandlersImpl.h b/libraries/ESP8266WebServer/src/detail/RequestHandlersImpl.h index fb36c5aba4..db1266f520 100644 --- a/libraries/ESP8266WebServer/src/detail/RequestHandlersImpl.h +++ b/libraries/ESP8266WebServer/src/detail/RequestHandlersImpl.h @@ -9,25 +9,7 @@ namespace esp8266webserver { -// calculate an ETag for a file in filesystem based on md5 checksum -// that can be used in the http headers - include quotes. -static String calcETag(FS &fs, const String &path) { - String result; - - // calculate eTag using md5 checksum - uint8_t md5_buf[16]; - File f = fs.open(path, "r"); - MD5Builder calcMD5; - calcMD5.begin(); - calcMD5.addStream(f, f.size()); - calcMD5.calculate(); - calcMD5.getBytes(md5_buf); - f.close(); - // create a minimal-length eTag using base64 byte[]->text encoding. - result = "\"" + base64::encode(md5_buf, 16, false) + "\""; - return(result); -} // calcETag - +String calcETag(FS &, const String &); template class FunctionRequestHandler : public RequestHandler { @@ -310,4 +292,4 @@ public StaticRequestHandler { } // namespace -#endif //REQUESTHANDLERSIMPL_H \ No newline at end of file +#endif //REQUESTHANDLERSIMPL_H diff --git a/libraries/ESP8266WebServer/src/detail/etag.cpp b/libraries/ESP8266WebServer/src/detail/etag.cpp new file mode 100644 index 0000000000..77c9e83b0e --- /dev/null +++ b/libraries/ESP8266WebServer/src/detail/etag.cpp @@ -0,0 +1,24 @@ +#include + +namespace esp8266webserver { + +// calculate an ETag for a file in filesystem based on md5 checksum +// that can be used in the http headers - include quotes. +String calcETag(FS &fs, const String &path) { + String result; + + // calculate eTag using md5 checksum + uint8_t md5_buf[16]; + File f = fs.open(path, "r"); + MD5Builder calcMD5; + calcMD5.begin(); + calcMD5.addStream(f, f.size()); + calcMD5.calculate(); + calcMD5.getBytes(md5_buf); + f.close(); + // create a minimal-length eTag using base64 byte[]->text encoding. + result = "\"" + base64::encode(md5_buf, 16, false) + "\""; + return(result); +} + +} // namespace esp8266webserver diff --git a/libraries/ESP8266WiFiMesh/src/ESP8266WiFiMesh.cpp b/libraries/ESP8266WiFiMesh/src/ESP8266WiFiMesh.cpp index 81cffe48eb..9ec32e9e60 100644 --- a/libraries/ESP8266WiFiMesh/src/ESP8266WiFiMesh.cpp +++ b/libraries/ESP8266WiFiMesh/src/ESP8266WiFiMesh.cpp @@ -535,7 +535,7 @@ void ESP8266WiFiMesh::attemptTransmission(const String &message, bool concluding if(WiFi.status() == WL_CONNECTED) { transmission_status_t transmissionResult = attemptDataTransfer(); - latestTransmissionOutcomes.push_back(TransmissionResult(connectionQueue.back(), transmissionResult)); + latestTransmissionOutcomes.emplace_back(connectionQueue.back(), transmissionResult); } else { @@ -600,7 +600,7 @@ void ESP8266WiFiMesh::attemptTransmission(const String &message, bool concluding transmission_status_t transmissionResult = connectToNode(currentSSID, currentWiFiChannel, currentBSSID); - latestTransmissionOutcomes.push_back(TransmissionResult{.origin = currentNetwork, .transmissionStatus = transmissionResult}); + latestTransmissionOutcomes.emplace_back(currentNetwork, transmissionResult); } } diff --git a/libraries/ESP8266WiFiMesh/src/EspnowMeshBackend.cpp b/libraries/ESP8266WiFiMesh/src/EspnowMeshBackend.cpp index f89f300813..e0b4f98e40 100644 --- a/libraries/ESP8266WiFiMesh/src/EspnowMeshBackend.cpp +++ b/libraries/ESP8266WiFiMesh/src/EspnowMeshBackend.cpp @@ -826,7 +826,7 @@ void EspnowMeshBackend::attemptTransmission(const String &message, const bool sc { TransmissionStatusType transmissionResult = initiateTransmission(getMessage(), currentNetwork); - latestTransmissionOutcomes().push_back(TransmissionOutcome{.origin = currentNetwork, .transmissionStatus = transmissionResult}); + latestTransmissionOutcomes().emplace_back(currentNetwork, transmissionResult); if(!getTransmissionOutcomesUpdateHook()(*this)) break; @@ -897,7 +897,7 @@ void EspnowMeshBackend::attemptAutoEncryptingTransmission(const String &message, TransmissionStatusType transmissionResult = initiateAutoEncryptingTransmission(getMessage(), currentBSSID, connectionStatus); - latestTransmissionOutcomes().push_back(TransmissionOutcome{.origin = currentNetwork, .transmissionStatus = transmissionResult}); + latestTransmissionOutcomes().emplace_back(currentNetwork, transmissionResult); _encryptionBroker.finalizeAutoEncryptingConnection(currentBSSID, existingEncryptedConnection, requestPermanentConnections); diff --git a/libraries/ESP8266WiFiMesh/src/TcpIpMeshBackend.cpp b/libraries/ESP8266WiFiMesh/src/TcpIpMeshBackend.cpp index 1e3c285c17..6368ab7d85 100644 --- a/libraries/ESP8266WiFiMesh/src/TcpIpMeshBackend.cpp +++ b/libraries/ESP8266WiFiMesh/src/TcpIpMeshBackend.cpp @@ -451,7 +451,7 @@ void TcpIpMeshBackend::attemptTransmission(const String &message, const bool sca if(WiFi.status() == WL_CONNECTED) { TransmissionStatusType transmissionResult = attemptDataTransfer(); - latestTransmissionOutcomes().push_back(TransmissionOutcome(constConnectionQueue().back(), transmissionResult)); + latestTransmissionOutcomes().emplace_back(constConnectionQueue().back(), transmissionResult); getTransmissionOutcomesUpdateHook()(*this); } @@ -474,7 +474,7 @@ void TcpIpMeshBackend::attemptTransmission(const String &message, const bool sca { TransmissionStatusType transmissionResult = initiateTransmission(currentNetwork); - latestTransmissionOutcomes().push_back(TransmissionOutcome{.origin = currentNetwork, .transmissionStatus = transmissionResult}); + latestTransmissionOutcomes().emplace_back(currentNetwork, transmissionResult); if(!getTransmissionOutcomesUpdateHook()(*this)) break; diff --git a/libraries/ESP8266mDNS/src/LEAmDNS_Structs.cpp b/libraries/ESP8266mDNS/src/LEAmDNS_Structs.cpp index 637f62869a..fbdfe148ea 100644 --- a/libraries/ESP8266mDNS/src/LEAmDNS_Structs.cpp +++ b/libraries/ESP8266mDNS/src/LEAmDNS_Structs.cpp @@ -1735,15 +1735,6 @@ namespace MDNSImplementation const MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP4Address* MDNSResponder::stcMDNSServiceQuery::stcAnswer::findIP4Address( const IPAddress& p_IPAddress) const - { - return (stcIP4Address*)(((const stcAnswer*)this)->findIP4Address(p_IPAddress)); - } - - /* - MDNSResponder::stcMDNSServiceQuery::stcAnswer::findIP4Address - */ - MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP4Address* - MDNSResponder::stcMDNSServiceQuery::stcAnswer::findIP4Address(const IPAddress& p_IPAddress) { stcIP4Address* pIP4Address = m_pIP4Addresses; while (pIP4Address) @@ -1757,6 +1748,16 @@ namespace MDNSImplementation return pIP4Address; } + /* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::findIP4Address + */ + MDNSResponder::stcMDNSServiceQuery::stcAnswer::stcIP4Address* + MDNSResponder::stcMDNSServiceQuery::stcAnswer::findIP4Address(const IPAddress& p_IPAddress) + { + const auto& cref = static_cast(*this); + return const_cast(cref.findIP4Address(p_IPAddress)); + } + /* MDNSResponder::stcMDNSServiceQuery::stcAnswer::IP4AddressCount */ @@ -2033,7 +2034,8 @@ namespace MDNSImplementation MDNSResponder::stcMDNSServiceQuery::stcAnswer* MDNSResponder::stcMDNSServiceQuery::answerAtIndex(uint32_t p_u32Index) { - return (stcAnswer*)(((const stcMDNSServiceQuery*)this)->answerAtIndex(p_u32Index)); + const auto& cref = static_cast(*this); + return const_cast(cref.answerAtIndex(p_u32Index)); } /* From a5f18b5f91683ca449395e6f618b34b344932af2 Mon Sep 17 00:00:00 2001 From: Max Prokhorov Date: Tue, 20 May 2025 20:58:32 +0300 Subject: [PATCH 42/50] Tools - none-cxxflags generator script & enable deprecation warnings (#9245) * Tools - none-cxxflags generator script GCC10 -> GCC (as in general, not specific to 10) cpp -> cxx to be consistent with gcc terminology grep exclude patterns in a separate file exclude 'deprecated' warnings by default * actually set warnings when compiling --warnings=none is arduino-cli implicit default --- platform.txt | 2 +- tests/common.sh | 12 ++++++---- tools/warnings/README.md | 9 ++++---- .../{default-cppflags => default-cxxflags} | 0 .../{extra-cppflags => extra-cxxflags} | 0 tools/warnings/make_none-cxxflags.sh | 11 ++++++++++ .../warnings/{more-cppflags => more-cxxflags} | 0 .../warnings/{none-cppflags => none-cxxflags} | 12 +++++++--- tools/warnings/patterns_none-cxxflags.txt | 22 +++++++++++++++++++ 9 files changed, 55 insertions(+), 13 deletions(-) rename tools/warnings/{default-cppflags => default-cxxflags} (100%) rename tools/warnings/{extra-cppflags => extra-cxxflags} (100%) create mode 100755 tools/warnings/make_none-cxxflags.sh rename tools/warnings/{more-cppflags => more-cxxflags} (100%) rename tools/warnings/{none-cppflags => none-cxxflags} (81%) create mode 100644 tools/warnings/patterns_none-cxxflags.txt diff --git a/platform.txt b/platform.txt index 3ca4ffae29..c34c719ae7 100644 --- a/platform.txt +++ b/platform.txt @@ -93,7 +93,7 @@ compiler.c.elf.cmd=xtensa-lx106-elf-gcc compiler.c.elf.libs=-lhal -lphy -lpp -lnet80211 {build.lwip_lib} -lwpa -lcrypto -lmain -lwps -lbearssl -lespnow -lsmartconfig -lairkiss -lwpa2 {build.stdcpp_lib} -lm -lc -lgcc compiler.cpp.cmd=xtensa-lx106-elf-g++ -compiler.cpp.flags=-c "{compiler.warning_flags}-cppflags" {build.stacksmash_flags} -g -free -fipa-pta -Werror=return-type -mlongcalls -mtext-section-literals -fno-rtti -falign-functions=4 {build.stdcpp_level} -MMD -ffunction-sections -fdata-sections {build.exception_flags} {build.sslflags} {build.mmuflags} {build.non32xferflags} {build.iramfloat} +compiler.cpp.flags=-c "{compiler.warning_flags}-cxxflags" {build.stacksmash_flags} -g -free -fipa-pta -Werror=return-type -mlongcalls -mtext-section-literals -fno-rtti -falign-functions=4 {build.stdcpp_level} -MMD -ffunction-sections -fdata-sections {build.exception_flags} {build.sslflags} {build.mmuflags} {build.non32xferflags} {build.iramfloat} compiler.as.cmd=xtensa-lx106-elf-as diff --git a/tests/common.sh b/tests/common.sh index aa75422358..d26db8f3a6 100755 --- a/tests/common.sh +++ b/tests/common.sh @@ -131,6 +131,7 @@ function build_sketches() local build_cmd build_cmd+=${cli_path} build_cmd+=" compile"\ +" --warnings=all"\ " --build-path $build_dir"\ " --fqbn $fqbn"\ " --libraries $library_path"\ @@ -307,20 +308,23 @@ function install_core() fi # Set our custom warnings for all builds - { echo "compiler.c.extra_flags=-Wall -Wextra -Werror $debug_flags"; - echo "compiler.cpp.extra_flags=-Wall -Wextra -Werror $debug_flags"; - echo "mkbuildoptglobals.extra_flags=--ci --cache_core"; } \ - > platform.local.txt + printf "%s\n" \ + "compiler.c.extra_flags=-Wall -Wextra $debug_flags" \ + "compiler.cpp.extra_flags=-Wall -Wextra $debug_flags" \ + "mkbuildoptglobals.extra_flags=--ci --cache_core" \ + > ${core_path}/platform.local.txt echo -e "\n----platform.local.txt----" cat platform.local.txt echo -e "\n----\n" + # Fetch toolchain & filesystem utils pushd tools python3 get.py -q popd popd + # todo: windows runners are using copied tree local core_dir core_dir=$(dirname "$hardware_core_path") mkdir -p "$core_dir" diff --git a/tools/warnings/README.md b/tools/warnings/README.md index 5fb33f2bd7..fa65199f11 100644 --- a/tools/warnings/README.md +++ b/tools/warnings/README.md @@ -1,12 +1,11 @@ These are the warning options for the compiler at different levels. -Because G++ 10 produces code which crashes when a function is declared +Because GCC produces code which crashes when a function is declared to return a value but doesn't (this is undefined per the C++ specs, but legal for C11 and above code as long as the [non]returned value is ignored), we cannot warn them if we use "-w" to disable all warnings, and instead have to delete every warning but "-Wreturn-type" -Generate the "none-g++" file with the following command: -```` -./tools/xtensa-lx106-elf/bin/xtensa-lx106-elf-gcc --help=warnings -Q | grep '\[enabled\]' | grep -v 'return-type' | awk '{print $1}' | sed 's/-W/-Wno-/' | grep -v = | grep -v -- -f | egrep -v '(c11-c2x-compat|c90-c99-compat|c99-c11-compat|declaration-after-statement|designated-init|discarded-array-qualifiers|discarded-qualifiers|implicit-int|incompatible-pointer-types|int-conversion|old-style-definition|override-init-side-effects|pointer-to-int-cast)' > tools/warnings/none-g++ -```` +Generate the C++ variant with the [`make_none-cxxflags.sh`](make_none-cxxflags.sh) script + +Modify [`patterns_none-cxxflags.txt`](patterns_none-cxxflags.txt) patterns to ignore incompatible warning types diff --git a/tools/warnings/default-cppflags b/tools/warnings/default-cxxflags similarity index 100% rename from tools/warnings/default-cppflags rename to tools/warnings/default-cxxflags diff --git a/tools/warnings/extra-cppflags b/tools/warnings/extra-cxxflags similarity index 100% rename from tools/warnings/extra-cppflags rename to tools/warnings/extra-cxxflags diff --git a/tools/warnings/make_none-cxxflags.sh b/tools/warnings/make_none-cxxflags.sh new file mode 100755 index 0000000000..0f0eb2ed4c --- /dev/null +++ b/tools/warnings/make_none-cxxflags.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env sh + +root=$(git rev-parse --show-toplevel) +${CC:-xtensa-lx106-elf-gcc} --help=warnings -Q |\ + grep '\[enabled\]' |\ + grep -v 'return-type' |\ + awk '{print $1}' |\ + sed 's/-W/-Wno-/' |\ + grep -v = |\ + grep -v -f ${root}/tools/warnings/patterns_none-cxxflags.txt |\ + sort -u > ${root}/tools/warnings/none-cxxflags diff --git a/tools/warnings/more-cppflags b/tools/warnings/more-cxxflags similarity index 100% rename from tools/warnings/more-cppflags rename to tools/warnings/more-cxxflags diff --git a/tools/warnings/none-cppflags b/tools/warnings/none-cxxflags similarity index 81% rename from tools/warnings/none-cppflags rename to tools/warnings/none-cxxflags index d72f50f2a8..5a16b0d417 100644 --- a/tools/warnings/none-cppflags +++ b/tools/warnings/none-cxxflags @@ -1,5 +1,10 @@ -Wno-address-of-packed-member -Wno-aggressive-loop-optimizations +-Wno-analyzer-double-fclose +-Wno-analyzer-double-free +-Wno-analyzer-exposure-through-output-file +-Wno-analyzer-file-leak +-Wno-analyzer-free-of-non-heap -Wno-analyzer-malloc-leak -Wno-analyzer-null-argument -Wno-analyzer-null-dereference @@ -8,18 +13,19 @@ -Wno-analyzer-stale-setjmp-buffer -Wno-analyzer-tainted-array-index -Wno-analyzer-unsafe-call-within-signal-handler --Wno-attribute-warning +-Wno-analyzer-use-after-free +-Wno-analyzer-use-of-pointer-in-stale-stack-frame -Wno-attributes +-Wno-attribute-warning -Wno-builtin-declaration-mismatch -Wno-builtin-macro-redefined -Wno-cannot-profile -Wno-coverage-mismatch -Wno-cpp --Wno-deprecated --Wno-deprecated-declarations -Wno-div-by-zero -Wno-endif-labels -Wno-enum-compare +-Wno-free-nonheap-object -Wno-hsa -Wno-if-not-aligned -Wno-ignored-attributes diff --git a/tools/warnings/patterns_none-cxxflags.txt b/tools/warnings/patterns_none-cxxflags.txt new file mode 100644 index 0000000000..b5f3d24981 --- /dev/null +++ b/tools/warnings/patterns_none-cxxflags.txt @@ -0,0 +1,22 @@ += +NSObject-attribute +c11-c2x-compat +c90-c99-compat +c99-c11-compat +compare-distinct-pointer-types +complain-wrong-lang +declaration-after-statement +declaration-missing-parameter-type +deprecated +deprecated-declarations +designated-init +discarded-array-qualifiers +discarded-qualifiers +implicit-function-declaration +implicit-int +incompatible-pointer-types +int-conversion +old-style-definition +override-init-side-effects +pointer-to-int-cast +return-mismatch From 92002ece2e813047f60538c9e5c71eff0b116810 Mon Sep 17 00:00:00 2001 From: Max Prokhorov Date: Wed, 21 May 2025 16:21:08 +0300 Subject: [PATCH 43/50] Device tests updates (#9246) Stop pyexpect from closing serial port when running with WSL2 Remove makefile flags & opts making it too silent. At some point it makes a lot of useful info just disappear. There are external means of silencing make, so probably best to leave useful data always available Replace SPIFFS with LittleFS in FS test Re-use certs-from-mozilla.py in FS test Fix libc tests w/o -fno-builtin not actually testing anything, also add the flag via .globals.h in case it breaks Fix libc tests generating warnings when using invalid (but safe) size arguments --- .../BearSSL_CertStore/certs-from-mozilla.py | 20 +- tests/device/Makefile | 222 +++++++++------- tests/device/libraries/BSTest/runner.py | 88 ++++--- tests/device/test_BearSSL/make_data.py | 1 + tests/device/test_BearSSL/make_spiffs.py | 71 ----- tests/device/test_BearSSL/test_BearSSL.ino | 12 +- tests/device/test_libc/libm_string.c | 248 +++++++++++++----- tests/device/test_libc/memmove1.c | 1 + tests/device/test_libc/strcmp-1.c | 10 - .../device/test_libc/test_libc.ino.globals.h | 4 + tests/device/test_libc/tstring.c | 4 + tests/device/test_sw_FS/test_sw_FS.ino | 46 ++-- tests/restyle.py | 1 + 13 files changed, 407 insertions(+), 321 deletions(-) create mode 120000 tests/device/test_BearSSL/make_data.py delete mode 100755 tests/device/test_BearSSL/make_spiffs.py create mode 100644 tests/device/test_libc/test_libc.ino.globals.h diff --git a/libraries/ESP8266WiFi/examples/BearSSL_CertStore/certs-from-mozilla.py b/libraries/ESP8266WiFi/examples/BearSSL_CertStore/certs-from-mozilla.py index 80dbc48387..edf3aa705d 100755 --- a/libraries/ESP8266WiFi/examples/BearSSL_CertStore/certs-from-mozilla.py +++ b/libraries/ESP8266WiFi/examples/BearSSL_CertStore/certs-from-mozilla.py @@ -13,15 +13,9 @@ import sys from shutil import which -from subprocess import Popen, PIPE, call -try: - from urllib.request import urlopen -except Exception: - from urllib2 import urlopen -try: - from StringIO import StringIO -except Exception: - from io import StringIO +from io import StringIO +from subprocess import Popen, PIPE, call, CalledProcessError +from urllib.request import urlopen # check if ar and openssl are available if which('ar') is None and not os.path.isfile('./ar') and not os.path.isfile('./ar.exe'): @@ -62,10 +56,10 @@ thisPem = pems[i].replace("'", "") print(names[i] + " -> " + certName) ssl = Popen(['openssl','x509','-inform','PEM','-outform','DER','-out', certName], shell = False, stdin = PIPE) - pipe = ssl.stdin - pipe.write(thisPem.encode('utf-8')) - pipe.close() - ssl.wait() + ssl.communicate(thisPem.encode('utf-8')) + ret = ssl.wait() + if ret != 0: + raise CalledProcessError(ret, certName) if os.path.exists(certName): derFiles.append(certName) idx = idx + 1 diff --git a/tests/device/Makefile b/tests/device/Makefile index cbbd34728a..f89c9ea93e 100644 --- a/tests/device/Makefile +++ b/tests/device/Makefile @@ -1,45 +1,65 @@ SHELL := /bin/bash -V ?= 0 -ESP8266_CORE_PATH ?= $(realpath ../..) -BUILD_DIR ?= $(PWD)/.build -HARDWARE_DIR ?= $(PWD)/.hardware + +ESP8266_CORE_PATH ?= $(shell git rev-parse --show-toplevel) + +BUILD_DIR ?= $(PWD)/build +BS_DIR ?= $(PWD)/libraries/BSTest + PYTHON ?= python3 ESPTOOL ?= $(PYTHON) $(ESP8266_CORE_PATH)/tools/esptool/esptool.py -MKSPIFFS ?= $(ESP8266_CORE_PATH)/tools/mkspiffs/mkspiffs + +VENV_PYTHON ?= $(BS_DIR)/virtualenv/bin/python +VENV_JUNIT2HTML ?= $(BS_DIR)/virtualenv/bin/junit2html + +MKFS ?= $(ESP8266_CORE_PATH)/tools/mklittlefs/mklittlefs + UPLOAD_PORT ?= $(shell ls /dev/tty* | grep -m 1 -i USB) UPLOAD_BAUD ?= 460800 -UPLOAD_BOARD ?= nodemcu -BS_DIR ?= libraries/BSTest -DEBUG_LEVEL ?= lvl=None____ -FQBN ?= esp8266com:esp8266:generic:xtal=160,FlashFreq=40,FlashMode=dio,baud=115200,eesz=4M1M,ip=lm2f,ResetMethod=nodemcu,dbg=Serial,$(DEBUG_LEVEL) -BUILD_TOOL := $(ARDUINO_IDE_PATH)/arduino-builder + +TEST_BAUD ?= 115200 +BUILD_TOOL ?= arduino-cli + +BUILD_BOARD ?= generic +BUILD_CPU ?= 160 +BUILD_SIZE ?= 4M1M +BUILD_LWIP ?= lm2f +BUILD_EXTRA ?= ,dbg=Serial,lvl=CORE + +FQBN ?= esp8266com:esp8266:$(BUILD_BOARD):xtal=$(BUILD_CPU),baud=$(TEST_BAUD),eesz=$(BUILD_SIZE),ip=$(BUILD_LWIP)$(BUILD_EXTRA) + TEST_CONFIG := test_env.cfg +TEST_RESULT_XML := test_result.xml TEST_REPORT_XML := test_report.xml TEST_REPORT_HTML := test_report.html -ifeq ("$(MOCK)", "1") -# To enable a test for mock testing, just rename dir+files to '*_sw_*' -TEST_LIST ?= $(wildcard test_sw_*/*.ino) -else TEST_LIST ?= $(wildcard test_*/*.ino) +BUILD_FLAGS ?= +BS_FLAGS ?= + +# To enable a test for mock testing, just rename dir+files to '*_sw_*' +ifeq ("$(MOCK)", "1") + TEST_LIST := $(filter test_sw_%.ino,$(TEST_LIST)) + NO_UPLOAD := 1 + NO_RUN := 1 endif -ifneq ("$(V)","1") - SILENT = @ - REDIR = >& /dev/null -else - BUILDER_DEBUG_FLAG = -verbose - RUNNER_DEBUG_FLAG = -d - #UPLOAD_VERBOSE_FLAG = -v +# To enable verbose mode, call `make V=1` ... +V ?= 0 +ifeq ("$(V)", "1") + BUILD_FLAGS += --verbose + BS_FLAGS += --debug endif +# ${sketch}.py helper script when building locally +mock_script = \ + `test -f $(addsuffix .py, $(basename $(1))) && echo "--mock $(addsuffix .py, $(basename $(1)))" || echo ""` + help: @echo @echo 'make list - show list of tests' @echo 'make sometest/sometest.ino - run one test' @echo 'make all - run all tests' @echo 'make MOCK=1 all - run all emulation-on-host compatible tests' - @echo 'variables needed: $$ARDUINO_IDE_PATH $$ESP8266_CORE_PATH' @echo 'make options: V=1 NO_BUILD=1 NO_UPLOAD=1 NO_RUN=1 MOCK=1' @echo @@ -49,110 +69,132 @@ all: count tests test_report $(TEST_LIST): | virtualenv $(TEST_CONFIG) $(BUILD_DIR) $(HARDWARE_DIR) +.NOTPARALLEL: $(TEST_LIST) + tests: showtestlist $(TEST_LIST) showtestlist: @echo "-------------------------------- test list:" - @echo $(TEST_LIST) + @printf '%s\n' $(TEST_LIST) @echo "--------------------------------" $(TEST_LIST): LOCAL_BUILD_DIR=$(BUILD_DIR)/$(notdir $@) - -$(TEST_LIST): - @echo "--------------------------------" - @echo "Running test '$@' of $(words $(TEST_LIST)) tests" - $(SILENT)mkdir -p $(LOCAL_BUILD_DIR) -ifeq ("$(MOCK)", "1") - @echo Compiling $(notdir $@) - (cd ../host; make D=$(V) ULIBDIRS=../device/libraries/BSTest ../device/$(@:%.ino=%)) - $(SILENT)$(BS_DIR)/virtualenv/bin/python \ - $(BS_DIR)/runner.py \ - $(RUNNER_DEBUG_FLAG) \ - -e "$(ESP8266_CORE_PATH)/tests/host/bin/$(@:%.ino=%)" \ - -n $(basename $(notdir $@)) \ - -o $(LOCAL_BUILD_DIR)/test_result.xml \ - --env-file $(TEST_CONFIG) \ - `test -f $(addsuffix .py, $(basename $@)) && echo "-m $(addsuffix .py, $(basename $@))" || echo ""` -else -ifneq ("$(NO_BUILD)","1") - @test -n "$(ARDUINO_IDE_PATH)" || (echo "Please export ARDUINO_IDE_PATH" && exit 1) - @echo Compiling $(notdir $@) - @rm -f $(LOCAL_BUILD_DIR)/build.options.json - $(SILENT)$(BUILD_TOOL) -compile -logger=human \ - -libraries "$(PWD)/libraries" \ - -core-api-version="10608" \ - -warnings=all \ - $(BUILDER_DEBUG_FLAG) \ - -build-path $(LOCAL_BUILD_DIR) \ - -tools $(ARDUINO_IDE_PATH)/tools-builder \ - -hardware $(HARDWARE_DIR)\ - -hardware $(ARDUINO_IDE_PATH)/hardware \ - -fqbn=$(FQBN) \ +$(TEST_LIST): LOCAL_DATA_IMG=data.img + +define build-arduino + rm -f $(LOCAL_BUILD_DIR)/build.options.json + $(BUILD_TOOL) compile \ + $(BUILD_FLAGS) \ + --libraries "$(PWD)/libraries" \ + --warnings=all \ + --build-path $(LOCAL_BUILD_DIR) \ + --fqbn=$(FQBN) \ $@ -endif -ifneq ("$(NO_UPLOAD)","1") - @test -n "$(UPLOAD_PORT)" || (echo "Failed to detect upload port, please export UPLOAD_PORT manually" && exit 1) - @test -e $(dir $@)/make_spiffs.py && ( \ - echo "Generating and uploading SPIFFS" && \ - (cd $(dir $@) && $(PYTHON) ./make_spiffs.py $(REDIR) ) && \ - $(MKSPIFFS) --create $(dir $@)data/ --size 0xFB000 \ - --block 8192 --page 256 $(LOCAL_BUILD_DIR)/spiffs.img $(REDIR) && \ - $(ESPTOOL) $(UPLOAD_VERBOSE_FLAG) \ +endef + +define build-mock + (cd $(ESP8266_CORE_PATH)/test/host; \ + $(MAKE) D=$(V) ULIBDIRS=$(PWD)/libraries/BSTest $(PWD)/$(@:%.ino=%)) + $(VENV_PYTHON) $(BS_DIR)/runner.py \ + $(BS_FLAGS) \ + --name $(basename $(notdir $@)) \ + --output $(LOCAL_BUILD_DIR)/$(TEST_RESULT_XML) \ + --env-file $(TEST_CONFIG) \ + $(call mock_script,$@) \ + executable "$(ESP8266_CORE_PATH)/tests/host/bin/$(@:%.ino=%)" || echo ""` +endef + +define upload-data + @test -n "$(UPLOAD_PORT)" \ + || (echo "Failed to detect upload port, please export UPLOAD_PORT manually" && exit 1) + @test ! \( -d $(dir $@)/data/ \) -a \( -e $(dir $@)/make_data.py \) && \ + (cd $(dir $@) && ./make_data.py ) || echo "Filesystem creation skipped" + @test -d $(dir $@)/data/ && ( \ + $(MKFS) \ + --create $(dir $@)/data/ \ + --size 0xFB000 \ + --block 8192 \ + --page 256 \ + $(LOCAL_BUILD_DIR)/$(LOCAL_DATA_IMG) && \ + $(ESPTOOL) \ --chip esp8266 \ --port $(UPLOAD_PORT) \ --baud $(UPLOAD_BAUD) \ --after no_reset \ - write_flash 0x300000 $(LOCAL_BUILD_DIR)/spiffs.img $(REDIR) ) \ - || (echo "No SPIFFS to upload") - @echo Uploading binary - $(SILENT)$(ESPTOOL) $(UPLOAD_VERBOSE_FLAG) \ + write_flash 0x300000 $(LOCAL_BUILD_DIR)/$(LOCAL_DATA_IMG) ) \ + && (echo "Uploaded filesystem") \ + || (echo "Filesystem upload skipped") +endef + +define upload-binary + @test -n "$(UPLOAD_PORT)" \ + || (echo "Failed to detect upload port, please export UPLOAD_PORT manually" && exit 1) + $(ESPTOOL) \ --chip esp8266 \ --port $(UPLOAD_PORT) \ --baud $(UPLOAD_BAUD) \ --after no_reset \ - write_flash 0x0 $(LOCAL_BUILD_DIR)/$(notdir $@).bin $(REDIR) # no reset -endif -ifneq ("$(NO_RUN)","1") - @test -n "$(UPLOAD_PORT)" || (echo "Failed to detect upload port, please export UPLOAD_PORT manually" && exit 1) + write_flash 0x0 $(LOCAL_BUILD_DIR)/$(notdir $@).bin +endef + +define run-test + @test -n "$(UPLOAD_PORT)" \ + || (echo "Failed to detect upload port, please export UPLOAD_PORT manually" && exit 1) @echo Running tests - $(SILENT)$(ESPTOOL) $(UPLOAD_VERBOSE_FLAG) \ + $(ESPTOOL) \ --chip esp8266 \ --port $(UPLOAD_PORT) \ --baud $(UPLOAD_BAUD) \ - read_flash_status $(REDIR) # reset - $(SILENT)$(BS_DIR)/virtualenv/bin/python \ - $(BS_DIR)/runner.py \ - $(RUNNER_DEBUG_FLAG) \ - -p $(UPLOAD_PORT) \ - -n $(basename $(notdir $@)) \ - -o $(LOCAL_BUILD_DIR)/test_result.xml \ - --env-file $(TEST_CONFIG) \ - `test -f $(addsuffix .py, $(basename $@)) && echo "-m $(addsuffix .py, $(basename $@))" || echo ""` + read_flash_status # reset via implicit stub reboot + $(VENV_PYTHON) $(BS_DIR)/runner.py \ + $(BS_FLAGS) \ + --name $(basename $(notdir $@)) \ + --output $(LOCAL_BUILD_DIR)/$(TEST_RESULT_XML) \ + --env-file $(TEST_CONFIG) \ + $(call mock_script,$@) \ + port $(UPLOAD_PORT) \ + --baudrate $(TEST_BAUD) +endef + +$(TEST_LIST): + @echo "--------------------------------" + @echo "Running test '$@' of $(words $(TEST_LIST)) tests" + mkdir -p $(LOCAL_BUILD_DIR) +ifneq ("$(NO_BUILD)","1") + @echo Building $(notdir $@) +ifeq ("$(MOCK)", "1") + $(build-mock) +else + $(build-arduino) endif endif +ifneq ("$(NO_UPLOAD)","1") + $(upload-filesystem) + $(upload-binary) +endif +ifneq ("$(NO_RUN)","1") + $(run-test) +endif -$(TEST_REPORT_XML): $(HARDWARE_DIR) virtualenv - $(SILENT)$(BS_DIR)/xunitmerge $(shell find $(BUILD_DIR) -name 'test_result.xml' | xargs echo) $(TEST_REPORT_XML) +$(TEST_REPORT_XML): virtualenv + $(BS_DIR)/xunitmerge \ + $(shell find $(BUILD_DIR) -name '$(TEST_RESULT_XML)' | xargs echo) \ + $(TEST_REPORT_XML) $(TEST_REPORT_HTML): $(TEST_REPORT_XML) | virtualenv - $(SILENT)$(BS_DIR)/virtualenv/bin/junit2html $< $@ + $(VENV_JUNIT2HTML) $< $@ test_report: $(TEST_REPORT_HTML) @echo "Test report generated in $(TEST_REPORT_HTML)" $(BUILD_DIR): - mkdir -p $(BUILD_DIR) - -$(HARDWARE_DIR): - mkdir -p $(HARDWARE_DIR)/esp8266com - cd $(HARDWARE_DIR)/esp8266com && ln -s $(realpath $(ESP8266_CORE_PATH)) esp8266 + @mkdir -p $(BUILD_DIR) virtualenv: @make -C $(BS_DIR) PYTHON=$(PYTHON) virtualenv clean: rm -rf $(BUILD_DIR) - rm -rf $(HARDWARE_DIR) rm -rf $(BS_DIR)/virtualenv rm -f $(TEST_REPORT_HTML) $(TEST_REPORT_XML) diff --git a/tests/device/libraries/BSTest/runner.py b/tests/device/libraries/BSTest/runner.py index 5c9dddfef9..30aa93c111 100644 --- a/tests/device/libraries/BSTest/runner.py +++ b/tests/device/libraries/BSTest/runner.py @@ -1,40 +1,32 @@ #!/usr/bin/env python3 -from __future__ import print_function + +import serial + import pexpect from pexpect import EOF, TIMEOUT, fdpexpect -import sys -import os -import time + +from junit_xml import TestSuite, TestCase + import argparse -import serial +import itertools +import os import subprocess +import sys +import time +from configparser import ConfigParser from importlib.machinery import SourceFileLoader +from io import StringIO +from urllib.parse import urlparse, urlencode -try: - from configparser import ConfigParser -except: - from ConfigParser import ConfigParser -import itertools -try: - from urllib.parse import urlparse, urlencode -except ImportError: - from urlparse import urlparse -from junit_xml import TestSuite, TestCase -try: - from cStringIO import StringIO -except: - try: - from StringIO import StringIO - except ImportError: - from io import StringIO import mock_decorators debug = False -#debug = True sys.path.append(os.path.abspath(__file__)) +IS_WSL = len(os.environ.get("WSL_DISTRO_NAME", "")) > 0 + def debug_print(*args, **kwargs): if not debug: return @@ -235,9 +227,11 @@ def request_env(self, key): ser = None -def spawn_port(port_name, baudrate=115200): +def spawn_port(port_name, baudrate=115200, close=True): global ser ser = serial.serial_for_url(port_name, baudrate=baudrate) + if not close: + ser.close = lambda: None return fdpexpect.fdspawn(ser, 'wb', timeout=0, encoding='cp437') def spawn_exec(name): @@ -250,30 +244,39 @@ def run_tests(spawn, name, mocks, env_vars): def parse_args(): parser = argparse.ArgumentParser(description='BS test runner') - parser.add_argument('-d', '--debug', help='Send test output to stderr', action='store_true') - parser.add_argument('-p', '--port', help='Talk to the test over serial') - parser.add_argument('-e', '--executable', help='Talk to the test executable') - parser.add_argument('-n', '--name', help='Test run name') - parser.add_argument('-o', '--output', help='Output JUnit format test report') - parser.add_argument('-m', '--mock', help='Set python script to use for mocking purposes') + parser.add_argument('--debug', help='Send test output to stderr', action='store_true') + parser.add_argument('--name', help='Test run name') + parser.add_argument('--output', help='Output JUnit format test report') + parser.add_argument('--mock', help='Set python script to use for mocking purposes') parser.add_argument('--env-file', help='File containing a list of environment variables to set', type=argparse.FileType('r')) + + sub = parser.add_subparsers() + + def as_spawn_port(args): + return spawn_port(args.port, args.baudrate, args.close) + + port = sub.add_parser('port') + port.add_argument('port', type=str) + port.add_argument('--baudrate', help='Serial port baudrate', type=int, default=115200) + port.add_argument('--close', help='Close serial port after the test', action=argparse.BooleanOptionalAction, default=not IS_WSL) + port.set_defaults(func=as_spawn_port) + + def as_spawn_exec(args): + return spawn_exec(args.executable) + + exe = sub.add_parser('executable') + exe.add_argument('executable', help='Talk to the test executable') + exe.set_defaults(func=as_spawn_exec) + return parser.parse_args() def main(): args = parse_args() - spawn_func = None - spawn_arg = None - if args.port is not None: - spawn_func = spawn_port - spawn_arg = args.port - elif args.executable is not None: - spawn_func = spawn_exec - spawn_arg = args.executable + name = args.name or "" global debug - if args.debug: - debug = True - if spawn_func is None: + debug = args.debug + if args.func is None: debug_print("Please specify port or executable", file=sys.stderr) return 1 env_vars = [] @@ -287,7 +290,8 @@ def main(): if args.mock is not None: mocks_mod = SourceFileLoader('mocks', args.mock).load_module() mocks = mock_decorators.env - with spawn_func(spawn_arg) as sp: + + with args.func(args) as sp: ts = run_tests(sp, name, mocks, env_vars) if args.output: with open(args.output, "w") as f: diff --git a/tests/device/test_BearSSL/make_data.py b/tests/device/test_BearSSL/make_data.py new file mode 120000 index 0000000000..987c479fbc --- /dev/null +++ b/tests/device/test_BearSSL/make_data.py @@ -0,0 +1 @@ +../../../libraries/ESP8266WiFi/examples/BearSSL_CertStore/certs-from-mozilla.py \ No newline at end of file diff --git a/tests/device/test_BearSSL/make_spiffs.py b/tests/device/test_BearSSL/make_spiffs.py deleted file mode 100755 index e423bc25b9..0000000000 --- a/tests/device/test_BearSSL/make_spiffs.py +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/python3 - -# This script pulls the list of Mozilla trusted certificate authorities -# from the web at the "mozurl" below, parses the file to grab the PEM -# for each cert, and then generates DER files in a new ./data directory -# Upload these to a SPIFFS filesystem and use the CertManager to parse -# and use them for your outgoing SSL connections. -# -# Script by Earle F. Philhower, III. Released to the public domain. -from __future__ import print_function -import csv -import os -import sys -from subprocess import Popen, PIPE, call -try: - from urllib.request import urlopen -except: - from urllib2 import urlopen -try: - from StringIO import StringIO -except: - from io import StringIO - -# Mozilla's URL for the CSV file with included PEM certs -mozurl = "https://ccadb-public.secure.force.com/mozilla/IncludedCACertificateReportPEMCSV" - -# Load the manes[] and pems[] array from the URL -names = [] -pems = [] -response = urlopen(mozurl) -csvData = response.read() -if sys.version_info[0] > 2: - csvData = csvData.decode('utf-8') -csvFile = StringIO(csvData) -csvReader = csv.reader(csvFile) -for row in csvReader: - names.append(row[0]+":"+row[1]+":"+row[2]) - pems.append(row[30]) -del names[0] # Remove headers -del pems[0] # Remove headers - -# Try and make ./data, skip if present -try: - os.mkdir("data") -except: - pass - -derFiles = [] -idx = 0 -# Process the text PEM using openssl into DER files -for i in range(0, len(pems)): - certName = "data/ca_%03d.der" % (idx); - thisPem = pems[i].replace("'", "") - print(names[i] + " -> " + certName) - ssl = Popen(['openssl','x509','-inform','PEM','-outform','DER','-out', certName], shell = False, stdin = PIPE) - pipe = ssl.stdin - pipe.write(thisPem.encode('utf-8')) - pipe.close() - ssl.wait() - if os.path.exists(certName): - derFiles.append(certName) - idx = idx + 1 - -if os.path.exists("data/certs.ar"): - os.unlink("data/certs.ar"); - -arCmd = ['ar', 'q', 'data/certs.ar'] + derFiles; -call( arCmd ) - -for der in derFiles: - os.unlink(der) diff --git a/tests/device/test_BearSSL/test_BearSSL.ino b/tests/device/test_BearSSL/test_BearSSL.ino index e4db2fdc0e..73ab226524 100644 --- a/tests/device/test_BearSSL/test_BearSSL.ino +++ b/tests/device/test_BearSSL/test_BearSSL.ino @@ -1,7 +1,7 @@ // Stress test the BearSSL connection options to determine // maximum memory use for different SSL connections and -// SPIFFS certstore usage. Before running you need to run -// certs-from-mozilla.py and upload the generated SPIFFS file. +// filesystem certstore usage. Before running the test you need to +// update them with certs-from-mozilla.py and upload the generated file. // // For more info on CertStores, see the BearSSL_CertStore example // @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include #include @@ -45,11 +45,11 @@ bool pretest() delay(500); } setClock(); - SPIFFS.begin(); - int numCerts = certStore.initCertStore(SPIFFS, "/certs.idx", "/certs.ar"); + LittleFS.begin(); + int numCerts = certStore.initCertStore(LittleFS, "/certs.idx", "/certs.ar"); Serial.printf("Number of CA certs read: %d\n", numCerts); if (numCerts == 0) { - Serial.printf("No certs found. Did you run certs-from-mozill.py and upload the SPIFFS directory before running?\n"); + Serial.printf("No certs found. Did you run upload script?\n"); return false; } return true; diff --git a/tests/device/test_libc/libm_string.c b/tests/device/test_libc/libm_string.c index 9a19da58a4..dd464fbd46 100644 --- a/tests/device/test_libc/libm_string.c +++ b/tests/device/test_libc/libm_string.c @@ -3,51 +3,130 @@ #include #include -#define memcmp memcmp_P -#define memcpy memcpy_P -#define memmem memmem_P -#define memchr memchr_P -#define strcat strcat_P -#define strncat strncat_P -#define strcpy strcpy_P -#define strncpy strncpy_P -#define strlen strlen_P -#define strnlen strnlen_P -#define strcmp strcmp_P -#define strncmp strncmp_P - -_CONST char* it = ""; /* Routine name for message routines. */ +#include + +/* esp8266/Arduino note + * + * Prevent the compiler from + * - solving test cases below at compile time, effectively removing any checks + * - optimizing out libc func calls, replacing them with bytewise memory access + * + * Plus, test framework cannot pass -fno-builtin-... per-file, only globally + */ + +#define xDST_SRC_N(T, NAME)\ +static T* __attribute__((used, noinline)) x ## NAME (T* dst, const T* src, size_t n)\ +{\ + return NAME (dst, src, n);\ +} + +xDST_SRC_N (void, memcpy) +xDST_SRC_N (void, memmove) +xDST_SRC_N (char, strncat) +xDST_SRC_N (char, strncpy) + +#define xDST_SRC(T, NAME)\ +static T* __attribute__((used, noinline)) x ## NAME (T* dst, const T* src)\ +{\ + return NAME (dst, src);\ +} + +xDST_SRC (char, strcat) +xDST_SRC (char, strcpy) + +#define xS1_S2_N(RET, T, NAME)\ +static RET __attribute__((used, noinline)) x ## NAME (const T *s1, const T *s2, size_t n)\ +{\ + return NAME (s1, s2, n);\ +} + +xS1_S2_N(int, void, memcmp) +xS1_S2_N(int, char, strncmp) + +static int __attribute__((used, noinline)) xstrcmp (const char *s1, const char *s2) +{ + return strcmp (s1, s2); +} + +static void* __attribute__((used, noinline)) xmemchr (const void* s, int c, size_t n) +{ + return memchr (s, c, n); +} + +static size_t __attribute__((used, noinline)) xstrlen (const char* s) +{ + return strlen (s); +} + +#if 0 + +/* TODO remove when libc supports pointers to flash */ +#undef PSTR +#define PSTR(X) X + +#define memcmp(s1,s2,n) xmemcmp(s1,PSTR(s2),n) +#define memcpy(dest,src,n) xmemcpy(dest,PSTR(src),n) +#define memmove(dest,src,n) xmemmove(dest,PSTR(src),n) +#define memchr(s,c,n) xmemchr(PSTR(s),c,n) +#define strcat(dst,src) xstrcat(dst,PSTR(src)) +#define strncat(dst,src,ssize) xstrncat(dst,PSTR(src),ssize) +#define strcpy(dst,src) xstrcpy(dst,PSTR(src)) +#define strncpy(dst,src,dsize) xstrncpy(dst,PSTR(src),dsize) +#define strlen(s) xstrlen(PSTR(s)) +#define strcmp(s1,s2) xstrcmp(s1,PSTR(s2)) +#define strncmp(s1,s2,n) xstrncmp(s1,PSTR(s2),n) + +#else + +/* in case wrapped calls are not required */ + +#define memcmp(s1,s2,n) memcmp_P(s1,PSTR(s2),n) +#define memcpy(dest,src,n) memcpy_P(dest,PSTR(src),n) +#define memmove(dest,src,n) memmove_P(dest,PSTR(src),n) +#define memchr(s,c,n) memchr_P(PSTR(s),c,n) +#define strcat(dst,src) strcat_P(dst,PSTR(src)) +#define strncat(dst,src,ssize) strncat_P(dst,PSTR(src),ssize) +#define strcpy(dst,src) strcpy_P(dst,PSTR(src)) +#define strncpy(dst,src,dsize) strncpy_P(dst,PSTR(src),dsize) +#define strlen(s) strlen_P(PSTR(s)) +#define strcmp(s1,s2) strcmp_P(s1,PSTR(s2)) +#define strncmp(s1,s2,n) strncmp_P(s1,PSTR(s2),n) + +#endif + +static const char Unset[] PROGMEM = ""; + +const char* it = Unset; /* Routine name for message routines. */ static int errors = 0; /* Complain if condition is not true. */ #define check(thing) checkit(thing, __LINE__) -static void _DEFUN(checkit, (ok, l), int ok _AND int l) - +static void checkit(int ok, int l) { // newfunc(it); // line(l); if (!ok) { - printf("string.c:%d %s\n", l, it); + printf(PSTR("string.c:%d %s\n"), l, it); ++errors; } } /* Complain if first two args don't strcmp as equal. */ -#define equal(a, b) funcqual(a, b, __LINE__); +#define equal(a, b) funcqual(a, PSTR(b), __LINE__); -static void _DEFUN(funcqual, (a, b, l), char* a _AND char* b _AND int l) +static void funcqual(const char *a, const char *b, int l) { // newfunc(it); // line(l); if (a == NULL && b == NULL) return; - if (strcmp(a, b)) + if (strcmp_P(a, b)) { - printf("string.c:%d (%s)\n", l, it); + printf(PSTR("string.c:%d (%s)\n"), l, it); } } @@ -57,7 +136,7 @@ static char two[50]; void libm_test_string() { /* Test strcmp first because we use it to test other things. */ - it = "strcmp"; + it = PSTR("strcmp"); check(strcmp("", "") == 0); /* Trivial case. */ check(strcmp("a", "a") == 0); /* Identity. */ check(strcmp("abc", "abc") == 0); /* Multicharacter. */ @@ -69,7 +148,7 @@ void libm_test_string() check(strcmp("a\103", "a\003") > 0); /* Test strcpy next because we need it to set up other tests. */ - it = "strcpy"; + it = PSTR("strcpy"); check(strcpy(one, "abcd") == one); /* Returned value. */ equal(one, "abcd"); /* Basic test. */ @@ -78,7 +157,7 @@ void libm_test_string() equal(one + 2, "cd"); /* Wrote too much? */ (void)strcpy(two, "hi there"); - (void)strcpy(one, two); + (void)xstrcpy(one, two); equal(one, "hi there"); /* Basic test encore. */ equal(two, "hi there"); /* Stomped on source? */ @@ -86,7 +165,7 @@ void libm_test_string() equal(one, ""); /* Boundary condition. */ /* strcat. */ - it = "strcat"; + it = PSTR("strcat"); (void)strcpy(one, "ijk"); check(strcat(one, "lmn") == one); /* Returned value. */ equal(one, "ijklmn"); /* Basic test. */ @@ -98,7 +177,7 @@ void libm_test_string() (void)strcpy(one, "gh"); (void)strcpy(two, "ef"); - (void)strcat(one, two); + (void)xstrcpy(one, two); equal(one, "ghef"); /* Basic test encore. */ equal(two, "ef"); /* Stomped on source? */ @@ -114,42 +193,67 @@ void libm_test_string() /* strncat - first test it as strcat, with big counts, then test the count mechanism. */ - it = "strncat"; + it = PSTR("strncat"); (void)strcpy(one, "ijk"); +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstringop-overflow=" check(strncat(one, "lmn", 99) == one); /* Returned value. */ +#pragma GCC diagnostic pop equal(one, "ijklmn"); /* Basic test. */ (void)strcpy(one, "x"); +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstringop-overflow=" (void)strncat(one, "yz", 99); +#pragma GCC diagnostic pop equal(one, "xyz"); /* Writeover. */ equal(one + 4, "mn"); /* Wrote too much? */ (void)strcpy(one, "gh"); (void)strcpy(two, "ef"); - (void)strncat(one, two, 99); +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Warray-bounds=" +#pragma GCC diagnostic ignored "-Wstringop-overflow=" + (void)xstrncat(one, two, 99); +#pragma GCC diagnostic pop equal(one, "ghef"); /* Basic test encore. */ equal(two, "ef"); /* Stomped on source? */ (void)strcpy(one, ""); +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstringop-overflow=" (void)strncat(one, "", 99); +#pragma GCC diagnostic pop equal(one, ""); /* Boundary conditions. */ (void)strcpy(one, "ab"); +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstringop-overflow=" (void)strncat(one, "", 99); +#pragma GCC diagnostic pop equal(one, "ab"); (void)strcpy(one, ""); +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstringop-overflow=" (void)strncat(one, "cd", 99); +#pragma GCC diagnostic pop equal(one, "cd"); (void)strcpy(one, "ab"); +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstringop-truncation" (void)strncat(one, "cdef", 2); +#pragma GCC diagnostic pop equal(one, "abcd"); /* Count-limited. */ (void)strncat(one, "gh", 0); equal(one, "abcd"); /* Zero count. */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstringop-overflow" (void)strncat(one, "gh", 2); +#pragma GCC diagnostic pop equal(one, "abcdgh"); /* Count _AND length equal. */ - it = "strncmp"; + it = PSTR("strncmp"); /* strncmp - first test as strcmp with big counts";*/ check(strncmp("", "", 99) == 0); /* Trivial case. */ check(strncmp("a", "a", 99) == 0); /* Identity. */ @@ -164,16 +268,22 @@ void libm_test_string() check(strncmp("abc", "def", 0) == 0); /* Zero count. */ /* strncpy - testing is a bit different because of odd semantics. */ - it = "strncpy"; + it = PSTR("strncpy"); check(strncpy(one, "abc", 4) == one); /* Returned value. */ equal(one, "abc"); /* Did the copy go right? */ (void)strcpy(one, "abcdefgh"); +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstringop-truncation" (void)strncpy(one, "xyz", 2); +#pragma GCC diagnostic pop equal(one, "xycdefgh"); /* Copy cut by count. */ (void)strcpy(one, "abcdefgh"); +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstringop-truncation" (void)strncpy(one, "xyz", 3); /* Copy cut just before NUL. */ +#pragma GCC diagnostic pop equal(one, "xyzdefgh"); (void)strcpy(one, "abcdefgh"); @@ -188,7 +298,10 @@ void libm_test_string() equal(one + 5, "fgh"); (void)strcpy(one, "abc"); +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstringop-truncation" (void)strncpy(one, "xyz", 0); /* Zero-length copy. */ +#pragma GCC diagnostic pop equal(one, "abc"); (void)strncpy(one, "", 2); /* Zero-length source. */ @@ -197,18 +310,18 @@ void libm_test_string() equal(one + 2, "c"); (void)strcpy(one, "hi there"); - (void)strncpy(two, one, 9); + (void)xstrncpy(two, one, 9); equal(two, "hi there"); /* Just paranoia. */ equal(one, "hi there"); /* Stomped on source? */ /* strlen. */ - it = "strlen"; + it = PSTR("strlen"); check(strlen("") == 0); /* Empty. */ check(strlen("a") == 1); /* Single char. */ check(strlen("abcd") == 4); /* Multiple chars. */ /* strchr. */ - it = "strchr"; + it = PSTR("strchr"); check(strchr("abcd", 'z') == NULL); /* Not found. */ (void)strcpy(one, "abcd"); check(strchr(one, 'c') == one + 2); /* Basic test. */ @@ -222,7 +335,7 @@ void libm_test_string() check(strchr(one, '\0') == one); /* NUL in empty string. */ /* index - just like strchr. */ - it = "index"; + it = PSTR("index"); check(index("abcd", 'z') == NULL); /* Not found. */ (void)strcpy(one, "abcd"); check(index(one, 'c') == one + 2); /* Basic test. */ @@ -236,7 +349,7 @@ void libm_test_string() check(index(one, '\0') == one); /* NUL in empty string. */ /* strrchr. */ - it = "strrchr"; + it = PSTR("strrchr"); check(strrchr("abcd", 'z') == NULL); /* Not found. */ (void)strcpy(one, "abcd"); check(strrchr(one, 'c') == one + 2); /* Basic test. */ @@ -250,7 +363,7 @@ void libm_test_string() check(strrchr(one, '\0') == one); /* NUL in empty string. */ /* rindex - just like strrchr. */ - it = "rindex"; + it = PSTR("rindex"); check(rindex("abcd", 'z') == NULL); /* Not found. */ (void)strcpy(one, "abcd"); check(rindex(one, 'c') == one + 2); /* Basic test. */ @@ -264,7 +377,7 @@ void libm_test_string() check(rindex(one, '\0') == one); /* NUL in empty string. */ /* strpbrk - somewhat like strchr. */ - it = "strpbrk"; + it = PSTR("strpbrk"); check(strpbrk("abcd", "z") == NULL); /* Not found. */ (void)strcpy(one, "abcd"); check(strpbrk(one, "c") == one + 2); /* Basic test. */ @@ -281,7 +394,7 @@ void libm_test_string() check(strpbrk(one, "") == NULL); /* Both strings empty. */ /* strstr - somewhat like strchr. */ - it = "strstr"; + it = PSTR("strstr"); check(strstr("z", "abcd") == NULL); /* Not found. */ check(strstr("abx", "abcd") == NULL); /* Dead end. */ (void)strcpy(one, "abcd"); @@ -304,7 +417,7 @@ void libm_test_string() check(strstr(one, "bbca") == one + 1); /* With overlap. */ /* strspn. */ - it = "strspn"; + it = PSTR("strspn"); check(strspn("abcba", "abc") == 5); /* Whole string. */ check(strspn("abcba", "ab") == 2); /* Partial. */ check(strspn("abc", "qx") == 0); /* None. */ @@ -312,7 +425,7 @@ void libm_test_string() check(strspn("abc", "") == 0); /* Null search list. */ /* strcspn. */ - it = "strcspn"; + it = PSTR("strcspn"); check(strcspn("abcba", "qx") == 5); /* Whole string. */ check(strcspn("abcba", "cx") == 2); /* Partial. */ check(strcspn("abc", "abc") == 0); /* None. */ @@ -320,7 +433,7 @@ void libm_test_string() check(strcspn("abc", "") == 3); /* Null search list. */ /* strtok - the hard one. */ - it = "strtok"; + it = PSTR("strtok"); (void)strcpy(one, "first, second, third"); equal(strtok(one, ", "), "first"); /* Basic test. */ equal(one, "first"); @@ -367,7 +480,7 @@ void libm_test_string() equal(one + 4, "c"); /* memcmp. */ - it = "memcmp"; + it = PSTR("memcmp"); check(memcmp("a", "a", 1) == 0); /* Identity. */ check(memcmp("abc", "abc", 3) == 0); /* Multicharacter. */ check(memcmp("abcd", "abce", 4) < 0); /* Honestly unequal. */ @@ -379,25 +492,25 @@ void libm_test_string() /* memcmp should test strings as unsigned */ one[0] = 0xfe; two[0] = 0x03; - check(memcmp(one, two, 1) > 0); + check(xmemcmp(one, two, 1) > 0); /* memchr. */ - it = "memchr"; + it = PSTR("memchr"); check(memchr("abcd", 'z', 4) == NULL); /* Not found. */ (void)strcpy(one, "abcd"); - check(memchr(one, 'c', 4) == one + 2); /* Basic test. */ - check(memchr(one, 'd', 4) == one + 3); /* End of string. */ - check(memchr(one, 'a', 4) == one); /* Beginning. */ - check(memchr(one, '\0', 5) == one + 4); /* Finding NUL. */ + check(xmemchr(one, 'c', 4) == one + 2); /* Basic test. */ + check(xmemchr(one, 'd', 4) == one + 3); /* End of string. */ + check(xmemchr(one, 'a', 4) == one); /* Beginning. */ + check(xmemchr(one, '\0', 5) == one + 4); /* Finding NUL. */ (void)strcpy(one, "ababa"); - check(memchr(one, 'b', 5) == one + 1); /* Finding first. */ - check(memchr(one, 'b', 0) == NULL); /* Zero count. */ - check(memchr(one, 'a', 1) == one); /* Singleton case. */ + check(xmemchr(one, 'b', 5) == one + 1); /* Finding first. */ + check(xmemchr(one, 'b', 0) == NULL); /* Zero count. */ + check(xmemchr(one, 'a', 1) == one); /* Singleton case. */ (void)strcpy(one, "a\203b"); - check(memchr(one, 0203, 3) == one + 1); /* Unsignedness. */ + check(xmemchr(one, 0203, 3) == one + 1); /* Unsignedness. */ /* memcpy - need not work for overlap. */ - it = "memcpy"; + it = PSTR("memcpy"); check(memcpy(one, "abc", 4) == one); /* Returned value. */ equal(one, "abc"); /* Did the copy go right? */ @@ -411,13 +524,13 @@ void libm_test_string() (void)strcpy(one, "hi there"); (void)strcpy(two, "foo"); - (void)memcpy(two, one, 9); + (void)xmemcpy(two, one, 9); equal(two, "hi there"); /* Just paranoia. */ equal(one, "hi there"); /* Stomped on source? */ -#if 0 +#if 1 /* memmove - must work on overlap. */ - it = "memmove"; - check(memmove(one, "abc", 4) == one); /* Returned value. */ + it = PSTR("memmove"); + check(xmemmove(one, "abc", 4) == one); /* Returned value. */ equal(one, "abc"); /* Did the copy go right? */ (void) strcpy(one, "abcdefgh"); @@ -430,20 +543,20 @@ void libm_test_string() (void) strcpy(one, "hi there"); (void) strcpy(two, "foo"); - (void) memmove(two, one, 9); + (void) xmemmove(two, one, 9); equal(two, "hi there"); /* Just paranoia. */ equal(one, "hi there"); /* Stomped on source? */ (void) strcpy(one, "abcdefgh"); - (void) memmove(one+1, one, 9); + (void) xmemmove(one+1, one, 9); equal(one, "aabcdefgh"); /* Overlap, right-to-left. */ (void) strcpy(one, "abcdefgh"); - (void) memmove(one+1, one+2, 7); + (void) xmemmove(one+1, one+2, 7); equal(one, "acdefgh"); /* Overlap, left-to-right. */ (void) strcpy(one, "abcdefgh"); - (void) memmove(one, one, 9); + (void) xmemmove(one, one, 9); equal(one, "abcdefgh"); /* 100% overlap. */ #endif #if 0 @@ -451,7 +564,7 @@ void libm_test_string() The SVID, the only place where memccpy is mentioned, says overlap might fail, so we don't try it. Besides, it's hard to see the rationale for a non-left-to-right memccpy. */ - it = "memccpy"; + it = PSTR("memccpy"); check(memccpy(one, "abc", 'q', 4) == NULL); /* Returned value. */ equal(one, "abc"); /* Did the copy go right? */ @@ -486,12 +599,15 @@ void libm_test_string() equal(two, "xbcdlebee"); #endif /* memset. */ - it = "memset"; + it = PSTR("memset"); (void)strcpy(one, "abcdefgh"); check(memset(one + 1, 'x', 3) == one + 1); /* Return value. */ equal(one, "axxxefgh"); /* Basic test. */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmemset-transposed-args" (void)memset(one + 2, 'y', 0); +#pragma GCC diagnostic pop equal(one, "axxxefgh"); /* Zero-length set. */ (void)memset(one + 5, 0, 1); @@ -503,7 +619,7 @@ void libm_test_string() /* bcopy - much like memcpy. Berklix manual is silent about overlap, so don't test it. */ - it = "bcopy"; + it = PSTR("bcopy"); (void)bcopy("abc", one, 4); equal(one, "abc"); /* Simple copy. */ @@ -522,7 +638,7 @@ void libm_test_string() equal(one, "hi there"); /* Stomped on source? */ /* bzero. */ - it = "bzero"; + it = PSTR("bzero"); (void)strcpy(one, "abcdef"); bzero(one + 2, 2); equal(one, "ab"); /* Basic test. */ @@ -534,7 +650,7 @@ void libm_test_string() equal(one, "abcdef"); /* Zero-length copy. */ /* bcmp - somewhat like memcmp. */ - it = "bcmp"; + it = PSTR("bcmp"); check(bcmp("a", "a", 1) == 0); /* Identity. */ check(bcmp("abc", "abc", 3) == 0); /* Multicharacter. */ check(bcmp("abcd", "abce", 4) != 0); /* Honestly unequal. */ diff --git a/tests/device/test_libc/memmove1.c b/tests/device/test_libc/memmove1.c index 8a6403ee94..8e357002d9 100644 --- a/tests/device/test_libc/memmove1.c +++ b/tests/device/test_libc/memmove1.c @@ -62,6 +62,7 @@ int errors = 0; printf /* A safe target-independent memmove. */ +void mymemmove(unsigned char* dest, unsigned char* src, size_t n) __attribute__((__noinline__)); void mymemmove(unsigned char* dest, unsigned char* src, size_t n) { diff --git a/tests/device/test_libc/strcmp-1.c b/tests/device/test_libc/strcmp-1.c index e8663b9ba9..b76324a92e 100644 --- a/tests/device/test_libc/strcmp-1.c +++ b/tests/device/test_libc/strcmp-1.c @@ -31,18 +31,8 @@ #include #include -#define memcmp memcmp_P #define memcpy memcpy_P -#define memmem memmem_P -#define memchr memchr_P -#define strcat strcat_P -#define strncat strncat_P -#define strcpy strcpy_P -#define strncpy strncpy_P -#define strlen strlen_P -#define strnlen strnlen_P #define strcmp strcmp_P -#define strncmp strncmp_P #define BUFF_SIZE 256 diff --git a/tests/device/test_libc/test_libc.ino.globals.h b/tests/device/test_libc/test_libc.ino.globals.h new file mode 100644 index 0000000000..1bfe3ba4d5 --- /dev/null +++ b/tests/device/test_libc/test_libc.ino.globals.h @@ -0,0 +1,4 @@ +/*@create-file:build.opt@ + +-fno-builtin +*/ diff --git a/tests/device/test_libc/tstring.c b/tests/device/test_libc/tstring.c index 7d508d4c6e..43adfc3bed 100644 --- a/tests/device/test_libc/tstring.c +++ b/tests/device/test_libc/tstring.c @@ -13,6 +13,7 @@ #define MAX_1 50 #define memcmp memcmp_P #define memcpy memcpy_P +#define memmove memmove_P #define memmem memmem_P #define memchr memchr_P #define strcat strcat_P @@ -86,6 +87,8 @@ void tstring_main(void) tmp2[0] = 'Z'; tmp2[1] = '\0'; +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmemset-transposed-args" if (memset(target, 'X', 0) != target || memcpy(target, "Y", 0) != target || memmove(target, "K", 0) != target || strncpy(tmp2, "4", 0) != tmp2 || strncat(tmp2, "123", 0) != tmp2 || strcat(target, "") != target) @@ -93,6 +96,7 @@ void tstring_main(void) eprintf(__LINE__, target, "A", 0); test_failed = 1; } +#pragma GCC diagnostic pop if (strcmp(target, "A") || strlen(target) != 1 || memchr(target, 'A', 0) != NULL || memcmp(target, "J", 0) || strncmp(target, "A", 1) || strncmp(target, "J", 0) diff --git a/tests/device/test_sw_FS/test_sw_FS.ino b/tests/device/test_sw_FS/test_sw_FS.ino index 0a33dc8586..41d7d188fc 100644 --- a/tests/device/test_sw_FS/test_sw_FS.ino +++ b/tests/device/test_sw_FS/test_sw_FS.ino @@ -1,5 +1,5 @@ #include -#include "FS.h" +#include #include BS_ENV_DECLARE(); @@ -18,17 +18,17 @@ bool pretest() TEST_CASE("read-write test","[fs]") { - REQUIRE(SPIFFS.begin()); + REQUIRE(LittleFS.begin()); String text = "write test"; { - File out = SPIFFS.open("/tmp.txt", "w"); + File out = LittleFS.open("/tmp.txt", "w"); REQUIRE(out); out.print(text); } { - File in = SPIFFS.open("/tmp.txt", "r"); + File in = LittleFS.open("/tmp.txt", "r"); REQUIRE(in); CHECK(in.size() == text.length()); in.setTimeout(0); @@ -39,14 +39,14 @@ TEST_CASE("read-write test","[fs]") TEST_CASE("A bunch of files show up in openDir, and can be removed", "[fs]") { - REQUIRE(SPIFFS.begin()); + REQUIRE(LittleFS.begin()); const int n = 10; int found[n] = {0}; { - Dir root = SPIFFS.openDir(""); + Dir root = LittleFS.openDir(""); while (root.next()) { - CHECK(SPIFFS.remove(root.fileName())); + CHECK(LittleFS.remove(root.fileName())); } } @@ -55,14 +55,14 @@ TEST_CASE("A bunch of files show up in openDir, and can be removed", "[fs]") name += i; name += ".txt"; - File out = SPIFFS.open(name, "w"); + File out = LittleFS.open(name, "w"); REQUIRE(out); out.println(i); } { - Dir root = SPIFFS.openDir("/"); + Dir root = LittleFS.openDir("/"); while (root.next()) { String fileName = root.fileName(); CHECK(fileName.indexOf("/seq_") == 0); @@ -77,35 +77,35 @@ TEST_CASE("A bunch of files show up in openDir, and can be removed", "[fs]") } { - Dir root = SPIFFS.openDir("/"); + Dir root = LittleFS.openDir("/"); while (root.next()) { String fileName = root.fileName(); - CHECK(SPIFFS.remove(fileName)); + CHECK(LittleFS.remove(fileName)); } } } TEST_CASE("files can be renamed", "[fs]") { - REQUIRE(SPIFFS.begin()); + REQUIRE(LittleFS.begin()); { - File tmp = SPIFFS.open("/tmp1.txt", "w"); + File tmp = LittleFS.open("/tmp1.txt", "w"); tmp.println("rename test"); } { - CHECK(SPIFFS.rename("/tmp1.txt", "/tmp2.txt")); + CHECK(LittleFS.rename("/tmp1.txt", "/tmp2.txt")); - File tmp2 = SPIFFS.open("/tmp2.txt", "r"); + File tmp2 = LittleFS.open("/tmp2.txt", "r"); CHECK(tmp2); } } TEST_CASE("FS::info works","[fs]") { - REQUIRE(SPIFFS.begin()); + REQUIRE(LittleFS.begin()); FSInfo info; - CHECK(SPIFFS.info(info)); + CHECK(LittleFS.info(info)); Serial.printf("Total: %u\nUsed: %u\nBlock: %u\nPage: %u\nMax open files: %u\nMax path len: %u\n", info.totalBytes, @@ -119,10 +119,10 @@ TEST_CASE("FS::info works","[fs]") TEST_CASE("FS is empty after format","[fs]") { - REQUIRE(SPIFFS.begin()); - REQUIRE(SPIFFS.format()); + REQUIRE(LittleFS.begin()); + REQUIRE(LittleFS.format()); - Dir root = SPIFFS.openDir("/"); + Dir root = LittleFS.openDir("/"); int count = 0; while (root.next()) { ++count; @@ -132,12 +132,12 @@ TEST_CASE("FS is empty after format","[fs]") TEST_CASE("Can reopen empty file","[fs]") { - REQUIRE(SPIFFS.begin()); + REQUIRE(LittleFS.begin()); { - File tmp = SPIFFS.open("/tmp.txt", "w"); + File tmp = LittleFS.open("/tmp.txt", "w"); } { - File tmp = SPIFFS.open("/tmp.txt", "w"); + File tmp = LittleFS.open("/tmp.txt", "w"); CHECK(tmp); } } diff --git a/tests/restyle.py b/tests/restyle.py index 78a8816000..4be9cab555 100755 --- a/tests/restyle.py +++ b/tests/restyle.py @@ -85,6 +85,7 @@ def find_core_files(): ) if file.is_file() and file.suffix in (".c", ".cpp", ".h", ".hpp") + and not GIT_ROOT / "tests/device/test_libc" in file.parents and not GIT_ROOT / "tests/host/bin" in file.parents and not GIT_ROOT / "tests/host/common/catch.hpp" == file ] From 30780cb8c97511106477dfec5e634c86d2af5495 Mon Sep 17 00:00:00 2001 From: Max Prokhorov Date: Tue, 27 May 2025 02:26:22 +0300 Subject: [PATCH 44/50] Tools - get.py updates (#9247) * Tools - get.py updates Using pathlib for paths, assume relative paths from __file__.parent as PWD Using argparse for arguments, expose previously uncustomizable bits. Reading tarfile with transparent compression. Drop previously untested .t{...} and .tar.{...}, just use "r:*" Remove hard-coded dependency on 'platform' and allow to specify sys_name, sys_platform and bits. Stub for DarwinARM, allow to fetch x86_64 packages in the meantime. * missing mkdir_p --- tools/get.py | 324 ++++++++++++++++++++++++++++++++++----------------- 1 file changed, 215 insertions(+), 109 deletions(-) diff --git a/tools/get.py b/tools/get.py index 81de20e1b9..a9fe1d07a3 100755 --- a/tools/get.py +++ b/tools/get.py @@ -1,138 +1,244 @@ #!/usr/bin/env python3 # This script will download and extract required tools into the current directory. # Tools list is obtained from package/package_esp8266com_index.template.json file. -# Written by Ivan Grokhotkov, 2015. -# -from __future__ import print_function -import os +# Originally written by Ivan Grokhotkov, 2015. + +import argparse import shutil -import errno -import os.path import hashlib import json +import pathlib import platform import sys import tarfile import zipfile import re -verbose = True - +from typing import Optional, Literal, List from urllib.request import urlretrieve -if sys.version_info >= (3,12): - TARFILE_EXTRACT_ARGS = {'filter': 'data'} + +PWD = pathlib.Path(__file__).parent + +if sys.version_info >= (3, 12): + TARFILE_EXTRACT_ARGS = {"filter": "data"} else: TARFILE_EXTRACT_ARGS = {} -dist_dir = 'dist/' +PLATFORMS = { + "Darwin": {32: "i386-apple-darwin", 64: "x86_64-apple-darwin"}, + "DarwinARM": {32: "arm64-apple-darwin", 64: "arm64-apple-darwin"}, + "Linux": {32: "i686-pc-linux-gnu", 64: "x86_64-pc-linux-gnu"}, + "LinuxARM": {32: "arm-linux-gnueabihf", 64: "aarch64-linux-gnu"}, + "Windows": {32: "i686-mingw32", 64: "x86_64-mingw32"}, +} + + +class HashMismatch(Exception): + pass + -def sha256sum(filename, blocksize=65536): - hash = hashlib.sha256() - with open(filename, "rb") as f: +def sha256sum(p: pathlib.Path, blocksize=65536): + hasher = hashlib.sha256() + with p.open("rb") as f: for block in iter(lambda: f.read(blocksize), b""): - hash.update(block) - return hash.hexdigest() + hasher.update(block) + + return hasher.hexdigest() -def mkdir_p(path): - try: - os.makedirs(path) - except OSError as exc: - if exc.errno != errno.EEXIST or not os.path.isdir(path): - raise def report_progress(count, blockSize, totalSize): - global verbose - if verbose: - percent = int(count*blockSize*100/totalSize) - percent = min(100, percent) - sys.stdout.write("\r%d%%" % percent) - sys.stdout.flush() - -def unpack(filename, destination): - dirname = '' - print('Extracting {0}'.format(filename)) - extension = filename.split('.')[-1] - if filename.endswith((f'.tar.{extension}', f'.t{extension}')): - tfile = tarfile.open(filename, f'r:{extension}') - tfile.extractall(destination, **TARFILE_EXTRACT_ARGS) - dirname= tfile.getnames()[0] - elif filename.endswith('zip'): - zfile = zipfile.ZipFile(filename) + percent = int(count * blockSize * 100 / totalSize) + percent = min(100, percent) + print(f"\r{percent}%", end="", file=sys.stdout, flush=True) + + +def unpack(p: pathlib.Path, destination: pathlib.Path): + outdir = None # type: Optional[pathlib.Path] + + print(f"Extracting {p}") + if p.suffix == ".zip": + zfile = zipfile.ZipFile(p) zfile.extractall(destination) - dirname = zfile.namelist()[0] + outdir = destination / zfile.namelist()[0] else: - raise NotImplementedError('Unsupported archive type') + tfile = tarfile.open(p, "r:*") + tfile.extractall(destination, **TARFILE_EXTRACT_ARGS) # type: ignore + outdir = destination / tfile.getnames()[0] + + if not outdir: + raise NotImplementedError(f"Unsupported archive type {p.suffix}") # a little trick to rename tool directories so they don't contain version number - rename_to = re.match(r'^([a-zA-Z_][^\-]*\-*)+', dirname).group(0).strip('-') - if rename_to != dirname: - print('Renaming {0} to {1}'.format(dirname, rename_to)) - if os.path.isdir(rename_to): - shutil.rmtree(rename_to) - shutil.move(dirname, rename_to) - -def get_tool(tool): - archive_name = tool['archiveFileName'] - local_path = dist_dir + archive_name - url = tool['url'] - real_hash = tool['checksum'].split(':')[1] - if not os.path.isfile(local_path): - print('Downloading ' + archive_name); - urlretrieve(url, local_path, report_progress) - sys.stdout.write("\rDone\n") - sys.stdout.flush() + match = re.match(r"^([a-zA-Z_][^\-]*\-*)+", outdir.name) + if match: + rename_to = match.group(0).strip("-") else: - print('Tool {0} already downloaded'.format(archive_name)) - local_hash = sha256sum(local_path) - if local_hash != real_hash: - print('Hash mismatch for {0}, delete the file and try again'.format(local_path)) - raise RuntimeError() - unpack(local_path, '.') - -def load_tools_list(filename, platform): - tools_info = json.load(open(filename))['packages'][0]['tools'] - tools_to_download = [] - for t in tools_info: - tool_platform = [p for p in t['systems'] if p['host'] == platform] - if len(tool_platform) == 0: - continue - tools_to_download.append(tool_platform[0]) - return tools_to_download - -def identify_platform(): - arduino_platform_names = {'Darwin' : {32 : 'i386-apple-darwin', 64 : 'x86_64-apple-darwin'}, - 'Linux' : {32 : 'i686-pc-linux-gnu', 64 : 'x86_64-pc-linux-gnu'}, - 'LinuxARM': {32 : 'arm-linux-gnueabihf', 64 : 'aarch64-linux-gnu'}, - 'Windows' : {32 : 'i686-mingw32', 64 : 'x86_64-mingw32'}} - bits = 32 - if sys.maxsize > 2**32: - bits = 64 - sys_name = platform.system() - if 'Linux' in sys_name and (platform.platform().find('arm') > 0 or platform.platform().find('aarch64') > 0): - sys_name = 'LinuxARM' - if 'CYGWIN_NT' in sys_name: - sys_name = 'Windows' - if 'MSYS_NT' in sys_name: - sys_name = 'Windows' - if 'MINGW' in sys_name: - sys_name = 'Windows' - return arduino_platform_names[sys_name][bits] - -def main(): - global verbose - # Support optional "-q" quiet mode simply - if len(sys.argv) == 2: - if sys.argv[1] == "-q": - verbose = False - # Remove a symlink generated in 2.6.3 which causes later issues since the tarball can't properly overwrite it - if (os.path.exists('python3/python3')): - os.unlink('python3/python3') - print('Platform: {0}'.format(identify_platform())) - tools_to_download = load_tools_list('../package/package_esp8266com_index.template.json', identify_platform()) - mkdir_p(dist_dir) + rename_to = outdir.name + + if outdir.name != rename_to: + print(f"Renaming {outdir.name} to {rename_to}") + destdir = destination / rename_to + if destdir.is_dir(): + shutil.rmtree(destdir) + shutil.move(outdir, destdir) + + +# ref. https://docs.arduino.cc/arduino-cli/package_index_json-specification/ +def get_tool(tool: dict, *, dist_dir: pathlib.Path, quiet: bool, dry_run: bool): + if not dist_dir.exists(): + dist_dir.mkdir(parents=True, exist_ok=True) + + archive_name = tool["archiveFileName"] + local_path = dist_dir / archive_name + + url = tool["url"] + algorithm, real_hash = tool["checksum"].split(":", 1) + if algorithm != "SHA-256": + raise NotImplementedError(f"Unsupported hash algorithm {algorithm}") + + if dry_run: + print(f'{archive_name} ({tool.get("size")} bytes): {url}') + else: + if not quiet: + reporthook = report_progress + else: + reporthook = None + + if not local_path.is_file(): + print(f"Downloading {archive_name}") + urlretrieve(url, local_path, reporthook) + print("\rDone", file=sys.stdout, flush=True) + else: + print( + f"Tool {archive_name} ({local_path.stat().st_size} bytes) already downloaded" + ) + + if not dry_run or (dry_run and local_path.exists()): + local_hash = sha256sum(local_path) + if local_hash != real_hash: + raise HashMismatch( + f"Expected {local_hash}, got {real_hash}. Delete {local_path} and try again" + ) from None + + if not dry_run: + unpack(local_path, PWD / ".") + + +def load_tools_list(package_index_json: pathlib.Path, hosts: List[str]): + out = [] + + with package_index_json.open("r") as f: + root = json.load(f) + + package = root["packages"][0] + tools = package["tools"] + + for info in tools: + found = [p for p in info["systems"] for host in hosts if p["host"] == host] + found.sort(key=lambda p: hosts.index(p["host"])) + if found: + out.append(found[0]) + + return out + + +def select_host( + sys_name: Optional[str], + sys_platform: Optional[str], + bits: Optional[Literal[32, 64]], +) -> List[str]: + if not sys_name: + sys_name = platform.system() + + if not sys_platform: + sys_platform = platform.platform() + + if not bits: + bits = 32 + if sys.maxsize > 2**32: + bits = 64 + + def maybe_arm(s: str) -> bool: + return (s.find("arm") > 0) or (s.find("aarch64") > 0) + + if "Darwin" in sys_name and maybe_arm(sys_platform): + sys_name = "DarwinARM" + elif "Linux" in sys_name and maybe_arm(sys_platform): + sys_name = "LinuxARM" + elif "CYGWIN_NT" in sys_name or "MSYS_NT" in sys_name or "MINGW" in sys_name: + sys_name = "Windows" + + out = [ + PLATFORMS[sys_name][bits], + ] + + if sys_name == "DarwinARM": + out.append(PLATFORMS["Darwin"][bits]) + + return out + + +def main(args: argparse.Namespace): + # #6960 - Remove a symlink generated in 2.6.3 which causes later issues since the tarball can't properly overwrite it + py3symlink = PWD / "python3" / "python3" + if py3symlink.is_symlink(): + py3symlink.unlink() + + host = args.host + if not host: + host = select_host( + sys_name=args.system, + sys_platform=args.platform, + bits=args.bits, + ) + + print(f"Platform: {', '.join(host)}") + + tools_to_download = load_tools_list(args.package_index_json, host) + if args.tool: + tools_to_download = [ + tool + for tool in tools_to_download + for exclude in args.tool + if exclude in tool["archiveFileName"] + ] + for tool in tools_to_download: - get_tool(tool) + get_tool( + tool, + dist_dir=args.dist_dir, + quiet=args.quiet, + dry_run=args.dry_run, + ) + + +def parse_args(args: Optional[str] = None, namespace=argparse.Namespace): + parser = argparse.ArgumentParser( + formatter_class=argparse.ArgumentDefaultsHelpFormatter + ) + + parser.add_argument("-q", "--quiet", action="store_true", default=False) + parser.add_argument("-d", "--dry-run", action="store_true", default=False) + parser.add_argument("-t", "--tool", action="append", type=str) + + parser.add_argument("--host", type=str, action="append") + parser.add_argument("--system", type=str) + parser.add_argument("--platform", type=str) + parser.add_argument("--bits", type=int, choices=PLATFORMS["Linux"].keys()) + + parser.add_argument( + "--no-progress", dest="quiet", action="store_true", default=False + ) + parser.add_argument("--dist-dir", type=pathlib.Path, default=PWD / "dist") + parser.add_argument( + "--package-index-json", + type=pathlib.Path, + default=PWD / ".." / "package/package_esp8266com_index.template.json", + ) + + return parser.parse_args(args, namespace) + -if __name__ == '__main__': - main() +if __name__ == "__main__": + main(parse_args()) From 4214e16671f43d224318122b1b5204edfb979810 Mon Sep 17 00:00:00 2001 From: Max Prokhorov Date: Tue, 27 May 2025 06:55:03 +0300 Subject: [PATCH 45/50] Tools - makecorever.py explicit output argument (#9248) * Tools - makecorever.py explicit output argument Don't hide where the file is actually placed Using pathlib instead of raw strings to simplify path ops Plus, add stdout preview when output is missing Clean-up git-describe <-> version availility checks * typo * fix unhandled exc in git cmd * unused escape * RELEASE using same values --- cores/esp8266/Esp-version.cpp | 3 +- cores/esp8266/Esp.cpp | 2 +- platform.txt | 2 +- tools/makecorever.py | 182 ++++++++++++++++++++++------------ tools/platformio-build.py | 8 +- 5 files changed, 129 insertions(+), 68 deletions(-) diff --git a/cores/esp8266/Esp-version.cpp b/cores/esp8266/Esp-version.cpp index c1ff61eb06..85485b2f73 100644 --- a/cores/esp8266/Esp-version.cpp +++ b/cores/esp8266/Esp-version.cpp @@ -20,10 +20,11 @@ #include #include -#include #include // LWIP_HASH_STR (lwip2) #include // BEARSSL_GIT short hash +#include + #define STRHELPER(x) #x #define STR(x) STRHELPER(x) // stringifier diff --git a/cores/esp8266/Esp.cpp b/cores/esp8266/Esp.cpp index 67719dcfe7..8a3ea32515 100644 --- a/cores/esp8266/Esp.cpp +++ b/cores/esp8266/Esp.cpp @@ -254,7 +254,7 @@ String EspClass::getCoreVersion() return String(core_release); } char buf[12]; - snprintf(buf, sizeof(buf), "%08x", core_version); + snprintf(buf, sizeof(buf), PSTR("%08x"), core_version); return String(buf); } diff --git a/platform.txt b/platform.txt index c34c719ae7..f3392d652d 100644 --- a/platform.txt +++ b/platform.txt @@ -121,7 +121,7 @@ compiler.elf2hex.extra_flags= ## needs git recipe.hooks.sketch.prebuild.pattern="{runtime.tools.python3.path}/python3" -I "{runtime.tools.signing}" --mode header --publickey "{build.source.path}/public.key" --out "{build.path}/core/Updater_Signing.h" # This is quite a working hack. This form of prebuild hook, while intuitive, is not explicitly documented. -recipe.hooks.prebuild.1.pattern="{runtime.tools.python3.path}/python3" -I "{runtime.tools.makecorever}" --build_path "{build.path}" --platform_path "{runtime.platform.path}" --version "{version}" +recipe.hooks.prebuild.1.pattern="{runtime.tools.python3.path}/python3" -I "{runtime.tools.makecorever}" --git-root "{runtime.platform.path}" --version "{version}" "{build.path}/core/core_version.h" # Handle processing sketch global options recipe.hooks.prebuild.2.pattern="{runtime.tools.python3.path}/python3" -I "{runtime.tools.mkbuildoptglobals}" "{runtime.ide.path}" {runtime.ide.version} "{build.path}" "{build.opt.fqfn}" "{globals.h.source.fqfn}" "{commonhfile.fqfn}" {mkbuildoptglobals.extra_flags} diff --git a/tools/makecorever.py b/tools/makecorever.py index d3f44f1742..9062e5b4da 100755 --- a/tools/makecorever.py +++ b/tools/makecorever.py @@ -18,25 +18,59 @@ # along with this program. If not, see . import argparse -import os +import pathlib import subprocess +import sys +from typing import Optional, TextIO + + +PWD = pathlib.Path(__file__).parent.absolute() + +VERSION_UNSPECIFIED = "unspecified" +VERSION_DEFAULT = ("0", "0", "0") -def generate(path, platform_path, version="unspecified", release = False): - def git(*args): - cmd = ["git", "-C", platform_path] - cmd.extend(args) - proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True, stderr=subprocess.DEVNULL) - return proc.stdout.readlines()[0].strip() - text = "" +def check_git(*args: str, cwd: Optional[str]): + cmd = ["git"] + if cwd: + cmd.extend(["-C", cwd]) + cmd.extend(args) - git_ver = "00000000" try: - git_ver = git("rev-parse", "--short=8", "HEAD") - except Exception: + with subprocess.Popen( + cmd, + stdout=subprocess.PIPE, + universal_newlines=True, + stderr=subprocess.DEVNULL, + ) as proc: + if proc.stdout: + lines = proc.stdout.readlines() + return lines[0].strip() + except IndexError: pass - text = "#define ARDUINO_ESP8266_GIT_VER 0x{}\n".format(git_ver) + except FileNotFoundError: + pass + + return "" + + +def generate( + out: TextIO, + *, + git_root: pathlib.Path, + hash_length: int = 8, + release: bool, + version: str, +): + git_root = git_root.absolute() + git_cwd = git_root.as_posix() + + def git(*args): + return check_git(*args, cwd=git_cwd) + + git_ver = "0" * hash_length + git_ver = git("rev-parse", f"--short={hash_length}", "HEAD") or git_ver # version is # - using Arduino-CLI: @@ -45,75 +79,99 @@ def git(*args): # - using git: # - 5.6.7 (from release script, official release) # - 5.6.7-42-g00d1e5 (from release script, test release) - git_desc = version - try: - # in any case, get a better version when git is around - git_desc = git("describe", "--tags") - except Exception: - pass - text += "#define ARDUINO_ESP8266_GIT_DESC {}\n".format(git_desc) - text += "#define ARDUINO_ESP8266_VERSION {}\n".format(version) - text += "\n" + # in any case, get a better version when git is around + git_desc = git("describe", "--tags") or version + + if version == VERSION_UNSPECIFIED: + version = git_desc + + version_triple = list(VERSION_DEFAULT) + + if version != VERSION_UNSPECIFIED: + try: + version_triple = version.split(".", 2) + except ValueError: + pass - version_split = version.split(".") - # major: if present, skip "unix-" in "unix-3" - text += "#define ARDUINO_ESP8266_MAJOR {}\n".format(version_split[0].split("-")[-1]) - text += "#define ARDUINO_ESP8266_MINOR {}\n".format(version_split[1]) - # revision can be ".n" or ".n-dev" or ".n-42-g00d1e5" - revision = version_split[2].split("-") - text += "#define ARDUINO_ESP8266_REVISION {}\n".format(revision[0]) - text += "\n" + major, minor, patch = version_triple - # release or dev ? + major = major.split("-")[-1] + revision = patch.split("-")[0] + + text = rf"""// ! ! ! DO NOT EDIT, AUTOMATICALLY GENERATED ! ! ! +#define ARDUINO_ESP8266_GIT_VER 0x{git_ver} +#define ARDUINO_ESP8266_GIT_DESC {git_desc} +#define ARDUINO_ESP8266_VERSION {version} + +#define ARDUINO_ESP8266_MAJOR {major} +#define ARDUINO_ESP8266_MINOR {minor} +#define ARDUINO_ESP8266_REVISION {revision} +""" if release: - text += "#define ARDUINO_ESP8266_RELEASE \"{}\"\n".format(git_desc) - text += "#define ARDUINO_ESP8266_RELEASE_{}\n".format(git_desc.replace("-","_").replace(".","_")) + text += rf""" +#define ARDUINO_ESP8266_RELEASE \"{major}.{minor}.{revision}\" +#define ARDUINO_ESP8266_RELEASE_{major}_{minor}_{revision} +""" else: - text += "#define ARDUINO_ESP8266_DEV 1 // development version\n" - - try: - with open(path, "r") as inp: - old_text = inp.read() - if old_text == text: - return - except Exception: - pass + text += """ +#define ARDUINO_ESP8266_DEV 1 // development version +""" - with open(path, "w") as out: - out.write(text) + out.write(text) if __name__ == "__main__": parser = argparse.ArgumentParser(description="Generate core_version.h") parser.add_argument( - "-b", "--build_path", action="store", required=True, help="build.path variable" + "--git-root", + action="store", + help="ESP8266 Core Git root. In platform.txt, this is {platform.path}", + type=pathlib.Path, + default=PWD / "..", + ) + parser.add_argument( + "--hash-length", + default=8, + type=int, + help="Used in git rev-parse --short=...", ) parser.add_argument( - "-p", - "--platform_path", + "--version", action="store", - required=True, - help="platform.path variable", + default=VERSION_UNSPECIFIED, + help="ESP8266 Core version string. In platform.txt, this is {version}", ) parser.add_argument( - "-v", "--version", action="store", required=True, help="version variable" + "--release", + action="store_true", + default=False, + help="In addition to numeric version, also provide ARDUINO_ESP8266_RELEASE{,_...} definitions", + ) + parser.add_argument( + "output", + nargs="?", + type=str, + default="", ) - parser.add_argument("-i", "--include_dir", default="core") - parser.add_argument("-r", "--release", action="store_true", default=False) args = parser.parse_args() - include_dir = os.path.join(args.build_path, args.include_dir) - try: - os.makedirs(include_dir) - except Exception: - pass + def select_output(s: str) -> TextIO: + if not s: + return sys.stdout - generate( - os.path.join(include_dir, "core_version.h"), - args.platform_path, - version=args.version, - release=args.release - ) + out = pathlib.Path(s) + out.parent.mkdir(parents=True, exist_ok=True) + + return out.open("w", encoding="utf-8") + + with select_output(args.output) as out: + generate( + out, + git_root=args.git_root, + hash_length=args.hash_length, + release=args.release, + version=args.version, + ) diff --git a/tools/platformio-build.py b/tools/platformio-build.py index 20fe8c77fb..fafcac728d 100644 --- a/tools/platformio-build.py +++ b/tools/platformio-build.py @@ -409,18 +409,20 @@ def platform_txt_version(default): if isdir(join(FRAMEWORK_DIR, ".git")): - cmd = '"$PYTHONEXE" "{script}" -b "$BUILD_DIR" -p "{framework_dir}" -v {version}' + out = join("$BUILD_DIR", "core", "core_version.h") + + cmd = '"$PYTHONEXE" "{script}" --git-root "{framework_dir}" --version {version} "$TARGET"' fmt = { "script": join(FRAMEWORK_DIR, "tools", "makecorever.py"), "framework_dir": FRAMEWORK_DIR, - "version": platform_txt_version("unspecified") + "version": platform_txt_version("unspecified"), } env.Prepend(CPPPATH=[ join("$BUILD_DIR", "core") ]) core_version = env.Command( - join("$BUILD_DIR", "core", "core_version.h"), + out, join(FRAMEWORK_DIR, ".git"), env.VerboseAction(cmd.format(**fmt), "Generating $TARGET") ) From 2201770a20ed3d62471eb8fa6140abdf2a431ca7 Mon Sep 17 00:00:00 2001 From: Max Prokhorov Date: Wed, 28 May 2025 03:57:47 +0300 Subject: [PATCH 46/50] Tools - makecorever.py fixed packaging & avoid needless overwrites (#9250) update packaging script w/ new arguments rewrite ci build pattern to only rewrite core_version.h once per job restore behaviour from #6414 for other cases --- package/build_boards_manager_package.sh | 2 +- tests/common.sh | 1 + tests/sanity_check.sh | 3 ++- tools/makecorever.py | 29 +++++++++++-------------- 4 files changed, 17 insertions(+), 18 deletions(-) diff --git a/package/build_boards_manager_package.sh b/package/build_boards_manager_package.sh index 40050f4437..dc15f90fc5 100755 --- a/package/build_boards_manager_package.sh +++ b/package/build_boards_manager_package.sh @@ -117,7 +117,7 @@ $SED -E "s/name=([a-zA-Z0-9\ -]+).*/name=\1(${ver})/g"\ #echo "#define ARDUINO_ESP8266_GIT_DESC `git describe --tags 2>/dev/null`" >>${outdir}/cores/esp8266/core_version.h #echo "#define ARDUINO_ESP8266_RELEASE_${ver_define}" >>${outdir}/cores/esp8266/core_version.h #echo "#define ARDUINO_ESP8266_RELEASE \"${ver_define}\"" >>${outdir}/cores/esp8266/core_version.h -python3 ${srcdir}/tools/makecorever.py -b ${outdir} -i cores/esp8266 -p ${srcdir} -v ${plain_ver} -r +python3 ${srcdir}/tools/makecorever.py --git-root ${srcdir} --version ${plain_ver} --release ${outdir}/cores/esp8266/core_version.h # Zip the package pushd package/versions/${visiblever} diff --git a/tests/common.sh b/tests/common.sh index d26db8f3a6..c52756d177 100755 --- a/tests/common.sh +++ b/tests/common.sh @@ -312,6 +312,7 @@ function install_core() "compiler.c.extra_flags=-Wall -Wextra $debug_flags" \ "compiler.cpp.extra_flags=-Wall -Wextra $debug_flags" \ "mkbuildoptglobals.extra_flags=--ci --cache_core" \ + "recipe.hooks.prebuild.1.pattern=\"{runtime.tools.python3.path}/python3\" -I \"{runtime.tools.makecorever}\" --git-root \"{runtime.platform.path}\" --version \"{version}\" \"{runtime.platform.path}/cores/esp8266/core_version.h\"" \ > ${core_path}/platform.local.txt echo -e "\n----platform.local.txt----" cat platform.local.txt diff --git a/tests/sanity_check.sh b/tests/sanity_check.sh index a4754a0ed4..f5f2a6f2e1 100755 --- a/tests/sanity_check.sh +++ b/tests/sanity_check.sh @@ -5,8 +5,9 @@ source "$root/tests/common.sh" pushd "$root"/tools python3 get.py -q - +python3 makecorever.py --git-root "$root" "$root/cores/esp8266/core_version.h" popd + pushd "$cache_dir" gcc="$root/tools/xtensa-lx106-elf/bin/xtensa-lx106-elf-gcc"\ diff --git a/tools/makecorever.py b/tools/makecorever.py index 9062e5b4da..939120fff3 100755 --- a/tools/makecorever.py +++ b/tools/makecorever.py @@ -56,7 +56,6 @@ def check_git(*args: str, cwd: Optional[str]): def generate( - out: TextIO, *, git_root: pathlib.Path, hash_length: int = 8, @@ -118,7 +117,7 @@ def git(*args): #define ARDUINO_ESP8266_DEV 1 // development version """ - out.write(text) + return text if __name__ == "__main__": @@ -158,20 +157,18 @@ def git(*args): args = parser.parse_args() - def select_output(s: str) -> TextIO: - if not s: - return sys.stdout + contents = generate( + git_root=args.git_root, + hash_length=args.hash_length, + release=args.release, + version=args.version, + ) - out = pathlib.Path(s) + if args.output: + out = pathlib.Path(args.output) out.parent.mkdir(parents=True, exist_ok=True) - return out.open("w", encoding="utf-8") - - with select_output(args.output) as out: - generate( - out, - git_root=args.git_root, - hash_length=args.hash_length, - release=args.release, - version=args.version, - ) + if not out.exists() or contents != out.read_text(encoding="utf-8"): + out.write_text(contents, encoding="utf-8") + else: + print(contents, file=sys.stdout) From 0ecb6f06fb317e0695e602f209a820899a8c1186 Mon Sep 17 00:00:00 2001 From: Max Prokhorov Date: Thu, 29 May 2025 04:00:31 +0300 Subject: [PATCH 47/50] Stack Thunk - check saved a1 before using and zero after using (#9252) post #9224, allow to call 'stack_thunk_yield()' outside of bssl context Reset 'stack_thunk_save' before returning from 'thunk_...'ed function Skip invalid a1 load and yield with the current value --- cores/esp8266/StackThunk.cpp | 7 ++++++- cores/esp8266/StackThunk.h | 10 +++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/cores/esp8266/StackThunk.cpp b/cores/esp8266/StackThunk.cpp index baa793bdc5..a0be352c7b 100644 --- a/cores/esp8266/StackThunk.cpp +++ b/cores/esp8266/StackThunk.cpp @@ -73,6 +73,7 @@ void stack_thunk_add_ref() } stack_thunk_top = stack_thunk_ptr + _stackSize - 1; stack_thunk_save = NULL; + stack_thunk_yield_save = NULL; stack_thunk_repaint(); } } @@ -90,6 +91,7 @@ void stack_thunk_del_ref() stack_thunk_ptr = NULL; stack_thunk_top = NULL; stack_thunk_save = NULL; + stack_thunk_yield_save = NULL; } } @@ -175,15 +177,18 @@ asm( "movi a2, stack_thunk_yield_save\n\t" "s32i.n a1, a2, 0\n\t" "movi a2, stack_thunk_save\n\t" +/* But, only when inside of bssl stack (saved a1 != 0) */ + "l32i.n a3, a2, 0\n\t" + "beqz a3, stack_thunk_yield_do_yield\n\t" "l32i.n a1, a2, 0\n\t" /* optimistic_yield(10000) without extra l32r */ +"stack_thunk_yield_do_yield:\n\t" "movi a2, 0x10\n\t" "addmi a2, a2, 0x2700\n\t" "call0 optimistic_yield\n\t" /* Swap bearssl <-> cont stacks, again */ "movi a2, stack_thunk_yield_save\n\t" "l32i.n a1, a2, 0\n\t" - "\n" /* Restore caller */ "l32i.n a0, a1, 12\n\t" "addi a1, a1, 16\n\t" diff --git a/cores/esp8266/StackThunk.h b/cores/esp8266/StackThunk.h index 350775ec24..b7dd521e94 100644 --- a/cores/esp8266/StackThunk.h +++ b/cores/esp8266/StackThunk.h @@ -27,6 +27,8 @@ #ifndef _STACKTHUNK_H #define _STACKTHUNK_H +#include + #ifdef __cplusplus extern "C" { #endif @@ -80,9 +82,11 @@ thunk_"#fcnToThunk":\n\ call0 stack_thunk_fatal_smashing\n\ .L1"#fcnToThunk":\n\ movi a15, stack_thunk_save /* Restore A1(SP) */\n\ - l32i.n a1, a15, 0\n\ - l32i.n a15, a1, 8 /* Restore the saved registers */\n\ - l32i.n a0, a1, 12\n\ + l32i.n a1, a15, 0/* Restore A1(SP) */\n\ + movi a0, 0 /* Purge temporary storage */\n\ + s32i.n a0, a15, 0\n\ + l32i.n a15, a1, 8/* Restore A15 */\n\ + l32i.n a0, a1, 12/* Restore A0 */\n\ addi a1, a1, 16 /* Free up stack and return to caller */\n\ ret\n\ .size thunk_"#fcnToThunk", . - thunk_"#fcnToThunk"\n"); From 9592c2b5cb5ce7c5174f582d548d8b1b6d8cf39d Mon Sep 17 00:00:00 2001 From: Max Prokhorov Date: Thu, 29 May 2025 04:56:50 +0300 Subject: [PATCH 48/50] Doc - cleanup (#9253) mention esptool.FatalError & syntax corrections un-orphan FAQ and toctree glob inclusion --- doc/{faq/readme.rst => faq.rst} | 18 +-- ..._sync-failed.rst => a01-upload-failed.rst} | 124 +++++++++++++++--- doc/faq/a02-my-esp-crashes.rst | 2 - doc/faq/a03-library-does-not-work.rst | 2 - doc/faq/a04-board-generic-is-unknown.rst | 2 - doc/faq/a05-board-generator.rst | 2 - doc/faq/a06-global-build-options.rst | 2 - doc/index.rst | 23 +++- 8 files changed, 138 insertions(+), 37 deletions(-) rename doc/{faq/readme.rst => faq.rst} (94%) rename doc/faq/{a01-espcomm_sync-failed.rst => a01-upload-failed.rst} (78%) diff --git a/doc/faq/readme.rst b/doc/faq.rst similarity index 94% rename from doc/faq/readme.rst rename to doc/faq.rst index cfd65eca90..869db97bc2 100644 --- a/doc/faq/readme.rst +++ b/doc/faq.rst @@ -13,14 +13,14 @@ Please feel free to contribute if you believe that some frequent issues are not covered below. -I am getting "espcomm\_sync failed" error when trying to upload my ESP. How to resolve this issue? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +I am getting "espcomm\_sync failed", "esptool.FatalError", etc. How to resolve this issue? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This message indicates issue with uploading ESP module over a serial connection. There are couple of possible causes, that depend on the type of your module, if you use separate USB to serial converter. -`Read more `__. +`Read more `__. Why esptool is not listed in "Programmer" menu? How do I upload ESP without it? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -38,7 +38,7 @@ My ESP crashes running some code. How to troubleshoot it? The code may crash because of s/w bug or issue with your h/w. Before entering an issue report, please perform initial troubleshooting. -`Read more `__. +`Read more `__. How can I get some extra KBs in flash ? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -50,7 +50,7 @@ How can I get some extra KBs in flash ? * Use the debug level option ``NoAssert-NDEBUG`` (in the Tools menu) -`Read more `__. +`Read more `__. About WPS ~~~~~~~~~ @@ -63,7 +63,7 @@ required to enable it: ``./tools/boards.txt.py --allowWPS --boardsgen`` -`Read more `__. +`Read more `__. For platformIO (and maybe other build environments), you will also need to add the build flag: -D NO_EXTRA_4K_HEAP @@ -77,7 +77,7 @@ This Arduino library doesn't work on ESP. How do I make it work? You would like to use this Arduino library with ESP8266 and it does not perform. It is not listed among libraries verified to work with ESP8266. -`Read more `__. +`Read more `__. In the IDE, for ESP-12E that has 4M flash, I can choose 4M (1M FS) or 4M (3M FS). No matter what I select, the IDE tells me the maximum code space is about 1M. Where does my flash go? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -118,7 +118,7 @@ This error may pop up after switching between `staging `__ and `stable `__ esp8266 / Arduino package installations, or after upgrading the package version -`Read more `__. +`Read more `__. How to clear TCP PCBs in time-wait state ? @@ -199,4 +199,4 @@ By using a uniquely named `.h` file, macro definitions can be created and globally used. Additionally, compiler command-line options can be embedded in this file as a unique block comment. -`Read more `__. +`Read more `__. diff --git a/doc/faq/a01-espcomm_sync-failed.rst b/doc/faq/a01-upload-failed.rst similarity index 78% rename from doc/faq/a01-espcomm_sync-failed.rst rename to doc/faq/a01-upload-failed.rst index d47a5d2eeb..cefda15829 100644 --- a/doc/faq/a01-espcomm_sync-failed.rst +++ b/doc/faq/a01-upload-failed.rst @@ -1,7 +1,5 @@ -:orphan: - -I am getting "espcomm\_sync failed" error when trying to upload my ESP. How to resolve this issue? --------------------------------------------------------------------------------------------------- +Why I am getting errors when trying to upload to my ESP? +-------------------------------------------------------- - `Introduction <#introduction>`__ - `Initial Checks <#initial-checks>`__ @@ -15,14 +13,24 @@ I am getting "espcomm\_sync failed" error when trying to upload my ESP. How to r Introduction ~~~~~~~~~~~~ -This message indicates issue with uploading ESP module over a serial +Messages like + +* ``espcomm_sync failed`` + +* ``esptool.FatalError: Failed to connect to ESP8266: Invalid head of packet (0xF0)`` + +* ``esptool.FatalError: Failed to connect to ESP8266: Timed out waiting for packet header`` + +indicate issue with with uploading ESP module over a serial connection. There are couple of possible causes, that depend on the type of module, if you use separate USB to serial converter, what parameters are selected for upload, etc. As result there is no single answer on the root cause. To find it out you may need to complete couple of troubleshooting steps. - Note: If you are just starting with ESP, to reduce potential issues +.. note:: + + If you are just starting with ESP, to reduce potential issues with uploading, select ESP board with integrated USB to serial converter. This will considerably reduce number of user depended factors or configuration settings that influence upload process. @@ -167,7 +175,93 @@ loading <../boards.rst#minimal-hardware-setup-for-bootloading-only>`__ during: upload* and try uploading again. For successful upload this log should look similar to example shown below: -``C:\Users\Krzysztof\AppData\Local\Arduino15\packages\esp8266\tools\esptool\0.4.8/esptool.exe -vv -cd ck -cb 115200 -cp COM3 -ca 0x00000 -cf C:\Users\KRZYSZ~1\AppData\Local\Temp\build7e44b372385012e74d64fb272d24b802.tmp/Blink.ino.bin esptool v0.4.8 - (c) 2014 Ch. Klippel setting board to ck setting baudrate from 115200 to 115200 setting port from COM1 to COM3 setting address from 0x00000000 to 0x00000000 espcomm_upload_file espcomm_upload_mem setting serial port timeouts to 1000 ms opening bootloader resetting board trying to connect flush start setting serial port timeouts to 1 ms setting serial port timeouts to 1000 ms flush complete espcomm_send_command: sending command header espcomm_send_command: sending command payload read 0, requested 1 trying to connect flush start setting serial port timeouts to 1 ms setting serial port timeouts to 1000 ms flush complete espcomm_send_command: sending command header espcomm_send_command: sending command payload espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data espcomm_send_command: receiving 2 bytes of data Uploading 226368 bytes from to flash at 0x00000000 erasing flash size: 037440 address: 000000 first_sector_index: 0 total_sector_count: 56 head_sector_count: 16 adjusted_sector_count: 40 erase_size: 028000 espcomm_send_command: sending command header espcomm_send_command: sending command payload setting serial port timeouts to 15000 ms setting serial port timeouts to 1000 ms espcomm_send_command: receiving 2 bytes of data writing flash .............................................................................................................................................................................................................................. starting app without reboot espcomm_send_command: sending command header espcomm_send_command: sending command payload espcomm_send_command: receiving 2 bytes of data closing bootloader flush start setting serial port timeouts to 1 ms setting serial port timeouts to 1000 ms flush complete`` + For example, uploading using esptool.py and esptool + +.. code-block:: console + + $ esptool.py --after no_reset --chip esp8266 --baud 460800 write_flash 0x0 d1-mini-firmware.bin + esptool.py v4.5.1 + Found 1 serial ports + Serial port /dev/ttyUSB0 + Connecting.... + Chip is ESP8266EX + Features: WiFi + Crystal is 26MHz + MAC: 11:22:33:44:55:66 + Uploading stub... + Running stub... + Stub running... + Changing baud rate to 460800 + Changed. + Configuring flash size... + Flash will be erased from 0x00000000 to 0x0004efff... + Compressed 321440 bytes to 221714... + Wrote 321440 bytes (221714 compressed) at 0x00000000 in 5.0 seconds (effective 511.4 kbit/s)... + Hash of data verified. + + Leaving... + Staying in bootloader. + + +.. code-block:: console + + > C:\Users\Krzysztof\AppData\Local\Arduino15\packages\esp8266\tools\esptool\0.4.8/esptool.exe -vv -cd ck -cb 115200 -cp COM3 -ca 0x00000 -cf C:\Users\KRZYSZ~1\AppData\Local\Temp\build7e44b372385012e74d64fb272d24b802.tmp/Blink.ino.bin + esptool v0.4.8 - (c) 2014 Ch. Klippel + setting board to ck + setting baudrate from 115200 to 115200 + setting port from COM1 to COM3 + setting address from 0x00000000 to 0x00000000 + espcomm_upload_file + espcomm_upload_mem + setting serial port timeouts to 1000 ms + opening bootloader + resetting board + trying to connect + flush start + setting serial port timeouts to 1 ms + setting serial port timeouts to 1000 ms + flush complete + espcomm_send_command: sending command header + espcomm_send_command: sending command payload + read 0, requested 1 + trying to connect + flush start + setting serial port timeouts to 1 ms + setting serial port timeouts to 1000 ms + flush complete + espcomm_send_command: sending command header + espcomm_send_command: sending command payload + espcomm_send_command: receiving 2 bytes of data + espcomm_send_command: receiving 2 bytes of data + espcomm_send_command: receiving 2 bytes of data + espcomm_send_command: receiving 2 bytes of data + espcomm_send_command: receiving 2 bytes of data + espcomm_send_command: receiving 2 bytes of data + espcomm_send_command: receiving 2 bytes of data + espcomm_send_command: receiving 2 bytes of data + Uploading 226368 bytes from to flash at 0x00000000 + erasing flash + size: 037440 address: 000000 + first_sector_index: 0 + total_sector_count: 56 + head_sector_count: 16 + adjusted_sector_count: 40 + erase_size: 028000 + espcomm_send_command: sending command header + espcomm_send_command: sending command payload + setting serial port timeouts to 15000 ms + setting serial port timeouts to 1000 ms + espcomm_send_command: receiving 2 bytes of data + writing flash .............................................................................................................................................................................................................................. + starting app without reboot + espcomm_send_command: sending command header + espcomm_send_command: sending command payload + espcomm_send_command: receiving 2 bytes of data + closing bootloader + flush start + setting serial port timeouts to 1 ms + setting serial port timeouts to 1000 ms + flush complete Upload log may be longer depending on number of connection attempts made by esptool. Analyze it for any anomalies to configuration you have @@ -177,7 +271,7 @@ rate, etc. Resolve all noted differences. Reset Methods ~~~~~~~~~~~~~ -If you got to this point and still see ``espcomm_sync failed``, then now +If you got to this point and still see uploading error, then now you need to bring in the heavy guns. Connect scope or logic analyzer to GPIO0, RST and RXD pins of the ESP to @@ -238,13 +332,13 @@ Each retry is reported in upload log as follows: resetting board trying to connect - flush start - setting serial port timeouts to 1 ms - setting serial port timeouts to 1000 ms - flush complete - espcomm_send_command: sending command header - espcomm_send_command: sending command payload - read 0, requested 1 + flush start + setting serial port timeouts to 1 ms + setting serial port timeouts to 1000 ms + flush complete + espcomm_send_command: sending command header + espcomm_send_command: sending command payload + read 0, requested 1 Presented circuit has one important limitation when it comes to work with Arduino IDE. After opening Serial Monitor (Ctrl-Shift-M), both RTS diff --git a/doc/faq/a02-my-esp-crashes.rst b/doc/faq/a02-my-esp-crashes.rst index ec6340e8c7..c480a825e7 100644 --- a/doc/faq/a02-my-esp-crashes.rst +++ b/doc/faq/a02-my-esp-crashes.rst @@ -1,5 +1,3 @@ -:orphan: - My ESP crashes running some code. How to troubleshoot it? --------------------------------------------------------- diff --git a/doc/faq/a03-library-does-not-work.rst b/doc/faq/a03-library-does-not-work.rst index 6597c1a1dc..e34ad050b1 100644 --- a/doc/faq/a03-library-does-not-work.rst +++ b/doc/faq/a03-library-does-not-work.rst @@ -1,5 +1,3 @@ -:orphan: - This Arduino library doesn't work on ESP. How do I make it working? ------------------------------------------------------------------- diff --git a/doc/faq/a04-board-generic-is-unknown.rst b/doc/faq/a04-board-generic-is-unknown.rst index 88e2f3e7be..ada9a7eec2 100644 --- a/doc/faq/a04-board-generic-is-unknown.rst +++ b/doc/faq/a04-board-generic-is-unknown.rst @@ -1,5 +1,3 @@ -:orphan: - How to resolve "Board generic (platform esp8266, package esp8266) is unknown" error? ------------------------------------------------------------------------------------ diff --git a/doc/faq/a05-board-generator.rst b/doc/faq/a05-board-generator.rst index 279491355e..4f31fce996 100644 --- a/doc/faq/a05-board-generator.rst +++ b/doc/faq/a05-board-generator.rst @@ -1,5 +1,3 @@ -:orphan: - Board generator --------------- diff --git a/doc/faq/a06-global-build-options.rst b/doc/faq/a06-global-build-options.rst index 3e86b88a58..231dbc6baf 100644 --- a/doc/faq/a06-global-build-options.rst +++ b/doc/faq/a06-global-build-options.rst @@ -1,5 +1,3 @@ -:orphan: - How to specify global build defines and options =============================================== diff --git a/doc/index.rst b/doc/index.rst index 5f3ec247c6..afe976348e 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -1,9 +1,11 @@ Welcome to ESP8266 Arduino Core's documentation! ================================================ +Using ESP8266 Core +================== + .. toctree:: :maxdepth: 2 - :caption: Contents: Installing Arduino IDE options @@ -15,11 +17,26 @@ Welcome to ESP8266 Arduino Core's documentation! PROGMEM Using GDB to debug MMU - Boards - FAQ +Troubleshooting +=============== +.. toctree:: + :caption: Troubleshooting + :maxdepth: 2 + + FAQ Exception causes Debugging Stack Dump Using with Eclipse + +FAQ +=== +.. toctree:: + :caption: FAQ + :maxdepth: 2 + :titlesonly: + :glob: + + faq/* From bc251382a6250dce3e29be66f3c425a38d373f63 Mon Sep 17 00:00:00 2001 From: iotgupta <155143564+iotgupta@users.noreply.github.com> Date: Thu, 29 May 2025 18:50:52 +0530 Subject: [PATCH 49/50] Boards - fix & update Mercury (#9238) * update Mercury Board * fix --------- Co-authored-by: Maxim Prokhorov --- boards.txt | 442 +++++++++--------- doc/boards.rst | 8 +- .../package_esp8266com_index.template.json | 2 +- tools/boards.txt.py | 10 +- .../{mercury_v1 => mercury}/pins_arduino.h | 21 +- 5 files changed, 243 insertions(+), 240 deletions(-) rename variants/{mercury_v1 => mercury}/pins_arduino.h (89%) diff --git a/boards.txt b/boards.txt index 1b44fe3310..de7f875eef 100644 --- a/boards.txt +++ b/boards.txt @@ -5646,227 +5646,227 @@ agruminolemon.menu.iramfloat.yes=allowed in ISR agruminolemon.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM ############################################################## -mercury1.name=Mercury 1.0 -mercury1.build.board=mercury -mercury1.build.variant=mercury_v1 -mercury1.upload.tool=esptool -mercury1.upload.maximum_data_size=81920 -mercury1.upload.wait_for_upload_port=true -mercury1.upload.erase_cmd= -mercury1.serial.disableDTR=true -mercury1.serial.disableRTS=true -mercury1.build.mcu=esp8266 -mercury1.build.core=esp8266 -mercury1.build.spiffs_pagesize=256 -mercury1.build.debug_optim= -mercury1.build.debug_port= -mercury1.build.debug_level= -mercury1.menu.xtal.80=80 MHz -mercury1.menu.xtal.80.build.f_cpu=80000000L -mercury1.menu.xtal.160=160 MHz -mercury1.menu.xtal.160.build.f_cpu=160000000L -mercury1.menu.vt.flash=Flash -mercury1.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH -mercury1.menu.vt.heap=Heap -mercury1.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM -mercury1.menu.vt.iram=IRAM -mercury1.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM -mercury1.menu.exception.disabled=Disabled (new aborts on oom) -mercury1.menu.exception.disabled.build.exception_flags=-fno-exceptions -mercury1.menu.exception.disabled.build.stdcpp_lib=-lstdc++ -mercury1.menu.exception.enabled=Enabled -mercury1.menu.exception.enabled.build.exception_flags=-fexceptions -mercury1.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc -mercury1.menu.stacksmash.disabled=Disabled -mercury1.menu.stacksmash.disabled.build.stacksmash_flags= -mercury1.menu.stacksmash.enabled=Enabled -mercury1.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector -mercury1.menu.ssl.all=All SSL ciphers (most compatible) -mercury1.menu.ssl.all.build.sslflags= -mercury1.menu.ssl.basic=Basic SSL ciphers (lower ROM use) -mercury1.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC -mercury1.menu.mmu.3232=32KB cache + 32KB IRAM (balanced) -mercury1.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -mercury1.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM) -mercury1.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -mercury1.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared) -mercury1.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP -mercury1.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared) -mercury1.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000 -mercury1.menu.mmu.ext128k=128K Heap External 23LC1024 -mercury1.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -mercury1.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM -mercury1.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 -mercury1.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM -mercury1.menu.non32xfer.fast.build.non32xferflags= -mercury1.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow) -mercury1.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER -mercury1.upload.resetmethod=--before default_reset --after hard_reset -mercury1.build.flash_mode=dio -mercury1.build.flash_flags=-DFLASHMODE_DIO -mercury1.build.flash_freq=40 -mercury1.menu.eesz.4M2M=4MB (FS:2MB OTA:~1019KB) -mercury1.menu.eesz.4M2M.build.flash_size=4M -mercury1.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld -mercury1.menu.eesz.4M2M.build.spiffs_pagesize=256 -mercury1.menu.eesz.4M2M.build.rfcal_addr=0x3FC000 -mercury1.menu.eesz.4M2M.build.spiffs_start=0x200000 -mercury1.menu.eesz.4M2M.build.spiffs_end=0x3FA000 -mercury1.menu.eesz.4M2M.build.spiffs_blocksize=8192 -mercury1.menu.eesz.4M3M=4MB (FS:3MB OTA:~512KB) -mercury1.menu.eesz.4M3M.build.flash_size=4M -mercury1.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld -mercury1.menu.eesz.4M3M.build.spiffs_pagesize=256 -mercury1.menu.eesz.4M3M.build.rfcal_addr=0x3FC000 -mercury1.menu.eesz.4M3M.build.spiffs_start=0x100000 -mercury1.menu.eesz.4M3M.build.spiffs_end=0x3FA000 -mercury1.menu.eesz.4M3M.build.spiffs_blocksize=8192 -mercury1.menu.eesz.4M1M=4MB (FS:1MB OTA:~1019KB) -mercury1.menu.eesz.4M1M.build.flash_size=4M -mercury1.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld -mercury1.menu.eesz.4M1M.build.spiffs_pagesize=256 -mercury1.menu.eesz.4M1M.build.rfcal_addr=0x3FC000 -mercury1.menu.eesz.4M1M.build.spiffs_start=0x300000 -mercury1.menu.eesz.4M1M.build.spiffs_end=0x3FA000 -mercury1.menu.eesz.4M1M.build.spiffs_blocksize=8192 -mercury1.menu.eesz.4M=4MB (FS:none OTA:~1019KB) -mercury1.menu.eesz.4M.build.flash_size=4M -mercury1.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld -mercury1.menu.eesz.4M.build.spiffs_pagesize=256 -mercury1.menu.eesz.4M.build.rfcal_addr=0x3FC000 -mercury1.menu.ip.lm2f=v2 Lower Memory -mercury1.menu.ip.lm2f.build.lwip_include=lwip2/include -mercury1.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat -mercury1.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -mercury1.menu.ip.hb2f=v2 Higher Bandwidth -mercury1.menu.ip.hb2f.build.lwip_include=lwip2/include -mercury1.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat -mercury1.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 -mercury1.menu.ip.lm2n=v2 Lower Memory (no features) -mercury1.menu.ip.lm2n.build.lwip_include=lwip2/include -mercury1.menu.ip.lm2n.build.lwip_lib=-llwip2-536 -mercury1.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 -mercury1.menu.ip.hb2n=v2 Higher Bandwidth (no features) -mercury1.menu.ip.hb2n.build.lwip_include=lwip2/include -mercury1.menu.ip.hb2n.build.lwip_lib=-llwip2-1460 -mercury1.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 -mercury1.menu.ip.lm6f=v2 IPv6 Lower Memory -mercury1.menu.ip.lm6f.build.lwip_include=lwip2/include -mercury1.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat -mercury1.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 -mercury1.menu.ip.hb6f=v2 IPv6 Higher Bandwidth -mercury1.menu.ip.hb6f.build.lwip_include=lwip2/include -mercury1.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat -mercury1.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 -mercury1.menu.dbg.Disabled=Disabled -mercury1.menu.dbg.Disabled.build.debug_port= -mercury1.menu.dbg.Serial=Serial -mercury1.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial -mercury1.menu.dbg.Serial1=Serial1 -mercury1.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1 -mercury1.menu.lvl.None____=None -mercury1.menu.lvl.None____.build.debug_level= -mercury1.menu.optim.Smallest=None -mercury1.menu.optim.Smallest.build.debug_optim=-Os -mercury1.menu.optim.Lite=Lite -mercury1.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls -mercury1.menu.optim.Full=Optimum -mercury1.menu.optim.Full.build.debug_optim=-Og -mercury1.menu.lvl.SSL=SSL -mercury1.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL -mercury1.menu.lvl.TLS_MEM=TLS_MEM -mercury1.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM -mercury1.menu.lvl.HTTP_CLIENT=HTTP_CLIENT -mercury1.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -mercury1.menu.lvl.HTTP_SERVER=HTTP_SERVER -mercury1.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER -mercury1.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM -mercury1.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -mercury1.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT -mercury1.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -mercury1.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER -mercury1.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER -mercury1.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT -mercury1.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -mercury1.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER -mercury1.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER -mercury1.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER -mercury1.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -mercury1.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT -mercury1.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -mercury1.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER -mercury1.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER -mercury1.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER -mercury1.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -mercury1.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER -mercury1.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -mercury1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER -mercury1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -mercury1.menu.lvl.CORE=CORE -mercury1.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE -mercury1.menu.lvl.WIFI=WIFI -mercury1.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI -mercury1.menu.lvl.HTTP_UPDATE=HTTP_UPDATE -mercury1.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE -mercury1.menu.lvl.UPDATER=UPDATER -mercury1.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER -mercury1.menu.lvl.OTA=OTA -mercury1.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA -mercury1.menu.lvl.OOM=OOM -mercury1.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM -mercury1.menu.lvl.MDNS=MDNS -mercury1.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS -mercury1.menu.lvl.HWDT=HWDT -mercury1.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT -mercury1.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K -mercury1.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K -mercury1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS -mercury1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -mercury1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT -mercury1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT -mercury1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K -mercury1.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K -mercury1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS -mercury1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -mercury1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT -mercury1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT -mercury1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K -mercury1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K -mercury1.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG -mercury1.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG -mercury1.menu.wipe.none=Only Sketch -mercury1.menu.wipe.none.upload.erase_cmd= -mercury1.menu.wipe.sdk=Sketch + WiFi Settings -mercury1.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000 -mercury1.menu.wipe.all=All Flash Contents -mercury1.menu.wipe.all.upload.erase_cmd=erase_flash -mercury1.menu.baud.115200=115200 -mercury1.menu.baud.115200.upload.speed=115200 -mercury1.menu.baud.57600=57600 -mercury1.menu.baud.57600.upload.speed=57600 -mercury1.menu.baud.230400.linux=230400 -mercury1.menu.baud.230400.macosx=230400 -mercury1.menu.baud.230400.upload.speed=230400 -mercury1.menu.baud.256000.windows=256000 -mercury1.menu.baud.256000.upload.speed=256000 -mercury1.menu.baud.460800.linux=460800 -mercury1.menu.baud.460800.macosx=460800 -mercury1.menu.baud.460800.upload.speed=460800 -mercury1.menu.baud.512000.windows=512000 -mercury1.menu.baud.512000.upload.speed=512000 -mercury1.menu.baud.921600=921600 -mercury1.menu.baud.921600.upload.speed=921600 -mercury1.menu.baud.3000000=3000000 -mercury1.menu.baud.3000000.upload.speed=3000000 -mercury1.menu.eesz.autoflash=Mapping defined by Hardware and Sketch -mercury1.menu.eesz.autoflash.build.flash_size=16M -mercury1.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld -mercury1.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1 -mercury1.menu.eesz.autoflash.upload.maximum_size=1044464 -mercury1.menu.iramfloat.no=in IROM -mercury1.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM -mercury1.menu.iramfloat.yes=allowed in ISR -mercury1.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM +mercury.name=Mercury +mercury.build.board=mercury +mercury.build.variant=mercury +mercury.upload.tool=esptool +mercury.upload.maximum_data_size=81920 +mercury.upload.wait_for_upload_port=true +mercury.upload.erase_cmd= +mercury.serial.disableDTR=true +mercury.serial.disableRTS=true +mercury.build.mcu=esp8266 +mercury.build.core=esp8266 +mercury.build.spiffs_pagesize=256 +mercury.build.debug_optim= +mercury.build.debug_port= +mercury.build.debug_level= +mercury.menu.xtal.80=80 MHz +mercury.menu.xtal.80.build.f_cpu=80000000L +mercury.menu.xtal.160=160 MHz +mercury.menu.xtal.160.build.f_cpu=160000000L +mercury.menu.vt.flash=Flash +mercury.menu.vt.flash.build.vtable_flags=-DVTABLES_IN_FLASH +mercury.menu.vt.heap=Heap +mercury.menu.vt.heap.build.vtable_flags=-DVTABLES_IN_DRAM +mercury.menu.vt.iram=IRAM +mercury.menu.vt.iram.build.vtable_flags=-DVTABLES_IN_IRAM +mercury.menu.exception.disabled=Disabled (new aborts on oom) +mercury.menu.exception.disabled.build.exception_flags=-fno-exceptions +mercury.menu.exception.disabled.build.stdcpp_lib=-lstdc++ +mercury.menu.exception.enabled=Enabled +mercury.menu.exception.enabled.build.exception_flags=-fexceptions +mercury.menu.exception.enabled.build.stdcpp_lib=-lstdc++-exc +mercury.menu.stacksmash.disabled=Disabled +mercury.menu.stacksmash.disabled.build.stacksmash_flags= +mercury.menu.stacksmash.enabled=Enabled +mercury.menu.stacksmash.enabled.build.stacksmash_flags=-fstack-protector +mercury.menu.ssl.all=All SSL ciphers (most compatible) +mercury.menu.ssl.all.build.sslflags= +mercury.menu.ssl.basic=Basic SSL ciphers (lower ROM use) +mercury.menu.ssl.basic.build.sslflags=-DBEARSSL_SSL_BASIC +mercury.menu.mmu.3232=32KB cache + 32KB IRAM (balanced) +mercury.menu.mmu.3232.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 +mercury.menu.mmu.4816=16KB cache + 48KB IRAM (IRAM) +mercury.menu.mmu.4816.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 +mercury.menu.mmu.4816H=16KB cache + 48KB IRAM and 2nd Heap (shared) +mercury.menu.mmu.4816H.build.mmuflags=-DMMU_IRAM_SIZE=0xC000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_IRAM_HEAP +mercury.menu.mmu.3216=16KB cache + 32KB IRAM + 16KB 2nd Heap (not shared) +mercury.menu.mmu.3216.build.mmuflags=-DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x4000 -DMMU_SEC_HEAP=0x40108000 -DMMU_SEC_HEAP_SIZE=0x4000 +mercury.menu.mmu.ext128k=128K Heap External 23LC1024 +mercury.menu.mmu.ext128k.build.mmuflags=-DMMU_EXTERNAL_HEAP=128 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 +mercury.menu.mmu.ext8192k=8M w/256K Heap External 64 MBit PSRAM +mercury.menu.mmu.ext8192k.build.mmuflags=-DMMU_EXTERNAL_HEAP=256 -DMMU_IRAM_SIZE=0x8000 -DMMU_ICACHE_SIZE=0x8000 +mercury.menu.non32xfer.fast=Use pgm_read macros for IRAM/PROGMEM +mercury.menu.non32xfer.fast.build.non32xferflags= +mercury.menu.non32xfer.safe=Byte/Word access to IRAM/PROGMEM (very slow) +mercury.menu.non32xfer.safe.build.non32xferflags=-DNON32XFER_HANDLER +mercury.upload.resetmethod=--before default_reset --after hard_reset +mercury.build.flash_mode=dio +mercury.build.flash_flags=-DFLASHMODE_DIO +mercury.build.flash_freq=40 +mercury.menu.eesz.4M2M=4MB (FS:2MB OTA:~1019KB) +mercury.menu.eesz.4M2M.build.flash_size=4M +mercury.menu.eesz.4M2M.build.flash_ld=eagle.flash.4m2m.ld +mercury.menu.eesz.4M2M.build.spiffs_pagesize=256 +mercury.menu.eesz.4M2M.build.rfcal_addr=0x3FC000 +mercury.menu.eesz.4M2M.build.spiffs_start=0x200000 +mercury.menu.eesz.4M2M.build.spiffs_end=0x3FA000 +mercury.menu.eesz.4M2M.build.spiffs_blocksize=8192 +mercury.menu.eesz.4M3M=4MB (FS:3MB OTA:~512KB) +mercury.menu.eesz.4M3M.build.flash_size=4M +mercury.menu.eesz.4M3M.build.flash_ld=eagle.flash.4m3m.ld +mercury.menu.eesz.4M3M.build.spiffs_pagesize=256 +mercury.menu.eesz.4M3M.build.rfcal_addr=0x3FC000 +mercury.menu.eesz.4M3M.build.spiffs_start=0x100000 +mercury.menu.eesz.4M3M.build.spiffs_end=0x3FA000 +mercury.menu.eesz.4M3M.build.spiffs_blocksize=8192 +mercury.menu.eesz.4M1M=4MB (FS:1MB OTA:~1019KB) +mercury.menu.eesz.4M1M.build.flash_size=4M +mercury.menu.eesz.4M1M.build.flash_ld=eagle.flash.4m1m.ld +mercury.menu.eesz.4M1M.build.spiffs_pagesize=256 +mercury.menu.eesz.4M1M.build.rfcal_addr=0x3FC000 +mercury.menu.eesz.4M1M.build.spiffs_start=0x300000 +mercury.menu.eesz.4M1M.build.spiffs_end=0x3FA000 +mercury.menu.eesz.4M1M.build.spiffs_blocksize=8192 +mercury.menu.eesz.4M=4MB (FS:none OTA:~1019KB) +mercury.menu.eesz.4M.build.flash_size=4M +mercury.menu.eesz.4M.build.flash_ld=eagle.flash.4m.ld +mercury.menu.eesz.4M.build.spiffs_pagesize=256 +mercury.menu.eesz.4M.build.rfcal_addr=0x3FC000 +mercury.menu.ip.lm2f=v2 Lower Memory +mercury.menu.ip.lm2f.build.lwip_include=lwip2/include +mercury.menu.ip.lm2f.build.lwip_lib=-llwip2-536-feat +mercury.menu.ip.lm2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 +mercury.menu.ip.hb2f=v2 Higher Bandwidth +mercury.menu.ip.hb2f.build.lwip_include=lwip2/include +mercury.menu.ip.hb2f.build.lwip_lib=-llwip2-1460-feat +mercury.menu.ip.hb2f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=0 +mercury.menu.ip.lm2n=v2 Lower Memory (no features) +mercury.menu.ip.lm2n.build.lwip_include=lwip2/include +mercury.menu.ip.lm2n.build.lwip_lib=-llwip2-536 +mercury.menu.ip.lm2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 +mercury.menu.ip.hb2n=v2 Higher Bandwidth (no features) +mercury.menu.ip.hb2n.build.lwip_include=lwip2/include +mercury.menu.ip.hb2n.build.lwip_lib=-llwip2-1460 +mercury.menu.ip.hb2n.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=0 -DLWIP_IPV6=0 +mercury.menu.ip.lm6f=v2 IPv6 Lower Memory +mercury.menu.ip.lm6f.build.lwip_include=lwip2/include +mercury.menu.ip.lm6f.build.lwip_lib=-llwip6-536-feat +mercury.menu.ip.lm6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=536 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 +mercury.menu.ip.hb6f=v2 IPv6 Higher Bandwidth +mercury.menu.ip.hb6f.build.lwip_include=lwip2/include +mercury.menu.ip.hb6f.build.lwip_lib=-llwip6-1460-feat +mercury.menu.ip.hb6f.build.lwip_flags=-DLWIP_OPEN_SRC -DTCP_MSS=1460 -DLWIP_FEATURES=1 -DLWIP_IPV6=1 +mercury.menu.dbg.Disabled=Disabled +mercury.menu.dbg.Disabled.build.debug_port= +mercury.menu.dbg.Serial=Serial +mercury.menu.dbg.Serial.build.debug_port=-DDEBUG_ESP_PORT=Serial +mercury.menu.dbg.Serial1=Serial1 +mercury.menu.dbg.Serial1.build.debug_port=-DDEBUG_ESP_PORT=Serial1 +mercury.menu.lvl.None____=None +mercury.menu.lvl.None____.build.debug_level= +mercury.menu.optim.Smallest=None +mercury.menu.optim.Smallest.build.debug_optim=-Os +mercury.menu.optim.Lite=Lite +mercury.menu.optim.Lite.build.debug_optim=-Os -fno-optimize-sibling-calls +mercury.menu.optim.Full=Optimum +mercury.menu.optim.Full.build.debug_optim=-Og +mercury.menu.lvl.SSL=SSL +mercury.menu.lvl.SSL.build.debug_level= -DDEBUG_ESP_SSL +mercury.menu.lvl.TLS_MEM=TLS_MEM +mercury.menu.lvl.TLS_MEM.build.debug_level= -DDEBUG_ESP_TLS_MEM +mercury.menu.lvl.HTTP_CLIENT=HTTP_CLIENT +mercury.menu.lvl.HTTP_CLIENT.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT +mercury.menu.lvl.HTTP_SERVER=HTTP_SERVER +mercury.menu.lvl.HTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_SERVER +mercury.menu.lvl.SSLTLS_MEM=SSL+TLS_MEM +mercury.menu.lvl.SSLTLS_MEM.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM +mercury.menu.lvl.SSLHTTP_CLIENT=SSL+HTTP_CLIENT +mercury.menu.lvl.SSLHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT +mercury.menu.lvl.SSLHTTP_SERVER=SSL+HTTP_SERVER +mercury.menu.lvl.SSLHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_SERVER +mercury.menu.lvl.TLS_MEMHTTP_CLIENT=TLS_MEM+HTTP_CLIENT +mercury.menu.lvl.TLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT +mercury.menu.lvl.TLS_MEMHTTP_SERVER=TLS_MEM+HTTP_SERVER +mercury.menu.lvl.TLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER +mercury.menu.lvl.HTTP_CLIENTHTTP_SERVER=HTTP_CLIENT+HTTP_SERVER +mercury.menu.lvl.HTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER +mercury.menu.lvl.SSLTLS_MEMHTTP_CLIENT=SSL+TLS_MEM+HTTP_CLIENT +mercury.menu.lvl.SSLTLS_MEMHTTP_CLIENT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT +mercury.menu.lvl.SSLTLS_MEMHTTP_SERVER=SSL+TLS_MEM+HTTP_SERVER +mercury.menu.lvl.SSLTLS_MEMHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_SERVER +mercury.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER=SSL+HTTP_CLIENT+HTTP_SERVER +mercury.menu.lvl.SSLHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER +mercury.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER=TLS_MEM+HTTP_CLIENT+HTTP_SERVER +mercury.menu.lvl.TLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER +mercury.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER +mercury.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVER.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER +mercury.menu.lvl.CORE=CORE +mercury.menu.lvl.CORE.build.debug_level= -DDEBUG_ESP_CORE +mercury.menu.lvl.WIFI=WIFI +mercury.menu.lvl.WIFI.build.debug_level= -DDEBUG_ESP_WIFI +mercury.menu.lvl.HTTP_UPDATE=HTTP_UPDATE +mercury.menu.lvl.HTTP_UPDATE.build.debug_level= -DDEBUG_ESP_HTTP_UPDATE +mercury.menu.lvl.UPDATER=UPDATER +mercury.menu.lvl.UPDATER.build.debug_level= -DDEBUG_ESP_UPDATER +mercury.menu.lvl.OTA=OTA +mercury.menu.lvl.OTA.build.debug_level= -DDEBUG_ESP_OTA +mercury.menu.lvl.OOM=OOM +mercury.menu.lvl.OOM.build.debug_level= -DDEBUG_ESP_OOM +mercury.menu.lvl.MDNS=MDNS +mercury.menu.lvl.MDNS.build.debug_level= -DDEBUG_ESP_MDNS +mercury.menu.lvl.HWDT=HWDT +mercury.menu.lvl.HWDT.build.debug_level= -DDEBUG_ESP_HWDT +mercury.menu.lvl.HWDT_NOEXTRA4K=HWDT_NOEXTRA4K +mercury.menu.lvl.HWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_HWDT_NOEXTRA4K +mercury.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS +mercury.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS +mercury.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT +mercury.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT +mercury.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K +mercury.menu.lvl.COREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K +mercury.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS +mercury.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNS.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS +mercury.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT +mercury.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT +mercury.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K=SSL+TLS_MEM+HTTP_CLIENT+HTTP_SERVER+CORE+WIFI+HTTP_UPDATE+UPDATER+OTA+OOM+MDNS+HWDT_NOEXTRA4K +mercury.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOMMDNSHWDT_NOEXTRA4K.build.debug_level= -DDEBUG_ESP_SSL -DDEBUG_ESP_TLS_MEM -DDEBUG_ESP_HTTP_CLIENT -DDEBUG_ESP_HTTP_SERVER -DDEBUG_ESP_CORE -DDEBUG_ESP_WIFI -DDEBUG_ESP_HTTP_UPDATE -DDEBUG_ESP_UPDATER -DDEBUG_ESP_OTA -DDEBUG_ESP_OOM -DDEBUG_ESP_MDNS -DDEBUG_ESP_HWDT_NOEXTRA4K +mercury.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG +mercury.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG +mercury.menu.wipe.none=Only Sketch +mercury.menu.wipe.none.upload.erase_cmd= +mercury.menu.wipe.sdk=Sketch + WiFi Settings +mercury.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000 +mercury.menu.wipe.all=All Flash Contents +mercury.menu.wipe.all.upload.erase_cmd=erase_flash +mercury.menu.baud.115200=115200 +mercury.menu.baud.115200.upload.speed=115200 +mercury.menu.baud.57600=57600 +mercury.menu.baud.57600.upload.speed=57600 +mercury.menu.baud.230400.linux=230400 +mercury.menu.baud.230400.macosx=230400 +mercury.menu.baud.230400.upload.speed=230400 +mercury.menu.baud.256000.windows=256000 +mercury.menu.baud.256000.upload.speed=256000 +mercury.menu.baud.460800.linux=460800 +mercury.menu.baud.460800.macosx=460800 +mercury.menu.baud.460800.upload.speed=460800 +mercury.menu.baud.512000.windows=512000 +mercury.menu.baud.512000.upload.speed=512000 +mercury.menu.baud.921600=921600 +mercury.menu.baud.921600.upload.speed=921600 +mercury.menu.baud.3000000=3000000 +mercury.menu.baud.3000000.upload.speed=3000000 +mercury.menu.eesz.autoflash=Mapping defined by Hardware and Sketch +mercury.menu.eesz.autoflash.build.flash_size=16M +mercury.menu.eesz.autoflash.build.flash_ld=eagle.flash.auto.ld +mercury.menu.eesz.autoflash.build.extra_flags=-DFLASH_MAP_SUPPORT=1 +mercury.menu.eesz.autoflash.upload.maximum_size=1044464 +mercury.menu.iramfloat.no=in IROM +mercury.menu.iramfloat.no.build.iramfloat=-DFP_IN_IROM +mercury.menu.iramfloat.yes=allowed in ISR +mercury.menu.iramfloat.yes.build.iramfloat=-DFP_IN_IRAM ############################################################## nodemcu.name=NodeMCU 0.9 (ESP-12 Module) diff --git a/doc/boards.rst b/doc/boards.rst index 99421d86b9..8977c5b927 100644 --- a/doc/boards.rst +++ b/doc/boards.rst @@ -271,11 +271,11 @@ ESPresso Lite 2.0 ESPresso Lite 2.0 is an Arduino-compatible Wi-Fi development board based on an earlier V1 (beta version). Re-designed together with Cytron Technologies, the newly-revised ESPresso Lite V2.0 features the auto-load/auto-program function, eliminating the previous need to reset the board manually before flashing a new program. It also feature two user programmable side buttons and a reset button. The special distinctive features of on-board pads for I2C sensor and actuator is retained. -Mercury 1.0 ------------ - -Based on ESP8266, Mercury is board developed by Ralio Technologies. Board supports on motor drivers and direct-connect feature for various endpoints. +Mercury +------- +ESP8266 based development board supercharged with onboard motor driver, RGB LED, support for servo motors and etc. +Git: https://github.com/raliotech/products/tree/master Product page: https://www.raliotech.com Phoenix 1.0 diff --git a/package/package_esp8266com_index.template.json b/package/package_esp8266com_index.template.json index 3c8d1bed39..4d44ddb0a2 100644 --- a/package/package_esp8266com_index.template.json +++ b/package/package_esp8266com_index.template.json @@ -48,7 +48,7 @@ "name": "ESPresso Lite 2.0" }, { - "name": "Mercury 1.0" + "name": "Mercury" }, { "name": "Phoenix 1.0" diff --git a/tools/boards.txt.py b/tools/boards.txt.py index 576e02a614..e94149a08b 100755 --- a/tools/boards.txt.py +++ b/tools/boards.txt.py @@ -445,11 +445,11 @@ ], 'desc': [ 'ESPresso Lite 2.0 is an Arduino-compatible Wi-Fi development board based on an earlier V1 (beta version). Re-designed together with Cytron Technologies, the newly-revised ESPresso Lite V2.0 features the auto-load/auto-program function, eliminating the previous need to reset the board manually before flashing a new program. It also feature two user programmable side buttons and a reset button. The special distinctive features of on-board pads for I2C sensor and actuator is retained.', ] }), -( 'mercury1', { - 'name': 'Mercury 1.0', + ( 'mercury', { + 'name': 'Mercury', 'opts': { '.build.board': 'mercury', - '.build.variant': 'mercury_v1', + '.build.variant': 'mercury', }, 'macro': [ 'resetmethod_nodemcu', @@ -457,8 +457,8 @@ 'flashfreq_40', '4M', ], - 'desc': [ 'Based on ESP8266, Mercury is board developed by Ralio Technologies. Board supports on motor drivers and direct-connect feature for various endpoints.', - '', + 'desc': [ 'ESP8266 based development board supercharged with onboard motor driver, RGB LED, support for servo motors and etc.', + 'Git: https://github.com/raliotech/products/tree/master', 'Product page: https://www.raliotech.com', ], }), diff --git a/variants/mercury_v1/pins_arduino.h b/variants/mercury/pins_arduino.h similarity index 89% rename from variants/mercury_v1/pins_arduino.h rename to variants/mercury/pins_arduino.h index 747afb5913..df9860aac8 100644 --- a/variants/mercury_v1/pins_arduino.h +++ b/variants/mercury/pins_arduino.h @@ -28,7 +28,7 @@ #include "../generic/common.h" -#define LED_BUILTIN 0 +#define LED_BUILTIN 2 #define BUILTIN_LED LED_BUILTIN #define A0 (17) @@ -49,14 +49,10 @@ static const uint8_t D10 = 10; #define PIN_WIRE_SCL (14) // Brushed DC Motors -#define MOTOR_1_DIR (16) -#define MOTOR_1_PWM (12) -#define MOTOR_2_DIR (5) -#define MOTOR_2_PWM (4) - -//Ultrasonic Sensor -static const uint8_t USST = D7; -static const uint8_t USSE = D8; +static const uint8_t MOTOR_1_DIR = D3; +static const uint8_t MOTOR_1_PWM = D1; +static const uint8_t MOTOR_2_DIR = D4; +static const uint8_t MOTOR_2_PWM = D2; //Servo static const uint8_t SERVO1 = D4; @@ -64,8 +60,15 @@ static const uint8_t SERVO2 = D6; static const uint8_t SERVO3 = D3; static const uint8_t SERVO4 = D5; +//Ultrasonic Sensor +static const uint8_t USST = D7; +static const uint8_t USSE = D8; + //IR static const uint8_t IR1 = D9; static const uint8_t IR2 = D10; +//RGB LED +static const uint8_t RGB = D0; + #endif /* Pins_Arduino_h */ From f5142b883dd84ed682a832ed6fa50ef7f21b655b Mon Sep 17 00:00:00 2001 From: Max Prokhorov Date: Fri, 30 May 2025 01:08:31 +0300 Subject: [PATCH 50/50] Tools - upload.py exception handling fixes (#9186) - don't check exc_info() in `finally`, it only works without `except` with just `try` and `finally` see https://docs.python.org/3/reference/compound_stmts.html#try after `except Exception as e:` block, `e` is already deleted - handle a rare case when esptool code does not close 'erase_file'. printing paths may cause encoding issues, so just fall through silently - simplify ordering of write_flash & erase_region arguments since we always end up in write_flash, prefer to think of it as argument pairs 'addr' + 'path'. actual binaries go first, erase temporaries go last. construct write args beforehand and apply when finishing with the command line. both commands can appear multiple times, for manual or scripting cases, where multiple regions should be erased / written to --- tools/upload.py | 152 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 102 insertions(+), 50 deletions(-) diff --git a/tools/upload.py b/tools/upload.py index 760d4dbbef..a7b8c4f530 100755 --- a/tools/upload.py +++ b/tools/upload.py @@ -1,74 +1,126 @@ #!/usr/bin/env python3 # Wrapper for Arduino core / others that can call esptool.py possibly multiple times -# Adds pyserial to sys.path automatically based on the path of the current file - -# First parameter is pyserial path, second is esptool path, then a series of command arguments -# i.e. upload.py tools/pyserial tools/esptool write_flash file 0x0 +# Adds pyserial & esptool that are in the same directory as the script to sys.path import os +import atexit +import pathlib import sys import tempfile +import traceback + +from typing import List + +# Add neighbouring pyserial & esptool to search path +MODULES = [ + "pyserial", + "esptool", +] -sys.argv.pop(0) # Remove executable name -toolspath = os.path.dirname(os.path.realpath(__file__)) +PWD = pathlib.Path(__file__).resolve().parent +for m in MODULES: + sys.path.insert(0, (PWD / m).as_posix()) + +# If this fails, we can't continue and will bomb below try: - sys.path.insert(0, os.path.join(toolspath, "pyserial")) # Add pyserial dir to search path - sys.path.insert(0, os.path.join(toolspath, "esptool")) # Add esptool dir to search path - import esptool # If this fails, we can't continue and will bomb below + import esptool except ImportError: - sys.stderr.write("pyserial or esptool directories not found next to this upload.py tool.\n") + sys.stderr.write( + "\n*** pyserial or esptool directories not found next to upload.py tool (this script) ***\n" + ) + traceback.print_exc(file=sys.stderr) + sys.stderr.flush() + sys.exit(1) -cmdline = [] -write_option = '' -write_addr = '0x0' -erase_addr = '' -erase_len = '' -while sys.argv: - thisarg = sys.argv.pop(0) +def make_erase_pair(addr: str, dest_size: int, block_size=2**16): + dest, path = tempfile.mkstemp() + + buffer = bytearray(b"\xff" * block_size) + while dest_size: + remainder = dest_size % block_size + + if remainder: + src = buffer[:remainder] + src_size = remainder + else: + src = buffer + src_size = block_size + + os.write(dest, src) + dest_size -= src_size + + os.close(dest) + + def maybe_remove(path): + try: + os.remove(path) + except Exception: + pass + + atexit.register(maybe_remove, path) + return [addr, path] + - # We silently replace the 921kbaud setting with 460k to enable backward +argv = sys.argv[1:] # Remove executable name + +cmdline: List[str] = [] +write_options: List[str] = ["--flash_size", "detect"] +erase_options: List[str] = [] + +thisarg = "" +lastarg = "" +while argv: + lastarg = thisarg + thisarg = argv.pop(0) + + # We silently replace the high-speed setting with 460k to enable backward # compatibility with the old esptool-ck.exe. Esptool.py doesn't seem - # work reliably at 921k, but is still significantly faster at 460kbaud. - if thisarg == "921600": + # work reliably, but 460kbaud is still plenty fast. + if lastarg == "--baud" and thisarg in ("921600", "3000000"): thisarg = "460800" # 'erase_flash' command is translated to the write_flash --erase-all option # https://github.com/esp8266/Arduino/issues/6755#issuecomment-553208688 if thisarg == "erase_flash": - write_option = '--erase-all' - elif thisarg == 'erase_region': - erase_addr = sys.argv.pop(0) - erase_len = sys.argv.pop(0) - elif thisarg == 'write_flash': - write_addr = sys.argv.pop(0) - binary = sys.argv.pop(0) + write_options.append("--erase-all") + + # instead of providing esptool with separate targets, + # everything below becomes 'write_flash' [ ] pairs + + # 'erase_region' becomes a temporary file filled with 0xff + # this pair is appended *after* 'write_flash' pairs + elif thisarg == "erase_region": + addr = argv.pop(0) + size = int(argv.pop(0), 0) + erase_options.extend(make_erase_pair(addr, size)) + + # 'write_flash' pair taken in order it was specified + elif thisarg == "write_flash": + addr = argv.pop(0) + path = argv.pop(0) + write_options.extend([addr, path]) + + # everything else is used as-is elif thisarg: - cmdline = cmdline + [thisarg] - -cmdline = cmdline + ['write_flash'] -if write_option: - cmdline = cmdline + [write_option] -cmdline = cmdline + ['--flash_size', 'detect'] -cmdline = cmdline + [write_addr, binary] - -erase_file = '' -if erase_addr: - # Generate temporary empty (0xff) file - eraser = tempfile.mkstemp() - erase_file = eraser[1] - os.write(eraser[0], bytearray([0xff] * int(erase_len, 0))) - os.close(eraser[0]) - cmdline = cmdline + [erase_addr, erase_file] + cmdline.append(thisarg) + + +cmdline.append("write_flash") +for opts in (write_options, erase_options): + if opts: + cmdline.extend(opts) try: esptool.main(cmdline) -except Exception as e: - sys.stderr.write('\nA fatal esptool.py error occurred: %s' % e) -finally: - if erase_file: - os.remove(erase_file) - if any(sys.exc_info()): - sys.exit(2) +except Exception: + etype, evalue, _ = sys.exc_info() + estring = "\n".join(traceback.format_exception_only(etype, value=evalue)) + + sys.stderr.write("\n*** upload.py fatal error ***\n") + sys.stderr.write(estring) + sys.stderr.flush() + + sys.exit(2)