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..af5ba658f 100644 --- a/src/Wippersnapper.cpp +++ b/src/Wippersnapper.cpp @@ -33,7 +33,9 @@ #include "Wippersnapper.h" -Wippersnapper 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 @@ -521,8 +523,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, - 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!"); @@ -965,8 +966,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, - 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) { @@ -1106,8 +1106,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._mqtt->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; } @@ -1468,8 +1468,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._mqtt->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; } @@ -1580,8 +1580,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._mqtt->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!"); @@ -2418,7 +2418,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; @@ -2671,16 +2671,38 @@ 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. */ /*******************************************************/ -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 56f37ed2b..1f2525a14 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 @@ -501,6 +501,10 @@ 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 #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.cpp b/src/components/display/controller.cpp index 7c8c1f7d2..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 @@ -84,14 +85,17 @@ bool DisplayController::Handle_Display_AddOrReplace( } 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; } 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/display/drivers/dispDrvThinkInkMonoBAAMFGN.h b/src/components/display/drivers/dispDrvThinkInkMonoBAAMFGN.h new file mode 100644 index 000000000..998eabc78 --- /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..96ebedc55 100644 --- a/src/components/display/hardware.cpp +++ b/src/components/display/hardware.cpp @@ -31,6 +31,11 @@ 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 * { @@ -252,6 +257,9 @@ bool DisplayHardware::beginEPD( return false; } + _drvDisp->setWidth(config->width); + _drvDisp->setHeight(config->height); + // EPD config doesn't support rotation _drvDisp->setTextSize(config->text_size); if (!_drvDisp->begin(epd_mode)) { 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/components/ds18x20/ws_ds18x20.cpp b/src/components/ds18x20/ws_ds18x20.cpp index 6aac8fee5..193d9de3b 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,8 +274,8 @@ 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, - 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/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.cpp b/src/components/i2c/WipperSnapper_I2C.cpp index f20391d06..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._mqtt->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/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.cpp b/src/components/pixels/ws_pixels.cpp index 22edefd46..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._mqtt->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/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..4b943bbd1 100644 --- a/src/network_interfaces/Wippersnapper_AIRLIFT.h +++ b/src/network_interfaces/Wippersnapper_AIRLIFT.h @@ -42,7 +42,8 @@ #define SPIWIFI SPI /*!< Instance of SPI interface used by an AirLift. */ #endif -extern Wippersnapper WS; +class Wippersnapper_AIRLIFT; +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 ad6557ad7..54364afdb 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; //!< Global instance of Wippersnapper_WiFi /****************************************************************************/ /*! diff --git a/src/network_interfaces/Wippersnapper_ESP8266.h b/src/network_interfaces/Wippersnapper_ESP8266.h index 7f0f6164d..c614527bd 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; //!< 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 * important - please switch to using the modern ESP32 (and related models) @@ -39,8 +42,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..0ef993bdf 100644 --- a/src/network_interfaces/ws_networking_pico.h +++ b/src/network_interfaces/ws_networking_pico.h @@ -29,8 +29,9 @@ #include "Arduino.h" #include #include -extern Wippersnapper WS; +class ws_networking_pico; +extern ws_networking_pico WS; //!< Global instance of Wippersnapper_WiFi /****************************************************************************/ /*! @brief Class for using the Raspberry Pi Pico network interface. 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 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 33b91cb7d..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 @@ -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 */ @@ -110,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