From e1f1e6167f08b752b31dea868f26ef64dc00c1a1 Mon Sep 17 00:00:00 2001 From: tyeth Date: Sun, 19 Oct 2025 00:10:38 +0100 Subject: [PATCH 01/13] add(eink): UC8253 3.7" mono 416x240 --- .../drivers/dispDrvThinkInkMonoBAAMFGN.h | 259 ++++++++++++++++++ src/components/display/hardware.cpp | 6 + src/components/display/hardware.h | 1 + src/wippersnapper/display/v1/display.pb.h | 3 +- 4 files changed, 268 insertions(+), 1 deletion(-) create mode 100644 src/components/display/drivers/dispDrvThinkInkMonoBAAMFGN.h diff --git a/src/components/display/drivers/dispDrvThinkInkMonoBAAMFGN.h b/src/components/display/drivers/dispDrvThinkInkMonoBAAMFGN.h new file mode 100644 index 000000000..a3f5f870d --- /dev/null +++ b/src/components/display/drivers/dispDrvThinkInkMonoBAAMFGN.h @@ -0,0 +1,259 @@ +/*! + * @file src/components/display/drivers/dispDrvThinkInkMonoBAAMFGN.h + * + * Driver for ThinkInk 3.7" Monochrome BAAMFGN display (ADA6395) + * + * Adafruit invests time and resources providing this open source code, + * please support Adafruit and open-source hardware by purchasing + * products from Adafruit! + * + * Copyright (c) Tyeth Gundry 2025 for Adafruit Industries. + * + * BSD license, all text here must be included in any redistribution. + * + */ +#ifndef WS_DRV_THINKINK_MONO_BAAMFGN_H +#define WS_DRV_THINKINK_MONO_BAAMFGN_H + +#include "dispDrvBase.h" + +/*! + @brief Driver for a ThinkInk 3.7" Monochrome BAAMFGN display (ADA6395). +*/ +class dispDrvThinkInkMonoBAAMFGN : public dispDrvBase { +public: + /*! + @brief Constructor for the ThinkInk Mono BAAMFGN EPD display driver. + @param dc + Data/Command pin for the display. + @param rst + Reset pin for the display. + @param cs + Chip Select pin for the display. + @param sram_cs + Optional SRAM Chip Select pin for E-Ink displays that support it. + @param busy + Optional Busy pin for the display. + */ + dispDrvThinkInkMonoBAAMFGN(int16_t dc, int16_t rst, int16_t cs, + int16_t sram_cs = -1, int16_t busy = -1) + : dispDrvBase(dc, rst, cs, sram_cs, busy), _display(nullptr) {} + + ~dispDrvThinkInkMonoBAAMFGN() { + if (_display) { + // Clear the display buffer before deleting + _display->clearBuffer(); + _display->display(); + delete _display; + _display = nullptr; + } + } + + /*! + @brief Attempts to initialize the ThinkInk Mono BAAMFGN EPD + display driver. + @param mode + The ThinkInk mode to use for the display. + @param reset + Whether to reset the display before initialization. + @return True if the display was initialized successfully, false otherwise. + */ + bool begin(thinkinkmode_t mode, bool reset = true) override { + _display = new ThinkInk_370_Mono_BAAMFGN(_pin_dc, _pin_rst, _pin_cs, + _pin_sram_cs, _pin_busy); + if (!_display) + return false; // Allocation failed + + // Initialize the display + _display->begin(mode); + // Configure display settings + _display->setTextSize(_text_sz); + _display->setTextColor(EPD_BLACK); + _display->setTextWrap(false); + _height = _display->height(); + _width = _display->width(); + // Clear the display buffer + _display->clearBuffer(); + _display->display(); + + return true; + } + + /*! + @brief Draws a status bar at the top of the display. + @param io_username + The Adafruit IO username to display on the status bar. + */ + virtual void drawStatusBar(const char *io_username) override { + if (!_display) + return; + + // Clear the entire display buffer to remove splash screen + _display->clearBuffer(); + + // Draw status bar + _display->fillRect(0, 0, _display->width(), STATUS_BAR_HEIGHT, EPD_BLACK); + _display->fillRect(STATUS_BAR_BORDER, STATUS_BAR_BORDER, + _display->width() - (2 * STATUS_BAR_BORDER), + STATUS_BAR_HEIGHT - (2 * STATUS_BAR_BORDER), EPD_WHITE); + + // Draw username on left side of the status bar + _display->setTextSize(1); + _display->setTextColor(EPD_BLACK); + _display->setCursor(5, 6); + _display->print(io_username); + + // Calculate status bar icon positions and center vertically + _statusbar_icons_y = + STATUS_BAR_BORDER + + ((STATUS_BAR_HEIGHT - 2 * STATUS_BAR_BORDER - STATUS_BAR_ICON_SZ) / 2); + _statusbar_icon_battery_x = + _display->width() - STATUS_BAR_ICON_SZ - STATUS_BAR_ICON_MARGIN; + _statusbar_icon_wifi_x = _statusbar_icon_battery_x - STATUS_BAR_ICON_SZ - + STATUS_BAR_ICON_SPACING; + _statusbar_icon_cloud_x = + _statusbar_icon_wifi_x - STATUS_BAR_ICON_SZ - STATUS_BAR_ICON_SPACING; + // Draw icons on right side of the status bar + _display->drawBitmap(_statusbar_icon_cloud_x, _statusbar_icons_y, + epd_bmp_cloud_online, STATUS_BAR_ICON_SZ, + STATUS_BAR_ICON_SZ, EPD_BLACK); + _display->drawBitmap(_statusbar_icon_wifi_x, _statusbar_icons_y, + epd_bmp_wifi_full, STATUS_BAR_ICON_SZ, + STATUS_BAR_ICON_SZ, EPD_BLACK); + _display->drawBitmap(_statusbar_icon_battery_x, _statusbar_icons_y, + epd_bmp_bat_full, STATUS_BAR_ICON_SZ, + STATUS_BAR_ICON_SZ, EPD_BLACK); + + _display->display(); + } + + /*! + @brief Updates the status bar with current information (battery level, + connectivity status, etc). + @param rssi + The current WiFi RSSI (signal strength) in dB. + @param bat + The current battery level as a percentage (0-100). + @param mqtt_status + The current MQTT connection status. +*/ + void updateStatusBar(int8_t rssi, uint8_t bat, bool mqtt_status) override { + if (!_display) + return; + + // Only update wifi icon if the RSSI has changed significantly (+/- 5dB) + bool update_rssi = abs(rssi - _statusbar_rssi) >= 5; + // Only update cloud icon if MQTT status has changed + bool update_mqtt = mqtt_status != _statusbar_mqtt_connected; + + // No need to update if nothing has changed + if (!update_rssi && !update_mqtt) + return; + + if (update_mqtt) { + // updating the RSSI occurs too frequently to be practical + _display->fillRect(_statusbar_icon_cloud_x, _statusbar_icons_y, + STATUS_BAR_ICON_SZ, STATUS_BAR_ICON_SZ, EPD_WHITE); + if (mqtt_status) { + _display->drawBitmap(_statusbar_icon_cloud_x, _statusbar_icons_y, + epd_bmp_cloud_online, STATUS_BAR_ICON_SZ, + STATUS_BAR_ICON_SZ, EPD_BLACK); + } else { + _display->drawBitmap(_statusbar_icon_cloud_x, _statusbar_icons_y, + epd_bmp_cloud_offline, STATUS_BAR_ICON_SZ, + STATUS_BAR_ICON_SZ, EPD_BLACK); + } + _statusbar_mqtt_connected = mqtt_status; + } + + // Update WiFi icon only if RSSI has changed significantly (+/-3dB) + if (update_rssi) { + const unsigned char *wifi_icon = epd_bmp_wifi_no_signal; + if (rssi >= -50) { + wifi_icon = epd_bmp_wifi_full; + } else if (rssi < -50 && rssi >= -60) { + wifi_icon = epd_bmp_wifi_fair; + } else if (rssi < -60 && rssi >= -70) { + wifi_icon = epd_bmp_wifi_weak; + } else if (rssi < -70 && rssi >= -80) { + wifi_icon = epd_bmp_wifi_no_signal; + } else { + wifi_icon = epd_bmp_wifi_no_signal; + } + // Clear and draw the new WiFi icon, based on RSSI + _display->fillRect(_statusbar_icon_wifi_x, _statusbar_icons_y, + STATUS_BAR_ICON_SZ, STATUS_BAR_ICON_SZ, EPD_WHITE); + _display->drawBitmap(_statusbar_icon_wifi_x, _statusbar_icons_y, + wifi_icon, STATUS_BAR_ICON_SZ, STATUS_BAR_ICON_SZ, + EPD_BLACK); + _statusbar_rssi = rssi; + } + + _display->display(); + } + + /*! + @brief Writes a message to the display. + @param message + The message to write to the display. + @note This method overrides the base class method to provide specific + functionality for the Think Ink Grayscale 4 EAAMGFGN driver. + */ + virtual void writeMessage(const char *message) override { + if (_display == nullptr) + return; + + // Clear only the area below the status bar + _display->fillRect(0, STATUS_BAR_HEIGHT, _display->width(), + _display->height() - STATUS_BAR_HEIGHT, EPD_WHITE); + // Add padding between status bar and text content + int16_t y_idx = STATUS_BAR_HEIGHT + 4; + _display->setCursor(0, y_idx); + + // Calculate the line height based on the text size (NOTE: base height is + // 8px) + int16_t line_height = 8 * _text_sz; + uint16_t c_idx = 0; + size_t msg_size = strlen(message); + + // Reset the text size to the configured value before we write + _display->setTextSize(_text_sz); + + for (size_t i = 0; i < msg_size && c_idx < msg_size; i++) { + if (y_idx + line_height > _height) + break; + if (message[i] == '\\' && i + 1 < msg_size && + (message[i + 1] == 'n' || message[i + 1] == 'r')) { + // Handle \r\n sequence as a single newline + if (message[i + 1] == 'r' && i + 3 < msg_size && + message[i + 2] == '\\' && message[i + 3] == 'n') { + // Skip to the next line + if (y_idx + line_height > _height) + break; + y_idx += line_height; + _display->setCursor(0, y_idx); + i += 3; + } else if (message[i + 1] == 'n') { + // Skip to the next line + if (y_idx + line_height > _height) + break; + y_idx += line_height; + _display->setCursor(0, y_idx); + i++; + } + } else if (message[i] == 0xC2 && message[i + 1] == 0xB0) { + // Degree symbol + _display->write(char(247)); + i++; + } else { + _display->print(message[i]); + } + } + _display->display(); + } + +private: + ThinkInk_370_Mono_BAAMFGN *_display; +}; + +#endif // WS_DRV_THINKINK_MONO_BAAMFGN_H \ No newline at end of file diff --git a/src/components/display/hardware.cpp b/src/components/display/hardware.cpp index 962c63fc2..53f5ceaa1 100644 --- a/src/components/display/hardware.cpp +++ b/src/components/display/hardware.cpp @@ -31,6 +31,12 @@ static const std::map dispDrvBase * { + return new dispDrvThinkInkMonoBAAMFGN(dc, rst, cs, sram_cs, + busy); + }}, {wippersnapper_display_v1_DisplayDriver_DISPLAY_DRIVER_EPD_ILI0373, [](int16_t dc, int16_t rst, int16_t cs, int16_t sram_cs, int16_t busy) -> dispDrvBase * { diff --git a/src/components/display/hardware.h b/src/components/display/hardware.h index c22ac5d01..0c578fd14 100644 --- a/src/components/display/hardware.h +++ b/src/components/display/hardware.h @@ -19,6 +19,7 @@ #include "drivers/dispDrvSt7789.h" #include "drivers/dispDrvThinkInkGrayscale4Eaamfgn.h" #include "drivers/dispDrvThinkInkGrayscale4T5.h" +#include "drivers/dispDrvThinkInkMonoBAAMFGN.h" #include #include diff --git a/src/wippersnapper/display/v1/display.pb.h b/src/wippersnapper/display/v1/display.pb.h index 33b91cb7d..50c38ba5b 100644 --- a/src/wippersnapper/display/v1/display.pb.h +++ b/src/wippersnapper/display/v1/display.pb.h @@ -27,7 +27,8 @@ typedef enum _wippersnapper_display_v1_DisplayDriver { wippersnapper_display_v1_DisplayDriver_DISPLAY_DRIVER_UNSPECIFIED = 0, wippersnapper_display_v1_DisplayDriver_DISPLAY_DRIVER_EPD_SSD1680 = 1, wippersnapper_display_v1_DisplayDriver_DISPLAY_DRIVER_EPD_ILI0373 = 2, - wippersnapper_display_v1_DisplayDriver_DISPLAY_DRIVER_TFT_ST7789 = 3 + wippersnapper_display_v1_DisplayDriver_DISPLAY_DRIVER_TFT_ST7789 = 3, + wippersnapper_display_v1_DisplayDriver_DISPLAY_DRIVER_EPD_UC8253 = 4 } wippersnapper_display_v1_DisplayDriver; /* Struct definitions */ From c106b5960516db94f4f225a11f99b69e0ff97722 Mon Sep 17 00:00:00 2001 From: tyeth Date: Mon, 15 Dec 2025 21:07:27 +0000 Subject: [PATCH 02/13] Ignore wifi nina fork --- platformio.ini | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/platformio.ini b/platformio.ini index 4be3bb597..be4f6a281 100644 --- a/platformio.ini +++ b/platformio.ini @@ -106,13 +106,13 @@ platform = https://github.com/pioarduino/platform-espressif32/releases/download/ ; platform = https://github.com/pioarduino/platform-espressif32/releases/download/51.03.07/platform-espressif32.zip ; This is needed for occasional new features and bug fixes ; platform = https://github.com/pioarduino/platform-espressif32#develop -lib_ignore = WiFiNINA, WiFi101, OneWire +lib_ignore = WiFiNINA, WiFiNINA_-_Adafruit_Fork, WiFi101, OneWire monitor_filters = esp32_exception_decoder, time ; Common build environment for ESP8266 platform [common:esp8266] platform = espressif8266 -lib_ignore = WiFiNINA, WiFi101, Adafruit TinyUSB Library, OneWire +lib_ignore = WiFiNINA, WiFiNINA_-_Adafruit_Fork, WiFi101, Adafruit TinyUSB Library, OneWire ; Common build environment for Atmel/Microchip SAMDx platform [common:atsamd] @@ -132,7 +132,7 @@ platform_packages = framework-arduinopico@https://github.com/earlephilhower/ardu framework = arduino board_build.core = earlephilhower board_build.filesystem_size = 0.5m -lib_ignore = WiFiNINA, WiFi101, Adafruit Zero DMA Library, OneWire +lib_ignore = WiFiNINA, WiFiNINA_-_Adafruit_Fork, WiFi101, Adafruit Zero DMA Library, OneWire lib_compat_mode = soft ; can be stricter once pio detects SleepyDog on RP2040 From 2486979f1f2e772c46f4c664999af4e60af0e575 Mon Sep 17 00:00:00 2001 From: tyeth Date: Tue, 16 Dec 2025 03:15:28 +0000 Subject: [PATCH 03/13] refactor(display): replace runNetFSM with pingBroker as does both --- src/components/display/controller.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/display/controller.cpp b/src/components/display/controller.cpp index 7c8c1f7d2..0d2f49ddd 100644 --- a/src/components/display/controller.cpp +++ b/src/components/display/controller.cpp @@ -83,15 +83,15 @@ bool DisplayController::Handle_Display_AddOrReplace( return false; } - WS.runNetFSM(); + WS.pingBroker(); display->showSplash(); - WS.runNetFSM(); + + WS.pingBroker(); display->drawStatusBar(WS._config.aio_user); - WS.runNetFSM(); _hw_instances.push_back(display); // Store the display instance WS_DEBUG_PRINTLN("[display] Display added or replaced successfully!"); - WS.runNetFSM(); + WS.pingBroker(); return true; } From 2d9cf919b9753f58ae457dbc239f6d761c23cdd8 Mon Sep 17 00:00:00 2001 From: tyeth Date: Wed, 17 Dec 2025 01:40:54 +0000 Subject: [PATCH 04/13] formatting + setHeight/Width for EPD before begin (possibly switch --- .../display/drivers/dispDrvThinkInkMonoBAAMFGN.h | 4 ++-- src/components/display/hardware.cpp | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/components/display/drivers/dispDrvThinkInkMonoBAAMFGN.h b/src/components/display/drivers/dispDrvThinkInkMonoBAAMFGN.h index a3f5f870d..998eabc78 100644 --- a/src/components/display/drivers/dispDrvThinkInkMonoBAAMFGN.h +++ b/src/components/display/drivers/dispDrvThinkInkMonoBAAMFGN.h @@ -36,7 +36,7 @@ class dispDrvThinkInkMonoBAAMFGN : public dispDrvBase { Optional Busy pin for the display. */ dispDrvThinkInkMonoBAAMFGN(int16_t dc, int16_t rst, int16_t cs, - int16_t sram_cs = -1, int16_t busy = -1) + int16_t sram_cs = -1, int16_t busy = -1) : dispDrvBase(dc, rst, cs, sram_cs, busy), _display(nullptr) {} ~dispDrvThinkInkMonoBAAMFGN() { @@ -60,7 +60,7 @@ class dispDrvThinkInkMonoBAAMFGN : public dispDrvBase { */ bool begin(thinkinkmode_t mode, bool reset = true) override { _display = new ThinkInk_370_Mono_BAAMFGN(_pin_dc, _pin_rst, _pin_cs, - _pin_sram_cs, _pin_busy); + _pin_sram_cs, _pin_busy); if (!_display) return false; // Allocation failed diff --git a/src/components/display/hardware.cpp b/src/components/display/hardware.cpp index 53f5ceaa1..5c6ac9b9f 100644 --- a/src/components/display/hardware.cpp +++ b/src/components/display/hardware.cpp @@ -34,8 +34,7 @@ static const std::map dispDrvBase * { - return new dispDrvThinkInkMonoBAAMFGN(dc, rst, cs, sram_cs, - busy); + return new dispDrvThinkInkMonoBAAMFGN(dc, rst, cs, sram_cs, busy); }}, {wippersnapper_display_v1_DisplayDriver_DISPLAY_DRIVER_EPD_ILI0373, [](int16_t dc, int16_t rst, int16_t cs, int16_t sram_cs, @@ -258,6 +257,10 @@ bool DisplayHardware::beginEPD( return false; } + _drvDisp->setWidth(config->width); + _drvDisp->setHeight(config->height); + // EPD config doesn't support rotation + // _drvDisp->setRotation(config->rotation); _drvDisp->setTextSize(config->text_size); if (!_drvDisp->begin(epd_mode)) { From 2a0cf5d0831b7314f961f810cb84ae25bd93e12e Mon Sep 17 00:00:00 2001 From: tyeth Date: Wed, 17 Dec 2025 16:40:09 +0000 Subject: [PATCH 05/13] Update all protobufs from CI --- src/wippersnapper/description/v1/description.pb.c | 2 +- src/wippersnapper/description/v1/description.pb.h | 2 +- src/wippersnapper/display/v1/display.pb.c | 2 +- src/wippersnapper/display/v1/display.pb.h | 6 +++--- src/wippersnapper/ds18x20/v1/ds18x20.pb.c | 2 +- src/wippersnapper/ds18x20/v1/ds18x20.pb.h | 2 +- src/wippersnapper/i2c/v1/i2c.pb.c | 2 +- src/wippersnapper/i2c/v1/i2c.pb.h | 2 +- src/wippersnapper/pin/v1/pin.pb.c | 2 +- src/wippersnapper/pin/v1/pin.pb.h | 2 +- src/wippersnapper/pixels/v1/pixels.pb.c | 2 +- src/wippersnapper/pixels/v1/pixels.pb.h | 2 +- src/wippersnapper/pwm/v1/pwm.pb.c | 2 +- src/wippersnapper/pwm/v1/pwm.pb.h | 2 +- src/wippersnapper/servo/v1/servo.pb.c | 2 +- src/wippersnapper/servo/v1/servo.pb.h | 2 +- src/wippersnapper/signal/v1/signal.pb.c | 2 +- src/wippersnapper/signal/v1/signal.pb.h | 2 +- src/wippersnapper/uart/v1/uart.pb.c | 2 +- src/wippersnapper/uart/v1/uart.pb.h | 2 +- 20 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/wippersnapper/description/v1/description.pb.c b/src/wippersnapper/description/v1/description.pb.c index 3a561a76e..e5f0a8d59 100644 --- a/src/wippersnapper/description/v1/description.pb.c +++ b/src/wippersnapper/description/v1/description.pb.c @@ -1,5 +1,5 @@ /* Automatically generated nanopb constant definitions */ -/* Generated by nanopb-0.4.5-dev at Tue Sep 30 14:06:15 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Dec 15 19:07:45 2025. */ #include "wippersnapper/description/v1/description.pb.h" #if PB_PROTO_HEADER_VERSION != 40 diff --git a/src/wippersnapper/description/v1/description.pb.h b/src/wippersnapper/description/v1/description.pb.h index f276adbe7..23f735cf1 100644 --- a/src/wippersnapper/description/v1/description.pb.h +++ b/src/wippersnapper/description/v1/description.pb.h @@ -1,5 +1,5 @@ /* Automatically generated nanopb header */ -/* Generated by nanopb-0.4.5-dev at Tue Sep 30 14:06:15 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Dec 15 19:07:45 2025. */ #ifndef PB_WIPPERSNAPPER_DESCRIPTION_V1_WIPPERSNAPPER_DESCRIPTION_V1_DESCRIPTION_PB_H_INCLUDED #define PB_WIPPERSNAPPER_DESCRIPTION_V1_WIPPERSNAPPER_DESCRIPTION_V1_DESCRIPTION_PB_H_INCLUDED diff --git a/src/wippersnapper/display/v1/display.pb.c b/src/wippersnapper/display/v1/display.pb.c index 56076ede4..9e19f827e 100644 --- a/src/wippersnapper/display/v1/display.pb.c +++ b/src/wippersnapper/display/v1/display.pb.c @@ -1,5 +1,5 @@ /* Automatically generated nanopb constant definitions */ -/* Generated by nanopb-0.4.5-dev at Tue Sep 30 14:06:15 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Dec 15 19:07:45 2025. */ #include "wippersnapper/display/v1/display.pb.h" #if PB_PROTO_HEADER_VERSION != 40 diff --git a/src/wippersnapper/display/v1/display.pb.h b/src/wippersnapper/display/v1/display.pb.h index 50c38ba5b..ff1c28222 100644 --- a/src/wippersnapper/display/v1/display.pb.h +++ b/src/wippersnapper/display/v1/display.pb.h @@ -1,5 +1,5 @@ /* Automatically generated nanopb header */ -/* Generated by nanopb-0.4.5-dev at Tue Sep 30 14:06:15 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Dec 15 19:07:45 2025. */ #ifndef PB_WIPPERSNAPPER_DISPLAY_V1_WIPPERSNAPPER_DISPLAY_V1_DISPLAY_PB_H_INCLUDED #define PB_WIPPERSNAPPER_DISPLAY_V1_WIPPERSNAPPER_DISPLAY_V1_DISPLAY_PB_H_INCLUDED @@ -111,8 +111,8 @@ typedef struct _wippersnapper_display_v1_DisplayAddOrReplace { #define _wippersnapper_display_v1_EPDMode_ARRAYSIZE ((wippersnapper_display_v1_EPDMode)(wippersnapper_display_v1_EPDMode_EPD_MODE_MONO+1)) #define _wippersnapper_display_v1_DisplayDriver_MIN wippersnapper_display_v1_DisplayDriver_DISPLAY_DRIVER_UNSPECIFIED -#define _wippersnapper_display_v1_DisplayDriver_MAX wippersnapper_display_v1_DisplayDriver_DISPLAY_DRIVER_TFT_ST7789 -#define _wippersnapper_display_v1_DisplayDriver_ARRAYSIZE ((wippersnapper_display_v1_DisplayDriver)(wippersnapper_display_v1_DisplayDriver_DISPLAY_DRIVER_TFT_ST7789+1)) +#define _wippersnapper_display_v1_DisplayDriver_MAX wippersnapper_display_v1_DisplayDriver_DISPLAY_DRIVER_EPD_UC8253 +#define _wippersnapper_display_v1_DisplayDriver_ARRAYSIZE ((wippersnapper_display_v1_DisplayDriver)(wippersnapper_display_v1_DisplayDriver_DISPLAY_DRIVER_EPD_UC8253+1)) #ifdef __cplusplus diff --git a/src/wippersnapper/ds18x20/v1/ds18x20.pb.c b/src/wippersnapper/ds18x20/v1/ds18x20.pb.c index 4cd1b262f..2d9ea823e 100644 --- a/src/wippersnapper/ds18x20/v1/ds18x20.pb.c +++ b/src/wippersnapper/ds18x20/v1/ds18x20.pb.c @@ -1,5 +1,5 @@ /* Automatically generated nanopb constant definitions */ -/* Generated by nanopb-0.4.5-dev at Tue Sep 30 14:06:15 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Dec 15 19:07:45 2025. */ #include "wippersnapper/ds18x20/v1/ds18x20.pb.h" #if PB_PROTO_HEADER_VERSION != 40 diff --git a/src/wippersnapper/ds18x20/v1/ds18x20.pb.h b/src/wippersnapper/ds18x20/v1/ds18x20.pb.h index 4f0e69289..7acbcc9ad 100644 --- a/src/wippersnapper/ds18x20/v1/ds18x20.pb.h +++ b/src/wippersnapper/ds18x20/v1/ds18x20.pb.h @@ -1,5 +1,5 @@ /* Automatically generated nanopb header */ -/* Generated by nanopb-0.4.5-dev at Tue Sep 30 14:06:15 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Dec 15 19:07:45 2025. */ #ifndef PB_WIPPERSNAPPER_DS18X20_V1_WIPPERSNAPPER_DS18X20_V1_DS18X20_PB_H_INCLUDED #define PB_WIPPERSNAPPER_DS18X20_V1_WIPPERSNAPPER_DS18X20_V1_DS18X20_PB_H_INCLUDED diff --git a/src/wippersnapper/i2c/v1/i2c.pb.c b/src/wippersnapper/i2c/v1/i2c.pb.c index 04efb79af..fffe803c8 100644 --- a/src/wippersnapper/i2c/v1/i2c.pb.c +++ b/src/wippersnapper/i2c/v1/i2c.pb.c @@ -1,5 +1,5 @@ /* Automatically generated nanopb constant definitions */ -/* Generated by nanopb-0.4.5-dev at Tue Sep 30 14:06:15 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Dec 15 19:07:45 2025. */ #include "wippersnapper/i2c/v1/i2c.pb.h" #if PB_PROTO_HEADER_VERSION != 40 diff --git a/src/wippersnapper/i2c/v1/i2c.pb.h b/src/wippersnapper/i2c/v1/i2c.pb.h index 4ea4be122..506b20d18 100644 --- a/src/wippersnapper/i2c/v1/i2c.pb.h +++ b/src/wippersnapper/i2c/v1/i2c.pb.h @@ -1,5 +1,5 @@ /* Automatically generated nanopb header */ -/* Generated by nanopb-0.4.5-dev at Tue Sep 30 14:06:15 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Dec 15 19:07:45 2025. */ #ifndef PB_WIPPERSNAPPER_I2C_V1_WIPPERSNAPPER_I2C_V1_I2C_PB_H_INCLUDED #define PB_WIPPERSNAPPER_I2C_V1_WIPPERSNAPPER_I2C_V1_I2C_PB_H_INCLUDED diff --git a/src/wippersnapper/pin/v1/pin.pb.c b/src/wippersnapper/pin/v1/pin.pb.c index 765b7b7c8..a622132a1 100644 --- a/src/wippersnapper/pin/v1/pin.pb.c +++ b/src/wippersnapper/pin/v1/pin.pb.c @@ -1,5 +1,5 @@ /* Automatically generated nanopb constant definitions */ -/* Generated by nanopb-0.4.5-dev at Tue Sep 30 14:06:15 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Dec 15 19:07:45 2025. */ #include "wippersnapper/pin/v1/pin.pb.h" #if PB_PROTO_HEADER_VERSION != 40 diff --git a/src/wippersnapper/pin/v1/pin.pb.h b/src/wippersnapper/pin/v1/pin.pb.h index c766d2682..cb59d908d 100644 --- a/src/wippersnapper/pin/v1/pin.pb.h +++ b/src/wippersnapper/pin/v1/pin.pb.h @@ -1,5 +1,5 @@ /* Automatically generated nanopb header */ -/* Generated by nanopb-0.4.5-dev at Tue Sep 30 14:06:15 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Dec 15 19:07:45 2025. */ #ifndef PB_WIPPERSNAPPER_PIN_V1_WIPPERSNAPPER_PIN_V1_PIN_PB_H_INCLUDED #define PB_WIPPERSNAPPER_PIN_V1_WIPPERSNAPPER_PIN_V1_PIN_PB_H_INCLUDED diff --git a/src/wippersnapper/pixels/v1/pixels.pb.c b/src/wippersnapper/pixels/v1/pixels.pb.c index ff5d30e4c..5d3696249 100644 --- a/src/wippersnapper/pixels/v1/pixels.pb.c +++ b/src/wippersnapper/pixels/v1/pixels.pb.c @@ -1,5 +1,5 @@ /* Automatically generated nanopb constant definitions */ -/* Generated by nanopb-0.4.5-dev at Tue Sep 30 14:06:15 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Dec 15 19:07:45 2025. */ #include "wippersnapper/pixels/v1/pixels.pb.h" #if PB_PROTO_HEADER_VERSION != 40 diff --git a/src/wippersnapper/pixels/v1/pixels.pb.h b/src/wippersnapper/pixels/v1/pixels.pb.h index 2b4dc0a02..a918e053a 100644 --- a/src/wippersnapper/pixels/v1/pixels.pb.h +++ b/src/wippersnapper/pixels/v1/pixels.pb.h @@ -1,5 +1,5 @@ /* Automatically generated nanopb header */ -/* Generated by nanopb-0.4.5-dev at Tue Sep 30 14:06:15 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Dec 15 19:07:45 2025. */ #ifndef PB_WIPPERSNAPPER_PIXELS_V1_WIPPERSNAPPER_PIXELS_V1_PIXELS_PB_H_INCLUDED #define PB_WIPPERSNAPPER_PIXELS_V1_WIPPERSNAPPER_PIXELS_V1_PIXELS_PB_H_INCLUDED diff --git a/src/wippersnapper/pwm/v1/pwm.pb.c b/src/wippersnapper/pwm/v1/pwm.pb.c index 9d2dd8738..a7ab5297d 100644 --- a/src/wippersnapper/pwm/v1/pwm.pb.c +++ b/src/wippersnapper/pwm/v1/pwm.pb.c @@ -1,5 +1,5 @@ /* Automatically generated nanopb constant definitions */ -/* Generated by nanopb-0.4.5-dev at Tue Sep 30 14:06:15 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Dec 15 19:07:45 2025. */ #include "wippersnapper/pwm/v1/pwm.pb.h" #if PB_PROTO_HEADER_VERSION != 40 diff --git a/src/wippersnapper/pwm/v1/pwm.pb.h b/src/wippersnapper/pwm/v1/pwm.pb.h index f5b7d13c2..8ea52785e 100644 --- a/src/wippersnapper/pwm/v1/pwm.pb.h +++ b/src/wippersnapper/pwm/v1/pwm.pb.h @@ -1,5 +1,5 @@ /* Automatically generated nanopb header */ -/* Generated by nanopb-0.4.5-dev at Tue Sep 30 14:06:15 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Dec 15 19:07:45 2025. */ #ifndef PB_WIPPERSNAPPER_PWM_V1_WIPPERSNAPPER_PWM_V1_PWM_PB_H_INCLUDED #define PB_WIPPERSNAPPER_PWM_V1_WIPPERSNAPPER_PWM_V1_PWM_PB_H_INCLUDED diff --git a/src/wippersnapper/servo/v1/servo.pb.c b/src/wippersnapper/servo/v1/servo.pb.c index 4da53fd19..6c42de06a 100644 --- a/src/wippersnapper/servo/v1/servo.pb.c +++ b/src/wippersnapper/servo/v1/servo.pb.c @@ -1,5 +1,5 @@ /* Automatically generated nanopb constant definitions */ -/* Generated by nanopb-0.4.5-dev at Tue Sep 30 14:06:15 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Dec 15 19:07:45 2025. */ #include "wippersnapper/servo/v1/servo.pb.h" #if PB_PROTO_HEADER_VERSION != 40 diff --git a/src/wippersnapper/servo/v1/servo.pb.h b/src/wippersnapper/servo/v1/servo.pb.h index c1277c853..099b9c115 100644 --- a/src/wippersnapper/servo/v1/servo.pb.h +++ b/src/wippersnapper/servo/v1/servo.pb.h @@ -1,5 +1,5 @@ /* Automatically generated nanopb header */ -/* Generated by nanopb-0.4.5-dev at Tue Sep 30 14:06:15 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Dec 15 19:07:45 2025. */ #ifndef PB_WIPPERSNAPPER_SERVO_V1_WIPPERSNAPPER_SERVO_V1_SERVO_PB_H_INCLUDED #define PB_WIPPERSNAPPER_SERVO_V1_WIPPERSNAPPER_SERVO_V1_SERVO_PB_H_INCLUDED diff --git a/src/wippersnapper/signal/v1/signal.pb.c b/src/wippersnapper/signal/v1/signal.pb.c index ae5fbfe39..49393b6e8 100644 --- a/src/wippersnapper/signal/v1/signal.pb.c +++ b/src/wippersnapper/signal/v1/signal.pb.c @@ -1,5 +1,5 @@ /* Automatically generated nanopb constant definitions */ -/* Generated by nanopb-0.4.5-dev at Tue Sep 30 14:06:15 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Dec 15 19:07:45 2025. */ #include "wippersnapper/signal/v1/signal.pb.h" #if PB_PROTO_HEADER_VERSION != 40 diff --git a/src/wippersnapper/signal/v1/signal.pb.h b/src/wippersnapper/signal/v1/signal.pb.h index 793f3196d..94a30784a 100644 --- a/src/wippersnapper/signal/v1/signal.pb.h +++ b/src/wippersnapper/signal/v1/signal.pb.h @@ -1,5 +1,5 @@ /* Automatically generated nanopb header */ -/* Generated by nanopb-0.4.5-dev at Tue Sep 30 14:06:15 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Dec 15 19:07:45 2025. */ #ifndef PB_WIPPERSNAPPER_SIGNAL_V1_WIPPERSNAPPER_SIGNAL_V1_SIGNAL_PB_H_INCLUDED #define PB_WIPPERSNAPPER_SIGNAL_V1_WIPPERSNAPPER_SIGNAL_V1_SIGNAL_PB_H_INCLUDED diff --git a/src/wippersnapper/uart/v1/uart.pb.c b/src/wippersnapper/uart/v1/uart.pb.c index 7cdc00a5d..04ba96334 100644 --- a/src/wippersnapper/uart/v1/uart.pb.c +++ b/src/wippersnapper/uart/v1/uart.pb.c @@ -1,5 +1,5 @@ /* Automatically generated nanopb constant definitions */ -/* Generated by nanopb-0.4.5-dev at Tue Sep 30 14:06:15 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Dec 15 19:07:45 2025. */ #include "wippersnapper/uart/v1/uart.pb.h" #if PB_PROTO_HEADER_VERSION != 40 diff --git a/src/wippersnapper/uart/v1/uart.pb.h b/src/wippersnapper/uart/v1/uart.pb.h index 844a0bc1d..a7a64c91d 100644 --- a/src/wippersnapper/uart/v1/uart.pb.h +++ b/src/wippersnapper/uart/v1/uart.pb.h @@ -1,5 +1,5 @@ /* Automatically generated nanopb header */ -/* Generated by nanopb-0.4.5-dev at Tue Sep 30 14:06:15 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Dec 15 19:07:45 2025. */ #ifndef PB_WIPPERSNAPPER_UART_V1_WIPPERSNAPPER_UART_V1_UART_PB_H_INCLUDED #define PB_WIPPERSNAPPER_UART_V1_WIPPERSNAPPER_UART_V1_UART_PB_H_INCLUDED From 9cb3d2f9020939e67bae4b971b8b8acf2dad31ff Mon Sep 17 00:00:00 2001 From: tyeth Date: Wed, 17 Dec 2025 17:06:02 +0000 Subject: [PATCH 06/13] Use both runNetFSM and ping for EPD init --- src/components/display/controller.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/components/display/controller.cpp b/src/components/display/controller.cpp index 0d2f49ddd..9e4f5de97 100644 --- a/src/components/display/controller.cpp +++ b/src/components/display/controller.cpp @@ -13,6 +13,7 @@ * */ #include "controller.h" +#include "Wippersnapper_Networking.h" /*! @brief Constructs a new DisplayController object @@ -83,14 +84,17 @@ bool DisplayController::Handle_Display_AddOrReplace( return false; } + WS.runNetFSM(); WS.pingBroker(); display->showSplash(); + WS.runNetFSM(); WS.pingBroker(); display->drawStatusBar(WS._config.aio_user); _hw_instances.push_back(display); // Store the display instance WS_DEBUG_PRINTLN("[display] Display added or replaced successfully!"); + WS.runNetFSM(); WS.pingBroker(); return true; } From 295efb38eefa158b5cf6c412e01c6165bad4f8b0 Mon Sep 17 00:00:00 2001 From: tyeth Date: Wed, 17 Dec 2025 18:40:02 +0000 Subject: [PATCH 07/13] Fix linking issue - Squashed commit of #829 --- ci | 1 + src/Wippersnapper.cpp | 5 ++++- src/Wippersnapper.h | 7 ++++++- src/components/analogIO/Wippersnapper_AnalogIO.h | 1 - src/components/digitalIO/Wippersnapper_DigitalGPIO.h | 1 - src/components/display/controller.h | 2 +- src/components/ds18x20/ws_ds18x20.h | 1 - src/components/i2c/WipperSnapper_I2C.h | 1 - src/components/ledc/ws_ledc.h | 1 - src/components/pixels/ws_pixels.h | 2 +- src/components/pwm/ws_pwm.h | 1 - src/components/register/Wippersnapper_Register.cpp | 2 -- src/components/servo/ws_servo.h | 1 - src/components/statusLED/Wippersnapper_StatusLED.cpp | 1 - src/network_interfaces/Wippersnapper_AIRLIFT.h | 1 - src/network_interfaces/Wippersnapper_ESP32.h | 5 ++++- src/network_interfaces/Wippersnapper_ESP8266.h | 2 -- src/network_interfaces/ws_networking_pico.h | 1 - src/provisioning/littlefs/WipperSnapper_LittleFS.h | 1 - src/provisioning/tinyusb/Wippersnapper_FS.h | 1 - 20 files changed, 17 insertions(+), 21 deletions(-) create mode 160000 ci diff --git a/ci b/ci new file mode 160000 index 000000000..da37d5d23 --- /dev/null +++ b/ci @@ -0,0 +1 @@ +Subproject commit da37d5d2371435fa73fd5a1f4da7d92b7aafea26 diff --git a/src/Wippersnapper.cpp b/src/Wippersnapper.cpp index 72f77fa04..6f94ab0a9 100644 --- a/src/Wippersnapper.cpp +++ b/src/Wippersnapper.cpp @@ -32,8 +32,11 @@ */ #include "Wippersnapper.h" +#include "Wippersnapper_Networking.h" -Wippersnapper WS; +// Define the global WS instance as the platform-specific derived class +// This ensures virtual methods like _connect() route to the correct implementation +Wippersnapper_WiFi WS; Wippersnapper::Wippersnapper() { _mqtt = 0; // MQTT Client object diff --git a/src/Wippersnapper.h b/src/Wippersnapper.h index 56f37ed2b..0f85f9516 100644 --- a/src/Wippersnapper.h +++ b/src/Wippersnapper.h @@ -501,6 +501,11 @@ class Wippersnapper { wippersnapper_signal_v1_CreateSignalRequest _outgoingSignalMsg; /*!< Outgoing signal message from device */ }; -extern Wippersnapper WS; ///< Global member variable for callbacks + +// Include networking to get the platform-specific Wippersnapper_WiFi typedef +#include "Wippersnapper_Networking.h" + +// // Global WS instance - defined as platform-specific type in Wippersnapper.cpp +// extern Wippersnapper_WiFi WS; ///< Global member variable for callbacks #endif // ADAFRUIT_WIPPERSNAPPER_H diff --git a/src/components/analogIO/Wippersnapper_AnalogIO.h b/src/components/analogIO/Wippersnapper_AnalogIO.h index d6a028e47..7cc17759f 100644 --- a/src/components/analogIO/Wippersnapper_AnalogIO.h +++ b/src/components/analogIO/Wippersnapper_AnalogIO.h @@ -81,6 +81,5 @@ class Wippersnapper_AnalogIO { int32_t _totalAnalogInputPins; /*!< Total number of analog input pins */ analogInputPin *_analog_input_pins; /*!< Array of analog pin objects */ }; -extern Wippersnapper WS; /*!< Wippersnapper variable. */ #endif // WIPPERSNAPPER_DIGITALGPIO_H \ No newline at end of file diff --git a/src/components/digitalIO/Wippersnapper_DigitalGPIO.h b/src/components/digitalIO/Wippersnapper_DigitalGPIO.h index 960687ee5..716c8e583 100644 --- a/src/components/digitalIO/Wippersnapper_DigitalGPIO.h +++ b/src/components/digitalIO/Wippersnapper_DigitalGPIO.h @@ -57,6 +57,5 @@ class Wippersnapper_DigitalGPIO { int32_t _totalDigitalInputPins; /*!< Total number of digital-input capable pins */ }; -extern Wippersnapper WS; #endif // WIPPERSNAPPER_DIGITALGPIO_H \ No newline at end of file diff --git a/src/components/display/controller.h b/src/components/display/controller.h index 91be29323..e03132db7 100644 --- a/src/components/display/controller.h +++ b/src/components/display/controller.h @@ -43,5 +43,5 @@ class DisplayController { _hw_instances; ///< Holds pointers to DisplayHardware instances unsigned long _last_bar_update; ///< Timestamp of last status bar update }; -extern Wippersnapper WS; ///< Global WS instance + #endif \ No newline at end of file diff --git a/src/components/ds18x20/ws_ds18x20.h b/src/components/ds18x20/ws_ds18x20.h index 5398d4c4f..293fda017 100644 --- a/src/components/ds18x20/ws_ds18x20.h +++ b/src/components/ds18x20/ws_ds18x20.h @@ -60,6 +60,5 @@ class ws_ds18x20 { std::vector _ds18xDrivers; ///< Vec. of ptrs. to ds18x driver objects }; -extern Wippersnapper WS; #endif // WIPPERSNAPPER_DS18X20_H \ No newline at end of file diff --git a/src/components/i2c/WipperSnapper_I2C.h b/src/components/i2c/WipperSnapper_I2C.h index d36ef0766..712b6fc7d 100644 --- a/src/components/i2c/WipperSnapper_I2C.h +++ b/src/components/i2c/WipperSnapper_I2C.h @@ -232,6 +232,5 @@ class WipperSnapper_Component_I2C { WipperSnapper_I2C_Driver_Out_SH1107 *_sh1107 = nullptr; WipperSnapper_I2C_Driver_Out_Ssd1306 *_ssd1306 = nullptr; }; -extern Wippersnapper WS; #endif // WipperSnapper_Component_I2C_H diff --git a/src/components/ledc/ws_ledc.h b/src/components/ledc/ws_ledc.h index d206767a6..10e287947 100644 --- a/src/components/ledc/ws_ledc.h +++ b/src/components/ledc/ws_ledc.h @@ -55,6 +55,5 @@ class ws_ledc { bool analogWrite(uint8_t pin, int value); uint32_t tone(uint8_t pin, uint32_t freq); }; -extern Wippersnapper WS; #endif // ws_ledc_H \ No newline at end of file diff --git a/src/components/pixels/ws_pixels.h b/src/components/pixels/ws_pixels.h index 9fbe98618..7267e3cdb 100644 --- a/src/components/pixels/ws_pixels.h +++ b/src/components/pixels/ws_pixels.h @@ -68,5 +68,5 @@ class ws_pixels { void publishAddStrandResponse(bool is_success, char *pixels_pin_data); uint32_t getGammaCorrectedColor(uint32_t pixel_color, strand_s strand); }; -extern Wippersnapper WS; + #endif // WS_PIXELS \ No newline at end of file diff --git a/src/components/pwm/ws_pwm.h b/src/components/pwm/ws_pwm.h index 6a201b2ce..480b82e70 100644 --- a/src/components/pwm/ws_pwm.h +++ b/src/components/pwm/ws_pwm.h @@ -45,6 +45,5 @@ class ws_pwm { private: ws_ledc *_ledcMgr = nullptr; ///< pointer to ws_ledc }; -extern Wippersnapper WS; #endif // WS_PWM \ No newline at end of file diff --git a/src/components/register/Wippersnapper_Register.cpp b/src/components/register/Wippersnapper_Register.cpp index c38a4dbd2..04828c3d8 100644 --- a/src/components/register/Wippersnapper_Register.cpp +++ b/src/components/register/Wippersnapper_Register.cpp @@ -15,8 +15,6 @@ */ #include "Wippersnapper.h" -extern Wippersnapper WS; - /****************************************************************************/ /*! @brief Encodes hardware registration request message and publishes diff --git a/src/components/servo/ws_servo.h b/src/components/servo/ws_servo.h index f0c8062a1..e24e2908f 100644 --- a/src/components/servo/ws_servo.h +++ b/src/components/servo/ws_servo.h @@ -71,6 +71,5 @@ class ws_servo { servoComponent _servos[MAX_SERVO_NUM]; ///< Container of servo objects and ///< their associated pin #s }; -extern Wippersnapper WS; #endif // WS_SERVO \ No newline at end of file diff --git a/src/components/statusLED/Wippersnapper_StatusLED.cpp b/src/components/statusLED/Wippersnapper_StatusLED.cpp index ca4420d53..079915fc4 100644 --- a/src/components/statusLED/Wippersnapper_StatusLED.cpp +++ b/src/components/statusLED/Wippersnapper_StatusLED.cpp @@ -16,7 +16,6 @@ #include "Wippersnapper_StatusLED.h" #include "Wippersnapper.h" -extern Wippersnapper WS; #ifdef USE_STATUS_NEOPIXEL Adafruit_NeoPixel *statusPixel = new Adafruit_NeoPixel( STATUS_NEOPIXEL_NUM, STATUS_NEOPIXEL_PIN, NEO_GRB + NEO_KHZ800); diff --git a/src/network_interfaces/Wippersnapper_AIRLIFT.h b/src/network_interfaces/Wippersnapper_AIRLIFT.h index 63b767db6..e8b8ff333 100644 --- a/src/network_interfaces/Wippersnapper_AIRLIFT.h +++ b/src/network_interfaces/Wippersnapper_AIRLIFT.h @@ -42,7 +42,6 @@ #define SPIWIFI SPI /*!< Instance of SPI interface used by an AirLift. */ #endif -extern Wippersnapper WS; /****************************************************************************/ /*! @brief Class for using the AirLift Co-Processor network iface. diff --git a/src/network_interfaces/Wippersnapper_ESP32.h b/src/network_interfaces/Wippersnapper_ESP32.h index ad6557ad7..04a898190 100644 --- a/src/network_interfaces/Wippersnapper_ESP32.h +++ b/src/network_interfaces/Wippersnapper_ESP32.h @@ -27,7 +27,9 @@ #include "WiFiMulti.h" #include #include -extern Wippersnapper WS; + +class Wippersnapper_ESP32; +extern Wippersnapper_ESP32 WS; /****************************************************************************/ /*! @@ -367,5 +369,6 @@ class Wippersnapper_ESP32 : public Wippersnapper { } }; + #endif // ARDUINO_ARCH_ESP32_H #endif // Wippersnapper_ESP32_H \ No newline at end of file diff --git a/src/network_interfaces/Wippersnapper_ESP8266.h b/src/network_interfaces/Wippersnapper_ESP8266.h index 7f0f6164d..ce67b10a9 100644 --- a/src/network_interfaces/Wippersnapper_ESP8266.h +++ b/src/network_interfaces/Wippersnapper_ESP8266.h @@ -39,8 +39,6 @@ // static const char *fingerprint PROGMEM = "47 D2 CB 14 DF 38 97 59 C6 65 1A // 1F 3E 00 1E 53 CC A5 17 E0"; -extern Wippersnapper WS; - /******************************************************************************/ /*! @brief Class for interacting with the Espressif ESP8266's network diff --git a/src/network_interfaces/ws_networking_pico.h b/src/network_interfaces/ws_networking_pico.h index e6ebf7348..282b741ef 100644 --- a/src/network_interfaces/ws_networking_pico.h +++ b/src/network_interfaces/ws_networking_pico.h @@ -29,7 +29,6 @@ #include "Arduino.h" #include #include -extern Wippersnapper WS; /****************************************************************************/ /*! diff --git a/src/provisioning/littlefs/WipperSnapper_LittleFS.h b/src/provisioning/littlefs/WipperSnapper_LittleFS.h index 782e8569b..9559de612 100644 --- a/src/provisioning/littlefs/WipperSnapper_LittleFS.h +++ b/src/provisioning/littlefs/WipperSnapper_LittleFS.h @@ -36,5 +36,4 @@ class WipperSnapper_LittleFS { void fsHalt(String msg); }; -extern Wippersnapper WS; #endif // WIPPERSNAPPER_LITTLEFS_H \ No newline at end of file diff --git a/src/provisioning/tinyusb/Wippersnapper_FS.h b/src/provisioning/tinyusb/Wippersnapper_FS.h index 7068cd691..3686029b2 100644 --- a/src/provisioning/tinyusb/Wippersnapper_FS.h +++ b/src/provisioning/tinyusb/Wippersnapper_FS.h @@ -61,5 +61,4 @@ class Wippersnapper_FS { WipperSnapper, False otherwise. */ }; -extern Wippersnapper WS; #endif // WIPPERSNAPPER_FS_H \ No newline at end of file From 89cf09e94cc05624a7cf4b151bf84d8c5a245d9b Mon Sep 17 00:00:00 2001 From: tyeth Date: Wed, 17 Dec 2025 19:01:23 +0000 Subject: [PATCH 08/13] Add publish retry - Squashed commit of #697 --- src/Wippersnapper.cpp | 36 ++++++++++++++++++------ src/Wippersnapper.h | 2 +- src/components/ds18x20/ws_ds18x20.cpp | 5 ++-- src/components/i2c/WipperSnapper_I2C.cpp | 2 +- src/components/pixels/ws_pixels.cpp | 2 +- 5 files changed, 33 insertions(+), 14 deletions(-) diff --git a/src/Wippersnapper.cpp b/src/Wippersnapper.cpp index 6f94ab0a9..d0e9122d5 100644 --- a/src/Wippersnapper.cpp +++ b/src/Wippersnapper.cpp @@ -524,7 +524,7 @@ void publishI2CResponse(wippersnapper_signal_v1_I2CResponse *msgi2cResponse) { pb_get_encoded_size(&msgSz, wippersnapper_signal_v1_I2CResponse_fields, msgi2cResponse); WS_DEBUG_PRINTLN("Publishing Message: I2CResponse..."); - if (!WS._mqtt->publish(WS._topic_signal_i2c_device, WS._buffer_outgoing, + if (!WS.publish(WS._topic_signal_i2c_device, WS._buffer_outgoing, msgSz, 0)) { WS_DEBUG_PRINTLN("\tERROR: Failed to publish I2C Response!"); } else { @@ -968,7 +968,7 @@ bool cbDecodeServoMsg(pb_istream_t *stream, const pb_field_t *field, pb_get_encoded_size(&msgSz, wippersnapper_signal_v1_ServoResponse_fields, &msgServoResp); WS_DEBUG_PRINT("-> Servo Attach Response..."); - WS._mqtt->publish(WS._topic_signal_servo_device, WS._buffer_outgoing, msgSz, + WS.publish(WS._topic_signal_servo_device, WS._buffer_outgoing, msgSz, 1); WS_DEBUG_PRINTLN("Published!"); } else if (field->tag == @@ -1109,7 +1109,7 @@ bool cbPWMDecodeMsg(pb_istream_t *stream, const pb_field_t *field, void **arg) { pb_get_encoded_size(&msgSz, wippersnapper_signal_v1_PWMResponse_fields, &msgPWMResponse); WS_DEBUG_PRINT("PUBLISHING: PWM Attach Response..."); - if (!WS._mqtt->publish(WS._topic_signal_pwm_device, WS._buffer_outgoing, + if (!WS.publish(WS._topic_signal_pwm_device, WS._buffer_outgoing, msgSz, 1)) { WS_DEBUG_PRINTLN("ERROR: Failed to publish PWM Attach Response!"); return false; @@ -1471,7 +1471,7 @@ bool cbDecodeUARTMessage(pb_istream_t *stream, const pb_field_t *field, pb_get_encoded_size(&msgSz, wippersnapper_signal_v1_UARTResponse_fields, &msgUARTResponse); WS_DEBUG_PRINT("PUBLISHING: UART Attach Response..."); - if (!WS._mqtt->publish(WS._topic_signal_uart_device, WS._buffer_outgoing, + if (!WS.publish(WS._topic_signal_uart_device, WS._buffer_outgoing, msgSz, 1)) { WS_DEBUG_PRINTLN("ERROR: Failed to publish UART Attach Response!"); return false; @@ -1583,7 +1583,7 @@ bool cbDecodeDisplayMsg(pb_istream_t *stream, const pb_field_t *field, pb_get_encoded_size(&msgSz, wippersnapper_signal_v1_DisplayResponse_fields, &msgResp); WS_DEBUG_PRINTLN("Publishing DisplayResponse Message..."); - if (!WS._mqtt->publish(WS._topic_signal_display_device, WS._buffer_outgoing, + if (!WS.publish(WS._topic_signal_display_device, WS._buffer_outgoing, msgSz, 0)) { WS_DEBUG_PRINTLN("ERROR: Failed to Publish DisplayResponse!"); } else { @@ -2421,7 +2421,7 @@ void Wippersnapper::runNetFSM() { while (fsmNetwork != FSM_NET_CONNECTED) { switch (fsmNetwork) { case FSM_NET_CHECK_MQTT: - if (WS._mqtt->connected()) { + if (WS._mqtt->connected() && networkStatus() == WS_NET_CONNECTED) { // WS_DEBUG_PRINTLN("Connected to Adafruit IO!"); fsmNetwork = FSM_NET_CONNECTED; return; @@ -2676,14 +2676,34 @@ void Wippersnapper::processPackets() { The Quality of Service to publish with. */ /*******************************************************/ -void Wippersnapper::publish(const char *topic, uint8_t *payload, uint16_t bLen, +bool Wippersnapper::publish(const char *topic, uint8_t *payload, uint16_t bLen, uint8_t qos) { // runNetFSM(); // NOTE: Removed for now, causes error with virtual _connect // method when caused with WS object in another file. WS.feedWDT(); if (!WS._mqtt->publish(topic, payload, bLen, qos)) { - WS_DEBUG_PRINTLN("Failed to publish MQTT message!"); + WS_DEBUG_PRINTLN("FAILED!"); + WS_DEBUG_PRINT("Mqtt connected: "); + WS_DEBUG_PRINTLN(WS._mqtt->connected()); + WS_DEBUG_PRINT("Network status: "); + WS_DEBUG_PRINTLN(networkStatus()); + if (WS._mqtt->connected() && (networkStatus() == WS_NET_CONNECTED)) { + WS_DEBUG_PRINTLN("Failed to publish MQTT message, retrying!"); + } else { + WS_DEBUG_PRINTLN("MQTT connection broken! Running network FSM then publish..."); + WS._mqtt->disconnect(); + WS_DEBUG_PRINTLN("MQTT forcibly disconnected. Running Network FSM..."); + runNetFSM(); + } + WS.feedWDT(); + WS_DEBUG_PRINTLN("Retrying publish..."); + if (!WS._mqtt->publish(topic, payload, bLen, qos)) { + WS_DEBUG_PRINTLN("Failed to publish MQTT message!"); + return false; + } + WS_DEBUG_PRINTLN("MQTT message published successfully!"); } + return true; } /**************************************************************/ diff --git a/src/Wippersnapper.h b/src/Wippersnapper.h index 0f85f9516..4091719d8 100644 --- a/src/Wippersnapper.h +++ b/src/Wippersnapper.h @@ -293,7 +293,7 @@ class Wippersnapper { // run() loop ws_status_t run(); void processPackets(); - void publish(const char *topic, uint8_t *payload, uint16_t bLen, + bool publish(const char *topic, uint8_t *payload, uint16_t bLen, uint8_t qos = 0); // Networking helpers diff --git a/src/components/ds18x20/ws_ds18x20.cpp b/src/components/ds18x20/ws_ds18x20.cpp index 6aac8fee5..f7b184e46 100644 --- a/src/components/ds18x20/ws_ds18x20.cpp +++ b/src/components/ds18x20/ws_ds18x20.cpp @@ -109,8 +109,7 @@ bool ws_ds18x20::addDS18x20( pb_get_encoded_size(&msgSz, wippersnapper_signal_v1_Ds18x20Response_fields, &msgInitResp); WS_DEBUG_PRINT("-> DS18x Init Response..."); - WS._mqtt->publish(WS._topic_signal_ds18_device, WS._buffer_outgoing, msgSz, - 1); + WS.publish(WS._topic_signal_ds18_device, WS._buffer_outgoing, msgSz, 1); WS_DEBUG_PRINTLN("Published!"); return is_success; @@ -275,7 +274,7 @@ void ws_ds18x20::update() { wippersnapper_signal_v1_Ds18x20Response_fields, &msgDS18x20Response); WS_DEBUG_PRINT("PUBLISHING -> msgDS18x20Response Event Message..."); - if (!WS._mqtt->publish(WS._topic_signal_ds18_device, + if (!WS.publish(WS._topic_signal_ds18_device, WS._buffer_outgoing, msgSz, 1)) { WS_DEBUG_PRINTLN("ERROR: Unable to publish DS18x20 event message - " "MQTT Publish failed!"); diff --git a/src/components/i2c/WipperSnapper_I2C.cpp b/src/components/i2c/WipperSnapper_I2C.cpp index f20391d06..a5ec7b3b1 100644 --- a/src/components/i2c/WipperSnapper_I2C.cpp +++ b/src/components/i2c/WipperSnapper_I2C.cpp @@ -1179,7 +1179,7 @@ bool WipperSnapper_Component_I2C::encodePublishI2CDeviceEventMsg( pb_get_encoded_size(&msgSz, wippersnapper_signal_v1_I2CResponse_fields, msgi2cResponse); WS_DEBUG_PRINT("PUBLISHING -> I2C Device Sensor Event Message..."); - if (!WS._mqtt->publish(WS._topic_signal_i2c_device, WS._buffer_outgoing, + if (!WS.publish(WS._topic_signal_i2c_device, WS._buffer_outgoing, msgSz, 1)) { WS_DEBUG_PRINTLN("ERROR: MQTT Publish failed!"); return false; diff --git a/src/components/pixels/ws_pixels.cpp b/src/components/pixels/ws_pixels.cpp index 22edefd46..055d3615c 100644 --- a/src/components/pixels/ws_pixels.cpp +++ b/src/components/pixels/ws_pixels.cpp @@ -189,7 +189,7 @@ void ws_pixels::publishAddStrandResponse(bool is_success, pb_get_encoded_size(&msgSz, wippersnapper_signal_v1_PixelsResponse_fields, &msgInitResp); WS_DEBUG_PRINT("-> wippersnapper_signal_v1_PixelsResponse..."); - WS._mqtt->publish(WS._topic_signal_pixels_device, WS._buffer_outgoing, msgSz, + WS.publish(WS._topic_signal_pixels_device, WS._buffer_outgoing, msgSz, 1); WS_DEBUG_PRINTLN("Published!"); } From 1c09d2b71124092cbafb8033f0a4bdda4da44775 Mon Sep 17 00:00:00 2001 From: tyeth Date: Wed, 17 Dec 2025 19:06:20 +0000 Subject: [PATCH 09/13] refactor network interfaces for extern Wippersnapper_WiFi WS --- src/Wippersnapper.h | 3 +-- src/network_interfaces/Wippersnapper_AIRLIFT.h | 2 ++ src/network_interfaces/Wippersnapper_ESP8266.h | 3 +++ src/network_interfaces/ws_networking_pico.h | 2 ++ 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Wippersnapper.h b/src/Wippersnapper.h index 4091719d8..1f2525a14 100644 --- a/src/Wippersnapper.h +++ b/src/Wippersnapper.h @@ -505,7 +505,6 @@ class Wippersnapper { // Include networking to get the platform-specific Wippersnapper_WiFi typedef #include "Wippersnapper_Networking.h" -// // Global WS instance - defined as platform-specific type in Wippersnapper.cpp -// extern Wippersnapper_WiFi WS; ///< Global member variable for callbacks +// Global WS instance - defined as platform-specific type in Wippersnapper.cpp #endif // ADAFRUIT_WIPPERSNAPPER_H diff --git a/src/network_interfaces/Wippersnapper_AIRLIFT.h b/src/network_interfaces/Wippersnapper_AIRLIFT.h index e8b8ff333..5565f8f63 100644 --- a/src/network_interfaces/Wippersnapper_AIRLIFT.h +++ b/src/network_interfaces/Wippersnapper_AIRLIFT.h @@ -42,6 +42,8 @@ #define SPIWIFI SPI /*!< Instance of SPI interface used by an AirLift. */ #endif +class Wippersnapper_AIRLIFT; +extern Wippersnapper_AIRLIFT WS; /****************************************************************************/ /*! @brief Class for using the AirLift Co-Processor network iface. diff --git a/src/network_interfaces/Wippersnapper_ESP8266.h b/src/network_interfaces/Wippersnapper_ESP8266.h index ce67b10a9..680190592 100644 --- a/src/network_interfaces/Wippersnapper_ESP8266.h +++ b/src/network_interfaces/Wippersnapper_ESP8266.h @@ -24,6 +24,9 @@ #include "ESP8266WiFiMulti.h" #include "Wippersnapper.h" +class Wippersnapper_ESP8266; +extern Wippersnapper_ESP8266 WS; + /* NOTE - Projects that require "Secure MQTT" (TLS/SSL) also require a new * SSL certificate every year. If adding Secure MQTT to your ESP8266 project is * important - please switch to using the modern ESP32 (and related models) diff --git a/src/network_interfaces/ws_networking_pico.h b/src/network_interfaces/ws_networking_pico.h index 282b741ef..6cc9efd19 100644 --- a/src/network_interfaces/ws_networking_pico.h +++ b/src/network_interfaces/ws_networking_pico.h @@ -30,6 +30,8 @@ #include #include +class ws_networking_pico; +extern ws_networking_pico WS; /****************************************************************************/ /*! @brief Class for using the Raspberry Pi Pico network interface. From 699b5a72f8cb1f8ec986e115780ec200bdb1aaaa Mon Sep 17 00:00:00 2001 From: tyeth Date: Wed, 17 Dec 2025 19:09:56 +0000 Subject: [PATCH 10/13] Remove redundant setRotation comment --- src/components/display/hardware.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/display/hardware.cpp b/src/components/display/hardware.cpp index 5c6ac9b9f..96ebedc55 100644 --- a/src/components/display/hardware.cpp +++ b/src/components/display/hardware.cpp @@ -260,7 +260,6 @@ bool DisplayHardware::beginEPD( _drvDisp->setWidth(config->width); _drvDisp->setHeight(config->height); // EPD config doesn't support rotation - // _drvDisp->setRotation(config->rotation); _drvDisp->setTextSize(config->text_size); if (!_drvDisp->begin(epd_mode)) { From a3efc3889c0dd9459aff416dfb8adb039040c7c6 Mon Sep 17 00:00:00 2001 From: tyeth Date: Wed, 17 Dec 2025 19:17:52 +0000 Subject: [PATCH 11/13] Remove unnecessary include --- src/Wippersnapper.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Wippersnapper.cpp b/src/Wippersnapper.cpp index d0e9122d5..fbd884455 100644 --- a/src/Wippersnapper.cpp +++ b/src/Wippersnapper.cpp @@ -32,7 +32,6 @@ */ #include "Wippersnapper.h" -#include "Wippersnapper_Networking.h" // Define the global WS instance as the platform-specific derived class // This ensures virtual methods like _connect() route to the correct implementation From 962814d15d77b4cfca67c1036e79f0b73c0522aa Mon Sep 17 00:00:00 2001 From: tyeth Date: Thu, 18 Dec 2025 14:14:17 +0000 Subject: [PATCH 12/13] Tidy with clang-format v18.1.3 --- src/Wippersnapper.cpp | 24 ++++++++++---------- src/components/ds18x20/ws_ds18x20.cpp | 4 ++-- src/components/i2c/WipperSnapper_I2C.cpp | 3 +-- src/components/pixels/ws_pixels.cpp | 3 +-- src/network_interfaces/Wippersnapper_ESP32.h | 1 - 5 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/Wippersnapper.cpp b/src/Wippersnapper.cpp index fbd884455..a479bfbd6 100644 --- a/src/Wippersnapper.cpp +++ b/src/Wippersnapper.cpp @@ -34,7 +34,8 @@ #include "Wippersnapper.h" // Define the global WS instance as the platform-specific derived class -// This ensures virtual methods like _connect() route to the correct implementation +// This ensures virtual methods like _connect() route to the correct +// implementation Wippersnapper_WiFi WS; Wippersnapper::Wippersnapper() { @@ -523,8 +524,7 @@ void publishI2CResponse(wippersnapper_signal_v1_I2CResponse *msgi2cResponse) { pb_get_encoded_size(&msgSz, wippersnapper_signal_v1_I2CResponse_fields, msgi2cResponse); WS_DEBUG_PRINTLN("Publishing Message: I2CResponse..."); - if (!WS.publish(WS._topic_signal_i2c_device, WS._buffer_outgoing, - msgSz, 0)) { + if (!WS.publish(WS._topic_signal_i2c_device, WS._buffer_outgoing, msgSz, 0)) { WS_DEBUG_PRINTLN("\tERROR: Failed to publish I2C Response!"); } else { WS_DEBUG_PRINTLN("Published!"); @@ -967,8 +967,7 @@ bool cbDecodeServoMsg(pb_istream_t *stream, const pb_field_t *field, pb_get_encoded_size(&msgSz, wippersnapper_signal_v1_ServoResponse_fields, &msgServoResp); WS_DEBUG_PRINT("-> Servo Attach Response..."); - WS.publish(WS._topic_signal_servo_device, WS._buffer_outgoing, msgSz, - 1); + WS.publish(WS._topic_signal_servo_device, WS._buffer_outgoing, msgSz, 1); WS_DEBUG_PRINTLN("Published!"); } else if (field->tag == wippersnapper_signal_v1_ServoRequest_servo_write_tag) { @@ -1108,8 +1107,8 @@ bool cbPWMDecodeMsg(pb_istream_t *stream, const pb_field_t *field, void **arg) { pb_get_encoded_size(&msgSz, wippersnapper_signal_v1_PWMResponse_fields, &msgPWMResponse); WS_DEBUG_PRINT("PUBLISHING: PWM Attach Response..."); - if (!WS.publish(WS._topic_signal_pwm_device, WS._buffer_outgoing, - msgSz, 1)) { + if (!WS.publish(WS._topic_signal_pwm_device, WS._buffer_outgoing, msgSz, + 1)) { WS_DEBUG_PRINTLN("ERROR: Failed to publish PWM Attach Response!"); return false; } @@ -1470,8 +1469,8 @@ bool cbDecodeUARTMessage(pb_istream_t *stream, const pb_field_t *field, pb_get_encoded_size(&msgSz, wippersnapper_signal_v1_UARTResponse_fields, &msgUARTResponse); WS_DEBUG_PRINT("PUBLISHING: UART Attach Response..."); - if (!WS.publish(WS._topic_signal_uart_device, WS._buffer_outgoing, - msgSz, 1)) { + if (!WS.publish(WS._topic_signal_uart_device, WS._buffer_outgoing, msgSz, + 1)) { WS_DEBUG_PRINTLN("ERROR: Failed to publish UART Attach Response!"); return false; } @@ -1582,8 +1581,8 @@ bool cbDecodeDisplayMsg(pb_istream_t *stream, const pb_field_t *field, pb_get_encoded_size(&msgSz, wippersnapper_signal_v1_DisplayResponse_fields, &msgResp); WS_DEBUG_PRINTLN("Publishing DisplayResponse Message..."); - if (!WS.publish(WS._topic_signal_display_device, WS._buffer_outgoing, - msgSz, 0)) { + if (!WS.publish(WS._topic_signal_display_device, WS._buffer_outgoing, msgSz, + 0)) { WS_DEBUG_PRINTLN("ERROR: Failed to Publish DisplayResponse!"); } else { WS_DEBUG_PRINTLN("Published!"); @@ -2689,7 +2688,8 @@ bool Wippersnapper::publish(const char *topic, uint8_t *payload, uint16_t bLen, if (WS._mqtt->connected() && (networkStatus() == WS_NET_CONNECTED)) { WS_DEBUG_PRINTLN("Failed to publish MQTT message, retrying!"); } else { - WS_DEBUG_PRINTLN("MQTT connection broken! Running network FSM then publish..."); + WS_DEBUG_PRINTLN( + "MQTT connection broken! Running network FSM then publish..."); WS._mqtt->disconnect(); WS_DEBUG_PRINTLN("MQTT forcibly disconnected. Running Network FSM..."); runNetFSM(); diff --git a/src/components/ds18x20/ws_ds18x20.cpp b/src/components/ds18x20/ws_ds18x20.cpp index f7b184e46..193d9de3b 100644 --- a/src/components/ds18x20/ws_ds18x20.cpp +++ b/src/components/ds18x20/ws_ds18x20.cpp @@ -274,8 +274,8 @@ void ws_ds18x20::update() { wippersnapper_signal_v1_Ds18x20Response_fields, &msgDS18x20Response); WS_DEBUG_PRINT("PUBLISHING -> msgDS18x20Response Event Message..."); - if (!WS.publish(WS._topic_signal_ds18_device, - WS._buffer_outgoing, msgSz, 1)) { + if (!WS.publish(WS._topic_signal_ds18_device, WS._buffer_outgoing, + msgSz, 1)) { WS_DEBUG_PRINTLN("ERROR: Unable to publish DS18x20 event message - " "MQTT Publish failed!"); return; diff --git a/src/components/i2c/WipperSnapper_I2C.cpp b/src/components/i2c/WipperSnapper_I2C.cpp index a5ec7b3b1..f2b6503ed 100644 --- a/src/components/i2c/WipperSnapper_I2C.cpp +++ b/src/components/i2c/WipperSnapper_I2C.cpp @@ -1179,8 +1179,7 @@ bool WipperSnapper_Component_I2C::encodePublishI2CDeviceEventMsg( pb_get_encoded_size(&msgSz, wippersnapper_signal_v1_I2CResponse_fields, msgi2cResponse); WS_DEBUG_PRINT("PUBLISHING -> I2C Device Sensor Event Message..."); - if (!WS.publish(WS._topic_signal_i2c_device, WS._buffer_outgoing, - msgSz, 1)) { + if (!WS.publish(WS._topic_signal_i2c_device, WS._buffer_outgoing, msgSz, 1)) { WS_DEBUG_PRINTLN("ERROR: MQTT Publish failed!"); return false; }; diff --git a/src/components/pixels/ws_pixels.cpp b/src/components/pixels/ws_pixels.cpp index 055d3615c..20cf578a1 100644 --- a/src/components/pixels/ws_pixels.cpp +++ b/src/components/pixels/ws_pixels.cpp @@ -189,8 +189,7 @@ void ws_pixels::publishAddStrandResponse(bool is_success, pb_get_encoded_size(&msgSz, wippersnapper_signal_v1_PixelsResponse_fields, &msgInitResp); WS_DEBUG_PRINT("-> wippersnapper_signal_v1_PixelsResponse..."); - WS.publish(WS._topic_signal_pixels_device, WS._buffer_outgoing, msgSz, - 1); + WS.publish(WS._topic_signal_pixels_device, WS._buffer_outgoing, msgSz, 1); WS_DEBUG_PRINTLN("Published!"); } diff --git a/src/network_interfaces/Wippersnapper_ESP32.h b/src/network_interfaces/Wippersnapper_ESP32.h index 04a898190..101fd0f3d 100644 --- a/src/network_interfaces/Wippersnapper_ESP32.h +++ b/src/network_interfaces/Wippersnapper_ESP32.h @@ -369,6 +369,5 @@ class Wippersnapper_ESP32 : public Wippersnapper { } }; - #endif // ARDUINO_ARCH_ESP32_H #endif // Wippersnapper_ESP32_H \ No newline at end of file From f6bb8389b9d04a064aea8d23a771a10d535e7237 Mon Sep 17 00:00:00 2001 From: tyeth Date: Thu, 18 Dec 2025 14:41:03 +0000 Subject: [PATCH 13/13] Doxygen --- src/Wippersnapper.cpp | 8 ++++---- src/network_interfaces/Wippersnapper_AIRLIFT.h | 2 +- src/network_interfaces/Wippersnapper_ESP32.h | 2 +- src/network_interfaces/Wippersnapper_ESP8266.h | 2 +- src/network_interfaces/ws_networking_pico.h | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Wippersnapper.cpp b/src/Wippersnapper.cpp index a479bfbd6..af5ba658f 100644 --- a/src/Wippersnapper.cpp +++ b/src/Wippersnapper.cpp @@ -33,10 +33,9 @@ #include "Wippersnapper.h" -// Define the global WS instance as the platform-specific derived class -// This ensures virtual methods like _connect() route to the correct -// implementation -Wippersnapper_WiFi WS; +// Define the global WS instance as the platform-specific derived class, +// ensuring virtual methods [_connect()] route to the correct implementation +Wippersnapper_WiFi WS; //!< Global instance of Wippersnapper_WiFi Wippersnapper::Wippersnapper() { _mqtt = 0; // MQTT Client object @@ -2672,6 +2671,7 @@ void Wippersnapper::processPackets() { The length of the payload. @param qos The Quality of Service to publish with. + @return True if publish was successful, False otherwise. */ /*******************************************************/ bool Wippersnapper::publish(const char *topic, uint8_t *payload, uint16_t bLen, diff --git a/src/network_interfaces/Wippersnapper_AIRLIFT.h b/src/network_interfaces/Wippersnapper_AIRLIFT.h index 5565f8f63..4b943bbd1 100644 --- a/src/network_interfaces/Wippersnapper_AIRLIFT.h +++ b/src/network_interfaces/Wippersnapper_AIRLIFT.h @@ -43,7 +43,7 @@ #endif class Wippersnapper_AIRLIFT; -extern Wippersnapper_AIRLIFT WS; +extern Wippersnapper_AIRLIFT WS; //!< Global instance of Wippersnapper_WiFi /****************************************************************************/ /*! @brief Class for using the AirLift Co-Processor network iface. diff --git a/src/network_interfaces/Wippersnapper_ESP32.h b/src/network_interfaces/Wippersnapper_ESP32.h index 101fd0f3d..54364afdb 100644 --- a/src/network_interfaces/Wippersnapper_ESP32.h +++ b/src/network_interfaces/Wippersnapper_ESP32.h @@ -29,7 +29,7 @@ #include class Wippersnapper_ESP32; -extern Wippersnapper_ESP32 WS; +extern Wippersnapper_ESP32 WS; //!< Global instance of Wippersnapper_WiFi /****************************************************************************/ /*! diff --git a/src/network_interfaces/Wippersnapper_ESP8266.h b/src/network_interfaces/Wippersnapper_ESP8266.h index 680190592..c614527bd 100644 --- a/src/network_interfaces/Wippersnapper_ESP8266.h +++ b/src/network_interfaces/Wippersnapper_ESP8266.h @@ -25,7 +25,7 @@ #include "Wippersnapper.h" class Wippersnapper_ESP8266; -extern Wippersnapper_ESP8266 WS; +extern Wippersnapper_ESP8266 WS; //!< Global instance of Wippersnapper_WiFi /* NOTE - Projects that require "Secure MQTT" (TLS/SSL) also require a new * SSL certificate every year. If adding Secure MQTT to your ESP8266 project is diff --git a/src/network_interfaces/ws_networking_pico.h b/src/network_interfaces/ws_networking_pico.h index 6cc9efd19..0ef993bdf 100644 --- a/src/network_interfaces/ws_networking_pico.h +++ b/src/network_interfaces/ws_networking_pico.h @@ -31,7 +31,7 @@ #include class ws_networking_pico; -extern ws_networking_pico WS; +extern ws_networking_pico WS; //!< Global instance of Wippersnapper_WiFi /****************************************************************************/ /*! @brief Class for using the Raspberry Pi Pico network interface.