diff --git a/.github/workflows/build-clang-doxy.yml b/.github/workflows/build-clang-doxy.yml index 79fd6afad..a9ee7beda 100644 --- a/.github/workflows/build-clang-doxy.yml +++ b/.github/workflows/build-clang-doxy.yml @@ -370,7 +370,8 @@ jobs: "dfrobot_beetle_esp32c3", "wippersnapper_qtpy_esp32c3", "espressif_esp32c5_devkitc_1_n8r4", - "wippersnapper_feather_esp32c6" + "wippersnapper_feather_esp32c6", + "arduino_nesso_n1" ] include: - offset: "0x1000" @@ -382,6 +383,8 @@ jobs: arduino-platform: "espressif_esp32c5_devkitc_1_n8r4" - offset: "0x0" arduino-platform: "wippersnapper_feather_esp32c6" + - offset: "0x0" + arduino-platform: "arduino_nesso_n1" steps: - name: "skip if unwanted" continue-on-error: true @@ -418,6 +421,7 @@ jobs: with: repository: adafruit/Wippersnapper_Boards path: ws-boards + ref: arduino-nesso-n1 - name: Install CI-Arduino run: bash ci/actions_install.sh - name: Install extra Arduino libraries diff --git a/examples/Wippersnapper_demo/.arduino_nesso_n1.generate b/examples/Wippersnapper_demo/.arduino_nesso_n1.generate new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/examples/Wippersnapper_demo/.arduino_nesso_n1.generate @@ -0,0 +1 @@ + diff --git a/examples/wippersnapper_debug/.arduino_nesso_n1.test.skip b/examples/wippersnapper_debug/.arduino_nesso_n1.test.skip new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/examples/wippersnapper_debug/.arduino_nesso_n1.test.skip @@ -0,0 +1 @@ + diff --git a/platformio.ini b/platformio.ini index 7d651d14f..c2143dd82 100644 --- a/platformio.ini +++ b/platformio.ini @@ -101,7 +101,7 @@ lib_deps = ; Common build environment for ESP32 platform [common:esp32] -platform = https://github.com/pioarduino/platform-espressif32/releases/download/55.03.33/platform-espressif32.zip +platform = https://github.com/tyeth/platform-espressif32/releases/download/55.03.33-nesso.1/platform-espressif32-55.03.33-nesso.1.zip ; This is needed for occasional new features and bug fixes ; platform = https://github.com/pioarduino/platform-espressif32#develop lib_ignore = WiFiNINA, WiFiNINA_-_Adafruit_Fork, WiFi101, OneWire @@ -201,6 +201,26 @@ build_flags = board_build.filesystem = littlefs board_build.partitions = min_spiffs.csv +; Arduino Nesso-N1 (Espressif ESP32-C5 16MB FLASH) +[env:arduino_nesso_n1] +extends = common:esp32 +board = arduino_nesso_n1 +build_type = debug +; debug_tool = esp-builtin +; upload_protocol = esp-builtin +; debug_init_break = tbreak setup +build_flags = + -DARDUINO_ARDUINO_NESSO_N1 + ; -DDEBUG=1 + ; -DARDUINO_USB_MODE=1 + ; -DARDUINO_USB_CDC_ON_BOOT=1 + ; -DESP_LOG_LEVEL=5 + ; -DARDUINO_LOG_LEVEL=5 + ; -DCORE_DEBUG_LEVEL=5 + ; -DMQTT_DEBUG=1 +board_build.filesystem = littlefs +board_build.partitions = huge_app.csv + ; Espressif ESP32-C6 4MB NO PSRAM esp32-c6-devkitm-1 [env:espressif_esp32-c6-devkitm-1] extends = common:esp32 diff --git a/src/Wippersnapper_Boards.h b/src/Wippersnapper_Boards.h index a456c2fc0..b63051cfe 100644 --- a/src/Wippersnapper_Boards.h +++ b/src/Wippersnapper_Boards.h @@ -153,6 +153,7 @@ #define USE_LITTLEFS #define USE_STATUS_LED #define STATUS_LED_PIN 0 +#define STATUS_LED_INVERTED #elif defined(ARDUINO_ADAFRUIT_ITSYBITSY_ESP32) #define BOARD_ID "itsybitsy-esp32" #define USE_LITTLEFS @@ -165,6 +166,12 @@ #define USE_LITTLEFS #define USE_STATUS_LED #define STATUS_LED_PIN 13 +#elif defined(ARDUINO_ARDUINO_NESSO_N1) +#define BOARD_ID "arduino-nesso-n1" +#define USE_LITTLEFS +#define USE_STATUS_LED +#define STATUS_LED_PIN LED_BUILTIN +#define STATUS_LED_INVERTED #elif defined(ARDUINO_ADAFRUIT_FEATHER_ESP32C6) #define BOARD_ID "feather-esp32c6" #define USE_LITTLEFS diff --git a/src/components/digitalIO/Wippersnapper_DigitalGPIO.cpp b/src/components/digitalIO/Wippersnapper_DigitalGPIO.cpp index 577c9780d..029548125 100644 --- a/src/components/digitalIO/Wippersnapper_DigitalGPIO.cpp +++ b/src/components/digitalIO/Wippersnapper_DigitalGPIO.cpp @@ -66,9 +66,13 @@ void Wippersnapper_DigitalGPIO::initDigitalPin( wippersnapper_pin_v1_ConfigurePinRequest_Direction_DIRECTION_OUTPUT) { #ifdef STATUS_LED_PIN +#if !defined(ARDUINO_ARDUINO_NESSO_N1) +// if (String("D") + pinName == STATUS_LED_PIN.pin) +// #else // deinit status led, use it as a dio component instead if (pinName == STATUS_LED_PIN) releaseStatusLED(); +#endif #endif pinMode(pinName, OUTPUT); @@ -76,10 +80,14 @@ void Wippersnapper_DigitalGPIO::initDigitalPin( WS_DEBUG_PRINTLN(pinName); // Initialize LOW -#if defined(ARDUINO_ESP8266_ADAFRUIT_HUZZAH) - // The Adafruit Feather ESP8266's built-in LED is reverse wired so setting - // the pin LOW will turn the LED on. - digitalWrite(STATUS_LED_PIN, !0); +#if defined(ARDUINO_ESP8266_ADAFRUIT_HUZZAH) // not until we support ExpanderPins || defined(STATUS_LED_INVERTED) + if (pinName == STATUS_LED_PIN) { + // The Adafruit Feather ESP8266's built-in LED is reverse wired so setting + // the pin LOW will turn the LED on. + digitalWrite(STATUS_LED_PIN, !0); + } else { + digitalWrite(pinName, LOW); + } #else pinMode(pinName, OUTPUT); digitalWrite(pinName, LOW); // initialize LOW @@ -155,9 +163,11 @@ void Wippersnapper_DigitalGPIO::deinitDigitalPin( // if prv. in-use by DIO, release pin back to application #ifdef STATUS_LED_PIN +#if !defined(ARDUINO_ARDUINO_NESSO_N1) // not until we support ExpanderPins if (pinName == STATUS_LED_PIN) initStatusLED(); #endif +#endif } /********************************************************************/ @@ -175,6 +185,40 @@ int Wippersnapper_DigitalGPIO::digitalReadSvc(int 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) { + // Service using arduino `digitalRead` + int pinVal = digitalRead(pin); + return pinVal; +} + +/*******************************************************************************/ +/*! + @brief Writes a value to a pin. + @param pinName + The pin's name. + @param pinValue + 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. diff --git a/src/components/digitalIO/Wippersnapper_DigitalGPIO.h b/src/components/digitalIO/Wippersnapper_DigitalGPIO.h index 960687ee5..37863e606 100644 --- a/src/components/digitalIO/Wippersnapper_DigitalGPIO.h +++ b/src/components/digitalIO/Wippersnapper_DigitalGPIO.h @@ -50,6 +50,18 @@ class Wippersnapper_DigitalGPIO { int digitalReadSvc(int pinName); void digitalWriteSvc(uint8_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 */ diff --git a/src/components/pwm/ws_pwm.cpp b/src/components/pwm/ws_pwm.cpp index 2e3ba0dc2..ee8c19570 100644 --- a/src/components/pwm/ws_pwm.cpp +++ b/src/components/pwm/ws_pwm.cpp @@ -88,7 +88,7 @@ void ws_pwm::detach(uint8_t pin) { void ws_pwm::writeDutyCycle(uint8_t pin, int dutyCycle) { #if defined(ARDUINO_ARCH_ESP32) _ledcMgr->analogWrite(pin, dutyCycle); -#elif defined(ARDUINO_ESP8266_ADAFRUIT_HUZZAH) && defined(STATUS_LED_PIN) +#elif (defined(ARDUINO_ESP8266_ADAFRUIT_HUZZAH) || defined(STATUS_LED_INVERTED)) && defined(STATUS_LED_PIN) // Adafruit Feather ESP8266's analogWrite() is inverted because its LED pin is // reverse-wired analogWrite(pin, 255 - dutyCycle); diff --git a/src/components/statusLED/Wippersnapper_StatusLED.cpp b/src/components/statusLED/Wippersnapper_StatusLED.cpp index 4cbdd4c85..6b7e9e8b2 100644 --- a/src/components/statusLED/Wippersnapper_StatusLED.cpp +++ b/src/components/statusLED/Wippersnapper_StatusLED.cpp @@ -82,13 +82,33 @@ void initStatusLED() { // Turn off LED initially #if defined(ARDUINO_ESP8266_ADAFRUIT_HUZZAH) analogWrite(STATUS_LED_PIN, 255); +#elif defined(ARDUINO_ARDUINO_NESSO_N1) || defined(STATUS_LED_INVERTED) + digitalWrite(STATUS_LED_PIN, HIGH); #elif defined(ARDUINO_ARCH_ESP32) WS._pwmComponent->attach(STATUS_LED_PIN, LEDC_BASE_FREQ, LEDC_TIMER_12_BIT); - WS._pwmComponent->writeDutyCycle(STATUS_LED_PIN, 0); // turn OFF + WS._pwmComponent->writeDutyCycle(STATUS_LED_PIN, +#if defined(STATUS_LED_INVERTED) +255 +#else +0 +#endif + ); // turn OFF #elif defined(ARDUINO_ARCH_RP2040) - digitalWrite(STATUS_LED_PIN, 0); + digitalWrite(STATUS_LED_PIN, +#if defined(STATUS_LED_INVERTED) +255 +#else +0 +#endif + ); // turn OFF +#else + analogWrite(STATUS_LED_PIN, +#if defined(STATUS_LED_INVERTED) +255 #else - analogWrite(STATUS_LED_PIN, 0); +0 +#endif + ); // turn OFF #endif WS.lockStatusLED = true; // set global pin "lock" flag @@ -116,7 +136,13 @@ void releaseStatusLED() { #endif #ifdef USE_STATUS_LED - digitalWrite(STATUS_LED_PIN, 0); // turn off + digitalWrite(STATUS_LED_PIN, +#if defined(STATUS_LED_INVERTED) +255 +#else +0 +#endif + ); // turn OFF pinMode(STATUS_LED_PIN, INPUT); // "release" for use by setting to input (hi-z) WS.lockStatusLED = false; // un-set global pin "lock" flag @@ -181,14 +207,32 @@ void setStatusLEDColor(uint32_t color) { #ifdef USE_STATUS_LED if (!WS.lockStatusLED) return; // status pixel is in-use elsewhere -#ifdef ARDUINO_ARCH_RP2040 - digitalWrite(STATUS_LED_PIN, color > 0); +#if defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_ARDUINO_NESSO_N1) || defined(STATUS_LED_INVERTED) + digitalWrite(STATUS_LED_PIN, +#if defined(STATUS_LED_INVERTED) + !(color > 0) +#else + color > 0 +#endif + ); #else if (color != BLACK) WS._pwmComponent->writeDutyCycle( - STATUS_LED_PIN, map(WS.status_pixel_brightness, 0.0, 1.0, 0, 1023)); + STATUS_LED_PIN, map(WS.status_pixel_brightness, 0.0, 1.0, +#if defined(STATUS_LED_INVERTED) +1023, 0 +#else +0, 1023 +#endif + )); else - WS._pwmComponent->writeDutyCycle(STATUS_LED_PIN, 0); + WS._pwmComponent->writeDutyCycle(STATUS_LED_PIN, +#if defined(STATUS_LED_INVERTED) + 1023 +#else + 0 +#endif + ); #endif #endif } @@ -240,15 +284,33 @@ void setStatusLEDColor(uint32_t color, int brightness) { if (!WS.lockStatusLED) return; -#ifdef ARDUINO_ARCH_RP2040 - digitalWrite(STATUS_LED_PIN, color > 0); +#if defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_ARDUINO_NESSO_N1) + digitalWrite(STATUS_LED_PIN, +#if defined(STATUS_LED_INVERTED) + !(color > 0) +#else + color > 0 +#endif + ); #else if (color != BLACK) { // re-map for pixel as a LED - int pulseWidth = map(brightness, 0, 255, 0, 1023); + int pulseWidth = map(brightness, 0, 255, +#if defined(STATUS_LED_INVERTED) + 1023, 0 +#else + 0, 1023 +#endif + ); WS._pwmComponent->writeDutyCycle(STATUS_LED_PIN, pulseWidth); } else { - WS._pwmComponent->writeDutyCycle(STATUS_LED_PIN, 0); + WS._pwmComponent->writeDutyCycle(STATUS_LED_PIN, +#if defined(STATUS_LED_INVERTED) + 1023 +#else + 0 +#endif + ); } #endif #endif diff --git a/src/provisioning/littlefs/WipperSnapper_LittleFS.cpp b/src/provisioning/littlefs/WipperSnapper_LittleFS.cpp index 5c58b8b22..5cca6b684 100644 --- a/src/provisioning/littlefs/WipperSnapper_LittleFS.cpp +++ b/src/provisioning/littlefs/WipperSnapper_LittleFS.cpp @@ -12,7 +12,7 @@ * BSD license, all text here must be included in any redistribution. * */ -#if defined(ARDUINO_FEATHER_ESP32) || \ +#if defined(ARDUINO_FEATHER_ESP32) || defined(ARDUINO_ARDUINO_NESSO_N1) || \ defined(ARDUINO_ESP8266_ADAFRUIT_HUZZAH) || \ defined(ARDUINO_ADAFRUIT_ITSYBITSY_ESP32) || \ defined(ARDUINO_ADAFRUIT_FEATHER_ESP32_V2) || \ diff --git a/src/provisioning/tinyusb/Wippersnapper_FS.cpp b/src/provisioning/tinyusb/Wippersnapper_FS.cpp index 2db5d1bde..243195539 100644 --- a/src/provisioning/tinyusb/Wippersnapper_FS.cpp +++ b/src/provisioning/tinyusb/Wippersnapper_FS.cpp @@ -28,7 +28,7 @@ defined(ARDUINO_ADAFRUIT_FEATHER_ESP32S3_REVTFT) || \ defined(ARDUINO_ADAFRUIT_FEATHER_ESP32S2_REVTFT) || \ defined(ARDUINO_ADAFRUIT_QTPY_ESP32S3_N4R2) || \ - defined(ARDUINO_XIAO_ESP32S3) || \ + defined(ARDUINO_XIAO_ESP32S3) || \ defined(ARDUINO_ADAFRUIT_FRUITJAM_RP2350) #include "Wippersnapper_FS.h"