From 4ba954adc84d87d78fda3db7821aebe229c80ca9 Mon Sep 17 00:00:00 2001 From: tyeth Date: Thu, 4 Dec 2025 02:35:20 +0000 Subject: [PATCH 1/3] Use +512 for 0x43 and +256 for 0x44 expander pins --- src/Wippersnapper.h | 21 +++++++++++++++++++ src/Wippersnapper_Boards.h | 2 +- .../digitalIO/Wippersnapper_DigitalGPIO.cpp | 17 +++++++++------ .../digitalIO/Wippersnapper_DigitalGPIO.h | 9 ++++---- 4 files changed, 37 insertions(+), 12 deletions(-) diff --git a/src/Wippersnapper.h b/src/Wippersnapper.h index f06a91a8a..809e43082 100644 --- a/src/Wippersnapper.h +++ b/src/Wippersnapper.h @@ -243,6 +243,27 @@ class DisplayController; #ifdef ARDUINO_ARDUINO_NESSO_N1 static NessoBattery battery; ///< Nesso-N1 Battery instance + +/**************************************************************************/ +/*! + @brief Printable subclass of ExpanderPin for use with Serial.println() + Allows ExpanderPin to be used interchangeably with uint8_t pins + when printing to Serial. +*/ +/**************************************************************************/ +class WsExpanderPin : public ExpanderPin, public Printable { +public: + WsExpanderPin(uint16_t _pin) : ExpanderPin(_pin) {} + WsExpanderPin(ExpanderPin ep) : ExpanderPin(ep.pin | (ep.address == 0x44 ? 0x100 : 0x200)) {} + + size_t printTo(Print& p) const override { + size_t n = p.print("0x"); + n += p.print(address, HEX); + n += p.print("_"); + n += p.print(pin); + return n; + } +}; #endif /**************************************************************************/ diff --git a/src/Wippersnapper_Boards.h b/src/Wippersnapper_Boards.h index b63051cfe..2e6036dd6 100644 --- a/src/Wippersnapper_Boards.h +++ b/src/Wippersnapper_Boards.h @@ -170,7 +170,7 @@ #define BOARD_ID "arduino-nesso-n1" #define USE_LITTLEFS #define USE_STATUS_LED -#define STATUS_LED_PIN LED_BUILTIN +#define STATUS_LED_PIN LED_BUILTIN // can now be +512/+256 for expander (0x43/44) #define STATUS_LED_INVERTED #elif defined(ARDUINO_ADAFRUIT_FEATHER_ESP32C6) #define BOARD_ID "feather-esp32c6" diff --git a/src/components/digitalIO/Wippersnapper_DigitalGPIO.cpp b/src/components/digitalIO/Wippersnapper_DigitalGPIO.cpp index bbe33b286..4d68b50e7 100644 --- a/src/components/digitalIO/Wippersnapper_DigitalGPIO.cpp +++ b/src/components/digitalIO/Wippersnapper_DigitalGPIO.cpp @@ -60,8 +60,13 @@ Wippersnapper_DigitalGPIO::~Wippersnapper_DigitalGPIO() { /*******************************************************************************************************************************/ void Wippersnapper_DigitalGPIO::initDigitalPin( wippersnapper_pin_v1_ConfigurePinRequest_Direction direction, - uint8_t pinName, float period, + uint16_t pinName, float period, wippersnapper_pin_v1_ConfigurePinRequest_Pull pull) { +#if defined(ARDUINO_ARDUINO_NESSO_N1) + WsExpanderPin flexPinName = (ExpanderPin)pinName; +#else + uint8_t flexPinName = (uint8_t)pinName; +#endif if (direction == wippersnapper_pin_v1_ConfigurePinRequest_Direction_DIRECTION_OUTPUT) { @@ -70,14 +75,14 @@ void Wippersnapper_DigitalGPIO::initDigitalPin( // if (String("D") + pinName == STATUS_LED_PIN.pin) // #else // deinit status led, use it as a dio component instead - if (pinName == STATUS_LED_PIN) + if (flexPinName == STATUS_LED_PIN) releaseStatusLED(); #endif #endif - pinMode(pinName, OUTPUT); + pinMode(flexPinName, OUTPUT); WS_DEBUG_PRINT("Configured digital output pin on D"); - WS_DEBUG_PRINTLN(pinName); + WS_DEBUG_PRINTLN(flexPinName); // Initialize LOW #if defined(ARDUINO_ESP8266_ADAFRUIT_HUZZAH) // not until we support @@ -142,7 +147,7 @@ void Wippersnapper_DigitalGPIO::initDigitalPin( /********************************************************************************************************************************/ void Wippersnapper_DigitalGPIO::deinitDigitalPin( wippersnapper_pin_v1_ConfigurePinRequest_Direction direction, - uint8_t pinName) { + uint16_t pinName) { WS_DEBUG_PRINT("Deinitializing digital pin "); WS_DEBUG_PRINTLN(pinName); @@ -230,7 +235,7 @@ void Wippersnapper_DigitalGPIO::digitalWriteSvc(ExpanderPin pin, int pinValue) { The pin's value. */ /*******************************************************************************/ -void Wippersnapper_DigitalGPIO::digitalWriteSvc(uint8_t pinName, int pinValue) { +void Wippersnapper_DigitalGPIO::digitalWriteSvc(uint16_t pinName, int pinValue) { WS_DEBUG_PRINT("Digital Pin Event: Set "); WS_DEBUG_PRINT(pinName); WS_DEBUG_PRINT(" to "); diff --git a/src/components/digitalIO/Wippersnapper_DigitalGPIO.h b/src/components/digitalIO/Wippersnapper_DigitalGPIO.h index 27e0d02fe..aecd3599f 100644 --- a/src/components/digitalIO/Wippersnapper_DigitalGPIO.h +++ b/src/components/digitalIO/Wippersnapper_DigitalGPIO.h @@ -20,7 +20,7 @@ /** Holds data about a digital input pin */ struct digitalInputPin { - uint8_t pinName; ///< Pin name + uint16_t pinName; ///< Pin name long period; ///< Timer interval, in millis, -1 if disabled. long prvPeriod; ///< When timer was previously serviced, in millis int prvPinVal; ///< Previous pin value @@ -42,14 +42,13 @@ class Wippersnapper_DigitalGPIO { void initDigitalPin(wippersnapper_pin_v1_ConfigurePinRequest_Direction direction, - uint8_t pinName, float period, + uint16_t pinName, float period, wippersnapper_pin_v1_ConfigurePinRequest_Pull pull); void deinitDigitalPin(wippersnapper_pin_v1_ConfigurePinRequest_Direction direction, - uint8_t pinName); - + uint16_t pinName); int digitalReadSvc(int pinName); - void digitalWriteSvc(uint8_t pinName, int pinValue); + void digitalWriteSvc(uint16_t pinName, int pinValue); #if defined(ARDUINO_ARDUINO_NESSO_N1) // void // initDigitalPin(wippersnapper_pin_v1_ConfigurePinRequest_Direction From 73b6392cf9cb5924de1a72c4212edae337cc0874 Mon Sep 17 00:00:00 2001 From: tyeth Date: Thu, 4 Dec 2025 02:39:38 +0000 Subject: [PATCH 2/3] Rely on BSP for battery WDT --- src/Wippersnapper.cpp | 38 +------------------------------------- 1 file changed, 1 insertion(+), 37 deletions(-) diff --git a/src/Wippersnapper.cpp b/src/Wippersnapper.cpp index 728fedc7f..2315a2414 100644 --- a/src/Wippersnapper.cpp +++ b/src/Wippersnapper.cpp @@ -100,45 +100,9 @@ void Wippersnapper::provision() { // Board specific initializations #ifdef ARDUINO_ARDUINO_NESSO_N1 - Wire.begin(SDA, SCL, 100000); - - // verify chip id 0x49 at 0x0Ah - Wire.beginTransmission(0x49); - Wire.write(0x0A); - Wire.endTransmission(); - Wire.requestFrom(0x49, 1); - uint8_t chipId = Wire.read(); - if (chipId != 0x49) { - WS_DEBUG_PRINTLN("ERROR: AW32001E not found on I2C bus!"); - Wire.endTransmission(); - Wire.end(); - } else { - WS_DEBUG_PRINTLN("AW32001E detected on I2C bus."); - // Disable AW32001E watchdog timer, read 05h, & 0x1F, write back - Wire.beginTransmission(0x49); - Wire.write(0x05); - Wire.endTransmission(); - Wire.requestFrom(0x49, 1); - uint8_t regVal = Wire.read(); - Wire.endTransmission(); - WS_DEBUG_PRINTLN("AW32001E WDT reg before disable: " + String(regVal, BIN)); - delay(10); - regVal &= - 0b00011111; // Clear bits 5:6 to disable Watchdog timer, 7 for discharge - Wire.beginTransmission(0x49); - Wire.write(0x05); - Wire.write(regVal); - Wire.endTransmission(); - Wire.end(); + battery.begin(); delay(10); - battery.enableCharge(); - } - - // // digitalWrite(LORA_ENABLE, FALSE); - // // digitalWrite(LORA_LNA_ENABLE, FALSE); - // // digitalWrite(GROVE_POWER_EN, TRUE); - // delay(10); #endif // Initialize the status LED for signaling FS errors From 2044971f1074b2b0cd98417abf5f93266bd0b491 Mon Sep 17 00:00:00 2001 From: tyeth Date: Thu, 4 Dec 2025 03:37:29 +0000 Subject: [PATCH 3/3] fix gpio event, drop unnecessary overloads, formatting --- src/Wippersnapper.cpp | 8 +-- src/Wippersnapper.h | 9 +-- src/Wippersnapper_Boards.h | 2 +- .../digitalIO/Wippersnapper_DigitalGPIO.cpp | 65 +++++++------------ .../digitalIO/Wippersnapper_DigitalGPIO.h | 20 +----- 5 files changed, 37 insertions(+), 67 deletions(-) diff --git a/src/Wippersnapper.cpp b/src/Wippersnapper.cpp index 2315a2414..51eb2e073 100644 --- a/src/Wippersnapper.cpp +++ b/src/Wippersnapper.cpp @@ -100,9 +100,9 @@ void Wippersnapper::provision() { // Board specific initializations #ifdef ARDUINO_ARDUINO_NESSO_N1 - battery.begin(); - delay(10); - battery.enableCharge(); + battery.begin(); + delay(10); + battery.enableCharge(); #endif // Initialize the status LED for signaling FS errors @@ -1667,7 +1667,7 @@ void cbDisplayMessage(char *data, uint16_t len) { /****************************************************************************/ bool Wippersnapper::encodePinEvent( wippersnapper_signal_v1_CreateSignalRequest *outgoingSignalMsg, - uint8_t pinName, int pinVal) { + uint16_t pinName, int pinVal) { bool is_success = true; outgoingSignalMsg->which_payload = wippersnapper_signal_v1_CreateSignalRequest_pin_event_tag; diff --git a/src/Wippersnapper.h b/src/Wippersnapper.h index 809e43082..56ee8c2f3 100644 --- a/src/Wippersnapper.h +++ b/src/Wippersnapper.h @@ -254,9 +254,10 @@ static NessoBattery battery; ///< Nesso-N1 Battery instance class WsExpanderPin : public ExpanderPin, public Printable { public: WsExpanderPin(uint16_t _pin) : ExpanderPin(_pin) {} - WsExpanderPin(ExpanderPin ep) : ExpanderPin(ep.pin | (ep.address == 0x44 ? 0x100 : 0x200)) {} - - size_t printTo(Print& p) const override { + WsExpanderPin(ExpanderPin ep) + : ExpanderPin(ep.pin | (ep.address == 0x44 ? 0x100 : 0x200)) {} + + size_t printTo(Print &p) const override { size_t n = p.print("0x"); n += p.print(address, HEX); n += p.print("_"); @@ -343,7 +344,7 @@ class Wippersnapper { // Encodes a pin event message bool encodePinEvent(wippersnapper_signal_v1_CreateSignalRequest *outgoingSignalMsg, - uint8_t pinName, int pinVal); + uint16_t pinName, int pinVal); // Pin configure message bool configureDigitalPinReq(wippersnapper_pin_v1_ConfigurePinRequest *pinMsg); diff --git a/src/Wippersnapper_Boards.h b/src/Wippersnapper_Boards.h index 2e6036dd6..6e115719e 100644 --- a/src/Wippersnapper_Boards.h +++ b/src/Wippersnapper_Boards.h @@ -170,7 +170,7 @@ #define BOARD_ID "arduino-nesso-n1" #define USE_LITTLEFS #define USE_STATUS_LED -#define STATUS_LED_PIN LED_BUILTIN // can now be +512/+256 for expander (0x43/44) +#define STATUS_LED_PIN LED_BUILTIN // can be +512/+256 as expander (0x43/44) #define STATUS_LED_INVERTED #elif defined(ARDUINO_ADAFRUIT_FEATHER_ESP32C6) #define BOARD_ID "feather-esp32c6" diff --git a/src/components/digitalIO/Wippersnapper_DigitalGPIO.cpp b/src/components/digitalIO/Wippersnapper_DigitalGPIO.cpp index 4d68b50e7..00c4d43fe 100644 --- a/src/components/digitalIO/Wippersnapper_DigitalGPIO.cpp +++ b/src/components/digitalIO/Wippersnapper_DigitalGPIO.cpp @@ -66,7 +66,7 @@ void Wippersnapper_DigitalGPIO::initDigitalPin( WsExpanderPin flexPinName = (ExpanderPin)pinName; #else uint8_t flexPinName = (uint8_t)pinName; -#endif +#endif if (direction == wippersnapper_pin_v1_ConfigurePinRequest_Direction_DIRECTION_OUTPUT) { @@ -96,20 +96,20 @@ void Wippersnapper_DigitalGPIO::initDigitalPin( digitalWrite(pinName, LOW); } #else - pinMode(pinName, OUTPUT); - digitalWrite(pinName, LOW); // initialize LOW + pinMode(flexPinName, OUTPUT); + digitalWrite(flexPinName, LOW); // initialize LOW #endif } else if ( direction == wippersnapper_pin_v1_ConfigurePinRequest_Direction_DIRECTION_INPUT) { WS_DEBUG_PRINT("Configuring digital input pin on D"); - WS_DEBUG_PRINT(pinName); + WS_DEBUG_PRINT(flexPinName); if (pull == wippersnapper_pin_v1_ConfigurePinRequest_Pull_PULL_UP) { WS_DEBUG_PRINTLN("with internal pull-up enabled"); - pinMode(pinName, INPUT_PULLUP); + pinMode(flexPinName, INPUT_PULLUP); } else { - pinMode(pinName, INPUT); + pinMode(flexPinName, INPUT); WS_DEBUG_PRINT("\n"); } @@ -187,24 +187,17 @@ void Wippersnapper_DigitalGPIO::deinitDigitalPin( */ /********************************************************************/ int Wippersnapper_DigitalGPIO::digitalReadSvc(int pinName) { - // Service using arduino `digitalRead` - int pinVal = digitalRead(pinName); - return pinVal; -} - #if defined(ARDUINO_ARDUINO_NESSO_N1) -/********************************************************************/ -/*! - @brief High-level digitalRead service impl. which performs a - digitalRead. - @param pin - The ExpanderPin instance - @returns The pin's value. -*/ -/********************************************************************/ -int Wippersnapper_DigitalGPIO::digitalReadSvc(ExpanderPin pin) { + // probably this should be >255 instead for future use. + if ((pinName & 0x100) || (pinName & 0x200)) { + WsExpanderPin flexPinName = (ExpanderPin)pinName; + // Service using expander `digitalRead` + int pinVal = digitalRead(flexPinName); + return pinVal; + } +#endif // Service using arduino `digitalRead` - int pinVal = digitalRead(pin); + int pinVal = digitalRead(pinName); return pinVal; } @@ -217,25 +210,8 @@ int Wippersnapper_DigitalGPIO::digitalReadSvc(ExpanderPin pin) { The pin's value. */ /*******************************************************************************/ -void Wippersnapper_DigitalGPIO::digitalWriteSvc(ExpanderPin pin, int pinValue) { - WS_DEBUG_PRINT("Digital Pin Event: Set "); - WS_DEBUG_PRINT(pin.pin); - WS_DEBUG_PRINT(" to "); - WS_DEBUG_PRINTLN(pinValue); - digitalWrite(pin, pinValue); -} -#endif - -/*******************************************************************************/ -/*! - @brief Writes a value to a pin. - @param pinName - The pin's name. - @param pinValue - The pin's value. -*/ -/*******************************************************************************/ -void Wippersnapper_DigitalGPIO::digitalWriteSvc(uint16_t pinName, int pinValue) { +void Wippersnapper_DigitalGPIO::digitalWriteSvc(uint16_t pinName, + int pinValue) { WS_DEBUG_PRINT("Digital Pin Event: Set "); WS_DEBUG_PRINT(pinName); WS_DEBUG_PRINT(" to "); @@ -249,6 +225,13 @@ void Wippersnapper_DigitalGPIO::digitalWriteSvc(uint16_t pinName, int pinValue) digitalWrite(pinName, !pinValue); else digitalWrite(pinName, pinValue); +#elif defined(ARDUINO_ARDUINO_NESSO_N1) + if ((pinName & 0x100) || (pinName & 0x200)) { + WsExpanderPin flexPinName = (ExpanderPin)pinName; + digitalWrite(flexPinName, pinValue); + } else { + digitalWrite(pinName, pinValue); + } #else digitalWrite(pinName, pinValue); #endif diff --git a/src/components/digitalIO/Wippersnapper_DigitalGPIO.h b/src/components/digitalIO/Wippersnapper_DigitalGPIO.h index aecd3599f..f2146d534 100644 --- a/src/components/digitalIO/Wippersnapper_DigitalGPIO.h +++ b/src/components/digitalIO/Wippersnapper_DigitalGPIO.h @@ -21,9 +21,9 @@ /** Holds data about a digital input pin */ struct digitalInputPin { uint16_t pinName; ///< Pin name - long period; ///< Timer interval, in millis, -1 if disabled. - long prvPeriod; ///< When timer was previously serviced, in millis - int prvPinVal; ///< Previous pin value + long period; ///< Timer interval, in millis, -1 if disabled. + long prvPeriod; ///< When timer was previously serviced, in millis + int prvPinVal; ///< Previous pin value }; // forward decl. @@ -49,20 +49,6 @@ class Wippersnapper_DigitalGPIO { uint16_t pinName); int digitalReadSvc(int pinName); void digitalWriteSvc(uint16_t pinName, int pinValue); -#if defined(ARDUINO_ARDUINO_NESSO_N1) - // void - // initDigitalPin(wippersnapper_pin_v1_ConfigurePinRequest_Direction - // direction, - // ExpanderPin pinName, float period, - // wippersnapper_pin_v1_ConfigurePinRequest_Pull pull); - // void - // deinitDigitalPin(wippersnapper_pin_v1_ConfigurePinRequest_Direction - // direction, - // ExpanderPin pinName); - - int digitalReadSvc(ExpanderPin pinName); - void digitalWriteSvc(ExpanderPin pinName, int pinValue); -#endif void processDigitalInputs(); digitalInputPin *_digital_input_pins; /*!< Array of gpio pin objects */