diff --git a/src/internal/methods/NeoEspBitBangMethod.cpp b/src/internal/methods/NeoEspBitBangMethod.cpp index 93ae066..cbc446e 100644 --- a/src/internal/methods/NeoEspBitBangMethod.cpp +++ b/src/internal/methods/NeoEspBitBangMethod.cpp @@ -41,14 +41,60 @@ static inline uint32_t getCycleCount(void) return ccount; } -void IRAM_ATTR neoEspBitBangWriteSpacingPixels(const uint8_t* pixels, +// Interrupt lock class, used for RAII interrupt disabling +class InterruptLock { +#if defined(ARDUINO_ARCH_ESP32) + portMUX_TYPE updateMux; +#endif + + inline void lock() + { +#if defined(ARDUINO_ARCH_ESP32) + portENTER_CRITICAL(&updateMux); +#else + noInterrupts(); +#endif + } + + inline void unlock() + { +#if defined(ARDUINO_ARCH_ESP32) + portEXIT_CRITICAL(&updateMux); +#else + interrupts(); +#endif + } + +public: + + inline void poll() + { + unlock(); + lock(); + } + + inline InterruptLock() +#if defined(ARDUINO_ARCH_ESP32) + : updateMux(portMUX_INITIALIZER_UNLOCKED) +#endif + { + lock(); + } + + inline ~InterruptLock() + { + unlock(); + } +}; + +bool IRAM_ATTR neoEspBitBangWriteSpacingPixels(const uint8_t* pixels, const uint8_t* end, uint8_t pin, uint32_t t0h, uint32_t t1h, uint32_t period, size_t sizePixel, - uint32_t tSpacing, + uint32_t tLatch, bool invert) { uint32_t setValue = _BV(pin); @@ -89,6 +135,9 @@ void IRAM_ATTR neoEspBitBangWriteSpacingPixels(const uint8_t* pixels, std::swap(setValue, clearValue); } + // Need 100% focus on instruction timing + InterruptLock isrGuard; + for (;;) { // do the checks here while we are waiting on time to pass @@ -136,20 +185,28 @@ void IRAM_ATTR neoEspBitBangWriteSpacingPixels(const uint8_t* pixels, mask = 0x80; subpix = *pixels++; - // if pixel spacing is needed - if (tSpacing) + // Hack: permit interrupts to fire + // If we get held up more than the latch period, stop. + // We do this at the end of an element to ensure that each + // element always gets valid data, even if we don't update + // every element. + if (tLatch) { - element++; + ++element; if (element == sizePixel) { + isrGuard.poll(); + if ((getCycleCount() - cyclesNext) > tLatch) + { + return false; // failed + } element = 0; - - // wait for pixel spacing - while ((getCycleCount() - cyclesNext) < tSpacing); } } } } + + return true; // update complete } diff --git a/src/internal/methods/NeoEspBitBangMethod.h b/src/internal/methods/NeoEspBitBangMethod.h index 1eab38d..a465500 100644 --- a/src/internal/methods/NeoEspBitBangMethod.h +++ b/src/internal/methods/NeoEspBitBangMethod.h @@ -39,14 +39,14 @@ License along with NeoPixel. If not, see #define CYCLES_LOOPTEST (4) // adjustment due to loop exit test instruction cycles #endif -extern void neoEspBitBangWriteSpacingPixels(const uint8_t* pixels, +extern bool neoEspBitBangWriteSpacingPixels(const uint8_t* pixels, const uint8_t* end, uint8_t pin, uint32_t t0h, uint32_t t1h, uint32_t period, size_t sizePixel, - uint32_t tSpacing, + uint32_t tLatch, bool invert); @@ -70,7 +70,7 @@ public: const static uint32_t Period = (F_CPU / 800000 - CYCLES_LOOPTEST); // 1.25us per bit static const uint32_t ResetTimeUs = 300; - const static uint32_t TInterPixel = 0; + const static uint32_t TLatch = (F_CPU / 22222 - CYCLES_LOOPTEST); // 45us, be generous }; class NeoEspBitBangSpeedWs2812x @@ -81,7 +81,7 @@ public: const static uint32_t Period = (F_CPU / 800000 - CYCLES_LOOPTEST); // 1.25us per bit static const uint32_t ResetTimeUs = 300; - const static uint32_t TInterPixel = 0; + const static uint32_t TLatch = (F_CPU / 22222 - CYCLES_LOOPTEST); // 45us, be generous }; class NeoEspBitBangSpeedSk6812 @@ -92,7 +92,7 @@ public: const static uint32_t Period = (F_CPU / 800000 - CYCLES_LOOPTEST); // 1.25us per bit static const uint32_t ResetTimeUs = 80; - const static uint32_t TInterPixel = 0; + const static uint32_t TLatch = (F_CPU / 13333 - CYCLES_LOOPTEST); // 75us, be generous }; // Tm1814 normal is inverted signal @@ -104,7 +104,7 @@ public: const static uint32_t Period = (F_CPU / 800000 - CYCLES_LOOPTEST); // 1.25us per bit static const uint32_t ResetTimeUs = 200; - const static uint32_t TInterPixel = 0; + const static uint32_t TLatch = (F_CPU / 10000 - CYCLES_LOOPTEST); // 100us, be generous }; // Tm1829 normal is inverted signal @@ -116,7 +116,7 @@ public: const static uint32_t Period = (F_CPU / 800000 - CYCLES_LOOPTEST); // 1.25us per bit static const uint32_t ResetTimeUs = 200; - const static uint32_t TInterPixel = 0; + const static uint32_t TLatch = (F_CPU / 10000 - CYCLES_LOOPTEST); // 100us, be generous }; class NeoEspBitBangSpeed800Kbps @@ -127,7 +127,7 @@ public: const static uint32_t Period = (F_CPU / 800000 - CYCLES_LOOPTEST); // 1.25us per bit static const uint32_t ResetTimeUs = 50; - const static uint32_t TInterPixel = 0; + const static uint32_t TLatch = (F_CPU / 22222 - CYCLES_LOOPTEST); // 45us, be generous }; class NeoEspBitBangSpeed400Kbps @@ -138,7 +138,7 @@ public: const static uint32_t Period = (F_CPU / 400000 - CYCLES_LOOPTEST); static const uint32_t ResetTimeUs = 50; - const static uint32_t TInterPixel = 0; + const static uint32_t TLatch = (F_CPU / 22222 - CYCLES_LOOPTEST); // 45us, be generous }; class NeoEspBitBangSpeedApa106 @@ -149,7 +149,7 @@ public: const static uint32_t Period = (F_CPU / 606061 - CYCLES_LOOPTEST); // 1.65us static const uint32_t ResetTimeUs = 50; - const static uint32_t TInterPixel = 0; + const static uint32_t TLatch = (F_CPU / 22222 - CYCLES_LOOPTEST); // 45us, be generous }; class NeoEspBitBangSpeedIntertek @@ -160,31 +160,24 @@ public: const static uint32_t Period = (F_CPU / 800000 - CYCLES_LOOPTEST); // 1.25us per bit const static uint32_t ResetTimeUs = 12470; - const static uint32_t TInterPixel = (F_CPU / 50000); // 20us + // const static uint32_t TInterPixel = (F_CPU / 50000); // 20us + const static uint32_t TLatch = (F_CPU / 22222 - CYCLES_LOOPTEST); // 45us??? couldn't find datasheet }; - -template class NeoEspBitBangEncode : public T_SPEED, public T_INVERTED -{ +template class NeoEspTLatch +{ public: - static void WritePixels(uint8_t pin, - const uint8_t* data, - size_t sizeData, - size_t sizePixel) - { - neoEspBitBangWriteSpacingPixels(data, - data + sizeData, - pin, - T_SPEED::T0H, - T_SPEED::T1H, - T_SPEED::Period, - sizePixel, - T_SPEED::TInterPixel, - T_INVERTED::IdleLevel); - } + const static uint32_t TLatch = T_SPEED::TLatch; }; -template class NeoEspBitBangMethodBase +// Partial specialization for no interrupt case resolution +template class NeoEspTLatch +{ +public: + const static uint32_t TLatch = 0; +}; + +template class NeoEspBitBangMethodBase { public: typedef NeoNoSettings SettingsObject; @@ -211,52 +204,45 @@ public: { uint32_t delta = micros() - _endTime; - return (delta >= T_ENCODER::ResetTimeUs); + return (delta >= T_SPEED::ResetTimeUs); } void Initialize() { - digitalWrite(_pin, T_ENCODER::IdleLevel); + digitalWrite(_pin, T_INVERTED::IdleLevel); _endTime = micros(); } void Update(bool) { - // Data latch = 50+ microsecond pause in the output stream. Rather than - // put a delay at the end of the function, the ending time is noted and - // the function will simply hold off (if needed) on issuing the - // subsequent round of data until the latch time has elapsed. This - // allows the mainline code to start generating the next frame of data - // rather than stalling for the latch. - while (!IsReadyToUpdate()) + bool done = false; + for (unsigned retries = 0; !done && retries < 4; ++retries) { - yield(); // allows for system yield if needed + // Data latch = 50+ microsecond pause in the output stream. Rather than + // put a delay at the end of the function, the ending time is noted and + // the function will simply hold off (if needed) on issuing the + // subsequent round of data until the latch time has elapsed. This + // allows the mainline code to start generating the next frame of data + // rather than stalling for the latch. + while (!IsReadyToUpdate()) + { + yield(); // allows for system yield if needed + } + + done = neoEspBitBangWriteSpacingPixels(_data, + _data + _sizeData, + _pin, + T_SPEED::T0H, + T_SPEED::T1H, + T_SPEED::Period, + _sizePixel, + NeoEspTLatch::TLatch, + T_INVERTED::IdleLevel); + + // save EOD time for latch on next call + _endTime = micros(); } - - // Need 100% focus on instruction timing -#if defined(ARDUINO_ARCH_ESP32) - // delay(1); // required ? - portMUX_TYPE updateMux = portMUX_INITIALIZER_UNLOCKED; - - portENTER_CRITICAL(&updateMux); -#else - noInterrupts(); -#endif - - T_ENCODER::WritePixels(_pin, - _data, - _sizeData, - _sizePixel); - -#if defined(ARDUINO_ARCH_ESP32) - portEXIT_CRITICAL(&updateMux); -#else - interrupts(); -#endif - - // save EOD time for latch on next call - _endTime = micros(); } bool AlwaysUpdate() @@ -291,15 +277,15 @@ private: #if defined(ARDUINO_ARCH_ESP32) -typedef NeoEspBitBangMethodBase> NeoEsp32BitBangWs2811Method; -typedef NeoEspBitBangMethodBase> NeoEsp32BitBangWs2812xMethod; -typedef NeoEspBitBangMethodBase> NeoEsp32BitBangSk6812Method; -typedef NeoEspBitBangMethodBase> NeoEsp32BitBangTm1814Method; -typedef NeoEspBitBangMethodBase> NeoEsp32BitBangTm1829Method; -typedef NeoEspBitBangMethodBase> NeoEsp32BitBang800KbpsMethod; -typedef NeoEspBitBangMethodBase> NeoEsp32BitBang400KbpsMethod; -typedef NeoEspBitBangMethodBase> NeoEsp32BitBangApa106Method; -typedef NeoEspBitBangMethodBase> NeoEsp32BitBangIntertekMethod; +typedef NeoEspBitBangMethodBase NeoEsp32BitBangWs2811Method; +typedef NeoEspBitBangMethodBase NeoEsp32BitBangWs2812xMethod; +typedef NeoEspBitBangMethodBase NeoEsp32BitBangSk6812Method; +typedef NeoEspBitBangMethodBase NeoEsp32BitBangTm1814Method; +typedef NeoEspBitBangMethodBase NeoEsp32BitBangTm1829Method; +typedef NeoEspBitBangMethodBase NeoEsp32BitBang800KbpsMethod; +typedef NeoEspBitBangMethodBase NeoEsp32BitBang400KbpsMethod; +typedef NeoEspBitBangMethodBase NeoEsp32BitBangApa106Method; +typedef NeoEspBitBangMethodBase NeoEsp32BitBangIntertekMethod; typedef NeoEsp32BitBangWs2812xMethod NeoEsp32BitBangWs2813Method; typedef NeoEsp32BitBang800KbpsMethod NeoEsp32BitBangWs2812Method; @@ -307,15 +293,15 @@ typedef NeoEsp32BitBangWs2812xMethod NeoEsp32BitBangWs2816Method; typedef NeoEsp32BitBangTm1814Method NeoEsp32BitBangTm1914Method; typedef NeoEsp32BitBangSk6812Method NeoEsp32BitBangLc8812Method; -typedef NeoEspBitBangMethodBase> NeoEsp32BitBangWs2811InvertedMethod; -typedef NeoEspBitBangMethodBase> NeoEsp32BitBangWs2812xInvertedMethod; -typedef NeoEspBitBangMethodBase> NeoEsp32BitBangSk6812InvertedMethod; -typedef NeoEspBitBangMethodBase> NeoEsp32BitBangTm1814InvertedMethod; -typedef NeoEspBitBangMethodBase> NeoEsp32BitBangTm1829InvertedMethod; -typedef NeoEspBitBangMethodBase> NeoEsp32BitBang800KbpsInvertedMethod; -typedef NeoEspBitBangMethodBase> NeoEsp32BitBang400KbpsInvertedMethod; -typedef NeoEspBitBangMethodBase> NeoEsp32BitBangApa106InvertedMethod; -typedef NeoEspBitBangMethodBase> NeoEsp32BitBangIntertekInvertedMethod; +typedef NeoEspBitBangMethodBase NeoEsp32BitBangWs2811InvertedMethod; +typedef NeoEspBitBangMethodBase NeoEsp32BitBangWs2812xInvertedMethod; +typedef NeoEspBitBangMethodBase NeoEsp32BitBangSk6812InvertedMethod; +typedef NeoEspBitBangMethodBase NeoEsp32BitBangTm1814InvertedMethod; +typedef NeoEspBitBangMethodBase NeoEsp32BitBangTm1829InvertedMethod; +typedef NeoEspBitBangMethodBase NeoEsp32BitBang800KbpsInvertedMethod; +typedef NeoEspBitBangMethodBase NeoEsp32BitBang400KbpsInvertedMethod; +typedef NeoEspBitBangMethodBase NeoEsp32BitBangApa106InvertedMethod; +typedef NeoEspBitBangMethodBase NeoEsp32BitBangIntertekInvertedMethod; typedef NeoEsp32BitBangWs2812xInvertedMethod NeoEsp32BitBangWs2813InvertedMethod; typedef NeoEsp32BitBang800KbpsInvertedMethod NeoEsp32BitBangWs2812InvertedMethod; @@ -323,17 +309,49 @@ typedef NeoEsp32BitBangWs2812xInvertedMethod NeoEsp32BitBangWs2816InvertedMethod typedef NeoEsp32BitBangTm1814InvertedMethod NeoEsp32BitBangTm1914InvertedMethod; typedef NeoEsp32BitBangSk6812InvertedMethod NeoEsp32BitBangLc8812InvertedMethod; +typedef NeoEspBitBangMethodBase NeoEsp32BitBangWs2811NoIntrMethod; +typedef NeoEspBitBangMethodBase NeoEsp32BitBangWs2812xNoIntrMethod; +typedef NeoEspBitBangMethodBase NeoEsp32BitBangSk6812NoIntrMethod; +typedef NeoEspBitBangMethodBase NeoEsp32BitBangTm1814NoIntrMethod; +typedef NeoEspBitBangMethodBase NeoEsp32BitBangTm1829NoIntrMethod; +typedef NeoEspBitBangMethodBase NeoEsp32BitBang800KbpsNoIntrMethod; +typedef NeoEspBitBangMethodBase NeoEsp32BitBang400KbpsNoIntrMethod; +typedef NeoEspBitBangMethodBase NeoEsp32BitBangApa106NoIntrMethod; +typedef NeoEspBitBangMethodBase NeoEsp32BitBangIntertekNoIntrMethod; + +typedef NeoEsp32BitBangWs2812xMethod NeoEsp32BitBangWs2813NoIntrMethod; +typedef NeoEsp32BitBang800KbpsMethod NeoEsp32BitBangWs2812NoIntrMethod; +typedef NeoEsp32BitBangWs2812xMethod NeoEsp32BitBangWs2816NoIntrMethod; +typedef NeoEsp32BitBangTm1814Method NeoEsp32BitBangTm1914NoIntrMethod; +typedef NeoEsp32BitBangSk6812Method NeoEsp32BitBangLc8812NoIntrMethod; + +typedef NeoEspBitBangMethodBase NeoEsp32BitBangWs2811InvertedNoIntrMethod; +typedef NeoEspBitBangMethodBase NeoEsp32BitBangWs2812xInvertedNoIntrMethod; +typedef NeoEspBitBangMethodBase NeoEsp32BitBangSk6812InvertedNoIntrMethod; +typedef NeoEspBitBangMethodBase NeoEsp32BitBangTm1814InvertedNoIntrMethod; +typedef NeoEspBitBangMethodBase NeoEsp32BitBangTm1829InvertedNoIntrMethod; +typedef NeoEspBitBangMethodBase NeoEsp32BitBang800KbpsInvertedNoIntrMethod; +typedef NeoEspBitBangMethodBase NeoEsp32BitBang400KbpsInvertedNoIntrMethod; +typedef NeoEspBitBangMethodBase NeoEsp32BitBangApa106InvertedNoIntrMethod; +typedef NeoEspBitBangMethodBase NeoEsp32BitBangIntertekInvertedNoIntrMethod; + +typedef NeoEsp32BitBangWs2812xInvertedMethod NeoEsp32BitBangWs2813InvertedNoIntrMethod; +typedef NeoEsp32BitBang800KbpsInvertedMethod NeoEsp32BitBangWs2812InvertedNoIntrMethod; +typedef NeoEsp32BitBangWs2812xInvertedMethod NeoEsp32BitBangWs2816InvertedNoIntrMethod; +typedef NeoEsp32BitBangTm1814InvertedMethod NeoEsp32BitBangTm1914InvertedNoIntrMethod; +typedef NeoEsp32BitBangSk6812InvertedMethod NeoEsp32BitBangLc8812InvertedNoIntrMethod; + #else // defined(ARDUINO_ARCH_ESP8266) -typedef NeoEspBitBangMethodBase> NeoEsp8266BitBangWs2811Method; -typedef NeoEspBitBangMethodBase> NeoEsp8266BitBangWs2812xMethod; -typedef NeoEspBitBangMethodBase> NeoEsp8266BitBangSk6812Method; -typedef NeoEspBitBangMethodBase> NeoEsp8266BitBangTm1814Method; -typedef NeoEspBitBangMethodBase> NeoEsp8266BitBangTm1829Method; -typedef NeoEspBitBangMethodBase> NeoEsp8266BitBang800KbpsMethod; -typedef NeoEspBitBangMethodBase> NeoEsp8266BitBang400KbpsMethod; -typedef NeoEspBitBangMethodBase> NeoEsp8266BitBangApa106Method; -typedef NeoEspBitBangMethodBase> NeoEsp8266BitBangIntertekMethod; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBangWs2811Method; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBangWs2812xMethod; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBangSk6812Method; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBangTm1814Method; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBangTm1829Method; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBang800KbpsMethod; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBang400KbpsMethod; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBangApa106Method; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBangIntertekMethod; typedef NeoEsp8266BitBangWs2812xMethod NeoEsp8266BitBangWs2813Method; typedef NeoEsp8266BitBang800KbpsMethod NeoEsp8266BitBangWs2812Method; @@ -341,15 +359,15 @@ typedef NeoEsp8266BitBangWs2812xMethod NeoEsp8266BitBangWs2816Method; typedef NeoEsp8266BitBangTm1814Method NeoEsp8266BitBangTm1914Method; typedef NeoEsp8266BitBangSk6812Method NeoEsp8266BitBangLc8812Method; -typedef NeoEspBitBangMethodBase> NeoEsp8266BitBangWs2811InvertedMethod; -typedef NeoEspBitBangMethodBase> NeoEsp8266BitBangWs2812xInvertedMethod; -typedef NeoEspBitBangMethodBase> NeoEsp8266BitBangSk6812InvertedMethod; -typedef NeoEspBitBangMethodBase> NeoEsp8266BitBangTm1814InvertedMethod; -typedef NeoEspBitBangMethodBase> NeoEsp8266BitBangTm1829InvertedMethod; -typedef NeoEspBitBangMethodBase> NeoEsp8266BitBang800KbpsInvertedMethod; -typedef NeoEspBitBangMethodBase> NeoEsp8266BitBang400KbpsInvertedMethod; -typedef NeoEspBitBangMethodBase> NeoEsp8266BitBangApa106InvertedMethod; -typedef NeoEspBitBangMethodBase> NeoEsp8266BitBangIntertekInvertedMethod; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBangWs2811InvertedMethod; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBangWs2812xInvertedMethod; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBangSk6812InvertedMethod; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBangTm1814InvertedMethod; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBangTm1829InvertedMethod; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBang800KbpsInvertedMethod; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBang400KbpsInvertedMethod; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBangApa106InvertedMethod; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBangIntertekInvertedMethod; typedef NeoEsp8266BitBangWs2812xInvertedMethod NeoEsp8266BitBangWs2813InvertedMethod; typedef NeoEsp8266BitBang800KbpsInvertedMethod NeoEsp8266BitBangWs2812InvertedMethod; @@ -357,6 +375,38 @@ typedef NeoEsp8266BitBangWs2812xInvertedMethod NeoEsp8266BitBangWs2816InvertedMe typedef NeoEsp8266BitBangTm1814InvertedMethod NeoEsp8266BitBangTm1914InvertedMethod; typedef NeoEsp8266BitBangSk6812InvertedMethod NeoEsp8266BitBangLc8812InvertedMethod; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBangWs2811NoIntrMethod; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBangWs2812xNoIntrMethod; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBangSk6812NoIntrMethod; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBangTm1814NoIntrMethod; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBangTm1829NoIntrMethod; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBang800KbpsNoIntrMethod; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBang400KbpsNoIntrMethod; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBangApa106NoIntrMethod; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBangIntertekNoIntrMethod; + +typedef NeoEsp8266BitBangWs2812xMethod NeoEsp8266BitBangWs2813NoIntrMethod; +typedef NeoEsp8266BitBang800KbpsMethod NeoEsp8266BitBangWs2812NoIntrMethod; +typedef NeoEsp8266BitBangWs2812xMethod NeoEsp8266BitBangWs2816NoIntrMethod; +typedef NeoEsp8266BitBangTm1814Method NeoEsp8266BitBangTm1914NoIntrMethod; +typedef NeoEsp8266BitBangSk6812Method NeoEsp8266BitBangLc8812NoIntrMethod; + +typedef NeoEspBitBangMethodBase NeoEsp8266BitBangWs2811InvertedNoIntrMethod; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBangWs2812xInvertedNoIntrMethod; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBangSk6812InvertedNoIntrMethod; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBangTm1814InvertedNoIntrMethod; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBangTm1829InvertedNoIntrMethod; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBang800KbpsInvertedNoIntrMethod; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBang400KbpsInvertedNoIntrMethod; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBangApa106InvertedNoIntrMethod; +typedef NeoEspBitBangMethodBase NeoEsp8266BitBangIntertekInvertedNoIntrMethod; + +typedef NeoEsp8266BitBangWs2812xInvertedMethod NeoEsp8266BitBangWs2813InvertedNoIntrMethod; +typedef NeoEsp8266BitBang800KbpsInvertedMethod NeoEsp8266BitBangWs2812InvertedNoIntrMethod; +typedef NeoEsp8266BitBangWs2812xInvertedMethod NeoEsp8266BitBangWs2816InvertedNoIntrMethod; +typedef NeoEsp8266BitBangTm1814InvertedMethod NeoEsp8266BitBangTm1914InvertedNoIntrMethod; +typedef NeoEsp8266BitBangSk6812InvertedMethod NeoEsp8266BitBangLc8812InvertedNoIntrMethod; + #endif // defined(ARDUINO_ARCH_ESP32) // ESP bitbang doesn't have defaults and should avoided except for testing