From d25aba8e7277a627d9efbca745aae7d455442061 Mon Sep 17 00:00:00 2001 From: brentru Date: Wed, 14 May 2025 12:53:21 -0400 Subject: [PATCH 01/34] bring in new PBs, new drivers --- .gitignore | 6 +- library.properties | 2 +- platformio.ini | 2 + src/components/i2c/WipperSnapper_I2C.cpp | 17 ++ src/components/i2c/WipperSnapper_I2C.h | 6 +- .../drivers/WipperSnapper_I2C_Driver_Out.h | 134 +++++++++++ ...ipperSnapper_I2C_Driver_Out_QuadAlphaNum.h | 98 ++++++++ .../description/v1/description.pb.c | 2 +- .../description/v1/description.pb.h | 2 +- src/wippersnapper/ds18x20/v1/ds18x20.pb.c | 2 +- src/wippersnapper/ds18x20/v1/ds18x20.pb.h | 2 +- src/wippersnapper/i2c/v1/i2c.pb.c | 22 +- src/wippersnapper/i2c/v1/i2c.pb.h | 211 ++++++++++++++++-- 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 | 10 +- src/wippersnapper/uart/v1/uart.pb.c | 2 +- src/wippersnapper/uart/v1/uart.pb.h | 2 +- 25 files changed, 501 insertions(+), 37 deletions(-) create mode 100644 src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h create mode 100644 src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h diff --git a/.gitignore b/.gitignore index b22a8d404..1caed0bc6 100644 --- a/.gitignore +++ b/.gitignore @@ -48,4 +48,8 @@ examples/Wippersnapper_demo/build/ .pio/ # Secrets -data/ \ No newline at end of file +data/ + +# Misc. Data +tests/ +venv/ \ No newline at end of file diff --git a/library.properties b/library.properties index d851b0cd6..554e9f570 100644 --- a/library.properties +++ b/library.properties @@ -7,4 +7,4 @@ paragraph=Arduino application for Adafruit.io WipperSnapper category=Communication url=https://github.com/adafruit/Adafruit_Wippersnapper_Arduino architectures=* -depends=SdFat - Adafruit Fork, Adafruit NeoPixel, Adafruit SPIFlash, ArduinoJson, Adafruit DotStar, Adafruit HDC302x, Adafruit INA219, Adafruit INA260 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 +depends=SdFat - Adafruit Fork, Adafruit NeoPixel, Adafruit SPIFlash, ArduinoJson, Adafruit DotStar, Adafruit HDC302x, Adafruit INA219, Adafruit INA260 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 diff --git a/platformio.ini b/platformio.ini index 3e10e4fe2..e422f4d5f 100644 --- a/platformio.ini +++ b/platformio.ini @@ -91,6 +91,8 @@ lib_deps = https://github.com/adafruit/WiFiNINA.git https://github.com/Starmbi/hp_BH1750.git https://github.com/adafruit/Adafruit_TinyUSB_Arduino.git + https://github.com/adafruit/Adafruit_LED_Backpack.git + https://github.com/adafruit/Adafruit_LiquidCrystal.git diff --git a/src/components/i2c/WipperSnapper_I2C.cpp b/src/components/i2c/WipperSnapper_I2C.cpp index e14193adb..93c578cf8 100644 --- a/src/components/i2c/WipperSnapper_I2C.cpp +++ b/src/components/i2c/WipperSnapper_I2C.cpp @@ -838,6 +838,20 @@ bool WipperSnapper_Component_I2C::initI2CDevice( _adt7410->configureDriver(msgDeviceInitReq); drivers.push_back(_adt7410); WS_DEBUG_PRINTLN("ADT7410 Initialized Successfully!"); + } else if (strcmp("quadalphanum", msgDeviceInitReq->i2c_device_name) == 0) { + _quadAlphaNum = new WipperSnapper_I2C_Driver_Out_QuadAlphaNum(this->_i2c, i2cAddress); + // TODO: Need the I2C PB H updated to call the configure function + // _quadAlphaNum->ConfigureI2CBackpack() + // TODO: ^ Uncomment this! + if (!_quadAlphaNum->begin()) { + WS_DEBUG_PRINTLN("ERROR: Failed to initialize Quad Alphanum. Display!"); + _busStatusResponse = + wippersnapper_i2c_v1_BusResponse_BUS_RESPONSE_DEVICE_INIT_FAIL; + return false; + } + //drivers.push_back(_adt7410); + _drivers_out.push_back(_quadAlphaNum); + WS_DEBUG_PRINTLN("Quad Alphanum. Display Initialized Successfully!"); } else { WS_DEBUG_PRINTLN("ERROR: I2C device type not found!") _busStatusResponse = @@ -905,6 +919,9 @@ void WipperSnapper_Component_I2C::deinitI2CDevice( WS_DEBUG_PRINTLN("I2C Device De-initialized!"); } } + + // TODO: Add an implementation for the drivers_out vector! + _busStatusResponse = wippersnapper_i2c_v1_BusResponse_BUS_RESPONSE_SUCCESS; } diff --git a/src/components/i2c/WipperSnapper_I2C.h b/src/components/i2c/WipperSnapper_I2C.h index 670f28f8c..a8ac691bd 100644 --- a/src/components/i2c/WipperSnapper_I2C.h +++ b/src/components/i2c/WipperSnapper_I2C.h @@ -20,6 +20,8 @@ #include #include "drivers/WipperSnapper_I2C_Driver.h" +#include "drivers/WipperSnapper_I2C_Driver_Out.h" +#include "drivers/WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h" #include "drivers/WipperSnapper_I2C_Driver_ADT7410.h" #include "drivers/WipperSnapper_I2C_Driver_AHTX0.h" #include "drivers/WipperSnapper_I2C_Driver_BH1750.h" @@ -134,7 +136,8 @@ class WipperSnapper_Component_I2C { int32_t _portNum; TwoWire *_i2c = nullptr; wippersnapper_i2c_v1_BusResponse _busStatusResponse; - std::vector drivers; ///< List of sensor drivers + std::vector drivers; ///< List of i2c sensor drivers + std::vector _drivers_out; ///< List of i2c output drivers // Sensor driver objects WipperSnapper_I2C_Driver_AHTX0 *_ahtx0 = nullptr; WipperSnapper_I2C_Driver_DPS310 *_dps310 = nullptr; @@ -190,6 +193,7 @@ class WipperSnapper_Component_I2C { WipperSnapper_I2C_Driver_VL6180X *_vl6180x = nullptr; WipperSnapper_I2C_Driver_MAX17048 *_max17048 = nullptr; WipperSnapper_I2C_Driver_ADT7410 *_adt7410 = nullptr; + WipperSnapper_I2C_Driver_Out_QuadAlphaNum *_quadAlphaNum = nullptr; }; extern Wippersnapper WS; diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h new file mode 100644 index 000000000..12e649d52 --- /dev/null +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h @@ -0,0 +1,134 @@ +/*! + * @file WipperSnapper_I2C_Driver_Out.h + * + * Derived class for I2C output driver 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. + * + * MIT license, all text here must be included in any redistribution. + * + */ + +#ifndef WIPPERSNAPPER_I2C_DRIVER_OUT_H +#define WIPPERSNAPPER_I2C_DRIVER_OUT_H + +#include "WipperSnapper_I2C_Driver.h" +#include + +/*! + @brief Derived class for I2C output component drivers. +*/ +class WipperSnapper_I2C_Driver_Out : public WipperSnapper_I2C_Driver { + +public: + /*! + @brief Creates a new I2C output component driver. + @param i2c + The I2C hardware interface, default is Wire. + @param sensorAddress + The I2C sensor's unique address. + */ + WipperSnapper_I2C_Driver_Out(TwoWire *i2c, uint16_t sensorAddress):WipperSnapper_I2C_Driver(i2c, sensorAddress) { + // No-op constructor + } + + /*! + @brief Destructor for an I2C output component. + */ + virtual ~WipperSnapper_I2C_Driver_Out() { + // No-op destructor + } + + /*! + @brief Writes a message to an i2c output device. + @param message + The message to be displayed. + */ + virtual void WriteMessage(const char *message) { + // noop + } + + /*! + @brief Writes a floating point value to an i2c output device. + @param value + The value to be displayed. Only the first four digits are + displayed. + */ + virtual void WriteValue(float value) { + // noop + } + + /*! + @brief Writes a floating point value to an i2c output device. + @param value + The value to be displayed. Only the first four digits are + displayed. + */ + virtual void WriteValue(int32_t value) { + // noop + } + + /*! + @brief Configures a LED backpack. + @param brightness + The brightness of the LED backpack. + @param alignment + The alignment of the LED backpack. + */ + virtual void ConfigureI2CBackpack(int32_t brightness, uint32_t alignment) { + // noop + } + + /*! + @brief Sets the brightness of the LED backpack. + @param b + The brightness value, from 0 (off) to 15 (full brightness). + */ + virtual void SetLedBackpackBrightness(uint8_t b) { + // noop + } + + + /*! + @brief High-level fn, executes a call to the appropriate driver + function(s) based on the message data type to write. + @param msg_backpack_write + Pointer to a wippersnapper_i2c_output_LedBackpackWrite message. + @returns True if the message was written successfully, False otherwise. + */ + bool LedBackpackWrite( + wippersnapper_i2c_output_LedBackpackWrite *msg_backpack_write) { + // Check if we should adjust brightness + if (msg_backpack_write->adjust_brightness) + SetLedBackpackBrightness((uint8_t)msg_backpack_write->brightness); + + // Write the message to a LED backpack + switch (msg_backpack_write->which_message) { + case wippersnapper_i2c_output_LedBackpackWrite_text_tag: + WS_DEBUG_PRINTLN("[i2c] Writing text to LED backpack..."); + WriteMessage(msg_backpack_write->message.text); + break; + case wippersnapper_i2c_output_LedBackpackWrite_number_int_tag: + WS_DEBUG_PRINTLN("[i2c] Writing int to LED backpack..."); + WriteValue(msg_backpack_write->message.number_int); + break; + case wippersnapper_i2c_output_LedBackpackWrite_number_float_tag: + WS_DEBUG_PRINTLN("[i2c] Writing float to LED backpack..."); + WriteValue(msg_backpack_write->message.number_float); + break; + default: + WS_DEBUG_PRINTLN("[i2c] ERROR: Unable to determine LED backpack " + "message type!"); + return false; + break; + } + return true; + } + +}; + +#endif // WIPPERSNAPPER_I2C_DRIVER_OUT_H diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h new file mode 100644 index 000000000..fa853b89e --- /dev/null +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h @@ -0,0 +1,98 @@ +/*! + * @file WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h + * + * Device driver for Quad Alphanumeric Displays w/I2C Backpack + * + * 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 for Adafruit Industries 2025 + * + * MIT license, all text here must be included in any redistribution. + * + */ + +#ifndef WIPPERSNAPPER_I2C_DRIVER_OUT_QUADALPHANUM_H +#define WIPPERSNAPPER_I2C_DRIVER_OUT_QUADALPHANUM_H + +#include "WipperSnapper_I2C_Driver_Out.h" +#include +#include + +#define LED_BACKPACK_ALIGNMENT_UNSPECIFIED 0 ///< Unspecified alignment +#define LED_BACKPACK_ALIGNMENT_LEFT 1 ///< Left alignment +#define LED_BACKPACK_ALIGNMENT_RIGHT 2 ///< Right alignment +#define LED_BACKPACK_ALIGNMENT_DEFAULT \ + LED_BACKPACK_ALIGNMENT_LEFT ///< Default alignment +#define LED_MAX_CHARS \ + 4 ///< Maximum number of characters to display on the alphanumeric display + + +/*! + @brief Class that provides a driver interface for Quad Alphanumeric + Displays w/I2C Backpack +*/ +class WipperSnapper_I2C_Driver_Out_QuadAlphaNum : public WipperSnapper_I2C_Driver_Out { + +public: + /*******************************************************************************/ + /*! + @brief Constructor for an MS8607 sensor. + @param i2c + The I2C interface. + @param sensorAddress + 7-bit device address. + */ + /*******************************************************************************/ + WipperSnapper_I2C_Driver_Out_QuadAlphaNum(TwoWire *i2c, uint16_t sensorAddress) : WipperSnapper_I2C_Driver_Out(i2c, sensorAddress) { + // No-op constructor + } + + /*! + @brief Destructor for an MS8607 sensor. + */ + ~WipperSnapper_I2C_Driver_Out_QuadAlphaNum() { + if (_alpha4 != nullptr) { + delete _alpha4; + _alpha4 = nullptr; + } + } + + /*! + @brief Initializes the drvOutQuadAlphaNum component and begins I2C. + @returns True if initialized successfully, False otherwise. + */ + bool begin() override { + _alpha4 = new Adafruit_AlphaNum4(); + bool did_begin = _alpha4->begin(_address, _i2c); + _alpha4->setBrightness(_brightness); + return did_begin; + } + + /*! + @brief Configures a LED backpack. + @param brightness + The brightness of the LED backpack. + @param alignment + The alignment of the LED backpack. +*/ + void ConfigureI2CBackpack(int32_t brightness, uint32_t alignment) { + if (alignment == LED_BACKPACK_ALIGNMENT_RIGHT) { + _alignment = LED_BACKPACK_ALIGNMENT_RIGHT; + } else { + _alignment = LED_BACKPACK_ALIGNMENT_DEFAULT; + } + _brightness = brightness; + } + + + +protected: + Adafruit_AlphaNum4 *_alpha4 = nullptr; ///< ptr to a 4-digit alphanumeric display object + int32_t _brightness; ///< Brightness of the LED backpack, from 0 (off) to 15 + ///< (full brightness) + uint32_t _alignment = LED_BACKPACK_ALIGNMENT_DEFAULT; ///< Determines L/R alignment of the message displayed +}; + +#endif // WIPPERSNAPPER_I2C_DRIVER_OUT_QUADALPHANUM_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 892b3cd94..c88a1fe0b 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 Wed Sep 6 18:22:09 2023. */ +/* Generated by nanopb-0.4.5-dev at Wed May 14 16:42:42 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 f9a22c7d7..cacf484dd 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 Wed Sep 6 18:22:09 2023. */ +/* Generated by nanopb-0.4.5-dev at Wed May 14 16:42:42 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/ds18x20/v1/ds18x20.pb.c b/src/wippersnapper/ds18x20/v1/ds18x20.pb.c index 4d3172b5d..e201f8b02 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 Wed Sep 6 18:22:09 2023. */ +/* Generated by nanopb-0.4.5-dev at Wed May 14 16:42:42 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 101908aba..2a39648b5 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 Wed Sep 6 18:22:09 2023. */ +/* Generated by nanopb-0.4.5-dev at Wed May 14 16:42:42 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 b0f46a992..0d2595558 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 Wed Sep 6 18:22:09 2023. */ +/* Generated by nanopb-0.4.5-dev at Wed May 14 16:42:42 2025. */ #include "wippersnapper/i2c/v1/i2c.pb.h" #if PB_PROTO_HEADER_VERSION != 40 @@ -51,6 +51,26 @@ PB_BIND(wippersnapper_i2c_v1_SensorEvent, wippersnapper_i2c_v1_SensorEvent, AUTO PB_BIND(wippersnapper_i2c_v1_I2CDeviceEvent, wippersnapper_i2c_v1_I2CDeviceEvent, AUTO) +PB_BIND(wippersnapper_i2c_v1_I2CDeviceOutputWrite, wippersnapper_i2c_v1_I2CDeviceOutputWrite, AUTO) + + +PB_BIND(wippersnapper_i2c_v1_LedBackpackConfig, wippersnapper_i2c_v1_LedBackpackConfig, AUTO) + + +PB_BIND(wippersnapper_i2c_v1_CharLCDConfig, wippersnapper_i2c_v1_CharLCDConfig, AUTO) + + +PB_BIND(wippersnapper_i2c_v1_I2cOutputAdd, wippersnapper_i2c_v1_I2cOutputAdd, AUTO) + + +PB_BIND(wippersnapper_i2c_v1_LedBackpackWrite, wippersnapper_i2c_v1_LedBackpackWrite, AUTO) + + +PB_BIND(wippersnapper_i2c_v1_CharLCDWrite, wippersnapper_i2c_v1_CharLCDWrite, AUTO) + + + + diff --git a/src/wippersnapper/i2c/v1/i2c.pb.h b/src/wippersnapper/i2c/v1/i2c.pb.h index f6865e1fd..2a6c84ea6 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 Wed Sep 6 18:22:09 2023. */ +/* Generated by nanopb-0.4.5-dev at Wed May 14 16:42:42 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 @@ -60,11 +60,37 @@ typedef enum _wippersnapper_i2c_v1_SensorType { wippersnapper_i2c_v1_SensorType_SENSOR_TYPE_TVOC = 35 } wippersnapper_i2c_v1_SensorType; +typedef enum _wippersnapper_i2c_v1_LedBackpackBlinkRate { + wippersnapper_i2c_v1_LedBackpackBlinkRate_LED_BACKPACK_BLINK_RATE_UNSPECIFIED = 0, + wippersnapper_i2c_v1_LedBackpackBlinkRate_LED_BACKPACK_BLINK_RATE_OFF = 1, + wippersnapper_i2c_v1_LedBackpackBlinkRate_LED_BACKPACK_BLINK_RATE_2HZ = 2, + wippersnapper_i2c_v1_LedBackpackBlinkRate_LED_BACKPACK_BLINK_RATE_1HZ = 3, + wippersnapper_i2c_v1_LedBackpackBlinkRate_LED_BACKPACK_BLINK_RATE_HALFHZ = 4 +} wippersnapper_i2c_v1_LedBackpackBlinkRate; + +typedef enum _wippersnapper_i2c_v1_LedBackpackAlignment { + wippersnapper_i2c_v1_LedBackpackAlignment_LED_BACKPACK_ALIGNMENT_UNSPECIFIED = 0, + wippersnapper_i2c_v1_LedBackpackAlignment_LED_BACKPACK_ALIGNMENT_LEFT = 1, + wippersnapper_i2c_v1_LedBackpackAlignment_LED_BACKPACK_ALIGNMENT_RIGHT = 2 +} wippersnapper_i2c_v1_LedBackpackAlignment; + /* Struct definitions */ typedef struct _wippersnapper_i2c_v1_I2CDeviceInitRequests { pb_callback_t list; } wippersnapper_i2c_v1_I2CDeviceInitRequests; +typedef struct _wippersnapper_i2c_v1_CharLCDConfig { + uint32_t rows; + uint32_t columns; + char backlight_color[15]; +} wippersnapper_i2c_v1_CharLCDConfig; + +typedef struct _wippersnapper_i2c_v1_CharLCDWrite { + char message[128]; + char backlight_color[16]; + bool enable_scroll; +} wippersnapper_i2c_v1_CharLCDWrite; + typedef struct _wippersnapper_i2c_v1_I2CBusInitRequest { int32_t i2c_pin_scl; int32_t i2c_pin_sda; @@ -112,6 +138,25 @@ typedef struct _wippersnapper_i2c_v1_I2CDeviceUpdateResponse { wippersnapper_i2c_v1_BusResponse bus_response; } wippersnapper_i2c_v1_I2CDeviceUpdateResponse; +typedef struct _wippersnapper_i2c_v1_LedBackpackConfig { + int32_t brightness; + wippersnapper_i2c_v1_LedBackpackAlignment alignment; +} wippersnapper_i2c_v1_LedBackpackConfig; + +typedef struct _wippersnapper_i2c_v1_LedBackpackWrite { + pb_size_t which_message; + union { + char text[8]; + int32_t number_int; + float number_float; + } message; + bool adjust_brightness; + int32_t brightness; + wippersnapper_i2c_v1_LedBackpackBlinkRate blink_rate; + bool enable_scroll_marquee; + float scroll_marquee_speed; +} wippersnapper_i2c_v1_LedBackpackWrite; + typedef struct _wippersnapper_i2c_v1_SensorEvent { wippersnapper_i2c_v1_SensorType type; float value; @@ -129,23 +174,44 @@ typedef struct _wippersnapper_i2c_v1_I2CDeviceEvent { wippersnapper_i2c_v1_SensorEvent sensor_event[15]; } wippersnapper_i2c_v1_I2CDeviceEvent; -typedef struct _wippersnapper_i2c_v1_I2CDeviceInitRequest { +typedef struct _wippersnapper_i2c_v1_I2CDeviceOutputWrite { + uint32_t i2c_device_address; + char i2c_device_name[15]; + pb_size_t which_output_msg; + union { + wippersnapper_i2c_v1_LedBackpackWrite write_led_backpack; + wippersnapper_i2c_v1_CharLCDWrite write_char_lcd; + } output_msg; +} wippersnapper_i2c_v1_I2CDeviceOutputWrite; + +typedef struct _wippersnapper_i2c_v1_I2CDeviceUpdateRequest { int32_t i2c_port_number; - bool has_i2c_bus_init_req; - wippersnapper_i2c_v1_I2CBusInitRequest i2c_bus_init_req; uint32_t i2c_device_address; char i2c_device_name[15]; pb_size_t i2c_device_properties_count; wippersnapper_i2c_v1_I2CDeviceSensorProperties i2c_device_properties[15]; -} wippersnapper_i2c_v1_I2CDeviceInitRequest; +} wippersnapper_i2c_v1_I2CDeviceUpdateRequest; -typedef struct _wippersnapper_i2c_v1_I2CDeviceUpdateRequest { +typedef struct _wippersnapper_i2c_v1_I2cOutputAdd { + pb_size_t which_config; + union { + wippersnapper_i2c_v1_LedBackpackConfig led_backpack_config; + wippersnapper_i2c_v1_CharLCDConfig char_lcd_config; + } config; +} wippersnapper_i2c_v1_I2cOutputAdd; + +typedef struct _wippersnapper_i2c_v1_I2CDeviceInitRequest { int32_t i2c_port_number; + bool has_i2c_bus_init_req; + wippersnapper_i2c_v1_I2CBusInitRequest i2c_bus_init_req; uint32_t i2c_device_address; char i2c_device_name[15]; pb_size_t i2c_device_properties_count; wippersnapper_i2c_v1_I2CDeviceSensorProperties i2c_device_properties[15]; -} wippersnapper_i2c_v1_I2CDeviceUpdateRequest; + bool is_output_device; + bool has_i2c_output_add; + wippersnapper_i2c_v1_I2cOutputAdd i2c_output_add; +} wippersnapper_i2c_v1_I2CDeviceInitRequest; /* Helper constants for enums */ @@ -157,6 +223,14 @@ typedef struct _wippersnapper_i2c_v1_I2CDeviceUpdateRequest { #define _wippersnapper_i2c_v1_SensorType_MAX wippersnapper_i2c_v1_SensorType_SENSOR_TYPE_TVOC #define _wippersnapper_i2c_v1_SensorType_ARRAYSIZE ((wippersnapper_i2c_v1_SensorType)(wippersnapper_i2c_v1_SensorType_SENSOR_TYPE_TVOC+1)) +#define _wippersnapper_i2c_v1_LedBackpackBlinkRate_MIN wippersnapper_i2c_v1_LedBackpackBlinkRate_LED_BACKPACK_BLINK_RATE_UNSPECIFIED +#define _wippersnapper_i2c_v1_LedBackpackBlinkRate_MAX wippersnapper_i2c_v1_LedBackpackBlinkRate_LED_BACKPACK_BLINK_RATE_HALFHZ +#define _wippersnapper_i2c_v1_LedBackpackBlinkRate_ARRAYSIZE ((wippersnapper_i2c_v1_LedBackpackBlinkRate)(wippersnapper_i2c_v1_LedBackpackBlinkRate_LED_BACKPACK_BLINK_RATE_HALFHZ+1)) + +#define _wippersnapper_i2c_v1_LedBackpackAlignment_MIN wippersnapper_i2c_v1_LedBackpackAlignment_LED_BACKPACK_ALIGNMENT_UNSPECIFIED +#define _wippersnapper_i2c_v1_LedBackpackAlignment_MAX wippersnapper_i2c_v1_LedBackpackAlignment_LED_BACKPACK_ALIGNMENT_RIGHT +#define _wippersnapper_i2c_v1_LedBackpackAlignment_ARRAYSIZE ((wippersnapper_i2c_v1_LedBackpackAlignment)(wippersnapper_i2c_v1_LedBackpackAlignment_LED_BACKPACK_ALIGNMENT_RIGHT+1)) + #ifdef __cplusplus extern "C" { @@ -170,7 +244,7 @@ extern "C" { #define wippersnapper_i2c_v1_I2CBusScanResponse_init_default {0, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, _wippersnapper_i2c_v1_BusResponse_MIN} #define wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default {_wippersnapper_i2c_v1_SensorType_MIN, 0} #define wippersnapper_i2c_v1_I2CDeviceInitRequests_init_default {{{NULL}, NULL}} -#define wippersnapper_i2c_v1_I2CDeviceInitRequest_init_default {0, false, wippersnapper_i2c_v1_I2CBusInitRequest_init_default, 0, "", 0, {wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default}} +#define wippersnapper_i2c_v1_I2CDeviceInitRequest_init_default {0, false, wippersnapper_i2c_v1_I2CBusInitRequest_init_default, 0, "", 0, {wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default}, 0, false, wippersnapper_i2c_v1_I2cOutputAdd_init_default} #define wippersnapper_i2c_v1_I2CDeviceInitResponse_init_default {0, _wippersnapper_i2c_v1_BusResponse_MIN} #define wippersnapper_i2c_v1_I2CDeviceUpdateRequest_init_default {0, 0, "", 0, {wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default}} #define wippersnapper_i2c_v1_I2CDeviceUpdateResponse_init_default {0, _wippersnapper_i2c_v1_BusResponse_MIN} @@ -178,6 +252,12 @@ extern "C" { #define wippersnapper_i2c_v1_I2CDeviceDeinitResponse_init_default {0, _wippersnapper_i2c_v1_BusResponse_MIN} #define wippersnapper_i2c_v1_SensorEvent_init_default {_wippersnapper_i2c_v1_SensorType_MIN, 0} #define wippersnapper_i2c_v1_I2CDeviceEvent_init_default {0, 0, {wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default}} +#define wippersnapper_i2c_v1_I2CDeviceOutputWrite_init_default {0, "", 0, {wippersnapper_i2c_v1_LedBackpackWrite_init_default}} +#define wippersnapper_i2c_v1_LedBackpackConfig_init_default {0, _wippersnapper_i2c_v1_LedBackpackAlignment_MIN} +#define wippersnapper_i2c_v1_CharLCDConfig_init_default {0, 0, ""} +#define wippersnapper_i2c_v1_I2cOutputAdd_init_default {0, {wippersnapper_i2c_v1_LedBackpackConfig_init_default}} +#define wippersnapper_i2c_v1_LedBackpackWrite_init_default {0, {""}, 0, 0, _wippersnapper_i2c_v1_LedBackpackBlinkRate_MIN, 0, 0} +#define wippersnapper_i2c_v1_CharLCDWrite_init_default {"", "", 0} #define wippersnapper_i2c_v1_I2CBusInitRequest_init_zero {0, 0, 0, 0} #define wippersnapper_i2c_v1_I2CBusInitResponse_init_zero {_wippersnapper_i2c_v1_BusResponse_MIN} #define wippersnapper_i2c_v1_I2CBusSetFrequency_init_zero {0, 0} @@ -185,7 +265,7 @@ extern "C" { #define wippersnapper_i2c_v1_I2CBusScanResponse_init_zero {0, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, _wippersnapper_i2c_v1_BusResponse_MIN} #define wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero {_wippersnapper_i2c_v1_SensorType_MIN, 0} #define wippersnapper_i2c_v1_I2CDeviceInitRequests_init_zero {{{NULL}, NULL}} -#define wippersnapper_i2c_v1_I2CDeviceInitRequest_init_zero {0, false, wippersnapper_i2c_v1_I2CBusInitRequest_init_zero, 0, "", 0, {wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero}} +#define wippersnapper_i2c_v1_I2CDeviceInitRequest_init_zero {0, false, wippersnapper_i2c_v1_I2CBusInitRequest_init_zero, 0, "", 0, {wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero}, 0, false, wippersnapper_i2c_v1_I2cOutputAdd_init_zero} #define wippersnapper_i2c_v1_I2CDeviceInitResponse_init_zero {0, _wippersnapper_i2c_v1_BusResponse_MIN} #define wippersnapper_i2c_v1_I2CDeviceUpdateRequest_init_zero {0, 0, "", 0, {wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero}} #define wippersnapper_i2c_v1_I2CDeviceUpdateResponse_init_zero {0, _wippersnapper_i2c_v1_BusResponse_MIN} @@ -193,9 +273,21 @@ extern "C" { #define wippersnapper_i2c_v1_I2CDeviceDeinitResponse_init_zero {0, _wippersnapper_i2c_v1_BusResponse_MIN} #define wippersnapper_i2c_v1_SensorEvent_init_zero {_wippersnapper_i2c_v1_SensorType_MIN, 0} #define wippersnapper_i2c_v1_I2CDeviceEvent_init_zero {0, 0, {wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero}} +#define wippersnapper_i2c_v1_I2CDeviceOutputWrite_init_zero {0, "", 0, {wippersnapper_i2c_v1_LedBackpackWrite_init_zero}} +#define wippersnapper_i2c_v1_LedBackpackConfig_init_zero {0, _wippersnapper_i2c_v1_LedBackpackAlignment_MIN} +#define wippersnapper_i2c_v1_CharLCDConfig_init_zero {0, 0, ""} +#define wippersnapper_i2c_v1_I2cOutputAdd_init_zero {0, {wippersnapper_i2c_v1_LedBackpackConfig_init_zero}} +#define wippersnapper_i2c_v1_LedBackpackWrite_init_zero {0, {""}, 0, 0, _wippersnapper_i2c_v1_LedBackpackBlinkRate_MIN, 0, 0} +#define wippersnapper_i2c_v1_CharLCDWrite_init_zero {"", "", 0} /* Field tags (for use in manual encoding/decoding) */ #define wippersnapper_i2c_v1_I2CDeviceInitRequests_list_tag 1 +#define wippersnapper_i2c_v1_CharLCDConfig_rows_tag 1 +#define wippersnapper_i2c_v1_CharLCDConfig_columns_tag 2 +#define wippersnapper_i2c_v1_CharLCDConfig_backlight_color_tag 3 +#define wippersnapper_i2c_v1_CharLCDWrite_message_tag 1 +#define wippersnapper_i2c_v1_CharLCDWrite_backlight_color_tag 2 +#define wippersnapper_i2c_v1_CharLCDWrite_enable_scroll_tag 3 #define wippersnapper_i2c_v1_I2CBusInitRequest_i2c_pin_scl_tag 1 #define wippersnapper_i2c_v1_I2CBusInitRequest_i2c_pin_sda_tag 2 #define wippersnapper_i2c_v1_I2CBusInitRequest_i2c_frequency_tag 3 @@ -215,21 +307,39 @@ extern "C" { #define wippersnapper_i2c_v1_I2CDeviceSensorProperties_sensor_period_tag 2 #define wippersnapper_i2c_v1_I2CDeviceUpdateResponse_i2c_device_address_tag 1 #define wippersnapper_i2c_v1_I2CDeviceUpdateResponse_bus_response_tag 3 +#define wippersnapper_i2c_v1_LedBackpackConfig_brightness_tag 1 +#define wippersnapper_i2c_v1_LedBackpackConfig_alignment_tag 2 +#define wippersnapper_i2c_v1_LedBackpackWrite_text_tag 1 +#define wippersnapper_i2c_v1_LedBackpackWrite_number_int_tag 2 +#define wippersnapper_i2c_v1_LedBackpackWrite_number_float_tag 3 +#define wippersnapper_i2c_v1_LedBackpackWrite_adjust_brightness_tag 4 +#define wippersnapper_i2c_v1_LedBackpackWrite_brightness_tag 5 +#define wippersnapper_i2c_v1_LedBackpackWrite_blink_rate_tag 6 +#define wippersnapper_i2c_v1_LedBackpackWrite_enable_scroll_marquee_tag 7 +#define wippersnapper_i2c_v1_LedBackpackWrite_scroll_marquee_speed_tag 8 #define wippersnapper_i2c_v1_SensorEvent_type_tag 1 #define wippersnapper_i2c_v1_SensorEvent_value_tag 2 #define wippersnapper_i2c_v1_I2CBusScanRequest_i2c_port_number_tag 1 #define wippersnapper_i2c_v1_I2CBusScanRequest_bus_init_request_tag 2 #define wippersnapper_i2c_v1_I2CDeviceEvent_sensor_address_tag 1 #define wippersnapper_i2c_v1_I2CDeviceEvent_sensor_event_tag 2 +#define wippersnapper_i2c_v1_I2CDeviceOutputWrite_i2c_device_address_tag 1 +#define wippersnapper_i2c_v1_I2CDeviceOutputWrite_i2c_device_name_tag 2 +#define wippersnapper_i2c_v1_I2CDeviceOutputWrite_write_led_backpack_tag 3 +#define wippersnapper_i2c_v1_I2CDeviceOutputWrite_write_char_lcd_tag 4 +#define wippersnapper_i2c_v1_I2CDeviceUpdateRequest_i2c_port_number_tag 1 +#define wippersnapper_i2c_v1_I2CDeviceUpdateRequest_i2c_device_address_tag 2 +#define wippersnapper_i2c_v1_I2CDeviceUpdateRequest_i2c_device_name_tag 3 +#define wippersnapper_i2c_v1_I2CDeviceUpdateRequest_i2c_device_properties_tag 4 +#define wippersnapper_i2c_v1_I2cOutputAdd_led_backpack_config_tag 1 +#define wippersnapper_i2c_v1_I2cOutputAdd_char_lcd_config_tag 2 #define wippersnapper_i2c_v1_I2CDeviceInitRequest_i2c_port_number_tag 1 #define wippersnapper_i2c_v1_I2CDeviceInitRequest_i2c_bus_init_req_tag 2 #define wippersnapper_i2c_v1_I2CDeviceInitRequest_i2c_device_address_tag 3 #define wippersnapper_i2c_v1_I2CDeviceInitRequest_i2c_device_name_tag 4 #define wippersnapper_i2c_v1_I2CDeviceInitRequest_i2c_device_properties_tag 5 -#define wippersnapper_i2c_v1_I2CDeviceUpdateRequest_i2c_port_number_tag 1 -#define wippersnapper_i2c_v1_I2CDeviceUpdateRequest_i2c_device_address_tag 2 -#define wippersnapper_i2c_v1_I2CDeviceUpdateRequest_i2c_device_name_tag 3 -#define wippersnapper_i2c_v1_I2CDeviceUpdateRequest_i2c_device_properties_tag 4 +#define wippersnapper_i2c_v1_I2CDeviceInitRequest_is_output_device_tag 6 +#define wippersnapper_i2c_v1_I2CDeviceInitRequest_i2c_output_add_tag 7 /* Struct field encoding specification for nanopb */ #define wippersnapper_i2c_v1_I2CBusInitRequest_FIELDLIST(X, a) \ @@ -281,11 +391,14 @@ X(a, STATIC, SINGULAR, INT32, i2c_port_number, 1) \ X(a, STATIC, OPTIONAL, MESSAGE, i2c_bus_init_req, 2) \ X(a, STATIC, SINGULAR, UINT32, i2c_device_address, 3) \ X(a, STATIC, SINGULAR, STRING, i2c_device_name, 4) \ -X(a, STATIC, REPEATED, MESSAGE, i2c_device_properties, 5) +X(a, STATIC, REPEATED, MESSAGE, i2c_device_properties, 5) \ +X(a, STATIC, SINGULAR, BOOL, is_output_device, 6) \ +X(a, STATIC, OPTIONAL, MESSAGE, i2c_output_add, 7) #define wippersnapper_i2c_v1_I2CDeviceInitRequest_CALLBACK NULL #define wippersnapper_i2c_v1_I2CDeviceInitRequest_DEFAULT NULL #define wippersnapper_i2c_v1_I2CDeviceInitRequest_i2c_bus_init_req_MSGTYPE wippersnapper_i2c_v1_I2CBusInitRequest #define wippersnapper_i2c_v1_I2CDeviceInitRequest_i2c_device_properties_MSGTYPE wippersnapper_i2c_v1_I2CDeviceSensorProperties +#define wippersnapper_i2c_v1_I2CDeviceInitRequest_i2c_output_add_MSGTYPE wippersnapper_i2c_v1_I2cOutputAdd #define wippersnapper_i2c_v1_I2CDeviceInitResponse_FIELDLIST(X, a) \ X(a, STATIC, SINGULAR, UINT32, i2c_device_address, 2) \ @@ -333,6 +446,56 @@ X(a, STATIC, REPEATED, MESSAGE, sensor_event, 2) #define wippersnapper_i2c_v1_I2CDeviceEvent_DEFAULT NULL #define wippersnapper_i2c_v1_I2CDeviceEvent_sensor_event_MSGTYPE wippersnapper_i2c_v1_SensorEvent +#define wippersnapper_i2c_v1_I2CDeviceOutputWrite_FIELDLIST(X, a) \ +X(a, STATIC, SINGULAR, UINT32, i2c_device_address, 1) \ +X(a, STATIC, SINGULAR, STRING, i2c_device_name, 2) \ +X(a, STATIC, ONEOF, MESSAGE, (output_msg,write_led_backpack,output_msg.write_led_backpack), 3) \ +X(a, STATIC, ONEOF, MESSAGE, (output_msg,write_char_lcd,output_msg.write_char_lcd), 4) +#define wippersnapper_i2c_v1_I2CDeviceOutputWrite_CALLBACK NULL +#define wippersnapper_i2c_v1_I2CDeviceOutputWrite_DEFAULT NULL +#define wippersnapper_i2c_v1_I2CDeviceOutputWrite_output_msg_write_led_backpack_MSGTYPE wippersnapper_i2c_v1_LedBackpackWrite +#define wippersnapper_i2c_v1_I2CDeviceOutputWrite_output_msg_write_char_lcd_MSGTYPE wippersnapper_i2c_v1_CharLCDWrite + +#define wippersnapper_i2c_v1_LedBackpackConfig_FIELDLIST(X, a) \ +X(a, STATIC, SINGULAR, INT32, brightness, 1) \ +X(a, STATIC, SINGULAR, UENUM, alignment, 2) +#define wippersnapper_i2c_v1_LedBackpackConfig_CALLBACK NULL +#define wippersnapper_i2c_v1_LedBackpackConfig_DEFAULT NULL + +#define wippersnapper_i2c_v1_CharLCDConfig_FIELDLIST(X, a) \ +X(a, STATIC, SINGULAR, UINT32, rows, 1) \ +X(a, STATIC, SINGULAR, UINT32, columns, 2) \ +X(a, STATIC, SINGULAR, STRING, backlight_color, 3) +#define wippersnapper_i2c_v1_CharLCDConfig_CALLBACK NULL +#define wippersnapper_i2c_v1_CharLCDConfig_DEFAULT NULL + +#define wippersnapper_i2c_v1_I2cOutputAdd_FIELDLIST(X, a) \ +X(a, STATIC, ONEOF, MESSAGE, (config,led_backpack_config,config.led_backpack_config), 1) \ +X(a, STATIC, ONEOF, MESSAGE, (config,char_lcd_config,config.char_lcd_config), 2) +#define wippersnapper_i2c_v1_I2cOutputAdd_CALLBACK NULL +#define wippersnapper_i2c_v1_I2cOutputAdd_DEFAULT NULL +#define wippersnapper_i2c_v1_I2cOutputAdd_config_led_backpack_config_MSGTYPE wippersnapper_i2c_v1_LedBackpackConfig +#define wippersnapper_i2c_v1_I2cOutputAdd_config_char_lcd_config_MSGTYPE wippersnapper_i2c_v1_CharLCDConfig + +#define wippersnapper_i2c_v1_LedBackpackWrite_FIELDLIST(X, a) \ +X(a, STATIC, ONEOF, STRING, (message,text,message.text), 1) \ +X(a, STATIC, ONEOF, INT32, (message,number_int,message.number_int), 2) \ +X(a, STATIC, ONEOF, FLOAT, (message,number_float,message.number_float), 3) \ +X(a, STATIC, SINGULAR, BOOL, adjust_brightness, 4) \ +X(a, STATIC, SINGULAR, INT32, brightness, 5) \ +X(a, STATIC, SINGULAR, UENUM, blink_rate, 6) \ +X(a, STATIC, SINGULAR, BOOL, enable_scroll_marquee, 7) \ +X(a, STATIC, SINGULAR, FLOAT, scroll_marquee_speed, 8) +#define wippersnapper_i2c_v1_LedBackpackWrite_CALLBACK NULL +#define wippersnapper_i2c_v1_LedBackpackWrite_DEFAULT NULL + +#define wippersnapper_i2c_v1_CharLCDWrite_FIELDLIST(X, a) \ +X(a, STATIC, SINGULAR, STRING, message, 1) \ +X(a, STATIC, SINGULAR, STRING, backlight_color, 2) \ +X(a, STATIC, SINGULAR, BOOL, enable_scroll, 3) +#define wippersnapper_i2c_v1_CharLCDWrite_CALLBACK NULL +#define wippersnapper_i2c_v1_CharLCDWrite_DEFAULT NULL + extern const pb_msgdesc_t wippersnapper_i2c_v1_I2CBusInitRequest_msg; extern const pb_msgdesc_t wippersnapper_i2c_v1_I2CBusInitResponse_msg; extern const pb_msgdesc_t wippersnapper_i2c_v1_I2CBusSetFrequency_msg; @@ -348,6 +511,12 @@ extern const pb_msgdesc_t wippersnapper_i2c_v1_I2CDeviceDeinitRequest_msg; extern const pb_msgdesc_t wippersnapper_i2c_v1_I2CDeviceDeinitResponse_msg; extern const pb_msgdesc_t wippersnapper_i2c_v1_SensorEvent_msg; extern const pb_msgdesc_t wippersnapper_i2c_v1_I2CDeviceEvent_msg; +extern const pb_msgdesc_t wippersnapper_i2c_v1_I2CDeviceOutputWrite_msg; +extern const pb_msgdesc_t wippersnapper_i2c_v1_LedBackpackConfig_msg; +extern const pb_msgdesc_t wippersnapper_i2c_v1_CharLCDConfig_msg; +extern const pb_msgdesc_t wippersnapper_i2c_v1_I2cOutputAdd_msg; +extern const pb_msgdesc_t wippersnapper_i2c_v1_LedBackpackWrite_msg; +extern const pb_msgdesc_t wippersnapper_i2c_v1_CharLCDWrite_msg; /* Defines for backwards compatibility with code written before nanopb-0.4.0 */ #define wippersnapper_i2c_v1_I2CBusInitRequest_fields &wippersnapper_i2c_v1_I2CBusInitRequest_msg @@ -365,6 +534,12 @@ extern const pb_msgdesc_t wippersnapper_i2c_v1_I2CDeviceEvent_msg; #define wippersnapper_i2c_v1_I2CDeviceDeinitResponse_fields &wippersnapper_i2c_v1_I2CDeviceDeinitResponse_msg #define wippersnapper_i2c_v1_SensorEvent_fields &wippersnapper_i2c_v1_SensorEvent_msg #define wippersnapper_i2c_v1_I2CDeviceEvent_fields &wippersnapper_i2c_v1_I2CDeviceEvent_msg +#define wippersnapper_i2c_v1_I2CDeviceOutputWrite_fields &wippersnapper_i2c_v1_I2CDeviceOutputWrite_msg +#define wippersnapper_i2c_v1_LedBackpackConfig_fields &wippersnapper_i2c_v1_LedBackpackConfig_msg +#define wippersnapper_i2c_v1_CharLCDConfig_fields &wippersnapper_i2c_v1_CharLCDConfig_msg +#define wippersnapper_i2c_v1_I2cOutputAdd_fields &wippersnapper_i2c_v1_I2cOutputAdd_msg +#define wippersnapper_i2c_v1_LedBackpackWrite_fields &wippersnapper_i2c_v1_LedBackpackWrite_msg +#define wippersnapper_i2c_v1_CharLCDWrite_fields &wippersnapper_i2c_v1_CharLCDWrite_msg /* Maximum encoded size of messages (where known) */ #define wippersnapper_i2c_v1_I2CBusInitRequest_size 39 @@ -374,7 +549,7 @@ extern const pb_msgdesc_t wippersnapper_i2c_v1_I2CDeviceEvent_msg; #define wippersnapper_i2c_v1_I2CBusScanResponse_size 722 #define wippersnapper_i2c_v1_I2CDeviceSensorProperties_size 8 /* wippersnapper_i2c_v1_I2CDeviceInitRequests_size depends on runtime parameters */ -#define wippersnapper_i2c_v1_I2CDeviceInitRequest_size 224 +#define wippersnapper_i2c_v1_I2CDeviceInitRequest_size 258 #define wippersnapper_i2c_v1_I2CDeviceInitResponse_size 8 #define wippersnapper_i2c_v1_I2CDeviceUpdateRequest_size 183 #define wippersnapper_i2c_v1_I2CDeviceUpdateResponse_size 8 @@ -382,6 +557,12 @@ extern const pb_msgdesc_t wippersnapper_i2c_v1_I2CDeviceEvent_msg; #define wippersnapper_i2c_v1_I2CDeviceDeinitResponse_size 8 #define wippersnapper_i2c_v1_SensorEvent_size 7 #define wippersnapper_i2c_v1_I2CDeviceEvent_size 141 +#define wippersnapper_i2c_v1_I2CDeviceOutputWrite_size 174 +#define wippersnapper_i2c_v1_LedBackpackConfig_size 13 +#define wippersnapper_i2c_v1_CharLCDConfig_size 28 +#define wippersnapper_i2c_v1_I2cOutputAdd_size 30 +#define wippersnapper_i2c_v1_LedBackpackWrite_size 33 +#define wippersnapper_i2c_v1_CharLCDWrite_size 149 #ifdef __cplusplus } /* extern "C" */ diff --git a/src/wippersnapper/pin/v1/pin.pb.c b/src/wippersnapper/pin/v1/pin.pb.c index cadf00dee..95b69bba8 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 Wed Sep 6 18:22:09 2023. */ +/* Generated by nanopb-0.4.5-dev at Wed May 14 16:42:42 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 9859c9ff2..85d28f76e 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 Wed Sep 6 18:22:09 2023. */ +/* Generated by nanopb-0.4.5-dev at Wed May 14 16:42:42 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 1e3532d81..0291bee02 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 Wed Sep 6 18:22:09 2023. */ +/* Generated by nanopb-0.4.5-dev at Wed May 14 16:42:42 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 81a309c19..f2e8c5900 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 Wed Sep 6 18:22:09 2023. */ +/* Generated by nanopb-0.4.5-dev at Wed May 14 16:42:42 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 743548385..2d8a5bd50 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 Wed Sep 6 18:22:09 2023. */ +/* Generated by nanopb-0.4.5-dev at Wed May 14 16:42:42 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 5146ed396..c2e0a5ca0 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 Wed Sep 6 18:22:09 2023. */ +/* Generated by nanopb-0.4.5-dev at Wed May 14 16:42:42 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 e96dc47b1..201bca4ca 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 Wed Sep 6 18:22:09 2023. */ +/* Generated by nanopb-0.4.5-dev at Wed May 14 16:42:42 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 ee5fdeb43..26da57b73 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 Wed Sep 6 18:22:09 2023. */ +/* Generated by nanopb-0.4.5-dev at Wed May 14 16:42:42 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 e793af832..4c8cff799 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 Wed Sep 6 18:22:09 2023. */ +/* Generated by nanopb-0.4.5-dev at Wed May 14 16:42:42 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 328fd3757..f5d3d6df9 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 Wed Sep 6 18:22:09 2023. */ +/* Generated by nanopb-0.4.5-dev at Wed May 14 16:42:42 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 @@ -56,6 +56,7 @@ typedef struct _wippersnapper_signal_v1_I2CRequest { wippersnapper_i2c_v1_I2CDeviceDeinitRequest req_i2c_device_deinit; wippersnapper_i2c_v1_I2CDeviceUpdateRequest req_i2c_device_update; wippersnapper_i2c_v1_I2CDeviceInitRequests req_i2c_device_init_requests; + wippersnapper_i2c_v1_I2CDeviceOutputWrite req_i2c_device_out_write; } payload; } wippersnapper_signal_v1_I2CRequest; @@ -201,6 +202,7 @@ extern "C" { #define wippersnapper_signal_v1_I2CRequest_req_i2c_device_deinit_tag 5 #define wippersnapper_signal_v1_I2CRequest_req_i2c_device_update_tag 6 #define wippersnapper_signal_v1_I2CRequest_req_i2c_device_init_requests_tag 7 +#define wippersnapper_signal_v1_I2CRequest_req_i2c_device_out_write_tag 8 #define wippersnapper_signal_v1_I2CResponse_resp_i2c_scan_tag 2 #define wippersnapper_signal_v1_I2CResponse_resp_i2c_device_init_tag 3 #define wippersnapper_signal_v1_I2CResponse_resp_i2c_device_deinit_tag 4 @@ -265,7 +267,8 @@ X(a, STATIC, ONEOF, MSG_W_CB, (payload,req_i2c_set_freq,payload.req_i2c_set X(a, STATIC, ONEOF, MSG_W_CB, (payload,req_i2c_device_init,payload.req_i2c_device_init), 4) \ X(a, STATIC, ONEOF, MSG_W_CB, (payload,req_i2c_device_deinit,payload.req_i2c_device_deinit), 5) \ X(a, STATIC, ONEOF, MSG_W_CB, (payload,req_i2c_device_update,payload.req_i2c_device_update), 6) \ -X(a, STATIC, ONEOF, MSG_W_CB, (payload,req_i2c_device_init_requests,payload.req_i2c_device_init_requests), 7) +X(a, STATIC, ONEOF, MSG_W_CB, (payload,req_i2c_device_init_requests,payload.req_i2c_device_init_requests), 7) \ +X(a, STATIC, ONEOF, MSG_W_CB, (payload,req_i2c_device_out_write,payload.req_i2c_device_out_write), 8) #define wippersnapper_signal_v1_I2CRequest_CALLBACK NULL #define wippersnapper_signal_v1_I2CRequest_DEFAULT NULL #define wippersnapper_signal_v1_I2CRequest_payload_req_i2c_scan_MSGTYPE wippersnapper_i2c_v1_I2CBusScanRequest @@ -274,6 +277,7 @@ X(a, STATIC, ONEOF, MSG_W_CB, (payload,req_i2c_device_init_requests,payload #define wippersnapper_signal_v1_I2CRequest_payload_req_i2c_device_deinit_MSGTYPE wippersnapper_i2c_v1_I2CDeviceDeinitRequest #define wippersnapper_signal_v1_I2CRequest_payload_req_i2c_device_update_MSGTYPE wippersnapper_i2c_v1_I2CDeviceUpdateRequest #define wippersnapper_signal_v1_I2CRequest_payload_req_i2c_device_init_requests_MSGTYPE wippersnapper_i2c_v1_I2CDeviceInitRequests +#define wippersnapper_signal_v1_I2CRequest_payload_req_i2c_device_out_write_MSGTYPE wippersnapper_i2c_v1_I2CDeviceOutputWrite #define wippersnapper_signal_v1_I2CResponse_FIELDLIST(X, a) \ X(a, STATIC, ONEOF, MSG_W_CB, (payload,resp_i2c_scan,payload.resp_i2c_scan), 2) \ @@ -393,7 +397,7 @@ extern const pb_msgdesc_t wippersnapper_signal_v1_PWMResponse_msg; #define wippersnapper_signal_v1_Ds18x20Request_size 39 #define wippersnapper_signal_v1_Ds18x20Response_size 26 #if defined(wippersnapper_i2c_v1_I2CDeviceInitRequests_size) -union wippersnapper_signal_v1_I2CRequest_payload_size_union {char f7[(6 + wippersnapper_i2c_v1_I2CDeviceInitRequests_size)]; char f0[227];}; +union wippersnapper_signal_v1_I2CRequest_payload_size_union {char f7[(6 + wippersnapper_i2c_v1_I2CDeviceInitRequests_size)]; char f0[261];}; #define wippersnapper_signal_v1_I2CRequest_size (0 + sizeof(union wippersnapper_signal_v1_I2CRequest_payload_size_union)) #endif #define wippersnapper_signal_v1_I2CResponse_size 725 diff --git a/src/wippersnapper/uart/v1/uart.pb.c b/src/wippersnapper/uart/v1/uart.pb.c index b58470741..d7bd66036 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 Wed Sep 6 18:22:09 2023. */ +/* Generated by nanopb-0.4.5-dev at Wed May 14 16:42:42 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 fc197c4c2..3e0ec039e 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 Wed Sep 6 18:22:09 2023. */ +/* Generated by nanopb-0.4.5-dev at Wed May 14 16:42:42 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 5265e25462f49995d6fa3305a8052ee7bc92d567 Mon Sep 17 00:00:00 2001 From: brentru Date: Wed, 14 May 2025 13:05:59 -0400 Subject: [PATCH 02/34] compiles OK --- platformio.ini | 2 +- src/components/i2c/WipperSnapper_I2C.cpp | 5 +-- .../drivers/WipperSnapper_I2C_Driver_Out.h | 37 ------------------- ...ipperSnapper_I2C_Driver_Out_QuadAlphaNum.h | 7 ++-- 4 files changed, 6 insertions(+), 45 deletions(-) diff --git a/platformio.ini b/platformio.ini index e422f4d5f..f3dd0b75a 100644 --- a/platformio.ini +++ b/platformio.ini @@ -67,7 +67,6 @@ lib_deps = stm32duino/STM32duino VL53L4CD stm32duino/STM32duino VL53L4CX adafruit/Adafruit_VL6180X - adafruit/Adafruit PM25 AQI Sensor adafruit/Adafruit VEML7700 Library adafruit/Adafruit LC709203F adafruit/Adafruit LPS2X @@ -93,6 +92,7 @@ lib_deps = https://github.com/adafruit/Adafruit_TinyUSB_Arduino.git https://github.com/adafruit/Adafruit_LED_Backpack.git https://github.com/adafruit/Adafruit_LiquidCrystal.git + https://github.com/adafruit/Adafruit_PM25AQI.git diff --git a/src/components/i2c/WipperSnapper_I2C.cpp b/src/components/i2c/WipperSnapper_I2C.cpp index 93c578cf8..351d6f26d 100644 --- a/src/components/i2c/WipperSnapper_I2C.cpp +++ b/src/components/i2c/WipperSnapper_I2C.cpp @@ -840,16 +840,13 @@ bool WipperSnapper_Component_I2C::initI2CDevice( WS_DEBUG_PRINTLN("ADT7410 Initialized Successfully!"); } else if (strcmp("quadalphanum", msgDeviceInitReq->i2c_device_name) == 0) { _quadAlphaNum = new WipperSnapper_I2C_Driver_Out_QuadAlphaNum(this->_i2c, i2cAddress); - // TODO: Need the I2C PB H updated to call the configure function - // _quadAlphaNum->ConfigureI2CBackpack() - // TODO: ^ Uncomment this! + // _quadAlphaNum->ConfigureI2CBackpack(msgDeviceInitReq->i2c_output_add.config.led_backpack_config); if (!_quadAlphaNum->begin()) { WS_DEBUG_PRINTLN("ERROR: Failed to initialize Quad Alphanum. Display!"); _busStatusResponse = wippersnapper_i2c_v1_BusResponse_BUS_RESPONSE_DEVICE_INIT_FAIL; return false; } - //drivers.push_back(_adt7410); _drivers_out.push_back(_quadAlphaNum); WS_DEBUG_PRINTLN("Quad Alphanum. Display Initialized Successfully!"); } else { diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h index 12e649d52..758250bc9 100644 --- a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h @@ -92,43 +92,6 @@ class WipperSnapper_I2C_Driver_Out : public WipperSnapper_I2C_Driver { // noop } - - /*! - @brief High-level fn, executes a call to the appropriate driver - function(s) based on the message data type to write. - @param msg_backpack_write - Pointer to a wippersnapper_i2c_output_LedBackpackWrite message. - @returns True if the message was written successfully, False otherwise. - */ - bool LedBackpackWrite( - wippersnapper_i2c_output_LedBackpackWrite *msg_backpack_write) { - // Check if we should adjust brightness - if (msg_backpack_write->adjust_brightness) - SetLedBackpackBrightness((uint8_t)msg_backpack_write->brightness); - - // Write the message to a LED backpack - switch (msg_backpack_write->which_message) { - case wippersnapper_i2c_output_LedBackpackWrite_text_tag: - WS_DEBUG_PRINTLN("[i2c] Writing text to LED backpack..."); - WriteMessage(msg_backpack_write->message.text); - break; - case wippersnapper_i2c_output_LedBackpackWrite_number_int_tag: - WS_DEBUG_PRINTLN("[i2c] Writing int to LED backpack..."); - WriteValue(msg_backpack_write->message.number_int); - break; - case wippersnapper_i2c_output_LedBackpackWrite_number_float_tag: - WS_DEBUG_PRINTLN("[i2c] Writing float to LED backpack..."); - WriteValue(msg_backpack_write->message.number_float); - break; - default: - WS_DEBUG_PRINTLN("[i2c] ERROR: Unable to determine LED backpack " - "message type!"); - return false; - break; - } - return true; - } - }; #endif // WIPPERSNAPPER_I2C_DRIVER_OUT_H diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h index fa853b89e..36935fa07 100644 --- a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h @@ -46,7 +46,8 @@ class WipperSnapper_I2C_Driver_Out_QuadAlphaNum : public WipperSnapper_I2C_Drive */ /*******************************************************************************/ WipperSnapper_I2C_Driver_Out_QuadAlphaNum(TwoWire *i2c, uint16_t sensorAddress) : WipperSnapper_I2C_Driver_Out(i2c, sensorAddress) { - // No-op constructor + _i2c = i2c; + _sensorAddress = sensorAddress; } /*! @@ -63,9 +64,9 @@ class WipperSnapper_I2C_Driver_Out_QuadAlphaNum : public WipperSnapper_I2C_Drive @brief Initializes the drvOutQuadAlphaNum component and begins I2C. @returns True if initialized successfully, False otherwise. */ - bool begin() override { + bool begin() { _alpha4 = new Adafruit_AlphaNum4(); - bool did_begin = _alpha4->begin(_address, _i2c); + bool did_begin = _alpha4->begin(_sensorAddress, _i2c); _alpha4->setBrightness(_brightness); return did_begin; } From cc3a3c50957b6ba34129ad4700925b246a910f5d Mon Sep 17 00:00:00 2001 From: brentru Date: Wed, 14 May 2025 16:55:59 -0400 Subject: [PATCH 03/34] Add write commands for quadalphanum --- src/Wippersnapper.cpp | 15 ++++ src/components/i2c/WipperSnapper_I2C.cpp | 49 +++++++++- src/components/i2c/WipperSnapper_I2C.h | 13 ++- .../drivers/WipperSnapper_I2C_Driver_Out.h | 39 ++++++-- ...ipperSnapper_I2C_Driver_Out_QuadAlphaNum.h | 90 +++++++++++++++++++ 5 files changed, 194 insertions(+), 12 deletions(-) diff --git a/src/Wippersnapper.cpp b/src/Wippersnapper.cpp index 022583587..7916ff379 100644 --- a/src/Wippersnapper.cpp +++ b/src/Wippersnapper.cpp @@ -871,6 +871,21 @@ bool cbDecodeSignalRequestI2C(pb_istream_t *stream, const pb_field_t *field, if (!encodeI2CResponse(&msgi2cResponse)) { return false; } + } else if (field->tag == + wippersnapper_signal_v1_I2CRequest_req_i2c_device_out_write_tag) { + WS_DEBUG_PRINTLN("[app] I2C Device Output Write"); + // Decode stream into an I2CDeviceDeinitRequest + wippersnapper_i2c_v1_I2CDeviceOutputWrite msgDeviceWrite = + wippersnapper_i2c_v1_I2CDeviceOutputWrite_init_zero; + // Decode stream into struct, msgI2CDeviceDeinitRequest + if (!ws_pb_decode(stream, wippersnapper_i2c_v1_I2CDeviceOutputWrite_fields, + &msgDeviceWrite)) { + WS_DEBUG_PRINTLN( + "[app] ERROR: Failed decoding I2CDeviceOutputWrite message."); + return false; + } + WS._i2cPort0->Handle_I2cDeviceOutputWrite(&msgDeviceWrite); + WS_DEBUG_PRINTLN("[app] I2C Device Output Write Done"); } else { WS_DEBUG_PRINTLN("ERROR: Undefined I2C message tag"); return false; // fail out, we didn't encode anything to publish diff --git a/src/components/i2c/WipperSnapper_I2C.cpp b/src/components/i2c/WipperSnapper_I2C.cpp index 351d6f26d..22198d180 100644 --- a/src/components/i2c/WipperSnapper_I2C.cpp +++ b/src/components/i2c/WipperSnapper_I2C.cpp @@ -839,8 +839,11 @@ bool WipperSnapper_Component_I2C::initI2CDevice( drivers.push_back(_adt7410); WS_DEBUG_PRINTLN("ADT7410 Initialized Successfully!"); } else if (strcmp("quadalphanum", msgDeviceInitReq->i2c_device_name) == 0) { - _quadAlphaNum = new WipperSnapper_I2C_Driver_Out_QuadAlphaNum(this->_i2c, i2cAddress); - // _quadAlphaNum->ConfigureI2CBackpack(msgDeviceInitReq->i2c_output_add.config.led_backpack_config); + _quadAlphaNum = + new WipperSnapper_I2C_Driver_Out_QuadAlphaNum(this->_i2c, i2cAddress); + _quadAlphaNum->ConfigureI2CBackpack( + msgDeviceInitReq->i2c_output_add.config.led_backpack_config.brightness, + msgDeviceInitReq->i2c_output_add.config.led_backpack_config.alignment); if (!_quadAlphaNum->begin()) { WS_DEBUG_PRINTLN("ERROR: Failed to initialize Quad Alphanum. Display!"); _busStatusResponse = @@ -1087,6 +1090,48 @@ void WipperSnapper_Component_I2C::displayDeviceEventMessage( } } +/*******************************************************************************/ +/*! + @brief Handles an I2CDeviceOutputWrite message. + @param msgDeviceWrite + A decoded I2CDeviceOutputWrite message. + @returns True if the message was handled successfully, false otherwise. +*/ +/*******************************************************************************/ +bool WipperSnapper_Component_I2C::Handle_I2cDeviceOutputWrite( + wippersnapper_i2c_v1_I2CDeviceOutputWrite *msgDeviceWrite) { + + // Create a ptr to the base driver out + WipperSnapper_I2C_Driver_Out *driver_out = nullptr; + // Find the matching driver by address in the _drivers_out vector + WS_DEBUG_PRINT("Searching for i2c output driver with address: "); + WS_DEBUG_PRINT(msgDeviceWrite->i2c_device_address); + for (size_t i = 0; i < _drivers_out.size(); i++) { + if (_drivers_out[i]->getI2CAddress() == + msgDeviceWrite->i2c_device_address) { + driver_out = _drivers_out[i]; + break; + } + } + if (driver_out == nullptr) { + WS_DEBUG_PRINTLN("ERROR: Driver not found within drivers_out!"); + return false; + } + + // Call the output_msg + if (msgDeviceWrite->which_output_msg == + wippersnapper_i2c_v1_I2CDeviceOutputWrite_write_led_backpack_tag) { + driver_out->WriteLedBackpack(&msgDeviceWrite->output_msg.write_led_backpack); + } else if (msgDeviceWrite->which_output_msg == + wippersnapper_i2c_v1_I2CDeviceOutputWrite_write_char_lcd_tag) { + // TODO: Write to the char LCD + } else { + WS_DEBUG_PRINTLN("ERROR: Unknown output message type!"); + return false; + } + return true; +} + /*******************************************************************************/ /*! @brief Queries all I2C device drivers for new values. Fills and sends an diff --git a/src/components/i2c/WipperSnapper_I2C.h b/src/components/i2c/WipperSnapper_I2C.h index a8ac691bd..994b713e0 100644 --- a/src/components/i2c/WipperSnapper_I2C.h +++ b/src/components/i2c/WipperSnapper_I2C.h @@ -20,8 +20,6 @@ #include #include "drivers/WipperSnapper_I2C_Driver.h" -#include "drivers/WipperSnapper_I2C_Driver_Out.h" -#include "drivers/WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h" #include "drivers/WipperSnapper_I2C_Driver_ADT7410.h" #include "drivers/WipperSnapper_I2C_Driver_AHTX0.h" #include "drivers/WipperSnapper_I2C_Driver_BH1750.h" @@ -52,6 +50,8 @@ #include "drivers/WipperSnapper_I2C_Driver_MPRLS.h" #include "drivers/WipperSnapper_I2C_Driver_MS8607.h" #include "drivers/WipperSnapper_I2C_Driver_NAU7802.h" +#include "drivers/WipperSnapper_I2C_Driver_Out.h" +#include "drivers/WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h" #include "drivers/WipperSnapper_I2C_Driver_PCT2075.h" #include "drivers/WipperSnapper_I2C_Driver_PM25.h" #include "drivers/WipperSnapper_I2C_Driver_SCD30.h" @@ -106,6 +106,9 @@ class WipperSnapper_Component_I2C { void update(); + bool Handle_I2cDeviceOutputWrite( + wippersnapper_i2c_v1_I2CDeviceOutputWrite *msgDeviceWrite); + void sensorEventRead( std::vector::iterator &iter, unsigned long curTime, @@ -136,8 +139,10 @@ class WipperSnapper_Component_I2C { int32_t _portNum; TwoWire *_i2c = nullptr; wippersnapper_i2c_v1_BusResponse _busStatusResponse; - std::vector drivers; ///< List of i2c sensor drivers - std::vector _drivers_out; ///< List of i2c output drivers + std::vector + drivers; ///< List of i2c sensor drivers + std::vector + _drivers_out; ///< List of i2c output drivers // Sensor driver objects WipperSnapper_I2C_Driver_AHTX0 *_ahtx0 = nullptr; WipperSnapper_I2C_Driver_DPS310 *_dps310 = nullptr; diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h index 758250bc9..53709c15f 100644 --- a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h @@ -32,7 +32,8 @@ class WipperSnapper_I2C_Driver_Out : public WipperSnapper_I2C_Driver { @param sensorAddress The I2C sensor's unique address. */ - WipperSnapper_I2C_Driver_Out(TwoWire *i2c, uint16_t sensorAddress):WipperSnapper_I2C_Driver(i2c, sensorAddress) { + WipperSnapper_I2C_Driver_Out(TwoWire *i2c, uint16_t sensorAddress) + : WipperSnapper_I2C_Driver(i2c, sensorAddress) { // No-op constructor } @@ -43,11 +44,11 @@ class WipperSnapper_I2C_Driver_Out : public WipperSnapper_I2C_Driver { // No-op destructor } - /*! - @brief Writes a message to an i2c output device. - @param message - The message to be displayed. - */ + /*! + @brief Writes a message to an i2c output device. + @param message + The message to be displayed. +*/ virtual void WriteMessage(const char *message) { // noop } @@ -92,6 +93,32 @@ class WipperSnapper_I2C_Driver_Out : public WipperSnapper_I2C_Driver { // noop } + bool WriteLedBackpack(wippersnapper_i2c_v1_LedBackpackWrite *msg_write) { + // Check if we should adjust brightness + if (msg_write->adjust_brightness) + SetLedBackpackBrightness((uint8_t)msg_write->brightness); + + // Write the message to a LED backpack + switch (msg_write->which_message) { + case wippersnapper_i2c_v1_LedBackpackWrite_text_tag: + WS_DEBUG_PRINTLN("[i2c] Writing text to LED backpack..."); + WriteMessage(msg_write->message.text); + break; + case wippersnapper_i2c_v1_LedBackpackWrite_number_int_tag: + WS_DEBUG_PRINTLN("[i2c] Writing int to LED backpack..."); + WriteValue(msg_write->message.number_int); + break; + case wippersnapper_i2c_v1_LedBackpackWrite_number_float_tag: + WS_DEBUG_PRINTLN("[i2c] Writing float to LED backpack..."); + WriteValue(msg_write->message.number_float); + break; + default: + WS_DEBUG_PRINTLN("[i2c] ERROR: Unable to determine message type!"); + return false; + break; + } + return true; + } }; #endif // WIPPERSNAPPER_I2C_DRIVER_OUT_H diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h index 36935fa07..e34ac112d 100644 --- a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h @@ -87,7 +87,97 @@ class WipperSnapper_I2C_Driver_Out_QuadAlphaNum : public WipperSnapper_I2C_Drive _brightness = brightness; } + /*! + @brief Sets the brightness of the LED backpack. + @param b + The brightness value, from 0 (off) to 15 (full brightness). + */ + void SetLedBackpackBrightness(uint8_t b) { + if (_alpha4 == nullptr) { + return; + } + _alpha4->setBrightness(b); + } + + /*! + @brief Writes the first four characters of a message to the quad + alphanumeric display. + @param message + The message to be displayed. + */ + void WriteMessage(const char *message) { + if (_alpha4 == nullptr || message == nullptr) { + return; + } + // Clear before writing + _alpha4->clear(); + + // Calculate the number of characters to display + size_t len_display = min(strlen(message), (size_t)LED_MAX_CHARS); + + // Set the starting position based on alignment + int pos_start; + if (_alignment == LED_BACKPACK_ALIGNMENT_LEFT) { + pos_start = 0; // start at the leftmost position of the display + } else { + // Exclude decimal points from the character count because those get + // displayed on a "special" segment of the LED display + int seg_chars = 0; + for (size_t i = 0; i < len_display; i++) { + if (message[i] != '.') { + seg_chars++; + } + } + // start at the rightmost position of the display + pos_start = LED_MAX_CHARS - seg_chars; + } + // Write to the display's buffer + int cur_idx = pos_start; + for (size_t i = 0; i < len_display; i++) { + // Save the character because if there's a decimal, we need to skip it in + // the buffer + char ch = message[i]; + + // Look-ahead for a decimal point to attach to the current character + bool display_dot = false; + if (i + 1 < len_display && message[i + 1] == '.') { + display_dot = true; + i++; + len_display++; + } + + // Write the character to the display buffer + _alpha4->writeDigitAscii(cur_idx, ch, display_dot); + cur_idx++; + } + // Issue the buffered data in RAM to the display + _alpha4->writeDisplay(); + } + + /*! + @brief Writes a floating point value to the quad alphanumeric display. + @param value + The value to be displayed. Only the first four digits are + displayed. + */ + void WriteValue(float value) { + char message[8 + 1]; + snprintf(message, sizeof(message), "%.5f", value); + WriteMessage(message); + } + + /*! + @brief Writes an integer value to the quad alphanumeric display. + @param value + The value to be displayed. Only the first four digits are + displayed. + */ + void WriteValue(int32_t value) { + char message[LED_MAX_CHARS + 1]; + snprintf(message, sizeof(message), "%ld", value); + WriteMessage(message); + } protected: Adafruit_AlphaNum4 *_alpha4 = nullptr; ///< ptr to a 4-digit alphanumeric display object From 645fd4d77c3f39fe1abf49ea1f1273f4bf56fd9b Mon Sep 17 00:00:00 2001 From: brentru Date: Thu, 15 May 2025 11:12:04 -0400 Subject: [PATCH 04/34] Add CharLCD --- src/components/i2c/WipperSnapper_I2C.cpp | 43 +++++- src/components/i2c/WipperSnapper_I2C.h | 2 + .../drivers/WipperSnapper_I2C_Driver_Out.h | 34 +++++ .../WipperSnapper_I2C_Driver_Out_CharLcd.h | 137 ++++++++++++++++++ 4 files changed, 211 insertions(+), 5 deletions(-) create mode 100644 src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_CharLcd.h diff --git a/src/components/i2c/WipperSnapper_I2C.cpp b/src/components/i2c/WipperSnapper_I2C.cpp index 22198d180..9d90133ff 100644 --- a/src/components/i2c/WipperSnapper_I2C.cpp +++ b/src/components/i2c/WipperSnapper_I2C.cpp @@ -852,6 +852,19 @@ bool WipperSnapper_Component_I2C::initI2CDevice( } _drivers_out.push_back(_quadAlphaNum); WS_DEBUG_PRINTLN("Quad Alphanum. Display Initialized Successfully!"); + } else if (strcmp("charlcd", msgDeviceInitReq->i2c_device_name) == 0) { + _charLcd = new WipperSnapper_I2C_Driver_Out_CharLcd(this->_i2c, i2cAddress); + _charLcd->ConfigureCharLcd( + msgDeviceInitReq->i2c_output_add.config.char_lcd_config.rows, + msgDeviceInitReq->i2c_output_add.config.char_lcd_config.columns, true); + if (!_charLcd->begin()) { + WS_DEBUG_PRINTLN("ERROR: Failed to initialize Character LCD!"); + _busStatusResponse = + wippersnapper_i2c_v1_BusResponse_BUS_RESPONSE_DEVICE_INIT_FAIL; + return false; + } + _drivers_out.push_back(_charLcd); + WS_DEBUG_PRINTLN("Char LCD Display Initialized Successfully!"); } else { WS_DEBUG_PRINTLN("ERROR: I2C device type not found!") _busStatusResponse = @@ -900,8 +913,9 @@ void WipperSnapper_Component_I2C::updateI2CDeviceProperties( void WipperSnapper_Component_I2C::deinitI2CDevice( wippersnapper_i2c_v1_I2CDeviceDeinitRequest *msgDeviceDeinitReq) { uint16_t deviceAddr = (uint16_t)msgDeviceDeinitReq->i2c_device_address; - std::vector::iterator iter, end; + // Check input (sensor) drivers + std::vector::iterator iter, end; for (iter = drivers.begin(), end = drivers.end(); iter != end; ++iter) { if ((*iter)->getI2CAddress() == deviceAddr) { // Delete the object that iter points to @@ -920,7 +934,26 @@ void WipperSnapper_Component_I2C::deinitI2CDevice( } } - // TODO: Add an implementation for the drivers_out vector! + // Check for output drivers + std::vector::iterator out_iter, out_end; + for (out_iter = _drivers_out.begin(), out_end = _drivers_out.end(); + out_iter != out_end; ++out_iter) { + if ((*out_iter)->getI2CAddress() == deviceAddr) { + // Set the driver to nullptr + *out_iter = nullptr; +// ESP-IDF, Erase–remove iter ptr from driver vector +#if defined(ARDUINO_ARCH_ESP32) || defined(ARDUINO_ARCH_ESP8266) + *out_iter = nullptr; + _drivers_out.erase( + remove(_drivers_out.begin(), _drivers_out.end(), nullptr), + _drivers_out.end()); +#else + // Arduino can not erase-remove, erase only + _drivers_out.erase(out_iter); +#endif + WS_DEBUG_PRINTLN("I2C Device De-initialized!"); + } + } _busStatusResponse = wippersnapper_i2c_v1_BusResponse_BUS_RESPONSE_SUCCESS; } @@ -1121,10 +1154,11 @@ bool WipperSnapper_Component_I2C::Handle_I2cDeviceOutputWrite( // Call the output_msg if (msgDeviceWrite->which_output_msg == wippersnapper_i2c_v1_I2CDeviceOutputWrite_write_led_backpack_tag) { - driver_out->WriteLedBackpack(&msgDeviceWrite->output_msg.write_led_backpack); + driver_out->WriteLedBackpack( + &msgDeviceWrite->output_msg.write_led_backpack); } else if (msgDeviceWrite->which_output_msg == wippersnapper_i2c_v1_I2CDeviceOutputWrite_write_char_lcd_tag) { - // TODO: Write to the char LCD + driver_out->WriteMessageCharLCD(&msgDeviceWrite->output_msg.write_char_lcd); } else { WS_DEBUG_PRINTLN("ERROR: Unknown output message type!"); return false; @@ -1139,7 +1173,6 @@ bool WipperSnapper_Component_I2C::Handle_I2cDeviceOutputWrite( */ /*******************************************************************************/ void WipperSnapper_Component_I2C::update() { - // Create response message wippersnapper_signal_v1_I2CResponse msgi2cResponse = wippersnapper_signal_v1_I2CResponse_init_zero; diff --git a/src/components/i2c/WipperSnapper_I2C.h b/src/components/i2c/WipperSnapper_I2C.h index 994b713e0..8078d96ea 100644 --- a/src/components/i2c/WipperSnapper_I2C.h +++ b/src/components/i2c/WipperSnapper_I2C.h @@ -51,6 +51,7 @@ #include "drivers/WipperSnapper_I2C_Driver_MS8607.h" #include "drivers/WipperSnapper_I2C_Driver_NAU7802.h" #include "drivers/WipperSnapper_I2C_Driver_Out.h" +#include "drivers/WipperSnapper_I2C_Driver_Out_CharLcd.h" #include "drivers/WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h" #include "drivers/WipperSnapper_I2C_Driver_PCT2075.h" #include "drivers/WipperSnapper_I2C_Driver_PM25.h" @@ -199,6 +200,7 @@ class WipperSnapper_Component_I2C { WipperSnapper_I2C_Driver_MAX17048 *_max17048 = nullptr; WipperSnapper_I2C_Driver_ADT7410 *_adt7410 = nullptr; WipperSnapper_I2C_Driver_Out_QuadAlphaNum *_quadAlphaNum = nullptr; + WipperSnapper_I2C_Driver_Out_CharLcd *_charLcd = nullptr; }; extern Wippersnapper WS; diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h index 53709c15f..f68e9fad3 100644 --- a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h @@ -93,6 +93,12 @@ class WipperSnapper_I2C_Driver_Out : public WipperSnapper_I2C_Driver { // noop } + /*! + @brief Writes a message to the LED backpack. + @param msg_write + Pointer to a wippersnapper_i2c_v1_LedBackpackWrite message. + @returns True if the message was written successfully, False otherwise. + */ bool WriteLedBackpack(wippersnapper_i2c_v1_LedBackpackWrite *msg_write) { // Check if we should adjust brightness if (msg_write->adjust_brightness) @@ -119,6 +125,34 @@ class WipperSnapper_I2C_Driver_Out : public WipperSnapper_I2C_Driver { } return true; } + + /*! + @brief Configures a character LCD. + @param rows + The number of rows in the LCD. + @param cols + The number of columns in the LCD. + @param enable_backlight + True if the backlight is enabled, False otherwise. + */ + virtual void ConfigureCharLcd(uint32_t rows, uint32_t cols, + bool enable_backlight) { + // noop + } + + /*! + @brief Writes a message to the LCD. + @param write_char_lcd + Points to a CharLCDWrite message. + @returns True if the message was written successfully, False otherwise. + */ + bool WriteMessageCharLCD(wippersnapper_i2c_v1_CharLCDWrite *write_char_lcd) { + WriteMessage(write_char_lcd->message); + // NOTE: While this isn't calling any other funcs in here and ret'ing true, + // I want to keep this function high-level for when we implement backlight + // color and scrolling. + return true; + } }; #endif // WIPPERSNAPPER_I2C_DRIVER_OUT_H diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_CharLcd.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_CharLcd.h new file mode 100644 index 000000000..3b803a569 --- /dev/null +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_CharLcd.h @@ -0,0 +1,137 @@ +/*! + * @file WipperSnapper_I2C_Driver_Out_CharLcd.h + * + * Device driver for I2C Character LCDs (HD44780) + * + * 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 for Adafruit Industries 2025 + * + * MIT license, all text here must be included in any redistribution. + * + */ + +#ifndef WIPPERSNAPPER_I2C_DRIVER_OUT_CHARLCD_H +#define WIPPERSNAPPER_I2C_DRIVER_OUT_CHARLCD_H + +#include "WipperSnapper_I2C_Driver_Out.h" +#include + +/*! + @brief Class that provides a driver interface for a lcd character display. + This class is a wrapper around the Adafruit_LiquidCrystal library. +*/ +class WipperSnapper_I2C_Driver_Out_CharLcd + : public WipperSnapper_I2C_Driver_Out { + +public: + /*******************************************************************************/ + /*! + @brief Constructor for a LCD character display. + @param i2c + The I2C interface. + @param sensorAddress + 7-bit device address. + */ + /*******************************************************************************/ + WipperSnapper_I2C_Driver_Out_CharLcd(TwoWire *i2c, uint16_t sensorAddress) + : WipperSnapper_I2C_Driver_Out(i2c, sensorAddress) { + _i2c = i2c; + _sensorAddress = sensorAddress; + } + + /*! + @brief Destructor for an MS8607 sensor. + */ + ~WipperSnapper_I2C_Driver_Out_CharLcd() { + if (_lcd != nullptr) { + delete _lcd; + _lcd = nullptr; + } + } + + /*! + @brief Initializes the drvOutQuadAlphaNum component and begins I2C. + @returns True if initialized successfully, False otherwise. + */ + bool begin() { + _lcd = new Adafruit_LiquidCrystal(_sensorAddress, _i2c); + bool did_begin = _lcd->begin(_cols, _rows); + if (did_begin && _enable_backlight) { + _lcd->setBacklight(HIGH); + } + return did_begin; + } + + /*! + @brief Writes a message to the LCD. + @note MUST be called prior to begin() to configure the LCD's size + @param rows + The number of rows in the LCD. + @param cols + The number of columns in the LCD. + @param enable_backlight + True if the backlight is enabled, False otherwise. + */ + void ConfigureCharLcd(uint8_t rows, uint8_t cols, bool enable_backlight) { + _rows = rows; + _cols = cols; + _enable_backlight = enable_backlight; + } + + /*! + @brief Writes a message to the LCD. + @param message + The message to be displayed. + */ + void WriteMessage(const char *message) { + if (_lcd == nullptr) + return; + + // Before writing, let's clear the display + _lcd->clear(); + + // TODO: Remove all the prints! + // Print the message to the serial + Serial.print("Writing message to Char. LCD: "); + Serial.println(message); + + size_t message_length = strlen(message); + size_t cur_idx = 0; // Current index in the message + + // Write each row until it hits: \n, or the end of the message, or the last + // column/row position + for (int cur_row = 0; cur_row < _rows && cur_idx < message_length; + cur_row++) { + // Write each row out at the beginning of the row + _lcd->setCursor(0, cur_row); + for (int cur_col = 0; cur_col < _cols && cur_idx < message_length; + cur_col++) { + char c = message[cur_idx]; + if (c == '\\' && cur_idx + 1 < message_length && + message[cur_idx + 1] == 'n') { + cur_idx += 2; // Skip the '\n' character in the buffer + break; // and move to the next row + } else if (c == 194 && cur_idx + 1 < message_length && + message[cur_idx + 1] == 176) { + cur_idx += 2; // Skip the degree symbol sequence in the buffer + _lcd->write(0xDF); // and write the degree symbol + } else { + _lcd->write(c); + cur_idx++; + } + } + } + } + +protected: + Adafruit_LiquidCrystal *_lcd = + nullptr; ///< Pointer to the Adafruit_LiquidCrystal object + uint8_t _rows; ///< Number of rows in the display + uint8_t _cols; ///< Number of columns in the display + bool _enable_backlight; ///< Flag to enable/disable backlight +}; + +#endif // WIPPERSNAPPER_I2C_DRIVER_OUT_CHARLCD_H \ No newline at end of file From 00bb2bf62d0e3665eba2f4b7cfc4611e3fda6c4d Mon Sep 17 00:00:00 2001 From: brentru Date: Thu, 15 May 2025 11:28:58 -0400 Subject: [PATCH 05/34] Add 7seg driver --- src/components/i2c/WipperSnapper_I2C.cpp | 13 ++ src/components/i2c/WipperSnapper_I2C.h | 2 + .../WipperSnapper_I2C_Driver_Out_7Seg.h | 207 ++++++++++++++++++ 3 files changed, 222 insertions(+) create mode 100644 src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_7Seg.h diff --git a/src/components/i2c/WipperSnapper_I2C.cpp b/src/components/i2c/WipperSnapper_I2C.cpp index 9d90133ff..ec5dce428 100644 --- a/src/components/i2c/WipperSnapper_I2C.cpp +++ b/src/components/i2c/WipperSnapper_I2C.cpp @@ -865,6 +865,19 @@ bool WipperSnapper_Component_I2C::initI2CDevice( } _drivers_out.push_back(_charLcd); WS_DEBUG_PRINTLN("Char LCD Display Initialized Successfully!"); + } else if (strcmp("7seg", msgDeviceInitReq->i2c_device_name) == 0) { + _sevenSeg = new WipperSnapper_I2C_Driver_Out_7Seg(this->_i2c, i2cAddress); + _sevenSeg->ConfigureCharLcd( + msgDeviceInitReq->i2c_output_add.config.char_lcd_config.rows, + msgDeviceInitReq->i2c_output_add.config.char_lcd_config.columns, true); + if (!_sevenSeg->begin()) { + WS_DEBUG_PRINTLN("ERROR: Failed to initialize 7-Segement LED Matrix!"); + _busStatusResponse = + wippersnapper_i2c_v1_BusResponse_BUS_RESPONSE_DEVICE_INIT_FAIL; + return false; + } + _drivers_out.push_back(_sevenSeg); + WS_DEBUG_PRINTLN("7-Segement LED Matrix Initialized Successfully!"); } else { WS_DEBUG_PRINTLN("ERROR: I2C device type not found!") _busStatusResponse = diff --git a/src/components/i2c/WipperSnapper_I2C.h b/src/components/i2c/WipperSnapper_I2C.h index 8078d96ea..a5efd27f7 100644 --- a/src/components/i2c/WipperSnapper_I2C.h +++ b/src/components/i2c/WipperSnapper_I2C.h @@ -51,6 +51,7 @@ #include "drivers/WipperSnapper_I2C_Driver_MS8607.h" #include "drivers/WipperSnapper_I2C_Driver_NAU7802.h" #include "drivers/WipperSnapper_I2C_Driver_Out.h" +#include "drivers/WipperSnapper_I2C_Driver_Out_7Seg.h" #include "drivers/WipperSnapper_I2C_Driver_Out_CharLcd.h" #include "drivers/WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h" #include "drivers/WipperSnapper_I2C_Driver_PCT2075.h" @@ -201,6 +202,7 @@ class WipperSnapper_Component_I2C { WipperSnapper_I2C_Driver_ADT7410 *_adt7410 = nullptr; WipperSnapper_I2C_Driver_Out_QuadAlphaNum *_quadAlphaNum = nullptr; WipperSnapper_I2C_Driver_Out_CharLcd *_charLcd = nullptr; + WipperSnapper_I2C_Driver_Out_7Seg *_sevenSeg = nullptr; }; extern Wippersnapper WS; diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_7Seg.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_7Seg.h new file mode 100644 index 000000000..81d7408f5 --- /dev/null +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_7Seg.h @@ -0,0 +1,207 @@ +/*! + * @file WipperSnapper_I2C_Driver_Out_7Seg.h + * + * Device driver designed specifically to work with the Adafruit LED 7-Segment + * I2C backpacks: + * ----> http://www.adafruit.com/products/881 + * ----> http://www.adafruit.com/products/880 + * ----> http://www.adafruit.com/products/879 + * ----> http://www.adafruit.com/products/878 + * + * 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 for Adafruit Industries 2025 + * + * MIT license, all text here must be included in any redistribution. + * + */ + +#ifndef WIPPERSNAPPER_I2C_DRIVER_OUT_7SEG_H +#define WIPPERSNAPPER_I2C_DRIVER_OUT_7SEG_H + +#include "WipperSnapper_I2C_Driver_Out.h" +#include +#include + +#define LED_BACKPACK_ALIGNMENT_UNSPECIFIED 0 ///< Unspecified alignment +#define LED_BACKPACK_ALIGNMENT_LEFT 1 ///< Left alignment +#define LED_BACKPACK_ALIGNMENT_RIGHT 2 ///< Right alignment +#define LED_BACKPACK_ALIGNMENT_DEFAULT \ + LED_BACKPACK_ALIGNMENT_LEFT ///< Default alignment +#define LED_MAX_CHARS \ + 4 ///< Maximum number of characters to display on the alphanumeric display + + +/*! + @brief Class that provides a driver interface for 7-Segment + Displays w/I2C Backpack +*/ +class WipperSnapper_I2C_Driver_Out_7Seg : public WipperSnapper_I2C_Driver_Out { + +public: + /*******************************************************************************/ + /*! + @brief Constructor for a 7-Segment display driver. + @param i2c + The I2C interface. + @param sensorAddress + 7-bit device address. + */ + /*******************************************************************************/ + WipperSnapper_I2C_Driver_Out_7Seg(TwoWire *i2c, uint16_t sensorAddress) : WipperSnapper_I2C_Driver_Out(i2c, sensorAddress) { + _i2c = i2c; + _sensorAddress = sensorAddress; + } + + /*! + @brief Destructor for a 7-Segment display driver. + */ + ~WipperSnapper_I2C_Driver_Out_7Seg() { + if (_matrix != nullptr) { + delete _matrix; + _matrix = nullptr; + } + } + + /*! + @brief Initializes the 7-segment LED matrix and begins I2C + communication. + @returns True if initialized successfully, False otherwise. + */ + bool begin() { + _matrix = new Adafruit_7segment(); + bool did_begin = _matrix->begin(_sensorAddress, _i2c); + return did_begin; + } + + /*! + @brief Configures the LED matrix's I2C backpack. + @param brightness + The brightness of the i2c backpack (0-15). + @param alignment + The alignment of the i2c backpack's LED matrix (left/right). +*/ + void ConfigureI2CBackpack(int32_t brightness, uint32_t alignment) { + if (alignment == LED_BACKPACK_ALIGNMENT_RIGHT) { + _alignment = LED_BACKPACK_ALIGNMENT_RIGHT; + } else { + _alignment = LED_BACKPACK_ALIGNMENT_DEFAULT; + } + + // Note: Adafruit_LEDBackpack normalizes only > 15, but not < 0, + // so, here we're normalizing < 0 to 8 (median brightness) + if (brightness < 0) { + brightness = 8; // Set to median brightness if out of range + } + } + + /*! + @brief Sets the brightness of the LED backpack. + @param b + The brightness value, from 0 (off) to 15 (full brightness). + */ + void SetLedBackpackBrightness(uint8_t b) { + if (_matrix == nullptr) { + return; + } + _matrix->setBrightness(b); + } + + /*! + @brief Writes the first four characters of a message to the Adafruit + 7-segment LED matrix. + @param message + The message to be displayed. + */ + void WriteMessage(const char *message) { + if (_matrix == nullptr || message == nullptr) { + return; + } + + // Clear before writing + _matrix->clear(); + + // Calculate the number of characters to display + size_t len_display = min(strlen(message), (size_t)LED_MAX_CHARS); + + // Set the starting position based on alignment + int pos_start; + if (_alignment == LED_BACKPACK_ALIGNMENT_LEFT) { + pos_start = 0; // start at the leftmost position of the display + } else { + // Exclude decimal points from the character count because those get + // displayed on a "special" segment of the LED display + int seg_chars = 0; + for (size_t i = 0; i < len_display; i++) { + if (message[i] != '.') { + seg_chars++; + } + } + // start at the rightmost position of the display + pos_start = LED_MAX_CHARS - seg_chars; + } + + // Write to the display's buffer + int cur_idx = pos_start; + for (size_t i = 0; i < len_display; i++) { + // skip position 2 + if (cur_idx == 2) { + cur_idx++; + } + // Save the character because if there's a decimal, we need to skip it in + // the buffer + char ch = message[i]; + + // Look-ahead for a decimal point to attach to the current character + bool display_dot = false; + if (i + 1 < len_display && message[i + 1] == '.') { + display_dot = true; + i++; + len_display++; + } + + // Write the character to the display buffer + _matrix->writeDigitAscii(cur_idx, ch, display_dot); + cur_idx++; + } + // Issue the buffered data in RAM to the display + _matrix->writeDisplay(); + } + + /*! + @brief Writes a floating point value to the 7-segment display. + @param value + The value to be displayed. Only the first four digits are + displayed. + */ + void WriteValue(float value) { + char message[8 + 1]; + snprintf(message, sizeof(message), "%.2f", value); // Less precision for 7-segment + WriteMessage(message); + } + + /*! + @brief Writes an integer value to the 7-segment display. + @param value + The value to be displayed. Only the first four digits are + displayed. + */ + void WriteValue(int32_t value) { + char message[LED_MAX_CHARS + 1]; + snprintf(message, sizeof(message), "%ld", value); + WriteMessage(message); + } + +protected: + Adafruit_7segment *_matrix = + nullptr; ///< ptr to a 7-segment LED matrix object + int32_t _brightness; ///< Brightness of the LED backpack, from 0 (off) to 15 + ///< (full brightness) + uint32_t _alignment = + LED_BACKPACK_ALIGNMENT_DEFAULT; ///< Determines L/R alignment of the + ///< message displayed +}; + +#endif // WIPPERSNAPPER_I2C_DRIVER_OUT_7SEG_H \ No newline at end of file From f6c406ab867b1eec0f29a59a918c8bd15dd880de Mon Sep 17 00:00:00 2001 From: brentru Date: Thu, 15 May 2025 14:50:28 -0400 Subject: [PATCH 06/34] Clang --- ...ipperSnapper_I2C_Driver_Out_QuadAlphaNum.h | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h index e34ac112d..3b93431c3 100644 --- a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h @@ -28,12 +28,12 @@ #define LED_MAX_CHARS \ 4 ///< Maximum number of characters to display on the alphanumeric display - /*! @brief Class that provides a driver interface for Quad Alphanumeric Displays w/I2C Backpack */ -class WipperSnapper_I2C_Driver_Out_QuadAlphaNum : public WipperSnapper_I2C_Driver_Out { +class WipperSnapper_I2C_Driver_Out_QuadAlphaNum + : public WipperSnapper_I2C_Driver_Out { public: /*******************************************************************************/ @@ -45,7 +45,9 @@ class WipperSnapper_I2C_Driver_Out_QuadAlphaNum : public WipperSnapper_I2C_Drive 7-bit device address. */ /*******************************************************************************/ - WipperSnapper_I2C_Driver_Out_QuadAlphaNum(TwoWire *i2c, uint16_t sensorAddress) : WipperSnapper_I2C_Driver_Out(i2c, sensorAddress) { + WipperSnapper_I2C_Driver_Out_QuadAlphaNum(TwoWire *i2c, + uint16_t sensorAddress) + : WipperSnapper_I2C_Driver_Out(i2c, sensorAddress) { _i2c = i2c; _sensorAddress = sensorAddress; } @@ -53,12 +55,12 @@ class WipperSnapper_I2C_Driver_Out_QuadAlphaNum : public WipperSnapper_I2C_Drive /*! @brief Destructor for an MS8607 sensor. */ - ~WipperSnapper_I2C_Driver_Out_QuadAlphaNum() { + ~WipperSnapper_I2C_Driver_Out_QuadAlphaNum() { if (_alpha4 != nullptr) { delete _alpha4; _alpha4 = nullptr; } - } + } /*! @brief Initializes the drvOutQuadAlphaNum component and begins I2C. @@ -180,10 +182,13 @@ class WipperSnapper_I2C_Driver_Out_QuadAlphaNum : public WipperSnapper_I2C_Drive } protected: - Adafruit_AlphaNum4 *_alpha4 = nullptr; ///< ptr to a 4-digit alphanumeric display object + Adafruit_AlphaNum4 *_alpha4 = + nullptr; ///< ptr to a 4-digit alphanumeric display object int32_t _brightness; ///< Brightness of the LED backpack, from 0 (off) to 15 ///< (full brightness) - uint32_t _alignment = LED_BACKPACK_ALIGNMENT_DEFAULT; ///< Determines L/R alignment of the message displayed + uint32_t _alignment = + LED_BACKPACK_ALIGNMENT_DEFAULT; ///< Determines L/R alignment of the + ///< message displayed }; #endif // WIPPERSNAPPER_I2C_DRIVER_OUT_QUADALPHANUM_H \ No newline at end of file From a4d9e9d6eb6c6300d06f1565c7a0c53f95b1a341 Mon Sep 17 00:00:00 2001 From: brentru Date: Thu, 15 May 2025 15:20:27 -0400 Subject: [PATCH 07/34] clang again --- .../i2c/drivers/WipperSnapper_I2C_Driver_Out_7Seg.h | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_7Seg.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_7Seg.h index 81d7408f5..7a65aa32a 100644 --- a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_7Seg.h +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_7Seg.h @@ -33,7 +33,6 @@ #define LED_MAX_CHARS \ 4 ///< Maximum number of characters to display on the alphanumeric display - /*! @brief Class that provides a driver interface for 7-Segment Displays w/I2C Backpack @@ -50,7 +49,8 @@ class WipperSnapper_I2C_Driver_Out_7Seg : public WipperSnapper_I2C_Driver_Out { 7-bit device address. */ /*******************************************************************************/ - WipperSnapper_I2C_Driver_Out_7Seg(TwoWire *i2c, uint16_t sensorAddress) : WipperSnapper_I2C_Driver_Out(i2c, sensorAddress) { + WipperSnapper_I2C_Driver_Out_7Seg(TwoWire *i2c, uint16_t sensorAddress) + : WipperSnapper_I2C_Driver_Out(i2c, sensorAddress) { _i2c = i2c; _sensorAddress = sensorAddress; } @@ -58,12 +58,12 @@ class WipperSnapper_I2C_Driver_Out_7Seg : public WipperSnapper_I2C_Driver_Out { /*! @brief Destructor for a 7-Segment display driver. */ - ~WipperSnapper_I2C_Driver_Out_7Seg() { + ~WipperSnapper_I2C_Driver_Out_7Seg() { if (_matrix != nullptr) { delete _matrix; _matrix = nullptr; } - } + } /*! @brief Initializes the 7-segment LED matrix and begins I2C @@ -178,7 +178,8 @@ class WipperSnapper_I2C_Driver_Out_7Seg : public WipperSnapper_I2C_Driver_Out { */ void WriteValue(float value) { char message[8 + 1]; - snprintf(message, sizeof(message), "%.2f", value); // Less precision for 7-segment + snprintf(message, sizeof(message), "%.2f", + value); // Less precision for 7-segment WriteMessage(message); } From 420d319cc65696102a64ba99df0dfc1503ad7440 Mon Sep 17 00:00:00 2001 From: brentru Date: Fri, 16 May 2025 10:55:56 -0400 Subject: [PATCH 08/34] address @tyeth review --- platformio.ini | 2 +- src/Wippersnapper.cpp | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/platformio.ini b/platformio.ini index f3dd0b75a..94de74f94 100644 --- a/platformio.ini +++ b/platformio.ini @@ -81,6 +81,7 @@ lib_deps = adafruit/Adafruit TouchScreen adafruit/Adafruit MQTT Library bblanchon/ArduinoJson + adafruit/Adafruit LiquidCrystal https://github.com/pstolarz/OneWireNg.git https://github.com/milesburton/Arduino-Temperature-Control-Library.git https://github.com/Sensirion/arduino-sht.git @@ -91,7 +92,6 @@ lib_deps = https://github.com/Starmbi/hp_BH1750.git https://github.com/adafruit/Adafruit_TinyUSB_Arduino.git https://github.com/adafruit/Adafruit_LED_Backpack.git - https://github.com/adafruit/Adafruit_LiquidCrystal.git https://github.com/adafruit/Adafruit_PM25AQI.git diff --git a/src/Wippersnapper.cpp b/src/Wippersnapper.cpp index 7916ff379..65f47b4d9 100644 --- a/src/Wippersnapper.cpp +++ b/src/Wippersnapper.cpp @@ -884,7 +884,12 @@ bool cbDecodeSignalRequestI2C(pb_istream_t *stream, const pb_field_t *field, "[app] ERROR: Failed decoding I2CDeviceOutputWrite message."); return false; } - WS._i2cPort0->Handle_I2cDeviceOutputWrite(&msgDeviceWrite); + + if (!WS._i2cPort0->Handle_I2cDeviceOutputWrite(&msgDeviceWrite)) { + WS_DEBUG_PRINTLN("[app] ERROR: Failed to write to I2C output device."); + return false; // fail out if we can't decode, we don't have a response to + // publish + } WS_DEBUG_PRINTLN("[app] I2C Device Output Write Done"); } else { WS_DEBUG_PRINTLN("ERROR: Undefined I2C message tag"); From 3ae7029a51fc4c3d35c1534564a0ed2b0836344f Mon Sep 17 00:00:00 2001 From: brentru Date: Fri, 16 May 2025 15:58:21 -0400 Subject: [PATCH 09/34] Add new Pbs to match 6c842d81bf332dfc0fbfef4d2045c2d934e467f3 --- .../WipperSnapper_I2C_Driver_Out_Ssd1306.h | 83 ++++++++ .../description/v1/description.pb.c | 2 +- .../description/v1/description.pb.h | 2 +- src/wippersnapper/ds18x20/v1/ds18x20.pb.c | 2 +- src/wippersnapper/ds18x20/v1/ds18x20.pb.h | 2 +- src/wippersnapper/i2c/v1/i2c.pb.c | 12 +- src/wippersnapper/i2c/v1/i2c.pb.h | 183 ++++++++++-------- 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 +- 19 files changed, 207 insertions(+), 105 deletions(-) create mode 100644 src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h new file mode 100644 index 000000000..6bf151bfd --- /dev/null +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h @@ -0,0 +1,83 @@ +/*! + * @file WipperSnapper_I2C_Driver_Out_Ssd1306.h + * + * Device driver for SSD1306 Monochrome I2C OLED displays + * + * 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 for Adafruit Industries 2025 + * + * MIT license, all text here must be included in any redistribution. + * + */ + +#ifndef WIPPERSNAPPER_I2C_DRIVER_OUT_SSD1306_H +#define WIPPERSNAPPER_I2C_DRIVER_OUT_SSD1306_H + +#include "WipperSnapper_I2C_Driver_Out.h" +#include +#include + + +/*! + @brief Class that provides a driver interface for SSD1306 OLED displays +*/ +class WipperSnapper_I2C_Driver_Out_Ssd1306 + : public WipperSnapper_I2C_Driver_Out { + +public: + /*******************************************************************************/ + /*! + @brief Constructor for an SSD1306 display. + @param i2c + The I2C interface. + @param sensorAddress + 7-bit device address. + */ + /*******************************************************************************/ + WipperSnapper_I2C_Driver_Out_Ssd1306(TwoWire *i2c, + uint16_t sensorAddress) + : WipperSnapper_I2C_Driver_Out(i2c, sensorAddress) { + _i2c = i2c; + _sensorAddress = sensorAddress; + } + + /*! + @brief Destructor for an SSD1306 display. + */ + ~WipperSnapper_I2C_Driver_Out_Ssd1306() { + if (_display != nullptr) { + delete _display; + _display = nullptr; + } + } + + /*! + @brief Initializes the SSD1306 display and begins I2C. + @returns True if initialized successfully, False otherwise. + */ + bool begin() { + _display = new Adafruit_SSD1306(_width, _height, _i2c); + bool did_begin = _display->begin(SSD1306_SWITCHCAPVCC, _sensorAddress); + return did_begin; + } + + /*! + @brief Writes a message to an SSD1306 display. + @param message + The message to be displayed. + */ + void WriteMessage(const char *message) { + + } + +protected: + Adafruit_SSD1306 *_display = + nullptr; ///< ptr to an SSD1306 display object + int32_t _width; ///< Width of the display in pixels + int32_t _height; ///< Height of the display in pixels +}; + +#endif // WIPPERSNAPPER_I2C_DRIVER_OUT_SSD1306_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 c88a1fe0b..e82842f59 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 Wed May 14 16:42:42 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri May 16 18:09:01 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 cacf484dd..ee96254d5 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 Wed May 14 16:42:42 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri May 16 18:09:01 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/ds18x20/v1/ds18x20.pb.c b/src/wippersnapper/ds18x20/v1/ds18x20.pb.c index e201f8b02..1c177be00 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 Wed May 14 16:42:42 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri May 16 18:09:01 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 2a39648b5..6f1b65d40 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 Wed May 14 16:42:42 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri May 16 18:09:01 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 0d2595558..c1bbb686b 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 Wed May 14 16:42:42 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri May 16 18:09:01 2025. */ #include "wippersnapper/i2c/v1/i2c.pb.h" #if PB_PROTO_HEADER_VERSION != 40 @@ -57,7 +57,10 @@ PB_BIND(wippersnapper_i2c_v1_I2CDeviceOutputWrite, wippersnapper_i2c_v1_I2CDevic PB_BIND(wippersnapper_i2c_v1_LedBackpackConfig, wippersnapper_i2c_v1_LedBackpackConfig, AUTO) -PB_BIND(wippersnapper_i2c_v1_CharLCDConfig, wippersnapper_i2c_v1_CharLCDConfig, AUTO) +PB_BIND(wippersnapper_i2c_v1_CharLcdConfig, wippersnapper_i2c_v1_CharLcdConfig, AUTO) + + +PB_BIND(wippersnapper_i2c_v1_Ssd1306Config, wippersnapper_i2c_v1_Ssd1306Config, AUTO) PB_BIND(wippersnapper_i2c_v1_I2cOutputAdd, wippersnapper_i2c_v1_I2cOutputAdd, AUTO) @@ -66,7 +69,10 @@ PB_BIND(wippersnapper_i2c_v1_I2cOutputAdd, wippersnapper_i2c_v1_I2cOutputAdd, AU PB_BIND(wippersnapper_i2c_v1_LedBackpackWrite, wippersnapper_i2c_v1_LedBackpackWrite, AUTO) -PB_BIND(wippersnapper_i2c_v1_CharLCDWrite, wippersnapper_i2c_v1_CharLCDWrite, AUTO) +PB_BIND(wippersnapper_i2c_v1_CharLcdWrite, wippersnapper_i2c_v1_CharLcdWrite, AUTO) + + +PB_BIND(wippersnapper_i2c_v1_Ssd1306Write, wippersnapper_i2c_v1_Ssd1306Write, AUTO) diff --git a/src/wippersnapper/i2c/v1/i2c.pb.h b/src/wippersnapper/i2c/v1/i2c.pb.h index 2a6c84ea6..aa96c9067 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 Wed May 14 16:42:42 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri May 16 18:09:01 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 @@ -60,36 +60,33 @@ typedef enum _wippersnapper_i2c_v1_SensorType { wippersnapper_i2c_v1_SensorType_SENSOR_TYPE_TVOC = 35 } wippersnapper_i2c_v1_SensorType; -typedef enum _wippersnapper_i2c_v1_LedBackpackBlinkRate { - wippersnapper_i2c_v1_LedBackpackBlinkRate_LED_BACKPACK_BLINK_RATE_UNSPECIFIED = 0, - wippersnapper_i2c_v1_LedBackpackBlinkRate_LED_BACKPACK_BLINK_RATE_OFF = 1, - wippersnapper_i2c_v1_LedBackpackBlinkRate_LED_BACKPACK_BLINK_RATE_2HZ = 2, - wippersnapper_i2c_v1_LedBackpackBlinkRate_LED_BACKPACK_BLINK_RATE_1HZ = 3, - wippersnapper_i2c_v1_LedBackpackBlinkRate_LED_BACKPACK_BLINK_RATE_HALFHZ = 4 -} wippersnapper_i2c_v1_LedBackpackBlinkRate; - typedef enum _wippersnapper_i2c_v1_LedBackpackAlignment { wippersnapper_i2c_v1_LedBackpackAlignment_LED_BACKPACK_ALIGNMENT_UNSPECIFIED = 0, wippersnapper_i2c_v1_LedBackpackAlignment_LED_BACKPACK_ALIGNMENT_LEFT = 1, wippersnapper_i2c_v1_LedBackpackAlignment_LED_BACKPACK_ALIGNMENT_RIGHT = 2 } wippersnapper_i2c_v1_LedBackpackAlignment; +typedef enum _wippersnapper_i2c_v1_Ssd1306TextSize { + wippersnapper_i2c_v1_Ssd1306TextSize_SSD1306_TEXT_SIZE_UNSPECIFIED = 0, + wippersnapper_i2c_v1_Ssd1306TextSize_SSD1306_TEXT_SIZE_1 = 1, + wippersnapper_i2c_v1_Ssd1306TextSize_SSD1306_TEXT_SIZE_2 = 2, + wippersnapper_i2c_v1_Ssd1306TextSize_SSD1306_TEXT_SIZE_3 = 3 +} wippersnapper_i2c_v1_Ssd1306TextSize; + /* Struct definitions */ typedef struct _wippersnapper_i2c_v1_I2CDeviceInitRequests { pb_callback_t list; } wippersnapper_i2c_v1_I2CDeviceInitRequests; -typedef struct _wippersnapper_i2c_v1_CharLCDConfig { +typedef struct _wippersnapper_i2c_v1_CharLcdConfig { uint32_t rows; uint32_t columns; - char backlight_color[15]; -} wippersnapper_i2c_v1_CharLCDConfig; +} wippersnapper_i2c_v1_CharLcdConfig; -typedef struct _wippersnapper_i2c_v1_CharLCDWrite { +typedef struct _wippersnapper_i2c_v1_CharLcdWrite { char message[128]; - char backlight_color[16]; - bool enable_scroll; -} wippersnapper_i2c_v1_CharLCDWrite; + bool enable_backlight; +} wippersnapper_i2c_v1_CharLcdWrite; typedef struct _wippersnapper_i2c_v1_I2CBusInitRequest { int32_t i2c_pin_scl; @@ -144,17 +141,7 @@ typedef struct _wippersnapper_i2c_v1_LedBackpackConfig { } wippersnapper_i2c_v1_LedBackpackConfig; typedef struct _wippersnapper_i2c_v1_LedBackpackWrite { - pb_size_t which_message; - union { - char text[8]; - int32_t number_int; - float number_float; - } message; - bool adjust_brightness; - int32_t brightness; - wippersnapper_i2c_v1_LedBackpackBlinkRate blink_rate; - bool enable_scroll_marquee; - float scroll_marquee_speed; + char message[5]; } wippersnapper_i2c_v1_LedBackpackWrite; typedef struct _wippersnapper_i2c_v1_SensorEvent { @@ -162,6 +149,16 @@ typedef struct _wippersnapper_i2c_v1_SensorEvent { float value; } wippersnapper_i2c_v1_SensorEvent; +typedef struct _wippersnapper_i2c_v1_Ssd1306Config { + uint32_t width; + uint32_t height; + wippersnapper_i2c_v1_Ssd1306TextSize text_size; +} wippersnapper_i2c_v1_Ssd1306Config; + +typedef struct _wippersnapper_i2c_v1_Ssd1306Write { + char message[128]; +} wippersnapper_i2c_v1_Ssd1306Write; + typedef struct _wippersnapper_i2c_v1_I2CBusScanRequest { int32_t i2c_port_number; bool has_bus_init_request; @@ -180,7 +177,8 @@ typedef struct _wippersnapper_i2c_v1_I2CDeviceOutputWrite { pb_size_t which_output_msg; union { wippersnapper_i2c_v1_LedBackpackWrite write_led_backpack; - wippersnapper_i2c_v1_CharLCDWrite write_char_lcd; + wippersnapper_i2c_v1_CharLcdWrite write_char_lcd; + wippersnapper_i2c_v1_Ssd1306Write write_ssd1306; } output_msg; } wippersnapper_i2c_v1_I2CDeviceOutputWrite; @@ -196,7 +194,8 @@ typedef struct _wippersnapper_i2c_v1_I2cOutputAdd { pb_size_t which_config; union { wippersnapper_i2c_v1_LedBackpackConfig led_backpack_config; - wippersnapper_i2c_v1_CharLCDConfig char_lcd_config; + wippersnapper_i2c_v1_CharLcdConfig char_lcd_config; + wippersnapper_i2c_v1_Ssd1306Config ssd1306_config; } config; } wippersnapper_i2c_v1_I2cOutputAdd; @@ -223,14 +222,14 @@ typedef struct _wippersnapper_i2c_v1_I2CDeviceInitRequest { #define _wippersnapper_i2c_v1_SensorType_MAX wippersnapper_i2c_v1_SensorType_SENSOR_TYPE_TVOC #define _wippersnapper_i2c_v1_SensorType_ARRAYSIZE ((wippersnapper_i2c_v1_SensorType)(wippersnapper_i2c_v1_SensorType_SENSOR_TYPE_TVOC+1)) -#define _wippersnapper_i2c_v1_LedBackpackBlinkRate_MIN wippersnapper_i2c_v1_LedBackpackBlinkRate_LED_BACKPACK_BLINK_RATE_UNSPECIFIED -#define _wippersnapper_i2c_v1_LedBackpackBlinkRate_MAX wippersnapper_i2c_v1_LedBackpackBlinkRate_LED_BACKPACK_BLINK_RATE_HALFHZ -#define _wippersnapper_i2c_v1_LedBackpackBlinkRate_ARRAYSIZE ((wippersnapper_i2c_v1_LedBackpackBlinkRate)(wippersnapper_i2c_v1_LedBackpackBlinkRate_LED_BACKPACK_BLINK_RATE_HALFHZ+1)) - #define _wippersnapper_i2c_v1_LedBackpackAlignment_MIN wippersnapper_i2c_v1_LedBackpackAlignment_LED_BACKPACK_ALIGNMENT_UNSPECIFIED #define _wippersnapper_i2c_v1_LedBackpackAlignment_MAX wippersnapper_i2c_v1_LedBackpackAlignment_LED_BACKPACK_ALIGNMENT_RIGHT #define _wippersnapper_i2c_v1_LedBackpackAlignment_ARRAYSIZE ((wippersnapper_i2c_v1_LedBackpackAlignment)(wippersnapper_i2c_v1_LedBackpackAlignment_LED_BACKPACK_ALIGNMENT_RIGHT+1)) +#define _wippersnapper_i2c_v1_Ssd1306TextSize_MIN wippersnapper_i2c_v1_Ssd1306TextSize_SSD1306_TEXT_SIZE_UNSPECIFIED +#define _wippersnapper_i2c_v1_Ssd1306TextSize_MAX wippersnapper_i2c_v1_Ssd1306TextSize_SSD1306_TEXT_SIZE_3 +#define _wippersnapper_i2c_v1_Ssd1306TextSize_ARRAYSIZE ((wippersnapper_i2c_v1_Ssd1306TextSize)(wippersnapper_i2c_v1_Ssd1306TextSize_SSD1306_TEXT_SIZE_3+1)) + #ifdef __cplusplus extern "C" { @@ -254,10 +253,12 @@ extern "C" { #define wippersnapper_i2c_v1_I2CDeviceEvent_init_default {0, 0, {wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default}} #define wippersnapper_i2c_v1_I2CDeviceOutputWrite_init_default {0, "", 0, {wippersnapper_i2c_v1_LedBackpackWrite_init_default}} #define wippersnapper_i2c_v1_LedBackpackConfig_init_default {0, _wippersnapper_i2c_v1_LedBackpackAlignment_MIN} -#define wippersnapper_i2c_v1_CharLCDConfig_init_default {0, 0, ""} +#define wippersnapper_i2c_v1_CharLcdConfig_init_default {0, 0} +#define wippersnapper_i2c_v1_Ssd1306Config_init_default {0, 0, _wippersnapper_i2c_v1_Ssd1306TextSize_MIN} #define wippersnapper_i2c_v1_I2cOutputAdd_init_default {0, {wippersnapper_i2c_v1_LedBackpackConfig_init_default}} -#define wippersnapper_i2c_v1_LedBackpackWrite_init_default {0, {""}, 0, 0, _wippersnapper_i2c_v1_LedBackpackBlinkRate_MIN, 0, 0} -#define wippersnapper_i2c_v1_CharLCDWrite_init_default {"", "", 0} +#define wippersnapper_i2c_v1_LedBackpackWrite_init_default {""} +#define wippersnapper_i2c_v1_CharLcdWrite_init_default {"", 0} +#define wippersnapper_i2c_v1_Ssd1306Write_init_default {""} #define wippersnapper_i2c_v1_I2CBusInitRequest_init_zero {0, 0, 0, 0} #define wippersnapper_i2c_v1_I2CBusInitResponse_init_zero {_wippersnapper_i2c_v1_BusResponse_MIN} #define wippersnapper_i2c_v1_I2CBusSetFrequency_init_zero {0, 0} @@ -275,19 +276,19 @@ extern "C" { #define wippersnapper_i2c_v1_I2CDeviceEvent_init_zero {0, 0, {wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero}} #define wippersnapper_i2c_v1_I2CDeviceOutputWrite_init_zero {0, "", 0, {wippersnapper_i2c_v1_LedBackpackWrite_init_zero}} #define wippersnapper_i2c_v1_LedBackpackConfig_init_zero {0, _wippersnapper_i2c_v1_LedBackpackAlignment_MIN} -#define wippersnapper_i2c_v1_CharLCDConfig_init_zero {0, 0, ""} +#define wippersnapper_i2c_v1_CharLcdConfig_init_zero {0, 0} +#define wippersnapper_i2c_v1_Ssd1306Config_init_zero {0, 0, _wippersnapper_i2c_v1_Ssd1306TextSize_MIN} #define wippersnapper_i2c_v1_I2cOutputAdd_init_zero {0, {wippersnapper_i2c_v1_LedBackpackConfig_init_zero}} -#define wippersnapper_i2c_v1_LedBackpackWrite_init_zero {0, {""}, 0, 0, _wippersnapper_i2c_v1_LedBackpackBlinkRate_MIN, 0, 0} -#define wippersnapper_i2c_v1_CharLCDWrite_init_zero {"", "", 0} +#define wippersnapper_i2c_v1_LedBackpackWrite_init_zero {""} +#define wippersnapper_i2c_v1_CharLcdWrite_init_zero {"", 0} +#define wippersnapper_i2c_v1_Ssd1306Write_init_zero {""} /* Field tags (for use in manual encoding/decoding) */ #define wippersnapper_i2c_v1_I2CDeviceInitRequests_list_tag 1 -#define wippersnapper_i2c_v1_CharLCDConfig_rows_tag 1 -#define wippersnapper_i2c_v1_CharLCDConfig_columns_tag 2 -#define wippersnapper_i2c_v1_CharLCDConfig_backlight_color_tag 3 -#define wippersnapper_i2c_v1_CharLCDWrite_message_tag 1 -#define wippersnapper_i2c_v1_CharLCDWrite_backlight_color_tag 2 -#define wippersnapper_i2c_v1_CharLCDWrite_enable_scroll_tag 3 +#define wippersnapper_i2c_v1_CharLcdConfig_rows_tag 1 +#define wippersnapper_i2c_v1_CharLcdConfig_columns_tag 2 +#define wippersnapper_i2c_v1_CharLcdWrite_message_tag 1 +#define wippersnapper_i2c_v1_CharLcdWrite_enable_backlight_tag 2 #define wippersnapper_i2c_v1_I2CBusInitRequest_i2c_pin_scl_tag 1 #define wippersnapper_i2c_v1_I2CBusInitRequest_i2c_pin_sda_tag 2 #define wippersnapper_i2c_v1_I2CBusInitRequest_i2c_frequency_tag 3 @@ -309,16 +310,13 @@ extern "C" { #define wippersnapper_i2c_v1_I2CDeviceUpdateResponse_bus_response_tag 3 #define wippersnapper_i2c_v1_LedBackpackConfig_brightness_tag 1 #define wippersnapper_i2c_v1_LedBackpackConfig_alignment_tag 2 -#define wippersnapper_i2c_v1_LedBackpackWrite_text_tag 1 -#define wippersnapper_i2c_v1_LedBackpackWrite_number_int_tag 2 -#define wippersnapper_i2c_v1_LedBackpackWrite_number_float_tag 3 -#define wippersnapper_i2c_v1_LedBackpackWrite_adjust_brightness_tag 4 -#define wippersnapper_i2c_v1_LedBackpackWrite_brightness_tag 5 -#define wippersnapper_i2c_v1_LedBackpackWrite_blink_rate_tag 6 -#define wippersnapper_i2c_v1_LedBackpackWrite_enable_scroll_marquee_tag 7 -#define wippersnapper_i2c_v1_LedBackpackWrite_scroll_marquee_speed_tag 8 +#define wippersnapper_i2c_v1_LedBackpackWrite_message_tag 1 #define wippersnapper_i2c_v1_SensorEvent_type_tag 1 #define wippersnapper_i2c_v1_SensorEvent_value_tag 2 +#define wippersnapper_i2c_v1_Ssd1306Config_width_tag 1 +#define wippersnapper_i2c_v1_Ssd1306Config_height_tag 2 +#define wippersnapper_i2c_v1_Ssd1306Config_text_size_tag 3 +#define wippersnapper_i2c_v1_Ssd1306Write_message_tag 1 #define wippersnapper_i2c_v1_I2CBusScanRequest_i2c_port_number_tag 1 #define wippersnapper_i2c_v1_I2CBusScanRequest_bus_init_request_tag 2 #define wippersnapper_i2c_v1_I2CDeviceEvent_sensor_address_tag 1 @@ -327,12 +325,14 @@ extern "C" { #define wippersnapper_i2c_v1_I2CDeviceOutputWrite_i2c_device_name_tag 2 #define wippersnapper_i2c_v1_I2CDeviceOutputWrite_write_led_backpack_tag 3 #define wippersnapper_i2c_v1_I2CDeviceOutputWrite_write_char_lcd_tag 4 +#define wippersnapper_i2c_v1_I2CDeviceOutputWrite_write_ssd1306_tag 5 #define wippersnapper_i2c_v1_I2CDeviceUpdateRequest_i2c_port_number_tag 1 #define wippersnapper_i2c_v1_I2CDeviceUpdateRequest_i2c_device_address_tag 2 #define wippersnapper_i2c_v1_I2CDeviceUpdateRequest_i2c_device_name_tag 3 #define wippersnapper_i2c_v1_I2CDeviceUpdateRequest_i2c_device_properties_tag 4 #define wippersnapper_i2c_v1_I2cOutputAdd_led_backpack_config_tag 1 #define wippersnapper_i2c_v1_I2cOutputAdd_char_lcd_config_tag 2 +#define wippersnapper_i2c_v1_I2cOutputAdd_ssd1306_config_tag 3 #define wippersnapper_i2c_v1_I2CDeviceInitRequest_i2c_port_number_tag 1 #define wippersnapper_i2c_v1_I2CDeviceInitRequest_i2c_bus_init_req_tag 2 #define wippersnapper_i2c_v1_I2CDeviceInitRequest_i2c_device_address_tag 3 @@ -450,11 +450,13 @@ X(a, STATIC, REPEATED, MESSAGE, sensor_event, 2) X(a, STATIC, SINGULAR, UINT32, i2c_device_address, 1) \ X(a, STATIC, SINGULAR, STRING, i2c_device_name, 2) \ X(a, STATIC, ONEOF, MESSAGE, (output_msg,write_led_backpack,output_msg.write_led_backpack), 3) \ -X(a, STATIC, ONEOF, MESSAGE, (output_msg,write_char_lcd,output_msg.write_char_lcd), 4) +X(a, STATIC, ONEOF, MESSAGE, (output_msg,write_char_lcd,output_msg.write_char_lcd), 4) \ +X(a, STATIC, ONEOF, MESSAGE, (output_msg,write_ssd1306,output_msg.write_ssd1306), 5) #define wippersnapper_i2c_v1_I2CDeviceOutputWrite_CALLBACK NULL #define wippersnapper_i2c_v1_I2CDeviceOutputWrite_DEFAULT NULL #define wippersnapper_i2c_v1_I2CDeviceOutputWrite_output_msg_write_led_backpack_MSGTYPE wippersnapper_i2c_v1_LedBackpackWrite -#define wippersnapper_i2c_v1_I2CDeviceOutputWrite_output_msg_write_char_lcd_MSGTYPE wippersnapper_i2c_v1_CharLCDWrite +#define wippersnapper_i2c_v1_I2CDeviceOutputWrite_output_msg_write_char_lcd_MSGTYPE wippersnapper_i2c_v1_CharLcdWrite +#define wippersnapper_i2c_v1_I2CDeviceOutputWrite_output_msg_write_ssd1306_MSGTYPE wippersnapper_i2c_v1_Ssd1306Write #define wippersnapper_i2c_v1_LedBackpackConfig_FIELDLIST(X, a) \ X(a, STATIC, SINGULAR, INT32, brightness, 1) \ @@ -462,39 +464,44 @@ X(a, STATIC, SINGULAR, UENUM, alignment, 2) #define wippersnapper_i2c_v1_LedBackpackConfig_CALLBACK NULL #define wippersnapper_i2c_v1_LedBackpackConfig_DEFAULT NULL -#define wippersnapper_i2c_v1_CharLCDConfig_FIELDLIST(X, a) \ +#define wippersnapper_i2c_v1_CharLcdConfig_FIELDLIST(X, a) \ X(a, STATIC, SINGULAR, UINT32, rows, 1) \ -X(a, STATIC, SINGULAR, UINT32, columns, 2) \ -X(a, STATIC, SINGULAR, STRING, backlight_color, 3) -#define wippersnapper_i2c_v1_CharLCDConfig_CALLBACK NULL -#define wippersnapper_i2c_v1_CharLCDConfig_DEFAULT NULL +X(a, STATIC, SINGULAR, UINT32, columns, 2) +#define wippersnapper_i2c_v1_CharLcdConfig_CALLBACK NULL +#define wippersnapper_i2c_v1_CharLcdConfig_DEFAULT NULL + +#define wippersnapper_i2c_v1_Ssd1306Config_FIELDLIST(X, a) \ +X(a, STATIC, SINGULAR, UINT32, width, 1) \ +X(a, STATIC, SINGULAR, UINT32, height, 2) \ +X(a, STATIC, SINGULAR, UENUM, text_size, 3) +#define wippersnapper_i2c_v1_Ssd1306Config_CALLBACK NULL +#define wippersnapper_i2c_v1_Ssd1306Config_DEFAULT NULL #define wippersnapper_i2c_v1_I2cOutputAdd_FIELDLIST(X, a) \ X(a, STATIC, ONEOF, MESSAGE, (config,led_backpack_config,config.led_backpack_config), 1) \ -X(a, STATIC, ONEOF, MESSAGE, (config,char_lcd_config,config.char_lcd_config), 2) +X(a, STATIC, ONEOF, MESSAGE, (config,char_lcd_config,config.char_lcd_config), 2) \ +X(a, STATIC, ONEOF, MESSAGE, (config,ssd1306_config,config.ssd1306_config), 3) #define wippersnapper_i2c_v1_I2cOutputAdd_CALLBACK NULL #define wippersnapper_i2c_v1_I2cOutputAdd_DEFAULT NULL #define wippersnapper_i2c_v1_I2cOutputAdd_config_led_backpack_config_MSGTYPE wippersnapper_i2c_v1_LedBackpackConfig -#define wippersnapper_i2c_v1_I2cOutputAdd_config_char_lcd_config_MSGTYPE wippersnapper_i2c_v1_CharLCDConfig +#define wippersnapper_i2c_v1_I2cOutputAdd_config_char_lcd_config_MSGTYPE wippersnapper_i2c_v1_CharLcdConfig +#define wippersnapper_i2c_v1_I2cOutputAdd_config_ssd1306_config_MSGTYPE wippersnapper_i2c_v1_Ssd1306Config #define wippersnapper_i2c_v1_LedBackpackWrite_FIELDLIST(X, a) \ -X(a, STATIC, ONEOF, STRING, (message,text,message.text), 1) \ -X(a, STATIC, ONEOF, INT32, (message,number_int,message.number_int), 2) \ -X(a, STATIC, ONEOF, FLOAT, (message,number_float,message.number_float), 3) \ -X(a, STATIC, SINGULAR, BOOL, adjust_brightness, 4) \ -X(a, STATIC, SINGULAR, INT32, brightness, 5) \ -X(a, STATIC, SINGULAR, UENUM, blink_rate, 6) \ -X(a, STATIC, SINGULAR, BOOL, enable_scroll_marquee, 7) \ -X(a, STATIC, SINGULAR, FLOAT, scroll_marquee_speed, 8) +X(a, STATIC, SINGULAR, STRING, message, 1) #define wippersnapper_i2c_v1_LedBackpackWrite_CALLBACK NULL #define wippersnapper_i2c_v1_LedBackpackWrite_DEFAULT NULL -#define wippersnapper_i2c_v1_CharLCDWrite_FIELDLIST(X, a) \ +#define wippersnapper_i2c_v1_CharLcdWrite_FIELDLIST(X, a) \ X(a, STATIC, SINGULAR, STRING, message, 1) \ -X(a, STATIC, SINGULAR, STRING, backlight_color, 2) \ -X(a, STATIC, SINGULAR, BOOL, enable_scroll, 3) -#define wippersnapper_i2c_v1_CharLCDWrite_CALLBACK NULL -#define wippersnapper_i2c_v1_CharLCDWrite_DEFAULT NULL +X(a, STATIC, SINGULAR, BOOL, enable_backlight, 2) +#define wippersnapper_i2c_v1_CharLcdWrite_CALLBACK NULL +#define wippersnapper_i2c_v1_CharLcdWrite_DEFAULT NULL + +#define wippersnapper_i2c_v1_Ssd1306Write_FIELDLIST(X, a) \ +X(a, STATIC, SINGULAR, STRING, message, 1) +#define wippersnapper_i2c_v1_Ssd1306Write_CALLBACK NULL +#define wippersnapper_i2c_v1_Ssd1306Write_DEFAULT NULL extern const pb_msgdesc_t wippersnapper_i2c_v1_I2CBusInitRequest_msg; extern const pb_msgdesc_t wippersnapper_i2c_v1_I2CBusInitResponse_msg; @@ -513,10 +520,12 @@ extern const pb_msgdesc_t wippersnapper_i2c_v1_SensorEvent_msg; extern const pb_msgdesc_t wippersnapper_i2c_v1_I2CDeviceEvent_msg; extern const pb_msgdesc_t wippersnapper_i2c_v1_I2CDeviceOutputWrite_msg; extern const pb_msgdesc_t wippersnapper_i2c_v1_LedBackpackConfig_msg; -extern const pb_msgdesc_t wippersnapper_i2c_v1_CharLCDConfig_msg; +extern const pb_msgdesc_t wippersnapper_i2c_v1_CharLcdConfig_msg; +extern const pb_msgdesc_t wippersnapper_i2c_v1_Ssd1306Config_msg; extern const pb_msgdesc_t wippersnapper_i2c_v1_I2cOutputAdd_msg; extern const pb_msgdesc_t wippersnapper_i2c_v1_LedBackpackWrite_msg; -extern const pb_msgdesc_t wippersnapper_i2c_v1_CharLCDWrite_msg; +extern const pb_msgdesc_t wippersnapper_i2c_v1_CharLcdWrite_msg; +extern const pb_msgdesc_t wippersnapper_i2c_v1_Ssd1306Write_msg; /* Defines for backwards compatibility with code written before nanopb-0.4.0 */ #define wippersnapper_i2c_v1_I2CBusInitRequest_fields &wippersnapper_i2c_v1_I2CBusInitRequest_msg @@ -536,10 +545,12 @@ extern const pb_msgdesc_t wippersnapper_i2c_v1_CharLCDWrite_msg; #define wippersnapper_i2c_v1_I2CDeviceEvent_fields &wippersnapper_i2c_v1_I2CDeviceEvent_msg #define wippersnapper_i2c_v1_I2CDeviceOutputWrite_fields &wippersnapper_i2c_v1_I2CDeviceOutputWrite_msg #define wippersnapper_i2c_v1_LedBackpackConfig_fields &wippersnapper_i2c_v1_LedBackpackConfig_msg -#define wippersnapper_i2c_v1_CharLCDConfig_fields &wippersnapper_i2c_v1_CharLCDConfig_msg +#define wippersnapper_i2c_v1_CharLcdConfig_fields &wippersnapper_i2c_v1_CharLcdConfig_msg +#define wippersnapper_i2c_v1_Ssd1306Config_fields &wippersnapper_i2c_v1_Ssd1306Config_msg #define wippersnapper_i2c_v1_I2cOutputAdd_fields &wippersnapper_i2c_v1_I2cOutputAdd_msg #define wippersnapper_i2c_v1_LedBackpackWrite_fields &wippersnapper_i2c_v1_LedBackpackWrite_msg -#define wippersnapper_i2c_v1_CharLCDWrite_fields &wippersnapper_i2c_v1_CharLCDWrite_msg +#define wippersnapper_i2c_v1_CharLcdWrite_fields &wippersnapper_i2c_v1_CharLcdWrite_msg +#define wippersnapper_i2c_v1_Ssd1306Write_fields &wippersnapper_i2c_v1_Ssd1306Write_msg /* Maximum encoded size of messages (where known) */ #define wippersnapper_i2c_v1_I2CBusInitRequest_size 39 @@ -549,7 +560,7 @@ extern const pb_msgdesc_t wippersnapper_i2c_v1_CharLCDWrite_msg; #define wippersnapper_i2c_v1_I2CBusScanResponse_size 722 #define wippersnapper_i2c_v1_I2CDeviceSensorProperties_size 8 /* wippersnapper_i2c_v1_I2CDeviceInitRequests_size depends on runtime parameters */ -#define wippersnapper_i2c_v1_I2CDeviceInitRequest_size 258 +#define wippersnapper_i2c_v1_I2CDeviceInitRequest_size 244 #define wippersnapper_i2c_v1_I2CDeviceInitResponse_size 8 #define wippersnapper_i2c_v1_I2CDeviceUpdateRequest_size 183 #define wippersnapper_i2c_v1_I2CDeviceUpdateResponse_size 8 @@ -557,12 +568,14 @@ extern const pb_msgdesc_t wippersnapper_i2c_v1_CharLCDWrite_msg; #define wippersnapper_i2c_v1_I2CDeviceDeinitResponse_size 8 #define wippersnapper_i2c_v1_SensorEvent_size 7 #define wippersnapper_i2c_v1_I2CDeviceEvent_size 141 -#define wippersnapper_i2c_v1_I2CDeviceOutputWrite_size 174 +#define wippersnapper_i2c_v1_I2CDeviceOutputWrite_size 157 #define wippersnapper_i2c_v1_LedBackpackConfig_size 13 -#define wippersnapper_i2c_v1_CharLCDConfig_size 28 -#define wippersnapper_i2c_v1_I2cOutputAdd_size 30 -#define wippersnapper_i2c_v1_LedBackpackWrite_size 33 -#define wippersnapper_i2c_v1_CharLCDWrite_size 149 +#define wippersnapper_i2c_v1_CharLcdConfig_size 12 +#define wippersnapper_i2c_v1_Ssd1306Config_size 14 +#define wippersnapper_i2c_v1_I2cOutputAdd_size 16 +#define wippersnapper_i2c_v1_LedBackpackWrite_size 6 +#define wippersnapper_i2c_v1_CharLcdWrite_size 132 +#define wippersnapper_i2c_v1_Ssd1306Write_size 130 #ifdef __cplusplus } /* extern "C" */ diff --git a/src/wippersnapper/pin/v1/pin.pb.c b/src/wippersnapper/pin/v1/pin.pb.c index 95b69bba8..46c277f2c 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 Wed May 14 16:42:42 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri May 16 18:09:01 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 85d28f76e..493b5bac2 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 Wed May 14 16:42:42 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri May 16 18:09:01 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 0291bee02..d43ba587d 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 Wed May 14 16:42:42 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri May 16 18:09:01 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 f2e8c5900..befb4bcca 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 Wed May 14 16:42:42 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri May 16 18:09:01 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 2d8a5bd50..c407b296b 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 Wed May 14 16:42:42 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri May 16 18:09:01 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 c2e0a5ca0..a53b8952c 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 Wed May 14 16:42:42 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri May 16 18:09:01 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 201bca4ca..9580ee2cd 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 Wed May 14 16:42:42 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri May 16 18:09:01 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 26da57b73..7eacc8b27 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 Wed May 14 16:42:42 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri May 16 18:09:01 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 4c8cff799..3bb465b1b 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 Wed May 14 16:42:42 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri May 16 18:09:01 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 f5d3d6df9..668f1f700 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 Wed May 14 16:42:42 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri May 16 18:09:01 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 @@ -397,7 +397,7 @@ extern const pb_msgdesc_t wippersnapper_signal_v1_PWMResponse_msg; #define wippersnapper_signal_v1_Ds18x20Request_size 39 #define wippersnapper_signal_v1_Ds18x20Response_size 26 #if defined(wippersnapper_i2c_v1_I2CDeviceInitRequests_size) -union wippersnapper_signal_v1_I2CRequest_payload_size_union {char f7[(6 + wippersnapper_i2c_v1_I2CDeviceInitRequests_size)]; char f0[261];}; +union wippersnapper_signal_v1_I2CRequest_payload_size_union {char f7[(6 + wippersnapper_i2c_v1_I2CDeviceInitRequests_size)]; char f0[247];}; #define wippersnapper_signal_v1_I2CRequest_size (0 + sizeof(union wippersnapper_signal_v1_I2CRequest_payload_size_union)) #endif #define wippersnapper_signal_v1_I2CResponse_size 725 diff --git a/src/wippersnapper/uart/v1/uart.pb.c b/src/wippersnapper/uart/v1/uart.pb.c index d7bd66036..7be53db8b 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 Wed May 14 16:42:42 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri May 16 18:09:01 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 3e0ec039e..a42d2c16a 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 Wed May 14 16:42:42 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri May 16 18:09:01 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 c470fa30931498bc7c2129fa413d2d9dc114a3a9 Mon Sep 17 00:00:00 2001 From: brentru Date: Fri, 16 May 2025 16:53:47 -0400 Subject: [PATCH 10/34] Tie in enable/disable for charlcd writes --- src/components/i2c/WipperSnapper_I2C.cpp | 8 +- .../drivers/WipperSnapper_I2C_Driver_Out.h | 66 ++++----------- .../WipperSnapper_I2C_Driver_Out_7Seg.h | 25 ------ .../WipperSnapper_I2C_Driver_Out_CharLcd.h | 37 +++++---- ...ipperSnapper_I2C_Driver_Out_QuadAlphaNum.h | 24 ------ .../WipperSnapper_I2C_Driver_Out_Ssd1306.h | 83 ------------------- 6 files changed, 41 insertions(+), 202 deletions(-) delete mode 100644 src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h diff --git a/src/components/i2c/WipperSnapper_I2C.cpp b/src/components/i2c/WipperSnapper_I2C.cpp index ec5dce428..1f6c4034f 100644 --- a/src/components/i2c/WipperSnapper_I2C.cpp +++ b/src/components/i2c/WipperSnapper_I2C.cpp @@ -856,7 +856,7 @@ bool WipperSnapper_Component_I2C::initI2CDevice( _charLcd = new WipperSnapper_I2C_Driver_Out_CharLcd(this->_i2c, i2cAddress); _charLcd->ConfigureCharLcd( msgDeviceInitReq->i2c_output_add.config.char_lcd_config.rows, - msgDeviceInitReq->i2c_output_add.config.char_lcd_config.columns, true); + msgDeviceInitReq->i2c_output_add.config.char_lcd_config.columns); if (!_charLcd->begin()) { WS_DEBUG_PRINTLN("ERROR: Failed to initialize Character LCD!"); _busStatusResponse = @@ -867,9 +867,9 @@ bool WipperSnapper_Component_I2C::initI2CDevice( WS_DEBUG_PRINTLN("Char LCD Display Initialized Successfully!"); } else if (strcmp("7seg", msgDeviceInitReq->i2c_device_name) == 0) { _sevenSeg = new WipperSnapper_I2C_Driver_Out_7Seg(this->_i2c, i2cAddress); - _sevenSeg->ConfigureCharLcd( - msgDeviceInitReq->i2c_output_add.config.char_lcd_config.rows, - msgDeviceInitReq->i2c_output_add.config.char_lcd_config.columns, true); + _sevenSeg->ConfigureI2CBackpack( + msgDeviceInitReq->i2c_output_add.config.led_backpack_config.brightness, + msgDeviceInitReq->i2c_output_add.config.led_backpack_config.alignment); if (!_sevenSeg->begin()) { WS_DEBUG_PRINTLN("ERROR: Failed to initialize 7-Segement LED Matrix!"); _busStatusResponse = diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h index f68e9fad3..b8d8ec702 100644 --- a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h @@ -53,26 +53,6 @@ class WipperSnapper_I2C_Driver_Out : public WipperSnapper_I2C_Driver { // noop } - /*! - @brief Writes a floating point value to an i2c output device. - @param value - The value to be displayed. Only the first four digits are - displayed. - */ - virtual void WriteValue(float value) { - // noop - } - - /*! - @brief Writes a floating point value to an i2c output device. - @param value - The value to be displayed. Only the first four digits are - displayed. - */ - virtual void WriteValue(int32_t value) { - // noop - } - /*! @brief Configures a LED backpack. @param brightness @@ -100,29 +80,10 @@ class WipperSnapper_I2C_Driver_Out : public WipperSnapper_I2C_Driver { @returns True if the message was written successfully, False otherwise. */ bool WriteLedBackpack(wippersnapper_i2c_v1_LedBackpackWrite *msg_write) { - // Check if we should adjust brightness if (msg_write->adjust_brightness) SetLedBackpackBrightness((uint8_t)msg_write->brightness); - // Write the message to a LED backpack - switch (msg_write->which_message) { - case wippersnapper_i2c_v1_LedBackpackWrite_text_tag: - WS_DEBUG_PRINTLN("[i2c] Writing text to LED backpack..."); - WriteMessage(msg_write->message.text); - break; - case wippersnapper_i2c_v1_LedBackpackWrite_number_int_tag: - WS_DEBUG_PRINTLN("[i2c] Writing int to LED backpack..."); - WriteValue(msg_write->message.number_int); - break; - case wippersnapper_i2c_v1_LedBackpackWrite_number_float_tag: - WS_DEBUG_PRINTLN("[i2c] Writing float to LED backpack..."); - WriteValue(msg_write->message.number_float); - break; - default: - WS_DEBUG_PRINTLN("[i2c] ERROR: Unable to determine message type!"); - return false; - break; - } + WriteMessage(msg_write->message.text); return true; } @@ -132,11 +93,17 @@ class WipperSnapper_I2C_Driver_Out : public WipperSnapper_I2C_Driver { The number of rows in the LCD. @param cols The number of columns in the LCD. - @param enable_backlight - True if the backlight is enabled, False otherwise. */ - virtual void ConfigureCharLcd(uint32_t rows, uint32_t cols, - bool enable_backlight) { + virtual void ConfigureCharLcd(uint32_t rows, uint32_t cols) { + // noop + } + + /*! + @brief Turns the character LCD backlight on or off. + @param enable + True to enable the backlight, false to disable it. + */ + void EnableCharLcdBacklight(bool enable) { // noop } @@ -144,14 +111,13 @@ class WipperSnapper_I2C_Driver_Out : public WipperSnapper_I2C_Driver { @brief Writes a message to the LCD. @param write_char_lcd Points to a CharLCDWrite message. - @returns True if the message was written successfully, False otherwise. + @param enable_backlight + True if the backlight should be enabled, false otherwise. */ - bool WriteMessageCharLCD(wippersnapper_i2c_v1_CharLCDWrite *write_char_lcd) { + void WriteMessageCharLCD(wippersnapper_i2c_v1_CharLcdWrite *write_char_lcd, + bool enable_backlight = true) { + EnableCharLcdBacklight(enable_backlight); WriteMessage(write_char_lcd->message); - // NOTE: While this isn't calling any other funcs in here and ret'ing true, - // I want to keep this function high-level for when we implement backlight - // color and scrolling. - return true; } }; diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_7Seg.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_7Seg.h index 7a65aa32a..e96b77600 100644 --- a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_7Seg.h +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_7Seg.h @@ -170,31 +170,6 @@ class WipperSnapper_I2C_Driver_Out_7Seg : public WipperSnapper_I2C_Driver_Out { _matrix->writeDisplay(); } - /*! - @brief Writes a floating point value to the 7-segment display. - @param value - The value to be displayed. Only the first four digits are - displayed. - */ - void WriteValue(float value) { - char message[8 + 1]; - snprintf(message, sizeof(message), "%.2f", - value); // Less precision for 7-segment - WriteMessage(message); - } - - /*! - @brief Writes an integer value to the 7-segment display. - @param value - The value to be displayed. Only the first four digits are - displayed. - */ - void WriteValue(int32_t value) { - char message[LED_MAX_CHARS + 1]; - snprintf(message, sizeof(message), "%ld", value); - WriteMessage(message); - } - protected: Adafruit_7segment *_matrix = nullptr; ///< ptr to a 7-segment LED matrix object diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_CharLcd.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_CharLcd.h index 3b803a569..cb398f80f 100644 --- a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_CharLcd.h +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_CharLcd.h @@ -27,7 +27,6 @@ class WipperSnapper_I2C_Driver_Out_CharLcd : public WipperSnapper_I2C_Driver_Out { public: - /*******************************************************************************/ /*! @brief Constructor for a LCD character display. @param i2c @@ -35,7 +34,6 @@ class WipperSnapper_I2C_Driver_Out_CharLcd @param sensorAddress 7-bit device address. */ - /*******************************************************************************/ WipperSnapper_I2C_Driver_Out_CharLcd(TwoWire *i2c, uint16_t sensorAddress) : WipperSnapper_I2C_Driver_Out(i2c, sensorAddress) { _i2c = i2c; @@ -59,7 +57,7 @@ class WipperSnapper_I2C_Driver_Out_CharLcd bool begin() { _lcd = new Adafruit_LiquidCrystal(_sensorAddress, _i2c); bool did_begin = _lcd->begin(_cols, _rows); - if (did_begin && _enable_backlight) { + if (did_begin) { _lcd->setBacklight(HIGH); } return did_begin; @@ -72,13 +70,26 @@ class WipperSnapper_I2C_Driver_Out_CharLcd The number of rows in the LCD. @param cols The number of columns in the LCD. - @param enable_backlight - True if the backlight is enabled, False otherwise. */ - void ConfigureCharLcd(uint8_t rows, uint8_t cols, bool enable_backlight) { + void ConfigureCharLcd(uint8_t rows, uint8_t cols) { _rows = rows; _cols = cols; - _enable_backlight = enable_backlight; + } + + /*! + @brief Turns the character LCD backlight on or off. + @param enable + True to enable the backlight, false to disable it. + */ + void EnableCharLcdBacklight(bool enable) { + if (_lcd == nullptr) + return; + + if (enable) { + _lcd->setBacklight(HIGH); + } else { + _lcd->setBacklight(LOW); + } } /*! @@ -93,11 +104,6 @@ class WipperSnapper_I2C_Driver_Out_CharLcd // Before writing, let's clear the display _lcd->clear(); - // TODO: Remove all the prints! - // Print the message to the serial - Serial.print("Writing message to Char. LCD: "); - Serial.println(message); - size_t message_length = strlen(message); size_t cur_idx = 0; // Current index in the message @@ -128,10 +134,9 @@ class WipperSnapper_I2C_Driver_Out_CharLcd protected: Adafruit_LiquidCrystal *_lcd = - nullptr; ///< Pointer to the Adafruit_LiquidCrystal object - uint8_t _rows; ///< Number of rows in the display - uint8_t _cols; ///< Number of columns in the display - bool _enable_backlight; ///< Flag to enable/disable backlight + nullptr; ///< Pointer to the Adafruit_LiquidCrystal object + uint8_t _rows; ///< Number of rows in the display + uint8_t _cols; ///< Number of columns in the display }; #endif // WIPPERSNAPPER_I2C_DRIVER_OUT_CHARLCD_H \ No newline at end of file diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h index 3b93431c3..20f12d386 100644 --- a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h @@ -157,30 +157,6 @@ class WipperSnapper_I2C_Driver_Out_QuadAlphaNum _alpha4->writeDisplay(); } - /*! - @brief Writes a floating point value to the quad alphanumeric display. - @param value - The value to be displayed. Only the first four digits are - displayed. - */ - void WriteValue(float value) { - char message[8 + 1]; - snprintf(message, sizeof(message), "%.5f", value); - WriteMessage(message); - } - - /*! - @brief Writes an integer value to the quad alphanumeric display. - @param value - The value to be displayed. Only the first four digits are - displayed. - */ - void WriteValue(int32_t value) { - char message[LED_MAX_CHARS + 1]; - snprintf(message, sizeof(message), "%ld", value); - WriteMessage(message); - } - protected: Adafruit_AlphaNum4 *_alpha4 = nullptr; ///< ptr to a 4-digit alphanumeric display object diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h deleted file mode 100644 index 6bf151bfd..000000000 --- a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h +++ /dev/null @@ -1,83 +0,0 @@ -/*! - * @file WipperSnapper_I2C_Driver_Out_Ssd1306.h - * - * Device driver for SSD1306 Monochrome I2C OLED displays - * - * 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 for Adafruit Industries 2025 - * - * MIT license, all text here must be included in any redistribution. - * - */ - -#ifndef WIPPERSNAPPER_I2C_DRIVER_OUT_SSD1306_H -#define WIPPERSNAPPER_I2C_DRIVER_OUT_SSD1306_H - -#include "WipperSnapper_I2C_Driver_Out.h" -#include -#include - - -/*! - @brief Class that provides a driver interface for SSD1306 OLED displays -*/ -class WipperSnapper_I2C_Driver_Out_Ssd1306 - : public WipperSnapper_I2C_Driver_Out { - -public: - /*******************************************************************************/ - /*! - @brief Constructor for an SSD1306 display. - @param i2c - The I2C interface. - @param sensorAddress - 7-bit device address. - */ - /*******************************************************************************/ - WipperSnapper_I2C_Driver_Out_Ssd1306(TwoWire *i2c, - uint16_t sensorAddress) - : WipperSnapper_I2C_Driver_Out(i2c, sensorAddress) { - _i2c = i2c; - _sensorAddress = sensorAddress; - } - - /*! - @brief Destructor for an SSD1306 display. - */ - ~WipperSnapper_I2C_Driver_Out_Ssd1306() { - if (_display != nullptr) { - delete _display; - _display = nullptr; - } - } - - /*! - @brief Initializes the SSD1306 display and begins I2C. - @returns True if initialized successfully, False otherwise. - */ - bool begin() { - _display = new Adafruit_SSD1306(_width, _height, _i2c); - bool did_begin = _display->begin(SSD1306_SWITCHCAPVCC, _sensorAddress); - return did_begin; - } - - /*! - @brief Writes a message to an SSD1306 display. - @param message - The message to be displayed. - */ - void WriteMessage(const char *message) { - - } - -protected: - Adafruit_SSD1306 *_display = - nullptr; ///< ptr to an SSD1306 display object - int32_t _width; ///< Width of the display in pixels - int32_t _height; ///< Height of the display in pixels -}; - -#endif // WIPPERSNAPPER_I2C_DRIVER_OUT_SSD1306_H \ No newline at end of file From 6202ecac62bc60289fba7477a55c783cdae27b57 Mon Sep 17 00:00:00 2001 From: brentru Date: Fri, 16 May 2025 16:58:42 -0400 Subject: [PATCH 11/34] Fix LED matrix write --- .../i2c/drivers/WipperSnapper_I2C_Driver_Out.h | 9 ++------- .../i2c/drivers/WipperSnapper_I2C_Driver_Out_CharLcd.h | 2 +- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h index b8d8ec702..d846cf74a 100644 --- a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h @@ -77,14 +77,9 @@ class WipperSnapper_I2C_Driver_Out : public WipperSnapper_I2C_Driver { @brief Writes a message to the LED backpack. @param msg_write Pointer to a wippersnapper_i2c_v1_LedBackpackWrite message. - @returns True if the message was written successfully, False otherwise. */ - bool WriteLedBackpack(wippersnapper_i2c_v1_LedBackpackWrite *msg_write) { - if (msg_write->adjust_brightness) - SetLedBackpackBrightness((uint8_t)msg_write->brightness); - - WriteMessage(msg_write->message.text); - return true; + void WriteLedBackpack(wippersnapper_i2c_v1_LedBackpackWrite *msg_write) { + WriteMessage(msg_write->message); } /*! diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_CharLcd.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_CharLcd.h index cb398f80f..3f39438b8 100644 --- a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_CharLcd.h +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_CharLcd.h @@ -81,7 +81,7 @@ class WipperSnapper_I2C_Driver_Out_CharLcd @param enable True to enable the backlight, false to disable it. */ - void EnableCharLcdBacklight(bool enable) { + void EnableCharLcdBacklight(bool enable=true) { if (_lcd == nullptr) return; From c281ed897106a2411cdfa06ecbb49f048384141c Mon Sep 17 00:00:00 2001 From: brentru Date: Fri, 16 May 2025 17:10:47 -0400 Subject: [PATCH 12/34] push clang --- .../i2c/drivers/WipperSnapper_I2C_Driver_Out_CharLcd.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_CharLcd.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_CharLcd.h index 3f39438b8..8e3ce8265 100644 --- a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_CharLcd.h +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_CharLcd.h @@ -81,7 +81,7 @@ class WipperSnapper_I2C_Driver_Out_CharLcd @param enable True to enable the backlight, false to disable it. */ - void EnableCharLcdBacklight(bool enable=true) { + void EnableCharLcdBacklight(bool enable = true) { if (_lcd == nullptr) return; From 0e19aa0675a93b21ba481d2e22a8f85a139200fb Mon Sep 17 00:00:00 2001 From: brentru Date: Mon, 19 May 2025 14:23:32 -0400 Subject: [PATCH 13/34] add ssd driver --- .../WipperSnapper_I2C_Driver_Out_Ssd1306.h | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h new file mode 100644 index 000000000..6677a72d8 --- /dev/null +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h @@ -0,0 +1,91 @@ +/*! + * @file WipperSnapper_I2C_Driver_Out_Ssd1306.h + * + * Device driver for a SSD1306 OLED Display + * + * 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 for Adafruit Industries 2025 + * + * MIT license, all text here must be included in any redistribution. + * + */ + +#ifndef WIPPERSNAPPER_I2C_DRIVER_OUT_SSD1306_H +#define WIPPERSNAPPER_I2C_DRIVER_OUT_SSD1306_H + +#include "WipperSnapper_I2C_Driver_Out.h" +#include +#include + +#define DEFAULT_WIDTH 128 +#define DEFAULT_HEIGHT 64 +#define DEFAULT_ADDR 0x3C +#define PIN_OLED_RESET -1 + +/*! + @brief Class that provides a driver interface for a SSD1306 + OLED Display +*/ +class WipperSnapper_I2C_Driver_Out_Ssd1306 + : public WipperSnapper_I2C_Driver_Out { + +public: + /*******************************************************************************/ + /*! + @brief Constructor for a SSD1306 OLED display. + @param i2c + The I2C interface. + @param sensorAddress + 7-bit device address. + */ + /*******************************************************************************/ + WipperSnapper_I2C_Driver_Out_Ssd1306(TwoWire *i2c, + uint16_t sensorAddress) + : WipperSnapper_I2C_Driver_Out(i2c, sensorAddress) { + _i2c = i2c; + _sensorAddress = sensorAddress; + _width = DEFAULT_WIDTH; + _height = DEFAULT_HEIGHT; + } + + /*! + @brief Destructor for a SSD1306 OLED display. + */ + ~WipperSnapper_I2C_Driver_Out_Ssd1306() { + if (_display != nullptr) { + delete _display; + _display = nullptr; + } + } + + /*! + @brief Initializes the SSD1306 display and begins I2C. + @returns True if initialized successfully, False otherwise. + */ + bool begin() { + _display = new Adafruit_SSD1306(_width, _height, &_i2c, PIN_OLED_RESET); + bool did_begin = _display->begin(SSD1306_SWITCHCAPVCC, DEFAULT_ADDR); + if (! did_begin) + return false; + + // Show initial display buffer contents on the screen -- + // the library initializes this with an Adafruit splash screen. + _display->display(); + delay(2000); + // Clear the buffer + _display->clearDisplay(); + // Set the text size + + return true; + } + + +protected: + Adafruit_SSD1306 *_display = nullptr; ///< Pointer to the Adafruit_SSD1306 object + uint8_t _width, _height, _text_sz; ///< Width and height of the display +}; + +#endif // WIPPERSNAPPER_I2C_DRIVER_OUT_SSD1306_H \ No newline at end of file From 092c796ed1558ab3ca075dc66d2c24bd45820100 Mon Sep 17 00:00:00 2001 From: brentru Date: Mon, 19 May 2025 14:42:56 -0400 Subject: [PATCH 14/34] Fully integrate SSD1306 driver, missing write func --- src/components/i2c/WipperSnapper_I2C.cpp | 20 +++++++++ src/components/i2c/WipperSnapper_I2C.h | 2 + .../drivers/WipperSnapper_I2C_Driver_Out.h | 24 ++++++++++ .../WipperSnapper_I2C_Driver_Out_Ssd1306.h | 45 ++++++++++++++----- 4 files changed, 81 insertions(+), 10 deletions(-) diff --git a/src/components/i2c/WipperSnapper_I2C.cpp b/src/components/i2c/WipperSnapper_I2C.cpp index 1f6c4034f..35210d258 100644 --- a/src/components/i2c/WipperSnapper_I2C.cpp +++ b/src/components/i2c/WipperSnapper_I2C.cpp @@ -878,6 +878,21 @@ bool WipperSnapper_Component_I2C::initI2CDevice( } _drivers_out.push_back(_sevenSeg); WS_DEBUG_PRINTLN("7-Segement LED Matrix Initialized Successfully!"); + } else if (strcmp("ssd1306", msgDeviceInitReq->i2c_device_name) == 0) { + _ssd1306 = new WipperSnapper_I2C_Driver_Out_Ssd1306(this->_i2c, i2cAddress); + _ssd1306->ConfigureSSD1306( + (uint8_t)msgDeviceInitReq->i2c_output_add.config.ssd1306_config.width, + (uint8_t)msgDeviceInitReq->i2c_output_add.config.ssd1306_config.height, + (uint8_t) + msgDeviceInitReq->i2c_output_add.config.ssd1306_config.text_size); + if (!_ssd1306->begin()) { + WS_DEBUG_PRINTLN("ERROR: Failed to initialize ssd1306!"); + _busStatusResponse = + wippersnapper_i2c_v1_BusResponse_BUS_RESPONSE_DEVICE_INIT_FAIL; + return false; + } + _drivers_out.push_back(_ssd1306); + WS_DEBUG_PRINTLN("SSD1306 display initialized Successfully!"); } else { WS_DEBUG_PRINTLN("ERROR: I2C device type not found!") _busStatusResponse = @@ -1150,6 +1165,7 @@ bool WipperSnapper_Component_I2C::Handle_I2cDeviceOutputWrite( // Create a ptr to the base driver out WipperSnapper_I2C_Driver_Out *driver_out = nullptr; // Find the matching driver by address in the _drivers_out vector + // TODO: Refactor this outwards WS_DEBUG_PRINT("Searching for i2c output driver with address: "); WS_DEBUG_PRINT(msgDeviceWrite->i2c_device_address); for (size_t i = 0; i < _drivers_out.size(); i++) { @@ -1172,6 +1188,10 @@ bool WipperSnapper_Component_I2C::Handle_I2cDeviceOutputWrite( } else if (msgDeviceWrite->which_output_msg == wippersnapper_i2c_v1_I2CDeviceOutputWrite_write_char_lcd_tag) { driver_out->WriteMessageCharLCD(&msgDeviceWrite->output_msg.write_char_lcd); + } else if (msgDeviceWrite->which_output_msg == + wippersnapper_i2c_v1_I2CDeviceOutputWrite_write_ssd1306_tag) { + driver_out->WriteMessageSSD1306( + msgDeviceWrite->output_msg.write_ssd1306.message); } else { WS_DEBUG_PRINTLN("ERROR: Unknown output message type!"); return false; diff --git a/src/components/i2c/WipperSnapper_I2C.h b/src/components/i2c/WipperSnapper_I2C.h index a5efd27f7..1c17de10a 100644 --- a/src/components/i2c/WipperSnapper_I2C.h +++ b/src/components/i2c/WipperSnapper_I2C.h @@ -54,6 +54,7 @@ #include "drivers/WipperSnapper_I2C_Driver_Out_7Seg.h" #include "drivers/WipperSnapper_I2C_Driver_Out_CharLcd.h" #include "drivers/WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h" +#include "drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h" #include "drivers/WipperSnapper_I2C_Driver_PCT2075.h" #include "drivers/WipperSnapper_I2C_Driver_PM25.h" #include "drivers/WipperSnapper_I2C_Driver_SCD30.h" @@ -203,6 +204,7 @@ class WipperSnapper_Component_I2C { WipperSnapper_I2C_Driver_Out_QuadAlphaNum *_quadAlphaNum = nullptr; WipperSnapper_I2C_Driver_Out_CharLcd *_charLcd = nullptr; WipperSnapper_I2C_Driver_Out_7Seg *_sevenSeg = nullptr; + WipperSnapper_I2C_Driver_Out_Ssd1306 *_ssd1306 = nullptr; }; extern Wippersnapper WS; diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h index d846cf74a..fec337b88 100644 --- a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h @@ -53,6 +53,30 @@ class WipperSnapper_I2C_Driver_Out : public WipperSnapper_I2C_Driver { // noop } + /*! + @brief Configures a SSD1306 OLED display. Must be called before driver + begin() + @param width + The width of the display in pixels. + @param height + The height of the display in pixels. + @param i2c_address + The I2C address of the display. + */ + virtual void ConfigureSSD1306(uint8_t width, uint8_t height, + uint8_t text_size) { + // noop + } + + /*! + @brief Writes a message to the SSD1306 display. + @param message + The message to be displayed. + */ + virtual void WriteMessageSSD1306(const char *message) { + // noop + } + /*! @brief Configures a LED backpack. @param brightness diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h index 6677a72d8..1f51659a5 100644 --- a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h @@ -22,8 +22,6 @@ #define DEFAULT_WIDTH 128 #define DEFAULT_HEIGHT 64 -#define DEFAULT_ADDR 0x3C -#define PIN_OLED_RESET -1 /*! @brief Class that provides a driver interface for a SSD1306 @@ -42,8 +40,7 @@ class WipperSnapper_I2C_Driver_Out_Ssd1306 7-bit device address. */ /*******************************************************************************/ - WipperSnapper_I2C_Driver_Out_Ssd1306(TwoWire *i2c, - uint16_t sensorAddress) + WipperSnapper_I2C_Driver_Out_Ssd1306(TwoWire *i2c, uint16_t sensorAddress) : WipperSnapper_I2C_Driver_Out(i2c, sensorAddress) { _i2c = i2c; _sensorAddress = sensorAddress; @@ -66,9 +63,9 @@ class WipperSnapper_I2C_Driver_Out_Ssd1306 @returns True if initialized successfully, False otherwise. */ bool begin() { - _display = new Adafruit_SSD1306(_width, _height, &_i2c, PIN_OLED_RESET); - bool did_begin = _display->begin(SSD1306_SWITCHCAPVCC, DEFAULT_ADDR); - if (! did_begin) + _display = new Adafruit_SSD1306(_width, _height, _i2c); + bool did_begin = _display->begin(SSD1306_SWITCHCAPVCC, _sensorAddress); + if (!did_begin) return false; // Show initial display buffer contents on the screen -- @@ -77,14 +74,42 @@ class WipperSnapper_I2C_Driver_Out_Ssd1306 delay(2000); // Clear the buffer _display->clearDisplay(); - // Set the text size - + // Configure the text size and color + _display->setTextSize(_text_sz); + _display->setTextColor(SSD1306_WHITE); + // Reset the cursor position + _display->setCursor(0, 0); return true; } + /*! + @brief Configures a SSD1306 OLED display. Must be called before driver + begin() + @param width + The width of the display in pixels. + @param height + The height of the display in pixels. + @param i2c_address + The I2C address of the display. + */ + void ConfigureSSD1306(uint8_t width, uint8_t height, uint8_t text_size) { + _width = width; + _height = height; + _text_sz = text_size; + } + + /*! + @brief Writes a message to the SSD1306 display. + @param message + The message to be displayed. + */ + void WriteMessageSSD1306(const char *message) { + // noop + } protected: - Adafruit_SSD1306 *_display = nullptr; ///< Pointer to the Adafruit_SSD1306 object + Adafruit_SSD1306 *_display = + nullptr; ///< Pointer to the Adafruit_SSD1306 object uint8_t _width, _height, _text_sz; ///< Width and height of the display }; From c1d96985b5f46013bd10ea2eeb01fb62931fceeb Mon Sep 17 00:00:00 2001 From: brentru Date: Mon, 19 May 2025 15:19:15 -0400 Subject: [PATCH 15/34] Integrate PR a1a0ab6..8e89fdf --- .../drivers/WipperSnapper_I2C_Driver_Out.h | 4 +- .../description/v1/description.pb.c | 2 +- .../description/v1/description.pb.h | 2 +- src/wippersnapper/ds18x20/v1/ds18x20.pb.c | 2 +- src/wippersnapper/ds18x20/v1/ds18x20.pb.h | 2 +- src/wippersnapper/i2c/v1/i2c.pb.c | 16 +- src/wippersnapper/i2c/v1/i2c.pb.h | 254 +++++++++--------- 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 +- 19 files changed, 153 insertions(+), 153 deletions(-) diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h index fec337b88..ab6982db2 100644 --- a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h @@ -102,7 +102,7 @@ class WipperSnapper_I2C_Driver_Out : public WipperSnapper_I2C_Driver { @param msg_write Pointer to a wippersnapper_i2c_v1_LedBackpackWrite message. */ - void WriteLedBackpack(wippersnapper_i2c_v1_LedBackpackWrite *msg_write) { + void WriteLedBackpack(wippersnapper_i2c_v1_LEDBackpackWrite *msg_write) { WriteMessage(msg_write->message); } @@ -133,7 +133,7 @@ class WipperSnapper_I2C_Driver_Out : public WipperSnapper_I2C_Driver { @param enable_backlight True if the backlight should be enabled, false otherwise. */ - void WriteMessageCharLCD(wippersnapper_i2c_v1_CharLcdWrite *write_char_lcd, + void WriteMessageCharLCD(wippersnapper_i2c_v1_CharLCDWrite *write_char_lcd, bool enable_backlight = true) { EnableCharLcdBacklight(enable_backlight); WriteMessage(write_char_lcd->message); diff --git a/src/wippersnapper/description/v1/description.pb.c b/src/wippersnapper/description/v1/description.pb.c index e82842f59..279790cc7 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 May 16 18:09:01 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon May 19 19:15:20 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 ee96254d5..878cb39e0 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 May 16 18:09:01 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon May 19 19:15:20 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/ds18x20/v1/ds18x20.pb.c b/src/wippersnapper/ds18x20/v1/ds18x20.pb.c index 1c177be00..3a878fdbf 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 May 16 18:09:01 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon May 19 19:15:20 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 6f1b65d40..1be747f1c 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 May 16 18:09:01 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon May 19 19:15:20 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 c1bbb686b..bd0fb1d76 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 May 16 18:09:01 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon May 19 19:15:20 2025. */ #include "wippersnapper/i2c/v1/i2c.pb.h" #if PB_PROTO_HEADER_VERSION != 40 @@ -54,25 +54,25 @@ PB_BIND(wippersnapper_i2c_v1_I2CDeviceEvent, wippersnapper_i2c_v1_I2CDeviceEvent PB_BIND(wippersnapper_i2c_v1_I2CDeviceOutputWrite, wippersnapper_i2c_v1_I2CDeviceOutputWrite, AUTO) -PB_BIND(wippersnapper_i2c_v1_LedBackpackConfig, wippersnapper_i2c_v1_LedBackpackConfig, AUTO) +PB_BIND(wippersnapper_i2c_v1_LEDBackpackConfig, wippersnapper_i2c_v1_LEDBackpackConfig, AUTO) -PB_BIND(wippersnapper_i2c_v1_CharLcdConfig, wippersnapper_i2c_v1_CharLcdConfig, AUTO) +PB_BIND(wippersnapper_i2c_v1_CharLCDConfig, wippersnapper_i2c_v1_CharLCDConfig, AUTO) -PB_BIND(wippersnapper_i2c_v1_Ssd1306Config, wippersnapper_i2c_v1_Ssd1306Config, AUTO) +PB_BIND(wippersnapper_i2c_v1_SSD1306Config, wippersnapper_i2c_v1_SSD1306Config, AUTO) -PB_BIND(wippersnapper_i2c_v1_I2cOutputAdd, wippersnapper_i2c_v1_I2cOutputAdd, AUTO) +PB_BIND(wippersnapper_i2c_v1_I2COutputAdd, wippersnapper_i2c_v1_I2COutputAdd, AUTO) -PB_BIND(wippersnapper_i2c_v1_LedBackpackWrite, wippersnapper_i2c_v1_LedBackpackWrite, AUTO) +PB_BIND(wippersnapper_i2c_v1_LEDBackpackWrite, wippersnapper_i2c_v1_LEDBackpackWrite, AUTO) -PB_BIND(wippersnapper_i2c_v1_CharLcdWrite, wippersnapper_i2c_v1_CharLcdWrite, AUTO) +PB_BIND(wippersnapper_i2c_v1_CharLCDWrite, wippersnapper_i2c_v1_CharLCDWrite, AUTO) -PB_BIND(wippersnapper_i2c_v1_Ssd1306Write, wippersnapper_i2c_v1_Ssd1306Write, AUTO) +PB_BIND(wippersnapper_i2c_v1_SSD1306Write, wippersnapper_i2c_v1_SSD1306Write, AUTO) diff --git a/src/wippersnapper/i2c/v1/i2c.pb.h b/src/wippersnapper/i2c/v1/i2c.pb.h index aa96c9067..31ba0bcd7 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 May 16 18:09:01 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon May 19 19:15:20 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 @@ -60,33 +60,33 @@ typedef enum _wippersnapper_i2c_v1_SensorType { wippersnapper_i2c_v1_SensorType_SENSOR_TYPE_TVOC = 35 } wippersnapper_i2c_v1_SensorType; -typedef enum _wippersnapper_i2c_v1_LedBackpackAlignment { - wippersnapper_i2c_v1_LedBackpackAlignment_LED_BACKPACK_ALIGNMENT_UNSPECIFIED = 0, - wippersnapper_i2c_v1_LedBackpackAlignment_LED_BACKPACK_ALIGNMENT_LEFT = 1, - wippersnapper_i2c_v1_LedBackpackAlignment_LED_BACKPACK_ALIGNMENT_RIGHT = 2 -} wippersnapper_i2c_v1_LedBackpackAlignment; +typedef enum _wippersnapper_i2c_v1_LEDBackpackAlignment { + wippersnapper_i2c_v1_LEDBackpackAlignment_LED_BACKPACK_ALIGNMENT_UNSPECIFIED = 0, + wippersnapper_i2c_v1_LEDBackpackAlignment_LED_BACKPACK_ALIGNMENT_LEFT = 1, + wippersnapper_i2c_v1_LEDBackpackAlignment_LED_BACKPACK_ALIGNMENT_RIGHT = 2 +} wippersnapper_i2c_v1_LEDBackpackAlignment; -typedef enum _wippersnapper_i2c_v1_Ssd1306TextSize { - wippersnapper_i2c_v1_Ssd1306TextSize_SSD1306_TEXT_SIZE_UNSPECIFIED = 0, - wippersnapper_i2c_v1_Ssd1306TextSize_SSD1306_TEXT_SIZE_1 = 1, - wippersnapper_i2c_v1_Ssd1306TextSize_SSD1306_TEXT_SIZE_2 = 2, - wippersnapper_i2c_v1_Ssd1306TextSize_SSD1306_TEXT_SIZE_3 = 3 -} wippersnapper_i2c_v1_Ssd1306TextSize; +typedef enum _wippersnapper_i2c_v1_SSD1306TextSize { + wippersnapper_i2c_v1_SSD1306TextSize_SSD1306_TEXT_SIZE_UNSPECIFIED = 0, + wippersnapper_i2c_v1_SSD1306TextSize_SSD1306_TEXT_SIZE_1 = 1, + wippersnapper_i2c_v1_SSD1306TextSize_SSD1306_TEXT_SIZE_2 = 2, + wippersnapper_i2c_v1_SSD1306TextSize_SSD1306_TEXT_SIZE_3 = 3 +} wippersnapper_i2c_v1_SSD1306TextSize; /* Struct definitions */ typedef struct _wippersnapper_i2c_v1_I2CDeviceInitRequests { pb_callback_t list; } wippersnapper_i2c_v1_I2CDeviceInitRequests; -typedef struct _wippersnapper_i2c_v1_CharLcdConfig { +typedef struct _wippersnapper_i2c_v1_CharLCDConfig { uint32_t rows; uint32_t columns; -} wippersnapper_i2c_v1_CharLcdConfig; +} wippersnapper_i2c_v1_CharLCDConfig; -typedef struct _wippersnapper_i2c_v1_CharLcdWrite { +typedef struct _wippersnapper_i2c_v1_CharLCDWrite { char message[128]; bool enable_backlight; -} wippersnapper_i2c_v1_CharLcdWrite; +} wippersnapper_i2c_v1_CharLCDWrite; typedef struct _wippersnapper_i2c_v1_I2CBusInitRequest { int32_t i2c_pin_scl; @@ -135,29 +135,29 @@ typedef struct _wippersnapper_i2c_v1_I2CDeviceUpdateResponse { wippersnapper_i2c_v1_BusResponse bus_response; } wippersnapper_i2c_v1_I2CDeviceUpdateResponse; -typedef struct _wippersnapper_i2c_v1_LedBackpackConfig { +typedef struct _wippersnapper_i2c_v1_LEDBackpackConfig { int32_t brightness; - wippersnapper_i2c_v1_LedBackpackAlignment alignment; -} wippersnapper_i2c_v1_LedBackpackConfig; + wippersnapper_i2c_v1_LEDBackpackAlignment alignment; +} wippersnapper_i2c_v1_LEDBackpackConfig; -typedef struct _wippersnapper_i2c_v1_LedBackpackWrite { +typedef struct _wippersnapper_i2c_v1_LEDBackpackWrite { char message[5]; -} wippersnapper_i2c_v1_LedBackpackWrite; +} wippersnapper_i2c_v1_LEDBackpackWrite; -typedef struct _wippersnapper_i2c_v1_SensorEvent { - wippersnapper_i2c_v1_SensorType type; - float value; -} wippersnapper_i2c_v1_SensorEvent; - -typedef struct _wippersnapper_i2c_v1_Ssd1306Config { +typedef struct _wippersnapper_i2c_v1_SSD1306Config { uint32_t width; uint32_t height; - wippersnapper_i2c_v1_Ssd1306TextSize text_size; -} wippersnapper_i2c_v1_Ssd1306Config; + wippersnapper_i2c_v1_SSD1306TextSize text_size; +} wippersnapper_i2c_v1_SSD1306Config; -typedef struct _wippersnapper_i2c_v1_Ssd1306Write { +typedef struct _wippersnapper_i2c_v1_SSD1306Write { char message[128]; -} wippersnapper_i2c_v1_Ssd1306Write; +} wippersnapper_i2c_v1_SSD1306Write; + +typedef struct _wippersnapper_i2c_v1_SensorEvent { + wippersnapper_i2c_v1_SensorType type; + float value; +} wippersnapper_i2c_v1_SensorEvent; typedef struct _wippersnapper_i2c_v1_I2CBusScanRequest { int32_t i2c_port_number; @@ -176,9 +176,9 @@ typedef struct _wippersnapper_i2c_v1_I2CDeviceOutputWrite { char i2c_device_name[15]; pb_size_t which_output_msg; union { - wippersnapper_i2c_v1_LedBackpackWrite write_led_backpack; - wippersnapper_i2c_v1_CharLcdWrite write_char_lcd; - wippersnapper_i2c_v1_Ssd1306Write write_ssd1306; + wippersnapper_i2c_v1_LEDBackpackWrite write_led_backpack; + wippersnapper_i2c_v1_CharLCDWrite write_char_lcd; + wippersnapper_i2c_v1_SSD1306Write write_ssd1306; } output_msg; } wippersnapper_i2c_v1_I2CDeviceOutputWrite; @@ -190,14 +190,14 @@ typedef struct _wippersnapper_i2c_v1_I2CDeviceUpdateRequest { wippersnapper_i2c_v1_I2CDeviceSensorProperties i2c_device_properties[15]; } wippersnapper_i2c_v1_I2CDeviceUpdateRequest; -typedef struct _wippersnapper_i2c_v1_I2cOutputAdd { +typedef struct _wippersnapper_i2c_v1_I2COutputAdd { pb_size_t which_config; union { - wippersnapper_i2c_v1_LedBackpackConfig led_backpack_config; - wippersnapper_i2c_v1_CharLcdConfig char_lcd_config; - wippersnapper_i2c_v1_Ssd1306Config ssd1306_config; + wippersnapper_i2c_v1_LEDBackpackConfig led_backpack_config; + wippersnapper_i2c_v1_CharLCDConfig char_lcd_config; + wippersnapper_i2c_v1_SSD1306Config ssd1306_config; } config; -} wippersnapper_i2c_v1_I2cOutputAdd; +} wippersnapper_i2c_v1_I2COutputAdd; typedef struct _wippersnapper_i2c_v1_I2CDeviceInitRequest { int32_t i2c_port_number; @@ -209,7 +209,7 @@ typedef struct _wippersnapper_i2c_v1_I2CDeviceInitRequest { wippersnapper_i2c_v1_I2CDeviceSensorProperties i2c_device_properties[15]; bool is_output_device; bool has_i2c_output_add; - wippersnapper_i2c_v1_I2cOutputAdd i2c_output_add; + wippersnapper_i2c_v1_I2COutputAdd i2c_output_add; } wippersnapper_i2c_v1_I2CDeviceInitRequest; @@ -222,13 +222,13 @@ typedef struct _wippersnapper_i2c_v1_I2CDeviceInitRequest { #define _wippersnapper_i2c_v1_SensorType_MAX wippersnapper_i2c_v1_SensorType_SENSOR_TYPE_TVOC #define _wippersnapper_i2c_v1_SensorType_ARRAYSIZE ((wippersnapper_i2c_v1_SensorType)(wippersnapper_i2c_v1_SensorType_SENSOR_TYPE_TVOC+1)) -#define _wippersnapper_i2c_v1_LedBackpackAlignment_MIN wippersnapper_i2c_v1_LedBackpackAlignment_LED_BACKPACK_ALIGNMENT_UNSPECIFIED -#define _wippersnapper_i2c_v1_LedBackpackAlignment_MAX wippersnapper_i2c_v1_LedBackpackAlignment_LED_BACKPACK_ALIGNMENT_RIGHT -#define _wippersnapper_i2c_v1_LedBackpackAlignment_ARRAYSIZE ((wippersnapper_i2c_v1_LedBackpackAlignment)(wippersnapper_i2c_v1_LedBackpackAlignment_LED_BACKPACK_ALIGNMENT_RIGHT+1)) +#define _wippersnapper_i2c_v1_LEDBackpackAlignment_MIN wippersnapper_i2c_v1_LEDBackpackAlignment_LED_BACKPACK_ALIGNMENT_UNSPECIFIED +#define _wippersnapper_i2c_v1_LEDBackpackAlignment_MAX wippersnapper_i2c_v1_LEDBackpackAlignment_LED_BACKPACK_ALIGNMENT_RIGHT +#define _wippersnapper_i2c_v1_LEDBackpackAlignment_ARRAYSIZE ((wippersnapper_i2c_v1_LEDBackpackAlignment)(wippersnapper_i2c_v1_LEDBackpackAlignment_LED_BACKPACK_ALIGNMENT_RIGHT+1)) -#define _wippersnapper_i2c_v1_Ssd1306TextSize_MIN wippersnapper_i2c_v1_Ssd1306TextSize_SSD1306_TEXT_SIZE_UNSPECIFIED -#define _wippersnapper_i2c_v1_Ssd1306TextSize_MAX wippersnapper_i2c_v1_Ssd1306TextSize_SSD1306_TEXT_SIZE_3 -#define _wippersnapper_i2c_v1_Ssd1306TextSize_ARRAYSIZE ((wippersnapper_i2c_v1_Ssd1306TextSize)(wippersnapper_i2c_v1_Ssd1306TextSize_SSD1306_TEXT_SIZE_3+1)) +#define _wippersnapper_i2c_v1_SSD1306TextSize_MIN wippersnapper_i2c_v1_SSD1306TextSize_SSD1306_TEXT_SIZE_UNSPECIFIED +#define _wippersnapper_i2c_v1_SSD1306TextSize_MAX wippersnapper_i2c_v1_SSD1306TextSize_SSD1306_TEXT_SIZE_3 +#define _wippersnapper_i2c_v1_SSD1306TextSize_ARRAYSIZE ((wippersnapper_i2c_v1_SSD1306TextSize)(wippersnapper_i2c_v1_SSD1306TextSize_SSD1306_TEXT_SIZE_3+1)) #ifdef __cplusplus @@ -243,7 +243,7 @@ extern "C" { #define wippersnapper_i2c_v1_I2CBusScanResponse_init_default {0, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, _wippersnapper_i2c_v1_BusResponse_MIN} #define wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default {_wippersnapper_i2c_v1_SensorType_MIN, 0} #define wippersnapper_i2c_v1_I2CDeviceInitRequests_init_default {{{NULL}, NULL}} -#define wippersnapper_i2c_v1_I2CDeviceInitRequest_init_default {0, false, wippersnapper_i2c_v1_I2CBusInitRequest_init_default, 0, "", 0, {wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default}, 0, false, wippersnapper_i2c_v1_I2cOutputAdd_init_default} +#define wippersnapper_i2c_v1_I2CDeviceInitRequest_init_default {0, false, wippersnapper_i2c_v1_I2CBusInitRequest_init_default, 0, "", 0, {wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default}, 0, false, wippersnapper_i2c_v1_I2COutputAdd_init_default} #define wippersnapper_i2c_v1_I2CDeviceInitResponse_init_default {0, _wippersnapper_i2c_v1_BusResponse_MIN} #define wippersnapper_i2c_v1_I2CDeviceUpdateRequest_init_default {0, 0, "", 0, {wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_default}} #define wippersnapper_i2c_v1_I2CDeviceUpdateResponse_init_default {0, _wippersnapper_i2c_v1_BusResponse_MIN} @@ -251,14 +251,14 @@ extern "C" { #define wippersnapper_i2c_v1_I2CDeviceDeinitResponse_init_default {0, _wippersnapper_i2c_v1_BusResponse_MIN} #define wippersnapper_i2c_v1_SensorEvent_init_default {_wippersnapper_i2c_v1_SensorType_MIN, 0} #define wippersnapper_i2c_v1_I2CDeviceEvent_init_default {0, 0, {wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default, wippersnapper_i2c_v1_SensorEvent_init_default}} -#define wippersnapper_i2c_v1_I2CDeviceOutputWrite_init_default {0, "", 0, {wippersnapper_i2c_v1_LedBackpackWrite_init_default}} -#define wippersnapper_i2c_v1_LedBackpackConfig_init_default {0, _wippersnapper_i2c_v1_LedBackpackAlignment_MIN} -#define wippersnapper_i2c_v1_CharLcdConfig_init_default {0, 0} -#define wippersnapper_i2c_v1_Ssd1306Config_init_default {0, 0, _wippersnapper_i2c_v1_Ssd1306TextSize_MIN} -#define wippersnapper_i2c_v1_I2cOutputAdd_init_default {0, {wippersnapper_i2c_v1_LedBackpackConfig_init_default}} -#define wippersnapper_i2c_v1_LedBackpackWrite_init_default {""} -#define wippersnapper_i2c_v1_CharLcdWrite_init_default {"", 0} -#define wippersnapper_i2c_v1_Ssd1306Write_init_default {""} +#define wippersnapper_i2c_v1_I2CDeviceOutputWrite_init_default {0, "", 0, {wippersnapper_i2c_v1_LEDBackpackWrite_init_default}} +#define wippersnapper_i2c_v1_LEDBackpackConfig_init_default {0, _wippersnapper_i2c_v1_LEDBackpackAlignment_MIN} +#define wippersnapper_i2c_v1_CharLCDConfig_init_default {0, 0} +#define wippersnapper_i2c_v1_SSD1306Config_init_default {0, 0, _wippersnapper_i2c_v1_SSD1306TextSize_MIN} +#define wippersnapper_i2c_v1_I2COutputAdd_init_default {0, {wippersnapper_i2c_v1_LEDBackpackConfig_init_default}} +#define wippersnapper_i2c_v1_LEDBackpackWrite_init_default {""} +#define wippersnapper_i2c_v1_CharLCDWrite_init_default {"", 0} +#define wippersnapper_i2c_v1_SSD1306Write_init_default {""} #define wippersnapper_i2c_v1_I2CBusInitRequest_init_zero {0, 0, 0, 0} #define wippersnapper_i2c_v1_I2CBusInitResponse_init_zero {_wippersnapper_i2c_v1_BusResponse_MIN} #define wippersnapper_i2c_v1_I2CBusSetFrequency_init_zero {0, 0} @@ -266,7 +266,7 @@ extern "C" { #define wippersnapper_i2c_v1_I2CBusScanResponse_init_zero {0, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, _wippersnapper_i2c_v1_BusResponse_MIN} #define wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero {_wippersnapper_i2c_v1_SensorType_MIN, 0} #define wippersnapper_i2c_v1_I2CDeviceInitRequests_init_zero {{{NULL}, NULL}} -#define wippersnapper_i2c_v1_I2CDeviceInitRequest_init_zero {0, false, wippersnapper_i2c_v1_I2CBusInitRequest_init_zero, 0, "", 0, {wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero}, 0, false, wippersnapper_i2c_v1_I2cOutputAdd_init_zero} +#define wippersnapper_i2c_v1_I2CDeviceInitRequest_init_zero {0, false, wippersnapper_i2c_v1_I2CBusInitRequest_init_zero, 0, "", 0, {wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero}, 0, false, wippersnapper_i2c_v1_I2COutputAdd_init_zero} #define wippersnapper_i2c_v1_I2CDeviceInitResponse_init_zero {0, _wippersnapper_i2c_v1_BusResponse_MIN} #define wippersnapper_i2c_v1_I2CDeviceUpdateRequest_init_zero {0, 0, "", 0, {wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero, wippersnapper_i2c_v1_I2CDeviceSensorProperties_init_zero}} #define wippersnapper_i2c_v1_I2CDeviceUpdateResponse_init_zero {0, _wippersnapper_i2c_v1_BusResponse_MIN} @@ -274,21 +274,21 @@ extern "C" { #define wippersnapper_i2c_v1_I2CDeviceDeinitResponse_init_zero {0, _wippersnapper_i2c_v1_BusResponse_MIN} #define wippersnapper_i2c_v1_SensorEvent_init_zero {_wippersnapper_i2c_v1_SensorType_MIN, 0} #define wippersnapper_i2c_v1_I2CDeviceEvent_init_zero {0, 0, {wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero, wippersnapper_i2c_v1_SensorEvent_init_zero}} -#define wippersnapper_i2c_v1_I2CDeviceOutputWrite_init_zero {0, "", 0, {wippersnapper_i2c_v1_LedBackpackWrite_init_zero}} -#define wippersnapper_i2c_v1_LedBackpackConfig_init_zero {0, _wippersnapper_i2c_v1_LedBackpackAlignment_MIN} -#define wippersnapper_i2c_v1_CharLcdConfig_init_zero {0, 0} -#define wippersnapper_i2c_v1_Ssd1306Config_init_zero {0, 0, _wippersnapper_i2c_v1_Ssd1306TextSize_MIN} -#define wippersnapper_i2c_v1_I2cOutputAdd_init_zero {0, {wippersnapper_i2c_v1_LedBackpackConfig_init_zero}} -#define wippersnapper_i2c_v1_LedBackpackWrite_init_zero {""} -#define wippersnapper_i2c_v1_CharLcdWrite_init_zero {"", 0} -#define wippersnapper_i2c_v1_Ssd1306Write_init_zero {""} +#define wippersnapper_i2c_v1_I2CDeviceOutputWrite_init_zero {0, "", 0, {wippersnapper_i2c_v1_LEDBackpackWrite_init_zero}} +#define wippersnapper_i2c_v1_LEDBackpackConfig_init_zero {0, _wippersnapper_i2c_v1_LEDBackpackAlignment_MIN} +#define wippersnapper_i2c_v1_CharLCDConfig_init_zero {0, 0} +#define wippersnapper_i2c_v1_SSD1306Config_init_zero {0, 0, _wippersnapper_i2c_v1_SSD1306TextSize_MIN} +#define wippersnapper_i2c_v1_I2COutputAdd_init_zero {0, {wippersnapper_i2c_v1_LEDBackpackConfig_init_zero}} +#define wippersnapper_i2c_v1_LEDBackpackWrite_init_zero {""} +#define wippersnapper_i2c_v1_CharLCDWrite_init_zero {"", 0} +#define wippersnapper_i2c_v1_SSD1306Write_init_zero {""} /* Field tags (for use in manual encoding/decoding) */ #define wippersnapper_i2c_v1_I2CDeviceInitRequests_list_tag 1 -#define wippersnapper_i2c_v1_CharLcdConfig_rows_tag 1 -#define wippersnapper_i2c_v1_CharLcdConfig_columns_tag 2 -#define wippersnapper_i2c_v1_CharLcdWrite_message_tag 1 -#define wippersnapper_i2c_v1_CharLcdWrite_enable_backlight_tag 2 +#define wippersnapper_i2c_v1_CharLCDConfig_rows_tag 1 +#define wippersnapper_i2c_v1_CharLCDConfig_columns_tag 2 +#define wippersnapper_i2c_v1_CharLCDWrite_message_tag 1 +#define wippersnapper_i2c_v1_CharLCDWrite_enable_backlight_tag 2 #define wippersnapper_i2c_v1_I2CBusInitRequest_i2c_pin_scl_tag 1 #define wippersnapper_i2c_v1_I2CBusInitRequest_i2c_pin_sda_tag 2 #define wippersnapper_i2c_v1_I2CBusInitRequest_i2c_frequency_tag 3 @@ -308,15 +308,15 @@ extern "C" { #define wippersnapper_i2c_v1_I2CDeviceSensorProperties_sensor_period_tag 2 #define wippersnapper_i2c_v1_I2CDeviceUpdateResponse_i2c_device_address_tag 1 #define wippersnapper_i2c_v1_I2CDeviceUpdateResponse_bus_response_tag 3 -#define wippersnapper_i2c_v1_LedBackpackConfig_brightness_tag 1 -#define wippersnapper_i2c_v1_LedBackpackConfig_alignment_tag 2 -#define wippersnapper_i2c_v1_LedBackpackWrite_message_tag 1 +#define wippersnapper_i2c_v1_LEDBackpackConfig_brightness_tag 1 +#define wippersnapper_i2c_v1_LEDBackpackConfig_alignment_tag 2 +#define wippersnapper_i2c_v1_LEDBackpackWrite_message_tag 1 +#define wippersnapper_i2c_v1_SSD1306Config_width_tag 1 +#define wippersnapper_i2c_v1_SSD1306Config_height_tag 2 +#define wippersnapper_i2c_v1_SSD1306Config_text_size_tag 3 +#define wippersnapper_i2c_v1_SSD1306Write_message_tag 1 #define wippersnapper_i2c_v1_SensorEvent_type_tag 1 #define wippersnapper_i2c_v1_SensorEvent_value_tag 2 -#define wippersnapper_i2c_v1_Ssd1306Config_width_tag 1 -#define wippersnapper_i2c_v1_Ssd1306Config_height_tag 2 -#define wippersnapper_i2c_v1_Ssd1306Config_text_size_tag 3 -#define wippersnapper_i2c_v1_Ssd1306Write_message_tag 1 #define wippersnapper_i2c_v1_I2CBusScanRequest_i2c_port_number_tag 1 #define wippersnapper_i2c_v1_I2CBusScanRequest_bus_init_request_tag 2 #define wippersnapper_i2c_v1_I2CDeviceEvent_sensor_address_tag 1 @@ -330,9 +330,9 @@ extern "C" { #define wippersnapper_i2c_v1_I2CDeviceUpdateRequest_i2c_device_address_tag 2 #define wippersnapper_i2c_v1_I2CDeviceUpdateRequest_i2c_device_name_tag 3 #define wippersnapper_i2c_v1_I2CDeviceUpdateRequest_i2c_device_properties_tag 4 -#define wippersnapper_i2c_v1_I2cOutputAdd_led_backpack_config_tag 1 -#define wippersnapper_i2c_v1_I2cOutputAdd_char_lcd_config_tag 2 -#define wippersnapper_i2c_v1_I2cOutputAdd_ssd1306_config_tag 3 +#define wippersnapper_i2c_v1_I2COutputAdd_led_backpack_config_tag 1 +#define wippersnapper_i2c_v1_I2COutputAdd_char_lcd_config_tag 2 +#define wippersnapper_i2c_v1_I2COutputAdd_ssd1306_config_tag 3 #define wippersnapper_i2c_v1_I2CDeviceInitRequest_i2c_port_number_tag 1 #define wippersnapper_i2c_v1_I2CDeviceInitRequest_i2c_bus_init_req_tag 2 #define wippersnapper_i2c_v1_I2CDeviceInitRequest_i2c_device_address_tag 3 @@ -398,7 +398,7 @@ X(a, STATIC, OPTIONAL, MESSAGE, i2c_output_add, 7) #define wippersnapper_i2c_v1_I2CDeviceInitRequest_DEFAULT NULL #define wippersnapper_i2c_v1_I2CDeviceInitRequest_i2c_bus_init_req_MSGTYPE wippersnapper_i2c_v1_I2CBusInitRequest #define wippersnapper_i2c_v1_I2CDeviceInitRequest_i2c_device_properties_MSGTYPE wippersnapper_i2c_v1_I2CDeviceSensorProperties -#define wippersnapper_i2c_v1_I2CDeviceInitRequest_i2c_output_add_MSGTYPE wippersnapper_i2c_v1_I2cOutputAdd +#define wippersnapper_i2c_v1_I2CDeviceInitRequest_i2c_output_add_MSGTYPE wippersnapper_i2c_v1_I2COutputAdd #define wippersnapper_i2c_v1_I2CDeviceInitResponse_FIELDLIST(X, a) \ X(a, STATIC, SINGULAR, UINT32, i2c_device_address, 2) \ @@ -454,54 +454,54 @@ X(a, STATIC, ONEOF, MESSAGE, (output_msg,write_char_lcd,output_msg.write_c X(a, STATIC, ONEOF, MESSAGE, (output_msg,write_ssd1306,output_msg.write_ssd1306), 5) #define wippersnapper_i2c_v1_I2CDeviceOutputWrite_CALLBACK NULL #define wippersnapper_i2c_v1_I2CDeviceOutputWrite_DEFAULT NULL -#define wippersnapper_i2c_v1_I2CDeviceOutputWrite_output_msg_write_led_backpack_MSGTYPE wippersnapper_i2c_v1_LedBackpackWrite -#define wippersnapper_i2c_v1_I2CDeviceOutputWrite_output_msg_write_char_lcd_MSGTYPE wippersnapper_i2c_v1_CharLcdWrite -#define wippersnapper_i2c_v1_I2CDeviceOutputWrite_output_msg_write_ssd1306_MSGTYPE wippersnapper_i2c_v1_Ssd1306Write +#define wippersnapper_i2c_v1_I2CDeviceOutputWrite_output_msg_write_led_backpack_MSGTYPE wippersnapper_i2c_v1_LEDBackpackWrite +#define wippersnapper_i2c_v1_I2CDeviceOutputWrite_output_msg_write_char_lcd_MSGTYPE wippersnapper_i2c_v1_CharLCDWrite +#define wippersnapper_i2c_v1_I2CDeviceOutputWrite_output_msg_write_ssd1306_MSGTYPE wippersnapper_i2c_v1_SSD1306Write -#define wippersnapper_i2c_v1_LedBackpackConfig_FIELDLIST(X, a) \ +#define wippersnapper_i2c_v1_LEDBackpackConfig_FIELDLIST(X, a) \ X(a, STATIC, SINGULAR, INT32, brightness, 1) \ X(a, STATIC, SINGULAR, UENUM, alignment, 2) -#define wippersnapper_i2c_v1_LedBackpackConfig_CALLBACK NULL -#define wippersnapper_i2c_v1_LedBackpackConfig_DEFAULT NULL +#define wippersnapper_i2c_v1_LEDBackpackConfig_CALLBACK NULL +#define wippersnapper_i2c_v1_LEDBackpackConfig_DEFAULT NULL -#define wippersnapper_i2c_v1_CharLcdConfig_FIELDLIST(X, a) \ +#define wippersnapper_i2c_v1_CharLCDConfig_FIELDLIST(X, a) \ X(a, STATIC, SINGULAR, UINT32, rows, 1) \ X(a, STATIC, SINGULAR, UINT32, columns, 2) -#define wippersnapper_i2c_v1_CharLcdConfig_CALLBACK NULL -#define wippersnapper_i2c_v1_CharLcdConfig_DEFAULT NULL +#define wippersnapper_i2c_v1_CharLCDConfig_CALLBACK NULL +#define wippersnapper_i2c_v1_CharLCDConfig_DEFAULT NULL -#define wippersnapper_i2c_v1_Ssd1306Config_FIELDLIST(X, a) \ +#define wippersnapper_i2c_v1_SSD1306Config_FIELDLIST(X, a) \ X(a, STATIC, SINGULAR, UINT32, width, 1) \ X(a, STATIC, SINGULAR, UINT32, height, 2) \ X(a, STATIC, SINGULAR, UENUM, text_size, 3) -#define wippersnapper_i2c_v1_Ssd1306Config_CALLBACK NULL -#define wippersnapper_i2c_v1_Ssd1306Config_DEFAULT NULL +#define wippersnapper_i2c_v1_SSD1306Config_CALLBACK NULL +#define wippersnapper_i2c_v1_SSD1306Config_DEFAULT NULL -#define wippersnapper_i2c_v1_I2cOutputAdd_FIELDLIST(X, a) \ +#define wippersnapper_i2c_v1_I2COutputAdd_FIELDLIST(X, a) \ X(a, STATIC, ONEOF, MESSAGE, (config,led_backpack_config,config.led_backpack_config), 1) \ X(a, STATIC, ONEOF, MESSAGE, (config,char_lcd_config,config.char_lcd_config), 2) \ X(a, STATIC, ONEOF, MESSAGE, (config,ssd1306_config,config.ssd1306_config), 3) -#define wippersnapper_i2c_v1_I2cOutputAdd_CALLBACK NULL -#define wippersnapper_i2c_v1_I2cOutputAdd_DEFAULT NULL -#define wippersnapper_i2c_v1_I2cOutputAdd_config_led_backpack_config_MSGTYPE wippersnapper_i2c_v1_LedBackpackConfig -#define wippersnapper_i2c_v1_I2cOutputAdd_config_char_lcd_config_MSGTYPE wippersnapper_i2c_v1_CharLcdConfig -#define wippersnapper_i2c_v1_I2cOutputAdd_config_ssd1306_config_MSGTYPE wippersnapper_i2c_v1_Ssd1306Config +#define wippersnapper_i2c_v1_I2COutputAdd_CALLBACK NULL +#define wippersnapper_i2c_v1_I2COutputAdd_DEFAULT NULL +#define wippersnapper_i2c_v1_I2COutputAdd_config_led_backpack_config_MSGTYPE wippersnapper_i2c_v1_LEDBackpackConfig +#define wippersnapper_i2c_v1_I2COutputAdd_config_char_lcd_config_MSGTYPE wippersnapper_i2c_v1_CharLCDConfig +#define wippersnapper_i2c_v1_I2COutputAdd_config_ssd1306_config_MSGTYPE wippersnapper_i2c_v1_SSD1306Config -#define wippersnapper_i2c_v1_LedBackpackWrite_FIELDLIST(X, a) \ +#define wippersnapper_i2c_v1_LEDBackpackWrite_FIELDLIST(X, a) \ X(a, STATIC, SINGULAR, STRING, message, 1) -#define wippersnapper_i2c_v1_LedBackpackWrite_CALLBACK NULL -#define wippersnapper_i2c_v1_LedBackpackWrite_DEFAULT NULL +#define wippersnapper_i2c_v1_LEDBackpackWrite_CALLBACK NULL +#define wippersnapper_i2c_v1_LEDBackpackWrite_DEFAULT NULL -#define wippersnapper_i2c_v1_CharLcdWrite_FIELDLIST(X, a) \ +#define wippersnapper_i2c_v1_CharLCDWrite_FIELDLIST(X, a) \ X(a, STATIC, SINGULAR, STRING, message, 1) \ X(a, STATIC, SINGULAR, BOOL, enable_backlight, 2) -#define wippersnapper_i2c_v1_CharLcdWrite_CALLBACK NULL -#define wippersnapper_i2c_v1_CharLcdWrite_DEFAULT NULL +#define wippersnapper_i2c_v1_CharLCDWrite_CALLBACK NULL +#define wippersnapper_i2c_v1_CharLCDWrite_DEFAULT NULL -#define wippersnapper_i2c_v1_Ssd1306Write_FIELDLIST(X, a) \ +#define wippersnapper_i2c_v1_SSD1306Write_FIELDLIST(X, a) \ X(a, STATIC, SINGULAR, STRING, message, 1) -#define wippersnapper_i2c_v1_Ssd1306Write_CALLBACK NULL -#define wippersnapper_i2c_v1_Ssd1306Write_DEFAULT NULL +#define wippersnapper_i2c_v1_SSD1306Write_CALLBACK NULL +#define wippersnapper_i2c_v1_SSD1306Write_DEFAULT NULL extern const pb_msgdesc_t wippersnapper_i2c_v1_I2CBusInitRequest_msg; extern const pb_msgdesc_t wippersnapper_i2c_v1_I2CBusInitResponse_msg; @@ -519,13 +519,13 @@ extern const pb_msgdesc_t wippersnapper_i2c_v1_I2CDeviceDeinitResponse_msg; extern const pb_msgdesc_t wippersnapper_i2c_v1_SensorEvent_msg; extern const pb_msgdesc_t wippersnapper_i2c_v1_I2CDeviceEvent_msg; extern const pb_msgdesc_t wippersnapper_i2c_v1_I2CDeviceOutputWrite_msg; -extern const pb_msgdesc_t wippersnapper_i2c_v1_LedBackpackConfig_msg; -extern const pb_msgdesc_t wippersnapper_i2c_v1_CharLcdConfig_msg; -extern const pb_msgdesc_t wippersnapper_i2c_v1_Ssd1306Config_msg; -extern const pb_msgdesc_t wippersnapper_i2c_v1_I2cOutputAdd_msg; -extern const pb_msgdesc_t wippersnapper_i2c_v1_LedBackpackWrite_msg; -extern const pb_msgdesc_t wippersnapper_i2c_v1_CharLcdWrite_msg; -extern const pb_msgdesc_t wippersnapper_i2c_v1_Ssd1306Write_msg; +extern const pb_msgdesc_t wippersnapper_i2c_v1_LEDBackpackConfig_msg; +extern const pb_msgdesc_t wippersnapper_i2c_v1_CharLCDConfig_msg; +extern const pb_msgdesc_t wippersnapper_i2c_v1_SSD1306Config_msg; +extern const pb_msgdesc_t wippersnapper_i2c_v1_I2COutputAdd_msg; +extern const pb_msgdesc_t wippersnapper_i2c_v1_LEDBackpackWrite_msg; +extern const pb_msgdesc_t wippersnapper_i2c_v1_CharLCDWrite_msg; +extern const pb_msgdesc_t wippersnapper_i2c_v1_SSD1306Write_msg; /* Defines for backwards compatibility with code written before nanopb-0.4.0 */ #define wippersnapper_i2c_v1_I2CBusInitRequest_fields &wippersnapper_i2c_v1_I2CBusInitRequest_msg @@ -544,13 +544,13 @@ extern const pb_msgdesc_t wippersnapper_i2c_v1_Ssd1306Write_msg; #define wippersnapper_i2c_v1_SensorEvent_fields &wippersnapper_i2c_v1_SensorEvent_msg #define wippersnapper_i2c_v1_I2CDeviceEvent_fields &wippersnapper_i2c_v1_I2CDeviceEvent_msg #define wippersnapper_i2c_v1_I2CDeviceOutputWrite_fields &wippersnapper_i2c_v1_I2CDeviceOutputWrite_msg -#define wippersnapper_i2c_v1_LedBackpackConfig_fields &wippersnapper_i2c_v1_LedBackpackConfig_msg -#define wippersnapper_i2c_v1_CharLcdConfig_fields &wippersnapper_i2c_v1_CharLcdConfig_msg -#define wippersnapper_i2c_v1_Ssd1306Config_fields &wippersnapper_i2c_v1_Ssd1306Config_msg -#define wippersnapper_i2c_v1_I2cOutputAdd_fields &wippersnapper_i2c_v1_I2cOutputAdd_msg -#define wippersnapper_i2c_v1_LedBackpackWrite_fields &wippersnapper_i2c_v1_LedBackpackWrite_msg -#define wippersnapper_i2c_v1_CharLcdWrite_fields &wippersnapper_i2c_v1_CharLcdWrite_msg -#define wippersnapper_i2c_v1_Ssd1306Write_fields &wippersnapper_i2c_v1_Ssd1306Write_msg +#define wippersnapper_i2c_v1_LEDBackpackConfig_fields &wippersnapper_i2c_v1_LEDBackpackConfig_msg +#define wippersnapper_i2c_v1_CharLCDConfig_fields &wippersnapper_i2c_v1_CharLCDConfig_msg +#define wippersnapper_i2c_v1_SSD1306Config_fields &wippersnapper_i2c_v1_SSD1306Config_msg +#define wippersnapper_i2c_v1_I2COutputAdd_fields &wippersnapper_i2c_v1_I2COutputAdd_msg +#define wippersnapper_i2c_v1_LEDBackpackWrite_fields &wippersnapper_i2c_v1_LEDBackpackWrite_msg +#define wippersnapper_i2c_v1_CharLCDWrite_fields &wippersnapper_i2c_v1_CharLCDWrite_msg +#define wippersnapper_i2c_v1_SSD1306Write_fields &wippersnapper_i2c_v1_SSD1306Write_msg /* Maximum encoded size of messages (where known) */ #define wippersnapper_i2c_v1_I2CBusInitRequest_size 39 @@ -569,13 +569,13 @@ extern const pb_msgdesc_t wippersnapper_i2c_v1_Ssd1306Write_msg; #define wippersnapper_i2c_v1_SensorEvent_size 7 #define wippersnapper_i2c_v1_I2CDeviceEvent_size 141 #define wippersnapper_i2c_v1_I2CDeviceOutputWrite_size 157 -#define wippersnapper_i2c_v1_LedBackpackConfig_size 13 -#define wippersnapper_i2c_v1_CharLcdConfig_size 12 -#define wippersnapper_i2c_v1_Ssd1306Config_size 14 -#define wippersnapper_i2c_v1_I2cOutputAdd_size 16 -#define wippersnapper_i2c_v1_LedBackpackWrite_size 6 -#define wippersnapper_i2c_v1_CharLcdWrite_size 132 -#define wippersnapper_i2c_v1_Ssd1306Write_size 130 +#define wippersnapper_i2c_v1_LEDBackpackConfig_size 13 +#define wippersnapper_i2c_v1_CharLCDConfig_size 12 +#define wippersnapper_i2c_v1_SSD1306Config_size 14 +#define wippersnapper_i2c_v1_I2COutputAdd_size 16 +#define wippersnapper_i2c_v1_LEDBackpackWrite_size 6 +#define wippersnapper_i2c_v1_CharLCDWrite_size 132 +#define wippersnapper_i2c_v1_SSD1306Write_size 130 #ifdef __cplusplus } /* extern "C" */ diff --git a/src/wippersnapper/pin/v1/pin.pb.c b/src/wippersnapper/pin/v1/pin.pb.c index 46c277f2c..16860be97 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 May 16 18:09:01 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon May 19 19:15:20 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 493b5bac2..c642fabce 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 May 16 18:09:01 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon May 19 19:15:20 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 d43ba587d..c3d2f5cea 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 May 16 18:09:01 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon May 19 19:15:20 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 befb4bcca..e7734da23 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 May 16 18:09:01 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon May 19 19:15:20 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 c407b296b..5f3e27471 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 May 16 18:09:01 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon May 19 19:15:20 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 a53b8952c..85cea6fb2 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 May 16 18:09:01 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon May 19 19:15:20 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 9580ee2cd..3cd64b53a 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 May 16 18:09:01 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon May 19 19:15:20 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 7eacc8b27..f28101b4a 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 May 16 18:09:01 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon May 19 19:15:20 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 3bb465b1b..2aaf87efb 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 May 16 18:09:01 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon May 19 19:15:20 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 668f1f700..a571db1a6 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 May 16 18:09:01 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon May 19 19:15:20 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 7be53db8b..e0cae4499 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 May 16 18:09:01 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon May 19 19:15:20 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 a42d2c16a..fc2751c3e 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 May 16 18:09:01 2025. */ +/* Generated by nanopb-0.4.5-dev at Mon May 19 19:15:20 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 ff4a4167d03128b4b8be96afa3949296e83e44f8 Mon Sep 17 00:00:00 2001 From: brentru Date: Mon, 19 May 2025 15:55:18 -0400 Subject: [PATCH 16/34] Add Write Msg --- .../WipperSnapper_I2C_Driver_Out_Ssd1306.h | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h index 1f51659a5..1eebeac5c 100644 --- a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h @@ -104,7 +104,25 @@ class WipperSnapper_I2C_Driver_Out_Ssd1306 The message to be displayed. */ void WriteMessageSSD1306(const char *message) { - // noop + if (_display == nullptr) + return; + _display->clearDisplay(); + _display->setCursor(0, 0); + + // Calculate the line height based on the text size (NOTE: base height is + // 8px) + int16_t line_height = 8 * _text_sz; + + int16_t y_idx = 0; + for (int i = 0; message[i] != '\0'; i++) { + if (message[i] == '\n') { + y_idx += line_height; + _display->setCursor(0, y_idx); + } else { + _display->print(message[i]); + } + } + _display->display(); } protected: From 8529924d16ca93dae9a8d48ab4163493262466cf Mon Sep 17 00:00:00 2001 From: brentru Date: Mon, 19 May 2025 16:49:05 -0400 Subject: [PATCH 17/34] Looking into SSD1306 not writing properly --- src/Wippersnapper.cpp | 10 +++++----- src/components/i2c/WipperSnapper_I2C.cpp | 4 ++++ .../WipperSnapper_I2C_Driver_Out_Ssd1306.h | 16 +++++++++++++--- .../register/Wippersnapper_Register.cpp | 1 + 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/Wippersnapper.cpp b/src/Wippersnapper.cpp index 65f47b4d9..cb973115d 100644 --- a/src/Wippersnapper.cpp +++ b/src/Wippersnapper.cpp @@ -2834,7 +2834,7 @@ void Wippersnapper::connect() { #endif // Configure hardware - WS.pinCfgCompleted = false; + WS.pinCfgCompleted = true; while (!WS.pinCfgCompleted) { WS_DEBUG_PRINTLN( "Polling for message containing hardware configuration..."); @@ -2901,26 +2901,26 @@ ws_status_t Wippersnapper::run() { WS._mqtt->processPackets(10); WS.feedWDT(); - // Process digital inputs, digitalGPIO module +/* // Process digital inputs, digitalGPIO module WS._digitalGPIO->processDigitalInputs(); WS.feedWDT(); // Process analog inputs WS._analogIO->update(); - WS.feedWDT(); + WS.feedWDT(); */ // Process I2C sensor events if (WS._isI2CPort0Init) WS._i2cPort0->update(); WS.feedWDT(); - // Process DS18x20 sensor events +/* // Process DS18x20 sensor events WS._ds18x20Component->update(); WS.feedWDT(); // Process UART sensor events WS._uartComponent->update(); - WS.feedWDT(); + WS.feedWDT(); */ return WS_NET_CONNECTED; // TODO: Make this funcn void! } diff --git a/src/components/i2c/WipperSnapper_I2C.cpp b/src/components/i2c/WipperSnapper_I2C.cpp index 35210d258..4c1a8a82c 100644 --- a/src/components/i2c/WipperSnapper_I2C.cpp +++ b/src/components/i2c/WipperSnapper_I2C.cpp @@ -879,7 +879,9 @@ bool WipperSnapper_Component_I2C::initI2CDevice( _drivers_out.push_back(_sevenSeg); WS_DEBUG_PRINTLN("7-Segement LED Matrix Initialized Successfully!"); } else if (strcmp("ssd1306", msgDeviceInitReq->i2c_device_name) == 0) { + WS_DEBUG_PRINTLN("SSD1306 display detected!"); _ssd1306 = new WipperSnapper_I2C_Driver_Out_Ssd1306(this->_i2c, i2cAddress); + WS_DEBUG_PRINTLN("Configuring SSD1306 display..."); _ssd1306->ConfigureSSD1306( (uint8_t)msgDeviceInitReq->i2c_output_add.config.ssd1306_config.width, (uint8_t)msgDeviceInitReq->i2c_output_add.config.ssd1306_config.height, @@ -891,6 +893,7 @@ bool WipperSnapper_Component_I2C::initI2CDevice( wippersnapper_i2c_v1_BusResponse_BUS_RESPONSE_DEVICE_INIT_FAIL; return false; } + WS_DEBUG_PRINTLN("SSD1306 display configured successfully!"); _drivers_out.push_back(_ssd1306); WS_DEBUG_PRINTLN("SSD1306 display initialized Successfully!"); } else { @@ -1190,6 +1193,7 @@ bool WipperSnapper_Component_I2C::Handle_I2cDeviceOutputWrite( driver_out->WriteMessageCharLCD(&msgDeviceWrite->output_msg.write_char_lcd); } else if (msgDeviceWrite->which_output_msg == wippersnapper_i2c_v1_I2CDeviceOutputWrite_write_ssd1306_tag) { + WS_DEBUG_PRINTLN("Calling WriteMessageSSD1306.."); driver_out->WriteMessageSSD1306( msgDeviceWrite->output_msg.write_ssd1306.message); } else { diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h index 1eebeac5c..a551e96d1 100644 --- a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h @@ -64,14 +64,16 @@ class WipperSnapper_I2C_Driver_Out_Ssd1306 */ bool begin() { _display = new Adafruit_SSD1306(_width, _height, _i2c); - bool did_begin = _display->begin(SSD1306_SWITCHCAPVCC, _sensorAddress); + bool did_begin = _display->begin( + SSD1306_SWITCHCAPVCC, + 0x3C); // TODO: Note that this is hardcoded, not sure why not init'd yet if (!did_begin) return false; // Show initial display buffer contents on the screen -- // the library initializes this with an Adafruit splash screen. _display->display(); - delay(2000); + delay(1000); // Clear the buffer _display->clearDisplay(); // Configure the text size and color @@ -79,6 +81,7 @@ class WipperSnapper_I2C_Driver_Out_Ssd1306 _display->setTextColor(SSD1306_WHITE); // Reset the cursor position _display->setCursor(0, 0); + _display->display(); return true; } @@ -107,18 +110,25 @@ class WipperSnapper_I2C_Driver_Out_Ssd1306 if (_display == nullptr) return; _display->clearDisplay(); - _display->setCursor(0, 0); // Calculate the line height based on the text size (NOTE: base height is // 8px) int16_t line_height = 8 * _text_sz; + WS_DEBUG_PRINT("Line height: "); + WS_DEBUG_PRINTLN(line_height); int16_t y_idx = 0; + _display->setCursor(0, y_idx); for (int i = 0; message[i] != '\0'; i++) { if (message[i] == '\n') { + WS_DEBUG_PRINTLN("New line detected!"); y_idx += line_height; _display->setCursor(0, y_idx); } else { + WS_DEBUG_PRINT("Printing char: "); + WS_DEBUG_PRINT(message[i]); + WS_DEBUG_PRINT(" at y: "); + WS_DEBUG_PRINTLN(y_idx); _display->print(message[i]); } } 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 a86ead84570c27c0806b498650a1d069d563369d Mon Sep 17 00:00:00 2001 From: brentru Date: Tue, 20 May 2025 11:29:03 -0400 Subject: [PATCH 18/34] Test on 128x32, new PBs to match 8e89fdf --- .../WipperSnapper_I2C_Driver_Out_Ssd1306.h | 36 +++++++++++-------- .../description/v1/description.pb.c | 2 +- .../description/v1/description.pb.h | 2 +- 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 | 9 +++-- 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 +- 19 files changed, 42 insertions(+), 37 deletions(-) diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h index a551e96d1..54667e78d 100644 --- a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h @@ -63,17 +63,17 @@ class WipperSnapper_I2C_Driver_Out_Ssd1306 @returns True if initialized successfully, False otherwise. */ bool begin() { + WS_DEBUG_PRINT("New SSD1306 with height: "); + WS_DEBUG_PRINT(_height); + WS_DEBUG_PRINT(" width: "); + WS_DEBUG_PRINT(_width); + WS_DEBUG_PRINT(" text size: "); + WS_DEBUG_PRINT(_text_sz); _display = new Adafruit_SSD1306(_width, _height, _i2c); - bool did_begin = _display->begin( - SSD1306_SWITCHCAPVCC, - 0x3C); // TODO: Note that this is hardcoded, not sure why not init'd yet + // TODO: Use _sensorAddress instead of 0x3C hardcode! + bool did_begin = _display->begin(SSD1306_SWITCHCAPVCC, 0x3C); if (!did_begin) - return false; - - // Show initial display buffer contents on the screen -- - // the library initializes this with an Adafruit splash screen. - _display->display(); - delay(1000); + return false; // Clear the buffer _display->clearDisplay(); // Configure the text size and color @@ -82,7 +82,7 @@ class WipperSnapper_I2C_Driver_Out_Ssd1306 // Reset the cursor position _display->setCursor(0, 0); _display->display(); - return true; + return did_begin; } /*! @@ -118,21 +118,27 @@ class WipperSnapper_I2C_Driver_Out_Ssd1306 WS_DEBUG_PRINTLN(line_height); int16_t y_idx = 0; + uint16_t c_idx = 0; _display->setCursor(0, y_idx); - for (int i = 0; message[i] != '\0'; i++) { - if (message[i] == '\n') { + for (int i = 0; i < strlen(message); i++) { + char c = message[c_idx]; + if (c == '\\' && message[c_idx + 1] == 'n') { WS_DEBUG_PRINTLN("New line detected!"); + // Skip the '\n' character in the buffer + c_idx += 2; + // Move the cursor to the next line y_idx += line_height; _display->setCursor(0, y_idx); } else { WS_DEBUG_PRINT("Printing char: "); - WS_DEBUG_PRINT(message[i]); + WS_DEBUG_PRINT(message[c_idx]); WS_DEBUG_PRINT(" at y: "); WS_DEBUG_PRINTLN(y_idx); - _display->print(message[i]); + _display->print(message[c_idx]); + _display->display(); + c_idx++; } } - _display->display(); } protected: diff --git a/src/wippersnapper/description/v1/description.pb.c b/src/wippersnapper/description/v1/description.pb.c index 279790cc7..6fb09563c 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 May 19 19:15:20 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue May 20 15:26:04 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 878cb39e0..025e7a847 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 May 19 19:15:20 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue May 20 15:26:04 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/ds18x20/v1/ds18x20.pb.c b/src/wippersnapper/ds18x20/v1/ds18x20.pb.c index 3a878fdbf..b8fa5af1d 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 May 19 19:15:20 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue May 20 15:26:04 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 1be747f1c..422348ae9 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 May 19 19:15:20 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue May 20 15:26:04 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 bd0fb1d76..8e844016d 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 May 19 19:15:20 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue May 20 15:26:04 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 31ba0bcd7..b9de87e58 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 May 19 19:15:20 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue May 20 15:26:04 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 @@ -69,8 +69,7 @@ typedef enum _wippersnapper_i2c_v1_LEDBackpackAlignment { typedef enum _wippersnapper_i2c_v1_SSD1306TextSize { wippersnapper_i2c_v1_SSD1306TextSize_SSD1306_TEXT_SIZE_UNSPECIFIED = 0, wippersnapper_i2c_v1_SSD1306TextSize_SSD1306_TEXT_SIZE_1 = 1, - wippersnapper_i2c_v1_SSD1306TextSize_SSD1306_TEXT_SIZE_2 = 2, - wippersnapper_i2c_v1_SSD1306TextSize_SSD1306_TEXT_SIZE_3 = 3 + wippersnapper_i2c_v1_SSD1306TextSize_SSD1306_TEXT_SIZE_2 = 2 } wippersnapper_i2c_v1_SSD1306TextSize; /* Struct definitions */ @@ -227,8 +226,8 @@ typedef struct _wippersnapper_i2c_v1_I2CDeviceInitRequest { #define _wippersnapper_i2c_v1_LEDBackpackAlignment_ARRAYSIZE ((wippersnapper_i2c_v1_LEDBackpackAlignment)(wippersnapper_i2c_v1_LEDBackpackAlignment_LED_BACKPACK_ALIGNMENT_RIGHT+1)) #define _wippersnapper_i2c_v1_SSD1306TextSize_MIN wippersnapper_i2c_v1_SSD1306TextSize_SSD1306_TEXT_SIZE_UNSPECIFIED -#define _wippersnapper_i2c_v1_SSD1306TextSize_MAX wippersnapper_i2c_v1_SSD1306TextSize_SSD1306_TEXT_SIZE_3 -#define _wippersnapper_i2c_v1_SSD1306TextSize_ARRAYSIZE ((wippersnapper_i2c_v1_SSD1306TextSize)(wippersnapper_i2c_v1_SSD1306TextSize_SSD1306_TEXT_SIZE_3+1)) +#define _wippersnapper_i2c_v1_SSD1306TextSize_MAX wippersnapper_i2c_v1_SSD1306TextSize_SSD1306_TEXT_SIZE_2 +#define _wippersnapper_i2c_v1_SSD1306TextSize_ARRAYSIZE ((wippersnapper_i2c_v1_SSD1306TextSize)(wippersnapper_i2c_v1_SSD1306TextSize_SSD1306_TEXT_SIZE_2+1)) #ifdef __cplusplus diff --git a/src/wippersnapper/pin/v1/pin.pb.c b/src/wippersnapper/pin/v1/pin.pb.c index 16860be97..fc306919a 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 May 19 19:15:20 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue May 20 15:26:04 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 c642fabce..5c8dfa04f 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 May 19 19:15:20 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue May 20 15:26:04 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 c3d2f5cea..7928f12f2 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 May 19 19:15:20 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue May 20 15:26:04 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 e7734da23..d2917dbac 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 May 19 19:15:20 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue May 20 15:26:04 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 5f3e27471..80840510d 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 May 19 19:15:20 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue May 20 15:26:04 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 85cea6fb2..8da72b188 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 May 19 19:15:20 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue May 20 15:26:04 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 3cd64b53a..84e351520 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 May 19 19:15:20 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue May 20 15:26:04 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 f28101b4a..a5352541a 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 May 19 19:15:20 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue May 20 15:26:04 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 2aaf87efb..37754d8c2 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 May 19 19:15:20 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue May 20 15:26:04 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 a571db1a6..05675f6b9 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 May 19 19:15:20 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue May 20 15:26:04 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 e0cae4499..40317944b 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 May 19 19:15:20 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue May 20 15:26:04 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 fc2751c3e..d20db9e64 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 May 19 19:15:20 2025. */ +/* Generated by nanopb-0.4.5-dev at Tue May 20 15:26:04 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 47afeb7b7fa7c363279a56baa12693fe94ad17cb Mon Sep 17 00:00:00 2001 From: brentru Date: Tue, 20 May 2025 14:30:09 -0400 Subject: [PATCH 19/34] Works on both display sizes --- src/components/i2c/WipperSnapper_I2C.cpp | 1 - .../WipperSnapper_I2C_Driver_Out_Ssd1306.h | 52 ++++++++----------- 2 files changed, 21 insertions(+), 32 deletions(-) diff --git a/src/components/i2c/WipperSnapper_I2C.cpp b/src/components/i2c/WipperSnapper_I2C.cpp index 4c1a8a82c..13b2e03e9 100644 --- a/src/components/i2c/WipperSnapper_I2C.cpp +++ b/src/components/i2c/WipperSnapper_I2C.cpp @@ -1193,7 +1193,6 @@ bool WipperSnapper_Component_I2C::Handle_I2cDeviceOutputWrite( driver_out->WriteMessageCharLCD(&msgDeviceWrite->output_msg.write_char_lcd); } else if (msgDeviceWrite->which_output_msg == wippersnapper_i2c_v1_I2CDeviceOutputWrite_write_ssd1306_tag) { - WS_DEBUG_PRINTLN("Calling WriteMessageSSD1306.."); driver_out->WriteMessageSSD1306( msgDeviceWrite->output_msg.write_ssd1306.message); } else { diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h index 54667e78d..fd6c5d828 100644 --- a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h @@ -20,8 +20,8 @@ #include #include -#define DEFAULT_WIDTH 128 -#define DEFAULT_HEIGHT 64 +#define DEFAULT_WIDTH 128 ///< Default width for a ssd1306 128x64 display +#define DEFAULT_HEIGHT 64 ///< Default height for a ssd1306 128x64 display /*! @brief Class that provides a driver interface for a SSD1306 @@ -63,17 +63,10 @@ class WipperSnapper_I2C_Driver_Out_Ssd1306 @returns True if initialized successfully, False otherwise. */ bool begin() { - WS_DEBUG_PRINT("New SSD1306 with height: "); - WS_DEBUG_PRINT(_height); - WS_DEBUG_PRINT(" width: "); - WS_DEBUG_PRINT(_width); - WS_DEBUG_PRINT(" text size: "); - WS_DEBUG_PRINT(_text_sz); + // Attempt to create and allocate a SSD1306 obj. _display = new Adafruit_SSD1306(_width, _height, _i2c); - // TODO: Use _sensorAddress instead of 0x3C hardcode! - bool did_begin = _display->begin(SSD1306_SWITCHCAPVCC, 0x3C); - if (!did_begin) - return false; + if (!_display->begin(SSD1306_SWITCHCAPVCC, _sensorAddress)) + return false; // Clear the buffer _display->clearDisplay(); // Configure the text size and color @@ -82,7 +75,7 @@ class WipperSnapper_I2C_Driver_Out_Ssd1306 // Reset the cursor position _display->setCursor(0, 0); _display->display(); - return did_begin; + return true; } /*! @@ -109,34 +102,31 @@ class WipperSnapper_I2C_Driver_Out_Ssd1306 void WriteMessageSSD1306(const char *message) { 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(SSD1306_WHITE); + _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; - WS_DEBUG_PRINT("Line height: "); - WS_DEBUG_PRINTLN(line_height); - - int16_t y_idx = 0; uint16_t c_idx = 0; - _display->setCursor(0, y_idx); - for (int i = 0; i < strlen(message); i++) { - char c = message[c_idx]; - if (c == '\\' && message[c_idx + 1] == 'n') { - WS_DEBUG_PRINTLN("New line detected!"); - // Skip the '\n' character in the buffer - c_idx += 2; - // Move the cursor to the next line + 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') { + // detected a newline char sequence (\n) + i++; + // Skip to the next possible line y_idx += line_height; _display->setCursor(0, y_idx); } else { - WS_DEBUG_PRINT("Printing char: "); - WS_DEBUG_PRINT(message[c_idx]); - WS_DEBUG_PRINT(" at y: "); - WS_DEBUG_PRINTLN(y_idx); - _display->print(message[c_idx]); + _display->print(message[i]); _display->display(); - c_idx++; } } } From fa0b3c65553fc5a1c8bf223bae0ec8e57f9e6812 Mon Sep 17 00:00:00 2001 From: brentru Date: Tue, 20 May 2025 14:34:19 -0400 Subject: [PATCH 20/34] Put back auto-config scaffolding --- src/Wippersnapper.cpp | 9 ++++----- src/components/register/Wippersnapper_Register.cpp | 1 - 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/Wippersnapper.cpp b/src/Wippersnapper.cpp index cb973115d..6d11aeb00 100644 --- a/src/Wippersnapper.cpp +++ b/src/Wippersnapper.cpp @@ -2834,7 +2834,6 @@ void Wippersnapper::connect() { #endif // Configure hardware - WS.pinCfgCompleted = true; while (!WS.pinCfgCompleted) { WS_DEBUG_PRINTLN( "Polling for message containing hardware configuration..."); @@ -2901,26 +2900,26 @@ ws_status_t Wippersnapper::run() { WS._mqtt->processPackets(10); WS.feedWDT(); -/* // Process digital inputs, digitalGPIO module + // Process digital inputs, digitalGPIO module WS._digitalGPIO->processDigitalInputs(); WS.feedWDT(); // Process analog inputs WS._analogIO->update(); - WS.feedWDT(); */ + WS.feedWDT(); // Process I2C sensor events if (WS._isI2CPort0Init) WS._i2cPort0->update(); WS.feedWDT(); -/* // Process DS18x20 sensor events + // Process DS18x20 sensor events WS._ds18x20Component->update(); WS.feedWDT(); // Process UART sensor events WS._uartComponent->update(); - WS.feedWDT(); */ + WS.feedWDT(); return WS_NET_CONNECTED; // TODO: Make this funcn void! } diff --git a/src/components/register/Wippersnapper_Register.cpp b/src/components/register/Wippersnapper_Register.cpp index 4ad9ec5c4..522818997 100644 --- a/src/components/register/Wippersnapper_Register.cpp +++ b/src/components/register/Wippersnapper_Register.cpp @@ -77,7 +77,6 @@ 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 c4c0fcdb26d3458fd82c6d44f4a5be8e907d0107 Mon Sep 17 00:00:00 2001 From: brentru Date: Tue, 20 May 2025 14:36:14 -0400 Subject: [PATCH 21/34] Add deps.! --- library.properties | 2 +- platformio.ini | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/library.properties b/library.properties index 554e9f570..728a8bb18 100644 --- a/library.properties +++ b/library.properties @@ -7,4 +7,4 @@ paragraph=Arduino application for Adafruit.io WipperSnapper category=Communication url=https://github.com/adafruit/Adafruit_Wippersnapper_Arduino architectures=* -depends=SdFat - Adafruit Fork, Adafruit NeoPixel, Adafruit SPIFlash, ArduinoJson, Adafruit DotStar, Adafruit HDC302x, Adafruit INA219, Adafruit INA260 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 +depends=SdFat - Adafruit Fork, Adafruit NeoPixel, Adafruit SPIFlash, ArduinoJson, Adafruit DotStar, Adafruit HDC302x, Adafruit INA219, Adafruit INA260 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 SSD1306 diff --git a/platformio.ini b/platformio.ini index 94de74f94..338e55c8b 100644 --- a/platformio.ini +++ b/platformio.ini @@ -82,6 +82,9 @@ lib_deps = adafruit/Adafruit MQTT Library bblanchon/ArduinoJson adafruit/Adafruit LiquidCrystal + adafruit/Adafruit LED Backpack Library + adafruit/Adafruit PM25 AQI Sensor + adafruit/Adafruit SSD1306 https://github.com/pstolarz/OneWireNg.git https://github.com/milesburton/Arduino-Temperature-Control-Library.git https://github.com/Sensirion/arduino-sht.git @@ -91,8 +94,6 @@ lib_deps = https://github.com/adafruit/WiFiNINA.git https://github.com/Starmbi/hp_BH1750.git https://github.com/adafruit/Adafruit_TinyUSB_Arduino.git - https://github.com/adafruit/Adafruit_LED_Backpack.git - https://github.com/adafruit/Adafruit_PM25AQI.git From 9e1d67722caa3a542f4cf24494a32db3ce551b86 Mon Sep 17 00:00:00 2001 From: brentru Date: Tue, 20 May 2025 14:52:28 -0400 Subject: [PATCH 22/34] Doxygen --- .../i2c/drivers/WipperSnapper_I2C_Driver_Out.h | 4 ++-- .../i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h | 10 ++++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h index ab6982db2..e806a0dab 100644 --- a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out.h @@ -60,8 +60,8 @@ class WipperSnapper_I2C_Driver_Out : public WipperSnapper_I2C_Driver { The width of the display in pixels. @param height The height of the display in pixels. - @param i2c_address - The I2C address of the display. + @param text_size + The display's text size. */ virtual void ConfigureSSD1306(uint8_t width, uint8_t height, uint8_t text_size) { diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h index fd6c5d828..b4ad848f8 100644 --- a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h @@ -85,8 +85,8 @@ class WipperSnapper_I2C_Driver_Out_Ssd1306 The width of the display in pixels. @param height The height of the display in pixels. - @param i2c_address - The I2C address of the display. + @param text_size + The magnification factor for the text size. */ void ConfigureSSD1306(uint8_t width, uint8_t height, uint8_t text_size) { _width = width; @@ -133,8 +133,10 @@ class WipperSnapper_I2C_Driver_Out_Ssd1306 protected: Adafruit_SSD1306 *_display = - nullptr; ///< Pointer to the Adafruit_SSD1306 object - uint8_t _width, _height, _text_sz; ///< Width and height of the display + nullptr; ///< Pointer to the Adafruit_SSD1306 object + uint8_t _width; ///< Width of the display in pixels + uint8_t _height; ///< Height of the display in pixels + uint8_t _text_sz; ///< Text size of the display }; #endif // WIPPERSNAPPER_I2C_DRIVER_OUT_SSD1306_H \ No newline at end of file From 86896852e4cab386f073a5ee3d4c505ed9ceb88c Mon Sep 17 00:00:00 2001 From: brentru Date: Wed, 21 May 2025 12:27:37 -0400 Subject: [PATCH 23/34] Turn display off before dtor'ing --- .../i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h index b4ad848f8..a31aef7da 100644 --- a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h @@ -53,6 +53,7 @@ class WipperSnapper_I2C_Driver_Out_Ssd1306 */ ~WipperSnapper_I2C_Driver_Out_Ssd1306() { if (_display != nullptr) { + _display->ssd1306_command(SSD1306_DISPLAYOFF); delete _display; _display = nullptr; } From 6e7daf902789eb0bee7da9979385ded00ae78090 Mon Sep 17 00:00:00 2001 From: brentru Date: Thu, 5 Jun 2025 14:30:25 -0400 Subject: [PATCH 24/34] fix SSD1306 bugs --- src/components/i2c/WipperSnapper_I2C.cpp | 3 ++- .../WipperSnapper_I2C_Driver_Out_Ssd1306.h | 10 +++++++--- .../description/v1/description.pb.c | 2 +- .../description/v1/description.pb.h | 2 +- src/wippersnapper/ds18x20/v1/ds18x20.pb.c | 2 +- src/wippersnapper/ds18x20/v1/ds18x20.pb.h | 2 +- src/wippersnapper/i2c/v1/i2c.pb.c | 10 +++++----- src/wippersnapper/i2c/v1/i2c.pb.h | 18 +++++++++--------- 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 +- 20 files changed, 41 insertions(+), 36 deletions(-) diff --git a/src/components/i2c/WipperSnapper_I2C.cpp b/src/components/i2c/WipperSnapper_I2C.cpp index 13b2e03e9..d68f88b18 100644 --- a/src/components/i2c/WipperSnapper_I2C.cpp +++ b/src/components/i2c/WipperSnapper_I2C.cpp @@ -878,7 +878,8 @@ bool WipperSnapper_Component_I2C::initI2CDevice( } _drivers_out.push_back(_sevenSeg); WS_DEBUG_PRINTLN("7-Segement LED Matrix Initialized Successfully!"); - } else if (strcmp("ssd1306", msgDeviceInitReq->i2c_device_name) == 0) { + } else if (strcmp("oled128x32default", msgDeviceInitReq->i2c_device_name) == + 0) { WS_DEBUG_PRINTLN("SSD1306 display detected!"); _ssd1306 = new WipperSnapper_I2C_Driver_Out_Ssd1306(this->_i2c, i2cAddress); WS_DEBUG_PRINTLN("Configuring SSD1306 display..."); diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h index a31aef7da..cd1ea9914 100644 --- a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h @@ -73,9 +73,8 @@ class WipperSnapper_I2C_Driver_Out_Ssd1306 // Configure the text size and color _display->setTextSize(_text_sz); _display->setTextColor(SSD1306_WHITE); - // Reset the cursor position - _display->setCursor(0, 0); - _display->display(); + // Use full 256 char 'Code Page 437' font + _display->cp437(true); return true; } @@ -118,6 +117,7 @@ class WipperSnapper_I2C_Driver_Out_Ssd1306 int16_t line_height = 8 * _text_sz; uint16_t c_idx = 0; size_t msg_size = strlen(message); + // _display->cp437(true); for (size_t i = 0; i < msg_size && c_idx < msg_size; i++) { if (message[i] == '\\' && i + 1 < msg_size && message[i + 1] == 'n') { // detected a newline char sequence (\n) @@ -125,6 +125,10 @@ class WipperSnapper_I2C_Driver_Out_Ssd1306 // Skip to the next possible line y_idx += line_height; _display->setCursor(0, y_idx); + } else if (message[i] == 0xC2 || message[i + 1] == 0xB0) { + _display->write(char(248)); + _display->display(); + i++; } else { _display->print(message[i]); _display->display(); diff --git a/src/wippersnapper/description/v1/description.pb.c b/src/wippersnapper/description/v1/description.pb.c index 6fb09563c..a2a9a0b81 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 May 20 15:26:04 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Jun 5 15:39:11 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 025e7a847..04bccb232 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 May 20 15:26:04 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Jun 5 15:39:11 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/ds18x20/v1/ds18x20.pb.c b/src/wippersnapper/ds18x20/v1/ds18x20.pb.c index b8fa5af1d..d98a397d0 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 May 20 15:26:04 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Jun 5 15:39:11 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 422348ae9..c3c8afafb 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 May 20 15:26:04 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Jun 5 15:39:11 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 8e844016d..8707945f0 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 May 20 15:26:04 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Jun 5 15:39:11 2025. */ #include "wippersnapper/i2c/v1/i2c.pb.h" #if PB_PROTO_HEADER_VERSION != 40 @@ -27,13 +27,13 @@ PB_BIND(wippersnapper_i2c_v1_I2CDeviceSensorProperties, wippersnapper_i2c_v1_I2C PB_BIND(wippersnapper_i2c_v1_I2CDeviceInitRequests, wippersnapper_i2c_v1_I2CDeviceInitRequests, AUTO) -PB_BIND(wippersnapper_i2c_v1_I2CDeviceInitRequest, wippersnapper_i2c_v1_I2CDeviceInitRequest, AUTO) +PB_BIND(wippersnapper_i2c_v1_I2CDeviceInitRequest, wippersnapper_i2c_v1_I2CDeviceInitRequest, 2) PB_BIND(wippersnapper_i2c_v1_I2CDeviceInitResponse, wippersnapper_i2c_v1_I2CDeviceInitResponse, AUTO) -PB_BIND(wippersnapper_i2c_v1_I2CDeviceUpdateRequest, wippersnapper_i2c_v1_I2CDeviceUpdateRequest, AUTO) +PB_BIND(wippersnapper_i2c_v1_I2CDeviceUpdateRequest, wippersnapper_i2c_v1_I2CDeviceUpdateRequest, 2) PB_BIND(wippersnapper_i2c_v1_I2CDeviceUpdateResponse, wippersnapper_i2c_v1_I2CDeviceUpdateResponse, AUTO) @@ -51,7 +51,7 @@ PB_BIND(wippersnapper_i2c_v1_SensorEvent, wippersnapper_i2c_v1_SensorEvent, AUTO PB_BIND(wippersnapper_i2c_v1_I2CDeviceEvent, wippersnapper_i2c_v1_I2CDeviceEvent, AUTO) -PB_BIND(wippersnapper_i2c_v1_I2CDeviceOutputWrite, wippersnapper_i2c_v1_I2CDeviceOutputWrite, AUTO) +PB_BIND(wippersnapper_i2c_v1_I2CDeviceOutputWrite, wippersnapper_i2c_v1_I2CDeviceOutputWrite, 2) PB_BIND(wippersnapper_i2c_v1_LEDBackpackConfig, wippersnapper_i2c_v1_LEDBackpackConfig, AUTO) @@ -72,7 +72,7 @@ PB_BIND(wippersnapper_i2c_v1_LEDBackpackWrite, wippersnapper_i2c_v1_LEDBackpackW PB_BIND(wippersnapper_i2c_v1_CharLCDWrite, wippersnapper_i2c_v1_CharLCDWrite, AUTO) -PB_BIND(wippersnapper_i2c_v1_SSD1306Write, wippersnapper_i2c_v1_SSD1306Write, AUTO) +PB_BIND(wippersnapper_i2c_v1_SSD1306Write, wippersnapper_i2c_v1_SSD1306Write, 2) diff --git a/src/wippersnapper/i2c/v1/i2c.pb.h b/src/wippersnapper/i2c/v1/i2c.pb.h index b9de87e58..639e4d1c2 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 May 20 15:26:04 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Jun 5 15:39:11 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 @@ -150,7 +150,7 @@ typedef struct _wippersnapper_i2c_v1_SSD1306Config { } wippersnapper_i2c_v1_SSD1306Config; typedef struct _wippersnapper_i2c_v1_SSD1306Write { - char message[128]; + char message[256]; } wippersnapper_i2c_v1_SSD1306Write; typedef struct _wippersnapper_i2c_v1_SensorEvent { @@ -172,7 +172,7 @@ typedef struct _wippersnapper_i2c_v1_I2CDeviceEvent { typedef struct _wippersnapper_i2c_v1_I2CDeviceOutputWrite { uint32_t i2c_device_address; - char i2c_device_name[15]; + char i2c_device_name[256]; pb_size_t which_output_msg; union { wippersnapper_i2c_v1_LEDBackpackWrite write_led_backpack; @@ -184,7 +184,7 @@ typedef struct _wippersnapper_i2c_v1_I2CDeviceOutputWrite { typedef struct _wippersnapper_i2c_v1_I2CDeviceUpdateRequest { int32_t i2c_port_number; uint32_t i2c_device_address; - char i2c_device_name[15]; + char i2c_device_name[256]; pb_size_t i2c_device_properties_count; wippersnapper_i2c_v1_I2CDeviceSensorProperties i2c_device_properties[15]; } wippersnapper_i2c_v1_I2CDeviceUpdateRequest; @@ -203,7 +203,7 @@ typedef struct _wippersnapper_i2c_v1_I2CDeviceInitRequest { bool has_i2c_bus_init_req; wippersnapper_i2c_v1_I2CBusInitRequest i2c_bus_init_req; uint32_t i2c_device_address; - char i2c_device_name[15]; + char i2c_device_name[256]; pb_size_t i2c_device_properties_count; wippersnapper_i2c_v1_I2CDeviceSensorProperties i2c_device_properties[15]; bool is_output_device; @@ -559,22 +559,22 @@ extern const pb_msgdesc_t wippersnapper_i2c_v1_SSD1306Write_msg; #define wippersnapper_i2c_v1_I2CBusScanResponse_size 722 #define wippersnapper_i2c_v1_I2CDeviceSensorProperties_size 8 /* wippersnapper_i2c_v1_I2CDeviceInitRequests_size depends on runtime parameters */ -#define wippersnapper_i2c_v1_I2CDeviceInitRequest_size 244 +#define wippersnapper_i2c_v1_I2CDeviceInitRequest_size 486 #define wippersnapper_i2c_v1_I2CDeviceInitResponse_size 8 -#define wippersnapper_i2c_v1_I2CDeviceUpdateRequest_size 183 +#define wippersnapper_i2c_v1_I2CDeviceUpdateRequest_size 425 #define wippersnapper_i2c_v1_I2CDeviceUpdateResponse_size 8 #define wippersnapper_i2c_v1_I2CDeviceDeinitRequest_size 17 #define wippersnapper_i2c_v1_I2CDeviceDeinitResponse_size 8 #define wippersnapper_i2c_v1_SensorEvent_size 7 #define wippersnapper_i2c_v1_I2CDeviceEvent_size 141 -#define wippersnapper_i2c_v1_I2CDeviceOutputWrite_size 157 +#define wippersnapper_i2c_v1_I2CDeviceOutputWrite_size 525 #define wippersnapper_i2c_v1_LEDBackpackConfig_size 13 #define wippersnapper_i2c_v1_CharLCDConfig_size 12 #define wippersnapper_i2c_v1_SSD1306Config_size 14 #define wippersnapper_i2c_v1_I2COutputAdd_size 16 #define wippersnapper_i2c_v1_LEDBackpackWrite_size 6 #define wippersnapper_i2c_v1_CharLCDWrite_size 132 -#define wippersnapper_i2c_v1_SSD1306Write_size 130 +#define wippersnapper_i2c_v1_SSD1306Write_size 258 #ifdef __cplusplus } /* extern "C" */ diff --git a/src/wippersnapper/pin/v1/pin.pb.c b/src/wippersnapper/pin/v1/pin.pb.c index fc306919a..1af87d19c 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 May 20 15:26:04 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Jun 5 15:39:11 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 5c8dfa04f..25a1c308c 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 May 20 15:26:04 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Jun 5 15:39:11 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 7928f12f2..cc0676d86 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 May 20 15:26:04 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Jun 5 15:39:11 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 d2917dbac..ec7012740 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 May 20 15:26:04 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Jun 5 15:39:11 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 80840510d..5b7e93edd 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 May 20 15:26:04 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Jun 5 15:39:11 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 8da72b188..6276ce124 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 May 20 15:26:04 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Jun 5 15:39:11 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 84e351520..2abade5e6 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 May 20 15:26:04 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Jun 5 15:39:11 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 a5352541a..f2c1335ae 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 May 20 15:26:04 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Jun 5 15:39:11 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 37754d8c2..bc878712c 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 May 20 15:26:04 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Jun 5 15:39:11 2025. */ #include "wippersnapper/signal/v1/signal.pb.h" #if PB_PROTO_HEADER_VERSION != 40 @@ -18,7 +18,7 @@ PB_BIND(wippersnapper_signal_v1_Ds18x20Request, wippersnapper_signal_v1_Ds18x20R PB_BIND(wippersnapper_signal_v1_Ds18x20Response, wippersnapper_signal_v1_Ds18x20Response, AUTO) -PB_BIND(wippersnapper_signal_v1_I2CRequest, wippersnapper_signal_v1_I2CRequest, AUTO) +PB_BIND(wippersnapper_signal_v1_I2CRequest, wippersnapper_signal_v1_I2CRequest, 2) PB_BIND(wippersnapper_signal_v1_I2CResponse, wippersnapper_signal_v1_I2CResponse, 2) diff --git a/src/wippersnapper/signal/v1/signal.pb.h b/src/wippersnapper/signal/v1/signal.pb.h index 05675f6b9..246580f6a 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 May 20 15:26:04 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Jun 5 15:39:11 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 @@ -397,7 +397,7 @@ extern const pb_msgdesc_t wippersnapper_signal_v1_PWMResponse_msg; #define wippersnapper_signal_v1_Ds18x20Request_size 39 #define wippersnapper_signal_v1_Ds18x20Response_size 26 #if defined(wippersnapper_i2c_v1_I2CDeviceInitRequests_size) -union wippersnapper_signal_v1_I2CRequest_payload_size_union {char f7[(6 + wippersnapper_i2c_v1_I2CDeviceInitRequests_size)]; char f0[247];}; +union wippersnapper_signal_v1_I2CRequest_payload_size_union {char f7[(6 + wippersnapper_i2c_v1_I2CDeviceInitRequests_size)]; char f0[528];}; #define wippersnapper_signal_v1_I2CRequest_size (0 + sizeof(union wippersnapper_signal_v1_I2CRequest_payload_size_union)) #endif #define wippersnapper_signal_v1_I2CResponse_size 725 diff --git a/src/wippersnapper/uart/v1/uart.pb.c b/src/wippersnapper/uart/v1/uart.pb.c index 40317944b..b87ed0bcd 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 May 20 15:26:04 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Jun 5 15:39:11 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 d20db9e64..fe6e092a3 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 May 20 15:26:04 2025. */ +/* Generated by nanopb-0.4.5-dev at Thu Jun 5 15:39:11 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 964760ad96ee45d79a9f86f2c9fd50c06f475272 Mon Sep 17 00:00:00 2001 From: brentru Date: Thu, 5 Jun 2025 14:33:28 -0400 Subject: [PATCH 25/34] Add large OLED --- src/components/i2c/WipperSnapper_I2C.cpp | 4 +++- .../i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/i2c/WipperSnapper_I2C.cpp b/src/components/i2c/WipperSnapper_I2C.cpp index d68f88b18..ef0dc0f56 100644 --- a/src/components/i2c/WipperSnapper_I2C.cpp +++ b/src/components/i2c/WipperSnapper_I2C.cpp @@ -879,7 +879,9 @@ bool WipperSnapper_Component_I2C::initI2CDevice( _drivers_out.push_back(_sevenSeg); WS_DEBUG_PRINTLN("7-Segement LED Matrix Initialized Successfully!"); } else if (strcmp("oled128x32default", msgDeviceInitReq->i2c_device_name) == - 0) { + 0 || + strcmp("oled128x32large", msgDeviceInitReq->i2c_device_name) == + 0) { WS_DEBUG_PRINTLN("SSD1306 display detected!"); _ssd1306 = new WipperSnapper_I2C_Driver_Out_Ssd1306(this->_i2c, i2cAddress); WS_DEBUG_PRINTLN("Configuring SSD1306 display..."); diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h index cd1ea9914..e729164db 100644 --- a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h @@ -117,7 +117,6 @@ class WipperSnapper_I2C_Driver_Out_Ssd1306 int16_t line_height = 8 * _text_sz; uint16_t c_idx = 0; size_t msg_size = strlen(message); - // _display->cp437(true); for (size_t i = 0; i < msg_size && c_idx < msg_size; i++) { if (message[i] == '\\' && i + 1 < msg_size && message[i + 1] == 'n') { // detected a newline char sequence (\n) From eed66c7984a8921ae4dbac0680b84f9471e77555 Mon Sep 17 00:00:00 2001 From: brentru Date: Thu, 5 Jun 2025 14:59:13 -0400 Subject: [PATCH 26/34] clear on ctor dtor --- src/components/i2c/WipperSnapper_I2C.cpp | 4 ++++ .../i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h | 7 +++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/components/i2c/WipperSnapper_I2C.cpp b/src/components/i2c/WipperSnapper_I2C.cpp index ef0dc0f56..927afa3c3 100644 --- a/src/components/i2c/WipperSnapper_I2C.cpp +++ b/src/components/i2c/WipperSnapper_I2C.cpp @@ -881,6 +881,10 @@ bool WipperSnapper_Component_I2C::initI2CDevice( } else if (strcmp("oled128x32default", msgDeviceInitReq->i2c_device_name) == 0 || strcmp("oled128x32large", msgDeviceInitReq->i2c_device_name) == + 0 || + strcmp("oled128x64default", msgDeviceInitReq->i2c_device_name) == + 0 || + strcmp("oled128x64large", msgDeviceInitReq->i2c_device_name) == 0) { WS_DEBUG_PRINTLN("SSD1306 display detected!"); _ssd1306 = new WipperSnapper_I2C_Driver_Out_Ssd1306(this->_i2c, i2cAddress); diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h index e729164db..8a5291382 100644 --- a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h @@ -53,6 +53,8 @@ class WipperSnapper_I2C_Driver_Out_Ssd1306 */ ~WipperSnapper_I2C_Driver_Out_Ssd1306() { if (_display != nullptr) { + _display->clearDisplay(); + _display->display(); _display->ssd1306_command(SSD1306_DISPLAYOFF); delete _display; _display = nullptr; @@ -68,13 +70,14 @@ class WipperSnapper_I2C_Driver_Out_Ssd1306 _display = new Adafruit_SSD1306(_width, _height, _i2c); if (!_display->begin(SSD1306_SWITCHCAPVCC, _sensorAddress)) return false; - // Clear the buffer - _display->clearDisplay(); // Configure the text size and color _display->setTextSize(_text_sz); _display->setTextColor(SSD1306_WHITE); // Use full 256 char 'Code Page 437' font _display->cp437(true); + // Clear the buffer + _display->clearDisplay(); + _display->display(); return true; } From 050216d0eb89ad0f132cc93a98e8c1138ae00aeb Mon Sep 17 00:00:00 2001 From: brentru Date: Thu, 5 Jun 2025 16:23:24 -0400 Subject: [PATCH 27/34] alphanum - build degree symbol out of segement raw bitmask --- src/Wippersnapper_demo.ino.cpp | 26 +++++++++++++++++++ ...ipperSnapper_I2C_Driver_Out_QuadAlphaNum.h | 9 ++++++- .../WipperSnapper_I2C_Driver_Out_Ssd1306.h | 2 +- 3 files changed, 35 insertions(+), 2 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..e7f284edf --- /dev/null +++ b/src/Wippersnapper_demo.ino.cpp @@ -0,0 +1,26 @@ +# 1 "/var/folders/ff/dmzflvf52tq9kzvt6g8jglxw0000gn/T/tmpz96eqt7i" +#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/i2c/drivers/WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h index 20f12d386..13c768ad4 100644 --- a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h @@ -148,7 +148,14 @@ class WipperSnapper_I2C_Driver_Out_QuadAlphaNum i++; len_display++; } - + else if (message[i] == 0xC2 && message[i + 1] == 0xB0 && i + 1 < strlen(message)) { + WS_DEBUG_PRINTLN("Degree symbol detected!"); + // Build a degree symbol (A, B, F, G1, G2 segments) + _alpha4->writeDigitRaw(cur_idx, 0b0000000011100011); + i++; + cur_idx++; + continue; + } // Write the character to the display buffer _alpha4->writeDigitAscii(cur_idx, ch, display_dot); cur_idx++; diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h index 8a5291382..c3bd93870 100644 --- a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_Ssd1306.h @@ -127,7 +127,7 @@ class WipperSnapper_I2C_Driver_Out_Ssd1306 // Skip to the next possible line y_idx += line_height; _display->setCursor(0, y_idx); - } else if (message[i] == 0xC2 || message[i + 1] == 0xB0) { + } else if (message[i] == 0xC2 && message[i + 1] == 0xB0) { _display->write(char(248)); _display->display(); i++; From 6bf81185f5aa7921596b1db1155b300a9ddeb6de Mon Sep 17 00:00:00 2001 From: brentru Date: Fri, 6 Jun 2025 12:37:06 -0400 Subject: [PATCH 28/34] 7seg- fix right justification bug, max chars --- src/Wippersnapper_demo.ino.cpp | 26 ------------------- .../WipperSnapper_I2C_Driver_Out_7Seg.h | 23 +++++++++++++--- 2 files changed, 20 insertions(+), 29 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 e7f284edf..000000000 --- a/src/Wippersnapper_demo.ino.cpp +++ /dev/null @@ -1,26 +0,0 @@ -# 1 "/var/folders/ff/dmzflvf52tq9kzvt6g8jglxw0000gn/T/tmpz96eqt7i" -#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/i2c/drivers/WipperSnapper_I2C_Driver_Out_7Seg.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_7Seg.h index e96b77600..57f79754f 100644 --- a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_7Seg.h +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_7Seg.h @@ -30,8 +30,7 @@ #define LED_BACKPACK_ALIGNMENT_RIGHT 2 ///< Right alignment #define LED_BACKPACK_ALIGNMENT_DEFAULT \ LED_BACKPACK_ALIGNMENT_LEFT ///< Default alignment -#define LED_MAX_CHARS \ - 4 ///< Maximum number of characters to display on the alphanumeric display +#define LED_MAX_CHARS 5 /*! @brief Class that provides a driver interface for 7-Segment @@ -140,12 +139,30 @@ class WipperSnapper_I2C_Driver_Out_7Seg : public WipperSnapper_I2C_Driver_Out { } } // start at the rightmost position of the display - pos_start = LED_MAX_CHARS - seg_chars; + switch (seg_chars) { + case 4: + pos_start = 0; + break; + case 3: + pos_start = 1; + break; + case 2: + pos_start = 3; // if 2 characters, start at position 3 is required + // because ':' is position 2 and we need to skip it + break; + case 1: + pos_start = 4; + break; + default: + pos_start = 0; // if no characters or overflow, start at position 0 + break; + } } // Write to the display's buffer int cur_idx = pos_start; for (size_t i = 0; i < len_display; i++) { + // skip position 2 if (cur_idx == 2) { cur_idx++; From 67abbc6cdf4a11fb0136aebbe90a9f51bd226374 Mon Sep 17 00:00:00 2001 From: brentru Date: Fri, 6 Jun 2025 12:47:35 -0400 Subject: [PATCH 29/34] Fix - do not publish i2c output write back to io, there is no matching resp! --- src/Wippersnapper.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Wippersnapper.cpp b/src/Wippersnapper.cpp index 6d11aeb00..4d7beb15e 100644 --- a/src/Wippersnapper.cpp +++ b/src/Wippersnapper.cpp @@ -891,6 +891,8 @@ bool cbDecodeSignalRequestI2C(pb_istream_t *stream, const pb_field_t *field, // publish } WS_DEBUG_PRINTLN("[app] I2C Device Output Write Done"); + return true; // we successfully wrote to the device, this subtype has no + // response to publish to IO } else { WS_DEBUG_PRINTLN("ERROR: Undefined I2C message tag"); return false; // fail out, we didn't encode anything to publish From 6e9ce5cbc3f1ed9ef6ebc971101257695a201667 Mon Sep 17 00:00:00 2001 From: brentru Date: Fri, 6 Jun 2025 13:55:10 -0400 Subject: [PATCH 30/34] Fix - degree symbol on 7seg display --- .../i2c/drivers/WipperSnapper_I2C_Driver_Out_7Seg.h | 13 +++++++++++-- .../WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h | 11 ++++++----- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_7Seg.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_7Seg.h index 57f79754f..1184e844a 100644 --- a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_7Seg.h +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_7Seg.h @@ -30,7 +30,10 @@ #define LED_BACKPACK_ALIGNMENT_RIGHT 2 ///< Right alignment #define LED_BACKPACK_ALIGNMENT_DEFAULT \ LED_BACKPACK_ALIGNMENT_LEFT ///< Default alignment -#define LED_MAX_CHARS 5 +#define LED_MAX_CHARS \ + 5 ///< Maximum characters for 7-segment display, including ':' +#define LED_BACKPACK_DEGREE_SYMBOL \ + 0b01100011 ///< Degree symbol for 7-segment display /*! @brief Class that provides a driver interface for 7-Segment @@ -177,8 +180,14 @@ class WipperSnapper_I2C_Driver_Out_7Seg : public WipperSnapper_I2C_Driver_Out { display_dot = true; i++; len_display++; + } else if (message[i] == 0xC2 && message[i + 1] == 0xB0 && + i + 1 < strlen(message)) { + // Write degree symbol + _matrix->writeDigitRaw(cur_idx, LED_BACKPACK_DEGREE_SYMBOL); + i++; + cur_idx++; + continue; // skip to next character } - // Write the character to the display buffer _matrix->writeDigitAscii(cur_idx, ch, display_dot); cur_idx++; diff --git a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h index 13c768ad4..02553e208 100644 --- a/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h +++ b/src/components/i2c/drivers/WipperSnapper_I2C_Driver_Out_QuadAlphaNum.h @@ -27,6 +27,8 @@ LED_BACKPACK_ALIGNMENT_LEFT ///< Default alignment #define LED_MAX_CHARS \ 4 ///< Maximum number of characters to display on the alphanumeric display +#define ALPHANUM_DEGREE_SYMBOL \ + 0b0000000011100011 ///< Degree symbol for alphanumeric display /*! @brief Class that provides a driver interface for Quad Alphanumeric @@ -147,11 +149,10 @@ class WipperSnapper_I2C_Driver_Out_QuadAlphaNum display_dot = true; i++; len_display++; - } - else if (message[i] == 0xC2 && message[i + 1] == 0xB0 && i + 1 < strlen(message)) { - WS_DEBUG_PRINTLN("Degree symbol detected!"); - // Build a degree symbol (A, B, F, G1, G2 segments) - _alpha4->writeDigitRaw(cur_idx, 0b0000000011100011); + } else if (message[i] == 0xC2 && message[i + 1] == 0xB0 && + i + 1 < strlen(message)) { + // Write the degree symbol + _alpha4->writeDigitRaw(cur_idx, ALPHANUM_DEGREE_SYMBOL); i++; cur_idx++; continue; From 67b851fb7b7d2bfa1a30a88b1a24cf9ad7788632 Mon Sep 17 00:00:00 2001 From: brentru Date: Mon, 9 Jun 2025 10:56:07 -0400 Subject: [PATCH 31/34] Fix - Chardisplay 16x2 --- src/components/i2c/WipperSnapper_I2C.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/i2c/WipperSnapper_I2C.cpp b/src/components/i2c/WipperSnapper_I2C.cpp index 927afa3c3..8574cf748 100644 --- a/src/components/i2c/WipperSnapper_I2C.cpp +++ b/src/components/i2c/WipperSnapper_I2C.cpp @@ -852,7 +852,7 @@ bool WipperSnapper_Component_I2C::initI2CDevice( } _drivers_out.push_back(_quadAlphaNum); WS_DEBUG_PRINTLN("Quad Alphanum. Display Initialized Successfully!"); - } else if (strcmp("charlcd", msgDeviceInitReq->i2c_device_name) == 0) { + } else if (strcmp("chardisplay16x2", msgDeviceInitReq->i2c_device_name) == 0) { _charLcd = new WipperSnapper_I2C_Driver_Out_CharLcd(this->_i2c, i2cAddress); _charLcd->ConfigureCharLcd( msgDeviceInitReq->i2c_output_add.config.char_lcd_config.rows, From 5c61a83323802825d1a27c092084e30828c1b466 Mon Sep 17 00:00:00 2001 From: brentru Date: Mon, 9 Jun 2025 11:00:08 -0400 Subject: [PATCH 32/34] Add 20x4 --- src/components/i2c/WipperSnapper_I2C.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/i2c/WipperSnapper_I2C.cpp b/src/components/i2c/WipperSnapper_I2C.cpp index 8574cf748..ff083d83b 100644 --- a/src/components/i2c/WipperSnapper_I2C.cpp +++ b/src/components/i2c/WipperSnapper_I2C.cpp @@ -852,7 +852,7 @@ bool WipperSnapper_Component_I2C::initI2CDevice( } _drivers_out.push_back(_quadAlphaNum); WS_DEBUG_PRINTLN("Quad Alphanum. Display Initialized Successfully!"); - } else if (strcmp("chardisplay16x2", msgDeviceInitReq->i2c_device_name) == 0) { + } else if (strcmp("chardisplay16x2", msgDeviceInitReq->i2c_device_name) == 0 || strcmp("chardisplay20x4", msgDeviceInitReq->i2c_device_name) == 0) { _charLcd = new WipperSnapper_I2C_Driver_Out_CharLcd(this->_i2c, i2cAddress); _charLcd->ConfigureCharLcd( msgDeviceInitReq->i2c_output_add.config.char_lcd_config.rows, From dd97c84df269ffc36ac1a8a6635123310430c166 Mon Sep 17 00:00:00 2001 From: brentru Date: Mon, 9 Jun 2025 11:24:59 -0400 Subject: [PATCH 33/34] Match 64972ad..1786350 --- src/components/i2c/WipperSnapper_I2C.cpp | 7 ++----- src/wippersnapper/description/v1/description.pb.c | 2 +- src/wippersnapper/description/v1/description.pb.h | 2 +- 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 | 6 +++--- 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 +- 19 files changed, 22 insertions(+), 25 deletions(-) diff --git a/src/components/i2c/WipperSnapper_I2C.cpp b/src/components/i2c/WipperSnapper_I2C.cpp index ff083d83b..6871d5a40 100644 --- a/src/components/i2c/WipperSnapper_I2C.cpp +++ b/src/components/i2c/WipperSnapper_I2C.cpp @@ -1175,9 +1175,6 @@ bool WipperSnapper_Component_I2C::Handle_I2cDeviceOutputWrite( // Create a ptr to the base driver out WipperSnapper_I2C_Driver_Out *driver_out = nullptr; // Find the matching driver by address in the _drivers_out vector - // TODO: Refactor this outwards - WS_DEBUG_PRINT("Searching for i2c output driver with address: "); - WS_DEBUG_PRINT(msgDeviceWrite->i2c_device_address); for (size_t i = 0; i < _drivers_out.size(); i++) { if (_drivers_out[i]->getI2CAddress() == msgDeviceWrite->i2c_device_address) { @@ -1186,7 +1183,7 @@ bool WipperSnapper_Component_I2C::Handle_I2cDeviceOutputWrite( } } if (driver_out == nullptr) { - WS_DEBUG_PRINTLN("ERROR: Driver not found within drivers_out!"); + WS_DEBUG_PRINTLN("ERROR: I2c output driver not found within drivers_out!"); return false; } @@ -1203,7 +1200,7 @@ bool WipperSnapper_Component_I2C::Handle_I2cDeviceOutputWrite( driver_out->WriteMessageSSD1306( msgDeviceWrite->output_msg.write_ssd1306.message); } else { - WS_DEBUG_PRINTLN("ERROR: Unknown output message type!"); + WS_DEBUG_PRINTLN("ERROR: Unknown i2c output message type!"); return false; } return true; diff --git a/src/wippersnapper/description/v1/description.pb.c b/src/wippersnapper/description/v1/description.pb.c index a2a9a0b81..af570fc40 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 Jun 5 15:39:11 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Jun 6 19:48:16 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 04bccb232..208fbd01c 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 Jun 5 15:39:11 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Jun 6 19:48:16 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/ds18x20/v1/ds18x20.pb.c b/src/wippersnapper/ds18x20/v1/ds18x20.pb.c index d98a397d0..483c432c9 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 Jun 5 15:39:11 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Jun 6 19:48:16 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 c3c8afafb..715616f73 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 Jun 5 15:39:11 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Jun 6 19:48:16 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 8707945f0..e1e4dde04 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 Jun 5 15:39:11 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Jun 6 19:48:16 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 639e4d1c2..8b5b0f53b 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 Jun 5 15:39:11 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Jun 6 19:48:16 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 @@ -140,7 +140,7 @@ typedef struct _wippersnapper_i2c_v1_LEDBackpackConfig { } wippersnapper_i2c_v1_LEDBackpackConfig; typedef struct _wippersnapper_i2c_v1_LEDBackpackWrite { - char message[5]; + char message[128]; } wippersnapper_i2c_v1_LEDBackpackWrite; typedef struct _wippersnapper_i2c_v1_SSD1306Config { @@ -572,7 +572,7 @@ extern const pb_msgdesc_t wippersnapper_i2c_v1_SSD1306Write_msg; #define wippersnapper_i2c_v1_CharLCDConfig_size 12 #define wippersnapper_i2c_v1_SSD1306Config_size 14 #define wippersnapper_i2c_v1_I2COutputAdd_size 16 -#define wippersnapper_i2c_v1_LEDBackpackWrite_size 6 +#define wippersnapper_i2c_v1_LEDBackpackWrite_size 130 #define wippersnapper_i2c_v1_CharLCDWrite_size 132 #define wippersnapper_i2c_v1_SSD1306Write_size 258 diff --git a/src/wippersnapper/pin/v1/pin.pb.c b/src/wippersnapper/pin/v1/pin.pb.c index 1af87d19c..8ed37f9d0 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 Jun 5 15:39:11 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Jun 6 19:48:16 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 25a1c308c..14b1a99fe 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 Jun 5 15:39:11 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Jun 6 19:48:16 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 cc0676d86..e5bcca7f3 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 Jun 5 15:39:11 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Jun 6 19:48:16 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 ec7012740..b8a7f6813 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 Jun 5 15:39:11 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Jun 6 19:48:16 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 5b7e93edd..36cf1c440 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 Jun 5 15:39:11 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Jun 6 19:48:16 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 6276ce124..d223d7a1c 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 Jun 5 15:39:11 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Jun 6 19:48:16 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 2abade5e6..eb9b45e93 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 Jun 5 15:39:11 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Jun 6 19:48:16 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 f2c1335ae..61b3b809a 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 Jun 5 15:39:11 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Jun 6 19:48:16 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 bc878712c..0f0278ac0 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 Jun 5 15:39:11 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Jun 6 19:48:16 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 246580f6a..e459607f3 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 Jun 5 15:39:11 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Jun 6 19:48:16 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 b87ed0bcd..a605be6ef 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 Jun 5 15:39:11 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Jun 6 19:48:16 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 fe6e092a3..af9364c2a 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 Jun 5 15:39:11 2025. */ +/* Generated by nanopb-0.4.5-dev at Fri Jun 6 19:48:16 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 d784e8a7ca74203cad9bbe725913acb068c19b99 Mon Sep 17 00:00:00 2001 From: brentru Date: Mon, 9 Jun 2025 11:44:54 -0400 Subject: [PATCH 34/34] Clang --- src/components/i2c/WipperSnapper_I2C.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/components/i2c/WipperSnapper_I2C.cpp b/src/components/i2c/WipperSnapper_I2C.cpp index 6871d5a40..6f58f4c27 100644 --- a/src/components/i2c/WipperSnapper_I2C.cpp +++ b/src/components/i2c/WipperSnapper_I2C.cpp @@ -852,7 +852,10 @@ bool WipperSnapper_Component_I2C::initI2CDevice( } _drivers_out.push_back(_quadAlphaNum); WS_DEBUG_PRINTLN("Quad Alphanum. Display Initialized Successfully!"); - } else if (strcmp("chardisplay16x2", msgDeviceInitReq->i2c_device_name) == 0 || strcmp("chardisplay20x4", msgDeviceInitReq->i2c_device_name) == 0) { + } else if (strcmp("chardisplay16x2", msgDeviceInitReq->i2c_device_name) == + 0 || + strcmp("chardisplay20x4", msgDeviceInitReq->i2c_device_name) == + 0) { _charLcd = new WipperSnapper_I2C_Driver_Out_CharLcd(this->_i2c, i2cAddress); _charLcd->ConfigureCharLcd( msgDeviceInitReq->i2c_output_add.config.char_lcd_config.rows,