From b784f3ffe3db22cee001642392b183afa5ca72d7 Mon Sep 17 00:00:00 2001 From: brentru Date: Thu, 14 Aug 2025 14:14:47 -0400 Subject: [PATCH 01/23] Initial Commit - Hooks for MQTT topics and decoders --- library.properties | 4 +- platformio.ini | 7 +-- src/Wippersnapper.cpp | 86 ++++++++++++++++++++++++++++++++++ src/Wippersnapper.h | 5 ++ src/Wippersnapper_demo.ino.cpp | 26 ++++++++++ 5 files changed, 123 insertions(+), 5 deletions(-) create mode 100644 src/Wippersnapper_demo.ino.cpp diff --git a/library.properties b/library.properties index 9ef6dc4a2..e0e33a29c 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=Adafruit WipperSnapper -version=1.0.0-beta.110 +version=1.0.0-beta.111 author=Adafruit maintainer=Adafruit sentence=Arduino application for Adafruit.io WipperSnapper @@ -7,4 +7,4 @@ paragraph=Arduino application for Adafruit.io WipperSnapper category=Communication url=https://github.com/adafruit/Adafruit_Wippersnapper_Arduino architectures=* -depends=OmronD6T - Community Fork, SdFat - Adafruit Fork, Adafruit NeoPixel, Adafruit SPIFlash, ArduinoJson, Adafruit DotStar, Adafruit HDC302x, Adafruit INA219, Adafruit INA260 Library, Adafruit INA237 and INA238 Library, Adafruit LTR329 and LTR303, Adafruit LTR390 Library, Adafruit MCP3421, Adafruit NAU7802 Library, Adafruit SleepyDog Library, Adafruit TMP117, Adafruit TinyUSB Library, Adafruit AHTX0, Adafruit BME280 Library, Adafruit BMP280 Library, Adafruit BMP3XX Library, Adafruit DPS310, Adafruit DS248x, Adafruit SCD30, Adafruit SGP30 Sensor, Adafruit SGP40 Sensor, Sensirion I2C SCD4x, Sensirion I2C SEN5X, Sensirion I2C SEN66, arduino-sht, Adafruit Si7021 Library, Adafruit MQTT Library, Adafruit MS8607, Adafruit MCP9808 Library, Adafruit MCP9600 Library, Adafruit MPL115A2, Adafruit MPRLS Library, Adafruit TSL2591 Library, Adafruit_VL53L0X, Adafruit VL53L1X, STM32duino VL53L4CD, STM32duino VL53L4CX, Adafruit_VL6180X, Adafruit PM25 AQI Sensor, Adafruit VCNL4020 Library, Adafruit VCNL4040, Adafruit VCNL4200 Library, Adafruit VEML7700 Library, Adafruit LC709203F, Adafruit LPS2X, Adafruit LPS28, Adafruit LPS35HW, Adafruit seesaw Library, Adafruit BME680 Library, Adafruit MAX1704X, Adafruit ADT7410 Library, Adafruit HTS221, Adafruit HTU21DF Library, Adafruit HTU31D Library, Adafruit PCT2075, hp_BH1750, ENS160 - Adafruit Fork, Adafruit BusIO, Adafruit Unified Sensor, Sensirion Core, Adafruit GFX Library, Adafruit LED Backpack Library, Adafruit LiquidCrystal, Adafruit SH110X, Adafruit SSD1306 +depends=OmronD6T - Community Fork, SdFat - Adafruit Fork, Adafruit NeoPixel, Adafruit SPIFlash, ArduinoJson, Adafruit DotStar, Adafruit HDC302x, Adafruit INA219, Adafruit INA260 Library, Adafruit INA237 and INA238 Library, Adafruit LTR329 and LTR303, Adafruit LTR390 Library, Adafruit MCP3421, Adafruit NAU7802 Library, Adafruit SleepyDog Library, Adafruit TMP117, Adafruit TinyUSB Library, Adafruit AHTX0, Adafruit BME280 Library, Adafruit BMP280 Library, Adafruit BMP3XX Library, Adafruit DPS310, Adafruit DS248x, Adafruit SCD30, Adafruit SGP30 Sensor, Adafruit SGP40 Sensor, Sensirion I2C SCD4x, Sensirion I2C SEN5X, Sensirion I2C SEN66, arduino-sht, Adafruit Si7021 Library, Adafruit MQTT Library, Adafruit MS8607, Adafruit MCP9808 Library, Adafruit MCP9600 Library, Adafruit MPL115A2, Adafruit MPRLS Library, Adafruit TSL2591 Library, Adafruit_VL53L0X, Adafruit VL53L1X, STM32duino VL53L4CD, STM32duino VL53L4CX, Adafruit_VL6180X, Adafruit PM25 AQI Sensor, Adafruit VCNL4020 Library, Adafruit VCNL4040, Adafruit VCNL4200 Library, Adafruit VEML7700 Library, Adafruit LC709203F, Adafruit LPS2X, Adafruit LPS28, Adafruit LPS35HW, Adafruit seesaw Library, Adafruit BME680 Library, Adafruit MAX1704X, Adafruit ADT7410 Library, Adafruit HTS221, Adafruit HTU21DF Library, Adafruit HTU31D Library, Adafruit PCT2075, hp_BH1750, ENS160 - Adafruit Fork, Adafruit BusIO, Adafruit Unified Sensor, Sensirion Core, Adafruit GFX Library, Adafruit LED Backpack Library, Adafruit LiquidCrystal, Adafruit SH110X, Adafruit SSD1306, Adafruit EPD diff --git a/platformio.ini b/platformio.ini index 28f065116..25bbc006b 100644 --- a/platformio.ini +++ b/platformio.ini @@ -90,9 +90,9 @@ lib_deps = https://github.com/tyeth/omron-devhub_d6t-arduino.git https://github.com/pstolarz/OneWireNg.git ; COMMENT OUT FOR RP2040/RP2350 BOARDS - https://github.com/milesburton/Arduino-Temperature-Control-Library.git + ;https://github.com/milesburton/Arduino-Temperature-Control-Library.git ; AND UNCOMMENT FOR RP2040/RP2350 BOARDS - ; https://github.com/pstolarz/Arduino-Temperature-Control-Library.git + https://github.com/pstolarz/Arduino-Temperature-Control-Library.git https://github.com/Sensirion/arduino-sht.git https://github.com/Sensirion/arduino-i2c-scd4x.git https://github.com/Sensirion/arduino-i2c-sen5x.git @@ -100,6 +100,7 @@ lib_deps = https://github.com/adafruit/WiFiNINA.git https://github.com/Starmbi/hp_BH1750.git https://github.com/adafruit/Adafruit_TinyUSB_Arduino.git + Adafruit EPD @@ -265,7 +266,7 @@ extends = common:esp32 board = adafruit_magtag29_esp32s2 build_flags = -DARDUINO_MAGTAG29_ESP32S2 -DBOARD_HAS_PSRAM ;set partition to tinyuf2-partitions-4MB.csv as of idf 5.1 -board_build.partitions = tinyuf2-partitions-4MB.csv +board_build.partitions = tinyuf2-partitions-4MB-noota.csv extra_scripts = pre:rename_usb_config.py ; Adafruit Metro ESP32-S2 diff --git a/src/Wippersnapper.cpp b/src/Wippersnapper.cpp index 0a948feaa..185bfeb79 100644 --- a/src/Wippersnapper.cpp +++ b/src/Wippersnapper.cpp @@ -1655,6 +1655,37 @@ void cbSignalUARTReq(char *data, uint16_t len) { WS_DEBUG_PRINTLN("ERROR: Unable to decode UART Signal message"); } +/*! + @brief Called when the device receives a new message from the + /display/ topic. + @param data + Incoming data from MQTT broker. + @param len + Length of incoming data. +*/ +void cbDisplayMessage(char *data, uint16_t len) { + WS_DEBUG_PRINTLN("* NEW MESSAGE [Topic: Display]: "); + WS_DEBUG_PRINT(len); + WS_DEBUG_PRINTLN(" bytes."); + // zero-out current buffer + memset(WS._buffer, 0, sizeof(WS._buffer)); + // copy mqtt data into buffer + memcpy(WS._buffer, data, len); + WS.bufSize = len; + + // Set up the payload callback, which will set up the callbacks for + // each oneof payload field once the field tag is known + // TODO: + // WS.msgPixels.cb_payload.funcs.decode = cbDecodePixelsMsg; + + // Decode pixel message from buffer + pb_istream_t istream = pb_istream_from_buffer(WS._buffer, WS.bufSize); + // TODO: Change fields and message type here + if (!ws_pb_decode(&istream, wippersnapper_signal_v1_PixelsRequest_fields, + &WS.msgPixels)) + WS_DEBUG_PRINTLN("ERROR: Unable to decode display message"); +} + /****************************************************************************/ /*! @brief Handles MQTT messages on signal topic until timeout. @@ -2344,6 +2375,61 @@ bool Wippersnapper::generateWSTopics() { WS_DEBUG_PRINTLN("FATAL ERROR: Failed to allocate memory for UART topic!"); return false; } + +// Create d2b display topic +#ifdef USE_PSRAM + WS._topic_signal_display_brkr = (char *)ps_malloc( + sizeof(char) * strlen(WS._config.aio_user) + strlen("/") + + strlen(_device_uid) + strlen("/wprsnpr/") + strlen(TOPIC_SIGNALS) + + strlen("broker") + strlen(TOPIC_DISPLAY) + 1); +#else + WS._topic_signal_display_brkr = (char *)malloc( + sizeof(char) * strlen(WS._config.aio_user) + strlen("/") + + strlen(_device_uid) + strlen("/wprsnpr/") + strlen(TOPIC_SIGNALS) + + strlen("broker") + strlen(TOPIC_DISPLAY) + 1); +#endif + if (WS._topic_signal_display_brkr != NULL) { + strcpy(WS._topic_signal_display_brkr, WS._config.aio_user); + strcat(WS._topic_signal_display_brkr, TOPIC_WS); + strcat(WS._topic_signal_display_brkr, _device_uid); + strcat(WS._topic_signal_display_brkr, TOPIC_SIGNALS); + strcat(WS._topic_signal_display_brkr, "broker"); + strcat(WS._topic_signal_display_brkr, TOPIC_DISPLAY); + } else { // malloc failed + WS_DEBUG_PRINTLN("ERROR: Failed to add a display topic!"); + return false; + } + + // Subscribe to the display sub-topic + _topic_signal_display_sub = + new Adafruit_MQTT_Subscribe(WS._mqtt, WS._topic_signal_display_brkr, 1); + WS._mqtt->subscribe(_topic_signal_display_sub); + _topic_signal_display_sub->setCallback(cbDisplayMessage); + +// Create a b2d display topic +#ifdef USE_PSRAM + WS._topic_signal_display_device = (char *)ps_malloc( + sizeof(char) * strlen(WS._config.aio_user) + strlen("/") + + strlen(_device_uid) + strlen("/wprsnpr/") + strlen(TOPIC_SIGNALS) + + strlen("device") + strlen(TOPIC_DISPLAY) + 1); +#else + WS._topic_signal_display_device = (char *)malloc( + sizeof(char) * strlen(WS._config.aio_user) + strlen("/") + + strlen(_device_uid) + strlen("/wprsnpr/") + strlen(TOPIC_SIGNALS) + + strlen("device") + strlen(TOPIC_DISPLAY) + 1); +#endif + if (WS._topic_signal_display_device != NULL) { + strcpy(WS._topic_signal_display_device, WS._config.aio_user); + strcat(WS._topic_signal_display_device, TOPIC_WS); + strcat(WS._topic_signal_display_device, _device_uid); + strcat(WS._topic_signal_display_device, TOPIC_SIGNALS); + strcat(WS._topic_signal_display_device, "device"); + strcat(WS._topic_signal_display_device, TOPIC_DISPLAY); + } else { // malloc failed + WS_DEBUG_PRINTLN("ERROR: Failed to add a display topic!"); + return false; + } + return true; } diff --git a/src/Wippersnapper.h b/src/Wippersnapper.h index dc3152d01..763335c2e 100644 --- a/src/Wippersnapper.h +++ b/src/Wippersnapper.h @@ -153,6 +153,7 @@ #define TOPIC_INFO "/info/" ///< Registration sub-topic #define TOPIC_SIGNALS "/signals/" ///< Signals sub-topic #define TOPIC_I2C "/i2c" ///< I2C sub-topic +#define TOPIC_DISPLAY "/display" ///< Display sub-topic (EPD, OLED, TFT, etc.) #define MQTT_TOPIC_PIXELS_DEVICE \ "/signals/device/pixel" ///< Pixels device->broker topic #define MQTT_TOPIC_PIXELS_BROKER \ @@ -404,6 +405,8 @@ class Wippersnapper { char *_topic_signal_pixels_device = NULL; /*!< Topic carries pixel messages */ char *_topic_signal_uart_brkr = NULL; /*!< Topic carries UART messages */ char *_topic_signal_uart_device = NULL; /*!< Topic carries UART messages */ + char *_topic_signal_display_brkr = NULL; /*!< Topic carries messages from a device to a broker. */ + char *_topic_signal_display_device = NULL; /*!< Topic carries messages from a broker to a device. */ wippersnapper_signal_v1_CreateSignalRequest _incomingSignalMsg; /*!< Incoming signal message from broker */ @@ -490,6 +493,8 @@ class Wippersnapper { *_topic_signal_pixels_sub; /*!< Subscribes to pixel device topic. */ Adafruit_MQTT_Subscribe *_topic_signal_uart_sub; /*!< Subscribes to signal's UART topic. */ + Adafruit_MQTT_Subscribe + *_topic_signal_display_sub; /*!< Subscription callback for display topic. */ Adafruit_MQTT_Subscribe *_err_sub; /*!< Subscription to Adafruit IO Error topic. */ diff --git a/src/Wippersnapper_demo.ino.cpp b/src/Wippersnapper_demo.ino.cpp new file mode 100644 index 000000000..b71ef62ed --- /dev/null +++ b/src/Wippersnapper_demo.ino.cpp @@ -0,0 +1,26 @@ +# 1 "/var/folders/ff/dmzflvf52tq9kzvt6g8jglxw0000gn/T/tmpvcrl51_o" +#include +# 1 "/Users/brentrubell/Documents/Arduino/libraries/Adafruit_Wippersnapper_Arduino/src/Wippersnapper_demo.ino" +# 16 "/Users/brentrubell/Documents/Arduino/libraries/Adafruit_Wippersnapper_Arduino/src/Wippersnapper_demo.ino" +#include "Wippersnapper_Networking.h" +Wippersnapper_WiFi wipper; + + +#define WS_DEBUG +void setup(); +void loop(); +#line 22 "/Users/brentrubell/Documents/Arduino/libraries/Adafruit_Wippersnapper_Arduino/src/Wippersnapper_demo.ino" +void setup() { + + wipper.provision(); + + Serial.begin(115200); + + + wipper.connect(); + +} + +void loop() { + wipper.run(); +} \ No newline at end of file From 209abea1eb1e5242cdfc4c6b55e771b562e21166 Mon Sep 17 00:00:00 2001 From: brentru Date: Thu, 14 Aug 2025 16:34:56 -0400 Subject: [PATCH 02/23] Track WipperSnapper_Protobuf add-display-v1 commit --- src/Wippersnapper_demo.ino.cpp | 26 -- .../description/v1/description.pb.c | 2 +- .../description/v1/description.pb.h | 2 +- src/wippersnapper/display/v1/display.pb.c | 36 +++ src/wippersnapper/display/v1/display.pb.h | 242 ++++++++++++++++++ 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 | 8 +- src/wippersnapper/signal/v1/signal.pb.h | 55 +++- src/wippersnapper/uart/v1/uart.pb.c | 2 +- src/wippersnapper/uart/v1/uart.pb.h | 2 +- 21 files changed, 355 insertions(+), 44 deletions(-) delete mode 100644 src/Wippersnapper_demo.ino.cpp create mode 100644 src/wippersnapper/display/v1/display.pb.c create mode 100644 src/wippersnapper/display/v1/display.pb.h diff --git a/src/Wippersnapper_demo.ino.cpp b/src/Wippersnapper_demo.ino.cpp deleted file mode 100644 index b71ef62ed..000000000 --- a/src/Wippersnapper_demo.ino.cpp +++ /dev/null @@ -1,26 +0,0 @@ -# 1 "/var/folders/ff/dmzflvf52tq9kzvt6g8jglxw0000gn/T/tmpvcrl51_o" -#include -# 1 "/Users/brentrubell/Documents/Arduino/libraries/Adafruit_Wippersnapper_Arduino/src/Wippersnapper_demo.ino" -# 16 "/Users/brentrubell/Documents/Arduino/libraries/Adafruit_Wippersnapper_Arduino/src/Wippersnapper_demo.ino" -#include "Wippersnapper_Networking.h" -Wippersnapper_WiFi wipper; - - -#define WS_DEBUG -void setup(); -void loop(); -#line 22 "/Users/brentrubell/Documents/Arduino/libraries/Adafruit_Wippersnapper_Arduino/src/Wippersnapper_demo.ino" -void setup() { - - wipper.provision(); - - Serial.begin(115200); - - - wipper.connect(); - -} - -void loop() { - wipper.run(); -} \ 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 af570fc40..2cf057a0c 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 Fri Jun 6 19:48:16 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Aug 14 20:22:46 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 208fbd01c..3e94b59bd 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 Fri Jun 6 19:48:16 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Aug 14 20:22:46 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 new file mode 100644 index 000000000..872d142ef --- /dev/null +++ b/src/wippersnapper/display/v1/display.pb.c @@ -0,0 +1,36 @@ +/* Automatically generated nanopb constant definitions */ +/* Generated by nanopb-0.4.5-dev at Thu Aug 14 20:22:46 2025. */ + +#include "wippersnapper/display/v1/display.pb.h" +#if PB_PROTO_HEADER_VERSION != 40 +#error Regenerate this file with the current version of nanopb generator. +#endif + +PB_BIND(wippersnapper_display_v1_EpdSpiConfig, wippersnapper_display_v1_EpdSpiConfig, AUTO) + + +PB_BIND(wippersnapper_display_v1_EPDConfig, wippersnapper_display_v1_EPDConfig, AUTO) + + +PB_BIND(wippersnapper_display_v1_EPDWriteOptions, wippersnapper_display_v1_EPDWriteOptions, AUTO) + + +PB_BIND(wippersnapper_display_v1_DisplayAddOrReplace, wippersnapper_display_v1_DisplayAddOrReplace, AUTO) + + +PB_BIND(wippersnapper_display_v1_DisplayRemove, wippersnapper_display_v1_DisplayRemove, AUTO) + + +PB_BIND(wippersnapper_display_v1_DisplayWrite, wippersnapper_display_v1_DisplayWrite, AUTO) + + +PB_BIND(wippersnapper_display_v1_DisplayAddedorReplaced, wippersnapper_display_v1_DisplayAddedorReplaced, AUTO) + + +PB_BIND(wippersnapper_display_v1_DisplayRemoved, wippersnapper_display_v1_DisplayRemoved, AUTO) + + + + + + diff --git a/src/wippersnapper/display/v1/display.pb.h b/src/wippersnapper/display/v1/display.pb.h new file mode 100644 index 000000000..cccad57f0 --- /dev/null +++ b/src/wippersnapper/display/v1/display.pb.h @@ -0,0 +1,242 @@ +/* Automatically generated nanopb header */ +/* Generated by nanopb-0.4.5-dev at Thu Aug 14 20:22:46 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 +#include +#include "nanopb/nanopb.pb.h" +#include "wippersnapper/i2c/v1/i2c.pb.h" + +#if PB_PROTO_HEADER_VERSION != 40 +#error Regenerate this file with the current version of nanopb generator. +#endif + +/* Enum definitions */ +typedef enum _wippersnapper_display_v1_DisplayType { + wippersnapper_display_v1_DisplayType_DISPLAY_TYPE_UNSPECIFIED = 0, + wippersnapper_display_v1_DisplayType_DISPLAY_TYPE_OLED = 1, + wippersnapper_display_v1_DisplayType_DISPLAY_TYPE_EPD = 2 +} wippersnapper_display_v1_DisplayType; + +typedef enum _wippersnapper_display_v1_EPDMode { + wippersnapper_display_v1_EPDMode_EPD_MODE_UNSPECIFIED = 0, + wippersnapper_display_v1_EPDMode_EPD_MODE_GRAYSCALE4 = 1, + wippersnapper_display_v1_EPDMode_EPD_MODE_MONO = 2 +} wippersnapper_display_v1_EPDMode; + +typedef enum _wippersnapper_display_v1_EPDColors { + wippersnapper_display_v1_EPDColors_EPD_COLORS_UNSPECIFIED = 0, + wippersnapper_display_v1_EPDColors_EPD_COLORS_WHITE = 1, + wippersnapper_display_v1_EPDColors_EPD_COLORS_BLACK = 2, + wippersnapper_display_v1_EPDColors_EPD_COLORS_RED = 3, + wippersnapper_display_v1_EPDColors_EPD_COLORS_GRAY = 4, + wippersnapper_display_v1_EPDColors_EPD_COLORS_DARK = 5, + wippersnapper_display_v1_EPDColors_EPD_COLORS_LIGHT = 6, + wippersnapper_display_v1_EPDColors_EPD_COLORS_YELLOW = 7 +} wippersnapper_display_v1_EPDColors; + +/* Struct definitions */ +typedef struct _wippersnapper_display_v1_DisplayAddedorReplaced { + bool did_add; +} wippersnapper_display_v1_DisplayAddedorReplaced; + +typedef struct _wippersnapper_display_v1_DisplayRemove { + char name[6]; +} wippersnapper_display_v1_DisplayRemove; + +typedef struct _wippersnapper_display_v1_DisplayRemoved { + bool did_remove; +} wippersnapper_display_v1_DisplayRemoved; + +typedef struct _wippersnapper_display_v1_EPDConfig { + wippersnapper_display_v1_EPDMode mode; + int32_t width; + int32_t height; + char pin_busy[6]; + char pin_reset[6]; +} wippersnapper_display_v1_EPDConfig; + +typedef struct _wippersnapper_display_v1_EPDWriteOptions { + int32_t text_size; + wippersnapper_display_v1_EPDColors color; +} wippersnapper_display_v1_EPDWriteOptions; + +typedef struct _wippersnapper_display_v1_EpdSpiConfig { + int32_t bus; + char pin_dc[6]; + char pin_rst[6]; + char pin_cs[6]; + char pin_sram_cs[6]; + char pin_busy[6]; +} wippersnapper_display_v1_EpdSpiConfig; + +typedef struct _wippersnapper_display_v1_DisplayAddOrReplace { + wippersnapper_display_v1_DisplayType type; + pb_size_t which_interface_type; + union { + wippersnapper_display_v1_EpdSpiConfig spi_epd; + } interface_type; + char name[6]; +} wippersnapper_display_v1_DisplayAddOrReplace; + +typedef struct _wippersnapper_display_v1_DisplayWrite { + char name[6]; + char message[6]; + pb_size_t which_options; + union { + wippersnapper_display_v1_EPDWriteOptions epd_options; + } options; +} wippersnapper_display_v1_DisplayWrite; + + +/* Helper constants for enums */ +#define _wippersnapper_display_v1_DisplayType_MIN wippersnapper_display_v1_DisplayType_DISPLAY_TYPE_UNSPECIFIED +#define _wippersnapper_display_v1_DisplayType_MAX wippersnapper_display_v1_DisplayType_DISPLAY_TYPE_EPD +#define _wippersnapper_display_v1_DisplayType_ARRAYSIZE ((wippersnapper_display_v1_DisplayType)(wippersnapper_display_v1_DisplayType_DISPLAY_TYPE_EPD+1)) + +#define _wippersnapper_display_v1_EPDMode_MIN wippersnapper_display_v1_EPDMode_EPD_MODE_UNSPECIFIED +#define _wippersnapper_display_v1_EPDMode_MAX wippersnapper_display_v1_EPDMode_EPD_MODE_MONO +#define _wippersnapper_display_v1_EPDMode_ARRAYSIZE ((wippersnapper_display_v1_EPDMode)(wippersnapper_display_v1_EPDMode_EPD_MODE_MONO+1)) + +#define _wippersnapper_display_v1_EPDColors_MIN wippersnapper_display_v1_EPDColors_EPD_COLORS_UNSPECIFIED +#define _wippersnapper_display_v1_EPDColors_MAX wippersnapper_display_v1_EPDColors_EPD_COLORS_YELLOW +#define _wippersnapper_display_v1_EPDColors_ARRAYSIZE ((wippersnapper_display_v1_EPDColors)(wippersnapper_display_v1_EPDColors_EPD_COLORS_YELLOW+1)) + + +#ifdef __cplusplus +extern "C" { +#endif + +/* Initializer values for message structs */ +#define wippersnapper_display_v1_EpdSpiConfig_init_default {0, "", "", "", "", ""} +#define wippersnapper_display_v1_EPDConfig_init_default {_wippersnapper_display_v1_EPDMode_MIN, 0, 0, "", ""} +#define wippersnapper_display_v1_EPDWriteOptions_init_default {0, _wippersnapper_display_v1_EPDColors_MIN} +#define wippersnapper_display_v1_DisplayAddOrReplace_init_default {_wippersnapper_display_v1_DisplayType_MIN, 0, {wippersnapper_display_v1_EpdSpiConfig_init_default}, ""} +#define wippersnapper_display_v1_DisplayRemove_init_default {""} +#define wippersnapper_display_v1_DisplayWrite_init_default {"", "", 0, {wippersnapper_display_v1_EPDWriteOptions_init_default}} +#define wippersnapper_display_v1_DisplayAddedorReplaced_init_default {0} +#define wippersnapper_display_v1_DisplayRemoved_init_default {0} +#define wippersnapper_display_v1_EpdSpiConfig_init_zero {0, "", "", "", "", ""} +#define wippersnapper_display_v1_EPDConfig_init_zero {_wippersnapper_display_v1_EPDMode_MIN, 0, 0, "", ""} +#define wippersnapper_display_v1_EPDWriteOptions_init_zero {0, _wippersnapper_display_v1_EPDColors_MIN} +#define wippersnapper_display_v1_DisplayAddOrReplace_init_zero {_wippersnapper_display_v1_DisplayType_MIN, 0, {wippersnapper_display_v1_EpdSpiConfig_init_zero}, ""} +#define wippersnapper_display_v1_DisplayRemove_init_zero {""} +#define wippersnapper_display_v1_DisplayWrite_init_zero {"", "", 0, {wippersnapper_display_v1_EPDWriteOptions_init_zero}} +#define wippersnapper_display_v1_DisplayAddedorReplaced_init_zero {0} +#define wippersnapper_display_v1_DisplayRemoved_init_zero {0} + +/* Field tags (for use in manual encoding/decoding) */ +#define wippersnapper_display_v1_DisplayAddedorReplaced_did_add_tag 1 +#define wippersnapper_display_v1_DisplayRemove_name_tag 1 +#define wippersnapper_display_v1_DisplayRemoved_did_remove_tag 1 +#define wippersnapper_display_v1_EPDConfig_mode_tag 1 +#define wippersnapper_display_v1_EPDConfig_width_tag 2 +#define wippersnapper_display_v1_EPDConfig_height_tag 3 +#define wippersnapper_display_v1_EPDConfig_pin_busy_tag 4 +#define wippersnapper_display_v1_EPDConfig_pin_reset_tag 5 +#define wippersnapper_display_v1_EPDWriteOptions_text_size_tag 1 +#define wippersnapper_display_v1_EPDWriteOptions_color_tag 2 +#define wippersnapper_display_v1_EpdSpiConfig_bus_tag 1 +#define wippersnapper_display_v1_EpdSpiConfig_pin_dc_tag 2 +#define wippersnapper_display_v1_EpdSpiConfig_pin_rst_tag 3 +#define wippersnapper_display_v1_EpdSpiConfig_pin_cs_tag 4 +#define wippersnapper_display_v1_EpdSpiConfig_pin_sram_cs_tag 5 +#define wippersnapper_display_v1_EpdSpiConfig_pin_busy_tag 6 +#define wippersnapper_display_v1_DisplayAddOrReplace_type_tag 1 +#define wippersnapper_display_v1_DisplayAddOrReplace_spi_epd_tag 2 +#define wippersnapper_display_v1_DisplayAddOrReplace_name_tag 3 +#define wippersnapper_display_v1_DisplayWrite_name_tag 1 +#define wippersnapper_display_v1_DisplayWrite_message_tag 2 +#define wippersnapper_display_v1_DisplayWrite_epd_options_tag 3 + +/* Struct field encoding specification for nanopb */ +#define wippersnapper_display_v1_EpdSpiConfig_FIELDLIST(X, a) \ +X(a, STATIC, SINGULAR, INT32, bus, 1) \ +X(a, STATIC, SINGULAR, STRING, pin_dc, 2) \ +X(a, STATIC, SINGULAR, STRING, pin_rst, 3) \ +X(a, STATIC, SINGULAR, STRING, pin_cs, 4) \ +X(a, STATIC, SINGULAR, STRING, pin_sram_cs, 5) \ +X(a, STATIC, SINGULAR, STRING, pin_busy, 6) +#define wippersnapper_display_v1_EpdSpiConfig_CALLBACK NULL +#define wippersnapper_display_v1_EpdSpiConfig_DEFAULT NULL + +#define wippersnapper_display_v1_EPDConfig_FIELDLIST(X, a) \ +X(a, STATIC, SINGULAR, UENUM, mode, 1) \ +X(a, STATIC, SINGULAR, INT32, width, 2) \ +X(a, STATIC, SINGULAR, INT32, height, 3) \ +X(a, STATIC, SINGULAR, STRING, pin_busy, 4) \ +X(a, STATIC, SINGULAR, STRING, pin_reset, 5) +#define wippersnapper_display_v1_EPDConfig_CALLBACK NULL +#define wippersnapper_display_v1_EPDConfig_DEFAULT NULL + +#define wippersnapper_display_v1_EPDWriteOptions_FIELDLIST(X, a) \ +X(a, STATIC, SINGULAR, INT32, text_size, 1) \ +X(a, STATIC, SINGULAR, UENUM, color, 2) +#define wippersnapper_display_v1_EPDWriteOptions_CALLBACK NULL +#define wippersnapper_display_v1_EPDWriteOptions_DEFAULT NULL + +#define wippersnapper_display_v1_DisplayAddOrReplace_FIELDLIST(X, a) \ +X(a, STATIC, SINGULAR, UENUM, type, 1) \ +X(a, STATIC, ONEOF, MESSAGE, (interface_type,spi_epd,interface_type.spi_epd), 2) \ +X(a, STATIC, SINGULAR, STRING, name, 3) +#define wippersnapper_display_v1_DisplayAddOrReplace_CALLBACK NULL +#define wippersnapper_display_v1_DisplayAddOrReplace_DEFAULT NULL +#define wippersnapper_display_v1_DisplayAddOrReplace_interface_type_spi_epd_MSGTYPE wippersnapper_display_v1_EpdSpiConfig + +#define wippersnapper_display_v1_DisplayRemove_FIELDLIST(X, a) \ +X(a, STATIC, SINGULAR, STRING, name, 1) +#define wippersnapper_display_v1_DisplayRemove_CALLBACK NULL +#define wippersnapper_display_v1_DisplayRemove_DEFAULT NULL + +#define wippersnapper_display_v1_DisplayWrite_FIELDLIST(X, a) \ +X(a, STATIC, SINGULAR, STRING, name, 1) \ +X(a, STATIC, SINGULAR, STRING, message, 2) \ +X(a, STATIC, ONEOF, MESSAGE, (options,epd_options,options.epd_options), 3) +#define wippersnapper_display_v1_DisplayWrite_CALLBACK NULL +#define wippersnapper_display_v1_DisplayWrite_DEFAULT NULL +#define wippersnapper_display_v1_DisplayWrite_options_epd_options_MSGTYPE wippersnapper_display_v1_EPDWriteOptions + +#define wippersnapper_display_v1_DisplayAddedorReplaced_FIELDLIST(X, a) \ +X(a, STATIC, SINGULAR, BOOL, did_add, 1) +#define wippersnapper_display_v1_DisplayAddedorReplaced_CALLBACK NULL +#define wippersnapper_display_v1_DisplayAddedorReplaced_DEFAULT NULL + +#define wippersnapper_display_v1_DisplayRemoved_FIELDLIST(X, a) \ +X(a, STATIC, SINGULAR, BOOL, did_remove, 1) +#define wippersnapper_display_v1_DisplayRemoved_CALLBACK NULL +#define wippersnapper_display_v1_DisplayRemoved_DEFAULT NULL + +extern const pb_msgdesc_t wippersnapper_display_v1_EpdSpiConfig_msg; +extern const pb_msgdesc_t wippersnapper_display_v1_EPDConfig_msg; +extern const pb_msgdesc_t wippersnapper_display_v1_EPDWriteOptions_msg; +extern const pb_msgdesc_t wippersnapper_display_v1_DisplayAddOrReplace_msg; +extern const pb_msgdesc_t wippersnapper_display_v1_DisplayRemove_msg; +extern const pb_msgdesc_t wippersnapper_display_v1_DisplayWrite_msg; +extern const pb_msgdesc_t wippersnapper_display_v1_DisplayAddedorReplaced_msg; +extern const pb_msgdesc_t wippersnapper_display_v1_DisplayRemoved_msg; + +/* Defines for backwards compatibility with code written before nanopb-0.4.0 */ +#define wippersnapper_display_v1_EpdSpiConfig_fields &wippersnapper_display_v1_EpdSpiConfig_msg +#define wippersnapper_display_v1_EPDConfig_fields &wippersnapper_display_v1_EPDConfig_msg +#define wippersnapper_display_v1_EPDWriteOptions_fields &wippersnapper_display_v1_EPDWriteOptions_msg +#define wippersnapper_display_v1_DisplayAddOrReplace_fields &wippersnapper_display_v1_DisplayAddOrReplace_msg +#define wippersnapper_display_v1_DisplayRemove_fields &wippersnapper_display_v1_DisplayRemove_msg +#define wippersnapper_display_v1_DisplayWrite_fields &wippersnapper_display_v1_DisplayWrite_msg +#define wippersnapper_display_v1_DisplayAddedorReplaced_fields &wippersnapper_display_v1_DisplayAddedorReplaced_msg +#define wippersnapper_display_v1_DisplayRemoved_fields &wippersnapper_display_v1_DisplayRemoved_msg + +/* Maximum encoded size of messages (where known) */ +#define wippersnapper_display_v1_EpdSpiConfig_size 46 +#define wippersnapper_display_v1_EPDConfig_size 38 +#define wippersnapper_display_v1_EPDWriteOptions_size 13 +#define wippersnapper_display_v1_DisplayAddOrReplace_size 57 +#define wippersnapper_display_v1_DisplayRemove_size 7 +#define wippersnapper_display_v1_DisplayWrite_size 29 +#define wippersnapper_display_v1_DisplayAddedorReplaced_size 2 +#define wippersnapper_display_v1_DisplayRemoved_size 2 + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/src/wippersnapper/ds18x20/v1/ds18x20.pb.c b/src/wippersnapper/ds18x20/v1/ds18x20.pb.c index 483c432c9..1eba2203a 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 Fri Jun 6 19:48:16 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Aug 14 20:22:46 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 715616f73..6b5266136 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 Fri Jun 6 19:48:16 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Aug 14 20:22:46 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 e1e4dde04..bc76391b7 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 Fri Jun 6 19:48:16 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Aug 14 20:22:46 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 8b5b0f53b..2e0526c92 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 Fri Jun 6 19:48:16 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Aug 14 20:22:46 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 8ed37f9d0..6cf3925d0 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 Fri Jun 6 19:48:16 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Aug 14 20:22:46 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 14b1a99fe..7137f1c3a 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 Fri Jun 6 19:48:16 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Aug 14 20:22:46 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 e5bcca7f3..9eeaef7dd 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 Fri Jun 6 19:48:16 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Aug 14 20:22:46 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 b8a7f6813..0ea96b211 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 Fri Jun 6 19:48:16 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Aug 14 20:22:46 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 36cf1c440..3526dbec3 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 Fri Jun 6 19:48:16 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Aug 14 20:22:46 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 d223d7a1c..07a46bfc7 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 Fri Jun 6 19:48:16 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Aug 14 20:22:46 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 eb9b45e93..b951a904b 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 Fri Jun 6 19:48:16 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Aug 14 20:22:46 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 61b3b809a..21fd141e9 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 Fri Jun 6 19:48:16 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Aug 14 20:22:46 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 0f0278ac0..357005718 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 Fri Jun 6 19:48:16 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Aug 14 20:22:46 2025. */ #include "wippersnapper/signal/v1/signal.pb.h" #if PB_PROTO_HEADER_VERSION != 40 @@ -48,4 +48,10 @@ PB_BIND(wippersnapper_signal_v1_PWMRequest, wippersnapper_signal_v1_PWMRequest, PB_BIND(wippersnapper_signal_v1_PWMResponse, wippersnapper_signal_v1_PWMResponse, AUTO) +PB_BIND(wippersnapper_signal_v1_DisplayRequest, wippersnapper_signal_v1_DisplayRequest, AUTO) + + +PB_BIND(wippersnapper_signal_v1_DisplayResponse, wippersnapper_signal_v1_DisplayResponse, AUTO) + + diff --git a/src/wippersnapper/signal/v1/signal.pb.h b/src/wippersnapper/signal/v1/signal.pb.h index e459607f3..f07792306 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 Fri Jun 6 19:48:16 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Aug 14 20:22:46 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 @@ -12,6 +12,7 @@ #include "wippersnapper/ds18x20/v1/ds18x20.pb.h" #include "wippersnapper/pixels/v1/pixels.pb.h" #include "wippersnapper/uart/v1/uart.pb.h" +#include "wippersnapper/display/v1/display.pb.h" #if PB_PROTO_HEADER_VERSION != 40 #error Regenerate this file with the current version of nanopb generator. @@ -28,6 +29,25 @@ typedef struct _wippersnapper_signal_v1_CreateSignalRequest { } payload; } wippersnapper_signal_v1_CreateSignalRequest; +typedef struct _wippersnapper_signal_v1_DisplayRequest { + pb_callback_t cb_payload; + pb_size_t which_payload; + union { + wippersnapper_display_v1_DisplayAddOrReplace display_add; + wippersnapper_display_v1_DisplayRemove display_remove; + wippersnapper_display_v1_DisplayWrite display_write; + } payload; +} wippersnapper_signal_v1_DisplayRequest; + +typedef struct _wippersnapper_signal_v1_DisplayResponse { + pb_callback_t cb_payload; + pb_size_t which_payload; + union { + wippersnapper_display_v1_DisplayAddedorReplaced display_added; + wippersnapper_display_v1_DisplayRemoved display_removed; + } payload; +} wippersnapper_signal_v1_DisplayResponse; + typedef struct _wippersnapper_signal_v1_Ds18x20Request { pb_callback_t cb_payload; pb_size_t which_payload; @@ -173,6 +193,8 @@ extern "C" { #define wippersnapper_signal_v1_SignalResponse_init_default {0, {0}} #define wippersnapper_signal_v1_PWMRequest_init_default {{{NULL}, NULL}, 0, {wippersnapper_pwm_v1_PWMAttachRequest_init_default}} #define wippersnapper_signal_v1_PWMResponse_init_default {{{NULL}, NULL}, 0, {wippersnapper_pwm_v1_PWMAttachResponse_init_default}} +#define wippersnapper_signal_v1_DisplayRequest_init_default {{{NULL}, NULL}, 0, {wippersnapper_display_v1_DisplayAddOrReplace_init_default}} +#define wippersnapper_signal_v1_DisplayResponse_init_default {{{NULL}, NULL}, 0, {wippersnapper_display_v1_DisplayAddedorReplaced_init_default}} #define wippersnapper_signal_v1_UARTRequest_init_zero {{{NULL}, NULL}, 0, {wippersnapper_uart_v1_UARTDeviceAttachRequest_init_zero}} #define wippersnapper_signal_v1_UARTResponse_init_zero {{{NULL}, NULL}, 0, {wippersnapper_uart_v1_UARTDeviceAttachResponse_init_zero}} #define wippersnapper_signal_v1_Ds18x20Request_init_zero {{{NULL}, NULL}, 0, {wippersnapper_ds18x20_v1_Ds18x20InitRequest_init_zero}} @@ -187,11 +209,18 @@ extern "C" { #define wippersnapper_signal_v1_SignalResponse_init_zero {0, {0}} #define wippersnapper_signal_v1_PWMRequest_init_zero {{{NULL}, NULL}, 0, {wippersnapper_pwm_v1_PWMAttachRequest_init_zero}} #define wippersnapper_signal_v1_PWMResponse_init_zero {{{NULL}, NULL}, 0, {wippersnapper_pwm_v1_PWMAttachResponse_init_zero}} +#define wippersnapper_signal_v1_DisplayRequest_init_zero {{{NULL}, NULL}, 0, {wippersnapper_display_v1_DisplayAddOrReplace_init_zero}} +#define wippersnapper_signal_v1_DisplayResponse_init_zero {{{NULL}, NULL}, 0, {wippersnapper_display_v1_DisplayAddedorReplaced_init_zero}} /* Field tags (for use in manual encoding/decoding) */ #define wippersnapper_signal_v1_CreateSignalRequest_pin_configs_tag 6 #define wippersnapper_signal_v1_CreateSignalRequest_pin_events_tag 7 #define wippersnapper_signal_v1_CreateSignalRequest_pin_event_tag 15 +#define wippersnapper_signal_v1_DisplayRequest_display_add_tag 1 +#define wippersnapper_signal_v1_DisplayRequest_display_remove_tag 2 +#define wippersnapper_signal_v1_DisplayRequest_display_write_tag 3 +#define wippersnapper_signal_v1_DisplayResponse_display_added_tag 1 +#define wippersnapper_signal_v1_DisplayResponse_display_removed_tag 2 #define wippersnapper_signal_v1_Ds18x20Request_req_ds18x20_init_tag 1 #define wippersnapper_signal_v1_Ds18x20Request_req_ds18x20_deinit_tag 2 #define wippersnapper_signal_v1_Ds18x20Response_resp_ds18x20_init_tag 1 @@ -360,6 +389,24 @@ X(a, STATIC, ONEOF, MSG_W_CB, (payload,attach_response,payload.attach_respo #define wippersnapper_signal_v1_PWMResponse_DEFAULT NULL #define wippersnapper_signal_v1_PWMResponse_payload_attach_response_MSGTYPE wippersnapper_pwm_v1_PWMAttachResponse +#define wippersnapper_signal_v1_DisplayRequest_FIELDLIST(X, a) \ +X(a, STATIC, ONEOF, MSG_W_CB, (payload,display_add,payload.display_add), 1) \ +X(a, STATIC, ONEOF, MSG_W_CB, (payload,display_remove,payload.display_remove), 2) \ +X(a, STATIC, ONEOF, MSG_W_CB, (payload,display_write,payload.display_write), 3) +#define wippersnapper_signal_v1_DisplayRequest_CALLBACK NULL +#define wippersnapper_signal_v1_DisplayRequest_DEFAULT NULL +#define wippersnapper_signal_v1_DisplayRequest_payload_display_add_MSGTYPE wippersnapper_display_v1_DisplayAddOrReplace +#define wippersnapper_signal_v1_DisplayRequest_payload_display_remove_MSGTYPE wippersnapper_display_v1_DisplayRemove +#define wippersnapper_signal_v1_DisplayRequest_payload_display_write_MSGTYPE wippersnapper_display_v1_DisplayWrite + +#define wippersnapper_signal_v1_DisplayResponse_FIELDLIST(X, a) \ +X(a, STATIC, ONEOF, MSG_W_CB, (payload,display_added,payload.display_added), 1) \ +X(a, STATIC, ONEOF, MSG_W_CB, (payload,display_removed,payload.display_removed), 2) +#define wippersnapper_signal_v1_DisplayResponse_CALLBACK NULL +#define wippersnapper_signal_v1_DisplayResponse_DEFAULT NULL +#define wippersnapper_signal_v1_DisplayResponse_payload_display_added_MSGTYPE wippersnapper_display_v1_DisplayAddedorReplaced +#define wippersnapper_signal_v1_DisplayResponse_payload_display_removed_MSGTYPE wippersnapper_display_v1_DisplayRemoved + extern const pb_msgdesc_t wippersnapper_signal_v1_UARTRequest_msg; extern const pb_msgdesc_t wippersnapper_signal_v1_UARTResponse_msg; extern const pb_msgdesc_t wippersnapper_signal_v1_Ds18x20Request_msg; @@ -374,6 +421,8 @@ extern const pb_msgdesc_t wippersnapper_signal_v1_CreateSignalRequest_msg; extern const pb_msgdesc_t wippersnapper_signal_v1_SignalResponse_msg; extern const pb_msgdesc_t wippersnapper_signal_v1_PWMRequest_msg; extern const pb_msgdesc_t wippersnapper_signal_v1_PWMResponse_msg; +extern const pb_msgdesc_t wippersnapper_signal_v1_DisplayRequest_msg; +extern const pb_msgdesc_t wippersnapper_signal_v1_DisplayResponse_msg; /* Defines for backwards compatibility with code written before nanopb-0.4.0 */ #define wippersnapper_signal_v1_UARTRequest_fields &wippersnapper_signal_v1_UARTRequest_msg @@ -390,6 +439,8 @@ extern const pb_msgdesc_t wippersnapper_signal_v1_PWMResponse_msg; #define wippersnapper_signal_v1_SignalResponse_fields &wippersnapper_signal_v1_SignalResponse_msg #define wippersnapper_signal_v1_PWMRequest_fields &wippersnapper_signal_v1_PWMRequest_msg #define wippersnapper_signal_v1_PWMResponse_fields &wippersnapper_signal_v1_PWMResponse_msg +#define wippersnapper_signal_v1_DisplayRequest_fields &wippersnapper_signal_v1_DisplayRequest_msg +#define wippersnapper_signal_v1_DisplayResponse_fields &wippersnapper_signal_v1_DisplayResponse_msg /* Maximum encoded size of messages (where known) */ #define wippersnapper_signal_v1_UARTRequest_size 58 @@ -412,6 +463,8 @@ union wippersnapper_signal_v1_CreateSignalRequest_payload_size_union {char f6[(6 #define wippersnapper_signal_v1_SignalResponse_size 2 #define wippersnapper_signal_v1_PWMRequest_size 82 #define wippersnapper_signal_v1_PWMResponse_size 11 +#define wippersnapper_signal_v1_DisplayRequest_size 59 +#define wippersnapper_signal_v1_DisplayResponse_size 4 #ifdef __cplusplus } /* extern "C" */ diff --git a/src/wippersnapper/uart/v1/uart.pb.c b/src/wippersnapper/uart/v1/uart.pb.c index a605be6ef..f80b3897b 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 Fri Jun 6 19:48:16 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Aug 14 20:22:46 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 af9364c2a..b51fbcb8e 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 Fri Jun 6 19:48:16 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Aug 14 20:22:46 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 71cb68d10c2f8e05b34798e5d1e277c8a81cbb7f Mon Sep 17 00:00:00 2001 From: brentru Date: Thu, 14 Aug 2025 16:39:21 -0400 Subject: [PATCH 03/23] Add deserializer hooks --- src/Wippersnapper.cpp | 23 ++++++++++++++++++----- src/Wippersnapper.h | 2 ++ 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/Wippersnapper.cpp b/src/Wippersnapper.cpp index 185bfeb79..1e5808dfc 100644 --- a/src/Wippersnapper.cpp +++ b/src/Wippersnapper.cpp @@ -1655,6 +1655,21 @@ void cbSignalUARTReq(char *data, uint16_t len) { WS_DEBUG_PRINTLN("ERROR: Unable to decode UART Signal message"); } +/*! + @brief Deserializes a DisplayRequest message and sends it to the display component. + @param stream + Incoming data stream from buffer. + @param field + Protobuf message's tag type. + @param arg + Optional arguments from decoder calling function. + @returns True if decoded successfully, False otherwise. +*/ +bool cbDecodeDisplayMsg(pb_istream_t *stream, const pb_field_t *field, void **arg) { + // TODO: Need to write deserializer logic here + return true; +} + /*! @brief Called when the device receives a new message from the /display/ topic. @@ -1675,14 +1690,12 @@ void cbDisplayMessage(char *data, uint16_t len) { // Set up the payload callback, which will set up the callbacks for // each oneof payload field once the field tag is known - // TODO: - // WS.msgPixels.cb_payload.funcs.decode = cbDecodePixelsMsg; + WS.msgSignalDisplay.cb_payload.funcs.decode = cbDecodeDisplayMsg; // Decode pixel message from buffer pb_istream_t istream = pb_istream_from_buffer(WS._buffer, WS.bufSize); - // TODO: Change fields and message type here - if (!ws_pb_decode(&istream, wippersnapper_signal_v1_PixelsRequest_fields, - &WS.msgPixels)) + if (!ws_pb_decode(&istream, wippersnapper_signal_v1_DisplayRequest_fields, + &WS.msgSignalDisplay)) WS_DEBUG_PRINTLN("ERROR: Unable to decode display message"); } diff --git a/src/Wippersnapper.h b/src/Wippersnapper.h index 763335c2e..20ededd12 100644 --- a/src/Wippersnapper.h +++ b/src/Wippersnapper.h @@ -433,6 +433,8 @@ class Wippersnapper { wippersnapper_signal_v1_UARTRequest msgSignalUART; ///< UARTReq wrapper message + wippersnapper_signal_v1_DisplayRequest msgSignalDisplay; + char *throttleMessage; /*!< Pointer to throttle message data. */ int throttleTime; /*!< Total amount of time to throttle the device, in milliseconds. */ From 967650e5809fbfbb9f543c7dd1ef0a874945edd3 Mon Sep 17 00:00:00 2001 From: brentru Date: Fri, 15 Aug 2025 12:05:31 -0400 Subject: [PATCH 04/23] Add display component, start handleAdd --- src/Wippersnapper.cpp | 19 ++++++++- src/Wippersnapper.h | 3 ++ src/components/display/controller.cpp | 37 +++++++++++++++++ src/components/display/controller.h | 41 +++++++++++++++++++ src/components/display/hardware.cpp | 58 +++++++++++++++++++++++++++ src/components/display/hardware.h | 45 +++++++++++++++++++++ src/provisioning/sdcard/ws_sdcard.cpp | 0 src/provisioning/sdcard/ws_sdcard.h | 0 8 files changed, 202 insertions(+), 1 deletion(-) create mode 100644 src/components/display/controller.cpp create mode 100644 src/components/display/controller.h create mode 100644 src/components/display/hardware.cpp create mode 100644 src/components/display/hardware.h create mode 100644 src/provisioning/sdcard/ws_sdcard.cpp create mode 100644 src/provisioning/sdcard/ws_sdcard.h diff --git a/src/Wippersnapper.cpp b/src/Wippersnapper.cpp index 1e5808dfc..783186f0f 100644 --- a/src/Wippersnapper.cpp +++ b/src/Wippersnapper.cpp @@ -69,6 +69,9 @@ Wippersnapper::Wippersnapper() { // DallasSemi (OneWire) WS._ds18x20Component = new ws_ds18x20(); + + // Display controller + WS._displayController = new DisplayController(); }; /**************************************************************************/ @@ -1666,7 +1669,21 @@ void cbSignalUARTReq(char *data, uint16_t len) { @returns True if decoded successfully, False otherwise. */ bool cbDecodeDisplayMsg(pb_istream_t *stream, const pb_field_t *field, void **arg) { - // TODO: Need to write deserializer logic here + if (field->tag == wippersnapper_signal_v1_DisplayRequest_display_add_tag) { + + // Decode message into a DisplayAddRequest + wippersnapper_display_v1_DisplayAddOrReplace msgAddReq = wippersnapper_display_v1_DisplayAddOrReplace_init_zero; + if (!ws_pb_decode(stream, + wippersnapper_display_v1_DisplayAddOrReplace_fields, + &msgAddReq)) { + WS_DEBUG_PRINTLN("ERROR: Failure decoding DisplayAddOrReplace message!"); + return false; + } + + // Attempt to add or replace a display component + bool did_add = WS._displayController->Handle_Display_AddOrReplace(&msgAddReq); + // TODO: Add response handling and publishing here + return true; } diff --git a/src/Wippersnapper.h b/src/Wippersnapper.h index 20ededd12..654fd4c66 100644 --- a/src/Wippersnapper.h +++ b/src/Wippersnapper.h @@ -132,6 +132,7 @@ #include "components/pwm/ws_pwm.h" #include "components/servo/ws_servo.h" #include "components/uart/ws_uart.h" +#include "components/display/controller.h" #if defined(USE_TINYUSB) #include "provisioning/tinyusb/Wippersnapper_FS.h" @@ -246,6 +247,7 @@ class ws_pwm; class ws_ds18x20; class ws_pixels; class ws_uart; +class DisplayController; /**************************************************************************/ /*! @@ -369,6 +371,7 @@ class Wippersnapper { ws_servo *_servoComponent; ///< Instance of servo class ws_ds18x20 *_ds18x20Component; ///< Instance of DS18x20 class ws_uart *_uartComponent; ///< Instance of UART class + DisplayController *_displayController; ///< Instance of display controller class // TODO: does this really need to be global? uint8_t _macAddr[6]; /*!< Unique network iface identifier */ diff --git a/src/components/display/controller.cpp b/src/components/display/controller.cpp new file mode 100644 index 000000000..4790fa923 --- /dev/null +++ b/src/components/display/controller.cpp @@ -0,0 +1,37 @@ +/*! + * @file src/components/display/controller.cpp + * + * Implementation for the display API controller. + * + * Adafruit invests time and resources providing this open source code, + * please support Adafruit and open-source hardware by purchasing + * products from Adafruit! + * + * Copyright (c) Brent Rubell 2025 for Adafruit Industries. + * + * BSD license, all text here must be included in any redistribution. + * + */ +#include "controller.h" + +/*! + @brief Constructs a new DisplayController object +*/ +DisplayController::DisplayController() { + // TODO +} + +/*! + @brief Destructor +*/ +DisplayController::DisplayController() { + // TODO +} + +bool DisplayController::Handle_Display_AddOrReplace(wippersnapper_display_v1_DisplayAddOrReplace *msgAdd) { + DisplayHardware *display = new DisplayHardware(); + // Configure display type + display->setType(msgAdd->type); + + return true; // Placeholder +} diff --git a/src/components/display/controller.h b/src/components/display/controller.h new file mode 100644 index 000000000..cf635476e --- /dev/null +++ b/src/components/display/controller.h @@ -0,0 +1,41 @@ +/*! + * @file src/components/display/controller.h + * + * Controller for the display API + * + * Adafruit invests time and resources providing this open source code, + * please support Adafruit and open-source hardware by purchasing + * products from Adafruit! + * + * Copyright (c) Brent Rubell 2025 for Adafruit Industries. + * + * BSD license, all text here must be included in any redistribution. + * + */ +#ifndef WS_DISPLAY_CONTROLLER_H +#define WS_DISPLAY_CONTROLLER_H +#include "Wippersnapper.h" +#include "hardware.h" + +class Wippersnapper_V2; ///< Forward declaration +class DisplayHardware; ///< Forward declaration + +/**************************************************************************/ +/*! + @brief Routes messages using the display.proto API to the + appropriate hardware and model classes, controls and tracks + the state of displays. +*/ +/**************************************************************************/ +class DisplayController { +public: + DisplayController(); + ~DisplayController(); + bool Handle_Display_AddOrReplace(wippersnapper_display_v1_DisplayAddOrReplace *msgAdd); + //bool Handle_Display_Write(pb_istream_t *stream); + //bool Handle_Display_Remove(pb_istream_t *stream); +private: + //DisplayHardware *_display_strands[MAX_DISPLAY_STRANDS] = { +}; +extern Wippersnapper Ws; ///< Global WS instance +#endif \ No newline at end of file diff --git a/src/components/display/hardware.cpp b/src/components/display/hardware.cpp new file mode 100644 index 000000000..254e52da8 --- /dev/null +++ b/src/components/display/hardware.cpp @@ -0,0 +1,58 @@ +/*! + * @file src/components/display/hardware.cpp + * + * Implementation for the display hardware. + * + * Adafruit invests time and resources providing this open source code, + * please support Adafruit and open-source hardware by purchasing + * products from Adafruit! + * + * Copyright (c) Brent Rubell 2025 for Adafruit Industries. + * + * BSD license, all text here must be included in any redistribution. + * + */ +#include "controller.h" + +/*! + @brief Constructs a new DisplayHardware object +*/ +DisplayHardware::DisplayHardware() { + _type = wippersnapper_display_v1_DisplayType_DISPLAY_TYPE_UNSPECIFIED; +} + +/*! + @brief Destructor +*/ +DisplayHardware::DisplayHardware() { + // TODO: Clean up display drivers +} + +/*! + @brief Sets the hardware's display type. + @param type + The display type to set. +*/ +void DisplayHardware::setType(wippersnapper_display_v1_DisplayType type) { + _type = type; +} + +/*! + @brief Initializes the display hardware. + @param reset + Whether to reset the display hardware. + @return True if initialization was successful, false otherwise. +*/ +bool DisplayHardware::begin(bool reset) { + return true; // Placeholder for actual initialization logic +} + +/*! + @brief Sets the text size for the display. + @param sz + The size of the text to set. +*/ +void setTextSize(uint8_t sz) { + // Placeholder for setting text size on the display TODO +} + diff --git a/src/components/display/hardware.h b/src/components/display/hardware.h new file mode 100644 index 000000000..89994ffd2 --- /dev/null +++ b/src/components/display/hardware.h @@ -0,0 +1,45 @@ +/*! + * @file src/components/display/hardware.h + * + * Hardware interface for display components. + * + * Adafruit invests time and resources providing this open source code, + * please support Adafruit and open-source hardware by purchasing + * products from Adafruit! + * + * Copyright (c) Brent Rubell 2025 for Adafruit Industries. + * + * BSD license, all text here must be included in any redistribution. + * + */ +#ifndef WS_DISPLAY_HARDWARE_H +#define WS_DISPLAY_HARDWARE_H +#include "Wippersnapper.h" + +#include "Adafruit_ThinkInk.h" + +/**************************************************************************/ +/*! + @brief Interface for interacting with display hardware (TFT, eInk, + OLED, etc.) + This class provides methods to initialize, write to, and + manage the state of display hardware. +*/ +/**************************************************************************/ +class DisplayHardware { +public: + DisplayHardware(); + ~DisplayHardware(); + // High-level API functions + void setType(wippersnapper_display_v1_DisplayType type); + bool begin(bool reset = true); + // API functions to abstract Adafruit_GFX + void setTextSize(uint8_t sz); + + private: + wippersnapper_display_v1_DisplayType _type; ///< Display type + // TODO: Make these drivers instead? + ThinkInk_290_Grayscale4_EAAMFGN *disp_thinkink_grayscale4_eaamfgn = nullptr; //< 2025 MagTag with SSD1680Z chipset + ThinkInk_290_Grayscale4_T5 *disp_thinkink_grayscale4_t5 = nullptr; ///< Pre-2025 MagTag with IL0373 chipset +}; +#endif // WS_DISPLAY_HARDWARE_H \ No newline at end of file diff --git a/src/provisioning/sdcard/ws_sdcard.cpp b/src/provisioning/sdcard/ws_sdcard.cpp new file mode 100644 index 000000000..e69de29bb diff --git a/src/provisioning/sdcard/ws_sdcard.h b/src/provisioning/sdcard/ws_sdcard.h new file mode 100644 index 000000000..e69de29bb From 14ef634f1f1f0a271dcadf583b3ad1520db3da8d Mon Sep 17 00:00:00 2001 From: brentru Date: Fri, 15 Aug 2025 12:08:41 -0400 Subject: [PATCH 05/23] Update for Protobuf 23abc52..c83b680 --- .../description/v1/description.pb.c | 2 +- .../description/v1/description.pb.h | 2 +- src/wippersnapper/display/v1/display.pb.c | 3 +- src/wippersnapper/display/v1/display.pb.h | 60 ++++++++++++------- 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 | 4 +- src/wippersnapper/uart/v1/uart.pb.c | 2 +- src/wippersnapper/uart/v1/uart.pb.h | 2 +- 20 files changed, 61 insertions(+), 40 deletions(-) diff --git a/src/wippersnapper/description/v1/description.pb.c b/src/wippersnapper/description/v1/description.pb.c index 2cf057a0c..00a457b16 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 Thu Aug 14 20:22:46 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:07:24 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 3e94b59bd..b26b2c85f 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 Thu Aug 14 20:22:46 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:07:24 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 872d142ef..636b38272 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 Thu Aug 14 20:22:46 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:07:24 2025. */ #include "wippersnapper/display/v1/display.pb.h" #if PB_PROTO_HEADER_VERSION != 40 @@ -34,3 +34,4 @@ PB_BIND(wippersnapper_display_v1_DisplayRemoved, wippersnapper_display_v1_Displa + diff --git a/src/wippersnapper/display/v1/display.pb.h b/src/wippersnapper/display/v1/display.pb.h index cccad57f0..a73042ff8 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 Thu Aug 14 20:22:46 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:07:24 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 @@ -35,6 +35,12 @@ typedef enum _wippersnapper_display_v1_EPDColors { wippersnapper_display_v1_EPDColors_EPD_COLORS_YELLOW = 7 } wippersnapper_display_v1_EPDColors; +typedef enum _wippersnapper_display_v1_EPDThinkInkPanel { + wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_UNSPECIFIED = 0, + wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_213_GRAYSCALE4_MFGN = 1, + wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_213_GRAYSCALE4_T5 = 2 +} wippersnapper_display_v1_EPDThinkInkPanel; + /* Struct definitions */ typedef struct _wippersnapper_display_v1_DisplayAddedorReplaced { bool did_add; @@ -50,6 +56,7 @@ typedef struct _wippersnapper_display_v1_DisplayRemoved { typedef struct _wippersnapper_display_v1_EPDConfig { wippersnapper_display_v1_EPDMode mode; + wippersnapper_display_v1_EPDThinkInkPanel panel; int32_t width; int32_t height; char pin_busy[6]; @@ -72,11 +79,15 @@ typedef struct _wippersnapper_display_v1_EpdSpiConfig { typedef struct _wippersnapper_display_v1_DisplayAddOrReplace { wippersnapper_display_v1_DisplayType type; + char name[64]; pb_size_t which_interface_type; union { wippersnapper_display_v1_EpdSpiConfig spi_epd; } interface_type; - char name[6]; + pb_size_t which_config; + union { + wippersnapper_display_v1_EPDConfig epd_config; + } config; } wippersnapper_display_v1_DisplayAddOrReplace; typedef struct _wippersnapper_display_v1_DisplayWrite { @@ -102,6 +113,10 @@ typedef struct _wippersnapper_display_v1_DisplayWrite { #define _wippersnapper_display_v1_EPDColors_MAX wippersnapper_display_v1_EPDColors_EPD_COLORS_YELLOW #define _wippersnapper_display_v1_EPDColors_ARRAYSIZE ((wippersnapper_display_v1_EPDColors)(wippersnapper_display_v1_EPDColors_EPD_COLORS_YELLOW+1)) +#define _wippersnapper_display_v1_EPDThinkInkPanel_MIN wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_UNSPECIFIED +#define _wippersnapper_display_v1_EPDThinkInkPanel_MAX wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_213_GRAYSCALE4_T5 +#define _wippersnapper_display_v1_EPDThinkInkPanel_ARRAYSIZE ((wippersnapper_display_v1_EPDThinkInkPanel)(wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_213_GRAYSCALE4_T5+1)) + #ifdef __cplusplus extern "C" { @@ -109,17 +124,17 @@ extern "C" { /* Initializer values for message structs */ #define wippersnapper_display_v1_EpdSpiConfig_init_default {0, "", "", "", "", ""} -#define wippersnapper_display_v1_EPDConfig_init_default {_wippersnapper_display_v1_EPDMode_MIN, 0, 0, "", ""} +#define wippersnapper_display_v1_EPDConfig_init_default {_wippersnapper_display_v1_EPDMode_MIN, _wippersnapper_display_v1_EPDThinkInkPanel_MIN, 0, 0, "", ""} #define wippersnapper_display_v1_EPDWriteOptions_init_default {0, _wippersnapper_display_v1_EPDColors_MIN} -#define wippersnapper_display_v1_DisplayAddOrReplace_init_default {_wippersnapper_display_v1_DisplayType_MIN, 0, {wippersnapper_display_v1_EpdSpiConfig_init_default}, ""} +#define wippersnapper_display_v1_DisplayAddOrReplace_init_default {_wippersnapper_display_v1_DisplayType_MIN, "", 0, {wippersnapper_display_v1_EpdSpiConfig_init_default}, 0, {wippersnapper_display_v1_EPDConfig_init_default}} #define wippersnapper_display_v1_DisplayRemove_init_default {""} #define wippersnapper_display_v1_DisplayWrite_init_default {"", "", 0, {wippersnapper_display_v1_EPDWriteOptions_init_default}} #define wippersnapper_display_v1_DisplayAddedorReplaced_init_default {0} #define wippersnapper_display_v1_DisplayRemoved_init_default {0} #define wippersnapper_display_v1_EpdSpiConfig_init_zero {0, "", "", "", "", ""} -#define wippersnapper_display_v1_EPDConfig_init_zero {_wippersnapper_display_v1_EPDMode_MIN, 0, 0, "", ""} +#define wippersnapper_display_v1_EPDConfig_init_zero {_wippersnapper_display_v1_EPDMode_MIN, _wippersnapper_display_v1_EPDThinkInkPanel_MIN, 0, 0, "", ""} #define wippersnapper_display_v1_EPDWriteOptions_init_zero {0, _wippersnapper_display_v1_EPDColors_MIN} -#define wippersnapper_display_v1_DisplayAddOrReplace_init_zero {_wippersnapper_display_v1_DisplayType_MIN, 0, {wippersnapper_display_v1_EpdSpiConfig_init_zero}, ""} +#define wippersnapper_display_v1_DisplayAddOrReplace_init_zero {_wippersnapper_display_v1_DisplayType_MIN, "", 0, {wippersnapper_display_v1_EpdSpiConfig_init_zero}, 0, {wippersnapper_display_v1_EPDConfig_init_zero}} #define wippersnapper_display_v1_DisplayRemove_init_zero {""} #define wippersnapper_display_v1_DisplayWrite_init_zero {"", "", 0, {wippersnapper_display_v1_EPDWriteOptions_init_zero}} #define wippersnapper_display_v1_DisplayAddedorReplaced_init_zero {0} @@ -130,10 +145,11 @@ extern "C" { #define wippersnapper_display_v1_DisplayRemove_name_tag 1 #define wippersnapper_display_v1_DisplayRemoved_did_remove_tag 1 #define wippersnapper_display_v1_EPDConfig_mode_tag 1 -#define wippersnapper_display_v1_EPDConfig_width_tag 2 -#define wippersnapper_display_v1_EPDConfig_height_tag 3 -#define wippersnapper_display_v1_EPDConfig_pin_busy_tag 4 -#define wippersnapper_display_v1_EPDConfig_pin_reset_tag 5 +#define wippersnapper_display_v1_EPDConfig_panel_tag 2 +#define wippersnapper_display_v1_EPDConfig_width_tag 3 +#define wippersnapper_display_v1_EPDConfig_height_tag 4 +#define wippersnapper_display_v1_EPDConfig_pin_busy_tag 5 +#define wippersnapper_display_v1_EPDConfig_pin_reset_tag 6 #define wippersnapper_display_v1_EPDWriteOptions_text_size_tag 1 #define wippersnapper_display_v1_EPDWriteOptions_color_tag 2 #define wippersnapper_display_v1_EpdSpiConfig_bus_tag 1 @@ -143,8 +159,9 @@ extern "C" { #define wippersnapper_display_v1_EpdSpiConfig_pin_sram_cs_tag 5 #define wippersnapper_display_v1_EpdSpiConfig_pin_busy_tag 6 #define wippersnapper_display_v1_DisplayAddOrReplace_type_tag 1 -#define wippersnapper_display_v1_DisplayAddOrReplace_spi_epd_tag 2 -#define wippersnapper_display_v1_DisplayAddOrReplace_name_tag 3 +#define wippersnapper_display_v1_DisplayAddOrReplace_name_tag 2 +#define wippersnapper_display_v1_DisplayAddOrReplace_spi_epd_tag 3 +#define wippersnapper_display_v1_DisplayAddOrReplace_epd_config_tag 4 #define wippersnapper_display_v1_DisplayWrite_name_tag 1 #define wippersnapper_display_v1_DisplayWrite_message_tag 2 #define wippersnapper_display_v1_DisplayWrite_epd_options_tag 3 @@ -162,10 +179,11 @@ X(a, STATIC, SINGULAR, STRING, pin_busy, 6) #define wippersnapper_display_v1_EPDConfig_FIELDLIST(X, a) \ X(a, STATIC, SINGULAR, UENUM, mode, 1) \ -X(a, STATIC, SINGULAR, INT32, width, 2) \ -X(a, STATIC, SINGULAR, INT32, height, 3) \ -X(a, STATIC, SINGULAR, STRING, pin_busy, 4) \ -X(a, STATIC, SINGULAR, STRING, pin_reset, 5) +X(a, STATIC, SINGULAR, UENUM, panel, 2) \ +X(a, STATIC, SINGULAR, INT32, width, 3) \ +X(a, STATIC, SINGULAR, INT32, height, 4) \ +X(a, STATIC, SINGULAR, STRING, pin_busy, 5) \ +X(a, STATIC, SINGULAR, STRING, pin_reset, 6) #define wippersnapper_display_v1_EPDConfig_CALLBACK NULL #define wippersnapper_display_v1_EPDConfig_DEFAULT NULL @@ -177,11 +195,13 @@ X(a, STATIC, SINGULAR, UENUM, color, 2) #define wippersnapper_display_v1_DisplayAddOrReplace_FIELDLIST(X, a) \ X(a, STATIC, SINGULAR, UENUM, type, 1) \ -X(a, STATIC, ONEOF, MESSAGE, (interface_type,spi_epd,interface_type.spi_epd), 2) \ -X(a, STATIC, SINGULAR, STRING, name, 3) +X(a, STATIC, SINGULAR, STRING, name, 2) \ +X(a, STATIC, ONEOF, MESSAGE, (interface_type,spi_epd,interface_type.spi_epd), 3) \ +X(a, STATIC, ONEOF, MESSAGE, (config,epd_config,config.epd_config), 4) #define wippersnapper_display_v1_DisplayAddOrReplace_CALLBACK NULL #define wippersnapper_display_v1_DisplayAddOrReplace_DEFAULT NULL #define wippersnapper_display_v1_DisplayAddOrReplace_interface_type_spi_epd_MSGTYPE wippersnapper_display_v1_EpdSpiConfig +#define wippersnapper_display_v1_DisplayAddOrReplace_config_epd_config_MSGTYPE wippersnapper_display_v1_EPDConfig #define wippersnapper_display_v1_DisplayRemove_FIELDLIST(X, a) \ X(a, STATIC, SINGULAR, STRING, name, 1) @@ -227,9 +247,9 @@ extern const pb_msgdesc_t wippersnapper_display_v1_DisplayRemoved_msg; /* Maximum encoded size of messages (where known) */ #define wippersnapper_display_v1_EpdSpiConfig_size 46 -#define wippersnapper_display_v1_EPDConfig_size 38 +#define wippersnapper_display_v1_EPDConfig_size 40 #define wippersnapper_display_v1_EPDWriteOptions_size 13 -#define wippersnapper_display_v1_DisplayAddOrReplace_size 57 +#define wippersnapper_display_v1_DisplayAddOrReplace_size 157 #define wippersnapper_display_v1_DisplayRemove_size 7 #define wippersnapper_display_v1_DisplayWrite_size 29 #define wippersnapper_display_v1_DisplayAddedorReplaced_size 2 diff --git a/src/wippersnapper/ds18x20/v1/ds18x20.pb.c b/src/wippersnapper/ds18x20/v1/ds18x20.pb.c index 1eba2203a..69d2a9627 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 Thu Aug 14 20:22:46 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:07:24 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 6b5266136..fe2b557a2 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 Thu Aug 14 20:22:46 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:07:24 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 bc76391b7..b8c944c9d 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 Thu Aug 14 20:22:46 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:07:24 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 2e0526c92..9c0ddf942 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 Thu Aug 14 20:22:46 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:07:24 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 6cf3925d0..9df314c41 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 Thu Aug 14 20:22:46 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:07:24 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 7137f1c3a..25ae1aff9 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 Thu Aug 14 20:22:46 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:07:24 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 9eeaef7dd..5da0e72c1 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 Thu Aug 14 20:22:46 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:07:24 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 0ea96b211..4a10ef6e2 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 Thu Aug 14 20:22:46 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:07:24 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 3526dbec3..eb42b3324 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 Thu Aug 14 20:22:46 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:07:24 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 07a46bfc7..daa06cd46 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 Thu Aug 14 20:22:46 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:07:24 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 b951a904b..42d6b0da8 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 Thu Aug 14 20:22:46 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:07:24 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 21fd141e9..7560a3b05 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 Thu Aug 14 20:22:46 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:07:24 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 357005718..c7ad0bacf 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 Thu Aug 14 20:22:46 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:07:24 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 f07792306..9f81099bb 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 Thu Aug 14 20:22:46 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:07:24 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 @@ -463,7 +463,7 @@ union wippersnapper_signal_v1_CreateSignalRequest_payload_size_union {char f6[(6 #define wippersnapper_signal_v1_SignalResponse_size 2 #define wippersnapper_signal_v1_PWMRequest_size 82 #define wippersnapper_signal_v1_PWMResponse_size 11 -#define wippersnapper_signal_v1_DisplayRequest_size 59 +#define wippersnapper_signal_v1_DisplayRequest_size 160 #define wippersnapper_signal_v1_DisplayResponse_size 4 #ifdef __cplusplus diff --git a/src/wippersnapper/uart/v1/uart.pb.c b/src/wippersnapper/uart/v1/uart.pb.c index f80b3897b..5caf0a28a 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 Thu Aug 14 20:22:46 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:07:24 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 b51fbcb8e..a0e91a1a3 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 Thu Aug 14 20:22:46 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:07:24 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 c308694233605f51d6a82cf0078bab823e1e245f Mon Sep 17 00:00:00 2001 From: brentru Date: Fri, 15 Aug 2025 12:32:32 -0400 Subject: [PATCH 06/23] Routing epd begin thru --- src/components/display/controller.cpp | 5 +- src/components/display/hardware.cpp | 49 +++++++++++++++++++ src/components/display/hardware.h | 6 ++- .../description/v1/description.pb.c | 2 +- .../description/v1/description.pb.h | 2 +- src/wippersnapper/display/v1/display.pb.c | 2 +- src/wippersnapper/display/v1/display.pb.h | 18 +++---- 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 | 4 +- src/wippersnapper/uart/v1/uart.pb.c | 2 +- src/wippersnapper/uart/v1/uart.pb.h | 2 +- 23 files changed, 83 insertions(+), 35 deletions(-) diff --git a/src/components/display/controller.cpp b/src/components/display/controller.cpp index 4790fa923..06b6e72eb 100644 --- a/src/components/display/controller.cpp +++ b/src/components/display/controller.cpp @@ -32,6 +32,9 @@ bool DisplayController::Handle_Display_AddOrReplace(wippersnapper_display_v1_Dis DisplayHardware *display = new DisplayHardware(); // Configure display type display->setType(msgAdd->type); - + // Configure display based on config type + if (msgAdd->which_config == wippersnapper_display_v1_DisplayAddOrReplace_epd_config_tag) { + display->configureEPD(&msgAdd->config.epd_config, &msgAdd->interface_type.spi_epd); + } return true; // Placeholder } diff --git a/src/components/display/hardware.cpp b/src/components/display/hardware.cpp index 254e52da8..fadeaa63d 100644 --- a/src/components/display/hardware.cpp +++ b/src/components/display/hardware.cpp @@ -37,6 +37,55 @@ void DisplayHardware::setType(wippersnapper_display_v1_DisplayType type) { _type = type; } +/*! + @brief Gets the hardware's display type. + @return The current display type. +*/ +wippersnapper_display_v1_DisplayType DisplayHardware::getType() { + return _type; +} + +/*! + @brief Configures the EPD display with the provided configuration. + @param config + Pointer to the EPD configuration structure. + @param spi_config + Pointer to the SPI configuration structure for EPD. + @return True if configuration was successful, False otherwise. +*/ +bool DisplayHardware::beginEPD(wippersnapper_display_v1_EPDConfig *config, wippersnapper_display_v1_EpdSpiConfig *spi_config) { + // Convert pins in config to int16_t instances + int16_t dc = -1, rst = -1, cs = -1, srcs = -1, busy = -1; + dc = (int16_t)atoi(spi_config->pin_dc+ 1); + rst = (int16_t)atoi(spi_config->pin_rst+ 1); + cs = (int16_t)atoi(spi_config->pin_cs+ 1); + srcs = (int16_t)atoi(spi_config->pin_sram_cs+ 1); + busy = (int16_t)atoi(spi_config->pin_busy+ 1); + + // Configure EPD mode + thinkinkmode_t epd_mode; + if (config->mode == wippersnapper_display_v1_EPDMode_EPD_MODE_GRAYSCALE4) { + epd_mode = THINKINK_GRAYSCALE4; + } else if (config->mode == wippersnapper_display_v1_EPDMode_EPD_MODE_MONO) { + epd_mode = THINKINK_MONO; + } else { + epd_mode = THINKINK_MONO; // Default to mono + } + + // Assign driver instance based on panel type + if (config->panel == wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_213_GRAYSCALE4_MFGN) { + _disp_thinkink_grayscale4_eaamfgn = new ThinkInk_290_Grayscale4_EAAMFGN(dc, rst, cs, srcs, busy); + _disp_thinkink_grayscale4_eaamfgn->begin(epd_mode); + } else if (config->panel == wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_213_GRAYSCALE4_T5) { + _disp_thinkink_grayscale4_t5 = new ThinkInk_290_Grayscale4_T5(dc, rst, cs, srcs, busy); + _disp_thinkink_grayscale4_t5->begin(epd_mode); + } else { + return false; // Unsupported panel type + } + + return true; // Configuration successful +} + /*! @brief Initializes the display hardware. @param reset diff --git a/src/components/display/hardware.h b/src/components/display/hardware.h index 89994ffd2..815f8380b 100644 --- a/src/components/display/hardware.h +++ b/src/components/display/hardware.h @@ -32,6 +32,8 @@ class DisplayHardware { ~DisplayHardware(); // High-level API functions void setType(wippersnapper_display_v1_DisplayType type); + wippersnapper_display_v1_DisplayType getType(); + void beginEPD(wippersnapper_display_v1_EPDConfig *config, wippersnapper_display_v1_EpdSpiConfig *spi_config); bool begin(bool reset = true); // API functions to abstract Adafruit_GFX void setTextSize(uint8_t sz); @@ -39,7 +41,7 @@ class DisplayHardware { private: wippersnapper_display_v1_DisplayType _type; ///< Display type // TODO: Make these drivers instead? - ThinkInk_290_Grayscale4_EAAMFGN *disp_thinkink_grayscale4_eaamfgn = nullptr; //< 2025 MagTag with SSD1680Z chipset - ThinkInk_290_Grayscale4_T5 *disp_thinkink_grayscale4_t5 = nullptr; ///< Pre-2025 MagTag with IL0373 chipset + ThinkInk_290_Grayscale4_EAAMFGN *_disp_thinkink_grayscale4_eaamfgn = nullptr; //< 2025 MagTag with SSD1680Z chipset + ThinkInk_290_Grayscale4_T5 *_disp_thinkink_grayscale4_t5 = nullptr; ///< Pre-2025 MagTag with IL0373 chipset }; #endif // WS_DISPLAY_HARDWARE_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 00a457b16..d325e1ea2 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 Fri Aug 15 16:07:24 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:18:27 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 b26b2c85f..357aeabe4 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 Fri Aug 15 16:07:24 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:18:27 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 636b38272..257c9ea07 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 Fri Aug 15 16:07:24 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:18:27 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 a73042ff8..aeefbbcb5 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 Fri Aug 15 16:07:24 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:18:27 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 @@ -59,8 +59,6 @@ typedef struct _wippersnapper_display_v1_EPDConfig { wippersnapper_display_v1_EPDThinkInkPanel panel; int32_t width; int32_t height; - char pin_busy[6]; - char pin_reset[6]; } wippersnapper_display_v1_EPDConfig; typedef struct _wippersnapper_display_v1_EPDWriteOptions { @@ -124,7 +122,7 @@ extern "C" { /* Initializer values for message structs */ #define wippersnapper_display_v1_EpdSpiConfig_init_default {0, "", "", "", "", ""} -#define wippersnapper_display_v1_EPDConfig_init_default {_wippersnapper_display_v1_EPDMode_MIN, _wippersnapper_display_v1_EPDThinkInkPanel_MIN, 0, 0, "", ""} +#define wippersnapper_display_v1_EPDConfig_init_default {_wippersnapper_display_v1_EPDMode_MIN, _wippersnapper_display_v1_EPDThinkInkPanel_MIN, 0, 0} #define wippersnapper_display_v1_EPDWriteOptions_init_default {0, _wippersnapper_display_v1_EPDColors_MIN} #define wippersnapper_display_v1_DisplayAddOrReplace_init_default {_wippersnapper_display_v1_DisplayType_MIN, "", 0, {wippersnapper_display_v1_EpdSpiConfig_init_default}, 0, {wippersnapper_display_v1_EPDConfig_init_default}} #define wippersnapper_display_v1_DisplayRemove_init_default {""} @@ -132,7 +130,7 @@ extern "C" { #define wippersnapper_display_v1_DisplayAddedorReplaced_init_default {0} #define wippersnapper_display_v1_DisplayRemoved_init_default {0} #define wippersnapper_display_v1_EpdSpiConfig_init_zero {0, "", "", "", "", ""} -#define wippersnapper_display_v1_EPDConfig_init_zero {_wippersnapper_display_v1_EPDMode_MIN, _wippersnapper_display_v1_EPDThinkInkPanel_MIN, 0, 0, "", ""} +#define wippersnapper_display_v1_EPDConfig_init_zero {_wippersnapper_display_v1_EPDMode_MIN, _wippersnapper_display_v1_EPDThinkInkPanel_MIN, 0, 0} #define wippersnapper_display_v1_EPDWriteOptions_init_zero {0, _wippersnapper_display_v1_EPDColors_MIN} #define wippersnapper_display_v1_DisplayAddOrReplace_init_zero {_wippersnapper_display_v1_DisplayType_MIN, "", 0, {wippersnapper_display_v1_EpdSpiConfig_init_zero}, 0, {wippersnapper_display_v1_EPDConfig_init_zero}} #define wippersnapper_display_v1_DisplayRemove_init_zero {""} @@ -148,8 +146,6 @@ extern "C" { #define wippersnapper_display_v1_EPDConfig_panel_tag 2 #define wippersnapper_display_v1_EPDConfig_width_tag 3 #define wippersnapper_display_v1_EPDConfig_height_tag 4 -#define wippersnapper_display_v1_EPDConfig_pin_busy_tag 5 -#define wippersnapper_display_v1_EPDConfig_pin_reset_tag 6 #define wippersnapper_display_v1_EPDWriteOptions_text_size_tag 1 #define wippersnapper_display_v1_EPDWriteOptions_color_tag 2 #define wippersnapper_display_v1_EpdSpiConfig_bus_tag 1 @@ -181,9 +177,7 @@ X(a, STATIC, SINGULAR, STRING, pin_busy, 6) X(a, STATIC, SINGULAR, UENUM, mode, 1) \ X(a, STATIC, SINGULAR, UENUM, panel, 2) \ X(a, STATIC, SINGULAR, INT32, width, 3) \ -X(a, STATIC, SINGULAR, INT32, height, 4) \ -X(a, STATIC, SINGULAR, STRING, pin_busy, 5) \ -X(a, STATIC, SINGULAR, STRING, pin_reset, 6) +X(a, STATIC, SINGULAR, INT32, height, 4) #define wippersnapper_display_v1_EPDConfig_CALLBACK NULL #define wippersnapper_display_v1_EPDConfig_DEFAULT NULL @@ -247,9 +241,9 @@ extern const pb_msgdesc_t wippersnapper_display_v1_DisplayRemoved_msg; /* Maximum encoded size of messages (where known) */ #define wippersnapper_display_v1_EpdSpiConfig_size 46 -#define wippersnapper_display_v1_EPDConfig_size 40 +#define wippersnapper_display_v1_EPDConfig_size 26 #define wippersnapper_display_v1_EPDWriteOptions_size 13 -#define wippersnapper_display_v1_DisplayAddOrReplace_size 157 +#define wippersnapper_display_v1_DisplayAddOrReplace_size 143 #define wippersnapper_display_v1_DisplayRemove_size 7 #define wippersnapper_display_v1_DisplayWrite_size 29 #define wippersnapper_display_v1_DisplayAddedorReplaced_size 2 diff --git a/src/wippersnapper/ds18x20/v1/ds18x20.pb.c b/src/wippersnapper/ds18x20/v1/ds18x20.pb.c index 69d2a9627..947c8dddb 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 Fri Aug 15 16:07:24 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:18:27 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 fe2b557a2..6aa008171 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 Fri Aug 15 16:07:24 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:18:27 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 b8c944c9d..94777ff2a 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 Fri Aug 15 16:07:24 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:18:27 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 9c0ddf942..64a591c47 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 Fri Aug 15 16:07:24 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:18:27 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 9df314c41..60f3b3283 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 Fri Aug 15 16:07:24 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:18:27 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 25ae1aff9..5de5a10f4 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 Fri Aug 15 16:07:24 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:18:27 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 5da0e72c1..c1e20312a 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 Fri Aug 15 16:07:24 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:18:27 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 4a10ef6e2..f2c080b00 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 Fri Aug 15 16:07:24 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:18:27 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 eb42b3324..ad194786d 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 Fri Aug 15 16:07:24 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:18:27 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 daa06cd46..8877acde9 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 Fri Aug 15 16:07:24 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:18:27 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 42d6b0da8..2ae848799 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 Fri Aug 15 16:07:24 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:18:27 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 7560a3b05..0b5851d99 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 Fri Aug 15 16:07:24 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:18:27 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 c7ad0bacf..bf4939539 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 Fri Aug 15 16:07:24 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:18:27 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 9f81099bb..2f214bca7 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 Fri Aug 15 16:07:24 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:18:27 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 @@ -463,7 +463,7 @@ union wippersnapper_signal_v1_CreateSignalRequest_payload_size_union {char f6[(6 #define wippersnapper_signal_v1_SignalResponse_size 2 #define wippersnapper_signal_v1_PWMRequest_size 82 #define wippersnapper_signal_v1_PWMResponse_size 11 -#define wippersnapper_signal_v1_DisplayRequest_size 160 +#define wippersnapper_signal_v1_DisplayRequest_size 146 #define wippersnapper_signal_v1_DisplayResponse_size 4 #ifdef __cplusplus diff --git a/src/wippersnapper/uart/v1/uart.pb.c b/src/wippersnapper/uart/v1/uart.pb.c index 5caf0a28a..512c97769 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 Fri Aug 15 16:07:24 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:18:27 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 a0e91a1a3..9cf2ac479 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 Fri Aug 15 16:07:24 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 16:18:27 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 fc41a7de828cf124c1aa85ef8e609abbeeedb481 Mon Sep 17 00:00:00 2001 From: brentru Date: Fri, 15 Aug 2025 13:41:36 -0400 Subject: [PATCH 07/23] Add beginEPD full implementation with safety concerns and a better init flow --- .vscode/settings.json | 13 +- src/components/display/hardware.cpp | 140 +++++++++++++----- src/components/display/hardware.h | 17 ++- .../description/v1/description.pb.c | 2 +- .../description/v1/description.pb.h | 2 +- src/wippersnapper/display/v1/display.pb.c | 2 +- src/wippersnapper/display/v1/display.pb.h | 10 +- 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 +- 23 files changed, 151 insertions(+), 67 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 12d7d847e..9356a4952 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,7 +1,18 @@ { "files.associations": { "limits": "c", - "type_traits": "c" + "type_traits": "c", + "array": "cpp", + "deque": "cpp", + "list": "cpp", + "string": "cpp", + "unordered_map": "cpp", + "unordered_set": "cpp", + "vector": "cpp", + "string_view": "cpp", + "format": "cpp", + "initializer_list": "cpp", + "span": "cpp" }, "C_Cpp.dimInactiveRegions": true, "dotnet.defaultSolution": "disable", diff --git a/src/components/display/hardware.cpp b/src/components/display/hardware.cpp index fadeaa63d..c8a4a58c6 100644 --- a/src/components/display/hardware.cpp +++ b/src/components/display/hardware.cpp @@ -34,7 +34,7 @@ DisplayHardware::DisplayHardware() { The display type to set. */ void DisplayHardware::setType(wippersnapper_display_v1_DisplayType type) { - _type = type; + _type = type; } /*! @@ -42,7 +42,7 @@ void DisplayHardware::setType(wippersnapper_display_v1_DisplayType type) { @return The current display type. */ wippersnapper_display_v1_DisplayType DisplayHardware::getType() { - return _type; + return _type; } /*! @@ -53,37 +53,106 @@ wippersnapper_display_v1_DisplayType DisplayHardware::getType() { Pointer to the SPI configuration structure for EPD. @return True if configuration was successful, False otherwise. */ -bool DisplayHardware::beginEPD(wippersnapper_display_v1_EPDConfig *config, wippersnapper_display_v1_EpdSpiConfig *spi_config) { - // Convert pins in config to int16_t instances - int16_t dc = -1, rst = -1, cs = -1, srcs = -1, busy = -1; - dc = (int16_t)atoi(spi_config->pin_dc+ 1); - rst = (int16_t)atoi(spi_config->pin_rst+ 1); - cs = (int16_t)atoi(spi_config->pin_cs+ 1); - srcs = (int16_t)atoi(spi_config->pin_sram_cs+ 1); - busy = (int16_t)atoi(spi_config->pin_busy+ 1); - - // Configure EPD mode - thinkinkmode_t epd_mode; - if (config->mode == wippersnapper_display_v1_EPDMode_EPD_MODE_GRAYSCALE4) { - epd_mode = THINKINK_GRAYSCALE4; - } else if (config->mode == wippersnapper_display_v1_EPDMode_EPD_MODE_MONO) { - epd_mode = THINKINK_MONO; - } else { - epd_mode = THINKINK_MONO; // Default to mono - } - - // Assign driver instance based on panel type - if (config->panel == wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_213_GRAYSCALE4_MFGN) { - _disp_thinkink_grayscale4_eaamfgn = new ThinkInk_290_Grayscale4_EAAMFGN(dc, rst, cs, srcs, busy); - _disp_thinkink_grayscale4_eaamfgn->begin(epd_mode); - } else if (config->panel == wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_213_GRAYSCALE4_T5) { - _disp_thinkink_grayscale4_t5 = new ThinkInk_290_Grayscale4_T5(dc, rst, cs, srcs, busy); - _disp_thinkink_grayscale4_t5->begin(epd_mode); - } else { - return false; // Unsupported panel type - } - - return true; // Configuration successful +bool DisplayHardware::beginEPD( + wippersnapper_display_v1_EPDConfig *config, + wippersnapper_display_v1_EpdSpiConfig *spi_config) { + // Validate pointers + if (config == nullptr || spi_config == nullptr) { + return false; + } + + // Validate panel type + if (config->panel == + wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_UNSPECIFIED) { + return false; // Unsupported panel type + } + + // Validate mode is a correct EPD mode + if (config->mode == wippersnapper_display_v1_EPDMode_EPD_MODE_UNSPECIFIED) { + return false; // Unsupported mode + } + + // If we already have a display driver assigned to this hardware instance, + // clean it up! + if (_thinkink_driver == + wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_290_GRAYSCALE4_MFGN) { + delete _disp_thinkink_grayscale4_eaamfgn; + _disp_thinkink_grayscale4_eaamfgn = nullptr; + _thinkink_driver = + wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_UNSPECIFIED; + } else if ( + _thinkink_driver == + wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_290_GRAYSCALE4_T5) { + delete _disp_thinkink_grayscale4_t5; + _disp_thinkink_grayscale4_t5 = nullptr; + _thinkink_driver = + wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_UNSPECIFIED; + } + + // Parse all SPI bus pins + // Check length + if (strlen(spi_config->pin_dc) < 2 || strlen(spi_config->pin_rst) < 2 || + strlen(spi_config->pin_cs) < 2) { + return false; + } + // SPI pins must start with 'D' + if (spi_config->pin_dc[0] != 'D' || spi_config->pin_rst[0] != 'D' || + spi_config->pin_cs[0] != 'D') { + return false; + } + + // Parse and assign pins + int16_t srcs = -1, busy = -1; + int16_t dc = (int16_t)atoi(spi_config->pin_dc + 1); + int16_t rst = (int16_t)atoi(spi_config->pin_rst + 1); + int16_t cs = (int16_t)atoi(spi_config->pin_cs + 1); + + // Optionally parse SRAM CS and BUSY pins + if (strlen(spi_config->pin_sram_cs) >= 2 && + spi_config->pin_sram_cs[0] == 'D') { + srcs = (int16_t)atoi(spi_config->pin_sram_cs + 1); + } + if (strlen(spi_config->pin_busy) >= 2 && spi_config->pin_busy[0] == 'D') { + busy = (int16_t)atoi(spi_config->pin_busy + 1); + } + + // TODO: Configure SPI bus selection (UNUSED AS OF RIGHT NOW) + + // Configure EPD mode + thinkinkmode_t epd_mode; + if (config->mode == wippersnapper_display_v1_EPDMode_EPD_MODE_GRAYSCALE4) { + epd_mode = THINKINK_GRAYSCALE4; + } else if (config->mode == wippersnapper_display_v1_EPDMode_EPD_MODE_MONO) { + epd_mode = THINKINK_MONO; + } + + // Assign driver instance based on panel type + if (config->panel == + wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_290_GRAYSCALE4_MFGN) { + _disp_thinkink_grayscale4_eaamfgn = + new ThinkInk_290_Grayscale4_EAAMFGN(dc, rst, cs, srcs, busy); + if (!_disp_thinkink_grayscale4_eaamfgn) + return false; // Allocation failed + // Initialize the display + _disp_thinkink_grayscale4_eaamfgn->begin(epd_mode); + _thinkink_driver = + wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_290_GRAYSCALE4_MFGN; + } else if ( + config->panel == + wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_290_GRAYSCALE4_T5) { + _disp_thinkink_grayscale4_t5 = + new ThinkInk_290_Grayscale4_T5(dc, rst, cs, srcs, busy); + if (!_disp_thinkink_grayscale4_t5) + return false; // Allocation failed + // Initialize the display + _disp_thinkink_grayscale4_t5->begin(epd_mode); + _thinkink_driver = + wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_290_GRAYSCALE4_T5; + } else { + return false; // Unsupported panel type + } + + return true; // Configuration successful } /*! @@ -93,7 +162,7 @@ bool DisplayHardware::beginEPD(wippersnapper_display_v1_EPDConfig *config, wippe @return True if initialization was successful, false otherwise. */ bool DisplayHardware::begin(bool reset) { - return true; // Placeholder for actual initialization logic + return true; // Placeholder for actual initialization logic } /*! @@ -102,6 +171,5 @@ bool DisplayHardware::begin(bool reset) { The size of the text to set. */ void setTextSize(uint8_t sz) { - // Placeholder for setting text size on the display TODO + // Placeholder for setting text size on the display TODO } - diff --git a/src/components/display/hardware.h b/src/components/display/hardware.h index 815f8380b..b4fef854e 100644 --- a/src/components/display/hardware.h +++ b/src/components/display/hardware.h @@ -33,15 +33,20 @@ class DisplayHardware { // High-level API functions void setType(wippersnapper_display_v1_DisplayType type); wippersnapper_display_v1_DisplayType getType(); - void beginEPD(wippersnapper_display_v1_EPDConfig *config, wippersnapper_display_v1_EpdSpiConfig *spi_config); + void beginEPD(wippersnapper_display_v1_EPDConfig *config, + wippersnapper_display_v1_EpdSpiConfig *spi_config); bool begin(bool reset = true); // API functions to abstract Adafruit_GFX void setTextSize(uint8_t sz); - private: - wippersnapper_display_v1_DisplayType _type; ///< Display type - // TODO: Make these drivers instead? - ThinkInk_290_Grayscale4_EAAMFGN *_disp_thinkink_grayscale4_eaamfgn = nullptr; //< 2025 MagTag with SSD1680Z chipset - ThinkInk_290_Grayscale4_T5 *_disp_thinkink_grayscale4_t5 = nullptr; ///< Pre-2025 MagTag with IL0373 chipset +private: + wippersnapper_display_v1_DisplayType _type; ///< Display type + wippersnapper_display_v1_EPDThinkInkPanel + _thinkink_driver; ///< ThinkInk driver type + // TODO: Make these drivers instead? + ThinkInk_290_Grayscale4_EAAMFGN *_disp_thinkink_grayscale4_eaamfgn = + nullptr; //< 2025 MagTag with SSD1680Z chipset + ThinkInk_290_Grayscale4_T5 *_disp_thinkink_grayscale4_t5 = + nullptr; ///< Pre-2025 MagTag with IL0373 chipset }; #endif // WS_DISPLAY_HARDWARE_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 d325e1ea2..b0f15a4ad 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 Fri Aug 15 16:18:27 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 17:34:50 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 357aeabe4..c74878946 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 Fri Aug 15 16:18:27 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 17:34:50 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 257c9ea07..e0ced97b2 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 Fri Aug 15 16:18:27 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 17:34:50 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 aeefbbcb5..fb19c2f75 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 Fri Aug 15 16:18:27 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 17:34:50 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 @@ -37,8 +37,8 @@ typedef enum _wippersnapper_display_v1_EPDColors { typedef enum _wippersnapper_display_v1_EPDThinkInkPanel { wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_UNSPECIFIED = 0, - wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_213_GRAYSCALE4_MFGN = 1, - wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_213_GRAYSCALE4_T5 = 2 + wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_290_GRAYSCALE4_MFGN = 1, + wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_290_GRAYSCALE4_T5 = 2 } wippersnapper_display_v1_EPDThinkInkPanel; /* Struct definitions */ @@ -112,8 +112,8 @@ typedef struct _wippersnapper_display_v1_DisplayWrite { #define _wippersnapper_display_v1_EPDColors_ARRAYSIZE ((wippersnapper_display_v1_EPDColors)(wippersnapper_display_v1_EPDColors_EPD_COLORS_YELLOW+1)) #define _wippersnapper_display_v1_EPDThinkInkPanel_MIN wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_UNSPECIFIED -#define _wippersnapper_display_v1_EPDThinkInkPanel_MAX wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_213_GRAYSCALE4_T5 -#define _wippersnapper_display_v1_EPDThinkInkPanel_ARRAYSIZE ((wippersnapper_display_v1_EPDThinkInkPanel)(wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_213_GRAYSCALE4_T5+1)) +#define _wippersnapper_display_v1_EPDThinkInkPanel_MAX wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_290_GRAYSCALE4_T5 +#define _wippersnapper_display_v1_EPDThinkInkPanel_ARRAYSIZE ((wippersnapper_display_v1_EPDThinkInkPanel)(wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_290_GRAYSCALE4_T5+1)) #ifdef __cplusplus diff --git a/src/wippersnapper/ds18x20/v1/ds18x20.pb.c b/src/wippersnapper/ds18x20/v1/ds18x20.pb.c index 947c8dddb..982aa0c74 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 Fri Aug 15 16:18:27 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 17:34:50 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 6aa008171..832684805 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 Fri Aug 15 16:18:27 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 17:34:50 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 94777ff2a..4e0b0d556 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 Fri Aug 15 16:18:27 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 17:34:50 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 64a591c47..bb436342e 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 Fri Aug 15 16:18:27 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 17:34:50 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 60f3b3283..b36c39da6 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 Fri Aug 15 16:18:27 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 17:34:50 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 5de5a10f4..a43271502 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 Fri Aug 15 16:18:27 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 17:34:50 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 c1e20312a..ab8eea0ea 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 Fri Aug 15 16:18:27 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 17:34:50 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 f2c080b00..0185e165f 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 Fri Aug 15 16:18:27 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 17:34:50 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 ad194786d..4064b8e24 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 Fri Aug 15 16:18:27 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 17:34:50 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 8877acde9..56d380ed1 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 Fri Aug 15 16:18:27 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 17:34:50 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 2ae848799..19195804d 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 Fri Aug 15 16:18:27 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 17:34:50 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 0b5851d99..754f4c0dc 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 Fri Aug 15 16:18:27 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 17:34:50 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 bf4939539..2c3c348f9 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 Fri Aug 15 16:18:27 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 17:34:50 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 2f214bca7..2426bbac1 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 Fri Aug 15 16:18:27 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 17:34:50 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 512c97769..7c4c78868 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 Fri Aug 15 16:18:27 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 17:34:50 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 9cf2ac479..3a9b70fb2 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 Fri Aug 15 16:18:27 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Aug 15 17:34:50 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 37904f328228703cc304ded481d4fad8b7235304 Mon Sep 17 00:00:00 2001 From: brentru Date: Fri, 15 Aug 2025 14:17:25 -0400 Subject: [PATCH 08/23] Almost full circle display add --- src/Wippersnapper_demo.ino.cpp | 26 +++++++++++++++++++++++++ src/components/display/controller.cpp | 28 ++++++++++++++++++++++++--- src/components/display/controller.h | 6 +++--- src/components/display/hardware.cpp | 7 ++++--- src/components/display/hardware.h | 6 +++--- 5 files changed, 61 insertions(+), 12 deletions(-) create mode 100644 src/Wippersnapper_demo.ino.cpp diff --git a/src/Wippersnapper_demo.ino.cpp b/src/Wippersnapper_demo.ino.cpp new file mode 100644 index 000000000..197cd52c5 --- /dev/null +++ b/src/Wippersnapper_demo.ino.cpp @@ -0,0 +1,26 @@ +# 1 "/var/folders/ff/dmzflvf52tq9kzvt6g8jglxw0000gn/T/tmpkb6hfvfs" +#include +# 1 "/Users/brentrubell/Documents/Arduino/libraries/Adafruit_Wippersnapper_Arduino/src/Wippersnapper_demo.ino" +# 16 "/Users/brentrubell/Documents/Arduino/libraries/Adafruit_Wippersnapper_Arduino/src/Wippersnapper_demo.ino" +#include "Wippersnapper_Networking.h" +Wippersnapper_WiFi wipper; + + +#define WS_DEBUG +void setup(); +void loop(); +#line 22 "/Users/brentrubell/Documents/Arduino/libraries/Adafruit_Wippersnapper_Arduino/src/Wippersnapper_demo.ino" +void setup() { + + wipper.provision(); + + Serial.begin(115200); + + + wipper.connect(); + +} + +void loop() { + wipper.run(); +} \ No newline at end of file diff --git a/src/components/display/controller.cpp b/src/components/display/controller.cpp index 06b6e72eb..350b2329f 100644 --- a/src/components/display/controller.cpp +++ b/src/components/display/controller.cpp @@ -28,13 +28,35 @@ DisplayController::DisplayController() { // TODO } +/*! + @brief Handles a Display_AddOrReplace message. + @param msgAdd + Pointer to a DisplayAddOrReplace message structure. + @return True if the display was added or replaced successfully, false otherwise. +*/ bool DisplayController::Handle_Display_AddOrReplace(wippersnapper_display_v1_DisplayAddOrReplace *msgAdd) { - DisplayHardware *display = new DisplayHardware(); + DisplayHardware *display = new DisplayHardware(msgAdd->name); + // Configure display type display->setType(msgAdd->type); - // Configure display based on config type + + // Attempt to initialize display hardware instance + bool did_begin = false; if (msgAdd->which_config == wippersnapper_display_v1_DisplayAddOrReplace_epd_config_tag) { - display->configureEPD(&msgAdd->config.epd_config, &msgAdd->interface_type.spi_epd); + did_begin = display->beginEPD(&msgAdd->config.epd_config, &msgAdd->interface_type.spi_epd); + } else { + WS_DEBUG_PRINTLN("[display] Unsupported display configuration type!"); + return false; } + + // Check if the display began successfully + if (!did_begin) { + WS_DEBUG_PRINTLN("[display] Failed to initialize display!"); + delete display; // Clean up if initialization failed + return false; + } + + _hw_instances.push_back(display); // Store the display instance + WS_DEBUG_PRINTLN("[display] Display added or replaced successfully!"); return true; // Placeholder } diff --git a/src/components/display/controller.h b/src/components/display/controller.h index cf635476e..3b8c259a8 100644 --- a/src/components/display/controller.h +++ b/src/components/display/controller.h @@ -32,10 +32,10 @@ class DisplayController { DisplayController(); ~DisplayController(); bool Handle_Display_AddOrReplace(wippersnapper_display_v1_DisplayAddOrReplace *msgAdd); - //bool Handle_Display_Write(pb_istream_t *stream); - //bool Handle_Display_Remove(pb_istream_t *stream); + //bool Handle_Display_Remove(...); + //bool Handle_Display_Write(...); private: - //DisplayHardware *_display_strands[MAX_DISPLAY_STRANDS] = { + std::vector _hw_instances; ///< Holds pointers to DisplayHardware instances }; extern Wippersnapper Ws; ///< Global WS instance #endif \ No newline at end of file diff --git a/src/components/display/hardware.cpp b/src/components/display/hardware.cpp index c8a4a58c6..24a3f3bae 100644 --- a/src/components/display/hardware.cpp +++ b/src/components/display/hardware.cpp @@ -17,15 +17,16 @@ /*! @brief Constructs a new DisplayHardware object */ -DisplayHardware::DisplayHardware() { +DisplayHardware::DisplayHardware(const char *name) { + _name = name; ///< Set the name of the hardware instance _type = wippersnapper_display_v1_DisplayType_DISPLAY_TYPE_UNSPECIFIED; } /*! @brief Destructor */ -DisplayHardware::DisplayHardware() { - // TODO: Clean up display drivers +DisplayHardware::~DisplayHardware() { + // TODO } /*! diff --git a/src/components/display/hardware.h b/src/components/display/hardware.h index b4fef854e..8e74d7728 100644 --- a/src/components/display/hardware.h +++ b/src/components/display/hardware.h @@ -28,18 +28,18 @@ /**************************************************************************/ class DisplayHardware { public: - DisplayHardware(); + DisplayHardware(const char *name); ~DisplayHardware(); // High-level API functions void setType(wippersnapper_display_v1_DisplayType type); wippersnapper_display_v1_DisplayType getType(); - void beginEPD(wippersnapper_display_v1_EPDConfig *config, - wippersnapper_display_v1_EpdSpiConfig *spi_config); + bool beginEPD(wippersnapper_display_v1_EPDConfig *config, wippersnapper_display_v1_EpdSpiConfig *spi_config); bool begin(bool reset = true); // API functions to abstract Adafruit_GFX void setTextSize(uint8_t sz); private: + const char *_name; ///< Identifies the hardware instance wippersnapper_display_v1_DisplayType _type; ///< Display type wippersnapper_display_v1_EPDThinkInkPanel _thinkink_driver; ///< ThinkInk driver type From ab55789f25d0e5e91bb618ee79ec439d6044f661 Mon Sep 17 00:00:00 2001 From: brentru Date: Fri, 15 Aug 2025 14:25:20 -0400 Subject: [PATCH 09/23] Implement HandleDisplayRemove --- src/Wippersnapper.cpp | 4 +- src/Wippersnapper_demo.ino.cpp | 26 ---------- src/components/display/controller.cpp | 75 ++++++++++++++++++--------- src/components/display/controller.h | 10 ++-- src/components/display/hardware.cpp | 8 ++- src/components/display/hardware.h | 4 +- 6 files changed, 68 insertions(+), 59 deletions(-) delete mode 100644 src/Wippersnapper_demo.ino.cpp diff --git a/src/Wippersnapper.cpp b/src/Wippersnapper.cpp index 783186f0f..1f4aebae0 100644 --- a/src/Wippersnapper.cpp +++ b/src/Wippersnapper.cpp @@ -1682,8 +1682,8 @@ bool cbDecodeDisplayMsg(pb_istream_t *stream, const pb_field_t *field, void **ar // Attempt to add or replace a display component bool did_add = WS._displayController->Handle_Display_AddOrReplace(&msgAddReq); - // TODO: Add response handling and publishing here - + // TODO: Add response handling and publishing here, for now it always returns true and doesnt publish back to the broker + } return true; } diff --git a/src/Wippersnapper_demo.ino.cpp b/src/Wippersnapper_demo.ino.cpp deleted file mode 100644 index 197cd52c5..000000000 --- a/src/Wippersnapper_demo.ino.cpp +++ /dev/null @@ -1,26 +0,0 @@ -# 1 "/var/folders/ff/dmzflvf52tq9kzvt6g8jglxw0000gn/T/tmpkb6hfvfs" -#include -# 1 "/Users/brentrubell/Documents/Arduino/libraries/Adafruit_Wippersnapper_Arduino/src/Wippersnapper_demo.ino" -# 16 "/Users/brentrubell/Documents/Arduino/libraries/Adafruit_Wippersnapper_Arduino/src/Wippersnapper_demo.ino" -#include "Wippersnapper_Networking.h" -Wippersnapper_WiFi wipper; - - -#define WS_DEBUG -void setup(); -void loop(); -#line 22 "/Users/brentrubell/Documents/Arduino/libraries/Adafruit_Wippersnapper_Arduino/src/Wippersnapper_demo.ino" -void setup() { - - wipper.provision(); - - Serial.begin(115200); - - - wipper.connect(); - -} - -void loop() { - wipper.run(); -} \ No newline at end of file diff --git a/src/components/display/controller.cpp b/src/components/display/controller.cpp index 350b2329f..1c8e515ea 100644 --- a/src/components/display/controller.cpp +++ b/src/components/display/controller.cpp @@ -24,7 +24,7 @@ DisplayController::DisplayController() { /*! @brief Destructor */ -DisplayController::DisplayController() { +DisplayController::~DisplayController() { // TODO } @@ -32,31 +32,56 @@ DisplayController::DisplayController() { @brief Handles a Display_AddOrReplace message. @param msgAdd Pointer to a DisplayAddOrReplace message structure. - @return True if the display was added or replaced successfully, false otherwise. + @return True if the display was added or replaced successfully, false + otherwise. */ -bool DisplayController::Handle_Display_AddOrReplace(wippersnapper_display_v1_DisplayAddOrReplace *msgAdd) { - DisplayHardware *display = new DisplayHardware(msgAdd->name); - - // Configure display type - display->setType(msgAdd->type); - - // Attempt to initialize display hardware instance - bool did_begin = false; - if (msgAdd->which_config == wippersnapper_display_v1_DisplayAddOrReplace_epd_config_tag) { - did_begin = display->beginEPD(&msgAdd->config.epd_config, &msgAdd->interface_type.spi_epd); - } else { - WS_DEBUG_PRINTLN("[display] Unsupported display configuration type!"); - return false; - } +bool DisplayController::Handle_Display_AddOrReplace( + wippersnapper_display_v1_DisplayAddOrReplace *msgAdd) { + DisplayHardware *display = new DisplayHardware(msgAdd->name); - // Check if the display began successfully - if (!did_begin) { - WS_DEBUG_PRINTLN("[display] Failed to initialize display!"); - delete display; // Clean up if initialization failed - return false; - } + // Configure display type + display->setType(msgAdd->type); + + // Attempt to initialize display hardware instance + bool did_begin = false; + if (msgAdd->which_config == + wippersnapper_display_v1_DisplayAddOrReplace_epd_config_tag) { + did_begin = display->beginEPD(&msgAdd->config.epd_config, + &msgAdd->interface_type.spi_epd); + } else { + WS_DEBUG_PRINTLN("[display] Unsupported display configuration type!"); + return false; + } + + // Check if the display began successfully + if (!did_begin) { + WS_DEBUG_PRINTLN("[display] Failed to initialize display!"); + delete display; // Clean up if initialization failed + return false; + } - _hw_instances.push_back(display); // Store the display instance - WS_DEBUG_PRINTLN("[display] Display added or replaced successfully!"); - return true; // Placeholder + _hw_instances.push_back(display); // Store the display instance + WS_DEBUG_PRINTLN("[display] Display added or replaced successfully!"); + return true; // Placeholder } + +/*! + @brief Handles a Display_Remove message. + @param msgRemove + Pointer to a DisplayRemove message structure. + @return True if the display was removed successfully, false otherwise. +*/ +bool DisplayController::Handle_Display_Remove( + wippersnapper_display_v1_DisplayRemove *msgRemove) { + // Find the display instance by name + for (auto it = _hw_instances.begin(); it != _hw_instances.end(); ++it) { + if (strcmp((*it)->getName(), msgRemove->name) == 0) { + delete *it; + _hw_instances.erase(it); + WS_DEBUG_PRINTLN("[display] Display removed successfully!"); + return true; + } + } + WS_DEBUG_PRINTLN("[display] Could not remove display, not found!"); + return false; +} \ No newline at end of file diff --git a/src/components/display/controller.h b/src/components/display/controller.h index 3b8c259a8..e203ed9de 100644 --- a/src/components/display/controller.h +++ b/src/components/display/controller.h @@ -31,11 +31,13 @@ class DisplayController { public: DisplayController(); ~DisplayController(); - bool Handle_Display_AddOrReplace(wippersnapper_display_v1_DisplayAddOrReplace *msgAdd); - //bool Handle_Display_Remove(...); - //bool Handle_Display_Write(...); + bool Handle_Display_AddOrReplace( + wippersnapper_display_v1_DisplayAddOrReplace *msgAdd); + bool Handle_Display_Remove(wippersnapper_display_v1_DisplayRemove *msgRemove); + // bool Handle_Display_Write(...); private: - std::vector _hw_instances; ///< Holds pointers to DisplayHardware instances + std::vector + _hw_instances; ///< Holds pointers to DisplayHardware instances }; extern Wippersnapper Ws; ///< Global WS instance #endif \ No newline at end of file diff --git a/src/components/display/hardware.cpp b/src/components/display/hardware.cpp index 24a3f3bae..af21ca07f 100644 --- a/src/components/display/hardware.cpp +++ b/src/components/display/hardware.cpp @@ -171,6 +171,12 @@ bool DisplayHardware::begin(bool reset) { @param sz The size of the text to set. */ -void setTextSize(uint8_t sz) { +void DisplayHardware::setTextSize(uint8_t sz) { // Placeholder for setting text size on the display TODO } + +/*! + @brief Gets the name of the display hardware instance. + @return The name of the display hardware instance. +*/ +const char *DisplayHardware::getName() { return _name; } diff --git a/src/components/display/hardware.h b/src/components/display/hardware.h index 8e74d7728..15c135a7b 100644 --- a/src/components/display/hardware.h +++ b/src/components/display/hardware.h @@ -31,9 +31,11 @@ class DisplayHardware { DisplayHardware(const char *name); ~DisplayHardware(); // High-level API functions + const char *getName(); void setType(wippersnapper_display_v1_DisplayType type); wippersnapper_display_v1_DisplayType getType(); - bool beginEPD(wippersnapper_display_v1_EPDConfig *config, wippersnapper_display_v1_EpdSpiConfig *spi_config); + bool beginEPD(wippersnapper_display_v1_EPDConfig *config, + wippersnapper_display_v1_EpdSpiConfig *spi_config); bool begin(bool reset = true); // API functions to abstract Adafruit_GFX void setTextSize(uint8_t sz); From cf617c5ae9e27a69af63f6a2df25c3d3372fbff0 Mon Sep 17 00:00:00 2001 From: brentru Date: Mon, 18 Aug 2025 14:04:44 -0400 Subject: [PATCH 10/23] Refactor out hardware file --- src/Wippersnapper.cpp | 99 +++++++++++-------- src/components/display/drivers/dispDrvBase.h | 45 +++++++++ .../dispDrvThinkInkGrayscale4Eaamfgn.h | 51 ++++++++++ src/components/display/hardware.cpp | 48 ++++----- src/components/display/hardware.h | 10 +- .../register/Wippersnapper_Register.cpp | 1 + 6 files changed, 183 insertions(+), 71 deletions(-) create mode 100644 src/components/display/drivers/dispDrvBase.h create mode 100644 src/components/display/drivers/dispDrvThinkInkGrayscale4Eaamfgn.h diff --git a/src/Wippersnapper.cpp b/src/Wippersnapper.cpp index 1f4aebae0..3ead64bf3 100644 --- a/src/Wippersnapper.cpp +++ b/src/Wippersnapper.cpp @@ -1659,7 +1659,8 @@ void cbSignalUARTReq(char *data, uint16_t len) { } /*! - @brief Deserializes a DisplayRequest message and sends it to the display component. + @brief Deserializes a DisplayRequest message and sends it to the display + component. @param stream Incoming data stream from buffer. @param field @@ -1668,11 +1669,13 @@ void cbSignalUARTReq(char *data, uint16_t len) { Optional arguments from decoder calling function. @returns True if decoded successfully, False otherwise. */ -bool cbDecodeDisplayMsg(pb_istream_t *stream, const pb_field_t *field, void **arg) { +bool cbDecodeDisplayMsg(pb_istream_t *stream, const pb_field_t *field, + void **arg) { if (field->tag == wippersnapper_signal_v1_DisplayRequest_display_add_tag) { // Decode message into a DisplayAddRequest - wippersnapper_display_v1_DisplayAddOrReplace msgAddReq = wippersnapper_display_v1_DisplayAddOrReplace_init_zero; + wippersnapper_display_v1_DisplayAddOrReplace msgAddReq = + wippersnapper_display_v1_DisplayAddOrReplace_init_zero; if (!ws_pb_decode(stream, wippersnapper_display_v1_DisplayAddOrReplace_fields, &msgAddReq)) { @@ -1681,8 +1684,10 @@ bool cbDecodeDisplayMsg(pb_istream_t *stream, const pb_field_t *field, void **ar } // Attempt to add or replace a display component - bool did_add = WS._displayController->Handle_Display_AddOrReplace(&msgAddReq); - // TODO: Add response handling and publishing here, for now it always returns true and doesnt publish back to the broker + bool did_add = + WS._displayController->Handle_Display_AddOrReplace(&msgAddReq); + // TODO: Add response handling and publishing here, for now it always + // returns true and doesnt publish back to the broker } return true; } @@ -2406,57 +2411,56 @@ bool Wippersnapper::generateWSTopics() { return false; } -// Create d2b display topic + // /display topic // + + // Pre-determine topic size + topicLen = strlen(WS._config.aio_user) + strlen("/") + strlen(_device_uid) + + strlen("/wprsnpr/") + strlen(TOPIC_SIGNALS) + strlen("broker") + + strlen(TOPIC_DISPLAY) + 1; + +// Pre-allocate memory for topic #ifdef USE_PSRAM - WS._topic_signal_display_brkr = (char *)ps_malloc( - sizeof(char) * strlen(WS._config.aio_user) + strlen("/") + - strlen(_device_uid) + strlen("/wprsnpr/") + strlen(TOPIC_SIGNALS) + - strlen("broker") + strlen(TOPIC_DISPLAY) + 1); + WS._topic_signal_display_brkr = (char *)ps_malloc(topicLen); #else - WS._topic_signal_display_brkr = (char *)malloc( - sizeof(char) * strlen(WS._config.aio_user) + strlen("/") + - strlen(_device_uid) + strlen("/wprsnpr/") + strlen(TOPIC_SIGNALS) + - strlen("broker") + strlen(TOPIC_DISPLAY) + 1); + WS._topic_signal_display_brkr = (char *)malloc(topicLen); #endif + + // Generate the topic if (WS._topic_signal_display_brkr != NULL) { - strcpy(WS._topic_signal_display_brkr, WS._config.aio_user); - strcat(WS._topic_signal_display_brkr, TOPIC_WS); - strcat(WS._topic_signal_display_brkr, _device_uid); - strcat(WS._topic_signal_display_brkr, TOPIC_SIGNALS); - strcat(WS._topic_signal_display_brkr, "broker"); - strcat(WS._topic_signal_display_brkr, TOPIC_DISPLAY); - } else { // malloc failed - WS_DEBUG_PRINTLN("ERROR: Failed to add a display topic!"); + snprintf(WS._topic_signal_display_brkr, topicLen, "%s/wprsnpr/%s%sbroker%s", + WS._config.aio_user, _device_uid, TOPIC_SIGNALS, TOPIC_DISPLAY); + } else { + WS_DEBUG_PRINTLN( + "FATAL ERROR: Failed to allocate memory for DISPLAY topic!"); return false; } - // Subscribe to the display sub-topic + // Subscribe to signal's DISPLAY sub-topic and set callback _topic_signal_display_sub = new Adafruit_MQTT_Subscribe(WS._mqtt, WS._topic_signal_display_brkr, 1); WS._mqtt->subscribe(_topic_signal_display_sub); _topic_signal_display_sub->setCallback(cbDisplayMessage); -// Create a b2d display topic + // Calculate length of the topic for device-to-broker DISPLAY topic + topicLen = strlen(WS._config.aio_user) + strlen("/") + strlen(_device_uid) + + strlen("/wprsnpr/") + strlen(TOPIC_SIGNALS) + strlen("device") + + strlen(TOPIC_DISPLAY) + 1; + +// Allocate memory for dynamic MQTT topic #ifdef USE_PSRAM - WS._topic_signal_display_device = (char *)ps_malloc( - sizeof(char) * strlen(WS._config.aio_user) + strlen("/") + - strlen(_device_uid) + strlen("/wprsnpr/") + strlen(TOPIC_SIGNALS) + - strlen("device") + strlen(TOPIC_DISPLAY) + 1); + WS._topic_signal_display_device = (char *)ps_malloc(topicLen); #else - WS._topic_signal_display_device = (char *)malloc( - sizeof(char) * strlen(WS._config.aio_user) + strlen("/") + - strlen(_device_uid) + strlen("/wprsnpr/") + strlen(TOPIC_SIGNALS) + - strlen("device") + strlen(TOPIC_DISPLAY) + 1); + WS._topic_signal_display_device = (char *)malloc(topicLen); #endif + + // Generate the topic if memory was allocated successfully if (WS._topic_signal_display_device != NULL) { - strcpy(WS._topic_signal_display_device, WS._config.aio_user); - strcat(WS._topic_signal_display_device, TOPIC_WS); - strcat(WS._topic_signal_display_device, _device_uid); - strcat(WS._topic_signal_display_device, TOPIC_SIGNALS); - strcat(WS._topic_signal_display_device, "device"); - strcat(WS._topic_signal_display_device, TOPIC_DISPLAY); - } else { // malloc failed - WS_DEBUG_PRINTLN("ERROR: Failed to add a display topic!"); + snprintf(WS._topic_signal_display_device, topicLen, + "%s/wprsnpr/%s%sdevice%s", WS._config.aio_user, _device_uid, + TOPIC_SIGNALS, TOPIC_DISPLAY); + } else { + WS_DEBUG_PRINTLN( + "FATAL ERROR: Failed to allocate memory for DISPLAY topic!"); return false; } @@ -2953,6 +2957,14 @@ void Wippersnapper::connect() { WS._ui_helper->build_scr_monitor(); #endif + WS.pinCfgCompleted = true; + + // Initialize Digital IO class + WS._digitalGPIO = new Wippersnapper_DigitalGPIO(20); + // Initialize Analog IO class + WS._analogIO = new Wippersnapper_AnalogIO(5, 3.3); + WS._boardStatus = WS_BOARD_DEF_OK; + // Configure hardware while (!WS.pinCfgCompleted) { WS_DEBUG_PRINTLN( @@ -2968,6 +2980,13 @@ void Wippersnapper::connect() { statusLEDFade(GREEN, 3); WS_DEBUG_PRINTLN( "Registration and configuration complete!\nRunning application..."); + + // Print out display topics + WS_DEBUG_PRINTLN("Device-to-Broker DISPLAY topic: "); + WS_DEBUG_PRINTLN(WS._topic_signal_display_device); + WS_DEBUG_PRINTLN("Broker-to-Device DISPLAY topic: "); + WS_DEBUG_PRINTLN(WS._topic_signal_display_brkr); + delay(500); } /**************************************************************************/ diff --git a/src/components/display/drivers/dispDrvBase.h b/src/components/display/drivers/dispDrvBase.h new file mode 100644 index 000000000..a95c6d7eb --- /dev/null +++ b/src/components/display/drivers/dispDrvBase.h @@ -0,0 +1,45 @@ +/*! + * @file src/components/display/drivers/dispDrvBase.h + * + * Abstract base class for display drivers. + * + * Adafruit invests time and resources providing this open source code, + * please support Adafruit and open-source hardware by purchasing + * products from Adafruit! + * + * Copyright (c) Brent Rubell 2025 for Adafruit Industries. + * + * BSD license, all text here must be included in any redistribution. + * + */ +#ifndef WS_DISP_DRV_BASE_H +#define WS_DISP_DRV_BASE_H + +#include "Adafruit_ThinkInk.h" +#include "Wippersnapper.h" + +class dispDrvBase { +public: + dispDrvBase(int16_t dc, int16_t rst, int16_t cs, int16_t sram_cs = -1, + int16_t busy = -1) + : _pin_dc(dc), _pin_rst(rst), _pin_cs(cs), _pin_sram_cs(sram_cs), + _pin_busy(busy) { + // Constructor implementation (if we need one) + } + + virtual ~dispDrvBase() { + // Destructor implementation (if we need one) + }; + + // Virtual function to be implemented by derived classes + virtual bool begin(thinkinkmode_t mode, bool reset = true); + +protected: + int16_t _pin_dc; + int16_t _pin_rst; + int16_t _pin_cs; + int16_t _pin_busy; + int16_t _pin_sram_cs; // for optional EPD SRAM chip select +}; + +#endif // WS_DISP_DRV_BASE_H \ No newline at end of file diff --git a/src/components/display/drivers/dispDrvThinkInkGrayscale4Eaamfgn.h b/src/components/display/drivers/dispDrvThinkInkGrayscale4Eaamfgn.h new file mode 100644 index 000000000..0c347d220 --- /dev/null +++ b/src/components/display/drivers/dispDrvThinkInkGrayscale4Eaamfgn.h @@ -0,0 +1,51 @@ +/*! + * @file src/components/display/drivers/drvDispThinkInkGrayscale4Eaamfgn.h + * + * Driver for ThinkInk 2.9" Grayscale 4-level EAAMFGN display (2025 MagTag). + * + * Adafruit invests time and resources providing this open source code, + * please support Adafruit and open-source hardware by purchasing + * products from Adafruit! + * + * Copyright (c) Brent Rubell 2025 for Adafruit Industries. + * + * BSD license, all text here must be included in any redistribution. + * + */ +#ifndef WS_DRV_THINKINK_GRAYSCALE4_EAAMFGN_H +#define WS_DRV_THINKINK_GRAYSCALE4_EAAMFGN_H + +#include "dispDrvBase.h" + +class drvDispThinkInkGrayscale4Eaamfgn : public dispDrvBase { +public: + drvDispThinkInkGrayscale4Eaamfgn(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) {} + + ~drvDispThinkInkGrayscale4Eaamfgn() { + if (_display) { + delete _display; + _display = nullptr; + } + } + + bool begin(thinkinkmode_t mode, bool reset = true) override { + _display = new ThinkInk_290_Grayscale4_EAAMFGN(_pin_dc, _pin_rst, _pin_cs, + _pin_sram_cs, _pin_busy); + if (!_display) + return false; // Allocation failed + + // Initialize the display + _display->begin(mode); + // Clear the display buffer + _display->clearBuffer(); + _display->display(); + return true; + } + +private: + ThinkInk_290_Grayscale4_EAAMFGN *_display; +}; + +#endif // WS_DRV_THINKINK_GRAYSCALE4_EAAMFGN_H \ No newline at end of file diff --git a/src/components/display/hardware.cpp b/src/components/display/hardware.cpp index af21ca07f..513106a46 100644 --- a/src/components/display/hardware.cpp +++ b/src/components/display/hardware.cpp @@ -59,17 +59,20 @@ bool DisplayHardware::beginEPD( wippersnapper_display_v1_EpdSpiConfig *spi_config) { // Validate pointers if (config == nullptr || spi_config == nullptr) { + WS_DEBUG_PRINTLN("[display] EPD config or SPI config is null!"); return false; } // Validate panel type if (config->panel == wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_UNSPECIFIED) { + WS_DEBUG_PRINTLN("[display] Unsupported EPD panel type!"); return false; // Unsupported panel type } // Validate mode is a correct EPD mode if (config->mode == wippersnapper_display_v1_EPDMode_EPD_MODE_UNSPECIFIED) { + WS_DEBUG_PRINTLN("[display] Unsupported EPD mode!"); return false; // Unsupported mode } @@ -81,24 +84,19 @@ bool DisplayHardware::beginEPD( _disp_thinkink_grayscale4_eaamfgn = nullptr; _thinkink_driver = wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_UNSPECIFIED; - } else if ( - _thinkink_driver == - wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_290_GRAYSCALE4_T5) { - delete _disp_thinkink_grayscale4_t5; - _disp_thinkink_grayscale4_t5 = nullptr; - _thinkink_driver = - wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_UNSPECIFIED; } // Parse all SPI bus pins // Check length if (strlen(spi_config->pin_dc) < 2 || strlen(spi_config->pin_rst) < 2 || strlen(spi_config->pin_cs) < 2) { + WS_DEBUG_PRINTLN("[display] Invalid SPI pin len!"); return false; } // SPI pins must start with 'D' if (spi_config->pin_dc[0] != 'D' || spi_config->pin_rst[0] != 'D' || spi_config->pin_cs[0] != 'D') { + WS_DEBUG_PRINTLN("[display] SPI pins must start with 'D'!"); return false; } @@ -123,33 +121,35 @@ bool DisplayHardware::beginEPD( thinkinkmode_t epd_mode; if (config->mode == wippersnapper_display_v1_EPDMode_EPD_MODE_GRAYSCALE4) { epd_mode = THINKINK_GRAYSCALE4; + WS_DEBUG_PRINTLN("[display] EPD mode: GRAYSCALE4"); } else if (config->mode == wippersnapper_display_v1_EPDMode_EPD_MODE_MONO) { epd_mode = THINKINK_MONO; + WS_DEBUG_PRINTLN("[display] EPD mode: MONO"); } - // Assign driver instance based on panel type + // Configure the EPD driver based on panel type if (config->panel == wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_290_GRAYSCALE4_MFGN) { - _disp_thinkink_grayscale4_eaamfgn = - new ThinkInk_290_Grayscale4_EAAMFGN(dc, rst, cs, srcs, busy); - if (!_disp_thinkink_grayscale4_eaamfgn) - return false; // Allocation failed - // Initialize the display - _disp_thinkink_grayscale4_eaamfgn->begin(epd_mode); + WS_DEBUG_PRINTLN("[display] EPD panel: ThinkInk 290 Grayscale4 MFGN"); _thinkink_driver = wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_290_GRAYSCALE4_MFGN; - } else if ( - config->panel == - wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_290_GRAYSCALE4_T5) { - _disp_thinkink_grayscale4_t5 = - new ThinkInk_290_Grayscale4_T5(dc, rst, cs, srcs, busy); - if (!_disp_thinkink_grayscale4_t5) + _disp_thinkink_grayscale4_eaamfgn = + new drvDispThinkInkGrayscale4Eaamfgn(dc, rst, cs, srcs, busy); + if (!_disp_thinkink_grayscale4_eaamfgn) { + WS_DEBUG_PRINTLN("[display] Failed to allocate ThinkInk driver!"); return false; // Allocation failed - // Initialize the display - _disp_thinkink_grayscale4_t5->begin(epd_mode); - _thinkink_driver = - wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_290_GRAYSCALE4_T5; + } + if (!_disp_thinkink_grayscale4_eaamfgn->begin(epd_mode)) { + WS_DEBUG_PRINTLN("[display] Failed to initialize ThinkInk driver!"); + delete _disp_thinkink_grayscale4_eaamfgn; // Clean up if initialization + // failed + _disp_thinkink_grayscale4_eaamfgn = nullptr; + return false; // Initialization failed + } + WS_DEBUG_PRINTLN("[display] ThinkInk 290 Grayscale4 MFGN driver " + "initialized successfully!"); } else { + WS_DEBUG_PRINTLN("[display] Unsupported EPD panel type!"); return false; // Unsupported panel type } diff --git a/src/components/display/hardware.h b/src/components/display/hardware.h index 15c135a7b..6bf8b9513 100644 --- a/src/components/display/hardware.h +++ b/src/components/display/hardware.h @@ -15,8 +15,8 @@ #ifndef WS_DISPLAY_HARDWARE_H #define WS_DISPLAY_HARDWARE_H #include "Wippersnapper.h" - -#include "Adafruit_ThinkInk.h" +#include "drivers/dispDrvBase.h" +#include "drivers/dispDrvThinkInkGrayscale4Eaamfgn.h" /**************************************************************************/ /*! @@ -45,10 +45,6 @@ class DisplayHardware { wippersnapper_display_v1_DisplayType _type; ///< Display type wippersnapper_display_v1_EPDThinkInkPanel _thinkink_driver; ///< ThinkInk driver type - // TODO: Make these drivers instead? - ThinkInk_290_Grayscale4_EAAMFGN *_disp_thinkink_grayscale4_eaamfgn = - nullptr; //< 2025 MagTag with SSD1680Z chipset - ThinkInk_290_Grayscale4_T5 *_disp_thinkink_grayscale4_t5 = - nullptr; ///< Pre-2025 MagTag with IL0373 chipset + drvDispThinkInkGrayscale4Eaamfgn *_disp_thinkink_grayscale4_eaamfgn = nullptr; }; #endif // WS_DISPLAY_HARDWARE_H \ No newline at end of file diff --git a/src/components/register/Wippersnapper_Register.cpp b/src/components/register/Wippersnapper_Register.cpp index 522818997..4ad9ec5c4 100644 --- a/src/components/register/Wippersnapper_Register.cpp +++ b/src/components/register/Wippersnapper_Register.cpp @@ -77,6 +77,7 @@ bool Wippersnapper::encodePubRegistrationReq() { /****************************************************************************/ void Wippersnapper::pollRegistrationResp() { // Blocking loop, WDT reset upon failure. + WS._boardStatus = WS_BOARD_DEF_OK; while (WS._boardStatus != WS_BOARD_DEF_OK) { WS_DEBUG_PRINT("Polling for registration message response..."); WS_DEBUG_PRINTLN(WS._boardStatus); From 2743edc6375d91316edfe1d5b6241f88a10483d6 Mon Sep 17 00:00:00 2001 From: brentru Date: Mon, 18 Aug 2025 14:35:13 -0400 Subject: [PATCH 11/23] last bit of optimization to allow a factory map within hardware.cpp and switch to a default type to allow general api access rather than specific driver access. similar to v2 --- src/Wippersnapper_demo.ino.cpp | 26 ++++++++ src/components/display/hardware.cpp | 94 +++++++++++++++++------------ src/components/display/hardware.h | 6 +- 3 files changed, 87 insertions(+), 39 deletions(-) create mode 100644 src/Wippersnapper_demo.ino.cpp diff --git a/src/Wippersnapper_demo.ino.cpp b/src/Wippersnapper_demo.ino.cpp new file mode 100644 index 000000000..05fbd12e9 --- /dev/null +++ b/src/Wippersnapper_demo.ino.cpp @@ -0,0 +1,26 @@ +# 1 "/var/folders/ff/dmzflvf52tq9kzvt6g8jglxw0000gn/T/tmp8qooypzx" +#include +# 1 "/Users/brentrubell/Documents/Arduino/libraries/Adafruit_Wippersnapper_Arduino/src/Wippersnapper_demo.ino" +# 16 "/Users/brentrubell/Documents/Arduino/libraries/Adafruit_Wippersnapper_Arduino/src/Wippersnapper_demo.ino" +#include "Wippersnapper_Networking.h" +Wippersnapper_WiFi wipper; + + +#define WS_DEBUG +void setup(); +void loop(); +#line 22 "/Users/brentrubell/Documents/Arduino/libraries/Adafruit_Wippersnapper_Arduino/src/Wippersnapper_demo.ino" +void setup() { + + wipper.provision(); + + Serial.begin(115200); + + + wipper.connect(); + +} + +void loop() { + wipper.run(); +} \ No newline at end of file diff --git a/src/components/display/hardware.cpp b/src/components/display/hardware.cpp index 513106a46..2b1cd1297 100644 --- a/src/components/display/hardware.cpp +++ b/src/components/display/hardware.cpp @@ -14,6 +14,48 @@ */ #include "controller.h" +/*! + @brief Lambda function to create a dispDrvBase instance +*/ +using FnCreateDispDrv = + std::function; + +// Factory for creating a new display drivers +// NOTE: When you add a new display driver, make sure to add it to the factory! +static const std::map FactoryDrvDisp = { + {"grayscale4_eaamfgn", + [](int16_t dc, int16_t rst, int16_t cs, int16_t sram_cs, + int16_t busy) -> dispDrvBase * { + return new drvDispThinkInkGrayscale4Eaamfgn(dc, rst, cs, sram_cs, busy); + }}}; + +/*! + @brief Creates a new display driver instance based on the driver name. + @param driver_name + The name of the display driver to create. + @param dc + Data/Command pin number. + @param rst + Reset pin number. + @param cs + Chip Select pin number. + @param sram_cs + Optional SRAM Chip Select pin number (default: -1). + @param busy + Optional Busy pin number (default: -1). + @return Pointer to the created display driver instance, or nullptr if the + driver name is not recognized. +*/ +dispDrvBase *CreateDrvDisp(const char *driver_name, int16_t dc, int16_t rst, + int16_t cs, int16_t sram_cs = -1, + int16_t busy = -1) { + auto it = FactoryDrvDisp.find(driver_name); + if (it == FactoryDrvDisp.end()) { + return nullptr; + } + return it->second(dc, rst, cs, sram_cs, busy); +} + /*! @brief Constructs a new DisplayHardware object */ @@ -76,15 +118,8 @@ bool DisplayHardware::beginEPD( return false; // Unsupported mode } - // If we already have a display driver assigned to this hardware instance, - // clean it up! - if (_thinkink_driver == - wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_290_GRAYSCALE4_MFGN) { - delete _disp_thinkink_grayscale4_eaamfgn; - _disp_thinkink_grayscale4_eaamfgn = nullptr; - _thinkink_driver = - wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_UNSPECIFIED; - } + // TODO: If we already have a display driver assigned to this hardware + // instance, clean it up! // Parse all SPI bus pins // Check length @@ -117,40 +152,25 @@ bool DisplayHardware::beginEPD( // TODO: Configure SPI bus selection (UNUSED AS OF RIGHT NOW) + // Create display driver object using the factory function + _disp_drv_base = CreateDrvDisp(_name, dc, rst, cs, srcs, busy); + if (!_disp_drv_base) { + WS_DEBUG_PRINTLN("[display] Failed to create display driver!"); + return false; // Failed to create display driver + } + // Configure EPD mode - thinkinkmode_t epd_mode; + thinkinkmode_t epd_mode = THINKINK_MONO; if (config->mode == wippersnapper_display_v1_EPDMode_EPD_MODE_GRAYSCALE4) { epd_mode = THINKINK_GRAYSCALE4; WS_DEBUG_PRINTLN("[display] EPD mode: GRAYSCALE4"); - } else if (config->mode == wippersnapper_display_v1_EPDMode_EPD_MODE_MONO) { - epd_mode = THINKINK_MONO; - WS_DEBUG_PRINTLN("[display] EPD mode: MONO"); } - // Configure the EPD driver based on panel type - if (config->panel == - wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_290_GRAYSCALE4_MFGN) { - WS_DEBUG_PRINTLN("[display] EPD panel: ThinkInk 290 Grayscale4 MFGN"); - _thinkink_driver = - wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_290_GRAYSCALE4_MFGN; - _disp_thinkink_grayscale4_eaamfgn = - new drvDispThinkInkGrayscale4Eaamfgn(dc, rst, cs, srcs, busy); - if (!_disp_thinkink_grayscale4_eaamfgn) { - WS_DEBUG_PRINTLN("[display] Failed to allocate ThinkInk driver!"); - return false; // Allocation failed - } - if (!_disp_thinkink_grayscale4_eaamfgn->begin(epd_mode)) { - WS_DEBUG_PRINTLN("[display] Failed to initialize ThinkInk driver!"); - delete _disp_thinkink_grayscale4_eaamfgn; // Clean up if initialization - // failed - _disp_thinkink_grayscale4_eaamfgn = nullptr; - return false; // Initialization failed - } - WS_DEBUG_PRINTLN("[display] ThinkInk 290 Grayscale4 MFGN driver " - "initialized successfully!"); - } else { - WS_DEBUG_PRINTLN("[display] Unsupported EPD panel type!"); - return false; // Unsupported panel type + if (!_disp_drv_base->begin(epd_mode)) { + WS_DEBUG_PRINTLN("[display] Failed to begin display driver!"); + delete _disp_drv_base; // Clean up if initialization failed + _disp_drv_base = nullptr; + return false; // Failed to begin display driver } return true; // Configuration successful diff --git a/src/components/display/hardware.h b/src/components/display/hardware.h index 6bf8b9513..0622c5f11 100644 --- a/src/components/display/hardware.h +++ b/src/components/display/hardware.h @@ -17,6 +17,8 @@ #include "Wippersnapper.h" #include "drivers/dispDrvBase.h" #include "drivers/dispDrvThinkInkGrayscale4Eaamfgn.h" +#include +#include /**************************************************************************/ /*! @@ -44,7 +46,7 @@ class DisplayHardware { const char *_name; ///< Identifies the hardware instance wippersnapper_display_v1_DisplayType _type; ///< Display type wippersnapper_display_v1_EPDThinkInkPanel - _thinkink_driver; ///< ThinkInk driver type - drvDispThinkInkGrayscale4Eaamfgn *_disp_thinkink_grayscale4_eaamfgn = nullptr; + _thinkink_driver; ///< ThinkInk driver type + dispDrvBase *_disp_drv_base = nullptr; ///< Base display driver }; #endif // WS_DISPLAY_HARDWARE_H \ No newline at end of file From ca75bf0f188b0c994ac794468ed7c70db0d75d43 Mon Sep 17 00:00:00 2001 From: brentru Date: Mon, 18 Aug 2025 14:46:33 -0400 Subject: [PATCH 12/23] Match 711bf14..000802e --- src/Wippersnapper_demo.ino.cpp | 26 ---------------- src/components/display/hardware.cpp | 18 ----------- src/components/display/hardware.h | 16 ++++++---- .../description/v1/description.pb.c | 2 +- .../description/v1/description.pb.h | 2 +- src/wippersnapper/display/v1/display.pb.c | 3 +- src/wippersnapper/display/v1/display.pb.h | 31 ++++++------------- 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 | 4 +-- src/wippersnapper/uart/v1/uart.pb.c | 2 +- src/wippersnapper/uart/v1/uart.pb.h | 2 +- 23 files changed, 39 insertions(+), 93 deletions(-) delete mode 100644 src/Wippersnapper_demo.ino.cpp diff --git a/src/Wippersnapper_demo.ino.cpp b/src/Wippersnapper_demo.ino.cpp deleted file mode 100644 index 05fbd12e9..000000000 --- a/src/Wippersnapper_demo.ino.cpp +++ /dev/null @@ -1,26 +0,0 @@ -# 1 "/var/folders/ff/dmzflvf52tq9kzvt6g8jglxw0000gn/T/tmp8qooypzx" -#include -# 1 "/Users/brentrubell/Documents/Arduino/libraries/Adafruit_Wippersnapper_Arduino/src/Wippersnapper_demo.ino" -# 16 "/Users/brentrubell/Documents/Arduino/libraries/Adafruit_Wippersnapper_Arduino/src/Wippersnapper_demo.ino" -#include "Wippersnapper_Networking.h" -Wippersnapper_WiFi wipper; - - -#define WS_DEBUG -void setup(); -void loop(); -#line 22 "/Users/brentrubell/Documents/Arduino/libraries/Adafruit_Wippersnapper_Arduino/src/Wippersnapper_demo.ino" -void setup() { - - wipper.provision(); - - Serial.begin(115200); - - - wipper.connect(); - -} - -void loop() { - wipper.run(); -} \ No newline at end of file diff --git a/src/components/display/hardware.cpp b/src/components/display/hardware.cpp index 2b1cd1297..30fbc24a4 100644 --- a/src/components/display/hardware.cpp +++ b/src/components/display/hardware.cpp @@ -176,24 +176,6 @@ bool DisplayHardware::beginEPD( return true; // Configuration successful } -/*! - @brief Initializes the display hardware. - @param reset - Whether to reset the display hardware. - @return True if initialization was successful, false otherwise. -*/ -bool DisplayHardware::begin(bool reset) { - return true; // Placeholder for actual initialization logic -} - -/*! - @brief Sets the text size for the display. - @param sz - The size of the text to set. -*/ -void DisplayHardware::setTextSize(uint8_t sz) { - // Placeholder for setting text size on the display TODO -} /*! @brief Gets the name of the display hardware instance. diff --git a/src/components/display/hardware.h b/src/components/display/hardware.h index 0622c5f11..7317e674f 100644 --- a/src/components/display/hardware.h +++ b/src/components/display/hardware.h @@ -32,21 +32,25 @@ class DisplayHardware { public: DisplayHardware(const char *name); ~DisplayHardware(); - // High-level API functions + + // + // API for configuring the display hardware // + // const char *getName(); void setType(wippersnapper_display_v1_DisplayType type); wippersnapper_display_v1_DisplayType getType(); bool beginEPD(wippersnapper_display_v1_EPDConfig *config, wippersnapper_display_v1_EpdSpiConfig *spi_config); - bool begin(bool reset = true); - // API functions to abstract Adafruit_GFX - void setTextSize(uint8_t sz); + + // + // API for Adafruit_GFX that abstracts hardware functionality + // NOTE: These methods are meant to be implemented within dispDrvBase and exposed within dispDrv driver instances + // + // TODO private: const char *_name; ///< Identifies the hardware instance wippersnapper_display_v1_DisplayType _type; ///< Display type - wippersnapper_display_v1_EPDThinkInkPanel - _thinkink_driver; ///< ThinkInk driver type dispDrvBase *_disp_drv_base = nullptr; ///< Base display driver }; #endif // WS_DISPLAY_HARDWARE_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 b0f15a4ad..5c5f8d643 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 Fri Aug 15 17:34:50 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Aug 18 18:41:06 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 c74878946..0cfb40792 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 Fri Aug 15 17:34:50 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Aug 18 18:41:06 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 e0ced97b2..1e88f3178 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 Fri Aug 15 17:34:50 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Aug 18 18:41:06 2025. */ #include "wippersnapper/display/v1/display.pb.h" #if PB_PROTO_HEADER_VERSION != 40 @@ -34,4 +34,3 @@ PB_BIND(wippersnapper_display_v1_DisplayRemoved, wippersnapper_display_v1_Displa - diff --git a/src/wippersnapper/display/v1/display.pb.h b/src/wippersnapper/display/v1/display.pb.h index fb19c2f75..69d1ae6a4 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 Fri Aug 15 17:34:50 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Aug 18 18:41:06 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 @@ -35,12 +35,6 @@ typedef enum _wippersnapper_display_v1_EPDColors { wippersnapper_display_v1_EPDColors_EPD_COLORS_YELLOW = 7 } wippersnapper_display_v1_EPDColors; -typedef enum _wippersnapper_display_v1_EPDThinkInkPanel { - wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_UNSPECIFIED = 0, - wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_290_GRAYSCALE4_MFGN = 1, - wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_290_GRAYSCALE4_T5 = 2 -} wippersnapper_display_v1_EPDThinkInkPanel; - /* Struct definitions */ typedef struct _wippersnapper_display_v1_DisplayAddedorReplaced { bool did_add; @@ -56,7 +50,6 @@ typedef struct _wippersnapper_display_v1_DisplayRemoved { typedef struct _wippersnapper_display_v1_EPDConfig { wippersnapper_display_v1_EPDMode mode; - wippersnapper_display_v1_EPDThinkInkPanel panel; int32_t width; int32_t height; } wippersnapper_display_v1_EPDConfig; @@ -111,10 +104,6 @@ typedef struct _wippersnapper_display_v1_DisplayWrite { #define _wippersnapper_display_v1_EPDColors_MAX wippersnapper_display_v1_EPDColors_EPD_COLORS_YELLOW #define _wippersnapper_display_v1_EPDColors_ARRAYSIZE ((wippersnapper_display_v1_EPDColors)(wippersnapper_display_v1_EPDColors_EPD_COLORS_YELLOW+1)) -#define _wippersnapper_display_v1_EPDThinkInkPanel_MIN wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_UNSPECIFIED -#define _wippersnapper_display_v1_EPDThinkInkPanel_MAX wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_290_GRAYSCALE4_T5 -#define _wippersnapper_display_v1_EPDThinkInkPanel_ARRAYSIZE ((wippersnapper_display_v1_EPDThinkInkPanel)(wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_290_GRAYSCALE4_T5+1)) - #ifdef __cplusplus extern "C" { @@ -122,7 +111,7 @@ extern "C" { /* Initializer values for message structs */ #define wippersnapper_display_v1_EpdSpiConfig_init_default {0, "", "", "", "", ""} -#define wippersnapper_display_v1_EPDConfig_init_default {_wippersnapper_display_v1_EPDMode_MIN, _wippersnapper_display_v1_EPDThinkInkPanel_MIN, 0, 0} +#define wippersnapper_display_v1_EPDConfig_init_default {_wippersnapper_display_v1_EPDMode_MIN, 0, 0} #define wippersnapper_display_v1_EPDWriteOptions_init_default {0, _wippersnapper_display_v1_EPDColors_MIN} #define wippersnapper_display_v1_DisplayAddOrReplace_init_default {_wippersnapper_display_v1_DisplayType_MIN, "", 0, {wippersnapper_display_v1_EpdSpiConfig_init_default}, 0, {wippersnapper_display_v1_EPDConfig_init_default}} #define wippersnapper_display_v1_DisplayRemove_init_default {""} @@ -130,7 +119,7 @@ extern "C" { #define wippersnapper_display_v1_DisplayAddedorReplaced_init_default {0} #define wippersnapper_display_v1_DisplayRemoved_init_default {0} #define wippersnapper_display_v1_EpdSpiConfig_init_zero {0, "", "", "", "", ""} -#define wippersnapper_display_v1_EPDConfig_init_zero {_wippersnapper_display_v1_EPDMode_MIN, _wippersnapper_display_v1_EPDThinkInkPanel_MIN, 0, 0} +#define wippersnapper_display_v1_EPDConfig_init_zero {_wippersnapper_display_v1_EPDMode_MIN, 0, 0} #define wippersnapper_display_v1_EPDWriteOptions_init_zero {0, _wippersnapper_display_v1_EPDColors_MIN} #define wippersnapper_display_v1_DisplayAddOrReplace_init_zero {_wippersnapper_display_v1_DisplayType_MIN, "", 0, {wippersnapper_display_v1_EpdSpiConfig_init_zero}, 0, {wippersnapper_display_v1_EPDConfig_init_zero}} #define wippersnapper_display_v1_DisplayRemove_init_zero {""} @@ -143,9 +132,8 @@ extern "C" { #define wippersnapper_display_v1_DisplayRemove_name_tag 1 #define wippersnapper_display_v1_DisplayRemoved_did_remove_tag 1 #define wippersnapper_display_v1_EPDConfig_mode_tag 1 -#define wippersnapper_display_v1_EPDConfig_panel_tag 2 -#define wippersnapper_display_v1_EPDConfig_width_tag 3 -#define wippersnapper_display_v1_EPDConfig_height_tag 4 +#define wippersnapper_display_v1_EPDConfig_width_tag 2 +#define wippersnapper_display_v1_EPDConfig_height_tag 3 #define wippersnapper_display_v1_EPDWriteOptions_text_size_tag 1 #define wippersnapper_display_v1_EPDWriteOptions_color_tag 2 #define wippersnapper_display_v1_EpdSpiConfig_bus_tag 1 @@ -175,9 +163,8 @@ X(a, STATIC, SINGULAR, STRING, pin_busy, 6) #define wippersnapper_display_v1_EPDConfig_FIELDLIST(X, a) \ X(a, STATIC, SINGULAR, UENUM, mode, 1) \ -X(a, STATIC, SINGULAR, UENUM, panel, 2) \ -X(a, STATIC, SINGULAR, INT32, width, 3) \ -X(a, STATIC, SINGULAR, INT32, height, 4) +X(a, STATIC, SINGULAR, INT32, width, 2) \ +X(a, STATIC, SINGULAR, INT32, height, 3) #define wippersnapper_display_v1_EPDConfig_CALLBACK NULL #define wippersnapper_display_v1_EPDConfig_DEFAULT NULL @@ -241,9 +228,9 @@ extern const pb_msgdesc_t wippersnapper_display_v1_DisplayRemoved_msg; /* Maximum encoded size of messages (where known) */ #define wippersnapper_display_v1_EpdSpiConfig_size 46 -#define wippersnapper_display_v1_EPDConfig_size 26 +#define wippersnapper_display_v1_EPDConfig_size 24 #define wippersnapper_display_v1_EPDWriteOptions_size 13 -#define wippersnapper_display_v1_DisplayAddOrReplace_size 143 +#define wippersnapper_display_v1_DisplayAddOrReplace_size 141 #define wippersnapper_display_v1_DisplayRemove_size 7 #define wippersnapper_display_v1_DisplayWrite_size 29 #define wippersnapper_display_v1_DisplayAddedorReplaced_size 2 diff --git a/src/wippersnapper/ds18x20/v1/ds18x20.pb.c b/src/wippersnapper/ds18x20/v1/ds18x20.pb.c index 982aa0c74..c6200ad21 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 Fri Aug 15 17:34:50 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Aug 18 18:41:06 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 832684805..c0e908f33 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 Fri Aug 15 17:34:50 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Aug 18 18:41:06 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 4e0b0d556..1e4b8a37d 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 Fri Aug 15 17:34:50 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Aug 18 18:41:06 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 bb436342e..36375187f 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 Fri Aug 15 17:34:50 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Aug 18 18:41:06 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 b36c39da6..c561f5b9c 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 Fri Aug 15 17:34:50 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Aug 18 18:41:06 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 a43271502..2ad5dc5e4 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 Fri Aug 15 17:34:50 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Aug 18 18:41:06 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 ab8eea0ea..7382bd3a5 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 Fri Aug 15 17:34:50 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Aug 18 18:41:06 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 0185e165f..c9090e070 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 Fri Aug 15 17:34:50 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Aug 18 18:41:06 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 4064b8e24..ad242e2a7 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 Fri Aug 15 17:34:50 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Aug 18 18:41:06 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 56d380ed1..c0add168c 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 Fri Aug 15 17:34:50 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Aug 18 18:41:06 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 19195804d..8b1e357a0 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 Fri Aug 15 17:34:50 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Aug 18 18:41:06 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 754f4c0dc..2b56dafa3 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 Fri Aug 15 17:34:50 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Aug 18 18:41:06 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 2c3c348f9..d3ebe5c5d 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 Fri Aug 15 17:34:50 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Aug 18 18:41:06 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 2426bbac1..55f89e858 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 Fri Aug 15 17:34:50 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Aug 18 18:41:06 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 @@ -463,7 +463,7 @@ union wippersnapper_signal_v1_CreateSignalRequest_payload_size_union {char f6[(6 #define wippersnapper_signal_v1_SignalResponse_size 2 #define wippersnapper_signal_v1_PWMRequest_size 82 #define wippersnapper_signal_v1_PWMResponse_size 11 -#define wippersnapper_signal_v1_DisplayRequest_size 146 +#define wippersnapper_signal_v1_DisplayRequest_size 144 #define wippersnapper_signal_v1_DisplayResponse_size 4 #ifdef __cplusplus diff --git a/src/wippersnapper/uart/v1/uart.pb.c b/src/wippersnapper/uart/v1/uart.pb.c index 7c4c78868..61e2dfcb0 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 Fri Aug 15 17:34:50 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Aug 18 18:41:06 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 3a9b70fb2..c204458a2 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 Fri Aug 15 17:34:50 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon Aug 18 18:41:06 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 12d23548e2a4ce99165f22e430c0d00c8ed151e9 Mon Sep 17 00:00:00 2001 From: brentru Date: Tue, 19 Aug 2025 12:15:55 -0400 Subject: [PATCH 13/23] Route DisplayWrite throughout MVC --- src/Wippersnapper.cpp | 11 +++++ src/components/display/controller.cpp | 28 +++++++++++ src/components/display/controller.h | 3 +- src/components/display/drivers/dispDrvBase.h | 4 +- .../dispDrvThinkInkGrayscale4Eaamfgn.h | 46 +++++++++++++++++++ src/components/display/hardware.cpp | 20 ++++---- src/components/display/hardware.h | 7 +-- 7 files changed, 104 insertions(+), 15 deletions(-) diff --git a/src/Wippersnapper.cpp b/src/Wippersnapper.cpp index 3ead64bf3..528d793f3 100644 --- a/src/Wippersnapper.cpp +++ b/src/Wippersnapper.cpp @@ -1688,6 +1688,17 @@ bool cbDecodeDisplayMsg(pb_istream_t *stream, const pb_field_t *field, WS._displayController->Handle_Display_AddOrReplace(&msgAddReq); // TODO: Add response handling and publishing here, for now it always // returns true and doesnt publish back to the broker + } else if (field->tag == + wippersnapper_signal_v1_DisplayRequest_display_write_tag) { + // Decode message into a DisplayAddRequest + wippersnapper_display_v1_DisplayWrite msgWrite = + wippersnapper_display_v1_DisplayWrite_init_zero; + if (!ws_pb_decode(stream, wippersnapper_display_v1_DisplayWrite_fields, + &msgWrite)) { + WS_DEBUG_PRINTLN("ERROR: Failure decoding DisplayWrite message!"); + return false; + } + WS._displayController->Handle_Display_Write(&msgWrite); } return true; } diff --git a/src/components/display/controller.cpp b/src/components/display/controller.cpp index 1c8e515ea..e583601bb 100644 --- a/src/components/display/controller.cpp +++ b/src/components/display/controller.cpp @@ -84,4 +84,32 @@ bool DisplayController::Handle_Display_Remove( } WS_DEBUG_PRINTLN("[display] Could not remove display, not found!"); return false; +} + +/*! + @brief Handles a Display_Write message. + @param msgWrite + Pointer to a DisplayWrite message structure. + @return True if the display write was successful, false otherwise. +*/ +bool DisplayController::Handle_Display_Write( + wippersnapper_display_v1_DisplayWrite *msgWrite) { + // Get the driver instance for the display + DisplayHardware *display = nullptr; + for (auto &hw_instance : _hw_instances) { + if (strcmp(hw_instance->getName(), msgWrite->name) == 0) { + display = hw_instance; + break; + } + } + + // Early-out if display not found + if (!display) { + WS_DEBUG_PRINTLN("[display] Failed to write, driver not found!"); + return false; + } + + // Write the message to the display + display->writeMessage(msgWrite->message); + return true; } \ No newline at end of file diff --git a/src/components/display/controller.h b/src/components/display/controller.h index e203ed9de..f4c087e30 100644 --- a/src/components/display/controller.h +++ b/src/components/display/controller.h @@ -34,7 +34,8 @@ class DisplayController { bool Handle_Display_AddOrReplace( wippersnapper_display_v1_DisplayAddOrReplace *msgAdd); bool Handle_Display_Remove(wippersnapper_display_v1_DisplayRemove *msgRemove); - // bool Handle_Display_Write(...); + bool Handle_Display_Write(wippersnapper_display_v1_DisplayWrite *msgWrite); + private: std::vector _hw_instances; ///< Holds pointers to DisplayHardware instances diff --git a/src/components/display/drivers/dispDrvBase.h b/src/components/display/drivers/dispDrvBase.h index a95c6d7eb..d8eb78796 100644 --- a/src/components/display/drivers/dispDrvBase.h +++ b/src/components/display/drivers/dispDrvBase.h @@ -31,15 +31,17 @@ class dispDrvBase { // Destructor implementation (if we need one) }; - // Virtual function to be implemented by derived classes virtual bool begin(thinkinkmode_t mode, bool reset = true); + virtual void writeMessage(const char *message) = 0; + protected: int16_t _pin_dc; int16_t _pin_rst; int16_t _pin_cs; int16_t _pin_busy; int16_t _pin_sram_cs; // for optional EPD SRAM chip select + uint8_t _text_sz = 1; ///< Text size for display messages }; #endif // WS_DISP_DRV_BASE_H \ No newline at end of file diff --git a/src/components/display/drivers/dispDrvThinkInkGrayscale4Eaamfgn.h b/src/components/display/drivers/dispDrvThinkInkGrayscale4Eaamfgn.h index 0c347d220..34ccb99d0 100644 --- a/src/components/display/drivers/dispDrvThinkInkGrayscale4Eaamfgn.h +++ b/src/components/display/drivers/dispDrvThinkInkGrayscale4Eaamfgn.h @@ -41,9 +41,55 @@ class drvDispThinkInkGrayscale4Eaamfgn : public dispDrvBase { // Clear the display buffer _display->clearBuffer(); _display->display(); + return true; } + virtual void writeMessage(const char *message) override { + if (_display == nullptr) + return; + + // Start with a fresh display buffer + // and settings + int16_t y_idx = 0; + _display->clearDisplay(); + _display->setTextSize(_text_sz); + _display->setTextColor(EPD_BLACK); + _display->setCursor(0, y_idx); + _display->display(); + + // 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); + for (size_t i = 0; i < msg_size && c_idx < msg_size; i++) { + 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 + y_idx += line_height; + _display->setCursor(0, y_idx); + i += 3; + } else if (message[i + 1] == 'n') { + // Skip to the next line + y_idx += line_height; + _display->setCursor(0, y_idx); + i++; + } + } else if (message[i] == 0xC2 && message[i + 1] == 0xB0) { + _display->write(char(248)); + _display->display(); + i++; + } else { + _display->print(message[i]); + _display->display(); + } + } + } + private: ThinkInk_290_Grayscale4_EAAMFGN *_display; }; diff --git a/src/components/display/hardware.cpp b/src/components/display/hardware.cpp index 30fbc24a4..f8f67bdd9 100644 --- a/src/components/display/hardware.cpp +++ b/src/components/display/hardware.cpp @@ -105,13 +105,6 @@ bool DisplayHardware::beginEPD( return false; } - // Validate panel type - if (config->panel == - wippersnapper_display_v1_EPDThinkInkPanel_EPD_THINK_INK_PANEL_UNSPECIFIED) { - WS_DEBUG_PRINTLN("[display] Unsupported EPD panel type!"); - return false; // Unsupported panel type - } - // Validate mode is a correct EPD mode if (config->mode == wippersnapper_display_v1_EPDMode_EPD_MODE_UNSPECIFIED) { WS_DEBUG_PRINTLN("[display] Unsupported EPD mode!"); @@ -168,17 +161,24 @@ bool DisplayHardware::beginEPD( if (!_disp_drv_base->begin(epd_mode)) { WS_DEBUG_PRINTLN("[display] Failed to begin display driver!"); - delete _disp_drv_base; // Clean up if initialization failed + delete _disp_drv_base; _disp_drv_base = nullptr; - return false; // Failed to begin display driver + return false; } return true; // Configuration successful } - /*! @brief Gets the name of the display hardware instance. @return The name of the display hardware instance. */ const char *DisplayHardware::getName() { return _name; } + +void DisplayHardware::writeMessage(const char *message) { + if (_disp_drv_base) { + _disp_drv_base->writeMessage(message); + } else { + WS_DEBUG_PRINTLN("[display] No display driver initialized!"); + } +} \ No newline at end of file diff --git a/src/components/display/hardware.h b/src/components/display/hardware.h index 7317e674f..996d2689c 100644 --- a/src/components/display/hardware.h +++ b/src/components/display/hardware.h @@ -44,13 +44,14 @@ class DisplayHardware { // // API for Adafruit_GFX that abstracts hardware functionality - // NOTE: These methods are meant to be implemented within dispDrvBase and exposed within dispDrv driver instances + // NOTE: These methods are meant to be implemented within dispDrvBase and + // exposed within dispDrv driver instances // - // TODO + void writeMessage(const char *message); private: const char *_name; ///< Identifies the hardware instance wippersnapper_display_v1_DisplayType _type; ///< Display type - dispDrvBase *_disp_drv_base = nullptr; ///< Base display driver + dispDrvBase *_disp_drv_base = nullptr; ///< Base display driver }; #endif // WS_DISPLAY_HARDWARE_H \ No newline at end of file From e8fbd8786c4d3a4a02b807daa38f7b2edb03ca2d Mon Sep 17 00:00:00 2001 From: brentru Date: Tue, 19 Aug 2025 15:40:46 -0400 Subject: [PATCH 14/23] Checkin Display Write handler code --- src/Wippersnapper.cpp | 5 +++- src/Wippersnapper_demo.ino.cpp | 26 +++++++++++++++++++ src/components/display/controller.cpp | 5 ++++ .../dispDrvThinkInkGrayscale4Eaamfgn.h | 8 +++--- src/components/display/hardware.cpp | 15 ++++++++--- src/components/display/hardware.h | 2 +- .../description/v1/description.pb.c | 2 +- .../description/v1/description.pb.h | 2 +- src/wippersnapper/display/v1/display.pb.c | 4 +-- src/wippersnapper/display/v1/display.pb.h | 12 ++++----- 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 | 4 +-- src/wippersnapper/signal/v1/signal.pb.h | 4 +-- src/wippersnapper/uart/v1/uart.pb.c | 2 +- src/wippersnapper/uart/v1/uart.pb.h | 2 +- 26 files changed, 79 insertions(+), 38 deletions(-) create mode 100644 src/Wippersnapper_demo.ino.cpp diff --git a/src/Wippersnapper.cpp b/src/Wippersnapper.cpp index 528d793f3..28e74e8c1 100644 --- a/src/Wippersnapper.cpp +++ b/src/Wippersnapper.cpp @@ -2424,7 +2424,7 @@ bool Wippersnapper::generateWSTopics() { // /display topic // - // Pre-determine topic size +// Pre-determine topic size topicLen = strlen(WS._config.aio_user) + strlen("/") + strlen(_device_uid) + strlen("/wprsnpr/") + strlen(TOPIC_SIGNALS) + strlen("broker") + strlen(TOPIC_DISPLAY) + 1; @@ -2449,7 +2449,10 @@ bool Wippersnapper::generateWSTopics() { // Subscribe to signal's DISPLAY sub-topic and set callback _topic_signal_display_sub = new Adafruit_MQTT_Subscribe(WS._mqtt, WS._topic_signal_display_brkr, 1); + WS_DEBUG_PRINTLN("Subscribing to DISPLAY topic: "); + WS_DEBUG_PRINTLN(WS._topic_signal_display_brkr); WS._mqtt->subscribe(_topic_signal_display_sub); + WS_DEBUG_PRINTLN("Subscribed to DISPLAY topic!"); _topic_signal_display_sub->setCallback(cbDisplayMessage); // Calculate length of the topic for device-to-broker DISPLAY topic diff --git a/src/Wippersnapper_demo.ino.cpp b/src/Wippersnapper_demo.ino.cpp new file mode 100644 index 000000000..cd92237c7 --- /dev/null +++ b/src/Wippersnapper_demo.ino.cpp @@ -0,0 +1,26 @@ +# 1 "/var/folders/ff/dmzflvf52tq9kzvt6g8jglxw0000gn/T/tmplty6x38x" +#include +# 1 "/Users/brentrubell/Documents/Arduino/libraries/Adafruit_Wippersnapper_Arduino/src/Wippersnapper_demo.ino" +# 16 "/Users/brentrubell/Documents/Arduino/libraries/Adafruit_Wippersnapper_Arduino/src/Wippersnapper_demo.ino" +#include "Wippersnapper_Networking.h" +Wippersnapper_WiFi wipper; + + +#define WS_DEBUG +void setup(); +void loop(); +#line 22 "/Users/brentrubell/Documents/Arduino/libraries/Adafruit_Wippersnapper_Arduino/src/Wippersnapper_demo.ino" +void setup() { + + wipper.provision(); + + Serial.begin(115200); + + + wipper.connect(); + +} + +void loop() { + wipper.run(); +} \ No newline at end of file diff --git a/src/components/display/controller.cpp b/src/components/display/controller.cpp index e583601bb..d85794c43 100644 --- a/src/components/display/controller.cpp +++ b/src/components/display/controller.cpp @@ -38,6 +38,8 @@ DisplayController::~DisplayController() { bool DisplayController::Handle_Display_AddOrReplace( wippersnapper_display_v1_DisplayAddOrReplace *msgAdd) { DisplayHardware *display = new DisplayHardware(msgAdd->name); + WS_DEBUG_PRINT("[display] Adding or replacing display: "); + WS_DEBUG_PRINTLN(msgAdd->name); // Configure display type display->setType(msgAdd->type); @@ -97,6 +99,9 @@ bool DisplayController::Handle_Display_Write( // Get the driver instance for the display DisplayHardware *display = nullptr; for (auto &hw_instance : _hw_instances) { + // print hte _hw_instances name + WS_DEBUG_PRINT("[display] Checking hardware instance: "); + WS_DEBUG_PRINTLN(hw_instance->getName()); if (strcmp(hw_instance->getName(), msgWrite->name) == 0) { display = hw_instance; break; diff --git a/src/components/display/drivers/dispDrvThinkInkGrayscale4Eaamfgn.h b/src/components/display/drivers/dispDrvThinkInkGrayscale4Eaamfgn.h index 34ccb99d0..adcd849d7 100644 --- a/src/components/display/drivers/dispDrvThinkInkGrayscale4Eaamfgn.h +++ b/src/components/display/drivers/dispDrvThinkInkGrayscale4Eaamfgn.h @@ -1,7 +1,7 @@ /*! * @file src/components/display/drivers/drvDispThinkInkGrayscale4Eaamfgn.h * - * Driver for ThinkInk 2.9" Grayscale 4-level EAAMFGN display (2025 MagTag). + * Driver for ThinkInk 2.9" Grayscale 4-level EAAMFGN display (present on the 2025 version of the Adafruit MagTag) * * Adafruit invests time and resources providing this open source code, * please support Adafruit and open-source hardware by purchasing @@ -41,6 +41,7 @@ class drvDispThinkInkGrayscale4Eaamfgn : public dispDrvBase { // Clear the display buffer _display->clearBuffer(); _display->display(); + _text_sz = 3; // Configure default magTag text size return true; } @@ -55,8 +56,8 @@ class drvDispThinkInkGrayscale4Eaamfgn : public dispDrvBase { _display->clearDisplay(); _display->setTextSize(_text_sz); _display->setTextColor(EPD_BLACK); + _display->setTextWrap(true); _display->setCursor(0, y_idx); - _display->display(); // Calculate the line height based on the text size (NOTE: base height is // 8px) @@ -81,13 +82,12 @@ class drvDispThinkInkGrayscale4Eaamfgn : public dispDrvBase { } } else if (message[i] == 0xC2 && message[i + 1] == 0xB0) { _display->write(char(248)); - _display->display(); i++; } else { _display->print(message[i]); - _display->display(); } } + _display->display(); } private: diff --git a/src/components/display/hardware.cpp b/src/components/display/hardware.cpp index f8f67bdd9..59a8def95 100644 --- a/src/components/display/hardware.cpp +++ b/src/components/display/hardware.cpp @@ -27,7 +27,13 @@ static const std::map FactoryDrvDisp = { [](int16_t dc, int16_t rst, int16_t cs, int16_t sram_cs, int16_t busy) -> dispDrvBase * { return new drvDispThinkInkGrayscale4Eaamfgn(dc, rst, cs, sram_cs, busy); - }}}; + }}, + {"magtag_2025", + [](int16_t dc, int16_t rst, int16_t cs, int16_t sram_cs, + int16_t busy) -> dispDrvBase * { + return new drvDispThinkInkGrayscale4Eaamfgn(dc, rst, cs, sram_cs, busy); + }} + }; /*! @brief Creates a new display driver instance based on the driver name. @@ -50,9 +56,9 @@ dispDrvBase *CreateDrvDisp(const char *driver_name, int16_t dc, int16_t rst, int16_t cs, int16_t sram_cs = -1, int16_t busy = -1) { auto it = FactoryDrvDisp.find(driver_name); - if (it == FactoryDrvDisp.end()) { + if (it == FactoryDrvDisp.end()) return nullptr; - } + return it->second(dc, rst, cs, sram_cs, busy); } @@ -60,7 +66,8 @@ dispDrvBase *CreateDrvDisp(const char *driver_name, int16_t dc, int16_t rst, @brief Constructs a new DisplayHardware object */ DisplayHardware::DisplayHardware(const char *name) { - _name = name; ///< Set the name of the hardware instance + strncpy(_name, name, sizeof(_name) - 1); + _name[sizeof(_name) - 1] = '\0'; _type = wippersnapper_display_v1_DisplayType_DISPLAY_TYPE_UNSPECIFIED; } diff --git a/src/components/display/hardware.h b/src/components/display/hardware.h index 996d2689c..17c36ee09 100644 --- a/src/components/display/hardware.h +++ b/src/components/display/hardware.h @@ -50,7 +50,7 @@ class DisplayHardware { void writeMessage(const char *message); private: - const char *_name; ///< Identifies the hardware instance + char _name[64]; ///< Identifies the hardware instance wippersnapper_display_v1_DisplayType _type; ///< Display type dispDrvBase *_disp_drv_base = nullptr; ///< Base display driver }; diff --git a/src/wippersnapper/description/v1/description.pb.c b/src/wippersnapper/description/v1/description.pb.c index 5c5f8d643..a01de88c0 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 Mon Aug 18 18:41:06 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue Aug 19 17:48:25 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 0cfb40792..9aad63649 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 Mon Aug 18 18:41:06 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue Aug 19 17:48:25 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 1e88f3178..48d44bb8a 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 Mon Aug 18 18:41:06 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue Aug 19 17:48:25 2025. */ #include "wippersnapper/display/v1/display.pb.h" #if PB_PROTO_HEADER_VERSION != 40 @@ -21,7 +21,7 @@ PB_BIND(wippersnapper_display_v1_DisplayAddOrReplace, wippersnapper_display_v1_D PB_BIND(wippersnapper_display_v1_DisplayRemove, wippersnapper_display_v1_DisplayRemove, AUTO) -PB_BIND(wippersnapper_display_v1_DisplayWrite, wippersnapper_display_v1_DisplayWrite, AUTO) +PB_BIND(wippersnapper_display_v1_DisplayWrite, wippersnapper_display_v1_DisplayWrite, 2) PB_BIND(wippersnapper_display_v1_DisplayAddedorReplaced, wippersnapper_display_v1_DisplayAddedorReplaced, AUTO) diff --git a/src/wippersnapper/display/v1/display.pb.h b/src/wippersnapper/display/v1/display.pb.h index 69d1ae6a4..69a0aa023 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 Mon Aug 18 18:41:06 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue Aug 19 17:48:25 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 @@ -41,7 +41,7 @@ typedef struct _wippersnapper_display_v1_DisplayAddedorReplaced { } wippersnapper_display_v1_DisplayAddedorReplaced; typedef struct _wippersnapper_display_v1_DisplayRemove { - char name[6]; + char name[64]; } wippersnapper_display_v1_DisplayRemove; typedef struct _wippersnapper_display_v1_DisplayRemoved { @@ -82,8 +82,8 @@ typedef struct _wippersnapper_display_v1_DisplayAddOrReplace { } wippersnapper_display_v1_DisplayAddOrReplace; typedef struct _wippersnapper_display_v1_DisplayWrite { - char name[6]; - char message[6]; + char name[64]; + char message[1024]; pb_size_t which_options; union { wippersnapper_display_v1_EPDWriteOptions epd_options; @@ -231,8 +231,8 @@ extern const pb_msgdesc_t wippersnapper_display_v1_DisplayRemoved_msg; #define wippersnapper_display_v1_EPDConfig_size 24 #define wippersnapper_display_v1_EPDWriteOptions_size 13 #define wippersnapper_display_v1_DisplayAddOrReplace_size 141 -#define wippersnapper_display_v1_DisplayRemove_size 7 -#define wippersnapper_display_v1_DisplayWrite_size 29 +#define wippersnapper_display_v1_DisplayRemove_size 65 +#define wippersnapper_display_v1_DisplayWrite_size 1106 #define wippersnapper_display_v1_DisplayAddedorReplaced_size 2 #define wippersnapper_display_v1_DisplayRemoved_size 2 diff --git a/src/wippersnapper/ds18x20/v1/ds18x20.pb.c b/src/wippersnapper/ds18x20/v1/ds18x20.pb.c index c6200ad21..f95f752af 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 Mon Aug 18 18:41:06 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue Aug 19 17:48:25 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 c0e908f33..112240f45 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 Mon Aug 18 18:41:06 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue Aug 19 17:48:25 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 1e4b8a37d..88153e9d5 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 Mon Aug 18 18:41:06 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue Aug 19 17:48:25 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 36375187f..5d2523e83 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 Mon Aug 18 18:41:06 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue Aug 19 17:48:25 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 c561f5b9c..2aee561ac 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 Mon Aug 18 18:41:06 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue Aug 19 17:48:25 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 2ad5dc5e4..5b635d492 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 Mon Aug 18 18:41:06 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue Aug 19 17:48:25 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 7382bd3a5..d6beb4b79 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 Mon Aug 18 18:41:06 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue Aug 19 17:48:25 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 c9090e070..72e885682 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 Mon Aug 18 18:41:06 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue Aug 19 17:48:25 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 ad242e2a7..5649c2dd8 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 Mon Aug 18 18:41:06 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue Aug 19 17:48:25 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 c0add168c..5b26ce7eb 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 Mon Aug 18 18:41:06 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue Aug 19 17:48:25 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 8b1e357a0..e012bc73f 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 Mon Aug 18 18:41:06 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue Aug 19 17:48:25 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 2b56dafa3..e285c9957 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 Mon Aug 18 18:41:06 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue Aug 19 17:48:25 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 d3ebe5c5d..d4c6687bf 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 Mon Aug 18 18:41:06 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue Aug 19 17:48:25 2025. */ #include "wippersnapper/signal/v1/signal.pb.h" #if PB_PROTO_HEADER_VERSION != 40 @@ -48,7 +48,7 @@ PB_BIND(wippersnapper_signal_v1_PWMRequest, wippersnapper_signal_v1_PWMRequest, PB_BIND(wippersnapper_signal_v1_PWMResponse, wippersnapper_signal_v1_PWMResponse, AUTO) -PB_BIND(wippersnapper_signal_v1_DisplayRequest, wippersnapper_signal_v1_DisplayRequest, AUTO) +PB_BIND(wippersnapper_signal_v1_DisplayRequest, wippersnapper_signal_v1_DisplayRequest, 2) PB_BIND(wippersnapper_signal_v1_DisplayResponse, wippersnapper_signal_v1_DisplayResponse, AUTO) diff --git a/src/wippersnapper/signal/v1/signal.pb.h b/src/wippersnapper/signal/v1/signal.pb.h index 55f89e858..2a0997d57 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 Mon Aug 18 18:41:06 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue Aug 19 17:48:25 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 @@ -463,7 +463,7 @@ union wippersnapper_signal_v1_CreateSignalRequest_payload_size_union {char f6[(6 #define wippersnapper_signal_v1_SignalResponse_size 2 #define wippersnapper_signal_v1_PWMRequest_size 82 #define wippersnapper_signal_v1_PWMResponse_size 11 -#define wippersnapper_signal_v1_DisplayRequest_size 144 +#define wippersnapper_signal_v1_DisplayRequest_size 1109 #define wippersnapper_signal_v1_DisplayResponse_size 4 #ifdef __cplusplus diff --git a/src/wippersnapper/uart/v1/uart.pb.c b/src/wippersnapper/uart/v1/uart.pb.c index 61e2dfcb0..c81b97eee 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 Mon Aug 18 18:41:06 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue Aug 19 17:48:25 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 c204458a2..4e7fa2a39 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 Mon Aug 18 18:41:06 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue Aug 19 17:48:25 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 cfb893d7baef1bd7da7eed6e5e97616871d0f41c Mon Sep 17 00:00:00 2001 From: brentru Date: Tue, 19 Aug 2025 16:46:22 -0400 Subject: [PATCH 15/23] debugging failed to subscribe err --- src/Wippersnapper.cpp | 29 ++++++++++++++----- src/Wippersnapper_demo.ino.cpp | 2 +- .../dispDrvThinkInkGrayscale4Eaamfgn.h | 3 +- src/components/display/hardware.cpp | 3 +- 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/src/Wippersnapper.cpp b/src/Wippersnapper.cpp index 28e74e8c1..c193ec277 100644 --- a/src/Wippersnapper.cpp +++ b/src/Wippersnapper.cpp @@ -2424,7 +2424,7 @@ bool Wippersnapper::generateWSTopics() { // /display topic // -// Pre-determine topic size + // Pre-determine topic size topicLen = strlen(WS._config.aio_user) + strlen("/") + strlen(_device_uid) + strlen("/wprsnpr/") + strlen(TOPIC_SIGNALS) + strlen("broker") + strlen(TOPIC_DISPLAY) + 1; @@ -2942,6 +2942,26 @@ void Wippersnapper::connect() { haltError("Unable to allocate space for MQTT error topics"); } + // TODO: We are debugging the "Failed to subscribe" issue here prior to + // runNetFSM Print out all topics generated by generateWSTopics() + WS_DEBUG_PRINTLN("MQTT Topics:"); + WS_DEBUG_PRINT(" Device UID: "); + WS_DEBUG_PRINTLN(_device_uid); + // Broker topics only + WS_DEBUG_PRINT(" Broker-to-Device DS18x20 Topic: "); + WS_DEBUG_PRINTLN(WS._topic_signal_ds18_device); + WS_DEBUG_PRINT(" Broker-to-Device Servo Topic: "); + WS_DEBUG_PRINTLN(WS._topic_signal_servo_device); + WS_DEBUG_PRINT(" Broker-to-Device PWM Topic: "); + WS_DEBUG_PRINTLN(WS._topic_signal_pwm_device); + WS_DEBUG_PRINT(" Broker-to-Device Pixels Topic: "); + WS_DEBUG_PRINTLN(WS._topic_signal_pixels_device); + WS_DEBUG_PRINT(" Broker-to-Device UART Topic: "); + WS_DEBUG_PRINTLN(WS._topic_signal_uart_device); + WS_DEBUG_PRINT(" Broker-to-Device Display Topic: "); + WS_DEBUG_PRINTLN(WS._topic_signal_display_device); + delay(500); + // Connect to Network WS_DEBUG_PRINTLN("Running Network FSM..."); // Run the network fsm @@ -2994,13 +3014,6 @@ void Wippersnapper::connect() { statusLEDFade(GREEN, 3); WS_DEBUG_PRINTLN( "Registration and configuration complete!\nRunning application..."); - - // Print out display topics - WS_DEBUG_PRINTLN("Device-to-Broker DISPLAY topic: "); - WS_DEBUG_PRINTLN(WS._topic_signal_display_device); - WS_DEBUG_PRINTLN("Broker-to-Device DISPLAY topic: "); - WS_DEBUG_PRINTLN(WS._topic_signal_display_brkr); - delay(500); } /**************************************************************************/ diff --git a/src/Wippersnapper_demo.ino.cpp b/src/Wippersnapper_demo.ino.cpp index cd92237c7..82b309dfd 100644 --- a/src/Wippersnapper_demo.ino.cpp +++ b/src/Wippersnapper_demo.ino.cpp @@ -1,4 +1,4 @@ -# 1 "/var/folders/ff/dmzflvf52tq9kzvt6g8jglxw0000gn/T/tmplty6x38x" +# 1 "/var/folders/ff/dmzflvf52tq9kzvt6g8jglxw0000gn/T/tmpbebqve76" #include # 1 "/Users/brentrubell/Documents/Arduino/libraries/Adafruit_Wippersnapper_Arduino/src/Wippersnapper_demo.ino" # 16 "/Users/brentrubell/Documents/Arduino/libraries/Adafruit_Wippersnapper_Arduino/src/Wippersnapper_demo.ino" diff --git a/src/components/display/drivers/dispDrvThinkInkGrayscale4Eaamfgn.h b/src/components/display/drivers/dispDrvThinkInkGrayscale4Eaamfgn.h index adcd849d7..0ccb1b7d8 100644 --- a/src/components/display/drivers/dispDrvThinkInkGrayscale4Eaamfgn.h +++ b/src/components/display/drivers/dispDrvThinkInkGrayscale4Eaamfgn.h @@ -1,7 +1,8 @@ /*! * @file src/components/display/drivers/drvDispThinkInkGrayscale4Eaamfgn.h * - * Driver for ThinkInk 2.9" Grayscale 4-level EAAMFGN display (present on the 2025 version of the Adafruit MagTag) + * Driver for ThinkInk 2.9" Grayscale 4-level EAAMFGN display (present on the + * 2025 version of the Adafruit MagTag) * * Adafruit invests time and resources providing this open source code, * please support Adafruit and open-source hardware by purchasing diff --git a/src/components/display/hardware.cpp b/src/components/display/hardware.cpp index 59a8def95..131c8ba8e 100644 --- a/src/components/display/hardware.cpp +++ b/src/components/display/hardware.cpp @@ -32,8 +32,7 @@ static const std::map FactoryDrvDisp = { [](int16_t dc, int16_t rst, int16_t cs, int16_t sram_cs, int16_t busy) -> dispDrvBase * { return new drvDispThinkInkGrayscale4Eaamfgn(dc, rst, cs, sram_cs, busy); - }} - }; + }}}; /*! @brief Creates a new display driver instance based on the driver name. From 024237309654af01a8fcce6d4232180803e9719d Mon Sep 17 00:00:00 2001 From: brentru Date: Wed, 20 Aug 2025 10:48:20 -0400 Subject: [PATCH 16/23] Speed up writeMessage --- src/Wippersnapper.cpp | 20 ------------------- src/Wippersnapper_demo.ino.cpp | 2 +- src/components/display/controller.cpp | 5 ++--- .../dispDrvThinkInkGrayscale4Eaamfgn.h | 12 +++++------ 4 files changed, 9 insertions(+), 30 deletions(-) diff --git a/src/Wippersnapper.cpp b/src/Wippersnapper.cpp index c193ec277..17b19a3c1 100644 --- a/src/Wippersnapper.cpp +++ b/src/Wippersnapper.cpp @@ -2942,26 +2942,6 @@ void Wippersnapper::connect() { haltError("Unable to allocate space for MQTT error topics"); } - // TODO: We are debugging the "Failed to subscribe" issue here prior to - // runNetFSM Print out all topics generated by generateWSTopics() - WS_DEBUG_PRINTLN("MQTT Topics:"); - WS_DEBUG_PRINT(" Device UID: "); - WS_DEBUG_PRINTLN(_device_uid); - // Broker topics only - WS_DEBUG_PRINT(" Broker-to-Device DS18x20 Topic: "); - WS_DEBUG_PRINTLN(WS._topic_signal_ds18_device); - WS_DEBUG_PRINT(" Broker-to-Device Servo Topic: "); - WS_DEBUG_PRINTLN(WS._topic_signal_servo_device); - WS_DEBUG_PRINT(" Broker-to-Device PWM Topic: "); - WS_DEBUG_PRINTLN(WS._topic_signal_pwm_device); - WS_DEBUG_PRINT(" Broker-to-Device Pixels Topic: "); - WS_DEBUG_PRINTLN(WS._topic_signal_pixels_device); - WS_DEBUG_PRINT(" Broker-to-Device UART Topic: "); - WS_DEBUG_PRINTLN(WS._topic_signal_uart_device); - WS_DEBUG_PRINT(" Broker-to-Device Display Topic: "); - WS_DEBUG_PRINTLN(WS._topic_signal_display_device); - delay(500); - // Connect to Network WS_DEBUG_PRINTLN("Running Network FSM..."); // Run the network fsm diff --git a/src/Wippersnapper_demo.ino.cpp b/src/Wippersnapper_demo.ino.cpp index 82b309dfd..68e2f7f00 100644 --- a/src/Wippersnapper_demo.ino.cpp +++ b/src/Wippersnapper_demo.ino.cpp @@ -1,4 +1,4 @@ -# 1 "/var/folders/ff/dmzflvf52tq9kzvt6g8jglxw0000gn/T/tmpbebqve76" +# 1 "/var/folders/ff/dmzflvf52tq9kzvt6g8jglxw0000gn/T/tmpnv6_o84f" #include # 1 "/Users/brentrubell/Documents/Arduino/libraries/Adafruit_Wippersnapper_Arduino/src/Wippersnapper_demo.ino" # 16 "/Users/brentrubell/Documents/Arduino/libraries/Adafruit_Wippersnapper_Arduino/src/Wippersnapper_demo.ino" diff --git a/src/components/display/controller.cpp b/src/components/display/controller.cpp index d85794c43..a80adf0ed 100644 --- a/src/components/display/controller.cpp +++ b/src/components/display/controller.cpp @@ -99,9 +99,6 @@ bool DisplayController::Handle_Display_Write( // Get the driver instance for the display DisplayHardware *display = nullptr; for (auto &hw_instance : _hw_instances) { - // print hte _hw_instances name - WS_DEBUG_PRINT("[display] Checking hardware instance: "); - WS_DEBUG_PRINTLN(hw_instance->getName()); if (strcmp(hw_instance->getName(), msgWrite->name) == 0) { display = hw_instance; break; @@ -115,6 +112,8 @@ bool DisplayController::Handle_Display_Write( } // Write the message to the display + WS_DEBUG_PRINT("[display] Writing message to display: "); + WS_DEBUG_PRINTLN(msgWrite->message); display->writeMessage(msgWrite->message); return true; } \ No newline at end of file diff --git a/src/components/display/drivers/dispDrvThinkInkGrayscale4Eaamfgn.h b/src/components/display/drivers/dispDrvThinkInkGrayscale4Eaamfgn.h index 0ccb1b7d8..9c9f4d027 100644 --- a/src/components/display/drivers/dispDrvThinkInkGrayscale4Eaamfgn.h +++ b/src/components/display/drivers/dispDrvThinkInkGrayscale4Eaamfgn.h @@ -39,10 +39,14 @@ class drvDispThinkInkGrayscale4Eaamfgn : public dispDrvBase { // Initialize the display _display->begin(mode); + // Configure display settings + _text_sz = 3; + _display->setTextSize(_text_sz); + _display->setTextColor(EPD_BLACK); + _display->setTextWrap(false); // Clear the display buffer _display->clearBuffer(); _display->display(); - _text_sz = 3; // Configure default magTag text size return true; } @@ -52,12 +56,8 @@ class drvDispThinkInkGrayscale4Eaamfgn : public dispDrvBase { return; // Start with a fresh display buffer - // and settings + _display->clearBuffer(); int16_t y_idx = 0; - _display->clearDisplay(); - _display->setTextSize(_text_sz); - _display->setTextColor(EPD_BLACK); - _display->setTextWrap(true); _display->setCursor(0, y_idx); // Calculate the line height based on the text size (NOTE: base height is From b5e53344d8f8fdc58c56e43327fe71430f078c72 Mon Sep 17 00:00:00 2001 From: brentru Date: Wed, 20 Aug 2025 13:21:00 -0400 Subject: [PATCH 17/23] Doxygen across new sections --- .gitignore | 4 +- src/Wippersnapper.h | 38 ++++++++---- src/Wippersnapper_demo.ino.cpp | 26 -------- src/components/display/drivers/dispDrvBase.h | 59 +++++++++++++++---- .../dispDrvThinkInkGrayscale4Eaamfgn.h | 43 +++++++++++++- src/components/display/hardware.cpp | 26 +++++--- src/components/display/hardware.h | 4 +- 7 files changed, 136 insertions(+), 64 deletions(-) delete mode 100644 src/Wippersnapper_demo.ino.cpp diff --git a/.gitignore b/.gitignore index 1caed0bc6..a20a9d40f 100644 --- a/.gitignore +++ b/.gitignore @@ -52,4 +52,6 @@ data/ # Misc. Data tests/ -venv/ \ No newline at end of file +venv/ + +Doxyfile \ No newline at end of file diff --git a/src/Wippersnapper.h b/src/Wippersnapper.h index 654fd4c66..758e97f2d 100644 --- a/src/Wippersnapper.h +++ b/src/Wippersnapper.h @@ -47,16 +47,24 @@ // Define actual debug output functions when necessary. #ifdef WS_DEBUG #define WS_DEBUG_PRINT(...) \ - { WS_PRINTER.print(__VA_ARGS__); } ///< Prints debug output. + { \ + WS_PRINTER.print(__VA_ARGS__); \ + } ///< Prints debug output. #define WS_DEBUG_PRINTLN(...) \ - { WS_PRINTER.println(__VA_ARGS__); } ///< Prints line from debug output. + { \ + WS_PRINTER.println(__VA_ARGS__); \ + } ///< Prints line from debug output. #define WS_DEBUG_PRINTHEX(...) \ - { WS_PRINTER.print(__VA_ARGS__, HEX); } ///< Prints debug output. + { \ + WS_PRINTER.print(__VA_ARGS__, HEX); \ + } ///< Prints debug output. #else #define WS_DEBUG_PRINT(...) \ - {} ///< Prints debug output + { \ + } ///< Prints debug output #define WS_DEBUG_PRINTLN(...) \ - {} ///< Prints line from debug output. + { \ + } ///< Prints line from debug output. #endif #define WS_DELAY_WITH_WDT(timeout) \ @@ -127,12 +135,12 @@ #include "display/ws_display_ui_helper.h" #endif +#include "components/display/controller.h" #include "components/ds18x20/ws_ds18x20.h" #include "components/pixels/ws_pixels.h" #include "components/pwm/ws_pwm.h" #include "components/servo/ws_servo.h" #include "components/uart/ws_uart.h" -#include "components/display/controller.h" #if defined(USE_TINYUSB) #include "provisioning/tinyusb/Wippersnapper_FS.h" @@ -154,7 +162,7 @@ #define TOPIC_INFO "/info/" ///< Registration sub-topic #define TOPIC_SIGNALS "/signals/" ///< Signals sub-topic #define TOPIC_I2C "/i2c" ///< I2C sub-topic -#define TOPIC_DISPLAY "/display" ///< Display sub-topic (EPD, OLED, TFT, etc.) +#define TOPIC_DISPLAY "/display" ///< Display sub-topic (EPD, OLED, TFT, etc.) #define MQTT_TOPIC_PIXELS_DEVICE \ "/signals/device/pixel" ///< Pixels device->broker topic #define MQTT_TOPIC_PIXELS_BROKER \ @@ -371,7 +379,8 @@ class Wippersnapper { ws_servo *_servoComponent; ///< Instance of servo class ws_ds18x20 *_ds18x20Component; ///< Instance of DS18x20 class ws_uart *_uartComponent; ///< Instance of UART class - DisplayController *_displayController; ///< Instance of display controller class + DisplayController + *_displayController; ///< Instance of display controller class // TODO: does this really need to be global? uint8_t _macAddr[6]; /*!< Unique network iface identifier */ @@ -408,8 +417,10 @@ class Wippersnapper { char *_topic_signal_pixels_device = NULL; /*!< Topic carries pixel messages */ char *_topic_signal_uart_brkr = NULL; /*!< Topic carries UART messages */ char *_topic_signal_uart_device = NULL; /*!< Topic carries UART messages */ - char *_topic_signal_display_brkr = NULL; /*!< Topic carries messages from a device to a broker. */ - char *_topic_signal_display_device = NULL; /*!< Topic carries messages from a broker to a device. */ + char *_topic_signal_display_brkr = + NULL; /*!< Topic carries messages from a device to a broker. */ + char *_topic_signal_display_device = + NULL; /*!< Topic carries messages from a broker to a device. */ wippersnapper_signal_v1_CreateSignalRequest _incomingSignalMsg; /*!< Incoming signal message from broker */ @@ -436,7 +447,8 @@ class Wippersnapper { wippersnapper_signal_v1_UARTRequest msgSignalUART; ///< UARTReq wrapper message - wippersnapper_signal_v1_DisplayRequest msgSignalDisplay; + wippersnapper_signal_v1_DisplayRequest + msgSignalDisplay; ///< DisplayRequest wrapper message char *throttleMessage; /*!< Pointer to throttle message data. */ int throttleTime; /*!< Total amount of time to throttle the device, in @@ -498,8 +510,8 @@ class Wippersnapper { *_topic_signal_pixels_sub; /*!< Subscribes to pixel device topic. */ Adafruit_MQTT_Subscribe *_topic_signal_uart_sub; /*!< Subscribes to signal's UART topic. */ - Adafruit_MQTT_Subscribe - *_topic_signal_display_sub; /*!< Subscription callback for display topic. */ + Adafruit_MQTT_Subscribe *_topic_signal_display_sub; /*!< Subscription callback + for display topic. */ Adafruit_MQTT_Subscribe *_err_sub; /*!< Subscription to Adafruit IO Error topic. */ diff --git a/src/Wippersnapper_demo.ino.cpp b/src/Wippersnapper_demo.ino.cpp deleted file mode 100644 index 68e2f7f00..000000000 --- a/src/Wippersnapper_demo.ino.cpp +++ /dev/null @@ -1,26 +0,0 @@ -# 1 "/var/folders/ff/dmzflvf52tq9kzvt6g8jglxw0000gn/T/tmpnv6_o84f" -#include -# 1 "/Users/brentrubell/Documents/Arduino/libraries/Adafruit_Wippersnapper_Arduino/src/Wippersnapper_demo.ino" -# 16 "/Users/brentrubell/Documents/Arduino/libraries/Adafruit_Wippersnapper_Arduino/src/Wippersnapper_demo.ino" -#include "Wippersnapper_Networking.h" -Wippersnapper_WiFi wipper; - - -#define WS_DEBUG -void setup(); -void loop(); -#line 22 "/Users/brentrubell/Documents/Arduino/libraries/Adafruit_Wippersnapper_Arduino/src/Wippersnapper_demo.ino" -void setup() { - - wipper.provision(); - - Serial.begin(115200); - - - wipper.connect(); - -} - -void loop() { - wipper.run(); -} \ No newline at end of file diff --git a/src/components/display/drivers/dispDrvBase.h b/src/components/display/drivers/dispDrvBase.h index d8eb78796..c7d624836 100644 --- a/src/components/display/drivers/dispDrvBase.h +++ b/src/components/display/drivers/dispDrvBase.h @@ -18,30 +18,65 @@ #include "Adafruit_ThinkInk.h" #include "Wippersnapper.h" +/*! + @brief Abstract base class for display drivers. + This class provides a common interface for all display drivers, + allowing them to be used interchangeably. +*/ class dispDrvBase { public: + /*! + @brief Constructor for the base display driver for E-Ink displays. + @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. + */ dispDrvBase(int16_t dc, int16_t rst, int16_t cs, int16_t sram_cs = -1, int16_t busy = -1) : _pin_dc(dc), _pin_rst(rst), _pin_cs(cs), _pin_sram_cs(sram_cs), - _pin_busy(busy) { - // Constructor implementation (if we need one) - } + _pin_busy(busy) {} - virtual ~dispDrvBase() { - // Destructor implementation (if we need one) - }; + /*! + @brief Destructor for the base display driver. + This destructor is virtual to allow derived classes to clean up + resources properly. + */ + virtual ~dispDrvBase() {} + /*! + @brief Attempts to initialize a ThinkInk EPD 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. + */ virtual bool begin(thinkinkmode_t mode, bool reset = true); + /*! + @brief Writes a message to the display. + @param message + The message to write to the display. + @note MUST be implemented by derived classes. + */ virtual void writeMessage(const char *message) = 0; protected: - int16_t _pin_dc; - int16_t _pin_rst; - int16_t _pin_cs; - int16_t _pin_busy; - int16_t _pin_sram_cs; // for optional EPD SRAM chip select - uint8_t _text_sz = 1; ///< Text size for display messages + int16_t _pin_dc; ///< Data/Command pin + int16_t _pin_rst; ///< Reset pin + int16_t _pin_cs; ///< Chip Select pin + int16_t _pin_busy; ///< Optional Busy pin + int16_t _pin_sram_cs; ///< Optional EPD SRAM chip select pin + uint8_t _text_sz = 1; ///< Text size for displaying a message + int16_t _height; ///< Height of the display + int16_t _width; ///< Width of the display }; #endif // WS_DISP_DRV_BASE_H \ No newline at end of file diff --git a/src/components/display/drivers/dispDrvThinkInkGrayscale4Eaamfgn.h b/src/components/display/drivers/dispDrvThinkInkGrayscale4Eaamfgn.h index 9c9f4d027..6fcbb1cfe 100644 --- a/src/components/display/drivers/dispDrvThinkInkGrayscale4Eaamfgn.h +++ b/src/components/display/drivers/dispDrvThinkInkGrayscale4Eaamfgn.h @@ -1,5 +1,5 @@ /*! - * @file src/components/display/drivers/drvDispThinkInkGrayscale4Eaamfgn.h + * @file src/components/display/drivers/dispDrvThinkInkGrayscale4Eaamfgn.h * * Driver for ThinkInk 2.9" Grayscale 4-level EAAMFGN display (present on the * 2025 version of the Adafruit MagTag) @@ -18,8 +18,25 @@ #include "dispDrvBase.h" +/*! + @brief Driver for a ThinkInk 2.9" Grayscale 4-level EAAMFGN display. +*/ class drvDispThinkInkGrayscale4Eaamfgn : public dispDrvBase { public: + /*! + @brief Constructor for the ThinkInk Grayscale 4-level EAAMFGN 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. + */ drvDispThinkInkGrayscale4Eaamfgn(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) {} @@ -31,6 +48,15 @@ class drvDispThinkInkGrayscale4Eaamfgn : public dispDrvBase { } } + /*! + @brief Attempts to initialize the ThinkInk Grayscale 4-level EAAMFGN + 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_290_Grayscale4_EAAMFGN(_pin_dc, _pin_rst, _pin_cs, _pin_sram_cs, _pin_busy); @@ -44,6 +70,8 @@ class drvDispThinkInkGrayscale4Eaamfgn : public dispDrvBase { _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(); @@ -51,6 +79,13 @@ class drvDispThinkInkGrayscale4Eaamfgn : public dispDrvBase { return true; } + /*! + @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; @@ -66,17 +101,23 @@ class drvDispThinkInkGrayscale4Eaamfgn : public dispDrvBase { uint16_t c_idx = 0; size_t msg_size = strlen(message); 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++; diff --git a/src/components/display/hardware.cpp b/src/components/display/hardware.cpp index 131c8ba8e..7a67a3dc0 100644 --- a/src/components/display/hardware.cpp +++ b/src/components/display/hardware.cpp @@ -63,6 +63,8 @@ dispDrvBase *CreateDrvDisp(const char *driver_name, int16_t dc, int16_t rst, /*! @brief Constructs a new DisplayHardware object + @param name + The name of the hardware instance. */ DisplayHardware::DisplayHardware(const char *name) { strncpy(_name, name, sizeof(_name) - 1); @@ -74,7 +76,10 @@ DisplayHardware::DisplayHardware(const char *name) { @brief Destructor */ DisplayHardware::~DisplayHardware() { - // TODO + if (_drvDisp) { + delete _drvDisp; + _drvDisp = nullptr; + } } /*! @@ -152,8 +157,8 @@ bool DisplayHardware::beginEPD( // TODO: Configure SPI bus selection (UNUSED AS OF RIGHT NOW) // Create display driver object using the factory function - _disp_drv_base = CreateDrvDisp(_name, dc, rst, cs, srcs, busy); - if (!_disp_drv_base) { + _drvDisp = CreateDrvDisp(_name, dc, rst, cs, srcs, busy); + if (!_drvDisp) { WS_DEBUG_PRINTLN("[display] Failed to create display driver!"); return false; // Failed to create display driver } @@ -165,10 +170,10 @@ bool DisplayHardware::beginEPD( WS_DEBUG_PRINTLN("[display] EPD mode: GRAYSCALE4"); } - if (!_disp_drv_base->begin(epd_mode)) { + if (!_drvDisp->begin(epd_mode)) { WS_DEBUG_PRINTLN("[display] Failed to begin display driver!"); - delete _disp_drv_base; - _disp_drv_base = nullptr; + delete _drvDisp; + _drvDisp = nullptr; return false; } @@ -181,9 +186,14 @@ bool DisplayHardware::beginEPD( */ const char *DisplayHardware::getName() { return _name; } +/*! + @brief Writes a message to the display. + @param message + The message to display. +*/ void DisplayHardware::writeMessage(const char *message) { - if (_disp_drv_base) { - _disp_drv_base->writeMessage(message); + if (_drvDisp) { + _drvDisp->writeMessage(message); } else { WS_DEBUG_PRINTLN("[display] No display driver initialized!"); } diff --git a/src/components/display/hardware.h b/src/components/display/hardware.h index 17c36ee09..570b2e1b8 100644 --- a/src/components/display/hardware.h +++ b/src/components/display/hardware.h @@ -20,14 +20,12 @@ #include #include -/**************************************************************************/ /*! @brief Interface for interacting with display hardware (TFT, eInk, OLED, etc.) This class provides methods to initialize, write to, and manage the state of display hardware. */ -/**************************************************************************/ class DisplayHardware { public: DisplayHardware(const char *name); @@ -52,6 +50,6 @@ class DisplayHardware { private: char _name[64]; ///< Identifies the hardware instance wippersnapper_display_v1_DisplayType _type; ///< Display type - dispDrvBase *_disp_drv_base = nullptr; ///< Base display driver + dispDrvBase *_drvDisp = nullptr; ///< Base display driver }; #endif // WS_DISPLAY_HARDWARE_H \ No newline at end of file From 05db09227b499ab6ec420b98238d6cdf11e550eb Mon Sep 17 00:00:00 2001 From: brentru Date: Wed, 20 Aug 2025 15:42:27 -0400 Subject: [PATCH 18/23] Implement publishing back to IO, T5 driver for pre-2025 --- Doxyfile | 1205 ++++++++++++----- src/Wippersnapper.cpp | 44 +- src/components/display/controller.cpp | 6 +- src/components/display/controller.h | 1 - src/components/display/drivers/dispDrvBase.h | 2 +- .../drivers/dispDrvThinkInkGrayscale4T5.h | 139 ++ src/components/display/hardware.cpp | 19 +- src/components/display/hardware.h | 5 +- .../description/v1/description.pb.c | 2 +- .../description/v1/description.pb.h | 2 +- src/wippersnapper/display/v1/display.pb.c | 2 +- src/wippersnapper/display/v1/display.pb.h | 44 +- 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 | 4 +- src/wippersnapper/uart/v1/uart.pb.c | 2 +- src/wippersnapper/uart/v1/uart.pb.h | 2 +- 28 files changed, 1079 insertions(+), 426 deletions(-) create mode 100644 src/components/display/drivers/dispDrvThinkInkGrayscale4T5.h diff --git a/Doxyfile b/Doxyfile index c05228416..3de8ed0d8 100644 --- a/Doxyfile +++ b/Doxyfile @@ -1,7 +1,7 @@ -# Doxyfile 1.9.1 +# Doxyfile 1.14.0 # This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project. +# Doxygen (www.doxygen.org) for a project. # # All text after a double hash (##) is considered a comment and is placed in # front of the TAG it is preceding. @@ -12,6 +12,16 @@ # For lists, items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (\" \"). +# +# Note: +# +# Use Doxygen to compare the used configuration file with the template +# configuration file: +# doxygen -x [configFile] +# Use Doxygen to compare the used configuration file with the template +# configuration file without replacing the environment variables or CMake type +# replacement variables: +# doxygen -x_noenv [configFile] #--------------------------------------------------------------------------- # Project related configuration options @@ -41,7 +51,7 @@ PROJECT_NAME = "Adafruit Library" PROJECT_NUMBER = # Using the PROJECT_BRIEF tag one can provide an optional one line description -# for a project that appears at the top of each page and should give viewer a +# for a project that appears at the top of each page and should give viewers a # quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = @@ -53,24 +63,42 @@ PROJECT_BRIEF = PROJECT_LOGO = +# With the PROJECT_ICON tag one can specify an icon that is included in the tabs +# when the HTML document is shown. Doxygen will copy the logo to the output +# directory. + +PROJECT_ICON = + # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # into which the generated documentation will be written. If a relative path is -# entered, it will be relative to the location where doxygen was started. If +# entered, it will be relative to the location where Doxygen was started. If # left blank the current directory will be used. OUTPUT_DIRECTORY = -# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- -# directories (in 2 levels) under the output directory of each output format and -# will distribute the generated files over these directories. Enabling this -# option can be useful when feeding doxygen a huge amount of source files, where -# putting all generated files in the same directory would otherwise causes -# performance problems for the file system. +# If the CREATE_SUBDIRS tag is set to YES then Doxygen will create up to 4096 +# sub-directories (in 2 levels) under the output directory of each output format +# and will distribute the generated files over these directories. Enabling this +# option can be useful when feeding Doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise cause +# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to +# control the number of sub-directories. # The default value is: NO. CREATE_SUBDIRS = NO -# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# Controls the number of sub-directories that will be created when +# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every +# level increment doubles the number of directories, resulting in 4096 +# directories at level 8 which is the default and also the maximum value. The +# sub-directories are organized in 2 levels, the first level always has a fixed +# number of 16 directories. +# Minimum value: 0, maximum value: 8, default value: 8. +# This tag requires that the tag CREATE_SUBDIRS is set to YES. + +CREATE_SUBDIRS_LEVEL = 8 + +# If the ALLOW_UNICODE_NAMES tag is set to YES, Doxygen will allow non-ASCII # characters to appear in the names of generated files. If set to NO, non-ASCII # characters will be escaped, for example _xE3_x81_x84 will be used for Unicode # U+3044. @@ -79,28 +107,28 @@ CREATE_SUBDIRS = NO ALLOW_UNICODE_NAMES = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this +# documentation generated by Doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. -# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, -# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), -# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, -# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), -# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, -# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, -# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, -# Ukrainian and Vietnamese. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian, +# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English +# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek, +# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with +# English messages), Korean, Korean-en (Korean with English messages), Latvian, +# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, +# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, +# Swedish, Turkish, Ukrainian and Vietnamese. # The default value is: English. OUTPUT_LANGUAGE = English -# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# If the BRIEF_MEMBER_DESC tag is set to YES, Doxygen will include brief member # descriptions after the members that are listed in the file and class # documentation (similar to Javadoc). Set to NO to disable this. # The default value is: YES. BRIEF_MEMBER_DESC = YES -# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# If the REPEAT_BRIEF tag is set to YES, Doxygen will prepend the brief # description of a member or function before the detailed description # # Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the @@ -131,13 +159,13 @@ ABBREVIATE_BRIEF = "The $name class" \ the # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# doxygen will generate a detailed section even if there is only a brief +# Doxygen will generate a detailed section even if there is only a brief # description. # The default value is: NO. ALWAYS_DETAILED_SEC = NO -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# If the INLINE_INHERITED_MEMB tag is set to YES, Doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. @@ -145,7 +173,7 @@ ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO -# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# If the FULL_PATH_NAMES tag is set to YES, Doxygen will prepend the full path # before files name in the file list and in the header files. If set to NO the # shortest path that makes the file name unique will be used # The default value is: YES. @@ -155,11 +183,11 @@ FULL_PATH_NAMES = YES # The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. # Stripping is only done if one of the specified strings matches the left-hand # part of the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the path to +# If left blank the directory from which Doxygen is run is used as the path to # strip. # # Note that you can specify absolute paths here, but also relative paths, which -# will be relative from the directory where doxygen is started. +# will be relative from the directory where Doxygen is started. # This tag requires that the tag FULL_PATH_NAMES is set to YES. STRIP_FROM_PATH = @@ -173,31 +201,42 @@ STRIP_FROM_PATH = STRIP_FROM_INC_PATH = -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but -# less readable) file names. This can be useful is your file systems doesn't +# If the SHORT_NAMES tag is set to YES, Doxygen will generate much shorter (but +# less readable) file names. This can be useful if your file system doesn't # support long names like on DOS, Mac, or CD-ROM. # The default value is: NO. SHORT_NAMES = NO -# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the -# first line (until the first dot) of a Javadoc-style comment as the brief -# description. If set to NO, the Javadoc-style will behave just like regular Qt- -# style comments (thus requiring an explicit @brief command for a brief -# description.) +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen will interpret the +# first line (until the first dot, question mark or exclamation mark) of a +# Javadoc-style comment as the brief description. If set to NO, the Javadoc- +# style will behave just like regular Qt-style comments (thus requiring an +# explicit @brief command for a brief description.) # The default value is: NO. JAVADOC_AUTOBRIEF = NO -# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first -# line (until the first dot) of a Qt-style comment as the brief description. If -# set to NO, the Qt-style will behave just like regular Qt-style comments (thus -# requiring an explicit \brief command for a brief description.) +# If the JAVADOC_BANNER tag is set to YES then Doxygen will interpret a line +# such as +# /*************** +# as being the beginning of a Javadoc-style comment "banner". If set to NO, the +# Javadoc-style will behave just like regular comments and it will not be +# interpreted by Doxygen. +# The default value is: NO. + +JAVADOC_BANNER = NO + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will interpret the first +# line (until the first dot, question mark or exclamation mark) of a Qt-style +# comment as the brief description. If set to NO, the Qt-style will behave just +# like regular Qt-style comments (thus requiring an explicit \brief command for +# a brief description.) # The default value is: NO. QT_AUTOBRIEF = NO -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen treat a # multi-line C++ special comment block (i.e. a block of //! or /// comments) as # a brief description. This used to be the default behavior. The new default is # to treat a multi-line C++ comment block as a detailed description. Set this @@ -209,13 +248,21 @@ QT_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO +# By default Python docstrings are displayed as preformatted text and Doxygen's +# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the +# Doxygen's special commands can be used and the contents of the docstring +# documentation blocks is shown as Doxygen documentation. +# The default value is: YES. + +PYTHON_DOCSTRING = YES + # If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the # documentation from any documented member that it re-implements. # The default value is: YES. INHERIT_DOCS = YES -# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# If the SEPARATE_MEMBER_PAGES tag is set to YES then Doxygen will produce a new # page for each member. If set to NO, the documentation of a member will be part # of the file/class/namespace that contains it. # The default value is: NO. @@ -232,16 +279,16 @@ TAB_SIZE = 4 # the documentation. An alias has the form: # name=value # For example adding -# "sideeffect=@par Side Effects:\n" +# "sideeffect=@par Side Effects:^^" # will allow you to put the command \sideeffect (or @sideeffect) in the # documentation, which will result in a user-defined paragraph with heading -# "Side Effects:". You can put \n's in the value part of an alias to insert -# newlines (in the resulting output). You can put ^^ in the value part of an -# alias to insert a newline as if a physical newline was in the original file. -# When you need a literal { or } or , in the value part of an alias you have to -# escape them by means of a backslash (\), this can lead to conflicts with the -# commands \{ and \} for these it is advised to use the version @{ and @} or use -# a double escape (\\{ and \\}) +# "Side Effects:". Note that you cannot put \n's in the value part of an alias +# to insert newlines (in the resulting output). You can put ^^ in the value part +# of an alias to insert a newline as if a physical newline was in the original +# file. When you need a literal { or } or , in the value part of an alias you +# have to escape them by means of a backslash (\), this can lead to conflicts +# with the commands \{ and \} for these it is advised to use the version @{ and +# @} or use a double escape (\\{ and \\}) ALIASES = @@ -273,34 +320,42 @@ OPTIMIZE_FOR_FORTRAN = NO OPTIMIZE_OUTPUT_VHDL = NO +# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice +# sources only. Doxygen will then generate output that is more tailored for that +# language. For instance, namespaces will be presented as modules, types will be +# separated into more groups, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_SLICE = NO + # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, and -# language is one of the parsers supported by doxygen: IDL, Java, JavaScript, -# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, VHDL, -# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: +# language is one of the parsers supported by Doxygen: IDL, Java, JavaScript, +# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice, +# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: # FortranFree, unknown formatted Fortran: Fortran. In the later case the parser # tries to guess whether the code is fixed or free formatted code, this is the -# default for Fortran type files). For instance to make doxygen treat .inc files +# default for Fortran type files). For instance to make Doxygen treat .inc files # as Fortran files (default is PHP), and .f files as C (default is Fortran), # use: inc=Fortran f=C. # # Note: For files without extension you can use no_extension as a placeholder. # # Note that for custom extensions you also need to set FILE_PATTERNS otherwise -# the files are not read by doxygen. When specifying no_extension you should add +# the files are not read by Doxygen. When specifying no_extension you should add # * to the FILE_PATTERNS. # # Note see also the list of default file extension mappings. EXTENSION_MAPPING = -# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# If the MARKDOWN_SUPPORT tag is enabled then Doxygen pre-processes all comments # according to the Markdown format, which allows for more readable # documentation. See https://daringfireball.net/projects/markdown/ for details. -# The output of markdown processing is further processed by doxygen, so you can -# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# The output of markdown processing is further processed by Doxygen, so you can +# mix Doxygen, HTML, and XML commands with Markdown formatting. Disable only in # case of backward compatibilities issues. # The default value is: YES. @@ -310,25 +365,45 @@ MARKDOWN_SUPPORT = YES # to that level are automatically included in the table of contents, even if # they do not have an id attribute. # Note: This feature currently applies only to Markdown headings. -# Minimum value: 0, maximum value: 99, default value: 5. +# Minimum value: 0, maximum value: 99, default value: 6. # This tag requires that the tag MARKDOWN_SUPPORT is set to YES. TOC_INCLUDE_HEADINGS = 0 -# When enabled doxygen tries to link words that correspond to documented +# The MARKDOWN_ID_STYLE tag can be used to specify the algorithm used to +# generate identifiers for the Markdown headings. Note: Every identifier is +# unique. +# Possible values are: DOXYGEN use a fixed 'autotoc_md' string followed by a +# sequence number starting at 0 and GITHUB use the lower case version of title +# with any whitespace replaced by '-' and punctuation characters removed. +# The default value is: DOXYGEN. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +MARKDOWN_ID_STYLE = DOXYGEN + +# When enabled Doxygen tries to link words that correspond to documented # classes, or namespaces to their corresponding documentation. Such a link can # be prevented in individual cases by putting a % sign in front of the word or -# globally by setting AUTOLINK_SUPPORT to NO. +# globally by setting AUTOLINK_SUPPORT to NO. Words listed in the +# AUTOLINK_IGNORE_WORDS tag are excluded from automatic linking. # The default value is: YES. AUTOLINK_SUPPORT = YES +# This tag specifies a list of words that, when matching the start of a word in +# the documentation, will suppress auto links generation, if it is enabled via +# AUTOLINK_SUPPORT. This list does not affect links explicitly created using \# +# or the \link or commands. +# This tag requires that the tag AUTOLINK_SUPPORT is set to YES. + +AUTOLINK_IGNORE_WORDS = + # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should set this -# tag to YES in order to let doxygen match functions declarations and +# tag to YES in order to let Doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); -# versus func(std::string) {}). This also make the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. +# versus func(std::string) {}). This also makes the inheritance and +# collaboration diagrams that involve STL classes more complete and accurate. # The default value is: NO. BUILTIN_STL_SUPPORT = NO @@ -340,16 +415,16 @@ BUILTIN_STL_SUPPORT = NO CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip (see: -# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen -# will parse them like normal C++ but will assume all classes use public instead -# of private inheritance when no explicit protection keyword is present. +# https://www.riverbankcomputing.com/software) sources only. Doxygen will parse +# them like normal C++ but will assume all classes use public instead of private +# inheritance when no explicit protection keyword is present. # The default value is: NO. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate # getter and setter methods for a property. Setting this option to YES will make -# doxygen to replace the get and set methods by a property in the documentation. +# Doxygen to replace the get and set methods by a property in the documentation. # This will only work if the methods are indeed getting or setting a simple # type. If this is not the case, or you want to show the methods anyway, you # should set this option to NO. @@ -358,7 +433,7 @@ SIP_SUPPORT = NO IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES then doxygen will reuse the documentation of the first +# tag is set to YES then Doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. # The default value is: NO. @@ -416,21 +491,42 @@ TYPEDEF_HIDES_STRUCT = NO # The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This # cache is used to resolve symbols given their name and scope. Since this can be # an expensive process and often the same symbol appears multiple times in the -# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small -# doxygen will become slower. If the cache is too large, memory is wasted. The +# code, Doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# Doxygen will become slower. If the cache is too large, memory is wasted. The # cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range # is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 -# symbols. At the end of a run doxygen will report the cache usage and suggest +# symbols. At the end of a run Doxygen will report the cache usage and suggest # the optimal cache size from a speed point of view. # Minimum value: 0, maximum value: 9, default value: 0. LOOKUP_CACHE_SIZE = 0 +# The NUM_PROC_THREADS specifies the number of threads Doxygen is allowed to use +# during processing. When set to 0 Doxygen will based this on the number of +# cores available in the system. You can set it explicitly to a value larger +# than 0 to get more control over the balance between CPU load and processing +# speed. At this moment only the input processing can be done using multiple +# threads. Since this is still an experimental feature the default is set to 1, +# which effectively disables parallel processing. Please report any issues you +# encounter. Generating dot graphs in parallel is controlled by the +# DOT_NUM_THREADS setting. +# Minimum value: 0, maximum value: 32, default value: 1. + +NUM_PROC_THREADS = 1 + +# If the TIMESTAMP tag is set different from NO then each generated page will +# contain the date or date and time when the page was generated. Setting this to +# NO can help when comparing the output of multiple runs. +# Possible values are: YES, NO, DATETIME and DATE. +# The default value is: NO. + +TIMESTAMP = NO + #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- -# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# If the EXTRACT_ALL tag is set to YES, Doxygen will assume all entities in # documentation are documented, even if no documentation was available. Private # class members and static file members will be hidden unless the # EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. @@ -446,6 +542,12 @@ EXTRACT_ALL = NO EXTRACT_PRIVATE = NO +# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual +# methods of a class will be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIV_VIRTUAL = NO + # If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal # scope will be included in the documentation. # The default value is: NO. @@ -483,7 +585,14 @@ EXTRACT_LOCAL_METHODS = NO EXTRACT_ANON_NSPACES = NO -# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# If this flag is set to YES, the name of an unnamed parameter in a declaration +# will be determined by the corresponding definition. By default unnamed +# parameters remain unnamed in the output. +# The default value is: YES. + +RESOLVE_UNNAMED_PARAMS = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members inside documented classes or files. If set to NO these # members will be included in the various overviews, but no documentation # section is generated. This option has no effect if EXTRACT_ALL is enabled. @@ -491,22 +600,31 @@ EXTRACT_ANON_NSPACES = NO HIDE_UNDOC_MEMBERS = NO -# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. If set # to NO, these classes will be included in the various overviews. This option -# has no effect if EXTRACT_ALL is enabled. +# will also hide undocumented C++ concepts if enabled. This option has no effect +# if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_CLASSES = NO -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# If the HIDE_UNDOC_NAMESPACES tag is set to YES, Doxygen will hide all +# undocumented namespaces that are normally visible in the namespace hierarchy. +# If set to NO, these namespaces will be included in the various overviews. This +# option has no effect if EXTRACT_ALL is enabled. +# The default value is: YES. + +HIDE_UNDOC_NAMESPACES = YES + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all friend # declarations. If set to NO, these declarations will be included in the # documentation. # The default value is: NO. HIDE_FRIEND_COMPOUNDS = NO -# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. If set to NO, these # blocks will be appended to the function's detailed documentation block. # The default value is: NO. @@ -520,37 +638,44 @@ HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO -# With the correct setting of option CASE_SENSE_NAMES doxygen will better be +# With the correct setting of option CASE_SENSE_NAMES Doxygen will better be # able to match the capabilities of the underlying filesystem. In case the # filesystem is case sensitive (i.e. it supports files in the same directory # whose names only differ in casing), the option must be set to YES to properly # deal with such files in case they appear in the input. For filesystems that -# are not case sensitive the option should be be set to NO to properly deal with +# are not case sensitive the option should be set to NO to properly deal with # output files written for symbols that only differ in casing, such as for two # classes, one named CLASS and the other named Class, and to also support # references to files without having to specify the exact matching casing. On -# Windows (including Cygwin) and MacOS, users should typically set this option +# Windows (including Cygwin) and macOS, users should typically set this option # to NO, whereas on Linux or other Unix flavors it should typically be set to # YES. -# The default value is: system dependent. +# Possible values are: SYSTEM, NO and YES. +# The default value is: SYSTEM. CASE_SENSE_NAMES = NO -# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# If the HIDE_SCOPE_NAMES tag is set to NO then Doxygen will show members with # their full class and namespace scopes in the documentation. If set to YES, the # scope will be hidden. # The default value is: NO. HIDE_SCOPE_NAMES = NO -# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then Doxygen will # append additional text to a page's title, such as Class Reference. If set to # YES the compound reference will be hidden. # The default value is: NO. HIDE_COMPOUND_REFERENCE= NO -# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class +# will show which file needs to be included to use the class. +# The default value is: YES. + +SHOW_HEADERFILE = YES + +# If the SHOW_INCLUDE_FILES tag is set to YES then Doxygen will put a list of # the files that are included by a file in the documentation of that file. # The default value is: YES. @@ -563,7 +688,7 @@ SHOW_INCLUDE_FILES = YES SHOW_GROUPED_MEMB_INC = NO -# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen will list include # files with double quotes in the documentation rather than with sharp brackets. # The default value is: NO. @@ -575,14 +700,14 @@ FORCE_LOCAL_INCLUDES = NO INLINE_INFO = YES -# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# If the SORT_MEMBER_DOCS tag is set to YES then Doxygen will sort the # (detailed) documentation of file and class members alphabetically by member # name. If set to NO, the members will appear in declaration order. # The default value is: YES. SORT_MEMBER_DOCS = NO -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# If the SORT_BRIEF_DOCS tag is set to YES then Doxygen will sort the brief # descriptions of file, namespace and class members alphabetically by member # name. If set to NO, the members will appear in declaration order. Note that # this will also influence the order of the classes in the class list. @@ -590,7 +715,7 @@ SORT_MEMBER_DOCS = NO SORT_BRIEF_DOCS = NO -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then Doxygen will sort the # (brief and detailed) documentation of class members so that constructors and # destructors are listed first. If set to NO the constructors will appear in the # respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. @@ -602,7 +727,7 @@ SORT_BRIEF_DOCS = NO SORT_MEMBERS_CTORS_1ST = NO -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# If the SORT_GROUP_NAMES tag is set to YES then Doxygen will sort the hierarchy # of group names into alphabetical order. If set to NO the group names will # appear in their defined order. # The default value is: NO. @@ -619,11 +744,11 @@ SORT_GROUP_NAMES = NO SORT_BY_SCOPE_NAME = NO -# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# If the STRICT_PROTO_MATCHING option is enabled and Doxygen fails to do proper # type resolution of all parameters of a function it will reject a match between # the prototype and the implementation of a member function even if there is # only one candidate or it is obvious which candidate to choose by doing a -# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# simple string match. By disabling STRICT_PROTO_MATCHING Doxygen will still # accept a match between prototype and implementation in such cases. # The default value is: NO. @@ -693,24 +818,25 @@ SHOW_FILES = YES SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from +# Doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command command input-file, where command is the value of the # FILE_VERSION_FILTER tag, and input-file is the name of an input file provided -# by doxygen. Whatever the program writes to standard output is used as the file +# by Doxygen. Whatever the program writes to standard output is used as the file # version. For an example see the documentation. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed -# by doxygen. The layout file controls the global structure of the generated +# by Doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. To create the layout file -# that represents doxygen's defaults, run doxygen with the -l option. You can +# that represents Doxygen's defaults, run Doxygen with the -l option. You can # optionally specify a file name after the option, if omitted DoxygenLayout.xml -# will be used as the name of the layout file. +# will be used as the name of the layout file. See also section "Changing the +# layout of pages" for information. # -# Note that if you run doxygen from a directory containing a file called -# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# Note that if you run Doxygen from a directory containing a file called +# DoxygenLayout.xml, Doxygen will parse it automatically even if the LAYOUT_FILE # tag is left empty. LAYOUT_FILE = @@ -725,19 +851,35 @@ LAYOUT_FILE = CITE_BIB_FILES = +# The EXTERNAL_TOOL_PATH tag can be used to extend the search path (PATH +# environment variable) so that external tools such as latex and gs can be +# found. +# Note: Directories specified with EXTERNAL_TOOL_PATH are added in front of the +# path already specified by the PATH variable, and are added in the order +# specified. +# Note: This option is particularly useful for macOS version 14 (Sonoma) and +# higher, when running Doxygen from Doxywizard, because in this case any user- +# defined changes to the PATH are ignored. A typical example on macOS is to set +# EXTERNAL_TOOL_PATH = /Library/TeX/texbin /usr/local/bin +# together with the standard path, the full search path used by doxygen when +# launching external tools will then become +# PATH=/Library/TeX/texbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin + +EXTERNAL_TOOL_PATH = + #--------------------------------------------------------------------------- # Configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated to -# standard output by doxygen. If QUIET is set to YES this implies that the +# standard output by Doxygen. If QUIET is set to YES this implies that the # messages are off. # The default value is: NO. QUIET = YES # The WARNINGS tag can be used to turn on/off the warning messages that are -# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# generated to standard error (stderr) by Doxygen. If WARNINGS is set to YES # this implies that the warnings are on. # # Tip: Turn warnings on while writing the documentation. @@ -745,52 +887,97 @@ QUIET = YES WARNINGS = YES -# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# If the WARN_IF_UNDOCUMENTED tag is set to YES then Doxygen will generate # warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag # will automatically be disabled. # The default value is: YES. WARN_IF_UNDOCUMENTED = YES -# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some parameters -# in a documented function, or documenting parameters that don't exist or using -# markup commands wrongly. +# If the WARN_IF_DOC_ERROR tag is set to YES, Doxygen will generate warnings for +# potential errors in the documentation, such as documenting some parameters in +# a documented function twice, or documenting parameters that don't exist or +# using markup commands wrongly. # The default value is: YES. WARN_IF_DOC_ERROR = YES +# If WARN_IF_INCOMPLETE_DOC is set to YES, Doxygen will warn about incomplete +# function parameter documentation. If set to NO, Doxygen will accept that some +# parameters have no documentation without warning. +# The default value is: YES. + +WARN_IF_INCOMPLETE_DOC = YES + # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # are documented, but have no documentation for their parameters or return -# value. If set to NO, doxygen will only warn about wrong or incomplete -# parameter documentation, but not about the absence of documentation. If -# EXTRACT_ALL is set to YES then this flag will automatically be disabled. +# value. If set to NO, Doxygen will only warn about wrong parameter +# documentation, but not about the absence of documentation. If EXTRACT_ALL is +# set to YES then this flag will automatically be disabled. See also +# WARN_IF_INCOMPLETE_DOC # The default value is: NO. WARN_NO_PARAMDOC = YES -# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# If WARN_IF_UNDOC_ENUM_VAL option is set to YES, Doxygen will warn about +# undocumented enumeration values. If set to NO, Doxygen will accept +# undocumented enumeration values. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: NO. + +WARN_IF_UNDOC_ENUM_VAL = NO + +# If WARN_LAYOUT_FILE option is set to YES, Doxygen will warn about issues found +# while parsing the user defined layout file, such as missing or wrong elements. +# See also LAYOUT_FILE for details. If set to NO, problems with the layout file +# will be suppressed. +# The default value is: YES. + +WARN_LAYOUT_FILE = YES + +# If the WARN_AS_ERROR tag is set to YES then Doxygen will immediately stop when # a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS -# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but -# at the end of the doxygen process doxygen will return with a non-zero status. -# Possible values are: NO, YES and FAIL_ON_WARNINGS. +# then Doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but +# at the end of the Doxygen process Doxygen will return with a non-zero status. +# If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS_PRINT then Doxygen behaves +# like FAIL_ON_WARNINGS but in case no WARN_LOGFILE is defined Doxygen will not +# write the warning messages in between other messages but write them at the end +# of a run, in case a WARN_LOGFILE is defined the warning messages will be +# besides being in the defined file also be shown at the end of a run, unless +# the WARN_LOGFILE is defined as - i.e. standard output (stdout) in that case +# the behavior will remain as with the setting FAIL_ON_WARNINGS. +# Possible values are: NO, YES, FAIL_ON_WARNINGS and FAIL_ON_WARNINGS_PRINT. # The default value is: NO. WARN_AS_ERROR = NO -# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# The WARN_FORMAT tag determines the format of the warning messages that Doxygen # can produce. The string should contain the $file, $line, and $text tags, which # will be replaced by the file and line number from which the warning originated # and the warning text. Optionally the format may contain $version, which will # be replaced by the version of the file (if it could be obtained via # FILE_VERSION_FILTER) +# See also: WARN_LINE_FORMAT # The default value is: $file:$line: $text. WARN_FORMAT = "$file:$line: $text" +# In the $text part of the WARN_FORMAT command it is possible that a reference +# to a more specific place is given. To make it easier to jump to this place +# (outside of Doxygen) the user can define a custom "cut" / "paste" string. +# Example: +# WARN_LINE_FORMAT = "'vi $file +$line'" +# See also: WARN_FORMAT +# The default value is: at line $line of file $file. + +WARN_LINE_FORMAT = "at line $line of file $file" + # The WARN_LOGFILE tag can be used to specify a file to which warning and error # messages should be written. If left blank the output is written to standard -# error (stderr). +# error (stderr). In case the file specified cannot be opened for writing the +# warning and error messages are written to standard error. When as file - is +# specified the warning and error messages are written to standard output +# (stdout). WARN_LOGFILE = @@ -807,31 +994,42 @@ WARN_LOGFILE = INPUT = # This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# that Doxygen parses. Internally Doxygen uses the UTF-8 encoding. Doxygen uses # libiconv (or the iconv built into libc) for the transcoding. See the libiconv # documentation (see: # https://www.gnu.org/software/libiconv/) for the list of possible encodings. +# See also: INPUT_FILE_ENCODING # The default value is: UTF-8. INPUT_ENCODING = UTF-8 +# This tag can be used to specify the character encoding of the source files +# that Doxygen parses. The INPUT_FILE_ENCODING tag can be used to specify +# character encoding on a per file pattern basis. Doxygen will compare the file +# name with each pattern and apply the encoding instead of the default +# INPUT_ENCODING if there is a match. The character encodings are a list of the +# form: pattern=encoding (like *.php=ISO-8859-1). +# See also: INPUT_ENCODING for further information on supported encodings. + +INPUT_FILE_ENCODING = + # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and # *.h) to filter out the source-files in the directories. # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not -# read by doxygen. +# read by Doxygen. # # Note the list of default checked file patterns might differ from the list of # default file extension mappings. # -# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, -# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, -# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, -# *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment), -# *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, *.vhdl, -# *.ucf, *.qsf and *.ice. +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cxxm, +# *.cpp, *.cppm, *.ccm, *.c++, *.c++m, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, +# *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, +# *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be +# provided as Doxygen C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, +# *.f18, *.f, *.for, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice. FILE_PATTERNS = *.c \ *.cc \ @@ -854,7 +1052,7 @@ RECURSIVE = YES # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. # -# Note that relative paths are relative to the directory from which doxygen is +# Note that relative paths are relative to the directory from which Doxygen is # run. EXCLUDE = EXCLUDE \ @@ -885,10 +1083,7 @@ EXCLUDE_PATTERNS = *.md # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test -# -# Note that the wildcards are matched against the file with absolute path, so to -# exclude all test directories use the pattern */test/* +# ANamespace::AClass, ANamespace::*Test EXCLUDE_SYMBOLS = @@ -918,7 +1113,7 @@ EXAMPLE_RECURSIVE = NO IMAGE_PATH = -# The INPUT_FILTER tag can be used to specify a program that doxygen should +# The INPUT_FILTER tag can be used to specify a program that Doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command: # @@ -933,9 +1128,14 @@ IMAGE_PATH = # code is scanned, but not when the output code is generated. If lines are added # or removed, the anchors will not be placed correctly. # +# Note that Doxygen will use the data processed and written to standard output +# for further processing, therefore nothing else, like debug statements or used +# commands (so in case of a Windows batch file always use @echo OFF), should be +# written to standard output. +# # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not -# properly processed by doxygen. +# properly processed by Doxygen. INPUT_FILTER = @@ -948,7 +1148,7 @@ INPUT_FILTER = # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not -# properly processed by doxygen. +# properly processed by Doxygen. FILTER_PATTERNS = @@ -970,10 +1170,28 @@ FILTER_SOURCE_PATTERNS = # If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that # is part of the input, its contents will be placed on the main page # (index.html). This can be useful if you have a project on for instance GitHub -# and want to reuse the introduction page also for the doxygen output. +# and want to reuse the introduction page also for the Doxygen output. USE_MDFILE_AS_MAINPAGE = +# If the IMPLICIT_DIR_DOCS tag is set to YES, any README.md file found in sub- +# directories of the project's root, is used as the documentation for that sub- +# directory, except when the README.md starts with a \dir, \page or \mainpage +# command. If set to NO, the README.md file needs to start with an explicit \dir +# command in order to be used as directory documentation. +# The default value is: YES. + +IMPLICIT_DIR_DOCS = YES + +# The Fortran standard specifies that for fixed formatted Fortran code all +# characters from position 72 are to be considered as comment. A common +# extension is to allow longer lines before the automatic comment starts. The +# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can +# be processed before the automatic comment starts. +# Minimum value: 7, maximum value: 10000, default value: 72. + +FORTRAN_COMMENT_AFTER = 72 + #--------------------------------------------------------------------------- # Configuration options related to source browsing #--------------------------------------------------------------------------- @@ -988,12 +1206,13 @@ USE_MDFILE_AS_MAINPAGE = SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body of functions, -# classes and enums directly into the documentation. +# multi-line macros, enums or list initialized variables directly into the +# documentation. # The default value is: NO. INLINE_SOURCES = NO -# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct Doxygen to hide any # special comment blocks from generated source code fragments. Normal C, C++ and # Fortran comments will always remain visible. # The default value is: YES. @@ -1031,7 +1250,7 @@ REFERENCES_LINK_SOURCE = YES SOURCE_TOOLTIPS = YES # If the USE_HTAGS tag is set to YES then the references to source code will -# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# point to the HTML generated by the htags(1) tool instead of Doxygen built-in # source browser. The htags tool is part of GNU's global source tagging system # (see https://www.gnu.org/software/global/global.html). You will need version # 4.8.6 or higher. @@ -1045,14 +1264,14 @@ SOURCE_TOOLTIPS = YES # Doxygen will invoke htags (and that will in turn invoke gtags), so these # tools must be available from the command line (i.e. in the search path). # -# The result: instead of the source browser generated by doxygen, the links to +# The result: instead of the source browser generated by Doxygen, the links to # source code will now point to the output of htags. # The default value is: NO. # This tag requires that the tag SOURCE_BROWSER is set to YES. USE_HTAGS = NO -# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# If the VERBATIM_HEADERS tag is set the YES then Doxygen will generate a # verbatim copy of the header file for each class for which an include is # specified. Set to NO to disable this. # See also: Section \class. @@ -1071,10 +1290,11 @@ VERBATIM_HEADERS = YES ALPHABETICAL_INDEX = YES -# In case all classes in a project start with a common prefix, all classes will -# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag -# can be used to specify a prefix (or a list of prefixes) that should be ignored -# while generating the index headers. +# The IGNORE_PREFIX tag can be used to specify a prefix (or a list of prefixes) +# that should be ignored while generating the index headers. The IGNORE_PREFIX +# tag works for classes, function and member names. The entity will be placed in +# the alphabetical list under the first letter of the entity name that remains +# after removing the prefix. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. IGNORE_PREFIX = @@ -1083,7 +1303,7 @@ IGNORE_PREFIX = # Configuration options related to the HTML output #--------------------------------------------------------------------------- -# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# If the GENERATE_HTML tag is set to YES, Doxygen will generate HTML output # The default value is: YES. GENERATE_HTML = YES @@ -1104,40 +1324,40 @@ HTML_OUTPUT = html HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a user-defined HTML header file for -# each generated HTML page. If the tag is left blank doxygen will generate a +# each generated HTML page. If the tag is left blank Doxygen will generate a # standard header. # # To get valid HTML the header file that includes any scripts and style sheets -# that doxygen needs, which is dependent on the configuration options used (e.g. +# that Doxygen needs, which is dependent on the configuration options used (e.g. # the setting GENERATE_TREEVIEW). It is highly recommended to start with a # default header using # doxygen -w html new_header.html new_footer.html new_stylesheet.css # YourConfigFile # and then modify the file new_header.html. See also section "Doxygen usage" -# for information on how to generate the default header that doxygen normally +# for information on how to generate the default header that Doxygen normally # uses. # Note: The header is subject to change so you typically have to regenerate the -# default header when upgrading to a newer version of doxygen. For a description +# default header when upgrading to a newer version of Doxygen. For a description # of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each -# generated HTML page. If the tag is left blank doxygen will generate a standard +# generated HTML page. If the tag is left blank Doxygen will generate a standard # footer. See HTML_HEADER for more information on how to generate a default # footer and what special commands can be used inside the footer. See also # section "Doxygen usage" for information on how to generate the default footer -# that doxygen normally uses. +# that Doxygen normally uses. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading style # sheet that is used by each HTML page. It can be used to fine-tune the look of -# the HTML output. If left blank doxygen will generate a default style sheet. +# the HTML output. If left blank Doxygen will generate a default style sheet. # See also section "Doxygen usage" for information on how to generate the style -# sheet that doxygen normally uses. +# sheet that Doxygen normally uses. # Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as # it is more robust and this tag (HTML_STYLESHEET) will in the future become # obsolete. @@ -1147,13 +1367,18 @@ HTML_STYLESHEET = # The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined # cascading style sheets that are included after the standard style sheets -# created by doxygen. Using this option one can overrule certain style aspects. +# created by Doxygen. Using this option one can overrule certain style aspects. # This is preferred over using HTML_STYLESHEET since it does not replace the # standard style sheet and is therefore more robust against future updates. # Doxygen will copy the style sheet files to the output directory. # Note: The order of the extra style sheet files is of importance (e.g. the last # style sheet in the list overrules the setting of the previous ones in the -# list). For an example see the documentation. +# list). +# Note: Since the styling of scrollbars can currently not be overruled in +# Webkit/Chromium, the styling will be left out of the default doxygen.css if +# one or more extra stylesheets have been specified. So if scrollbar +# customization is desired it has to be added explicitly. For an example see the +# documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_STYLESHEET = @@ -1168,9 +1393,22 @@ HTML_EXTRA_STYLESHEET = HTML_EXTRA_FILES = +# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output +# should be rendered with a dark or light theme. +# Possible values are: LIGHT always generates light mode output, DARK always +# generates dark mode output, AUTO_LIGHT automatically sets the mode according +# to the user preference, uses light mode if no preference is set (the default), +# AUTO_DARK automatically sets the mode according to the user preference, uses +# dark mode if no preference is set and TOGGLE allows a user to switch between +# light and dark mode via a button. +# The default value is: AUTO_LIGHT. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE = AUTO_LIGHT + # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the style sheet and background images according to -# this color. Hue is specified as an angle on a colorwheel, see +# this color. Hue is specified as an angle on a color-wheel, see # https://en.wikipedia.org/wiki/Hue for more information. For instance the value # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 # purple, and 360 is red again. @@ -1180,7 +1418,7 @@ HTML_EXTRA_FILES = HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors -# in the HTML output. For a value of 0 the output will use grayscales only. A +# in the HTML output. For a value of 0 the output will use gray-scales only. A # value of 255 will produce the most vivid colors. # Minimum value: 0, maximum value: 255, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. @@ -1198,14 +1436,16 @@ HTML_COLORSTYLE_SAT = 100 HTML_COLORSTYLE_GAMMA = 80 -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting this -# to YES can help to show when doxygen was last run and thus if the -# documentation is up to date. -# The default value is: NO. +# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML +# documentation will contain a main index with vertical navigation menus that +# are dynamically created via JavaScript. If disabled, the navigation index will +# consists of multiple levels of tabs that are statically embedded in every HTML +# page. Disable this option to support browsers that do not have JavaScript, +# like the Qt help browser. +# The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_TIMESTAMP = NO +HTML_DYNAMIC_MENUS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the @@ -1215,6 +1455,33 @@ HTML_TIMESTAMP = NO HTML_DYNAMIC_SECTIONS = NO +# If the HTML_CODE_FOLDING tag is set to YES then classes and functions can be +# dynamically folded and expanded in the generated HTML source code. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_CODE_FOLDING = YES + +# If the HTML_COPY_CLIPBOARD tag is set to YES then Doxygen will show an icon in +# the top right corner of code and text fragments that allows the user to copy +# its content to the clipboard. Note this only works if supported by the browser +# and the web page is served via a secure context (see: +# https://www.w3.org/TR/secure-contexts/), i.e. using the https: or file: +# protocol. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COPY_CLIPBOARD = YES + +# Doxygen stores a couple of settings persistently in the browser (via e.g. +# cookies). By default these settings apply to all HTML pages generated by +# Doxygen across all projects. The HTML_PROJECT_COOKIE tag can be used to store +# the settings under a project specific key, such that the user preferences will +# be stored separately. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_PROJECT_COOKIE = + # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries # shown in the various tree structured indices initially; the user can expand # and collapse entries dynamically later on. Doxygen will expand the tree to @@ -1232,7 +1499,7 @@ HTML_INDEX_NUM_ENTRIES = 100 # generated that can be used as input for Apple's Xcode 3 integrated development # environment (see: # https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To -# create a documentation set, doxygen will generate a Makefile in the HTML +# create a documentation set, Doxygen will generate a Makefile in the HTML # output directory. Running make will produce the docset in that directory and # running make install will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at @@ -1251,6 +1518,13 @@ GENERATE_DOCSET = NO DOCSET_FEEDNAME = "Doxygen generated docs" +# This tag determines the URL of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDURL = + # This tag specifies a string that should uniquely identify the documentation # set bundle. This should be a reverse domain-name style string, e.g. # com.mycompany.MyDocSet. Doxygen will append .docset to the name. @@ -1273,14 +1547,18 @@ DOCSET_PUBLISHER_ID = org.doxygen.Publisher DOCSET_PUBLISHER_NAME = Publisher -# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# If the GENERATE_HTMLHELP tag is set to YES then Doxygen generates three # additional HTML index files: index.hhp, index.hhc, and index.hhk. The # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop -# (see: -# https://www.microsoft.com/en-us/download/details.aspx?id=21138) on Windows. +# on Windows. In the beginning of 2021 Microsoft took the original page, with +# a.o. the download links, offline (the HTML help workshop was already many +# years in maintenance mode). You can download the HTML help workshop from the +# web archives at Installation executable (see: +# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo +# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe). # # The HTML Help Workshop contains a compiler that can convert all HTML output -# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# generated by Doxygen into a single compiled HTML file (.chm). Compiled HTML # files are now used as the Windows 98 help format, and will replace the old # Windows help format (.hlp) on all Windows platforms in the future. Compressed # HTML files also contain an index, a table of contents, and you can search for @@ -1300,7 +1578,7 @@ CHM_FILE = # The HHC_LOCATION tag can be used to specify the location (absolute path # including file name) of the HTML help compiler (hhc.exe). If non-empty, -# doxygen will try to run the HTML help compiler on the generated index.hhp. +# Doxygen will try to run the HTML help compiler on the generated index.hhp. # The file has to be specified with full path. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. @@ -1334,6 +1612,16 @@ BINARY_TOC = NO TOC_EXPAND = NO +# The SITEMAP_URL tag is used to specify the full URL of the place where the +# generated documentation will be placed on the server by the user during the +# deployment of the documentation. The generated sitemap is called sitemap.xml +# and placed on the directory specified by HTML_OUTPUT. In case no SITEMAP_URL +# is specified no sitemap is generated. For information about the sitemap +# protocol see https://www.sitemaps.org +# This tag requires that the tag GENERATE_HTML is set to YES. + +SITEMAP_URL = + # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that # can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help @@ -1392,7 +1680,7 @@ QHP_CUST_FILTER_ATTRS = QHP_SECT_FILTER_ATTRS = # The QHG_LOCATION tag can be used to specify the location (absolute path -# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to +# including file name) of Qt's qhelpgenerator. If non-empty Doxygen will try to # run qhelpgenerator on the generated .qhp file. # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1436,18 +1724,39 @@ DISABLE_INDEX = NO # to work a browser that supports JavaScript, DHTML, CSS and frames is required # (i.e. any modern browser). Windows users are probably better off using the # HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can -# further fine-tune the look of the index. As an example, the default style -# sheet generated by doxygen has an example that shows how to put an image at -# the root of the tree instead of the PROJECT_NAME. Since the tree basically has -# the same information as the tab index, you could consider setting -# DISABLE_INDEX to YES when enabling this option. -# The default value is: NO. +# further fine tune the look of the index (see "Fine-tuning the output"). As an +# example, the default style sheet generated by Doxygen has an example that +# shows how to put an image at the root of the tree instead of the PROJECT_NAME. +# Since the tree basically has more details information than the tab index, you +# could consider setting DISABLE_INDEX to YES when enabling this option. +# The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_TREEVIEW = NO +# When GENERATE_TREEVIEW is set to YES, the PAGE_OUTLINE_PANEL option determines +# if an additional navigation panel is shown at the right hand side of the +# screen, displaying an outline of the contents of the main page, similar to +# e.g. https://developer.android.com/reference If GENERATE_TREEVIEW is set to +# NO, this option has no effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +PAGE_OUTLINE_PANEL = YES + +# When GENERATE_TREEVIEW is set to YES, the FULL_SIDEBAR option determines if +# the side bar is limited to only the treeview area (value NO) or if it should +# extend to the full height of the window (value YES). Setting this to YES gives +# a layout similar to e.g. https://docs.readthedocs.io with more room for +# contents, but less room for the project logo, title, and description. If +# GENERATE_TREEVIEW is set to NO, this option has no effect. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FULL_SIDEBAR = NO + # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that -# doxygen will group on one line in the generated HTML documentation. +# Doxygen will group on one line in the generated HTML documentation. # # Note that a value of 0 will completely suppress the enum values from appearing # in the overview section. @@ -1456,6 +1765,12 @@ GENERATE_TREEVIEW = NO ENUM_VALUES_PER_LINE = 4 +# When the SHOW_ENUM_VALUES tag is set doxygen will show the specified +# enumeration values besides the enumeration mnemonics. +# The default value is: NO. + +SHOW_ENUM_VALUES = NO + # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used # to set the initial width (in pixels) of the frame in which the tree is shown. # Minimum value: 0, maximum value: 1500, default value: 250. @@ -1463,32 +1778,45 @@ ENUM_VALUES_PER_LINE = 4 TREEVIEW_WIDTH = 250 -# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# If the EXT_LINKS_IN_WINDOW option is set to YES, Doxygen will open links to # external symbols imported via tag files in a separate window. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. EXT_LINKS_IN_WINDOW = NO +# If the OBFUSCATE_EMAILS tag is set to YES, Doxygen will obfuscate email +# addresses. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +OBFUSCATE_EMAILS = YES + +# If the HTML_FORMULA_FORMAT option is set to svg, Doxygen will use the pdf2svg +# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see +# https://inkscape.org) to generate formulas as SVG images instead of PNGs for +# the HTML output. These images will generally look nicer at scaled resolutions. +# Possible values are: png (the default) and svg (looks nicer but requires the +# pdf2svg or inkscape tool). +# The default value is: png. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FORMULA_FORMAT = png + # Use this tag to change the font size of LaTeX formulas included as images in # the HTML documentation. When you change the font size after a successful -# doxygen run you need to manually remove any form_*.png images from the HTML +# Doxygen run you need to manually remove any form_*.png images from the HTML # output directory to force them to be regenerated. # Minimum value: 8, maximum value: 50, default value: 10. # This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_FONTSIZE = 10 -# Use the FORMULA_TRANSPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are not -# supported properly for IE 6.0, but are supported on all modern browsers. -# -# Note that when changing this option you need to delete any form_*.png files in -# the HTML output directory before the changes have effect. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. +# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands +# to create new LaTeX commands to be used in formulas as building blocks. See +# the section "Including formulas" for details. -FORMULA_TRANSPARENT = YES +FORMULA_MACROFILE = # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see # https://www.mathjax.org) which uses client side JavaScript for the rendering @@ -1501,11 +1829,29 @@ FORMULA_TRANSPARENT = YES USE_MATHJAX = NO +# With MATHJAX_VERSION it is possible to specify the MathJax version to be used. +# Note that the different versions of MathJax have different requirements with +# regards to the different settings, so it is possible that also other MathJax +# settings have to be changed when switching between the different MathJax +# versions. +# Possible values are: MathJax_2 and MathJax_3. +# The default value is: MathJax_2. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_VERSION = MathJax_2 + # When MathJax is enabled you can set the default output format to be used for -# the MathJax output. See the MathJax site (see: -# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. +# the MathJax output. For more details about the output format see MathJax +# version 2 (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3 +# (see: +# http://docs.mathjax.org/en/latest/web/components/output.html). # Possible values are: HTML-CSS (which is slower, but has the best -# compatibility), NativeMML (i.e. MathML) and SVG. +# compatibility. This is the name for Mathjax version 2, for MathJax version 3 +# this will be translated into chtml), NativeMML (i.e. MathML. Only supported +# for MathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This +# is the name for Mathjax version 3, for MathJax version 2 this will be +# translated into HTML-CSS) and SVG. # The default value is: HTML-CSS. # This tag requires that the tag USE_MATHJAX is set to YES. @@ -1518,20 +1864,26 @@ MATHJAX_FORMAT = HTML-CSS # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax # Content Delivery Network so you can quickly see the result without installing # MathJax. However, it is strongly recommended to install a local copy of -# MathJax from https://www.mathjax.org before deployment. -# The default value is: https://cdn.jsdelivr.net/npm/mathjax@2. +# MathJax from https://www.mathjax.org before deployment. The default value is: +# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2 +# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3 # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example +# for MathJax version 2 (see +# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions): # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# For example for MathJax version 3 (see +# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html): +# MATHJAX_EXTENSIONS = ams # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_EXTENSIONS = -# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# The MATHJAX_CODEFILE tag can be used to specify a file with JavaScript pieces # of code that will be used on startup of the MathJax code. See the MathJax site # (see: # http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an @@ -1540,12 +1892,12 @@ MATHJAX_EXTENSIONS = MATHJAX_CODEFILE = -# When the SEARCHENGINE tag is enabled doxygen will generate a search box for -# the HTML output. The underlying search engine uses javascript and DHTML and +# When the SEARCHENGINE tag is enabled Doxygen will generate a search box for +# the HTML output. The underlying search engine uses JavaScript and DHTML and # should work on any modern browser. Note that when using HTML help # (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) # there is already a search function so this one should typically be disabled. -# For large projects the javascript based search engine can be slow, then +# For large projects the JavaScript based search engine can be slow, then # enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to # search using the keyboard; to jump to the search box use + S # (what the is depends on the OS and browser, but it is typically @@ -1564,7 +1916,7 @@ SEARCHENGINE = YES # When the SERVER_BASED_SEARCH tag is enabled the search engine will be # implemented using a web server instead of a web client using JavaScript. There # are two flavors of web server based searching depending on the EXTERNAL_SEARCH -# setting. When disabled, doxygen will generate a PHP script for searching and +# setting. When disabled, Doxygen will generate a PHP script for searching and # an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing # and searching needs to be provided by external tools. See the section # "External Indexing and Searching" for details. @@ -1573,7 +1925,7 @@ SEARCHENGINE = YES SERVER_BASED_SEARCH = NO -# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP +# When EXTERNAL_SEARCH tag is enabled Doxygen will no longer generate the PHP # script for searching. Instead the search results are written to an XML file # which needs to be processed by an external indexer. Doxygen will invoke an # external search engine pointed to by the SEARCHENGINE_URL option to obtain the @@ -1618,7 +1970,7 @@ SEARCHDATA_FILE = searchdata.xml EXTERNAL_SEARCH_ID = -# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen +# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through Doxygen # projects other than the one defined by this configuration file, but that are # all added to the same external search index. Each project needs to have a # unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of @@ -1632,7 +1984,7 @@ EXTRA_SEARCH_MAPPINGS = # Configuration options related to the LaTeX output #--------------------------------------------------------------------------- -# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output. +# If the GENERATE_LATEX tag is set to YES, Doxygen will generate LaTeX output. # The default value is: YES. GENERATE_LATEX = NO @@ -1667,7 +2019,17 @@ LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex -# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX +# The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to +# generate index for LaTeX. In case there is no backslash (\) as first character +# it will be automatically added in the LaTeX code. +# Note: This tag is used in the generated output file (.tex). +# See also: MAKEINDEX_CMD_NAME for the part in the Makefile / make.bat. +# The default value is: makeindex. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_MAKEINDEX_CMD = makeindex + +# If the COMPACT_LATEX tag is set to YES, Doxygen generates more compact LaTeX # documents. This may be useful for small projects and may help to save some # trees in general. # The default value is: NO. @@ -1696,36 +2058,38 @@ PAPER_TYPE = a4 EXTRA_PACKAGES = -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the -# generated LaTeX document. The header should contain everything until the first -# chapter. If it is left blank doxygen will generate a standard header. See -# section "Doxygen usage" for information on how to let doxygen write the -# default header to a separate file. +# The LATEX_HEADER tag can be used to specify a user-defined LaTeX header for +# the generated LaTeX document. The header should contain everything until the +# first chapter. If it is left blank Doxygen will generate a standard header. It +# is highly recommended to start with a default header using +# doxygen -w latex new_header.tex new_footer.tex new_stylesheet.sty +# and then modify the file new_header.tex. See also section "Doxygen usage" for +# information on how to generate the default header that Doxygen normally uses. # -# Note: Only use a user-defined header if you know what you are doing! The -# following commands have a special meaning inside the header: $title, -# $datetime, $date, $doxygenversion, $projectname, $projectnumber, -# $projectbrief, $projectlogo. Doxygen will replace $title with the empty -# string, for the replacement values of the other commands the user is referred -# to HTML_HEADER. +# Note: Only use a user-defined header if you know what you are doing! +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of Doxygen. The following +# commands have a special meaning inside the header (and footer): For a +# description of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_HEADER = -# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the -# generated LaTeX document. The footer should contain everything after the last -# chapter. If it is left blank doxygen will generate a standard footer. See +# The LATEX_FOOTER tag can be used to specify a user-defined LaTeX footer for +# the generated LaTeX document. The footer should contain everything after the +# last chapter. If it is left blank Doxygen will generate a standard footer. See # LATEX_HEADER for more information on how to generate a default footer and what -# special commands can be used inside the footer. -# -# Note: Only use a user-defined footer if you know what you are doing! +# special commands can be used inside the footer. See also section "Doxygen +# usage" for information on how to generate the default footer that Doxygen +# normally uses. Note: Only use a user-defined footer if you know what you are +# doing! # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_FOOTER = # The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined # LaTeX style sheets that are included after the standard style sheets created -# by doxygen. Using this option one can overrule certain style aspects. Doxygen +# by Doxygen. Using this option one can overrule certain style aspects. Doxygen # will copy the style sheet files to the output directory. # Note: The order of the extra style sheet files is of importance (e.g. the last # style sheet in the list overrules the setting of the previous ones in the @@ -1751,7 +2115,7 @@ LATEX_EXTRA_FILES = PDF_HYPERLINKS = YES -# If the USE_PDFLATEX tag is set to YES, doxygen will use the engine as +# If the USE_PDFLATEX tag is set to YES, Doxygen will use the engine as # specified with LATEX_CMD_NAME to generate the PDF file directly from the LaTeX # files. Set this option to YES, to get a higher quality PDF documentation. # @@ -1761,53 +2125,49 @@ PDF_HYPERLINKS = YES USE_PDFLATEX = YES -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode -# command to the generated LaTeX files. This will instruct LaTeX to keep running -# if errors occur, instead of asking the user for help. This option is also used -# when generating formulas in HTML. +# The LATEX_BATCHMODE tag signals the behavior of LaTeX in case of an error. +# Possible values are: NO same as ERROR_STOP, YES same as BATCH, BATCH In batch +# mode nothing is printed on the terminal, errors are scrolled as if is +# hit at every error; missing files that TeX tries to input or request from +# keyboard input (\read on a not open input stream) cause the job to abort, +# NON_STOP In nonstop mode the diagnostic message will appear on the terminal, +# but there is no possibility of user interaction just like in batch mode, +# SCROLL In scroll mode, TeX will stop only for missing files to input or if +# keyboard input is necessary and ERROR_STOP In errorstop mode, TeX will stop at +# each error, asking for user intervention. # The default value is: NO. # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_BATCHMODE = NO -# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the +# If the LATEX_HIDE_INDICES tag is set to YES then Doxygen will not include the # index chapters (such as File Index, Compound Index, etc.) in the output. # The default value is: NO. # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_HIDE_INDICES = NO -# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source -# code with syntax highlighting in the LaTeX output. -# -# Note that which sources are shown also depends on other settings such as -# SOURCE_BROWSER. -# The default value is: NO. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_SOURCE_CODE = NO - # The LATEX_BIB_STYLE tag can be used to specify the style to use for the # bibliography, e.g. plainnat, or ieeetr. See # https://en.wikipedia.org/wiki/BibTeX and \cite for more info. -# The default value is: plain. +# The default value is: plainnat. # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_BIB_STYLE = plain -# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated -# page will contain the date and time when the page was generated. Setting this -# to NO can help when comparing the output of multiple runs. -# The default value is: NO. +# The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute) +# path from which the emoji images will be read. If a relative path is entered, +# it will be relative to the LATEX_OUTPUT directory. If left blank the +# LATEX_OUTPUT directory will be used. # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_TIMESTAMP = NO +LATEX_EMOJI_DIRECTORY = #--------------------------------------------------------------------------- # Configuration options related to the RTF output #--------------------------------------------------------------------------- -# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The +# If the GENERATE_RTF tag is set to YES, Doxygen will generate RTF output. The # RTF output is optimized for Word 97 and may not look too pretty with other RTF # readers/editors. # The default value is: NO. @@ -1822,7 +2182,7 @@ GENERATE_RTF = NO RTF_OUTPUT = rtf -# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF +# If the COMPACT_RTF tag is set to YES, Doxygen generates more compact RTF # documents. This may be useful for small projects and may help to save some # trees in general. # The default value is: NO. @@ -1842,38 +2202,36 @@ COMPACT_RTF = NO RTF_HYPERLINKS = NO -# Load stylesheet definitions from file. Syntax is similar to doxygen's +# Load stylesheet definitions from file. Syntax is similar to Doxygen's # configuration file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. # # See also section "Doxygen usage" for information on how to generate the -# default style sheet that doxygen normally uses. +# default style sheet that Doxygen normally uses. # This tag requires that the tag GENERATE_RTF is set to YES. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an RTF document. Syntax is -# similar to doxygen's configuration file. A template extensions file can be +# similar to Doxygen's configuration file. A template extensions file can be # generated using doxygen -e rtf extensionFile. # This tag requires that the tag GENERATE_RTF is set to YES. RTF_EXTENSIONS_FILE = -# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code -# with syntax highlighting in the RTF output. -# -# Note that which sources are shown also depends on other settings such as -# SOURCE_BROWSER. -# The default value is: NO. +# The RTF_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the RTF_OUTPUT output directory. +# Note that the files will be copied as-is; there are no commands or markers +# available. # This tag requires that the tag GENERATE_RTF is set to YES. -RTF_SOURCE_CODE = NO +RTF_EXTRA_FILES = #--------------------------------------------------------------------------- # Configuration options related to the man page output #--------------------------------------------------------------------------- -# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for +# If the GENERATE_MAN tag is set to YES, Doxygen will generate man pages for # classes and files. # The default value is: NO. @@ -1904,7 +2262,7 @@ MAN_EXTENSION = .3 MAN_SUBDIR = -# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, then it # will generate one additional man file for each entity documented in the real # man page(s). These additional files only source the real man page, but without # them the man command would be unable to find the correct page. @@ -1917,7 +2275,7 @@ MAN_LINKS = NO # Configuration options related to the XML output #--------------------------------------------------------------------------- -# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that +# If the GENERATE_XML tag is set to YES, Doxygen will generate an XML file that # captures the structure of the code including all documentation. # The default value is: NO. @@ -1931,7 +2289,7 @@ GENERATE_XML = NO XML_OUTPUT = xml -# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program +# If the XML_PROGRAMLISTING tag is set to YES, Doxygen will dump the program # listings (including syntax highlighting and cross-referencing information) to # the XML output. Note that enabling this will significantly increase the size # of the XML output. @@ -1940,11 +2298,18 @@ XML_OUTPUT = xml XML_PROGRAMLISTING = YES +# If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, Doxygen will include +# namespace members in file scope as well, matching the HTML output. +# The default value is: NO. +# This tag requires that the tag GENERATE_XML is set to YES. + +XML_NS_MEMB_FILE_SCOPE = NO + #--------------------------------------------------------------------------- # Configuration options related to the DOCBOOK output #--------------------------------------------------------------------------- -# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files +# If the GENERATE_DOCBOOK tag is set to YES, Doxygen will generate Docbook files # that can be used to generate PDF. # The default value is: NO. @@ -1958,32 +2323,49 @@ GENERATE_DOCBOOK = NO DOCBOOK_OUTPUT = docbook -# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the -# program listings (including syntax highlighting and cross-referencing -# information) to the DOCBOOK output. Note that enabling this will significantly -# increase the size of the DOCBOOK output. -# The default value is: NO. -# This tag requires that the tag GENERATE_DOCBOOK is set to YES. - -DOCBOOK_PROGRAMLISTING = NO - #--------------------------------------------------------------------------- # Configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- -# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an -# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures +# If the GENERATE_AUTOGEN_DEF tag is set to YES, Doxygen will generate an +# AutoGen Definitions (see https://autogen.sourceforge.net/) file that captures # the structure of the code including all documentation. Note that this feature # is still experimental and incomplete at the moment. # The default value is: NO. GENERATE_AUTOGEN_DEF = NO +#--------------------------------------------------------------------------- +# Configuration options related to Sqlite3 output +#--------------------------------------------------------------------------- + +# If the GENERATE_SQLITE3 tag is set to YES Doxygen will generate a Sqlite3 +# database with symbols found by Doxygen stored in tables. +# The default value is: NO. + +GENERATE_SQLITE3 = NO + +# The SQLITE3_OUTPUT tag is used to specify where the Sqlite3 database will be +# put. If a relative path is entered the value of OUTPUT_DIRECTORY will be put +# in front of it. +# The default directory is: sqlite3. +# This tag requires that the tag GENERATE_SQLITE3 is set to YES. + +SQLITE3_OUTPUT = sqlite3 + +# The SQLITE3_RECREATE_DB tag is set to YES, the existing doxygen_sqlite3.db +# database file will be recreated with each Doxygen run. If set to NO, Doxygen +# will warn if a database file is already found and not modify it. +# The default value is: YES. +# This tag requires that the tag GENERATE_SQLITE3 is set to YES. + +SQLITE3_RECREATE_DB = YES + #--------------------------------------------------------------------------- # Configuration options related to the Perl module output #--------------------------------------------------------------------------- -# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module +# If the GENERATE_PERLMOD tag is set to YES, Doxygen will generate a Perl module # file that captures the structure of the code including all documentation. # # Note that this feature is still experimental and incomplete at the moment. @@ -1991,7 +2373,7 @@ GENERATE_AUTOGEN_DEF = NO GENERATE_PERLMOD = NO -# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary +# If the PERLMOD_LATEX tag is set to YES, Doxygen will generate the necessary # Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI # output from the Perl module output. # The default value is: NO. @@ -2021,13 +2403,13 @@ PERLMOD_MAKEVAR_PREFIX = # Configuration options related to the preprocessor #--------------------------------------------------------------------------- -# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all +# If the ENABLE_PREPROCESSING tag is set to YES, Doxygen will evaluate all # C-preprocessor directives found in the sources and include files. # The default value is: YES. ENABLE_PREPROCESSING = YES -# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names +# If the MACRO_EXPANSION tag is set to YES, Doxygen will expand all macro names # in the source code. If set to NO, only conditional compilation will be # performed. Macro expansion can be done in a controlled way by setting # EXPAND_ONLY_PREDEF to YES. @@ -2053,7 +2435,8 @@ SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by the -# preprocessor. +# preprocessor. Note that the INCLUDE_PATH is not recursive, so the setting of +# RECURSIVE has no effect here. # This tag requires that the tag SEARCH_INCLUDES is set to YES. INCLUDE_PATH = @@ -2074,7 +2457,9 @@ INCLUDE_FILE_PATTERNS = # recursively expanded use the := operator instead of the = operator. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -PREDEFINED = __cdecl=, ARDUINO_ARCH_ESP32=1, ARDUINO_FUNHOUSE_ESP32S2=1 +PREDEFINED = "__cdecl=," \ + "ARDUINO_ARCH_ESP32=1," \ + ARDUINO_FUNHOUSE_ESP32S2=1 # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this # tag can be used to specify a list of macro names that should be expanded. The @@ -2085,7 +2470,7 @@ PREDEFINED = __cdecl=, ARDUINO_ARCH_ESP32=1, ARDUINO_FUNHOUSE_ESP32S EXPAND_AS_DEFINED = -# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will +# If the SKIP_FUNCTION_MACROS tag is set to YES then Doxygen's preprocessor will # remove all references to function-like macros that are alone on a line, have # an all uppercase name, and do not end with a semicolon. Such function macros # are typically used for boiler-plate code, and will confuse the parser if not @@ -2109,26 +2494,26 @@ SKIP_FUNCTION_MACROS = YES # section "Linking to external documentation" for more information about the use # of tag files. # Note: Each tag file must have a unique name (where the name does NOT include -# the path). If a tag file is not located in the directory in which doxygen is +# the path). If a tag file is not located in the directory in which Doxygen is # run, you must also specify the path to the tagfile here. TAGFILES = -# When a file name is specified after GENERATE_TAGFILE, doxygen will create a +# When a file name is specified after GENERATE_TAGFILE, Doxygen will create a # tag file that is based on the input files it reads. See section "Linking to # external documentation" for more information about the usage of tag files. GENERATE_TAGFILE = -# If the ALLEXTERNALS tag is set to YES, all external class will be listed in -# the class index. If set to NO, only the inherited external classes will be -# listed. +# If the ALLEXTERNALS tag is set to YES, all external classes and namespaces +# will be listed in the class and namespace index. If set to NO, only the +# inherited external classes will be listed. # The default value is: NO. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will be +# in the topic index. If set to NO, only the current project's groups will be # listed. # The default value is: YES. @@ -2142,42 +2527,26 @@ EXTERNAL_GROUPS = YES EXTERNAL_PAGES = YES #--------------------------------------------------------------------------- -# Configuration options related to the dot tool +# Configuration options related to diagram generator tools #--------------------------------------------------------------------------- -# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram -# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to -# NO turns the diagrams off. Note that this option also works with HAVE_DOT -# disabled, but it is recommended to install and use dot, since it yields more -# powerful graphs. -# The default value is: YES. - -CLASS_DIAGRAMS = YES - -# You can include diagrams made with dia in doxygen documentation. Doxygen will -# then run dia to produce the diagram and insert it in the documentation. The -# DIA_PATH tag allows you to specify the directory where the dia binary resides. -# If left empty dia is assumed to be found in the default search path. - -DIA_PATH = - # If set to YES the inheritance and collaboration graphs will hide inheritance # and usage relations if the target is undocumented or is not a class. # The default value is: YES. HIDE_UNDOC_RELATIONS = YES -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# If you set the HAVE_DOT tag to YES then Doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz (see: -# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent +# https://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent # Bell Labs. The other options in this section have no effect if this option is # set to NO # The default value is: NO. HAVE_DOT = NO -# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed -# to run in parallel. When set to 0 doxygen will base this on the number of +# The DOT_NUM_THREADS specifies the number of dot invocations Doxygen is allowed +# to run in parallel. When set to 0 Doxygen will base this on the number of # processors available in the system. You can set it explicitly to a value # larger than 0 to get control over the balance between CPU load and processing # speed. @@ -2186,55 +2555,83 @@ HAVE_DOT = NO DOT_NUM_THREADS = 0 -# When you want a differently looking font in the dot files that doxygen -# generates you can specify the font name using DOT_FONTNAME. You need to make -# sure dot is able to find the font, which can be done by putting it in a -# standard location or by setting the DOTFONTPATH environment variable or by -# setting DOT_FONTPATH to the directory containing the font. -# The default value is: Helvetica. +# DOT_COMMON_ATTR is common attributes for nodes, edges and labels of +# subgraphs. When you want a differently looking font in the dot files that +# Doxygen generates you can specify fontname, fontcolor and fontsize attributes. +# For details please see Node, +# Edge and Graph Attributes specification You need to make sure dot is able +# to find the font, which can be done by putting it in a standard location or by +# setting the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. Default graphviz fontsize is 14. +# The default value is: fontname=Helvetica,fontsize=10. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_FONTNAME = Helvetica +DOT_COMMON_ATTR = "fontname=Helvetica,fontsize=10" -# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of -# dot graphs. -# Minimum value: 4, maximum value: 24, default value: 10. +# DOT_EDGE_ATTR is concatenated with DOT_COMMON_ATTR. For elegant style you can +# add 'arrowhead=open, arrowtail=open, arrowsize=0.5'. Complete documentation about +# arrows shapes. +# The default value is: labelfontname=Helvetica,labelfontsize=10. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_FONTSIZE = 10 +DOT_EDGE_ATTR = "labelfontname=Helvetica,labelfontsize=10" -# By default doxygen will tell dot to use the default font as specified with -# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set -# the path where dot can find it using this tag. +# DOT_NODE_ATTR is concatenated with DOT_COMMON_ATTR. For view without boxes +# around nodes set 'shape=plain' or 'shape=plaintext' Shapes specification +# The default value is: shape=box,height=0.2,width=0.4. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_NODE_ATTR = "shape=box,height=0.2,width=0.4" + +# You can set the path where dot can find font specified with fontname in +# DOT_COMMON_ATTR and others dot attributes. # This tag requires that the tag HAVE_DOT is set to YES. DOT_FONTPATH = -# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for -# each documented class showing the direct and indirect inheritance relations. -# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO. +# If the CLASS_GRAPH tag is set to YES or GRAPH or BUILTIN then Doxygen will +# generate a graph for each documented class showing the direct and indirect +# inheritance relations. In case the CLASS_GRAPH tag is set to YES or GRAPH and +# HAVE_DOT is enabled as well, then dot will be used to draw the graph. In case +# the CLASS_GRAPH tag is set to YES and HAVE_DOT is disabled or if the +# CLASS_GRAPH tag is set to BUILTIN, then the built-in generator will be used. +# If the CLASS_GRAPH tag is set to TEXT the direct and indirect inheritance +# relations will be shown as texts / links. Explicit enabling an inheritance +# graph or choosing a different representation for an inheritance graph of a +# specific class, can be accomplished by means of the command \inheritancegraph. +# Disabling an inheritance graph can be accomplished by means of the command +# \hideinheritancegraph. +# Possible values are: NO, YES, TEXT, GRAPH and BUILTIN. # The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. CLASS_GRAPH = YES -# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a +# If the COLLABORATION_GRAPH tag is set to YES then Doxygen will generate a # graph for each documented class showing the direct and indirect implementation # dependencies (inheritance, containment, and class references variables) of the -# class with other documented classes. +# class with other documented classes. Explicit enabling a collaboration graph, +# when COLLABORATION_GRAPH is set to NO, can be accomplished by means of the +# command \collaborationgraph. Disabling a collaboration graph can be +# accomplished by means of the command \hidecollaborationgraph. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. COLLABORATION_GRAPH = YES -# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for -# groups, showing the direct groups dependencies. +# If the GROUP_GRAPHS tag is set to YES then Doxygen will generate a graph for +# groups, showing the direct groups dependencies. Explicit enabling a group +# dependency graph, when GROUP_GRAPHS is set to NO, can be accomplished by means +# of the command \groupgraph. Disabling a directory graph can be accomplished by +# means of the command \hidegroupgraph. See also the chapter Grouping in the +# manual. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. GROUP_GRAPHS = YES -# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and +# If the UML_LOOK tag is set to YES, Doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. # The default value is: NO. @@ -2255,6 +2652,37 @@ UML_LOOK = NO UML_LIMIT_NUM_FIELDS = 10 +# If the UML_LOOK tag is enabled, field labels are shown along the edge between +# two class nodes. If there are many fields and many nodes the graph may become +# too cluttered. The UML_MAX_EDGE_LABELS threshold limits the number of items to +# make the size more manageable. Set this to 0 for no limit. +# Minimum value: 0, maximum value: 100, default value: 10. +# This tag requires that the tag UML_LOOK is set to YES. + +UML_MAX_EDGE_LABELS = 10 + +# If the DOT_UML_DETAILS tag is set to NO, Doxygen will show attributes and +# methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS +# tag is set to YES, Doxygen will add type and arguments for attributes and +# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, Doxygen +# will not generate fields with class member information in the UML graphs. The +# class diagrams will look similar to the default class diagrams but using UML +# notation for the relationships. +# Possible values are: NO, YES and NONE. +# The default value is: NO. +# This tag requires that the tag UML_LOOK is set to YES. + +DOT_UML_DETAILS = NO + +# The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters +# to display on a single line. If the actual line length exceeds this threshold +# significantly it will be wrapped across multiple lines. Some heuristics are +# applied to avoid ugly line breaks. +# Minimum value: 0, maximum value: 1000, default value: 17. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_WRAP_THRESHOLD = 17 + # If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and # collaboration graphs will show the relations between templates and their # instances. @@ -2264,24 +2692,29 @@ UML_LIMIT_NUM_FIELDS = 10 TEMPLATE_RELATIONS = NO # If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to -# YES then doxygen will generate a graph for each documented file showing the +# YES then Doxygen will generate a graph for each documented file showing the # direct and indirect include dependencies of the file with other documented -# files. +# files. Explicit enabling an include graph, when INCLUDE_GRAPH is is set to NO, +# can be accomplished by means of the command \includegraph. Disabling an +# include graph can be accomplished by means of the command \hideincludegraph. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. INCLUDE_GRAPH = YES # If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are -# set to YES then doxygen will generate a graph for each documented file showing +# set to YES then Doxygen will generate a graph for each documented file showing # the direct and indirect include dependencies of the file with other documented -# files. +# files. Explicit enabling an included by graph, when INCLUDED_BY_GRAPH is set +# to NO, can be accomplished by means of the command \includedbygraph. Disabling +# an included by graph can be accomplished by means of the command +# \hideincludedbygraph. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. INCLUDED_BY_GRAPH = YES -# If the CALL_GRAPH tag is set to YES then doxygen will generate a call +# If the CALL_GRAPH tag is set to YES then Doxygen will generate a call # dependency graph for every global function or class method. # # Note that enabling this option will significantly increase the time of a run. @@ -2293,7 +2726,7 @@ INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO -# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller +# If the CALLER_GRAPH tag is set to YES then Doxygen will generate a caller # dependency graph for every global function or class method. # # Note that enabling this option will significantly increase the time of a run. @@ -2305,44 +2738,59 @@ CALL_GRAPH = NO CALLER_GRAPH = NO -# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical +# If the GRAPHICAL_HIERARCHY tag is set to YES then Doxygen will graphical # hierarchy of all classes instead of a textual one. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. GRAPHICAL_HIERARCHY = YES -# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the +# If the DIRECTORY_GRAPH tag is set to YES then Doxygen will show the # dependencies a directory has on other directories in a graphical way. The # dependency relations are determined by the #include relations between the -# files in the directories. +# files in the directories. Explicit enabling a directory graph, when +# DIRECTORY_GRAPH is set to NO, can be accomplished by means of the command +# \directorygraph. Disabling a directory graph can be accomplished by means of +# the command \hidedirectorygraph. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. DIRECTORY_GRAPH = YES +# The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels +# of child directories generated in directory dependency graphs by dot. +# Minimum value: 1, maximum value: 25, default value: 1. +# This tag requires that the tag DIRECTORY_GRAPH is set to YES. + +DIR_GRAPH_MAX_DEPTH = 1 + # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. For an explanation of the image formats see the section # output formats in the documentation of the dot tool (Graphviz (see: -# http://www.graphviz.org/)). -# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order -# to make the SVG files visible in IE 9+ (other browsers do not have this -# requirement). +# https://www.graphviz.org/)). +# +# Note the formats svg:cairo and svg:cairo:cairo cannot be used in combination +# with INTERACTIVE_SVG (the INTERACTIVE_SVG will be set to NO). # Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo, -# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and -# png:gdiplus:gdiplus. +# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus, +# png:gdiplus:gdiplus, svg:cairo, svg:cairo:cairo, svg:svg, svg:svg:core, +# gif:cairo, gif:cairo:gd, gif:cairo:gdiplus, gif:gdiplus, gif:gdiplus:gdiplus, +# gif:gd, gif:gd:gd, jpg:cairo, jpg:cairo:gd, jpg:cairo:gdiplus, jpg:gd, +# jpg:gd:gd, jpg:gdiplus and jpg:gdiplus:gdiplus. # The default value is: png. # This tag requires that the tag HAVE_DOT is set to YES. DOT_IMAGE_FORMAT = png -# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to -# enable generation of interactive SVG images that allow zooming and panning. +# If DOT_IMAGE_FORMAT is set to svg or svg:svg or svg:svg:core, then this option +# can be set to YES to enable generation of interactive SVG images that allow +# zooming and panning. # # Note that this requires a modern browser other than Internet Explorer. Tested # and working are Firefox, Chrome, Safari, and Opera. -# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make -# the SVG files visible. Older versions of IE do not have SVG support. +# +# Note This option will be automatically disabled when DOT_IMAGE_FORMAT is set +# to svg:cairo or svg:cairo:cairo. # The default value is: NO. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2361,11 +2809,12 @@ DOT_PATH = DOTFILE_DIRS = -# The MSCFILE_DIRS tag can be used to specify one or more directories that -# contain msc files that are included in the documentation (see the \mscfile -# command). +# You can include diagrams made with dia in Doxygen documentation. Doxygen will +# then run dia to produce the diagram and insert it in the documentation. The +# DIA_PATH tag allows you to specify the directory where the dia binary resides. +# If left empty dia is assumed to be found in the default search path. -MSCFILE_DIRS = +DIA_PATH = # The DIAFILE_DIRS tag can be used to specify one or more directories that # contain dia files that are included in the documentation (see the \diafile @@ -2373,28 +2822,34 @@ MSCFILE_DIRS = DIAFILE_DIRS = -# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the -# path where java can find the plantuml.jar file. If left blank, it is assumed -# PlantUML is not used or called during a preprocessing step. Doxygen will -# generate a warning when it encounters a \startuml command in this case and -# will not generate output for the diagram. +# When using PlantUML, the PLANTUML_JAR_PATH tag should be used to specify the +# path where java can find the plantuml.jar file or to the filename of jar file +# to be used. If left blank, it is assumed PlantUML is not used or called during +# a preprocessing step. Doxygen will generate a warning when it encounters a +# \startuml command in this case and will not generate output for the diagram. PLANTUML_JAR_PATH = -# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a -# configuration file for plantuml. +# When using PlantUML, the PLANTUML_CFG_FILE tag can be used to specify a +# configuration file for PlantUML. PLANTUML_CFG_FILE = -# When using plantuml, the specified paths are searched for files specified by -# the !include statement in a plantuml block. +# When using PlantUML, the specified paths are searched for files specified by +# the !include statement in a PlantUML block. PLANTUML_INCLUDE_PATH = +# The PLANTUMLFILE_DIRS tag can be used to specify one or more directories that +# contain PlantUml files that are included in the documentation (see the +# \plantumlfile command). + +PLANTUMLFILE_DIRS = + # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes # that will be shown in the graph. If the number of nodes in a graph becomes -# larger than this value, doxygen will truncate the graph, which is visualized -# by representing a node as a red box. Note that doxygen if the number of direct +# larger than this value, Doxygen will truncate the graph, which is visualized +# by representing a node as a red box. Note that if the number of direct # children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that # the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. @@ -2415,18 +2870,6 @@ DOT_GRAPH_MAX_NODES = 50 MAX_DOT_GRAPH_DEPTH = 0 -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, because dot on Windows does not seem -# to support this out of the box. -# -# Warning: Depending on the platform used, enabling this option may lead to -# badly anti-aliased labels on the edges of a graph (i.e. they become hard to -# read). -# The default value is: NO. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_TRANSPARENT = NO - # Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) support @@ -2436,19 +2879,37 @@ DOT_TRANSPARENT = NO DOT_MULTI_TARGETS = NO -# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page +# If the GENERATE_LEGEND tag is set to YES Doxygen will generate a legend page # explaining the meaning of the various boxes and arrows in the dot generated # graphs. +# Note: This tag requires that UML_LOOK isn't set, i.e. the Doxygen internal +# graphical representation for inheritance and collaboration diagrams is used. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. GENERATE_LEGEND = YES -# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate +# If the DOT_CLEANUP tag is set to YES, Doxygen will remove the intermediate # files that are used to generate the various graphs. # -# Note: This setting is not only used for dot files but also for msc and -# plantuml temporary files. +# Note: This setting is not only used for dot files but also for msc temporary +# files. # The default value is: YES. DOT_CLEANUP = YES + +# You can define message sequence charts within Doxygen comments using the \msc +# command. If the MSCGEN_TOOL tag is left empty (the default), then Doxygen will +# use a built-in version of mscgen tool to produce the charts. Alternatively, +# the MSCGEN_TOOL tag can also specify the name an external tool. For instance, +# specifying prog as the value, Doxygen will call the tool as prog -T +# -o . The external tool should support +# output file formats "png", "eps", "svg", and "ismap". + +MSCGEN_TOOL = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the \mscfile +# command). + +MSCFILE_DIRS = diff --git a/src/Wippersnapper.cpp b/src/Wippersnapper.cpp index 17b19a3c1..57d839b51 100644 --- a/src/Wippersnapper.cpp +++ b/src/Wippersnapper.cpp @@ -1684,10 +1684,30 @@ bool cbDecodeDisplayMsg(pb_istream_t *stream, const pb_field_t *field, } // Attempt to add or replace a display component - bool did_add = - WS._displayController->Handle_Display_AddOrReplace(&msgAddReq); - // TODO: Add response handling and publishing here, for now it always - // returns true and doesnt publish back to the broker + bool did_add = WS._displayController->Handle_Display_AddOrReplace(&msgAddReq); + + // Create a DisplayResponse message + wippersnapper_signal_v1_DisplayResponse msgResp = wippersnapper_signal_v1_DisplayResponse_init_zero; + msgResp.which_payload = wippersnapper_signal_v1_DisplayResponse_display_added_tag; + msgResp.payload.display_added.did_add = did_add; + strncpy(msgResp.payload.display_added.name, msgAddReq.name, sizeof(msgResp.payload.display_added.name)); + + // Encode and publish response back to broker + memset(WS._buffer_outgoing, 0, sizeof(WS._buffer_outgoing)); + pb_ostream_t ostream = pb_ostream_from_buffer(WS._buffer_outgoing, sizeof(WS._buffer_outgoing)); + if (!ws_pb_encode(&ostream, wippersnapper_signal_v1_DisplayResponse_fields, &msgResp)) { + WS_DEBUG_PRINTLN("ERROR: Unable to encode display response message!"); + return false; + } + + size_t msgSz; + pb_get_encoded_size(&msgSz, wippersnapper_signal_v1_DisplayResponse_fields, &msgResp); + WS_DEBUG_PRINT("Publishing DisplayResponse Message..."); + if (!WS._mqtt->publish(WS._topic_signal_display_device, WS._buffer_outgoing, msgSz, 1)) { + WS_DEBUG_PRINTLN("ERROR: Failed to DisplayResponse Response!"); + } else { + WS_DEBUG_PRINTLN("Published!"); + } } else if (field->tag == wippersnapper_signal_v1_DisplayRequest_display_write_tag) { // Decode message into a DisplayAddRequest @@ -1698,7 +1718,23 @@ bool cbDecodeDisplayMsg(pb_istream_t *stream, const pb_field_t *field, WS_DEBUG_PRINTLN("ERROR: Failure decoding DisplayWrite message!"); return false; } + // Attempt to write to a display WS._displayController->Handle_Display_Write(&msgWrite); + } else if (field->tag == wippersnapper_signal_v1_DisplayRequest_display_remove_tag) { + // Decode message into a DisplayRemoveRequest + wippersnapper_display_v1_DisplayRemove msgRemove = + wippersnapper_display_v1_DisplayRemove_init_zero; + if (!ws_pb_decode(stream, + wippersnapper_display_v1_DisplayRemove_fields, + &msgRemove)) { + WS_DEBUG_PRINTLN("ERROR: Failure decoding DisplayRemove message!"); + return false; + } + // Attempt to remove a display + WS._displayController->Handle_Display_Remove(&msgRemove); + } else { + WS_DEBUG_PRINTLN("ERROR: Display message type not found!"); + return false; } return true; } diff --git a/src/components/display/controller.cpp b/src/components/display/controller.cpp index a80adf0ed..ebdef51c4 100644 --- a/src/components/display/controller.cpp +++ b/src/components/display/controller.cpp @@ -25,7 +25,11 @@ DisplayController::DisplayController() { @brief Destructor */ DisplayController::~DisplayController() { - // TODO + // Clean up all display hardware instances + for (DisplayHardware *hw_instance : _hw_instances) { + delete hw_instance; + } + _hw_instances.clear(); } /*! diff --git a/src/components/display/controller.h b/src/components/display/controller.h index f4c087e30..6dd3e4c05 100644 --- a/src/components/display/controller.h +++ b/src/components/display/controller.h @@ -35,7 +35,6 @@ class DisplayController { wippersnapper_display_v1_DisplayAddOrReplace *msgAdd); bool Handle_Display_Remove(wippersnapper_display_v1_DisplayRemove *msgRemove); bool Handle_Display_Write(wippersnapper_display_v1_DisplayWrite *msgWrite); - private: std::vector _hw_instances; ///< Holds pointers to DisplayHardware instances diff --git a/src/components/display/drivers/dispDrvBase.h b/src/components/display/drivers/dispDrvBase.h index c7d624836..9d50429da 100644 --- a/src/components/display/drivers/dispDrvBase.h +++ b/src/components/display/drivers/dispDrvBase.h @@ -15,8 +15,8 @@ #ifndef WS_DISP_DRV_BASE_H #define WS_DISP_DRV_BASE_H -#include "Adafruit_ThinkInk.h" #include "Wippersnapper.h" +#include "Adafruit_ThinkInk.h" /*! @brief Abstract base class for display drivers. diff --git a/src/components/display/drivers/dispDrvThinkInkGrayscale4T5.h b/src/components/display/drivers/dispDrvThinkInkGrayscale4T5.h new file mode 100644 index 000000000..0320cf1eb --- /dev/null +++ b/src/components/display/drivers/dispDrvThinkInkGrayscale4T5.h @@ -0,0 +1,139 @@ +/*! + * @file src/components/display/drivers/ThinkInk_290_Grayscale4_T5.h + * + * Driver for ThinkInk 2.9" Grayscale 4-level T5 display (present on the + * pre-2025 version of the Adafruit MagTag) + * + * Adafruit invests time and resources providing this open source code, + * please support Adafruit and open-source hardware by purchasing + * products from Adafruit! + * + * Copyright (c) Brent Rubell 2025 for Adafruit Industries. + * + * BSD license, all text here must be included in any redistribution. + * + */ +#ifndef WS_DRV_THINKINK_GRAYSCALE4_T5_H +#define WS_DRV_THINKINK_GRAYSCALE4_T5_H + +#include "dispDrvBase.h" + +/*! + @brief Driver for a ThinkInk 2.9" Grayscale 4-level T5 display (pre-2025 version of the Adafruit MagTag). +*/ +class dispDrvThinkInkGrayscale4T5 : public dispDrvBase { +public: + /*! + @brief Constructor for the ThinkInk Grayscale 4-level EAAMFGN 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. + */ + dispDrvThinkInkGrayscale4T5(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) {} + + ~dispDrvThinkInkGrayscale4T5() { + if (_display) { + delete _display; + _display = nullptr; + } + } + + /*! + @brief Attempts to initialize the ThinkInk Grayscale 4-level EAAMFGN + 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_290_Grayscale4_T5(_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 + _text_sz = 3; + _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 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; + + // Start with a fresh display buffer + _display->clearBuffer(); + int16_t y_idx = 0; + _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); + 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) { + _display->write(char(248)); + i++; + } else { + _display->print(message[i]); + } + } + _display->display(); + } + +private: + ThinkInk_290_Grayscale4_T5 *_display; +}; + +#endif // WS_DRV_THINKINK_GRAYSCALE4_T5_H \ No newline at end of file diff --git a/src/components/display/hardware.cpp b/src/components/display/hardware.cpp index 7a67a3dc0..eb34f8b8a 100644 --- a/src/components/display/hardware.cpp +++ b/src/components/display/hardware.cpp @@ -23,17 +23,30 @@ using FnCreateDispDrv = // Factory for creating a new display drivers // NOTE: When you add a new display driver, make sure to add it to the factory! static const std::map FactoryDrvDisp = { - {"grayscale4_eaamfgn", + {"thinkink-gs4-eaamfgn", [](int16_t dc, int16_t rst, int16_t cs, int16_t sram_cs, int16_t busy) -> dispDrvBase * { return new drvDispThinkInkGrayscale4Eaamfgn(dc, rst, cs, sram_cs, busy); }}, - {"magtag_2025", + {"thinkink-magtag-2025", [](int16_t dc, int16_t rst, int16_t cs, int16_t sram_cs, int16_t busy) -> dispDrvBase * { return new drvDispThinkInkGrayscale4Eaamfgn(dc, rst, cs, sram_cs, busy); - }}}; + }}, + {"thinkink-gs4-t5", + [](int16_t dc, int16_t rst, int16_t cs, int16_t sram_cs, + int16_t busy) -> dispDrvBase * { + return new dispDrvThinkInkGrayscale4T5(dc, rst, cs, sram_cs, busy); + }}, + {"thinkink-magtag-pre-2025", + [](int16_t dc, int16_t rst, int16_t cs, int16_t sram_cs, + int16_t busy) -> dispDrvBase * { + return new dispDrvThinkInkGrayscale4T5(dc, rst, cs, sram_cs, busy); + }} + }; + + /*! @brief Creates a new display driver instance based on the driver name. @param driver_name diff --git a/src/components/display/hardware.h b/src/components/display/hardware.h index 570b2e1b8..00cba9625 100644 --- a/src/components/display/hardware.h +++ b/src/components/display/hardware.h @@ -15,10 +15,11 @@ #ifndef WS_DISPLAY_HARDWARE_H #define WS_DISPLAY_HARDWARE_H #include "Wippersnapper.h" -#include "drivers/dispDrvBase.h" -#include "drivers/dispDrvThinkInkGrayscale4Eaamfgn.h" #include #include +#include "drivers/dispDrvBase.h" +#include "drivers/dispDrvThinkInkGrayscale4Eaamfgn.h" +#include "drivers/dispDrvThinkInkGrayscale4T5.h" /*! @brief Interface for interacting with display hardware (TFT, eInk, diff --git a/src/wippersnapper/description/v1/description.pb.c b/src/wippersnapper/description/v1/description.pb.c index a01de88c0..638affe37 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 Aug 19 17:48:25 2025. */ +/* Generated by nanopb-0.4.5-dev at Wed Aug 20 17:46:06 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 9aad63649..9af63f69c 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 Aug 19 17:48:25 2025. */ +/* Generated by nanopb-0.4.5-dev at Wed Aug 20 17:46:06 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 48d44bb8a..9e1339aec 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 Aug 19 17:48:25 2025. */ +/* Generated by nanopb-0.4.5-dev at Wed Aug 20 17:46:06 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 69a0aa023..b72968763 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 Aug 19 17:48:25 2025. */ +/* Generated by nanopb-0.4.5-dev at Wed Aug 20 17:46:06 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 @@ -37,6 +37,7 @@ typedef enum _wippersnapper_display_v1_EPDColors { /* Struct definitions */ typedef struct _wippersnapper_display_v1_DisplayAddedorReplaced { + char name[64]; bool did_add; } wippersnapper_display_v1_DisplayAddedorReplaced; @@ -45,13 +46,12 @@ typedef struct _wippersnapper_display_v1_DisplayRemove { } wippersnapper_display_v1_DisplayRemove; typedef struct _wippersnapper_display_v1_DisplayRemoved { + char name[64]; bool did_remove; } wippersnapper_display_v1_DisplayRemoved; typedef struct _wippersnapper_display_v1_EPDConfig { wippersnapper_display_v1_EPDMode mode; - int32_t width; - int32_t height; } wippersnapper_display_v1_EPDConfig; typedef struct _wippersnapper_display_v1_EPDWriteOptions { @@ -111,29 +111,29 @@ extern "C" { /* Initializer values for message structs */ #define wippersnapper_display_v1_EpdSpiConfig_init_default {0, "", "", "", "", ""} -#define wippersnapper_display_v1_EPDConfig_init_default {_wippersnapper_display_v1_EPDMode_MIN, 0, 0} +#define wippersnapper_display_v1_EPDConfig_init_default {_wippersnapper_display_v1_EPDMode_MIN} #define wippersnapper_display_v1_EPDWriteOptions_init_default {0, _wippersnapper_display_v1_EPDColors_MIN} #define wippersnapper_display_v1_DisplayAddOrReplace_init_default {_wippersnapper_display_v1_DisplayType_MIN, "", 0, {wippersnapper_display_v1_EpdSpiConfig_init_default}, 0, {wippersnapper_display_v1_EPDConfig_init_default}} #define wippersnapper_display_v1_DisplayRemove_init_default {""} #define wippersnapper_display_v1_DisplayWrite_init_default {"", "", 0, {wippersnapper_display_v1_EPDWriteOptions_init_default}} -#define wippersnapper_display_v1_DisplayAddedorReplaced_init_default {0} -#define wippersnapper_display_v1_DisplayRemoved_init_default {0} +#define wippersnapper_display_v1_DisplayAddedorReplaced_init_default {"", 0} +#define wippersnapper_display_v1_DisplayRemoved_init_default {"", 0} #define wippersnapper_display_v1_EpdSpiConfig_init_zero {0, "", "", "", "", ""} -#define wippersnapper_display_v1_EPDConfig_init_zero {_wippersnapper_display_v1_EPDMode_MIN, 0, 0} +#define wippersnapper_display_v1_EPDConfig_init_zero {_wippersnapper_display_v1_EPDMode_MIN} #define wippersnapper_display_v1_EPDWriteOptions_init_zero {0, _wippersnapper_display_v1_EPDColors_MIN} #define wippersnapper_display_v1_DisplayAddOrReplace_init_zero {_wippersnapper_display_v1_DisplayType_MIN, "", 0, {wippersnapper_display_v1_EpdSpiConfig_init_zero}, 0, {wippersnapper_display_v1_EPDConfig_init_zero}} #define wippersnapper_display_v1_DisplayRemove_init_zero {""} #define wippersnapper_display_v1_DisplayWrite_init_zero {"", "", 0, {wippersnapper_display_v1_EPDWriteOptions_init_zero}} -#define wippersnapper_display_v1_DisplayAddedorReplaced_init_zero {0} -#define wippersnapper_display_v1_DisplayRemoved_init_zero {0} +#define wippersnapper_display_v1_DisplayAddedorReplaced_init_zero {"", 0} +#define wippersnapper_display_v1_DisplayRemoved_init_zero {"", 0} /* Field tags (for use in manual encoding/decoding) */ -#define wippersnapper_display_v1_DisplayAddedorReplaced_did_add_tag 1 +#define wippersnapper_display_v1_DisplayAddedorReplaced_name_tag 1 +#define wippersnapper_display_v1_DisplayAddedorReplaced_did_add_tag 2 #define wippersnapper_display_v1_DisplayRemove_name_tag 1 -#define wippersnapper_display_v1_DisplayRemoved_did_remove_tag 1 +#define wippersnapper_display_v1_DisplayRemoved_name_tag 1 +#define wippersnapper_display_v1_DisplayRemoved_did_remove_tag 2 #define wippersnapper_display_v1_EPDConfig_mode_tag 1 -#define wippersnapper_display_v1_EPDConfig_width_tag 2 -#define wippersnapper_display_v1_EPDConfig_height_tag 3 #define wippersnapper_display_v1_EPDWriteOptions_text_size_tag 1 #define wippersnapper_display_v1_EPDWriteOptions_color_tag 2 #define wippersnapper_display_v1_EpdSpiConfig_bus_tag 1 @@ -162,9 +162,7 @@ X(a, STATIC, SINGULAR, STRING, pin_busy, 6) #define wippersnapper_display_v1_EpdSpiConfig_DEFAULT NULL #define wippersnapper_display_v1_EPDConfig_FIELDLIST(X, a) \ -X(a, STATIC, SINGULAR, UENUM, mode, 1) \ -X(a, STATIC, SINGULAR, INT32, width, 2) \ -X(a, STATIC, SINGULAR, INT32, height, 3) +X(a, STATIC, SINGULAR, UENUM, mode, 1) #define wippersnapper_display_v1_EPDConfig_CALLBACK NULL #define wippersnapper_display_v1_EPDConfig_DEFAULT NULL @@ -198,12 +196,14 @@ X(a, STATIC, ONEOF, MESSAGE, (options,epd_options,options.epd_options), #define wippersnapper_display_v1_DisplayWrite_options_epd_options_MSGTYPE wippersnapper_display_v1_EPDWriteOptions #define wippersnapper_display_v1_DisplayAddedorReplaced_FIELDLIST(X, a) \ -X(a, STATIC, SINGULAR, BOOL, did_add, 1) +X(a, STATIC, SINGULAR, STRING, name, 1) \ +X(a, STATIC, SINGULAR, BOOL, did_add, 2) #define wippersnapper_display_v1_DisplayAddedorReplaced_CALLBACK NULL #define wippersnapper_display_v1_DisplayAddedorReplaced_DEFAULT NULL #define wippersnapper_display_v1_DisplayRemoved_FIELDLIST(X, a) \ -X(a, STATIC, SINGULAR, BOOL, did_remove, 1) +X(a, STATIC, SINGULAR, STRING, name, 1) \ +X(a, STATIC, SINGULAR, BOOL, did_remove, 2) #define wippersnapper_display_v1_DisplayRemoved_CALLBACK NULL #define wippersnapper_display_v1_DisplayRemoved_DEFAULT NULL @@ -228,13 +228,13 @@ extern const pb_msgdesc_t wippersnapper_display_v1_DisplayRemoved_msg; /* Maximum encoded size of messages (where known) */ #define wippersnapper_display_v1_EpdSpiConfig_size 46 -#define wippersnapper_display_v1_EPDConfig_size 24 +#define wippersnapper_display_v1_EPDConfig_size 2 #define wippersnapper_display_v1_EPDWriteOptions_size 13 -#define wippersnapper_display_v1_DisplayAddOrReplace_size 141 +#define wippersnapper_display_v1_DisplayAddOrReplace_size 119 #define wippersnapper_display_v1_DisplayRemove_size 65 #define wippersnapper_display_v1_DisplayWrite_size 1106 -#define wippersnapper_display_v1_DisplayAddedorReplaced_size 2 -#define wippersnapper_display_v1_DisplayRemoved_size 2 +#define wippersnapper_display_v1_DisplayAddedorReplaced_size 67 +#define wippersnapper_display_v1_DisplayRemoved_size 67 #ifdef __cplusplus } /* extern "C" */ diff --git a/src/wippersnapper/ds18x20/v1/ds18x20.pb.c b/src/wippersnapper/ds18x20/v1/ds18x20.pb.c index f95f752af..2033a041d 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 Aug 19 17:48:25 2025. */ +/* Generated by nanopb-0.4.5-dev at Wed Aug 20 17:46:06 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 112240f45..ba86dbb96 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 Aug 19 17:48:25 2025. */ +/* Generated by nanopb-0.4.5-dev at Wed Aug 20 17:46:06 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 88153e9d5..80c5b8c7e 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 Aug 19 17:48:25 2025. */ +/* Generated by nanopb-0.4.5-dev at Wed Aug 20 17:46:06 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 5d2523e83..b2718e279 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 Aug 19 17:48:25 2025. */ +/* Generated by nanopb-0.4.5-dev at Wed Aug 20 17:46:06 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 2aee561ac..11ba4661a 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 Aug 19 17:48:25 2025. */ +/* Generated by nanopb-0.4.5-dev at Wed Aug 20 17:46:06 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 5b635d492..28b37e0bb 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 Aug 19 17:48:25 2025. */ +/* Generated by nanopb-0.4.5-dev at Wed Aug 20 17:46:06 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 d6beb4b79..cc1697451 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 Aug 19 17:48:25 2025. */ +/* Generated by nanopb-0.4.5-dev at Wed Aug 20 17:46:06 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 72e885682..8bb1815f4 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 Aug 19 17:48:25 2025. */ +/* Generated by nanopb-0.4.5-dev at Wed Aug 20 17:46:06 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 5649c2dd8..2cf59f201 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 Aug 19 17:48:25 2025. */ +/* Generated by nanopb-0.4.5-dev at Wed Aug 20 17:46:06 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 5b26ce7eb..12713219f 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 Aug 19 17:48:25 2025. */ +/* Generated by nanopb-0.4.5-dev at Wed Aug 20 17:46:06 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 e012bc73f..bc08aa6ba 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 Aug 19 17:48:25 2025. */ +/* Generated by nanopb-0.4.5-dev at Wed Aug 20 17:46:06 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 e285c9957..b9b62fe13 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 Aug 19 17:48:25 2025. */ +/* Generated by nanopb-0.4.5-dev at Wed Aug 20 17:46:06 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 d4c6687bf..67dc1ade0 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 Aug 19 17:48:25 2025. */ +/* Generated by nanopb-0.4.5-dev at Wed Aug 20 17:46:06 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 2a0997d57..77f6843a2 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 Aug 19 17:48:25 2025. */ +/* Generated by nanopb-0.4.5-dev at Wed Aug 20 17:46:06 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 @@ -464,7 +464,7 @@ union wippersnapper_signal_v1_CreateSignalRequest_payload_size_union {char f6[(6 #define wippersnapper_signal_v1_PWMRequest_size 82 #define wippersnapper_signal_v1_PWMResponse_size 11 #define wippersnapper_signal_v1_DisplayRequest_size 1109 -#define wippersnapper_signal_v1_DisplayResponse_size 4 +#define wippersnapper_signal_v1_DisplayResponse_size 69 #ifdef __cplusplus } /* extern "C" */ diff --git a/src/wippersnapper/uart/v1/uart.pb.c b/src/wippersnapper/uart/v1/uart.pb.c index c81b97eee..27928dd4f 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 Aug 19 17:48:25 2025. */ +/* Generated by nanopb-0.4.5-dev at Wed Aug 20 17:46:06 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 4e7fa2a39..867abee65 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 Aug 19 17:48:25 2025. */ +/* Generated by nanopb-0.4.5-dev at Wed Aug 20 17:46:06 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 49cf9cc4bfd17f0a6cb8f7d8cc13c304f2e5917e Mon Sep 17 00:00:00 2001 From: brentru Date: Thu, 21 Aug 2025 10:37:18 -0400 Subject: [PATCH 19/23] Detect SSD1680 automatically --- src/Wippersnapper.cpp | 54 ++++++----- src/components/display/drivers/dispDrvBase.h | 2 +- src/components/display/hardware.cpp | 95 +++++++++++++++++--- src/components/display/hardware.h | 5 +- 4 files changed, 116 insertions(+), 40 deletions(-) diff --git a/src/Wippersnapper.cpp b/src/Wippersnapper.cpp index 57d839b51..8cf7c9b7d 100644 --- a/src/Wippersnapper.cpp +++ b/src/Wippersnapper.cpp @@ -1684,30 +1684,38 @@ bool cbDecodeDisplayMsg(pb_istream_t *stream, const pb_field_t *field, } // Attempt to add or replace a display component - bool did_add = WS._displayController->Handle_Display_AddOrReplace(&msgAddReq); - + bool did_add = + WS._displayController->Handle_Display_AddOrReplace(&msgAddReq); + // Create a DisplayResponse message - wippersnapper_signal_v1_DisplayResponse msgResp = wippersnapper_signal_v1_DisplayResponse_init_zero; - msgResp.which_payload = wippersnapper_signal_v1_DisplayResponse_display_added_tag; + wippersnapper_signal_v1_DisplayResponse msgResp = + wippersnapper_signal_v1_DisplayResponse_init_zero; + msgResp.which_payload = + wippersnapper_signal_v1_DisplayResponse_display_added_tag; msgResp.payload.display_added.did_add = did_add; - strncpy(msgResp.payload.display_added.name, msgAddReq.name, sizeof(msgResp.payload.display_added.name)); + strncpy(msgResp.payload.display_added.name, msgAddReq.name, + sizeof(msgResp.payload.display_added.name)); - // Encode and publish response back to broker - memset(WS._buffer_outgoing, 0, sizeof(WS._buffer_outgoing)); - pb_ostream_t ostream = pb_ostream_from_buffer(WS._buffer_outgoing, sizeof(WS._buffer_outgoing)); - if (!ws_pb_encode(&ostream, wippersnapper_signal_v1_DisplayResponse_fields, &msgResp)) { - WS_DEBUG_PRINTLN("ERROR: Unable to encode display response message!"); - return false; - } + // Encode and publish response back to broker + memset(WS._buffer_outgoing, 0, sizeof(WS._buffer_outgoing)); + pb_ostream_t ostream = pb_ostream_from_buffer(WS._buffer_outgoing, + sizeof(WS._buffer_outgoing)); + if (!ws_pb_encode(&ostream, wippersnapper_signal_v1_DisplayResponse_fields, + &msgResp)) { + WS_DEBUG_PRINTLN("ERROR: Unable to encode display response message!"); + return false; + } - size_t msgSz; - pb_get_encoded_size(&msgSz, wippersnapper_signal_v1_DisplayResponse_fields, &msgResp); - WS_DEBUG_PRINT("Publishing DisplayResponse Message..."); - if (!WS._mqtt->publish(WS._topic_signal_display_device, WS._buffer_outgoing, msgSz, 1)) { - WS_DEBUG_PRINTLN("ERROR: Failed to DisplayResponse Response!"); - } else { - WS_DEBUG_PRINTLN("Published!"); - } + size_t msgSz; + pb_get_encoded_size(&msgSz, wippersnapper_signal_v1_DisplayResponse_fields, + &msgResp); + WS_DEBUG_PRINT("Publishing DisplayResponse Message..."); + if (!WS._mqtt->publish(WS._topic_signal_display_device, WS._buffer_outgoing, + msgSz, 1)) { + WS_DEBUG_PRINTLN("ERROR: Failed to DisplayResponse Response!"); + } else { + WS_DEBUG_PRINTLN("Published!"); + } } else if (field->tag == wippersnapper_signal_v1_DisplayRequest_display_write_tag) { // Decode message into a DisplayAddRequest @@ -1720,12 +1728,12 @@ bool cbDecodeDisplayMsg(pb_istream_t *stream, const pb_field_t *field, } // Attempt to write to a display WS._displayController->Handle_Display_Write(&msgWrite); - } else if (field->tag == wippersnapper_signal_v1_DisplayRequest_display_remove_tag) { + } else if (field->tag == + wippersnapper_signal_v1_DisplayRequest_display_remove_tag) { // Decode message into a DisplayRemoveRequest wippersnapper_display_v1_DisplayRemove msgRemove = wippersnapper_display_v1_DisplayRemove_init_zero; - if (!ws_pb_decode(stream, - wippersnapper_display_v1_DisplayRemove_fields, + if (!ws_pb_decode(stream, wippersnapper_display_v1_DisplayRemove_fields, &msgRemove)) { WS_DEBUG_PRINTLN("ERROR: Failure decoding DisplayRemove message!"); return false; diff --git a/src/components/display/drivers/dispDrvBase.h b/src/components/display/drivers/dispDrvBase.h index 9d50429da..c7d624836 100644 --- a/src/components/display/drivers/dispDrvBase.h +++ b/src/components/display/drivers/dispDrvBase.h @@ -15,8 +15,8 @@ #ifndef WS_DISP_DRV_BASE_H #define WS_DISP_DRV_BASE_H -#include "Wippersnapper.h" #include "Adafruit_ThinkInk.h" +#include "Wippersnapper.h" /*! @brief Abstract base class for display drivers. diff --git a/src/components/display/hardware.cpp b/src/components/display/hardware.cpp index eb34f8b8a..20ca62932 100644 --- a/src/components/display/hardware.cpp +++ b/src/components/display/hardware.cpp @@ -28,25 +28,12 @@ static const std::map FactoryDrvDisp = { int16_t busy) -> dispDrvBase * { return new drvDispThinkInkGrayscale4Eaamfgn(dc, rst, cs, sram_cs, busy); }}, - {"thinkink-magtag-2025", - [](int16_t dc, int16_t rst, int16_t cs, int16_t sram_cs, - int16_t busy) -> dispDrvBase * { - return new drvDispThinkInkGrayscale4Eaamfgn(dc, rst, cs, sram_cs, busy); - }}, {"thinkink-gs4-t5", [](int16_t dc, int16_t rst, int16_t cs, int16_t sram_cs, int16_t busy) -> dispDrvBase * { return new dispDrvThinkInkGrayscale4T5(dc, rst, cs, sram_cs, busy); - }}, - {"thinkink-magtag-pre-2025", - [](int16_t dc, int16_t rst, int16_t cs, int16_t sram_cs, - int16_t busy) -> dispDrvBase * { - return new dispDrvThinkInkGrayscale4T5(dc, rst, cs, sram_cs, busy); - }} - }; + }}}; - - /*! @brief Creates a new display driver instance based on the driver name. @param driver_name @@ -169,6 +156,19 @@ bool DisplayHardware::beginEPD( // TODO: Configure SPI bus selection (UNUSED AS OF RIGHT NOW) + // For "magtag" component name, attempt to autodetect the driver + if (strncmp(_name, "magtag", 6) == 0) { + if (detect_ssd1680(cs, dc, rst)) { + // Detected SSD1680, use EAAMFGN driver + strncpy(_name, "thinkink-gs4-eaamfgn", sizeof(_name) - 1); + _name[sizeof(_name) - 1] = '\0'; + } else { + // Did not detect SSD1680, use T5 driver + strncpy(_name, "thinkink-gs4-t5", sizeof(_name) - 1); + _name[sizeof(_name) - 1] = '\0'; + } + } + // Create display driver object using the factory function _drvDisp = CreateDrvDisp(_name, dc, rst, cs, srcs, busy); if (!_drvDisp) { @@ -210,4 +210,71 @@ void DisplayHardware::writeMessage(const char *message) { } else { WS_DEBUG_PRINTLN("[display] No display driver initialized!"); } +} + +/*! + @brief Detects if an SSD1680 EPD is connected using bit-banged SPI. + @param cs + Chip Select pin number. + @param dc + Data/Command pin number. + @param rst + Reset pin number. + @return True if an SSD1680 is detected, False otherwise (IL0373 or different + EPD). +*/ +bool DisplayHardware::detect_ssd1680(uint8_t cs, uint8_t dc, uint8_t rst) { + // note: for a complete implementation reference, see + // https://github.com/adafruit/circuitpython/commit/f4316cb2491c815b128acca47f1bb75519fe306e + // Configure SPI pins to bit-bang + pinMode(MOSI, OUTPUT); + pinMode(SCK, OUTPUT); + pinMode(cs, OUTPUT); + pinMode(dc, OUTPUT); + pinMode(rst, OUTPUT); + + // Begin transaction by pulling cs and dc LOW + digitalWrite(cs, LOW); + digitalWrite(dc, LOW); + digitalWrite(SCK, LOW); + digitalWrite(rst, HIGH); + + // Write to read register 0x71 + uint8_t cmd = 0x71; + for (int i = 0; i < 8; i++) { + digitalWrite(MOSI, (cmd & (1 << (7 - i))) != 0); + digitalWrite(SCK, HIGH); + digitalWrite(SCK, LOW); + } + + // Set DC high to indicate data and switch MOSI to input with PUR in case + // SSD1680 does not send data back + digitalWrite(dc, HIGH); + delayMicroseconds(1); + pinMode(MOSI, INPUT_PULLUP); + delayMicroseconds(1); + + // Read response from register + uint8_t status = 0; + for (int i = 0; i < 8; i++) { + status <<= 1; + if (digitalRead(MOSI)) { + status |= 1; + } + digitalWrite(SCK, HIGH); + delayMicroseconds(1); + digitalWrite(SCK, LOW); + delayMicroseconds(1); + } + + // End transaction by pulling CS high + digitalWrite(cs, HIGH); + + // Put back MOSI pin as an output + pinMode(MOSI, OUTPUT); + + WS_DEBUG_PRINT("[display] Bitbang read 0x71: 0x"); + WS_DEBUG_PRINTLN(status, HEX); + + return status == 0xFF; } \ No newline at end of file diff --git a/src/components/display/hardware.h b/src/components/display/hardware.h index 00cba9625..f8f5dad61 100644 --- a/src/components/display/hardware.h +++ b/src/components/display/hardware.h @@ -15,11 +15,11 @@ #ifndef WS_DISPLAY_HARDWARE_H #define WS_DISPLAY_HARDWARE_H #include "Wippersnapper.h" -#include -#include #include "drivers/dispDrvBase.h" #include "drivers/dispDrvThinkInkGrayscale4Eaamfgn.h" #include "drivers/dispDrvThinkInkGrayscale4T5.h" +#include +#include /*! @brief Interface for interacting with display hardware (TFT, eInk, @@ -49,6 +49,7 @@ class DisplayHardware { void writeMessage(const char *message); private: + bool detect_ssd1680(uint8_t cs, uint8_t dc, uint8_t rst); char _name[64]; ///< Identifies the hardware instance wippersnapper_display_v1_DisplayType _type; ///< Display type dispDrvBase *_drvDisp = nullptr; ///< Base display driver From 1b9b634465622f03283569acb2dc47681aa1e6ea Mon Sep 17 00:00:00 2001 From: brentru Date: Thu, 21 Aug 2025 11:08:49 -0400 Subject: [PATCH 20/23] bump ver --- library.properties | 2 +- src/Wippersnapper.h | 2 +- src/components/display/controller.cpp | 8 +++----- src/components/display/hardware.cpp | 29 +++++++++++++++++---------- 4 files changed, 23 insertions(+), 18 deletions(-) diff --git a/library.properties b/library.properties index e0e33a29c..5cf33a228 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=Adafruit WipperSnapper -version=1.0.0-beta.111 +version=1.0.0-beta.112 author=Adafruit maintainer=Adafruit sentence=Arduino application for Adafruit.io WipperSnapper diff --git a/src/Wippersnapper.h b/src/Wippersnapper.h index 758e97f2d..a487fc49e 100644 --- a/src/Wippersnapper.h +++ b/src/Wippersnapper.h @@ -151,7 +151,7 @@ #endif #define WS_VERSION \ - "1.0.0-beta.110" ///< WipperSnapper app. version (semver-formatted) + "1.0.0-beta.112" ///< WipperSnapper app. version (semver-formatted) // Reserved Adafruit IO MQTT topics #define TOPIC_IO_THROTTLE "/throttle" ///< Adafruit IO Throttle MQTT Topic diff --git a/src/components/display/controller.cpp b/src/components/display/controller.cpp index ebdef51c4..a5defae9f 100644 --- a/src/components/display/controller.cpp +++ b/src/components/display/controller.cpp @@ -17,9 +17,7 @@ /*! @brief Constructs a new DisplayController object */ -DisplayController::DisplayController() { - // TODO -} +DisplayController::DisplayController() {} /*! @brief Destructor @@ -68,7 +66,7 @@ bool DisplayController::Handle_Display_AddOrReplace( _hw_instances.push_back(display); // Store the display instance WS_DEBUG_PRINTLN("[display] Display added or replaced successfully!"); - return true; // Placeholder + return true; } /*! @@ -109,7 +107,7 @@ bool DisplayController::Handle_Display_Write( } } - // Early-out if display not found + // Early-out if driver instance not found if (!display) { WS_DEBUG_PRINTLN("[display] Failed to write, driver not found!"); return false; diff --git a/src/components/display/hardware.cpp b/src/components/display/hardware.cpp index 20ca62932..13f8248da 100644 --- a/src/components/display/hardware.cpp +++ b/src/components/display/hardware.cpp @@ -119,11 +119,15 @@ bool DisplayHardware::beginEPD( // Validate mode is a correct EPD mode if (config->mode == wippersnapper_display_v1_EPDMode_EPD_MODE_UNSPECIFIED) { WS_DEBUG_PRINTLN("[display] Unsupported EPD mode!"); - return false; // Unsupported mode + return false; } - // TODO: If we already have a display driver assigned to this hardware - // instance, clean it up! + // If we already have a display driver assigned to this hardware instance, + // clean it up! + if (_drvDisp) { + delete _drvDisp; + _drvDisp = nullptr; + } // Parse all SPI bus pins // Check length @@ -154,16 +158,21 @@ bool DisplayHardware::beginEPD( busy = (int16_t)atoi(spi_config->pin_busy + 1); } - // TODO: Configure SPI bus selection (UNUSED AS OF RIGHT NOW) + // Configure SPI bus + if (spi_config->bus != 0) { + WS_DEBUG_PRINTLN( + "[display] ERROR: Non-default SPI buses are currently not supported!"); + return false; + } - // For "magtag" component name, attempt to autodetect the driver + // For "magtag" component name, attempt to autodetect the driver type if (strncmp(_name, "magtag", 6) == 0) { if (detect_ssd1680(cs, dc, rst)) { // Detected SSD1680, use EAAMFGN driver strncpy(_name, "thinkink-gs4-eaamfgn", sizeof(_name) - 1); _name[sizeof(_name) - 1] = '\0'; } else { - // Did not detect SSD1680, use T5 driver + // Did not detect SSD1680, use IL0373 driver strncpy(_name, "thinkink-gs4-t5", sizeof(_name) - 1); _name[sizeof(_name) - 1] = '\0'; } @@ -205,11 +214,9 @@ const char *DisplayHardware::getName() { return _name; } The message to display. */ void DisplayHardware::writeMessage(const char *message) { - if (_drvDisp) { - _drvDisp->writeMessage(message); - } else { - WS_DEBUG_PRINTLN("[display] No display driver initialized!"); - } + if (!_drvDisp) + return; + _drvDisp->writeMessage(message); } /*! From 82476b86591e3946098b4f5adb01132331aad3f0 Mon Sep 17 00:00:00 2001 From: brentru Date: Fri, 22 Aug 2025 11:13:20 -0400 Subject: [PATCH 21/23] Clang format --- src/Wippersnapper.h | 18 +++++------------- src/components/display/controller.cpp | 2 +- src/components/display/controller.h | 1 + .../drivers/dispDrvThinkInkGrayscale4T5.h | 7 ++++--- 4 files changed, 11 insertions(+), 17 deletions(-) diff --git a/src/Wippersnapper.h b/src/Wippersnapper.h index a487fc49e..e7af45ab7 100644 --- a/src/Wippersnapper.h +++ b/src/Wippersnapper.h @@ -47,24 +47,16 @@ // Define actual debug output functions when necessary. #ifdef WS_DEBUG #define WS_DEBUG_PRINT(...) \ - { \ - WS_PRINTER.print(__VA_ARGS__); \ - } ///< Prints debug output. + { WS_PRINTER.print(__VA_ARGS__); } ///< Prints debug output. #define WS_DEBUG_PRINTLN(...) \ - { \ - WS_PRINTER.println(__VA_ARGS__); \ - } ///< Prints line from debug output. + { WS_PRINTER.println(__VA_ARGS__); } ///< Prints line from debug output. #define WS_DEBUG_PRINTHEX(...) \ - { \ - WS_PRINTER.print(__VA_ARGS__, HEX); \ - } ///< Prints debug output. + { WS_PRINTER.print(__VA_ARGS__, HEX); } ///< Prints debug output. #else #define WS_DEBUG_PRINT(...) \ - { \ - } ///< Prints debug output + {} ///< Prints debug output #define WS_DEBUG_PRINTLN(...) \ - { \ - } ///< Prints line from debug output. + {} ///< Prints line from debug output. #endif #define WS_DELAY_WITH_WDT(timeout) \ diff --git a/src/components/display/controller.cpp b/src/components/display/controller.cpp index a5defae9f..476e898fd 100644 --- a/src/components/display/controller.cpp +++ b/src/components/display/controller.cpp @@ -25,7 +25,7 @@ DisplayController::DisplayController() {} DisplayController::~DisplayController() { // Clean up all display hardware instances for (DisplayHardware *hw_instance : _hw_instances) { - delete hw_instance; + delete hw_instance; } _hw_instances.clear(); } diff --git a/src/components/display/controller.h b/src/components/display/controller.h index 6dd3e4c05..f4c087e30 100644 --- a/src/components/display/controller.h +++ b/src/components/display/controller.h @@ -35,6 +35,7 @@ class DisplayController { wippersnapper_display_v1_DisplayAddOrReplace *msgAdd); bool Handle_Display_Remove(wippersnapper_display_v1_DisplayRemove *msgRemove); bool Handle_Display_Write(wippersnapper_display_v1_DisplayWrite *msgWrite); + private: std::vector _hw_instances; ///< Holds pointers to DisplayHardware instances diff --git a/src/components/display/drivers/dispDrvThinkInkGrayscale4T5.h b/src/components/display/drivers/dispDrvThinkInkGrayscale4T5.h index 0320cf1eb..10978f245 100644 --- a/src/components/display/drivers/dispDrvThinkInkGrayscale4T5.h +++ b/src/components/display/drivers/dispDrvThinkInkGrayscale4T5.h @@ -19,7 +19,8 @@ #include "dispDrvBase.h" /*! - @brief Driver for a ThinkInk 2.9" Grayscale 4-level T5 display (pre-2025 version of the Adafruit MagTag). + @brief Driver for a ThinkInk 2.9" Grayscale 4-level T5 display (pre-2025 + version of the Adafruit MagTag). */ class dispDrvThinkInkGrayscale4T5 : public dispDrvBase { public: @@ -38,7 +39,7 @@ class dispDrvThinkInkGrayscale4T5 : public dispDrvBase { Optional Busy pin for the display. */ dispDrvThinkInkGrayscale4T5(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) {} ~dispDrvThinkInkGrayscale4T5() { @@ -59,7 +60,7 @@ class dispDrvThinkInkGrayscale4T5 : public dispDrvBase { */ bool begin(thinkinkmode_t mode, bool reset = true) override { _display = new ThinkInk_290_Grayscale4_T5(_pin_dc, _pin_rst, _pin_cs, - _pin_sram_cs, _pin_busy); + _pin_sram_cs, _pin_busy); if (!_display) return false; // Allocation failed From 3f9d05410e3399a3bb5db1fe9961485090902f80 Mon Sep 17 00:00:00 2001 From: brentru Date: Fri, 22 Aug 2025 11:29:06 -0400 Subject: [PATCH 22/23] doxy2 --- src/components/display/drivers/dispDrvThinkInkGrayscale4T5.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/display/drivers/dispDrvThinkInkGrayscale4T5.h b/src/components/display/drivers/dispDrvThinkInkGrayscale4T5.h index 10978f245..ed266e00b 100644 --- a/src/components/display/drivers/dispDrvThinkInkGrayscale4T5.h +++ b/src/components/display/drivers/dispDrvThinkInkGrayscale4T5.h @@ -1,5 +1,5 @@ /*! - * @file src/components/display/drivers/ThinkInk_290_Grayscale4_T5.h + * @file src/components/display/drivers/dispDrvThinkInkGrayscale4T5.h * * Driver for ThinkInk 2.9" Grayscale 4-level T5 display (present on the * pre-2025 version of the Adafruit MagTag) From 0663d1d1bf5bc0136fb3b169ccbe70390a0be369 Mon Sep 17 00:00:00 2001 From: brentru Date: Fri, 22 Aug 2025 11:41:17 -0400 Subject: [PATCH 23/23] Putback existing Doxyfile --- Doxyfile | 1207 +++++++++++++++++------------------------------------- 1 file changed, 373 insertions(+), 834 deletions(-) diff --git a/Doxyfile b/Doxyfile index 3de8ed0d8..2e9f261f9 100644 --- a/Doxyfile +++ b/Doxyfile @@ -1,7 +1,7 @@ -# Doxyfile 1.14.0 +# Doxyfile 1.9.1 # This file describes the settings to be used by the documentation system -# Doxygen (www.doxygen.org) for a project. +# doxygen (www.doxygen.org) for a project. # # All text after a double hash (##) is considered a comment and is placed in # front of the TAG it is preceding. @@ -12,16 +12,6 @@ # For lists, items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (\" \"). -# -# Note: -# -# Use Doxygen to compare the used configuration file with the template -# configuration file: -# doxygen -x [configFile] -# Use Doxygen to compare the used configuration file with the template -# configuration file without replacing the environment variables or CMake type -# replacement variables: -# doxygen -x_noenv [configFile] #--------------------------------------------------------------------------- # Project related configuration options @@ -51,7 +41,7 @@ PROJECT_NAME = "Adafruit Library" PROJECT_NUMBER = # Using the PROJECT_BRIEF tag one can provide an optional one line description -# for a project that appears at the top of each page and should give viewers a +# for a project that appears at the top of each page and should give viewer a # quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = @@ -63,42 +53,24 @@ PROJECT_BRIEF = PROJECT_LOGO = -# With the PROJECT_ICON tag one can specify an icon that is included in the tabs -# when the HTML document is shown. Doxygen will copy the logo to the output -# directory. - -PROJECT_ICON = - # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # into which the generated documentation will be written. If a relative path is -# entered, it will be relative to the location where Doxygen was started. If +# entered, it will be relative to the location where doxygen was started. If # left blank the current directory will be used. OUTPUT_DIRECTORY = -# If the CREATE_SUBDIRS tag is set to YES then Doxygen will create up to 4096 -# sub-directories (in 2 levels) under the output directory of each output format -# and will distribute the generated files over these directories. Enabling this -# option can be useful when feeding Doxygen a huge amount of source files, where -# putting all generated files in the same directory would otherwise cause -# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to -# control the number of sub-directories. +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. # The default value is: NO. CREATE_SUBDIRS = NO -# Controls the number of sub-directories that will be created when -# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every -# level increment doubles the number of directories, resulting in 4096 -# directories at level 8 which is the default and also the maximum value. The -# sub-directories are organized in 2 levels, the first level always has a fixed -# number of 16 directories. -# Minimum value: 0, maximum value: 8, default value: 8. -# This tag requires that the tag CREATE_SUBDIRS is set to YES. - -CREATE_SUBDIRS_LEVEL = 8 - -# If the ALLOW_UNICODE_NAMES tag is set to YES, Doxygen will allow non-ASCII +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII # characters to appear in the names of generated files. If set to NO, non-ASCII # characters will be escaped, for example _xE3_x81_x84 will be used for Unicode # U+3044. @@ -107,28 +79,28 @@ CREATE_SUBDIRS_LEVEL = 8 ALLOW_UNICODE_NAMES = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by Doxygen is written. Doxygen will use this +# documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. -# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian, -# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English -# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek, -# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with -# English messages), Korean, Korean-en (Korean with English messages), Latvian, -# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, -# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, -# Swedish, Turkish, Ukrainian and Vietnamese. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. # The default value is: English. OUTPUT_LANGUAGE = English -# If the BRIEF_MEMBER_DESC tag is set to YES, Doxygen will include brief member +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member # descriptions after the members that are listed in the file and class # documentation (similar to Javadoc). Set to NO to disable this. # The default value is: YES. BRIEF_MEMBER_DESC = YES -# If the REPEAT_BRIEF tag is set to YES, Doxygen will prepend the brief +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief # description of a member or function before the detailed description # # Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the @@ -159,13 +131,13 @@ ABBREVIATE_BRIEF = "The $name class" \ the # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# Doxygen will generate a detailed section even if there is only a brief +# doxygen will generate a detailed section even if there is only a brief # description. # The default value is: NO. ALWAYS_DETAILED_SEC = NO -# If the INLINE_INHERITED_MEMB tag is set to YES, Doxygen will show all +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. @@ -173,7 +145,7 @@ ALWAYS_DETAILED_SEC = NO INLINE_INHERITED_MEMB = NO -# If the FULL_PATH_NAMES tag is set to YES, Doxygen will prepend the full path +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path # before files name in the file list and in the header files. If set to NO the # shortest path that makes the file name unique will be used # The default value is: YES. @@ -183,11 +155,11 @@ FULL_PATH_NAMES = YES # The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. # Stripping is only done if one of the specified strings matches the left-hand # part of the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which Doxygen is run is used as the path to +# If left blank the directory from which doxygen is run is used as the path to # strip. # # Note that you can specify absolute paths here, but also relative paths, which -# will be relative from the directory where Doxygen is started. +# will be relative from the directory where doxygen is started. # This tag requires that the tag FULL_PATH_NAMES is set to YES. STRIP_FROM_PATH = @@ -201,42 +173,31 @@ STRIP_FROM_PATH = STRIP_FROM_INC_PATH = -# If the SHORT_NAMES tag is set to YES, Doxygen will generate much shorter (but -# less readable) file names. This can be useful if your file system doesn't +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't # support long names like on DOS, Mac, or CD-ROM. # The default value is: NO. SHORT_NAMES = NO -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen will interpret the -# first line (until the first dot, question mark or exclamation mark) of a -# Javadoc-style comment as the brief description. If set to NO, the Javadoc- -# style will behave just like regular Qt-style comments (thus requiring an -# explicit @brief command for a brief description.) +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) # The default value is: NO. JAVADOC_AUTOBRIEF = NO -# If the JAVADOC_BANNER tag is set to YES then Doxygen will interpret a line -# such as -# /*************** -# as being the beginning of a Javadoc-style comment "banner". If set to NO, the -# Javadoc-style will behave just like regular comments and it will not be -# interpreted by Doxygen. -# The default value is: NO. - -JAVADOC_BANNER = NO - -# If the QT_AUTOBRIEF tag is set to YES then Doxygen will interpret the first -# line (until the first dot, question mark or exclamation mark) of a Qt-style -# comment as the brief description. If set to NO, the Qt-style will behave just -# like regular Qt-style comments (thus requiring an explicit \brief command for -# a brief description.) +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) # The default value is: NO. QT_AUTOBRIEF = NO -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen treat a +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a # multi-line C++ special comment block (i.e. a block of //! or /// comments) as # a brief description. This used to be the default behavior. The new default is # to treat a multi-line C++ comment block as a detailed description. Set this @@ -248,21 +209,13 @@ QT_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO -# By default Python docstrings are displayed as preformatted text and Doxygen's -# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the -# Doxygen's special commands can be used and the contents of the docstring -# documentation blocks is shown as Doxygen documentation. -# The default value is: YES. - -PYTHON_DOCSTRING = YES - # If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the # documentation from any documented member that it re-implements. # The default value is: YES. INHERIT_DOCS = YES -# If the SEPARATE_MEMBER_PAGES tag is set to YES then Doxygen will produce a new +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new # page for each member. If set to NO, the documentation of a member will be part # of the file/class/namespace that contains it. # The default value is: NO. @@ -279,16 +232,16 @@ TAB_SIZE = 4 # the documentation. An alias has the form: # name=value # For example adding -# "sideeffect=@par Side Effects:^^" +# "sideeffect=@par Side Effects:\n" # will allow you to put the command \sideeffect (or @sideeffect) in the # documentation, which will result in a user-defined paragraph with heading -# "Side Effects:". Note that you cannot put \n's in the value part of an alias -# to insert newlines (in the resulting output). You can put ^^ in the value part -# of an alias to insert a newline as if a physical newline was in the original -# file. When you need a literal { or } or , in the value part of an alias you -# have to escape them by means of a backslash (\), this can lead to conflicts -# with the commands \{ and \} for these it is advised to use the version @{ and -# @} or use a double escape (\\{ and \\}) +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines (in the resulting output). You can put ^^ in the value part of an +# alias to insert a newline as if a physical newline was in the original file. +# When you need a literal { or } or , in the value part of an alias you have to +# escape them by means of a backslash (\), this can lead to conflicts with the +# commands \{ and \} for these it is advised to use the version @{ and @} or use +# a double escape (\\{ and \\}) ALIASES = @@ -320,42 +273,34 @@ OPTIMIZE_FOR_FORTRAN = NO OPTIMIZE_OUTPUT_VHDL = NO -# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice -# sources only. Doxygen will then generate output that is more tailored for that -# language. For instance, namespaces will be presented as modules, types will be -# separated into more groups, etc. -# The default value is: NO. - -OPTIMIZE_OUTPUT_SLICE = NO - # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, and -# language is one of the parsers supported by Doxygen: IDL, Java, JavaScript, -# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice, -# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: +# language is one of the parsers supported by doxygen: IDL, Java, JavaScript, +# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, VHDL, +# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: # FortranFree, unknown formatted Fortran: Fortran. In the later case the parser # tries to guess whether the code is fixed or free formatted code, this is the -# default for Fortran type files). For instance to make Doxygen treat .inc files +# default for Fortran type files). For instance to make doxygen treat .inc files # as Fortran files (default is PHP), and .f files as C (default is Fortran), # use: inc=Fortran f=C. # # Note: For files without extension you can use no_extension as a placeholder. # # Note that for custom extensions you also need to set FILE_PATTERNS otherwise -# the files are not read by Doxygen. When specifying no_extension you should add +# the files are not read by doxygen. When specifying no_extension you should add # * to the FILE_PATTERNS. # # Note see also the list of default file extension mappings. EXTENSION_MAPPING = -# If the MARKDOWN_SUPPORT tag is enabled then Doxygen pre-processes all comments +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments # according to the Markdown format, which allows for more readable # documentation. See https://daringfireball.net/projects/markdown/ for details. -# The output of markdown processing is further processed by Doxygen, so you can -# mix Doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in # case of backward compatibilities issues. # The default value is: YES. @@ -365,45 +310,25 @@ MARKDOWN_SUPPORT = YES # to that level are automatically included in the table of contents, even if # they do not have an id attribute. # Note: This feature currently applies only to Markdown headings. -# Minimum value: 0, maximum value: 99, default value: 6. +# Minimum value: 0, maximum value: 99, default value: 5. # This tag requires that the tag MARKDOWN_SUPPORT is set to YES. TOC_INCLUDE_HEADINGS = 0 -# The MARKDOWN_ID_STYLE tag can be used to specify the algorithm used to -# generate identifiers for the Markdown headings. Note: Every identifier is -# unique. -# Possible values are: DOXYGEN use a fixed 'autotoc_md' string followed by a -# sequence number starting at 0 and GITHUB use the lower case version of title -# with any whitespace replaced by '-' and punctuation characters removed. -# The default value is: DOXYGEN. -# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. - -MARKDOWN_ID_STYLE = DOXYGEN - -# When enabled Doxygen tries to link words that correspond to documented +# When enabled doxygen tries to link words that correspond to documented # classes, or namespaces to their corresponding documentation. Such a link can # be prevented in individual cases by putting a % sign in front of the word or -# globally by setting AUTOLINK_SUPPORT to NO. Words listed in the -# AUTOLINK_IGNORE_WORDS tag are excluded from automatic linking. +# globally by setting AUTOLINK_SUPPORT to NO. # The default value is: YES. AUTOLINK_SUPPORT = YES -# This tag specifies a list of words that, when matching the start of a word in -# the documentation, will suppress auto links generation, if it is enabled via -# AUTOLINK_SUPPORT. This list does not affect links explicitly created using \# -# or the \link or commands. -# This tag requires that the tag AUTOLINK_SUPPORT is set to YES. - -AUTOLINK_IGNORE_WORDS = - # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should set this -# tag to YES in order to let Doxygen match functions declarations and +# tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); -# versus func(std::string) {}). This also makes the inheritance and -# collaboration diagrams that involve STL classes more complete and accurate. +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. # The default value is: NO. BUILTIN_STL_SUPPORT = NO @@ -415,16 +340,16 @@ BUILTIN_STL_SUPPORT = NO CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip (see: -# https://www.riverbankcomputing.com/software) sources only. Doxygen will parse -# them like normal C++ but will assume all classes use public instead of private -# inheritance when no explicit protection keyword is present. +# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. # The default value is: NO. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate # getter and setter methods for a property. Setting this option to YES will make -# Doxygen to replace the get and set methods by a property in the documentation. +# doxygen to replace the get and set methods by a property in the documentation. # This will only work if the methods are indeed getting or setting a simple # type. If this is not the case, or you want to show the methods anyway, you # should set this option to NO. @@ -433,7 +358,7 @@ SIP_SUPPORT = NO IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES then Doxygen will reuse the documentation of the first +# tag is set to YES then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. # The default value is: NO. @@ -491,42 +416,21 @@ TYPEDEF_HIDES_STRUCT = NO # The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This # cache is used to resolve symbols given their name and scope. Since this can be # an expensive process and often the same symbol appears multiple times in the -# code, Doxygen keeps a cache of pre-resolved symbols. If the cache is too small -# Doxygen will become slower. If the cache is too large, memory is wasted. The +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The # cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range # is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 -# symbols. At the end of a run Doxygen will report the cache usage and suggest +# symbols. At the end of a run doxygen will report the cache usage and suggest # the optimal cache size from a speed point of view. # Minimum value: 0, maximum value: 9, default value: 0. LOOKUP_CACHE_SIZE = 0 -# The NUM_PROC_THREADS specifies the number of threads Doxygen is allowed to use -# during processing. When set to 0 Doxygen will based this on the number of -# cores available in the system. You can set it explicitly to a value larger -# than 0 to get more control over the balance between CPU load and processing -# speed. At this moment only the input processing can be done using multiple -# threads. Since this is still an experimental feature the default is set to 1, -# which effectively disables parallel processing. Please report any issues you -# encounter. Generating dot graphs in parallel is controlled by the -# DOT_NUM_THREADS setting. -# Minimum value: 0, maximum value: 32, default value: 1. - -NUM_PROC_THREADS = 1 - -# If the TIMESTAMP tag is set different from NO then each generated page will -# contain the date or date and time when the page was generated. Setting this to -# NO can help when comparing the output of multiple runs. -# Possible values are: YES, NO, DATETIME and DATE. -# The default value is: NO. - -TIMESTAMP = NO - #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- -# If the EXTRACT_ALL tag is set to YES, Doxygen will assume all entities in +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in # documentation are documented, even if no documentation was available. Private # class members and static file members will be hidden unless the # EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. @@ -542,12 +446,6 @@ EXTRACT_ALL = NO EXTRACT_PRIVATE = NO -# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual -# methods of a class will be included in the documentation. -# The default value is: NO. - -EXTRACT_PRIV_VIRTUAL = NO - # If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal # scope will be included in the documentation. # The default value is: NO. @@ -585,14 +483,7 @@ EXTRACT_LOCAL_METHODS = NO EXTRACT_ANON_NSPACES = NO -# If this flag is set to YES, the name of an unnamed parameter in a declaration -# will be determined by the corresponding definition. By default unnamed -# parameters remain unnamed in the output. -# The default value is: YES. - -RESOLVE_UNNAMED_PARAMS = YES - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all # undocumented members inside documented classes or files. If set to NO these # members will be included in the various overviews, but no documentation # section is generated. This option has no effect if EXTRACT_ALL is enabled. @@ -600,31 +491,22 @@ RESOLVE_UNNAMED_PARAMS = YES HIDE_UNDOC_MEMBERS = NO -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. If set # to NO, these classes will be included in the various overviews. This option -# will also hide undocumented C++ concepts if enabled. This option has no effect -# if EXTRACT_ALL is enabled. +# has no effect if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_CLASSES = NO -# If the HIDE_UNDOC_NAMESPACES tag is set to YES, Doxygen will hide all -# undocumented namespaces that are normally visible in the namespace hierarchy. -# If set to NO, these namespaces will be included in the various overviews. This -# option has no effect if EXTRACT_ALL is enabled. -# The default value is: YES. - -HIDE_UNDOC_NAMESPACES = YES - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all friend +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend # declarations. If set to NO, these declarations will be included in the # documentation. # The default value is: NO. HIDE_FRIEND_COMPOUNDS = NO -# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any # documentation blocks found inside the body of a function. If set to NO, these # blocks will be appended to the function's detailed documentation block. # The default value is: NO. @@ -638,44 +520,37 @@ HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO -# With the correct setting of option CASE_SENSE_NAMES Doxygen will better be +# With the correct setting of option CASE_SENSE_NAMES doxygen will better be # able to match the capabilities of the underlying filesystem. In case the # filesystem is case sensitive (i.e. it supports files in the same directory # whose names only differ in casing), the option must be set to YES to properly # deal with such files in case they appear in the input. For filesystems that -# are not case sensitive the option should be set to NO to properly deal with +# are not case sensitive the option should be be set to NO to properly deal with # output files written for symbols that only differ in casing, such as for two # classes, one named CLASS and the other named Class, and to also support # references to files without having to specify the exact matching casing. On -# Windows (including Cygwin) and macOS, users should typically set this option +# Windows (including Cygwin) and MacOS, users should typically set this option # to NO, whereas on Linux or other Unix flavors it should typically be set to # YES. -# Possible values are: SYSTEM, NO and YES. -# The default value is: SYSTEM. +# The default value is: system dependent. CASE_SENSE_NAMES = NO -# If the HIDE_SCOPE_NAMES tag is set to NO then Doxygen will show members with +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with # their full class and namespace scopes in the documentation. If set to YES, the # scope will be hidden. # The default value is: NO. HIDE_SCOPE_NAMES = NO -# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then Doxygen will +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will # append additional text to a page's title, such as Class Reference. If set to # YES the compound reference will be hidden. # The default value is: NO. HIDE_COMPOUND_REFERENCE= NO -# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class -# will show which file needs to be included to use the class. -# The default value is: YES. - -SHOW_HEADERFILE = YES - -# If the SHOW_INCLUDE_FILES tag is set to YES then Doxygen will put a list of +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of # the files that are included by a file in the documentation of that file. # The default value is: YES. @@ -688,7 +563,7 @@ SHOW_INCLUDE_FILES = YES SHOW_GROUPED_MEMB_INC = NO -# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen will list include +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include # files with double quotes in the documentation rather than with sharp brackets. # The default value is: NO. @@ -700,14 +575,14 @@ FORCE_LOCAL_INCLUDES = NO INLINE_INFO = YES -# If the SORT_MEMBER_DOCS tag is set to YES then Doxygen will sort the +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the # (detailed) documentation of file and class members alphabetically by member # name. If set to NO, the members will appear in declaration order. # The default value is: YES. SORT_MEMBER_DOCS = NO -# If the SORT_BRIEF_DOCS tag is set to YES then Doxygen will sort the brief +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief # descriptions of file, namespace and class members alphabetically by member # name. If set to NO, the members will appear in declaration order. Note that # this will also influence the order of the classes in the class list. @@ -715,7 +590,7 @@ SORT_MEMBER_DOCS = NO SORT_BRIEF_DOCS = NO -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then Doxygen will sort the +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the # (brief and detailed) documentation of class members so that constructors and # destructors are listed first. If set to NO the constructors will appear in the # respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. @@ -727,7 +602,7 @@ SORT_BRIEF_DOCS = NO SORT_MEMBERS_CTORS_1ST = NO -# If the SORT_GROUP_NAMES tag is set to YES then Doxygen will sort the hierarchy +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy # of group names into alphabetical order. If set to NO the group names will # appear in their defined order. # The default value is: NO. @@ -744,11 +619,11 @@ SORT_GROUP_NAMES = NO SORT_BY_SCOPE_NAME = NO -# If the STRICT_PROTO_MATCHING option is enabled and Doxygen fails to do proper +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper # type resolution of all parameters of a function it will reject a match between # the prototype and the implementation of a member function even if there is # only one candidate or it is obvious which candidate to choose by doing a -# simple string match. By disabling STRICT_PROTO_MATCHING Doxygen will still +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still # accept a match between prototype and implementation in such cases. # The default value is: NO. @@ -818,25 +693,24 @@ SHOW_FILES = YES SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that -# Doxygen should invoke to get the current version for each file (typically from +# doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command command input-file, where command is the value of the # FILE_VERSION_FILTER tag, and input-file is the name of an input file provided -# by Doxygen. Whatever the program writes to standard output is used as the file +# by doxygen. Whatever the program writes to standard output is used as the file # version. For an example see the documentation. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed -# by Doxygen. The layout file controls the global structure of the generated +# by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. To create the layout file -# that represents Doxygen's defaults, run Doxygen with the -l option. You can +# that represents doxygen's defaults, run doxygen with the -l option. You can # optionally specify a file name after the option, if omitted DoxygenLayout.xml -# will be used as the name of the layout file. See also section "Changing the -# layout of pages" for information. +# will be used as the name of the layout file. # -# Note that if you run Doxygen from a directory containing a file called -# DoxygenLayout.xml, Doxygen will parse it automatically even if the LAYOUT_FILE +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE # tag is left empty. LAYOUT_FILE = @@ -851,35 +725,19 @@ LAYOUT_FILE = CITE_BIB_FILES = -# The EXTERNAL_TOOL_PATH tag can be used to extend the search path (PATH -# environment variable) so that external tools such as latex and gs can be -# found. -# Note: Directories specified with EXTERNAL_TOOL_PATH are added in front of the -# path already specified by the PATH variable, and are added in the order -# specified. -# Note: This option is particularly useful for macOS version 14 (Sonoma) and -# higher, when running Doxygen from Doxywizard, because in this case any user- -# defined changes to the PATH are ignored. A typical example on macOS is to set -# EXTERNAL_TOOL_PATH = /Library/TeX/texbin /usr/local/bin -# together with the standard path, the full search path used by doxygen when -# launching external tools will then become -# PATH=/Library/TeX/texbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin - -EXTERNAL_TOOL_PATH = - #--------------------------------------------------------------------------- # Configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated to -# standard output by Doxygen. If QUIET is set to YES this implies that the +# standard output by doxygen. If QUIET is set to YES this implies that the # messages are off. # The default value is: NO. QUIET = YES # The WARNINGS tag can be used to turn on/off the warning messages that are -# generated to standard error (stderr) by Doxygen. If WARNINGS is set to YES +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES # this implies that the warnings are on. # # Tip: Turn warnings on while writing the documentation. @@ -887,97 +745,52 @@ QUIET = YES WARNINGS = YES -# If the WARN_IF_UNDOCUMENTED tag is set to YES then Doxygen will generate +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate # warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag # will automatically be disabled. # The default value is: YES. WARN_IF_UNDOCUMENTED = YES -# If the WARN_IF_DOC_ERROR tag is set to YES, Doxygen will generate warnings for -# potential errors in the documentation, such as documenting some parameters in -# a documented function twice, or documenting parameters that don't exist or -# using markup commands wrongly. +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. # The default value is: YES. WARN_IF_DOC_ERROR = YES -# If WARN_IF_INCOMPLETE_DOC is set to YES, Doxygen will warn about incomplete -# function parameter documentation. If set to NO, Doxygen will accept that some -# parameters have no documentation without warning. -# The default value is: YES. - -WARN_IF_INCOMPLETE_DOC = YES - # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # are documented, but have no documentation for their parameters or return -# value. If set to NO, Doxygen will only warn about wrong parameter -# documentation, but not about the absence of documentation. If EXTRACT_ALL is -# set to YES then this flag will automatically be disabled. See also -# WARN_IF_INCOMPLETE_DOC +# value. If set to NO, doxygen will only warn about wrong or incomplete +# parameter documentation, but not about the absence of documentation. If +# EXTRACT_ALL is set to YES then this flag will automatically be disabled. # The default value is: NO. WARN_NO_PARAMDOC = YES -# If WARN_IF_UNDOC_ENUM_VAL option is set to YES, Doxygen will warn about -# undocumented enumeration values. If set to NO, Doxygen will accept -# undocumented enumeration values. If EXTRACT_ALL is set to YES then this flag -# will automatically be disabled. -# The default value is: NO. - -WARN_IF_UNDOC_ENUM_VAL = NO - -# If WARN_LAYOUT_FILE option is set to YES, Doxygen will warn about issues found -# while parsing the user defined layout file, such as missing or wrong elements. -# See also LAYOUT_FILE for details. If set to NO, problems with the layout file -# will be suppressed. -# The default value is: YES. - -WARN_LAYOUT_FILE = YES - -# If the WARN_AS_ERROR tag is set to YES then Doxygen will immediately stop when +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when # a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS -# then Doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but -# at the end of the Doxygen process Doxygen will return with a non-zero status. -# If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS_PRINT then Doxygen behaves -# like FAIL_ON_WARNINGS but in case no WARN_LOGFILE is defined Doxygen will not -# write the warning messages in between other messages but write them at the end -# of a run, in case a WARN_LOGFILE is defined the warning messages will be -# besides being in the defined file also be shown at the end of a run, unless -# the WARN_LOGFILE is defined as - i.e. standard output (stdout) in that case -# the behavior will remain as with the setting FAIL_ON_WARNINGS. -# Possible values are: NO, YES, FAIL_ON_WARNINGS and FAIL_ON_WARNINGS_PRINT. +# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but +# at the end of the doxygen process doxygen will return with a non-zero status. +# Possible values are: NO, YES and FAIL_ON_WARNINGS. # The default value is: NO. WARN_AS_ERROR = NO -# The WARN_FORMAT tag determines the format of the warning messages that Doxygen +# The WARN_FORMAT tag determines the format of the warning messages that doxygen # can produce. The string should contain the $file, $line, and $text tags, which # will be replaced by the file and line number from which the warning originated # and the warning text. Optionally the format may contain $version, which will # be replaced by the version of the file (if it could be obtained via # FILE_VERSION_FILTER) -# See also: WARN_LINE_FORMAT # The default value is: $file:$line: $text. WARN_FORMAT = "$file:$line: $text" -# In the $text part of the WARN_FORMAT command it is possible that a reference -# to a more specific place is given. To make it easier to jump to this place -# (outside of Doxygen) the user can define a custom "cut" / "paste" string. -# Example: -# WARN_LINE_FORMAT = "'vi $file +$line'" -# See also: WARN_FORMAT -# The default value is: at line $line of file $file. - -WARN_LINE_FORMAT = "at line $line of file $file" - # The WARN_LOGFILE tag can be used to specify a file to which warning and error # messages should be written. If left blank the output is written to standard -# error (stderr). In case the file specified cannot be opened for writing the -# warning and error messages are written to standard error. When as file - is -# specified the warning and error messages are written to standard output -# (stdout). +# error (stderr). WARN_LOGFILE = @@ -994,42 +807,31 @@ WARN_LOGFILE = INPUT = # This tag can be used to specify the character encoding of the source files -# that Doxygen parses. Internally Doxygen uses the UTF-8 encoding. Doxygen uses +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses # libiconv (or the iconv built into libc) for the transcoding. See the libiconv # documentation (see: # https://www.gnu.org/software/libiconv/) for the list of possible encodings. -# See also: INPUT_FILE_ENCODING # The default value is: UTF-8. INPUT_ENCODING = UTF-8 -# This tag can be used to specify the character encoding of the source files -# that Doxygen parses. The INPUT_FILE_ENCODING tag can be used to specify -# character encoding on a per file pattern basis. Doxygen will compare the file -# name with each pattern and apply the encoding instead of the default -# INPUT_ENCODING if there is a match. The character encodings are a list of the -# form: pattern=encoding (like *.php=ISO-8859-1). -# See also: INPUT_ENCODING for further information on supported encodings. - -INPUT_FILE_ENCODING = - # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and # *.h) to filter out the source-files in the directories. # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not -# read by Doxygen. +# read by doxygen. # # Note the list of default checked file patterns might differ from the list of # default file extension mappings. # -# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cxxm, -# *.cpp, *.cppm, *.ccm, *.c++, *.c++m, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, -# *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, -# *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be -# provided as Doxygen C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, -# *.f18, *.f, *.for, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice. +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, +# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, +# *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment), +# *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, *.vhdl, +# *.ucf, *.qsf and *.ice. FILE_PATTERNS = *.c \ *.cc \ @@ -1052,7 +854,7 @@ RECURSIVE = YES # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. # -# Note that relative paths are relative to the directory from which Doxygen is +# Note that relative paths are relative to the directory from which doxygen is # run. EXCLUDE = EXCLUDE \ @@ -1083,7 +885,10 @@ EXCLUDE_PATTERNS = *.md # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, -# ANamespace::AClass, ANamespace::*Test +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* EXCLUDE_SYMBOLS = @@ -1113,7 +918,7 @@ EXAMPLE_RECURSIVE = NO IMAGE_PATH = -# The INPUT_FILTER tag can be used to specify a program that Doxygen should +# The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command: # @@ -1128,14 +933,9 @@ IMAGE_PATH = # code is scanned, but not when the output code is generated. If lines are added # or removed, the anchors will not be placed correctly. # -# Note that Doxygen will use the data processed and written to standard output -# for further processing, therefore nothing else, like debug statements or used -# commands (so in case of a Windows batch file always use @echo OFF), should be -# written to standard output. -# # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not -# properly processed by Doxygen. +# properly processed by doxygen. INPUT_FILTER = @@ -1148,7 +948,7 @@ INPUT_FILTER = # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not -# properly processed by Doxygen. +# properly processed by doxygen. FILTER_PATTERNS = @@ -1170,28 +970,10 @@ FILTER_SOURCE_PATTERNS = # If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that # is part of the input, its contents will be placed on the main page # (index.html). This can be useful if you have a project on for instance GitHub -# and want to reuse the introduction page also for the Doxygen output. +# and want to reuse the introduction page also for the doxygen output. USE_MDFILE_AS_MAINPAGE = -# If the IMPLICIT_DIR_DOCS tag is set to YES, any README.md file found in sub- -# directories of the project's root, is used as the documentation for that sub- -# directory, except when the README.md starts with a \dir, \page or \mainpage -# command. If set to NO, the README.md file needs to start with an explicit \dir -# command in order to be used as directory documentation. -# The default value is: YES. - -IMPLICIT_DIR_DOCS = YES - -# The Fortran standard specifies that for fixed formatted Fortran code all -# characters from position 72 are to be considered as comment. A common -# extension is to allow longer lines before the automatic comment starts. The -# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can -# be processed before the automatic comment starts. -# Minimum value: 7, maximum value: 10000, default value: 72. - -FORTRAN_COMMENT_AFTER = 72 - #--------------------------------------------------------------------------- # Configuration options related to source browsing #--------------------------------------------------------------------------- @@ -1206,13 +988,12 @@ FORTRAN_COMMENT_AFTER = 72 SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body of functions, -# multi-line macros, enums or list initialized variables directly into the -# documentation. +# classes and enums directly into the documentation. # The default value is: NO. INLINE_SOURCES = NO -# Setting the STRIP_CODE_COMMENTS tag to YES will instruct Doxygen to hide any +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any # special comment blocks from generated source code fragments. Normal C, C++ and # Fortran comments will always remain visible. # The default value is: YES. @@ -1250,7 +1031,7 @@ REFERENCES_LINK_SOURCE = YES SOURCE_TOOLTIPS = YES # If the USE_HTAGS tag is set to YES then the references to source code will -# point to the HTML generated by the htags(1) tool instead of Doxygen built-in +# point to the HTML generated by the htags(1) tool instead of doxygen built-in # source browser. The htags tool is part of GNU's global source tagging system # (see https://www.gnu.org/software/global/global.html). You will need version # 4.8.6 or higher. @@ -1264,14 +1045,14 @@ SOURCE_TOOLTIPS = YES # Doxygen will invoke htags (and that will in turn invoke gtags), so these # tools must be available from the command line (i.e. in the search path). # -# The result: instead of the source browser generated by Doxygen, the links to +# The result: instead of the source browser generated by doxygen, the links to # source code will now point to the output of htags. # The default value is: NO. # This tag requires that the tag SOURCE_BROWSER is set to YES. USE_HTAGS = NO -# If the VERBATIM_HEADERS tag is set the YES then Doxygen will generate a +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a # verbatim copy of the header file for each class for which an include is # specified. Set to NO to disable this. # See also: Section \class. @@ -1290,11 +1071,10 @@ VERBATIM_HEADERS = YES ALPHABETICAL_INDEX = YES -# The IGNORE_PREFIX tag can be used to specify a prefix (or a list of prefixes) -# that should be ignored while generating the index headers. The IGNORE_PREFIX -# tag works for classes, function and member names. The entity will be placed in -# the alphabetical list under the first letter of the entity name that remains -# after removing the prefix. +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. IGNORE_PREFIX = @@ -1303,7 +1083,7 @@ IGNORE_PREFIX = # Configuration options related to the HTML output #--------------------------------------------------------------------------- -# If the GENERATE_HTML tag is set to YES, Doxygen will generate HTML output +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output # The default value is: YES. GENERATE_HTML = YES @@ -1324,40 +1104,40 @@ HTML_OUTPUT = html HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a user-defined HTML header file for -# each generated HTML page. If the tag is left blank Doxygen will generate a +# each generated HTML page. If the tag is left blank doxygen will generate a # standard header. # # To get valid HTML the header file that includes any scripts and style sheets -# that Doxygen needs, which is dependent on the configuration options used (e.g. +# that doxygen needs, which is dependent on the configuration options used (e.g. # the setting GENERATE_TREEVIEW). It is highly recommended to start with a # default header using # doxygen -w html new_header.html new_footer.html new_stylesheet.css # YourConfigFile # and then modify the file new_header.html. See also section "Doxygen usage" -# for information on how to generate the default header that Doxygen normally +# for information on how to generate the default header that doxygen normally # uses. # Note: The header is subject to change so you typically have to regenerate the -# default header when upgrading to a newer version of Doxygen. For a description +# default header when upgrading to a newer version of doxygen. For a description # of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each -# generated HTML page. If the tag is left blank Doxygen will generate a standard +# generated HTML page. If the tag is left blank doxygen will generate a standard # footer. See HTML_HEADER for more information on how to generate a default # footer and what special commands can be used inside the footer. See also # section "Doxygen usage" for information on how to generate the default footer -# that Doxygen normally uses. +# that doxygen normally uses. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading style # sheet that is used by each HTML page. It can be used to fine-tune the look of -# the HTML output. If left blank Doxygen will generate a default style sheet. +# the HTML output. If left blank doxygen will generate a default style sheet. # See also section "Doxygen usage" for information on how to generate the style -# sheet that Doxygen normally uses. +# sheet that doxygen normally uses. # Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as # it is more robust and this tag (HTML_STYLESHEET) will in the future become # obsolete. @@ -1367,18 +1147,13 @@ HTML_STYLESHEET = # The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined # cascading style sheets that are included after the standard style sheets -# created by Doxygen. Using this option one can overrule certain style aspects. +# created by doxygen. Using this option one can overrule certain style aspects. # This is preferred over using HTML_STYLESHEET since it does not replace the # standard style sheet and is therefore more robust against future updates. # Doxygen will copy the style sheet files to the output directory. # Note: The order of the extra style sheet files is of importance (e.g. the last # style sheet in the list overrules the setting of the previous ones in the -# list). -# Note: Since the styling of scrollbars can currently not be overruled in -# Webkit/Chromium, the styling will be left out of the default doxygen.css if -# one or more extra stylesheets have been specified. So if scrollbar -# customization is desired it has to be added explicitly. For an example see the -# documentation. +# list). For an example see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_STYLESHEET = @@ -1393,22 +1168,9 @@ HTML_EXTRA_STYLESHEET = HTML_EXTRA_FILES = -# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output -# should be rendered with a dark or light theme. -# Possible values are: LIGHT always generates light mode output, DARK always -# generates dark mode output, AUTO_LIGHT automatically sets the mode according -# to the user preference, uses light mode if no preference is set (the default), -# AUTO_DARK automatically sets the mode according to the user preference, uses -# dark mode if no preference is set and TOGGLE allows a user to switch between -# light and dark mode via a button. -# The default value is: AUTO_LIGHT. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COLORSTYLE = AUTO_LIGHT - # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the style sheet and background images according to -# this color. Hue is specified as an angle on a color-wheel, see +# this color. Hue is specified as an angle on a colorwheel, see # https://en.wikipedia.org/wiki/Hue for more information. For instance the value # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 # purple, and 360 is red again. @@ -1418,7 +1180,7 @@ HTML_COLORSTYLE = AUTO_LIGHT HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors -# in the HTML output. For a value of 0 the output will use gray-scales only. A +# in the HTML output. For a value of 0 the output will use grayscales only. A # value of 255 will produce the most vivid colors. # Minimum value: 0, maximum value: 255, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. @@ -1436,16 +1198,14 @@ HTML_COLORSTYLE_SAT = 100 HTML_COLORSTYLE_GAMMA = 80 -# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML -# documentation will contain a main index with vertical navigation menus that -# are dynamically created via JavaScript. If disabled, the navigation index will -# consists of multiple levels of tabs that are statically embedded in every HTML -# page. Disable this option to support browsers that do not have JavaScript, -# like the Qt help browser. -# The default value is: YES. +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_DYNAMIC_MENUS = YES +HTML_TIMESTAMP = NO # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the @@ -1455,33 +1215,6 @@ HTML_DYNAMIC_MENUS = YES HTML_DYNAMIC_SECTIONS = NO -# If the HTML_CODE_FOLDING tag is set to YES then classes and functions can be -# dynamically folded and expanded in the generated HTML source code. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_CODE_FOLDING = YES - -# If the HTML_COPY_CLIPBOARD tag is set to YES then Doxygen will show an icon in -# the top right corner of code and text fragments that allows the user to copy -# its content to the clipboard. Note this only works if supported by the browser -# and the web page is served via a secure context (see: -# https://www.w3.org/TR/secure-contexts/), i.e. using the https: or file: -# protocol. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_COPY_CLIPBOARD = YES - -# Doxygen stores a couple of settings persistently in the browser (via e.g. -# cookies). By default these settings apply to all HTML pages generated by -# Doxygen across all projects. The HTML_PROJECT_COOKIE tag can be used to store -# the settings under a project specific key, such that the user preferences will -# be stored separately. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_PROJECT_COOKIE = - # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries # shown in the various tree structured indices initially; the user can expand # and collapse entries dynamically later on. Doxygen will expand the tree to @@ -1499,7 +1232,7 @@ HTML_INDEX_NUM_ENTRIES = 100 # generated that can be used as input for Apple's Xcode 3 integrated development # environment (see: # https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To -# create a documentation set, Doxygen will generate a Makefile in the HTML +# create a documentation set, doxygen will generate a Makefile in the HTML # output directory. Running make will produce the docset in that directory and # running make install will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at @@ -1518,13 +1251,6 @@ GENERATE_DOCSET = NO DOCSET_FEEDNAME = "Doxygen generated docs" -# This tag determines the URL of the docset feed. A documentation feed provides -# an umbrella under which multiple documentation sets from a single provider -# (such as a company or product suite) can be grouped. -# This tag requires that the tag GENERATE_DOCSET is set to YES. - -DOCSET_FEEDURL = - # This tag specifies a string that should uniquely identify the documentation # set bundle. This should be a reverse domain-name style string, e.g. # com.mycompany.MyDocSet. Doxygen will append .docset to the name. @@ -1547,18 +1273,14 @@ DOCSET_PUBLISHER_ID = org.doxygen.Publisher DOCSET_PUBLISHER_NAME = Publisher -# If the GENERATE_HTMLHELP tag is set to YES then Doxygen generates three +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three # additional HTML index files: index.hhp, index.hhc, and index.hhk. The # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop -# on Windows. In the beginning of 2021 Microsoft took the original page, with -# a.o. the download links, offline (the HTML help workshop was already many -# years in maintenance mode). You can download the HTML help workshop from the -# web archives at Installation executable (see: -# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo -# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe). +# (see: +# https://www.microsoft.com/en-us/download/details.aspx?id=21138) on Windows. # # The HTML Help Workshop contains a compiler that can convert all HTML output -# generated by Doxygen into a single compiled HTML file (.chm). Compiled HTML +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML # files are now used as the Windows 98 help format, and will replace the old # Windows help format (.hlp) on all Windows platforms in the future. Compressed # HTML files also contain an index, a table of contents, and you can search for @@ -1578,7 +1300,7 @@ CHM_FILE = # The HHC_LOCATION tag can be used to specify the location (absolute path # including file name) of the HTML help compiler (hhc.exe). If non-empty, -# Doxygen will try to run the HTML help compiler on the generated index.hhp. +# doxygen will try to run the HTML help compiler on the generated index.hhp. # The file has to be specified with full path. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. @@ -1612,16 +1334,6 @@ BINARY_TOC = NO TOC_EXPAND = NO -# The SITEMAP_URL tag is used to specify the full URL of the place where the -# generated documentation will be placed on the server by the user during the -# deployment of the documentation. The generated sitemap is called sitemap.xml -# and placed on the directory specified by HTML_OUTPUT. In case no SITEMAP_URL -# is specified no sitemap is generated. For information about the sitemap -# protocol see https://www.sitemaps.org -# This tag requires that the tag GENERATE_HTML is set to YES. - -SITEMAP_URL = - # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that # can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help @@ -1680,7 +1392,7 @@ QHP_CUST_FILTER_ATTRS = QHP_SECT_FILTER_ATTRS = # The QHG_LOCATION tag can be used to specify the location (absolute path -# including file name) of Qt's qhelpgenerator. If non-empty Doxygen will try to +# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to # run qhelpgenerator on the generated .qhp file. # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1724,39 +1436,18 @@ DISABLE_INDEX = NO # to work a browser that supports JavaScript, DHTML, CSS and frames is required # (i.e. any modern browser). Windows users are probably better off using the # HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can -# further fine tune the look of the index (see "Fine-tuning the output"). As an -# example, the default style sheet generated by Doxygen has an example that -# shows how to put an image at the root of the tree instead of the PROJECT_NAME. -# Since the tree basically has more details information than the tab index, you -# could consider setting DISABLE_INDEX to YES when enabling this option. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -GENERATE_TREEVIEW = NO - -# When GENERATE_TREEVIEW is set to YES, the PAGE_OUTLINE_PANEL option determines -# if an additional navigation panel is shown at the right hand side of the -# screen, displaying an outline of the contents of the main page, similar to -# e.g. https://developer.android.com/reference If GENERATE_TREEVIEW is set to -# NO, this option has no effect. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -PAGE_OUTLINE_PANEL = YES - -# When GENERATE_TREEVIEW is set to YES, the FULL_SIDEBAR option determines if -# the side bar is limited to only the treeview area (value NO) or if it should -# extend to the full height of the window (value YES). Setting this to YES gives -# a layout similar to e.g. https://docs.readthedocs.io with more room for -# contents, but less room for the project logo, title, and description. If -# GENERATE_TREEVIEW is set to NO, this option has no effect. +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. -FULL_SIDEBAR = NO +GENERATE_TREEVIEW = NO # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that -# Doxygen will group on one line in the generated HTML documentation. +# doxygen will group on one line in the generated HTML documentation. # # Note that a value of 0 will completely suppress the enum values from appearing # in the overview section. @@ -1765,12 +1456,6 @@ FULL_SIDEBAR = NO ENUM_VALUES_PER_LINE = 4 -# When the SHOW_ENUM_VALUES tag is set doxygen will show the specified -# enumeration values besides the enumeration mnemonics. -# The default value is: NO. - -SHOW_ENUM_VALUES = NO - # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used # to set the initial width (in pixels) of the frame in which the tree is shown. # Minimum value: 0, maximum value: 1500, default value: 250. @@ -1778,45 +1463,32 @@ SHOW_ENUM_VALUES = NO TREEVIEW_WIDTH = 250 -# If the EXT_LINKS_IN_WINDOW option is set to YES, Doxygen will open links to +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to # external symbols imported via tag files in a separate window. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. EXT_LINKS_IN_WINDOW = NO -# If the OBFUSCATE_EMAILS tag is set to YES, Doxygen will obfuscate email -# addresses. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -OBFUSCATE_EMAILS = YES - -# If the HTML_FORMULA_FORMAT option is set to svg, Doxygen will use the pdf2svg -# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see -# https://inkscape.org) to generate formulas as SVG images instead of PNGs for -# the HTML output. These images will generally look nicer at scaled resolutions. -# Possible values are: png (the default) and svg (looks nicer but requires the -# pdf2svg or inkscape tool). -# The default value is: png. -# This tag requires that the tag GENERATE_HTML is set to YES. - -HTML_FORMULA_FORMAT = png - # Use this tag to change the font size of LaTeX formulas included as images in # the HTML documentation. When you change the font size after a successful -# Doxygen run you need to manually remove any form_*.png images from the HTML +# doxygen run you need to manually remove any form_*.png images from the HTML # output directory to force them to be regenerated. # Minimum value: 8, maximum value: 50, default value: 10. # This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_FONTSIZE = 10 -# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands -# to create new LaTeX commands to be used in formulas as building blocks. See -# the section "Including formulas" for details. +# Use the FORMULA_TRANSPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. -FORMULA_MACROFILE = +FORMULA_TRANSPARENT = YES # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see # https://www.mathjax.org) which uses client side JavaScript for the rendering @@ -1829,29 +1501,11 @@ FORMULA_MACROFILE = USE_MATHJAX = NO -# With MATHJAX_VERSION it is possible to specify the MathJax version to be used. -# Note that the different versions of MathJax have different requirements with -# regards to the different settings, so it is possible that also other MathJax -# settings have to be changed when switching between the different MathJax -# versions. -# Possible values are: MathJax_2 and MathJax_3. -# The default value is: MathJax_2. -# This tag requires that the tag USE_MATHJAX is set to YES. - -MATHJAX_VERSION = MathJax_2 - # When MathJax is enabled you can set the default output format to be used for -# the MathJax output. For more details about the output format see MathJax -# version 2 (see: -# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3 -# (see: -# http://docs.mathjax.org/en/latest/web/components/output.html). +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. # Possible values are: HTML-CSS (which is slower, but has the best -# compatibility. This is the name for Mathjax version 2, for MathJax version 3 -# this will be translated into chtml), NativeMML (i.e. MathML. Only supported -# for MathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This -# is the name for Mathjax version 3, for MathJax version 2 this will be -# translated into HTML-CSS) and SVG. +# compatibility), NativeMML (i.e. MathML) and SVG. # The default value is: HTML-CSS. # This tag requires that the tag USE_MATHJAX is set to YES. @@ -1864,26 +1518,20 @@ MATHJAX_FORMAT = HTML-CSS # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax # Content Delivery Network so you can quickly see the result without installing # MathJax. However, it is strongly recommended to install a local copy of -# MathJax from https://www.mathjax.org before deployment. The default value is: -# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2 -# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3 +# MathJax from https://www.mathjax.org before deployment. +# The default value is: https://cdn.jsdelivr.net/npm/mathjax@2. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example -# for MathJax version 2 (see -# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions): # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols -# For example for MathJax version 3 (see -# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html): -# MATHJAX_EXTENSIONS = ams # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_EXTENSIONS = -# The MATHJAX_CODEFILE tag can be used to specify a file with JavaScript pieces +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces # of code that will be used on startup of the MathJax code. See the MathJax site # (see: # http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an @@ -1892,12 +1540,12 @@ MATHJAX_EXTENSIONS = MATHJAX_CODEFILE = -# When the SEARCHENGINE tag is enabled Doxygen will generate a search box for -# the HTML output. The underlying search engine uses JavaScript and DHTML and +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and # should work on any modern browser. Note that when using HTML help # (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) # there is already a search function so this one should typically be disabled. -# For large projects the JavaScript based search engine can be slow, then +# For large projects the javascript based search engine can be slow, then # enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to # search using the keyboard; to jump to the search box use + S # (what the is depends on the OS and browser, but it is typically @@ -1916,7 +1564,7 @@ SEARCHENGINE = YES # When the SERVER_BASED_SEARCH tag is enabled the search engine will be # implemented using a web server instead of a web client using JavaScript. There # are two flavors of web server based searching depending on the EXTERNAL_SEARCH -# setting. When disabled, Doxygen will generate a PHP script for searching and +# setting. When disabled, doxygen will generate a PHP script for searching and # an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing # and searching needs to be provided by external tools. See the section # "External Indexing and Searching" for details. @@ -1925,7 +1573,7 @@ SEARCHENGINE = YES SERVER_BASED_SEARCH = NO -# When EXTERNAL_SEARCH tag is enabled Doxygen will no longer generate the PHP +# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP # script for searching. Instead the search results are written to an XML file # which needs to be processed by an external indexer. Doxygen will invoke an # external search engine pointed to by the SEARCHENGINE_URL option to obtain the @@ -1970,7 +1618,7 @@ SEARCHDATA_FILE = searchdata.xml EXTERNAL_SEARCH_ID = -# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through Doxygen +# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen # projects other than the one defined by this configuration file, but that are # all added to the same external search index. Each project needs to have a # unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of @@ -1984,7 +1632,7 @@ EXTRA_SEARCH_MAPPINGS = # Configuration options related to the LaTeX output #--------------------------------------------------------------------------- -# If the GENERATE_LATEX tag is set to YES, Doxygen will generate LaTeX output. +# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output. # The default value is: YES. GENERATE_LATEX = NO @@ -2019,17 +1667,7 @@ LATEX_CMD_NAME = latex MAKEINDEX_CMD_NAME = makeindex -# The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to -# generate index for LaTeX. In case there is no backslash (\) as first character -# it will be automatically added in the LaTeX code. -# Note: This tag is used in the generated output file (.tex). -# See also: MAKEINDEX_CMD_NAME for the part in the Makefile / make.bat. -# The default value is: makeindex. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_MAKEINDEX_CMD = makeindex - -# If the COMPACT_LATEX tag is set to YES, Doxygen generates more compact LaTeX +# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX # documents. This may be useful for small projects and may help to save some # trees in general. # The default value is: NO. @@ -2058,38 +1696,36 @@ PAPER_TYPE = a4 EXTRA_PACKAGES = -# The LATEX_HEADER tag can be used to specify a user-defined LaTeX header for -# the generated LaTeX document. The header should contain everything until the -# first chapter. If it is left blank Doxygen will generate a standard header. It -# is highly recommended to start with a default header using -# doxygen -w latex new_header.tex new_footer.tex new_stylesheet.sty -# and then modify the file new_header.tex. See also section "Doxygen usage" for -# information on how to generate the default header that Doxygen normally uses. +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the +# generated LaTeX document. The header should contain everything until the first +# chapter. If it is left blank doxygen will generate a standard header. See +# section "Doxygen usage" for information on how to let doxygen write the +# default header to a separate file. # -# Note: Only use a user-defined header if you know what you are doing! -# Note: The header is subject to change so you typically have to regenerate the -# default header when upgrading to a newer version of Doxygen. The following -# commands have a special meaning inside the header (and footer): For a -# description of the possible markers and block names see the documentation. +# Note: Only use a user-defined header if you know what you are doing! The +# following commands have a special meaning inside the header: $title, +# $datetime, $date, $doxygenversion, $projectname, $projectnumber, +# $projectbrief, $projectlogo. Doxygen will replace $title with the empty +# string, for the replacement values of the other commands the user is referred +# to HTML_HEADER. # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_HEADER = -# The LATEX_FOOTER tag can be used to specify a user-defined LaTeX footer for -# the generated LaTeX document. The footer should contain everything after the -# last chapter. If it is left blank Doxygen will generate a standard footer. See +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the +# generated LaTeX document. The footer should contain everything after the last +# chapter. If it is left blank doxygen will generate a standard footer. See # LATEX_HEADER for more information on how to generate a default footer and what -# special commands can be used inside the footer. See also section "Doxygen -# usage" for information on how to generate the default footer that Doxygen -# normally uses. Note: Only use a user-defined footer if you know what you are -# doing! +# special commands can be used inside the footer. +# +# Note: Only use a user-defined footer if you know what you are doing! # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_FOOTER = # The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined # LaTeX style sheets that are included after the standard style sheets created -# by Doxygen. Using this option one can overrule certain style aspects. Doxygen +# by doxygen. Using this option one can overrule certain style aspects. Doxygen # will copy the style sheet files to the output directory. # Note: The order of the extra style sheet files is of importance (e.g. the last # style sheet in the list overrules the setting of the previous ones in the @@ -2115,7 +1751,7 @@ LATEX_EXTRA_FILES = PDF_HYPERLINKS = YES -# If the USE_PDFLATEX tag is set to YES, Doxygen will use the engine as +# If the USE_PDFLATEX tag is set to YES, doxygen will use the engine as # specified with LATEX_CMD_NAME to generate the PDF file directly from the LaTeX # files. Set this option to YES, to get a higher quality PDF documentation. # @@ -2125,49 +1761,53 @@ PDF_HYPERLINKS = YES USE_PDFLATEX = YES -# The LATEX_BATCHMODE tag signals the behavior of LaTeX in case of an error. -# Possible values are: NO same as ERROR_STOP, YES same as BATCH, BATCH In batch -# mode nothing is printed on the terminal, errors are scrolled as if is -# hit at every error; missing files that TeX tries to input or request from -# keyboard input (\read on a not open input stream) cause the job to abort, -# NON_STOP In nonstop mode the diagnostic message will appear on the terminal, -# but there is no possibility of user interaction just like in batch mode, -# SCROLL In scroll mode, TeX will stop only for missing files to input or if -# keyboard input is necessary and ERROR_STOP In errorstop mode, TeX will stop at -# each error, asking for user intervention. +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode +# command to the generated LaTeX files. This will instruct LaTeX to keep running +# if errors occur, instead of asking the user for help. This option is also used +# when generating formulas in HTML. # The default value is: NO. # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_BATCHMODE = NO -# If the LATEX_HIDE_INDICES tag is set to YES then Doxygen will not include the +# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the # index chapters (such as File Index, Compound Index, etc.) in the output. # The default value is: NO. # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_HIDE_INDICES = NO +# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source +# code with syntax highlighting in the LaTeX output. +# +# Note that which sources are shown also depends on other settings such as +# SOURCE_BROWSER. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_SOURCE_CODE = NO + # The LATEX_BIB_STYLE tag can be used to specify the style to use for the # bibliography, e.g. plainnat, or ieeetr. See # https://en.wikipedia.org/wiki/BibTeX and \cite for more info. -# The default value is: plainnat. +# The default value is: plain. # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_BIB_STYLE = plain -# The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute) -# path from which the emoji images will be read. If a relative path is entered, -# it will be relative to the LATEX_OUTPUT directory. If left blank the -# LATEX_OUTPUT directory will be used. +# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated +# page will contain the date and time when the page was generated. Setting this +# to NO can help when comparing the output of multiple runs. +# The default value is: NO. # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_EMOJI_DIRECTORY = +LATEX_TIMESTAMP = NO #--------------------------------------------------------------------------- # Configuration options related to the RTF output #--------------------------------------------------------------------------- -# If the GENERATE_RTF tag is set to YES, Doxygen will generate RTF output. The +# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The # RTF output is optimized for Word 97 and may not look too pretty with other RTF # readers/editors. # The default value is: NO. @@ -2182,7 +1822,7 @@ GENERATE_RTF = NO RTF_OUTPUT = rtf -# If the COMPACT_RTF tag is set to YES, Doxygen generates more compact RTF +# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF # documents. This may be useful for small projects and may help to save some # trees in general. # The default value is: NO. @@ -2202,36 +1842,38 @@ COMPACT_RTF = NO RTF_HYPERLINKS = NO -# Load stylesheet definitions from file. Syntax is similar to Doxygen's +# Load stylesheet definitions from file. Syntax is similar to doxygen's # configuration file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. # # See also section "Doxygen usage" for information on how to generate the -# default style sheet that Doxygen normally uses. +# default style sheet that doxygen normally uses. # This tag requires that the tag GENERATE_RTF is set to YES. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an RTF document. Syntax is -# similar to Doxygen's configuration file. A template extensions file can be +# similar to doxygen's configuration file. A template extensions file can be # generated using doxygen -e rtf extensionFile. # This tag requires that the tag GENERATE_RTF is set to YES. RTF_EXTENSIONS_FILE = -# The RTF_EXTRA_FILES tag can be used to specify one or more extra images or -# other source files which should be copied to the RTF_OUTPUT output directory. -# Note that the files will be copied as-is; there are no commands or markers -# available. +# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code +# with syntax highlighting in the RTF output. +# +# Note that which sources are shown also depends on other settings such as +# SOURCE_BROWSER. +# The default value is: NO. # This tag requires that the tag GENERATE_RTF is set to YES. -RTF_EXTRA_FILES = +RTF_SOURCE_CODE = NO #--------------------------------------------------------------------------- # Configuration options related to the man page output #--------------------------------------------------------------------------- -# If the GENERATE_MAN tag is set to YES, Doxygen will generate man pages for +# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for # classes and files. # The default value is: NO. @@ -2262,7 +1904,7 @@ MAN_EXTENSION = .3 MAN_SUBDIR = -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, then it +# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it # will generate one additional man file for each entity documented in the real # man page(s). These additional files only source the real man page, but without # them the man command would be unable to find the correct page. @@ -2275,7 +1917,7 @@ MAN_LINKS = NO # Configuration options related to the XML output #--------------------------------------------------------------------------- -# If the GENERATE_XML tag is set to YES, Doxygen will generate an XML file that +# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that # captures the structure of the code including all documentation. # The default value is: NO. @@ -2289,7 +1931,7 @@ GENERATE_XML = NO XML_OUTPUT = xml -# If the XML_PROGRAMLISTING tag is set to YES, Doxygen will dump the program +# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program # listings (including syntax highlighting and cross-referencing information) to # the XML output. Note that enabling this will significantly increase the size # of the XML output. @@ -2298,18 +1940,11 @@ XML_OUTPUT = xml XML_PROGRAMLISTING = YES -# If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, Doxygen will include -# namespace members in file scope as well, matching the HTML output. -# The default value is: NO. -# This tag requires that the tag GENERATE_XML is set to YES. - -XML_NS_MEMB_FILE_SCOPE = NO - #--------------------------------------------------------------------------- # Configuration options related to the DOCBOOK output #--------------------------------------------------------------------------- -# If the GENERATE_DOCBOOK tag is set to YES, Doxygen will generate Docbook files +# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files # that can be used to generate PDF. # The default value is: NO. @@ -2323,49 +1958,32 @@ GENERATE_DOCBOOK = NO DOCBOOK_OUTPUT = docbook +# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the +# program listings (including syntax highlighting and cross-referencing +# information) to the DOCBOOK output. Note that enabling this will significantly +# increase the size of the DOCBOOK output. +# The default value is: NO. +# This tag requires that the tag GENERATE_DOCBOOK is set to YES. + +DOCBOOK_PROGRAMLISTING = NO + #--------------------------------------------------------------------------- # Configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- -# If the GENERATE_AUTOGEN_DEF tag is set to YES, Doxygen will generate an -# AutoGen Definitions (see https://autogen.sourceforge.net/) file that captures +# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an +# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures # the structure of the code including all documentation. Note that this feature # is still experimental and incomplete at the moment. # The default value is: NO. GENERATE_AUTOGEN_DEF = NO -#--------------------------------------------------------------------------- -# Configuration options related to Sqlite3 output -#--------------------------------------------------------------------------- - -# If the GENERATE_SQLITE3 tag is set to YES Doxygen will generate a Sqlite3 -# database with symbols found by Doxygen stored in tables. -# The default value is: NO. - -GENERATE_SQLITE3 = NO - -# The SQLITE3_OUTPUT tag is used to specify where the Sqlite3 database will be -# put. If a relative path is entered the value of OUTPUT_DIRECTORY will be put -# in front of it. -# The default directory is: sqlite3. -# This tag requires that the tag GENERATE_SQLITE3 is set to YES. - -SQLITE3_OUTPUT = sqlite3 - -# The SQLITE3_RECREATE_DB tag is set to YES, the existing doxygen_sqlite3.db -# database file will be recreated with each Doxygen run. If set to NO, Doxygen -# will warn if a database file is already found and not modify it. -# The default value is: YES. -# This tag requires that the tag GENERATE_SQLITE3 is set to YES. - -SQLITE3_RECREATE_DB = YES - #--------------------------------------------------------------------------- # Configuration options related to the Perl module output #--------------------------------------------------------------------------- -# If the GENERATE_PERLMOD tag is set to YES, Doxygen will generate a Perl module +# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module # file that captures the structure of the code including all documentation. # # Note that this feature is still experimental and incomplete at the moment. @@ -2373,7 +1991,7 @@ SQLITE3_RECREATE_DB = YES GENERATE_PERLMOD = NO -# If the PERLMOD_LATEX tag is set to YES, Doxygen will generate the necessary +# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary # Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI # output from the Perl module output. # The default value is: NO. @@ -2403,13 +2021,13 @@ PERLMOD_MAKEVAR_PREFIX = # Configuration options related to the preprocessor #--------------------------------------------------------------------------- -# If the ENABLE_PREPROCESSING tag is set to YES, Doxygen will evaluate all +# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all # C-preprocessor directives found in the sources and include files. # The default value is: YES. ENABLE_PREPROCESSING = YES -# If the MACRO_EXPANSION tag is set to YES, Doxygen will expand all macro names +# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names # in the source code. If set to NO, only conditional compilation will be # performed. Macro expansion can be done in a controlled way by setting # EXPAND_ONLY_PREDEF to YES. @@ -2435,8 +2053,7 @@ SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by the -# preprocessor. Note that the INCLUDE_PATH is not recursive, so the setting of -# RECURSIVE has no effect here. +# preprocessor. # This tag requires that the tag SEARCH_INCLUDES is set to YES. INCLUDE_PATH = @@ -2457,9 +2074,7 @@ INCLUDE_FILE_PATTERNS = # recursively expanded use the := operator instead of the = operator. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -PREDEFINED = "__cdecl=," \ - "ARDUINO_ARCH_ESP32=1," \ - ARDUINO_FUNHOUSE_ESP32S2=1 +PREDEFINED = __cdecl=, ARDUINO_ARCH_ESP32=1, ARDUINO_FUNHOUSE_ESP32S2=1 # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this # tag can be used to specify a list of macro names that should be expanded. The @@ -2470,7 +2085,7 @@ PREDEFINED = "__cdecl=," \ EXPAND_AS_DEFINED = -# If the SKIP_FUNCTION_MACROS tag is set to YES then Doxygen's preprocessor will +# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will # remove all references to function-like macros that are alone on a line, have # an all uppercase name, and do not end with a semicolon. Such function macros # are typically used for boiler-plate code, and will confuse the parser if not @@ -2494,26 +2109,26 @@ SKIP_FUNCTION_MACROS = YES # section "Linking to external documentation" for more information about the use # of tag files. # Note: Each tag file must have a unique name (where the name does NOT include -# the path). If a tag file is not located in the directory in which Doxygen is +# the path). If a tag file is not located in the directory in which doxygen is # run, you must also specify the path to the tagfile here. TAGFILES = -# When a file name is specified after GENERATE_TAGFILE, Doxygen will create a +# When a file name is specified after GENERATE_TAGFILE, doxygen will create a # tag file that is based on the input files it reads. See section "Linking to # external documentation" for more information about the usage of tag files. GENERATE_TAGFILE = -# If the ALLEXTERNALS tag is set to YES, all external classes and namespaces -# will be listed in the class and namespace index. If set to NO, only the -# inherited external classes will be listed. +# If the ALLEXTERNALS tag is set to YES, all external class will be listed in +# the class index. If set to NO, only the inherited external classes will be +# listed. # The default value is: NO. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed -# in the topic index. If set to NO, only the current project's groups will be +# in the modules index. If set to NO, only the current project's groups will be # listed. # The default value is: YES. @@ -2527,26 +2142,42 @@ EXTERNAL_GROUPS = YES EXTERNAL_PAGES = YES #--------------------------------------------------------------------------- -# Configuration options related to diagram generator tools +# Configuration options related to the dot tool #--------------------------------------------------------------------------- +# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram +# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to +# NO turns the diagrams off. Note that this option also works with HAVE_DOT +# disabled, but it is recommended to install and use dot, since it yields more +# powerful graphs. +# The default value is: YES. + +CLASS_DIAGRAMS = YES + +# You can include diagrams made with dia in doxygen documentation. Doxygen will +# then run dia to produce the diagram and insert it in the documentation. The +# DIA_PATH tag allows you to specify the directory where the dia binary resides. +# If left empty dia is assumed to be found in the default search path. + +DIA_PATH = + # If set to YES the inheritance and collaboration graphs will hide inheritance # and usage relations if the target is undocumented or is not a class. # The default value is: YES. HIDE_UNDOC_RELATIONS = YES -# If you set the HAVE_DOT tag to YES then Doxygen will assume the dot tool is +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz (see: -# https://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent +# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent # Bell Labs. The other options in this section have no effect if this option is # set to NO # The default value is: NO. HAVE_DOT = NO -# The DOT_NUM_THREADS specifies the number of dot invocations Doxygen is allowed -# to run in parallel. When set to 0 Doxygen will base this on the number of +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed +# to run in parallel. When set to 0 doxygen will base this on the number of # processors available in the system. You can set it explicitly to a value # larger than 0 to get control over the balance between CPU load and processing # speed. @@ -2555,83 +2186,55 @@ HAVE_DOT = NO DOT_NUM_THREADS = 0 -# DOT_COMMON_ATTR is common attributes for nodes, edges and labels of -# subgraphs. When you want a differently looking font in the dot files that -# Doxygen generates you can specify fontname, fontcolor and fontsize attributes. -# For details please see Node, -# Edge and Graph Attributes specification You need to make sure dot is able -# to find the font, which can be done by putting it in a standard location or by -# setting the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the -# directory containing the font. Default graphviz fontsize is 14. -# The default value is: fontname=Helvetica,fontsize=10. +# When you want a differently looking font in the dot files that doxygen +# generates you can specify the font name using DOT_FONTNAME. You need to make +# sure dot is able to find the font, which can be done by putting it in a +# standard location or by setting the DOTFONTPATH environment variable or by +# setting DOT_FONTPATH to the directory containing the font. +# The default value is: Helvetica. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_COMMON_ATTR = "fontname=Helvetica,fontsize=10" +DOT_FONTNAME = Helvetica -# DOT_EDGE_ATTR is concatenated with DOT_COMMON_ATTR. For elegant style you can -# add 'arrowhead=open, arrowtail=open, arrowsize=0.5'. Complete documentation about -# arrows shapes. -# The default value is: labelfontname=Helvetica,labelfontsize=10. +# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of +# dot graphs. +# Minimum value: 4, maximum value: 24, default value: 10. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_EDGE_ATTR = "labelfontname=Helvetica,labelfontsize=10" +DOT_FONTSIZE = 10 -# DOT_NODE_ATTR is concatenated with DOT_COMMON_ATTR. For view without boxes -# around nodes set 'shape=plain' or 'shape=plaintext' Shapes specification -# The default value is: shape=box,height=0.2,width=0.4. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_NODE_ATTR = "shape=box,height=0.2,width=0.4" - -# You can set the path where dot can find font specified with fontname in -# DOT_COMMON_ATTR and others dot attributes. +# By default doxygen will tell dot to use the default font as specified with +# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set +# the path where dot can find it using this tag. # This tag requires that the tag HAVE_DOT is set to YES. DOT_FONTPATH = -# If the CLASS_GRAPH tag is set to YES or GRAPH or BUILTIN then Doxygen will -# generate a graph for each documented class showing the direct and indirect -# inheritance relations. In case the CLASS_GRAPH tag is set to YES or GRAPH and -# HAVE_DOT is enabled as well, then dot will be used to draw the graph. In case -# the CLASS_GRAPH tag is set to YES and HAVE_DOT is disabled or if the -# CLASS_GRAPH tag is set to BUILTIN, then the built-in generator will be used. -# If the CLASS_GRAPH tag is set to TEXT the direct and indirect inheritance -# relations will be shown as texts / links. Explicit enabling an inheritance -# graph or choosing a different representation for an inheritance graph of a -# specific class, can be accomplished by means of the command \inheritancegraph. -# Disabling an inheritance graph can be accomplished by means of the command -# \hideinheritancegraph. -# Possible values are: NO, YES, TEXT, GRAPH and BUILTIN. +# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for +# each documented class showing the direct and indirect inheritance relations. +# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO. # The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. CLASS_GRAPH = YES -# If the COLLABORATION_GRAPH tag is set to YES then Doxygen will generate a +# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a # graph for each documented class showing the direct and indirect implementation # dependencies (inheritance, containment, and class references variables) of the -# class with other documented classes. Explicit enabling a collaboration graph, -# when COLLABORATION_GRAPH is set to NO, can be accomplished by means of the -# command \collaborationgraph. Disabling a collaboration graph can be -# accomplished by means of the command \hidecollaborationgraph. +# class with other documented classes. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. COLLABORATION_GRAPH = YES -# If the GROUP_GRAPHS tag is set to YES then Doxygen will generate a graph for -# groups, showing the direct groups dependencies. Explicit enabling a group -# dependency graph, when GROUP_GRAPHS is set to NO, can be accomplished by means -# of the command \groupgraph. Disabling a directory graph can be accomplished by -# means of the command \hidegroupgraph. See also the chapter Grouping in the -# manual. +# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for +# groups, showing the direct groups dependencies. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. GROUP_GRAPHS = YES -# If the UML_LOOK tag is set to YES, Doxygen will generate inheritance and +# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. # The default value is: NO. @@ -2652,37 +2255,6 @@ UML_LOOK = NO UML_LIMIT_NUM_FIELDS = 10 -# If the UML_LOOK tag is enabled, field labels are shown along the edge between -# two class nodes. If there are many fields and many nodes the graph may become -# too cluttered. The UML_MAX_EDGE_LABELS threshold limits the number of items to -# make the size more manageable. Set this to 0 for no limit. -# Minimum value: 0, maximum value: 100, default value: 10. -# This tag requires that the tag UML_LOOK is set to YES. - -UML_MAX_EDGE_LABELS = 10 - -# If the DOT_UML_DETAILS tag is set to NO, Doxygen will show attributes and -# methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS -# tag is set to YES, Doxygen will add type and arguments for attributes and -# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, Doxygen -# will not generate fields with class member information in the UML graphs. The -# class diagrams will look similar to the default class diagrams but using UML -# notation for the relationships. -# Possible values are: NO, YES and NONE. -# The default value is: NO. -# This tag requires that the tag UML_LOOK is set to YES. - -DOT_UML_DETAILS = NO - -# The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters -# to display on a single line. If the actual line length exceeds this threshold -# significantly it will be wrapped across multiple lines. Some heuristics are -# applied to avoid ugly line breaks. -# Minimum value: 0, maximum value: 1000, default value: 17. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_WRAP_THRESHOLD = 17 - # If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and # collaboration graphs will show the relations between templates and their # instances. @@ -2692,29 +2264,24 @@ DOT_WRAP_THRESHOLD = 17 TEMPLATE_RELATIONS = NO # If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to -# YES then Doxygen will generate a graph for each documented file showing the +# YES then doxygen will generate a graph for each documented file showing the # direct and indirect include dependencies of the file with other documented -# files. Explicit enabling an include graph, when INCLUDE_GRAPH is is set to NO, -# can be accomplished by means of the command \includegraph. Disabling an -# include graph can be accomplished by means of the command \hideincludegraph. +# files. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. INCLUDE_GRAPH = YES # If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are -# set to YES then Doxygen will generate a graph for each documented file showing +# set to YES then doxygen will generate a graph for each documented file showing # the direct and indirect include dependencies of the file with other documented -# files. Explicit enabling an included by graph, when INCLUDED_BY_GRAPH is set -# to NO, can be accomplished by means of the command \includedbygraph. Disabling -# an included by graph can be accomplished by means of the command -# \hideincludedbygraph. +# files. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. INCLUDED_BY_GRAPH = YES -# If the CALL_GRAPH tag is set to YES then Doxygen will generate a call +# If the CALL_GRAPH tag is set to YES then doxygen will generate a call # dependency graph for every global function or class method. # # Note that enabling this option will significantly increase the time of a run. @@ -2726,7 +2293,7 @@ INCLUDED_BY_GRAPH = YES CALL_GRAPH = NO -# If the CALLER_GRAPH tag is set to YES then Doxygen will generate a caller +# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller # dependency graph for every global function or class method. # # Note that enabling this option will significantly increase the time of a run. @@ -2738,59 +2305,44 @@ CALL_GRAPH = NO CALLER_GRAPH = NO -# If the GRAPHICAL_HIERARCHY tag is set to YES then Doxygen will graphical +# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical # hierarchy of all classes instead of a textual one. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. GRAPHICAL_HIERARCHY = YES -# If the DIRECTORY_GRAPH tag is set to YES then Doxygen will show the +# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the # dependencies a directory has on other directories in a graphical way. The # dependency relations are determined by the #include relations between the -# files in the directories. Explicit enabling a directory graph, when -# DIRECTORY_GRAPH is set to NO, can be accomplished by means of the command -# \directorygraph. Disabling a directory graph can be accomplished by means of -# the command \hidedirectorygraph. +# files in the directories. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. DIRECTORY_GRAPH = YES -# The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels -# of child directories generated in directory dependency graphs by dot. -# Minimum value: 1, maximum value: 25, default value: 1. -# This tag requires that the tag DIRECTORY_GRAPH is set to YES. - -DIR_GRAPH_MAX_DEPTH = 1 - # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. For an explanation of the image formats see the section # output formats in the documentation of the dot tool (Graphviz (see: -# https://www.graphviz.org/)). -# -# Note the formats svg:cairo and svg:cairo:cairo cannot be used in combination -# with INTERACTIVE_SVG (the INTERACTIVE_SVG will be set to NO). +# http://www.graphviz.org/)). +# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order +# to make the SVG files visible in IE 9+ (other browsers do not have this +# requirement). # Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo, -# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus, -# png:gdiplus:gdiplus, svg:cairo, svg:cairo:cairo, svg:svg, svg:svg:core, -# gif:cairo, gif:cairo:gd, gif:cairo:gdiplus, gif:gdiplus, gif:gdiplus:gdiplus, -# gif:gd, gif:gd:gd, jpg:cairo, jpg:cairo:gd, jpg:cairo:gdiplus, jpg:gd, -# jpg:gd:gd, jpg:gdiplus and jpg:gdiplus:gdiplus. +# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and +# png:gdiplus:gdiplus. # The default value is: png. # This tag requires that the tag HAVE_DOT is set to YES. DOT_IMAGE_FORMAT = png -# If DOT_IMAGE_FORMAT is set to svg or svg:svg or svg:svg:core, then this option -# can be set to YES to enable generation of interactive SVG images that allow -# zooming and panning. +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to +# enable generation of interactive SVG images that allow zooming and panning. # # Note that this requires a modern browser other than Internet Explorer. Tested # and working are Firefox, Chrome, Safari, and Opera. -# -# Note This option will be automatically disabled when DOT_IMAGE_FORMAT is set -# to svg:cairo or svg:cairo:cairo. +# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make +# the SVG files visible. Older versions of IE do not have SVG support. # The default value is: NO. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2809,12 +2361,11 @@ DOT_PATH = DOTFILE_DIRS = -# You can include diagrams made with dia in Doxygen documentation. Doxygen will -# then run dia to produce the diagram and insert it in the documentation. The -# DIA_PATH tag allows you to specify the directory where the dia binary resides. -# If left empty dia is assumed to be found in the default search path. +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the \mscfile +# command). -DIA_PATH = +MSCFILE_DIRS = # The DIAFILE_DIRS tag can be used to specify one or more directories that # contain dia files that are included in the documentation (see the \diafile @@ -2822,34 +2373,28 @@ DIA_PATH = DIAFILE_DIRS = -# When using PlantUML, the PLANTUML_JAR_PATH tag should be used to specify the -# path where java can find the plantuml.jar file or to the filename of jar file -# to be used. If left blank, it is assumed PlantUML is not used or called during -# a preprocessing step. Doxygen will generate a warning when it encounters a -# \startuml command in this case and will not generate output for the diagram. +# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the +# path where java can find the plantuml.jar file. If left blank, it is assumed +# PlantUML is not used or called during a preprocessing step. Doxygen will +# generate a warning when it encounters a \startuml command in this case and +# will not generate output for the diagram. PLANTUML_JAR_PATH = -# When using PlantUML, the PLANTUML_CFG_FILE tag can be used to specify a -# configuration file for PlantUML. +# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a +# configuration file for plantuml. PLANTUML_CFG_FILE = -# When using PlantUML, the specified paths are searched for files specified by -# the !include statement in a PlantUML block. +# When using plantuml, the specified paths are searched for files specified by +# the !include statement in a plantuml block. PLANTUML_INCLUDE_PATH = -# The PLANTUMLFILE_DIRS tag can be used to specify one or more directories that -# contain PlantUml files that are included in the documentation (see the -# \plantumlfile command). - -PLANTUMLFILE_DIRS = - # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes # that will be shown in the graph. If the number of nodes in a graph becomes -# larger than this value, Doxygen will truncate the graph, which is visualized -# by representing a node as a red box. Note that if the number of direct +# larger than this value, doxygen will truncate the graph, which is visualized +# by representing a node as a red box. Note that doxygen if the number of direct # children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that # the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. @@ -2870,6 +2415,18 @@ DOT_GRAPH_MAX_NODES = 50 MAX_DOT_GRAPH_DEPTH = 0 +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not seem +# to support this out of the box. +# +# Warning: Depending on the platform used, enabling this option may lead to +# badly anti-aliased labels on the edges of a graph (i.e. they become hard to +# read). +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_TRANSPARENT = NO + # Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) support @@ -2879,37 +2436,19 @@ MAX_DOT_GRAPH_DEPTH = 0 DOT_MULTI_TARGETS = NO -# If the GENERATE_LEGEND tag is set to YES Doxygen will generate a legend page +# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page # explaining the meaning of the various boxes and arrows in the dot generated # graphs. -# Note: This tag requires that UML_LOOK isn't set, i.e. the Doxygen internal -# graphical representation for inheritance and collaboration diagrams is used. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. GENERATE_LEGEND = YES -# If the DOT_CLEANUP tag is set to YES, Doxygen will remove the intermediate +# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate # files that are used to generate the various graphs. # -# Note: This setting is not only used for dot files but also for msc temporary -# files. +# Note: This setting is not only used for dot files but also for msc and +# plantuml temporary files. # The default value is: YES. -DOT_CLEANUP = YES - -# You can define message sequence charts within Doxygen comments using the \msc -# command. If the MSCGEN_TOOL tag is left empty (the default), then Doxygen will -# use a built-in version of mscgen tool to produce the charts. Alternatively, -# the MSCGEN_TOOL tag can also specify the name an external tool. For instance, -# specifying prog as the value, Doxygen will call the tool as prog -T -# -o . The external tool should support -# output file formats "png", "eps", "svg", and "ismap". - -MSCGEN_TOOL = - -# The MSCFILE_DIRS tag can be used to specify one or more directories that -# contain msc files that are included in the documentation (see the \mscfile -# command). - -MSCFILE_DIRS = +DOT_CLEANUP = YES \ No newline at end of file