From e58df00f3dbed8f70787aa237573a2fb72f9e471 Mon Sep 17 00:00:00 2001 From: Martin Date: Sat, 3 Aug 2024 12:07:04 -0400 Subject: [PATCH 01/14] Format change --- ESPixelStick/src/output/OutputMgr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ESPixelStick/src/output/OutputMgr.cpp b/ESPixelStick/src/output/OutputMgr.cpp index 23019bbc4..d77dc80d0 100644 --- a/ESPixelStick/src/output/OutputMgr.cpp +++ b/ESPixelStick/src/output/OutputMgr.cpp @@ -553,7 +553,7 @@ void c_OutputMgr::InstantiateNewOutputChannel(DriverInfo_t & CurrentOutputChanne } // end there is an existing driver // DEBUG_V (); - + // get the new data and UART info CurrentOutputChannelDriver.GpioPin = OutputChannelIdToGpioAndPort[CurrentOutputChannelDriver.DriverId].GpioPin; CurrentOutputChannelDriver.PortType = OutputChannelIdToGpioAndPort[CurrentOutputChannelDriver.DriverId].PortType; From a382f84b3fa5db598a24cf13e2dc8a1a7d95b051 Mon Sep 17 00:00:00 2001 From: Martin Date: Sat, 3 Aug 2024 12:12:08 -0400 Subject: [PATCH 02/14] Moved all spi pin data into the spi class. Added SPI pins to the advanced display --- ESPixelStick/src/output/OutputAPA102Spi.cpp | 4 +- ESPixelStick/src/output/OutputGrinch.cpp | 2 - ESPixelStick/src/output/OutputGrinch.hpp | 1 - ESPixelStick/src/output/OutputGrinchSpi.cpp | 10 +++-- ESPixelStick/src/output/OutputSpi.cpp | 41 ++++++++++++++++++--- ESPixelStick/src/output/OutputSpi.hpp | 5 ++- ESPixelStick/src/output/OutputWS2801Spi.cpp | 4 +- html/grinch.html | 10 +++++ html/script.js | 10 +++-- 9 files changed, 66 insertions(+), 21 deletions(-) diff --git a/ESPixelStick/src/output/OutputAPA102Spi.cpp b/ESPixelStick/src/output/OutputAPA102Spi.cpp index b8afc647c..e0b5d2616 100644 --- a/ESPixelStick/src/output/OutputAPA102Spi.cpp +++ b/ESPixelStick/src/output/OutputAPA102Spi.cpp @@ -71,8 +71,7 @@ void c_OutputAPA102Spi::GetConfig (ArduinoJson::JsonObject& jsonConfig) // DEBUG_START; c_OutputAPA102::GetConfig (jsonConfig); - - jsonConfig[CN_clock_pin] = DEFAULT_SPI_CLOCK_GPIO; + Spi.GetConfig(jsonConfig); // DEBUG_END; } // GetConfig @@ -83,6 +82,7 @@ bool c_OutputAPA102Spi::SetConfig (ArduinoJson::JsonObject& jsonConfig) // DEBUG_START; bool response = c_OutputAPA102::SetConfig (jsonConfig); + response |= Spi.SetConfig(jsonConfig); // DEBUG_END; return response; diff --git a/ESPixelStick/src/output/OutputGrinch.cpp b/ESPixelStick/src/output/OutputGrinch.cpp index 8d71eb457..0d75c4e70 100644 --- a/ESPixelStick/src/output/OutputGrinch.cpp +++ b/ESPixelStick/src/output/OutputGrinch.cpp @@ -51,7 +51,6 @@ void c_OutputGrinch::GetConfig (ArduinoJson::JsonObject& jsonConfig) // DEBUG_START; c_OutputCommon::GetConfig (jsonConfig); - jsonConfig[CN_cs_pin] = uint8_t (DataStrobe); jsonConfig[CN_count] = NumberOfGrinchControllers; // DEBUG_END; @@ -92,7 +91,6 @@ bool c_OutputGrinch::SetConfig (ArduinoJson::JsonObject& jsonConfig) // DEBUG_START; bool response = c_OutputCommon::SetConfig (jsonConfig); - response |= setFromJSON (DataStrobe, jsonConfig, CN_cs_pin); response |= setFromJSON (NumberOfGrinchControllers, jsonConfig, CN_count); NumberOfGrinchChannels = NumberOfGrinchControllers * DATA_CHANNELS_PER_GRINCH; diff --git a/ESPixelStick/src/output/OutputGrinch.hpp b/ESPixelStick/src/output/OutputGrinch.hpp index 3896587bb..1a9c4b725 100644 --- a/ESPixelStick/src/output/OutputGrinch.hpp +++ b/ESPixelStick/src/output/OutputGrinch.hpp @@ -51,7 +51,6 @@ class c_OutputGrinch : public c_OutputCommon #define MAX_NUM_SUPPORTED_GRINCHES 4 #define DATA_CHANNELS_PER_GRINCH 64 - gpio_num_t DataStrobe = DEFAULT_SPI_CS_GPIO; private: uint8_t NumberOfGrinchControllers = 1; diff --git a/ESPixelStick/src/output/OutputGrinchSpi.cpp b/ESPixelStick/src/output/OutputGrinchSpi.cpp index 69e5e83f9..fcdf72adb 100644 --- a/ESPixelStick/src/output/OutputGrinchSpi.cpp +++ b/ESPixelStick/src/output/OutputGrinchSpi.cpp @@ -52,7 +52,6 @@ void c_OutputGrinchSpi::Begin () { // DEBUG_START; Spi.Begin (this); - Spi.SetCsPin(DataStrobe); HasBeenInitialized = true; // DEBUG_END; @@ -62,11 +61,15 @@ void c_OutputGrinchSpi::Begin () //---------------------------------------------------------------------------- void c_OutputGrinchSpi::GetConfig (ArduinoJson::JsonObject& jsonConfig) { - // DEBUG_START; + DEBUG_START; c_OutputGrinch::GetConfig (jsonConfig); + Spi.GetConfig (jsonConfig); - // DEBUG_END; + extern void PrettyPrint (JsonObject& jsonStuff, String Name); + PrettyPrint(jsonConfig, "Grinch"); + + DEBUG_END; } // GetConfig //---------------------------------------------------------------------------- @@ -75,6 +78,7 @@ bool c_OutputGrinchSpi::SetConfig (ArduinoJson::JsonObject& jsonConfig) // DEBUG_START; bool response = c_OutputGrinch::SetConfig (jsonConfig); + response |= Spi.SetConfig (jsonConfig); // DEBUG_END; return response; diff --git a/ESPixelStick/src/output/OutputSpi.cpp b/ESPixelStick/src/output/OutputSpi.cpp index 0d22f1e18..36531a197 100644 --- a/ESPixelStick/src/output/OutputSpi.cpp +++ b/ESPixelStick/src/output/OutputSpi.cpp @@ -157,6 +157,35 @@ void c_OutputSpi::Begin (c_OutputPixel* _OutputPixel) } // Begin +//---------------------------------------------------------------------------- +bool c_OutputSpi::SetConfig (ArduinoJson::JsonObject & jsonConfig) +{ + DEBUG_START; + + bool response = true; +/* + response |= setFromJSON(CsPin, jsonConfig, CN_cs_pin); + response |= setFromJSON(DataPin, jsonConfig, CN_data_pin); + response |= setFromJSON(ClockPin, jsonConfig, CN_clock_pin); +*/ + DEBUG_END; + + return response; +} // SetConfig + +//---------------------------------------------------------------------------- +void c_OutputSpi::GetConfig (ArduinoJson::JsonObject & jsonConfig) +{ + DEBUG_START; + + JsonObject SpiConfig = jsonConfig["dataspi"].to(); + SpiConfig[CN_cs_pin] = CsPin; + SpiConfig[CN_data_pin] = DataPin; + SpiConfig[CN_clock_pin] = ClockPin; + + DEBUG_END; +} // GetConfig + //---------------------------------------------------------------------------- bool c_OutputSpi::ISR_MoreDataToSend() { @@ -223,10 +252,10 @@ void c_OutputSpi::SendIntensityData () TransactionToFill.length++; } - if(gpio_num_t(-1) != cs_pin) + if(gpio_num_t(-1) != CsPin) { // turn on the output strobe (latch data) - digitalWrite(cs_pin, LOW); + digitalWrite(CsPin, LOW); } ESP_ERROR_CHECK (spi_device_queue_trans (spi_device_handle, &Transactions[NextTransactionToFill], portMAX_DELAY)); @@ -236,7 +265,7 @@ void c_OutputSpi::SendIntensityData () NextTransactionToFill = 0; } - if(gpio_num_t(-1) != cs_pin) + if(gpio_num_t(-1) != CsPin) { if (!ISR_MoreDataToSend ()) { @@ -244,7 +273,7 @@ void c_OutputSpi::SendIntensityData () spi_device_get_trans_result(spi_device_handle, &pspi_transaction, 100); // turn on the output strobe (latch data) - digitalWrite(cs_pin, HIGH); + digitalWrite(CsPin, HIGH); } } } @@ -280,10 +309,10 @@ bool c_OutputSpi::Poll () StartNewFrame (); - if(gpio_num_t(-1) != cs_pin) + if(gpio_num_t(-1) != CsPin) { // turn on the output strobe (latch data) - pinMode(cs_pin, OUTPUT); + pinMode(CsPin, OUTPUT); } // fill all the available buffers diff --git a/ESPixelStick/src/output/OutputSpi.hpp b/ESPixelStick/src/output/OutputSpi.hpp index d4ccd4af2..99d27461e 100644 --- a/ESPixelStick/src/output/OutputSpi.hpp +++ b/ESPixelStick/src/output/OutputSpi.hpp @@ -49,7 +49,8 @@ class c_OutputSpi void GetDriverName (String& Name) { Name = CN_OutputSpi; } void DataOutputTask (void* pvParameters); void SendIntensityData (); - void SetCsPin(gpio_num_t _cs_pin) {cs_pin = _cs_pin;} + bool SetConfig (ArduinoJson::JsonObject & jsonConfig); + void GetConfig (ArduinoJson::JsonObject & jsonConfig); uint32_t DataTaskcounter = 0; uint32_t DataCbCounter = 0; @@ -70,7 +71,6 @@ class c_OutputSpi uint8_t NumIntensityValuesPerInterrupt = 0; uint8_t NumIntensityBitsPerInterrupt = 0; spi_device_handle_t spi_device_handle = 0; - gpio_num_t cs_pin = gpio_num_t(-1); // uint32_t FrameStartCounter = 0; uint32_t SendIntensityDataCounter = 0; @@ -84,6 +84,7 @@ class c_OutputSpi gpio_num_t DataPin = DEFAULT_SPI_DATA_GPIO; gpio_num_t ClockPin = DEFAULT_SPI_CLOCK_GPIO; + gpio_num_t CsPin = DEFAULT_SPI_CS_GPIO; c_OutputPixel* OutputPixel = nullptr; #if defined(SUPPORT_OutputType_GRINCH) diff --git a/ESPixelStick/src/output/OutputWS2801Spi.cpp b/ESPixelStick/src/output/OutputWS2801Spi.cpp index 39dd15036..9c878f956 100644 --- a/ESPixelStick/src/output/OutputWS2801Spi.cpp +++ b/ESPixelStick/src/output/OutputWS2801Spi.cpp @@ -67,8 +67,7 @@ void c_OutputWS2801Spi::GetConfig (ArduinoJson::JsonObject& jsonConfig) // DEBUG_START; c_OutputWS2801::GetConfig (jsonConfig); - - jsonConfig[CN_clock_pin] = DEFAULT_SPI_CLOCK_GPIO; + Spi.GetConfig(jsonConfig); // DEBUG_END; } // GetConfig @@ -79,6 +78,7 @@ bool c_OutputWS2801Spi::SetConfig (ArduinoJson::JsonObject& jsonConfig) // DEBUG_START; bool response = c_OutputWS2801::SetConfig (jsonConfig); + response |= Spi.SetConfig(jsonConfig); // DEBUG_END; return response; diff --git a/html/grinch.html b/html/grinch.html index a639e88d4..5dce4fd8d 100644 --- a/html/grinch.html +++ b/html/grinch.html @@ -11,4 +11,14 @@
+ + +
+ +
+ + +
+ +
diff --git a/html/script.js b/html/script.js index de4edbced..c3fa990a4 100644 --- a/html/script.js +++ b/html/script.js @@ -1145,7 +1145,9 @@ function ProcessModeConfigurationDataGrinch(GrinchConfig) // console.info("GrinchConfig: " + JSON.stringify(GrinchConfig)); $('#grinch #controller_count' ).val(GrinchConfig.count); - $('#grinch #cs_pin' ).val(GrinchConfig.cs_pin); + $('#grinch #cs_pin' ).val(GrinchConfig.dataspi.cs_pin); + $('#grinch #data_pin' ).val(GrinchConfig.dataspi.data_pin); + $('#grinch #clock_pin' ).val(GrinchConfig.dataspi.clock_pin); } // ProcessModeConfigurationDataGrinch @@ -1717,8 +1719,10 @@ function ExtractChannelConfigFromHtmlPage(JsonConfig, SectionName) { } else if(ChannelConfig.type === "Grinch") { - ChannelConfig.count = $('#grinch #controller_count' ).val(); - ChannelConfig.cs_pin = $('#grinch #cs_pin' ).val(); + ChannelConfig.count = $('#grinch #controller_count' ).val(); + ChannelConfig.dataspi.cs_pin = $('#grinch #cs_pin' ).val(); + ChannelConfig.dataspi.clock_pin = $('#grinch #clock_pin' ).val(); + ChannelConfig.dataspi.data_pin = $('#grinch #data_pin' ).val(); } else { ExtractConfigFromHtmlPages(elementids, modeControlName, ChannelConfig); From fe02a62ff676e660ea9c36406a192580ee82e99e Mon Sep 17 00:00:00 2001 From: Martin Date: Sat, 3 Aug 2024 12:28:58 -0400 Subject: [PATCH 03/14] Made CS pin configurable --- ESPixelStick/src/output/OutputSpi.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/ESPixelStick/src/output/OutputSpi.cpp b/ESPixelStick/src/output/OutputSpi.cpp index 36531a197..ea2fcaa9b 100644 --- a/ESPixelStick/src/output/OutputSpi.cpp +++ b/ESPixelStick/src/output/OutputSpi.cpp @@ -160,15 +160,17 @@ void c_OutputSpi::Begin (c_OutputPixel* _OutputPixel) //---------------------------------------------------------------------------- bool c_OutputSpi::SetConfig (ArduinoJson::JsonObject & jsonConfig) { - DEBUG_START; + // DEBUG_START; bool response = true; + JsonObject SpiConfig = jsonConfig["dataspi"]; + response |= setFromJSON(CsPin, SpiConfig, CN_cs_pin); + /* - response |= setFromJSON(CsPin, jsonConfig, CN_cs_pin); - response |= setFromJSON(DataPin, jsonConfig, CN_data_pin); - response |= setFromJSON(ClockPin, jsonConfig, CN_clock_pin); + response |= setFromJSON(DataPin, SpiConfig, CN_data_pin); + response |= setFromJSON(ClockPin, SpiConfig, CN_clock_pin); */ - DEBUG_END; + // DEBUG_END; return response; } // SetConfig @@ -176,14 +178,14 @@ bool c_OutputSpi::SetConfig (ArduinoJson::JsonObject & jsonConfig) //---------------------------------------------------------------------------- void c_OutputSpi::GetConfig (ArduinoJson::JsonObject & jsonConfig) { - DEBUG_START; + // DEBUG_START; JsonObject SpiConfig = jsonConfig["dataspi"].to(); SpiConfig[CN_cs_pin] = CsPin; SpiConfig[CN_data_pin] = DataPin; SpiConfig[CN_clock_pin] = ClockPin; - DEBUG_END; + // DEBUG_END; } // GetConfig //---------------------------------------------------------------------------- From b0d50cf1b12f3abb5c050547b5b62e8cbdada5a9 Mon Sep 17 00:00:00 2001 From: Martin Date: Sat, 3 Aug 2024 12:43:11 -0400 Subject: [PATCH 04/14] Fixed compile error for spi based pixels --- ESPixelStick/src/output/OutputSpi.hpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ESPixelStick/src/output/OutputSpi.hpp b/ESPixelStick/src/output/OutputSpi.hpp index 99d27461e..ebffce8ef 100644 --- a/ESPixelStick/src/output/OutputSpi.hpp +++ b/ESPixelStick/src/output/OutputSpi.hpp @@ -82,6 +82,10 @@ class c_OutputSpi uint8_t NextTransactionToFill = 0; TaskHandle_t SendIntensityDataTaskHandle = NULL; +#ifndef DEFAULT_SPI_CS_GPIO +# define DEFAULT_SPI_CS_GPIO gpio_num_t(-1) +#endif // ndef DEFAULT_SPI_CS_GPIO + gpio_num_t DataPin = DEFAULT_SPI_DATA_GPIO; gpio_num_t ClockPin = DEFAULT_SPI_CLOCK_GPIO; gpio_num_t CsPin = DEFAULT_SPI_CS_GPIO; From 15491ef48183bc3c7afa19e2d2a21f24f636ae96 Mon Sep 17 00:00:00 2001 From: Martin Date: Sat, 3 Aug 2024 19:06:40 -0400 Subject: [PATCH 05/14] Added validation for number of controllers. --- ESPixelStick/src/output/OutputGrinch.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ESPixelStick/src/output/OutputGrinch.cpp b/ESPixelStick/src/output/OutputGrinch.cpp index 0d75c4e70..c29733593 100644 --- a/ESPixelStick/src/output/OutputGrinch.cpp +++ b/ESPixelStick/src/output/OutputGrinch.cpp @@ -92,6 +92,8 @@ bool c_OutputGrinch::SetConfig (ArduinoJson::JsonObject& jsonConfig) bool response = c_OutputCommon::SetConfig (jsonConfig); response |= setFromJSON (NumberOfGrinchControllers, jsonConfig, CN_count); + NumberOfGrinchControllers = min(uint8_t(MAX_NUM_SUPPORTED_GRINCHES), NumberOfGrinchControllers); + NumberOfGrinchControllers = max(uint8_t(1), NumberOfGrinchControllers); NumberOfGrinchChannels = NumberOfGrinchControllers * DATA_CHANNELS_PER_GRINCH; NumberOfGrinchDataBytes = NumberOfGrinchChannels / (sizeof(uint8_t) * 8); From 8bf6eff3c502223103d5c5d76356b10e2e019a27 Mon Sep 17 00:00:00 2001 From: Martin Date: Sun, 4 Aug 2024 11:33:10 -0400 Subject: [PATCH 06/14] updated to latest framework --- platformio.ini | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/platformio.ini b/platformio.ini index 408d2363a..ff466118d 100644 --- a/platformio.ini +++ b/platformio.ini @@ -4,7 +4,7 @@ ; Local configuration should be done in platformio_user.ini [platformio] -default_envs = espsv3, d1_mini, d1_mini_pro, d32_pro, d32_pro_eth, esp32_cam, esp32_ttgo_t8, d1_mini32, d1_mini32_eth, esp32_bong69, esp32_wt32eth01, esp32_quinled_quad, esp32_quinled_quad_ae_plus, esp32_quinled_quad_ae_plus_8, esp32_quinled_quad_eth, esp32_quinled_uno, esp32_quinled_uno_ae_plus, esp32_quinled_uno_eth, esp32_quinled_dig_octa, esp01s, d1_mini_mhetesp32minikit, olimex_esp32_gw, d1_mini_twilightlord, d1_mini_twilightlord_eth, esp32_devkitc, esp32_quinled_uno_eth_espsv3, esp32_quinled_uno_espsv3, m5stack_atom, esp3deuxquatro_dmx, esp32_wasatch, esp32_tetra2go, esp32_kr_lights_msm, d1_mini_lolinsd, esp32_ka, esp32_breakdancev2 +default_envs = espsv3, d1_mini, d1_mini_pro, d32_pro, d32_pro_eth, esp32_cam, esp32_ttgo_t8, d1_mini32, d1_mini32_eth, esp32_bong69, esp32_wt32eth01, esp32_quinled_quad, esp32_quinled_quad_ae_plus, esp32_quinled_quad_ae_plus_8, esp32_quinled_quad_eth, esp32_quinled_uno, esp32_quinled_uno_ae_plus, esp32_quinled_uno_eth, esp32_quinled_dig_octa, esp01s, d1_mini_mhetesp32minikit, olimex_esp32_gw, d1_mini_twilightlord, d1_mini_twilightlord_eth, esp32_devkitc, esp32_devkitc6, esp32_quinled_uno_eth_espsv3, esp32_quinled_uno_espsv3, m5stack_atom, esp3deuxquatro_dmx, esp32_wasatch, esp32_tetra2go, esp32_kr_lights_msm, d1_mini_lolinsd, esp32_ka, esp32_breakdancev2 src_dir = ./ESPixelStick data_dir = ./ESPixelStick/data build_cache_dir = ./.pio/.buildcache @@ -118,9 +118,9 @@ extra_scripts = ${env.extra_scripts} [esp32git] extends = esp32 build_flags = ${esp32.build_flags} -mtext-section-literals -platform = espressif32 @ 6.6.0 +platform = https://github.com/platformio/platform-espressif32 @ 6.8.1 platform_packages = - framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#2.0.16 ; uses a lot of ram + framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.4 board_build.arduino.upstream_packages = no ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; @@ -423,6 +423,14 @@ build_flags = -D BOARD_NAME='"esp32_devkitc"' -D BOARD_ESP32_DEVKITC +[env:esp32_devkitc6] +extends = esp32git +board = esp32-c6-devkitc-1 +build_flags = + ${esp32git.build_flags} + -D BOARD_NAME='"esp32_devkitc6"' + -D BOARD_ESP32_DEVKITC + ;M5Stack Atom Lite/Matrix [env:m5stack_atom] extends = esp32git From 33bfefebf9b993a3dec001ba7dfb58d7d1bf0f7f Mon Sep 17 00:00:00 2001 From: Martin Date: Mon, 5 Aug 2024 11:07:46 -0400 Subject: [PATCH 07/14] Turned off Debug output --- ESPixelStick/src/output/OutputGrinchSpi.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ESPixelStick/src/output/OutputGrinchSpi.cpp b/ESPixelStick/src/output/OutputGrinchSpi.cpp index fcdf72adb..a644c6d74 100644 --- a/ESPixelStick/src/output/OutputGrinchSpi.cpp +++ b/ESPixelStick/src/output/OutputGrinchSpi.cpp @@ -61,15 +61,15 @@ void c_OutputGrinchSpi::Begin () //---------------------------------------------------------------------------- void c_OutputGrinchSpi::GetConfig (ArduinoJson::JsonObject& jsonConfig) { - DEBUG_START; + // DEBUG_START; c_OutputGrinch::GetConfig (jsonConfig); Spi.GetConfig (jsonConfig); - extern void PrettyPrint (JsonObject& jsonStuff, String Name); - PrettyPrint(jsonConfig, "Grinch"); + // extern void PrettyPrint (JsonObject& jsonStuff, String Name); + // PrettyPrint(jsonConfig, "Grinch"); - DEBUG_END; + // DEBUG_END; } // GetConfig //---------------------------------------------------------------------------- From 23bec907a7865c6f2716613cf32877e7116dde95 Mon Sep 17 00:00:00 2001 From: Martin Date: Tue, 6 Aug 2024 17:33:11 -0400 Subject: [PATCH 08/14] Added temperature sensor support. --- ESPixelStick/src/platformDefinitions/GPIO_Defs_ESP32_KA.hpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ESPixelStick/src/platformDefinitions/GPIO_Defs_ESP32_KA.hpp b/ESPixelStick/src/platformDefinitions/GPIO_Defs_ESP32_KA.hpp index 5b0245454..8436ec7d3 100644 --- a/ESPixelStick/src/platformDefinitions/GPIO_Defs_ESP32_KA.hpp +++ b/ESPixelStick/src/platformDefinitions/GPIO_Defs_ESP32_KA.hpp @@ -40,6 +40,10 @@ #define SD_CARD_CLK_PIN gpio_num_t::GPIO_NUM_18 #define SD_CARD_CS_PIN gpio_num_t::GPIO_NUM_5 +// Temperature Sensor +#define SUPPORT_SENSOR_DS18B20 +#define ONEWIRE_PIN gpio_num_t::GPIO_NUM_27 + // Output Types // Not Finished - #define SUPPORT_OutputType_TLS3001 #define SUPPORT_OutputType_APA102 // SPI From 2f3b20422a7c4542d960fe8241fe817912880762 Mon Sep 17 00:00:00 2001 From: Martin Date: Tue, 6 Aug 2024 17:40:23 -0400 Subject: [PATCH 09/14] Use default arduino packages --- platformio.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platformio.ini b/platformio.ini index ff466118d..9a37b4367 100644 --- a/platformio.ini +++ b/platformio.ini @@ -119,8 +119,8 @@ extra_scripts = ${env.extra_scripts} extends = esp32 build_flags = ${esp32.build_flags} -mtext-section-literals platform = https://github.com/platformio/platform-espressif32 @ 6.8.1 -platform_packages = - framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.4 +;platform_packages = +; framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.4 board_build.arduino.upstream_packages = no ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; From 6f46300bd2208dd8efafb057e6006efbee643634 Mon Sep 17 00:00:00 2001 From: Martin Date: Thu, 15 Aug 2024 10:30:55 -0400 Subject: [PATCH 10/14] Resolved port overlap with the eth interface. --- .../GPIO_Defs_ESP32_WT32ETH01.hpp | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/ESPixelStick/src/platformDefinitions/GPIO_Defs_ESP32_WT32ETH01.hpp b/ESPixelStick/src/platformDefinitions/GPIO_Defs_ESP32_WT32ETH01.hpp index f624297ab..03e683824 100644 --- a/ESPixelStick/src/platformDefinitions/GPIO_Defs_ESP32_WT32ETH01.hpp +++ b/ESPixelStick/src/platformDefinitions/GPIO_Defs_ESP32_WT32ETH01.hpp @@ -3,7 +3,7 @@ * GPIO_Defs_ESP32_WT32ETH01.hpp - Output Management class * * Project: ESPixelStick - An ESP8266 / ESP32 and E1.31 based pixel driver -* Copyright (c) 2021 Shelby Merrick +* Copyright (c) 2024 Shelby Merrick * http://www.forkineye.com * * This program is provided free for you to use in any way that you wish, @@ -26,14 +26,11 @@ #define DEFAULT_RMT_2_GPIO gpio_num_t::GPIO_NUM_0 #define DEFAULT_RMT_3_GPIO gpio_num_t::GPIO_NUM_5 -#define DEFAULT_RMT_4_GPIO gpio_num_t::GPIO_NUM_16 +#define DEFAULT_RMT_4_GPIO gpio_num_t::GPIO_NUM_1 -// # define SUPPORT_SPI_OUTPUT -// #define DEFAULT_SPI_DATA_GPIO gpio_num_t::GPIO_NUM_15 -// #define DEFAULT_SPI_CLOCK_GPIO gpio_num_t::GPIO_NUM_25 - -#define DEFAULT_I2C_SDA gpio_num_t::GPIO_NUM_21 -#define DEFAULT_I2C_SCL gpio_num_t::GPIO_NUM_22 +// #define SUPPORT_SPI_OUTPUT +#define DEFAULT_I2C_SDA gpio_num_t::GPIO_NUM_3 +#define DEFAULT_I2C_SCL gpio_num_t::GPIO_NUM_17 // File Manager // #define SUPPORT_SD From 330044a6733b95d94bad8037247895c85b2dc932 Mon Sep 17 00:00:00 2001 From: Martin Date: Fri, 16 Aug 2024 15:37:15 -0400 Subject: [PATCH 11/14] Added continuous operation to the timer library. Made effects adjust for time used for processing and for delays in checking the timer. --- ESPixelStick/src/FastTimer.cpp | 33 ++++++++++++++----- ESPixelStick/src/FastTimer.hpp | 7 ++-- ESPixelStick/src/FileMgr.cpp | 4 --- ESPixelStick/src/input/InputEffectEngine.cpp | 24 +++++++++----- ESPixelStick/src/input/InputEffectEngine.hpp | 10 ++---- .../src/input/InputFPPRemotePlayEffectFsm.cpp | 2 +- .../src/input/InputFPPRemotePlayList.cpp | 8 ++--- ESPixelStick/src/input/InputMgr.hpp | 2 +- ESPixelStick/src/input/externalInput.cpp | 2 +- ESPixelStick/src/network/EthernetDriver.cpp | 12 +++---- ESPixelStick/src/network/WiFiDriver.cpp | 10 +++--- 11 files changed, 66 insertions(+), 48 deletions(-) diff --git a/ESPixelStick/src/FastTimer.cpp b/ESPixelStick/src/FastTimer.cpp index efbac248d..7b7e4e3ae 100644 --- a/ESPixelStick/src/FastTimer.cpp +++ b/ESPixelStick/src/FastTimer.cpp @@ -38,14 +38,23 @@ FastTimer::~FastTimer () //----------------------------------------------------------------------------- ///< Start the module -void FastTimer::StartTimer (uint32_t DurationMS) +void FastTimer::StartTimer (uint32_t _DurationMS, bool _continuous) { // DEBUG_START; + DurationMS = _DurationMS; + Continuous = _continuous; + uint64_t now = uint64_t(millis()); EndTimeMS = now + uint64_t(DurationMS); - offsetMS = uint64_t((EndTimeMS > uint32_t(-1)) ? uint32_t(-1) : uint32_t(0)); + OffsetMS = uint64_t((EndTimeMS > uint32_t(-1)) ? uint32_t(-1) : uint32_t(0)); + + // DEBUG_V(String("DurationMS: ") + String(DurationMS)); + // DEBUG_V(String("continuous: ") + String(Continuous)); + // DEBUG_V(String(" now: ") + String(now)); + // DEBUG_V(String(" EndTimeMS: ") + String(EndTimeMS)); + // DEBUG_V(String(" OffsetMS: ") + String(OffsetMS)); // DEBUG_END; } // StartTimer @@ -53,22 +62,30 @@ void FastTimer::StartTimer (uint32_t DurationMS) //----------------------------------------------------------------------------- bool FastTimer::IsExpired () { - return ((uint64_t(millis ()) + uint64_t(offsetMS)) >= EndTimeMS); + bool Expired = ((uint64_t(millis ()) + uint64_t(OffsetMS)) >= EndTimeMS); + + // do we need to restart the timer? + if(Expired && Continuous) + { + // adjust for next invocation + EndTimeMS += DurationMS; + } + return Expired; } // IsExpired //----------------------------------------------------------------------------- void FastTimer::CancelTimer() { - EndTimeMS = millis(); - offsetMS = 0; - + EndTimeMS = 0; + OffsetMS = 0; + DurationMS = 0; + Continuous = false; } // CancelTimer //----------------------------------------------------------------------------- uint32_t FastTimer::GetTimeRemaining() { - - return (IsExpired()) ? 0 : uint32_t(EndTimeMS - (uint64_t(millis()) + uint64_t(offsetMS))); + return (IsExpired()) ? 0 : uint32_t(EndTimeMS - (uint64_t(millis()) + uint64_t(OffsetMS))); } // GetTimeRemaining diff --git a/ESPixelStick/src/FastTimer.hpp b/ESPixelStick/src/FastTimer.hpp index 7f108acbe..e3a18505b 100644 --- a/ESPixelStick/src/FastTimer.hpp +++ b/ESPixelStick/src/FastTimer.hpp @@ -26,15 +26,16 @@ class FastTimer FastTimer (); virtual ~FastTimer (); - void StartTimer (uint32_t durationMS); + void StartTimer (uint32_t DurationMS, bool continuous); bool IsExpired(); void CancelTimer(); uint32_t GetTimeRemaining(); private: - + bool Continuous = false; + uint32_t DurationMS = 0; uint64_t EndTimeMS = 0; - uint32_t offsetMS = 0; + uint32_t OffsetMS = 0; protected: diff --git a/ESPixelStick/src/FileMgr.cpp b/ESPixelStick/src/FileMgr.cpp index 4794e9163..a21a55e64 100644 --- a/ESPixelStick/src/FileMgr.cpp +++ b/ESPixelStick/src/FileMgr.cpp @@ -603,11 +603,7 @@ bool c_FileMgr::LoadFlashFile (const String& FileName, DeserializationHandler Ha break; } - size_t JsonDocSize = file.size () * 3; - // DEBUG_V(String("Allocate JSON document. Size = ") + String(JsonDocSize)); - // DEBUG_V(String("Heap: ") + ESP.getFreeHeap()); JsonDocument jsonDoc; - // DEBUG_V(String("jsonDoc.capacity: ") + String(jsonDoc.capacity())); // DEBUG_V ("Convert File to JSON document"); DeserializationError error = deserializeJson (jsonDoc, file); diff --git a/ESPixelStick/src/input/InputEffectEngine.cpp b/ESPixelStick/src/input/InputEffectEngine.cpp index 2ff3ef24b..0bd26c206 100644 --- a/ESPixelStick/src/input/InputEffectEngine.cpp +++ b/ESPixelStick/src/input/InputEffectEngine.cpp @@ -303,8 +303,8 @@ void c_InputEffectEngine::PollFlash () uint32_t NextDelay = random(FlashInfo.MinDelayMS, FlashInfo.MaxDelayMS); uint32_t NextDuration = random(FlashInfo.MinDurationMS, FlashInfo.MaxDurationMS); - FlashInfo.delaytimer.StartTimer(NextDelay); - FlashInfo.durationtimer.StartTimer(NextDelay + NextDuration); + FlashInfo.delaytimer.StartTimer(NextDelay, false); + FlashInfo.durationtimer.StartTimer(NextDelay + NextDuration, false); // force the effect to overwrite the buffer EffectDelayTimer.CancelTimer(); @@ -354,10 +354,15 @@ void c_InputEffectEngine::Process () break; } - // DEBUG_V ("Update output"); + // timer has expired uint32_t wait = (this->*ActiveEffect->func)(); - EffectWait = max ((int)wait, MIN_EFFECT_DELAY); - EffectDelayTimer.StartTimer(EffectWait); + uint32_t NewEffectWait = max ((int)wait, MIN_EFFECT_DELAY); + if(NewEffectWait != EffectWait) + { + EffectWait = NewEffectWait; + // DEBUG_V ("Update timer"); + EffectDelayTimer.StartTimer(EffectWait, true); + } EffectCounter++; InputMgr.RestartBlankTimer (GetInputChannelId ()); @@ -570,6 +575,7 @@ void c_InputEffectEngine::setBrightness (float brightness) void c_InputEffectEngine::setSpeed (uint16_t speed) { EffectSpeed = speed; + // DEBUG_V(String("EffectSpeed: ") + String(speed)); setDelay (pow (10, (10 - speed) / 4.0 + 2)); } @@ -583,6 +589,8 @@ void c_InputEffectEngine::setDelay (uint16_t delay) { EffectDelay = MIN_EFFECT_DELAY; } + // DEBUG_V(String("EffectDelay: ") + String(EffectDelay)); + // DEBUG_END; } // setDelay @@ -599,9 +607,9 @@ void c_InputEffectEngine::setEffect (const String & effectName) // DEBUG_V ("Found desired effect"); if (!ActiveEffect->name.equalsIgnoreCase (currentEffect.name)) { - // DEBUG_V ("Starting Effect"); + // DEBUG_V ("Starting New Effect"); ActiveEffect = &ListOfEffects[EffectIndex]; - EffectDelayTimer.StartTimer(EffectDelay); + EffectDelayTimer.StartTimer(EffectDelay, true); EffectWait = MIN_EFFECT_DELAY; EffectCounter = 0; EffectStep = 0; @@ -761,7 +769,7 @@ uint16_t c_InputEffectEngine::effectSolidColor () //----------------------------------------------------------------------------- void c_InputEffectEngine::outputEffectColor (uint16_t pixelId, CRGB outputColor) { - // DEBUG_START; + // DEBUG_START; uint16_t NumPixels = MirroredPixelCount; diff --git a/ESPixelStick/src/input/InputEffectEngine.hpp b/ESPixelStick/src/input/InputEffectEngine.hpp index 3096ab34a..e99547421 100644 --- a/ESPixelStick/src/input/InputEffectEngine.hpp +++ b/ESPixelStick/src/input/InputEffectEngine.hpp @@ -129,17 +129,13 @@ class c_InputEffectEngine : public c_InputCommon bool HasBeenInitialized = false; #define MIN_EFFECT_DELAY 10 -#define MAX_EFFECT_DELAY 65535 -#define DEFAULT_EFFECT_DELAY 1000 using timeType = decltype(millis()); - - uint32_t EffectWait = 32; /* How long to wait for the effect to run again */ - + uint32_t EffectWait = 0; /* How long to wait for the effect to run again */ uint32_t EffectCounter = 0; /* Counter for the number of calls to the active effect */ - uint16_t EffectSpeed = 6; /* Externally controlled effect speed 1..10 */ - uint16_t EffectDelay = DEFAULT_EFFECT_DELAY; /* Internal representation of speed */ + uint32_t EffectSpeed = 6; /* Externally controlled effect speed 1..10 */ + uint32_t EffectDelay = 0; /* Internal representation of speed */ bool EffectReverse = false; /* Externally controlled effect reverse option */ bool EffectMirror = false; /* Externally controlled effect mirroring (start at center) */ bool EffectAllLeds = false; /* Externally controlled effect all leds = 1st led */ diff --git a/ESPixelStick/src/input/InputFPPRemotePlayEffectFsm.cpp b/ESPixelStick/src/input/InputFPPRemotePlayEffectFsm.cpp index fa261f0e2..626da19a6 100644 --- a/ESPixelStick/src/input/InputFPPRemotePlayEffectFsm.cpp +++ b/ESPixelStick/src/input/InputFPPRemotePlayEffectFsm.cpp @@ -52,7 +52,7 @@ void fsm_PlayEffect_state_Idle::Start (String & ConfigString, float ) // DEBUG_START; // DEBUG_V (String ("ConfigString: '") + ConfigString + "'"); - p_InputFPPRemotePlayEffect->PlayEffectTimer.StartTimer(1000 * p_InputFPPRemotePlayEffect->PlayDurationSec); + p_InputFPPRemotePlayEffect->PlayEffectTimer.StartTimer(1000 * p_InputFPPRemotePlayEffect->PlayDurationSec, false); // tell the effect engine what it is supposed to be doing JsonDocument EffectConfig; diff --git a/ESPixelStick/src/input/InputFPPRemotePlayList.cpp b/ESPixelStick/src/input/InputFPPRemotePlayList.cpp index 09c01ec55..daea70752 100644 --- a/ESPixelStick/src/input/InputFPPRemotePlayList.cpp +++ b/ESPixelStick/src/input/InputFPPRemotePlayList.cpp @@ -118,7 +118,7 @@ bool c_InputFPPRemotePlayList::ProcessPlayListEntry () // DEBUG_V (""); uint32_t FrameId = 0; uint32_t PlayCount = 1; - PauseDelayTimer.StartTimer(10000); + PauseDelayTimer.StartTimer(10000, false); // Get the playlist file String FileData; @@ -165,7 +165,7 @@ bool c_InputFPPRemotePlayList::ProcessPlayListEntry () { // DEBUG_V ("Entry is empty. Do a Pause"); - PauseDelayTimer.StartTimer(1000); + PauseDelayTimer.StartTimer(1000, false); fsm_PlayList_state_Paused_imp.Init (this); pCurrentFsmState->Start (PlayItemName, PauseDelayTimer.GetTimeRemaining() / 1000, PlayCount); break; @@ -209,7 +209,7 @@ bool c_InputFPPRemotePlayList::ProcessPlayListEntry () uint32_t PlayListEntryDuration = 0; setFromJSON (PlayListEntryDuration, JsonPlayListArrayEntry, CN_duration); // DEBUG_V (String ("PlayListEntryDuration: '") + String (PlayListEntryDuration) + "'"); - PauseDelayTimer.StartTimer(PlayListEntryDuration * 1000); + PauseDelayTimer.StartTimer(PlayListEntryDuration * 1000, false); // DEBUG_V (String (" PauseEndTime: '") + String (PauseEndTime) + "'"); fsm_PlayList_state_Paused_imp.Init (this); @@ -219,7 +219,7 @@ bool c_InputFPPRemotePlayList::ProcessPlayListEntry () else { logcon (String (F ("Unsupported Play List Entry type: '")) + PlayListEntryType + "'"); - PauseDelayTimer.StartTimer(10000); + PauseDelayTimer.StartTimer(10000, false); fsm_PlayList_state_Paused_imp.Init (this); pCurrentFsmState->Start (PlayListEntryName, FrameId, PlayCount); break; diff --git a/ESPixelStick/src/input/InputMgr.hpp b/ESPixelStick/src/input/InputMgr.hpp index 040ddb320..8cb7f6e38 100644 --- a/ESPixelStick/src/input/InputMgr.hpp +++ b/ESPixelStick/src/input/InputMgr.hpp @@ -62,7 +62,7 @@ class c_InputMgr void DeleteConfig () { FileMgr.DeleteFlashFile (ConfigFileName); } bool GetNetworkState () { return IsConnected; } void GetDriverName (String & Name) { Name = "InputMgr"; } - void RestartBlankTimer (e_InputChannelIds Selector) { BlankEndTime[int(Selector)].StartTimer(config.BlankDelay * 1000); } + void RestartBlankTimer (e_InputChannelIds Selector) { BlankEndTime[int(Selector)].StartTimer(config.BlankDelay * 1000, false); } bool BlankTimerHasExpired (e_InputChannelIds Selector) { return (BlankEndTime[int(Selector)].IsExpired()); } void ProcessButtonActions (c_ExternalInput::InputValue_t value); diff --git a/ESPixelStick/src/input/externalInput.cpp b/ESPixelStick/src/input/externalInput.cpp index 6b2f77e9a..5fcbb46ab 100644 --- a/ESPixelStick/src/input/externalInput.cpp +++ b/ESPixelStick/src/input/externalInput.cpp @@ -227,7 +227,7 @@ void fsm_ExternalInput_on_wait_long_state::Init (c_ExternalInput& pExternalInput // DEBUG_START; // DEBUG_V ("Entring Wait Long State"); - pExternalInput.InputHoldTimer.StartTimer(pExternalInput.LongPushDelayMS); + pExternalInput.InputHoldTimer.StartTimer(pExternalInput.LongPushDelayMS, false); pExternalInput.CurrentFsmState = &fsm_ExternalInput_on_wait_long_state_imp; // DEBUG_END; diff --git a/ESPixelStick/src/network/EthernetDriver.cpp b/ESPixelStick/src/network/EthernetDriver.cpp index cbdbdd035..359fbc80e 100644 --- a/ESPixelStick/src/network/EthernetDriver.cpp +++ b/ESPixelStick/src/network/EthernetDriver.cpp @@ -97,7 +97,7 @@ void c_EthernetDriver::Begin () WiFi.onEvent ([this](WiFiEvent_t event, arduino_event_info_t info) {this->onEventHandler (event, info); }); // set up the poll interval - NextPollTimer.StartTimer(PollInterval); + NextPollTimer.StartTimer(PollInterval, false); // DEBUG_END; @@ -284,7 +284,7 @@ void c_EthernetDriver::Poll () if (NextPollTimer.IsExpired()) { // DEBUG_V ("Polling"); - NextPollTimer.StartTimer(PollInterval); + NextPollTimer.StartTimer(PollInterval, false); pCurrentFsmState->Poll (); } @@ -464,7 +464,7 @@ void fsm_Eth_state_Boot::Init () pEthernetDriver->SetFsmState (this); // pEthernetDriver->AnnounceState (); - pEthernetDriver->GetFsmTimer().StartTimer(10000); + pEthernetDriver->GetFsmTimer().StartTimer(10000, false); // DEBUG_V(String("pEthernetDriver: 0x") + String(uint32_t(pEthernetDriver), HEX)); @@ -497,7 +497,7 @@ void fsm_Eth_state_PoweringUp::Init () pEthernetDriver->SetFsmState (this); pEthernetDriver->AnnounceState (); - pEthernetDriver->GetFsmTimer().StartTimer (pEthernetDriver->GetPowerPinActiveDelayMs()); + pEthernetDriver->GetFsmTimer().StartTimer (pEthernetDriver->GetPowerPinActiveDelayMs(), false); pEthernetDriver->InitPowerPin (); @@ -530,7 +530,7 @@ void fsm_Eth_state_ConnectingToEth::Init () pEthernetDriver->SetFsmState (this); pEthernetDriver->AnnounceState (); - pEthernetDriver->GetFsmTimer().StartTimer (5000); + pEthernetDriver->GetFsmTimer().StartTimer (5000, false); // DEBUG_END; @@ -581,7 +581,7 @@ void fsm_Eth_state_WaitForIP::Init () pEthernetDriver->SetFsmState (this); pEthernetDriver->AnnounceState (); - pEthernetDriver->GetFsmTimer().StartTimer (5000); + pEthernetDriver->GetFsmTimer().StartTimer (5000, false); // DEBUG_END; diff --git a/ESPixelStick/src/network/WiFiDriver.cpp b/ESPixelStick/src/network/WiFiDriver.cpp index 0315e10a1..c7706a560 100644 --- a/ESPixelStick/src/network/WiFiDriver.cpp +++ b/ESPixelStick/src/network/WiFiDriver.cpp @@ -189,7 +189,7 @@ void c_WiFiDriver::Begin () #endif // set up the poll interval - NextPoll.StartTimer(PollInterval); + NextPoll.StartTimer(PollInterval, false); // Main loop should start polling for us // pCurrentFsmState->Poll (); @@ -435,7 +435,7 @@ void c_WiFiDriver::Poll () if (NextPoll.IsExpired()) { // DEBUG_V ("Start Poll"); - NextPoll.StartTimer(PollInterval); + NextPoll.StartTimer(PollInterval, false); // displayFsmState (); pCurrentFsmState->Poll (); // displayFsmState (); @@ -733,7 +733,7 @@ void fsm_WiFi_state_ConnectingUsingConfig::Init () { pWiFiDriver->SetFsmState (this); pWiFiDriver->AnnounceState (); - pWiFiDriver->GetFsmTimer().StartTimer(1000 * pWiFiDriver->Get_sta_timeout()); + pWiFiDriver->GetFsmTimer().StartTimer(1000 * pWiFiDriver->Get_sta_timeout(), false); pWiFiDriver->connectWifi (CurrentSsid, CurrentPassphrase); } @@ -788,7 +788,7 @@ void fsm_WiFi_state_ConnectingUsingDefaults::Init () { pWiFiDriver->SetFsmState (this); pWiFiDriver->AnnounceState (); - pWiFiDriver->GetFsmTimer().StartTimer(1000 * pWiFiDriver->Get_sta_timeout ()); + pWiFiDriver->GetFsmTimer().StartTimer(1000 * pWiFiDriver->Get_sta_timeout (), false); pWiFiDriver->connectWifi (default_ssid, default_passphrase); } else @@ -848,7 +848,7 @@ void fsm_WiFi_state_ConnectingAsAP::Init () pWiFiDriver->SetFsmState (this); pWiFiDriver->AnnounceState (); - pWiFiDriver->GetFsmTimer ().StartTimer(1000 * pWiFiDriver->Get_ap_timeout ()); + pWiFiDriver->GetFsmTimer ().StartTimer(1000 * pWiFiDriver->Get_ap_timeout (), false); if (true == pWiFiDriver->Get_ap_fallbackIsEnabled() || pWiFiDriver->Get_ap_StayInApMode()) { From cf248eaf0259af32ffdc1af27daf162cc8e6f628 Mon Sep 17 00:00:00 2001 From: Martin Date: Fri, 16 Aug 2024 17:13:24 -0400 Subject: [PATCH 12/14] Adjusted timing to allow EVO and seed pixels to work. --- ESPixelStick/src/output/OutputWS2811.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ESPixelStick/src/output/OutputWS2811.hpp b/ESPixelStick/src/output/OutputWS2811.hpp index 127c9be28..a82a60d61 100644 --- a/ESPixelStick/src/output/OutputWS2811.hpp +++ b/ESPixelStick/src/output/OutputWS2811.hpp @@ -51,13 +51,13 @@ class c_OutputWS2811 : public c_OutputPixel #define WS2811_PIXEL_DATA_RATE 800000.0 #define WS2811_PIXEL_NS_BIT_TOTAL ( (1.0 / WS2811_PIXEL_DATA_RATE) * NanoSecondsInASecond) -#define WS2811_PIXEL_NS_BIT_0_HIGH 250.0 // 250ns +/- 150ns per datasheet +#define WS2811_PIXEL_NS_BIT_0_HIGH 315.0 // 220ns - 380ns per datasheet #define WS2811_PIXEL_NS_BIT_0_LOW (WS2811_PIXEL_NS_BIT_TOTAL - WS2811_PIXEL_NS_BIT_0_HIGH) -#define WS2811_PIXEL_NS_BIT_1_HIGH 600.0 // 600ns +/- 150ns per datasheet +#define WS2811_PIXEL_NS_BIT_1_HIGH 935.0 // 580ns - 1.6us per datasheet #define WS2811_PIXEL_NS_BIT_1_LOW (WS2811_PIXEL_NS_BIT_TOTAL - WS2811_PIXEL_NS_BIT_1_HIGH) -#define WS2811_PIXEL_IDLE_TIME_NS 300000.0 // 300us per datasheet +#define WS2811_PIXEL_IDLE_TIME_NS 350000.0 // 350us per datasheet #define WS2811_PIXEL_IDLE_TIME_US (WS2811_PIXEL_IDLE_TIME_NS / float(NanoSecondsInAMicroSecond)) #define WS2811_PIXEL_BITS_PER_INTENSITY 8 From 53972f13731f31971e7be585ca5903d6e663ceac Mon Sep 17 00:00:00 2001 From: Martin Date: Sat, 17 Aug 2024 17:55:49 -0400 Subject: [PATCH 13/14] Removed unused variables. --- ESPixelStick/src/output/OutputCommon.cpp | 6 ++---- ESPixelStick/src/output/OutputCommon.hpp | 7 ++----- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/ESPixelStick/src/output/OutputCommon.cpp b/ESPixelStick/src/output/OutputCommon.cpp index 5693535a3..4dbbeec7b 100644 --- a/ESPixelStick/src/output/OutputCommon.cpp +++ b/ESPixelStick/src/output/OutputCommon.cpp @@ -70,9 +70,9 @@ void c_OutputCommon::GetStatus (JsonObject & jsonStatus) // DEBUG_START; jsonStatus[CN_id] = OutputChannelId; - jsonStatus["framerefreshrate"] = (0 == FrameRefreshTimeInMicroSec) ? 0 : int(MicroSecondsInASecond / FrameDurationInMicroSec); + jsonStatus["framerefreshrate"] = int(MicroSecondsInASecond / FrameDurationInMicroSec); jsonStatus["FrameCount"] = FrameCount; - + // jsonStatus["ActualFrameDurationMicroSec"] = ActualFrameDurationMicroSec; // jsonStatus["FrameDurationInMicroSec"] = FrameDurationInMicroSec; // jsonStatus["FrameRefreshTimeInMicroSec"] = FrameRefreshTimeInMicroSec; @@ -91,9 +91,7 @@ void c_OutputCommon::ReportNewFrame () uint32_t Now = micros (); - FrameRefreshTimeInMicroSec = Now - FrameStartTimeInMicroSec; FrameStartTimeInMicroSec = Now; - FrameEndTimeInMicroSec = FrameStartTimeInMicroSec + FrameDurationInMicroSec; FrameCount++; // DEBUG_END; diff --git a/ESPixelStick/src/output/OutputCommon.hpp b/ESPixelStick/src/output/OutputCommon.hpp index 2ef354000..8c17bf3a9 100644 --- a/ESPixelStick/src/output/OutputCommon.hpp +++ b/ESPixelStick/src/output/OutputCommon.hpp @@ -69,7 +69,7 @@ class c_OutputCommon OTYPE_t OutputType = OTYPE_t::OutputType_Disabled; OID_t OutputChannelId = OID_t::OutputChannelId_End; bool HasBeenInitialized = false; - uint32_t FrameDurationInMicroSec = 25000; + uint32_t FrameDurationInMicroSec = 25000; uint32_t ActualFrameDurationMicroSec = 50000; // Default time for relays is every 50ms uint8_t * pOutputBuffer = nullptr; uint32_t OutputBufferSize = 0; @@ -81,7 +81,7 @@ class c_OutputCommon { bool response = false; uint32_t Now = micros (); - FrameTimeDeltaInMicroSec = Now - FrameStartTimeInMicroSec; // how many us since the frame started + uint32_t FrameTimeDeltaInMicroSec = Now - FrameStartTimeInMicroSec; // how many us since the frame started // did the counter wrap? if(Now < FrameStartTimeInMicroSec) @@ -97,9 +97,6 @@ class c_OutputCommon } private: - uint32_t FrameRefreshTimeInMicroSec = 0; uint32_t FrameStartTimeInMicroSec = 0; - uint32_t FrameEndTimeInMicroSec = 0; - uint32_t FrameTimeDeltaInMicroSec = 0; }; // c_OutputCommon From 5dfa036930973e745f4164af2e5b17710f857635 Mon Sep 17 00:00:00 2001 From: Martin Date: Sat, 17 Aug 2024 17:56:16 -0400 Subject: [PATCH 14/14] Tweaking pixel timing --- ESPixelStick/src/output/OutputWS2811.hpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/ESPixelStick/src/output/OutputWS2811.hpp b/ESPixelStick/src/output/OutputWS2811.hpp index a82a60d61..631cf910e 100644 --- a/ESPixelStick/src/output/OutputWS2811.hpp +++ b/ESPixelStick/src/output/OutputWS2811.hpp @@ -50,12 +50,17 @@ class c_OutputWS2811 : public c_OutputPixel #define WS2811_PIXEL_DATA_RATE 800000.0 #define WS2811_PIXEL_NS_BIT_TOTAL ( (1.0 / WS2811_PIXEL_DATA_RATE) * NanoSecondsInASecond) - -#define WS2811_PIXEL_NS_BIT_0_HIGH 315.0 // 220ns - 380ns per datasheet -#define WS2811_PIXEL_NS_BIT_0_LOW (WS2811_PIXEL_NS_BIT_TOTAL - WS2811_PIXEL_NS_BIT_0_HIGH) - -#define WS2811_PIXEL_NS_BIT_1_HIGH 935.0 // 580ns - 1.6us per datasheet -#define WS2811_PIXEL_NS_BIT_1_LOW (WS2811_PIXEL_NS_BIT_TOTAL - WS2811_PIXEL_NS_BIT_1_HIGH) +#ifdef ARDUINO_ARCH_ESP32 + #define WS2811_PIXEL_NS_BIT_0_HIGH 312.0 // = 312 on logic analyzer 220ns - 380ns per datasheet + #define WS2811_PIXEL_NS_BIT_0_LOW 945.0 // = 937 on logic analyzer 580ns - 1.6us per datasheet + #define WS2811_PIXEL_NS_BIT_1_HIGH 975.0 // = 937 on logic analyzer 580ns - 1.6us per datasheet + #define WS2811_PIXEL_NS_BIT_1_LOW 300.0 // = 312 on logic analyzer 220ns - 380ns per datasheet +#else + #define WS2811_PIXEL_NS_BIT_0_HIGH 312.0 // 220ns - 380ns per datasheet + #define WS2811_PIXEL_NS_BIT_0_LOW (WS2811_PIXEL_NS_BIT_TOTAL - WS2811_PIXEL_NS_BIT_0_HIGH) + #define WS2811_PIXEL_NS_BIT_1_HIGH 975.0 // 580ns - 1.6us per datasheet + #define WS2811_PIXEL_NS_BIT_1_LOW (WS2811_PIXEL_NS_BIT_TOTAL - WS2811_PIXEL_NS_BIT_1_HIGH) +#endif // ARDUINO_ARCH_ESP32 #define WS2811_PIXEL_IDLE_TIME_NS 350000.0 // 350us per datasheet #define WS2811_PIXEL_IDLE_TIME_US (WS2811_PIXEL_IDLE_TIME_NS / float(NanoSecondsInAMicroSecond))