forked from Makuna/NeoPixelBus
Esp bitbang interrupt workaround (#759)
* Move interrupt handling in EspBitBangMethod Move the interrupt enable/disable in to the common neoEspBitBangWriteSpacingPixels function. * Check interrupts during ESP bit-banging Rather than leave interrupts completely disabled, check in between elements. If interrupted for long enough to complete an update, retry from the beginning. We don't yield to the system context, so only interrupt processing goes on. This is intended to stave off interrupt related crashes (hard WDT resets) experienced when a too-long strand is used with a too-busy network. Essentially it trades off correctness for stability. This logic is inspired by the workaround used in FastLED. * Replace TInterPixel with TLatch when bit-banging In NeoESPBitBangMethod, remove the minimum time between pixels, and replace it with a maximum time between pixels. Use the outer function to handle the retry logic. * Support no interrupt mode when bit-banging * Add no-interrupt bit-banging method typedefs
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
|
||||
|
@@ -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<typename T_SPEED, typename T_INVERTED> class NeoEspBitBangEncode : public T_SPEED, public T_INVERTED
|
||||
template <typename T_SPEED, bool V_INTER_PIXEL_ISR> 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<typename T_ENCODER> class NeoEspBitBangMethodBase
|
||||
// Partial specialization for no interrupt case resolution
|
||||
template <typename T_SPEED> class NeoEspTLatch<T_SPEED, false>
|
||||
{
|
||||
public:
|
||||
const static uint32_t TLatch = 0;
|
||||
};
|
||||
|
||||
template<typename T_SPEED, typename T_INVERTED, bool V_INTER_PIXEL_ISR> 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<T_SPEED, V_INTER_PIXEL_ISR>::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<NeoEspBitBangEncode<NeoEspBitBangSpeedWs2811, NeoEspNotInverted>> NeoEsp32BitBangWs2811Method;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeedWs2812x, NeoEspNotInverted>> NeoEsp32BitBangWs2812xMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeedSk6812, NeoEspNotInverted>> NeoEsp32BitBangSk6812Method;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeedTm1814, NeoEspInverted>> NeoEsp32BitBangTm1814Method;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeedTm1829, NeoEspInverted>> NeoEsp32BitBangTm1829Method;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeed800Kbps, NeoEspNotInverted>> NeoEsp32BitBang800KbpsMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeed400Kbps, NeoEspNotInverted>> NeoEsp32BitBang400KbpsMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeedApa106, NeoEspNotInverted>> NeoEsp32BitBangApa106Method;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeedIntertek, NeoEspNotInverted>> NeoEsp32BitBangIntertekMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedWs2811, NeoEspNotInverted, true> NeoEsp32BitBangWs2811Method;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedWs2812x, NeoEspNotInverted, true> NeoEsp32BitBangWs2812xMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedSk6812, NeoEspNotInverted, true> NeoEsp32BitBangSk6812Method;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedTm1814, NeoEspInverted, true> NeoEsp32BitBangTm1814Method;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedTm1829, NeoEspInverted, true> NeoEsp32BitBangTm1829Method;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeed800Kbps, NeoEspNotInverted, true> NeoEsp32BitBang800KbpsMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeed400Kbps, NeoEspNotInverted, true> NeoEsp32BitBang400KbpsMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedApa106, NeoEspNotInverted, true> NeoEsp32BitBangApa106Method;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedIntertek, NeoEspNotInverted, true> NeoEsp32BitBangIntertekMethod;
|
||||
|
||||
typedef NeoEsp32BitBangWs2812xMethod NeoEsp32BitBangWs2813Method;
|
||||
typedef NeoEsp32BitBang800KbpsMethod NeoEsp32BitBangWs2812Method;
|
||||
@@ -307,15 +293,15 @@ typedef NeoEsp32BitBangWs2812xMethod NeoEsp32BitBangWs2816Method;
|
||||
typedef NeoEsp32BitBangTm1814Method NeoEsp32BitBangTm1914Method;
|
||||
typedef NeoEsp32BitBangSk6812Method NeoEsp32BitBangLc8812Method;
|
||||
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeedWs2811, NeoEspInverted>> NeoEsp32BitBangWs2811InvertedMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeedWs2812x, NeoEspInverted>> NeoEsp32BitBangWs2812xInvertedMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeedSk6812, NeoEspInverted>> NeoEsp32BitBangSk6812InvertedMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeedTm1814, NeoEspNotInverted>> NeoEsp32BitBangTm1814InvertedMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeedTm1829, NeoEspNotInverted>> NeoEsp32BitBangTm1829InvertedMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeed800Kbps, NeoEspInverted>> NeoEsp32BitBang800KbpsInvertedMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeed400Kbps, NeoEspInverted>> NeoEsp32BitBang400KbpsInvertedMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeedApa106, NeoEspInverted>> NeoEsp32BitBangApa106InvertedMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeedIntertek, NeoEspInverted>> NeoEsp32BitBangIntertekInvertedMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedWs2811, NeoEspInverted, true> NeoEsp32BitBangWs2811InvertedMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedWs2812x, NeoEspInverted, true> NeoEsp32BitBangWs2812xInvertedMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedSk6812, NeoEspInverted, true> NeoEsp32BitBangSk6812InvertedMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedTm1814, NeoEspNotInverted, true> NeoEsp32BitBangTm1814InvertedMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedTm1829, NeoEspNotInverted, true> NeoEsp32BitBangTm1829InvertedMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeed800Kbps, NeoEspInverted, true> NeoEsp32BitBang800KbpsInvertedMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeed400Kbps, NeoEspInverted, true> NeoEsp32BitBang400KbpsInvertedMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedApa106, NeoEspInverted, true> NeoEsp32BitBangApa106InvertedMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedIntertek, NeoEspInverted, true> NeoEsp32BitBangIntertekInvertedMethod;
|
||||
|
||||
typedef NeoEsp32BitBangWs2812xInvertedMethod NeoEsp32BitBangWs2813InvertedMethod;
|
||||
typedef NeoEsp32BitBang800KbpsInvertedMethod NeoEsp32BitBangWs2812InvertedMethod;
|
||||
@@ -323,17 +309,49 @@ typedef NeoEsp32BitBangWs2812xInvertedMethod NeoEsp32BitBangWs2816InvertedMethod
|
||||
typedef NeoEsp32BitBangTm1814InvertedMethod NeoEsp32BitBangTm1914InvertedMethod;
|
||||
typedef NeoEsp32BitBangSk6812InvertedMethod NeoEsp32BitBangLc8812InvertedMethod;
|
||||
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedWs2811, NeoEspNotInverted, false> NeoEsp32BitBangWs2811NoIntrMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedWs2812x, NeoEspNotInverted, false> NeoEsp32BitBangWs2812xNoIntrMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedSk6812, NeoEspNotInverted, false> NeoEsp32BitBangSk6812NoIntrMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedTm1814, NeoEspInverted, false> NeoEsp32BitBangTm1814NoIntrMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedTm1829, NeoEspInverted, false> NeoEsp32BitBangTm1829NoIntrMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeed800Kbps, NeoEspNotInverted, false> NeoEsp32BitBang800KbpsNoIntrMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeed400Kbps, NeoEspNotInverted, false> NeoEsp32BitBang400KbpsNoIntrMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedApa106, NeoEspNotInverted, false> NeoEsp32BitBangApa106NoIntrMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedIntertek, NeoEspNotInverted, false> NeoEsp32BitBangIntertekNoIntrMethod;
|
||||
|
||||
typedef NeoEsp32BitBangWs2812xMethod NeoEsp32BitBangWs2813NoIntrMethod;
|
||||
typedef NeoEsp32BitBang800KbpsMethod NeoEsp32BitBangWs2812NoIntrMethod;
|
||||
typedef NeoEsp32BitBangWs2812xMethod NeoEsp32BitBangWs2816NoIntrMethod;
|
||||
typedef NeoEsp32BitBangTm1814Method NeoEsp32BitBangTm1914NoIntrMethod;
|
||||
typedef NeoEsp32BitBangSk6812Method NeoEsp32BitBangLc8812NoIntrMethod;
|
||||
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedWs2811, NeoEspInverted, false> NeoEsp32BitBangWs2811InvertedNoIntrMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedWs2812x, NeoEspInverted, false> NeoEsp32BitBangWs2812xInvertedNoIntrMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedSk6812, NeoEspInverted, false> NeoEsp32BitBangSk6812InvertedNoIntrMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedTm1814, NeoEspNotInverted, false> NeoEsp32BitBangTm1814InvertedNoIntrMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedTm1829, NeoEspNotInverted, false> NeoEsp32BitBangTm1829InvertedNoIntrMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeed800Kbps, NeoEspInverted, false> NeoEsp32BitBang800KbpsInvertedNoIntrMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeed400Kbps, NeoEspInverted, false> NeoEsp32BitBang400KbpsInvertedNoIntrMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedApa106, NeoEspInverted, false> NeoEsp32BitBangApa106InvertedNoIntrMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedIntertek, NeoEspInverted, false> NeoEsp32BitBangIntertekInvertedNoIntrMethod;
|
||||
|
||||
typedef NeoEsp32BitBangWs2812xInvertedMethod NeoEsp32BitBangWs2813InvertedNoIntrMethod;
|
||||
typedef NeoEsp32BitBang800KbpsInvertedMethod NeoEsp32BitBangWs2812InvertedNoIntrMethod;
|
||||
typedef NeoEsp32BitBangWs2812xInvertedMethod NeoEsp32BitBangWs2816InvertedNoIntrMethod;
|
||||
typedef NeoEsp32BitBangTm1814InvertedMethod NeoEsp32BitBangTm1914InvertedNoIntrMethod;
|
||||
typedef NeoEsp32BitBangSk6812InvertedMethod NeoEsp32BitBangLc8812InvertedNoIntrMethod;
|
||||
|
||||
#else // defined(ARDUINO_ARCH_ESP8266)
|
||||
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeedWs2811, NeoEspNotInverted>> NeoEsp8266BitBangWs2811Method;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeedWs2812x, NeoEspNotInverted>> NeoEsp8266BitBangWs2812xMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeedSk6812, NeoEspNotInverted>> NeoEsp8266BitBangSk6812Method;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeedTm1814, NeoEspInverted>> NeoEsp8266BitBangTm1814Method;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeedTm1829, NeoEspInverted>> NeoEsp8266BitBangTm1829Method;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeed800Kbps, NeoEspNotInverted>> NeoEsp8266BitBang800KbpsMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeed400Kbps, NeoEspNotInverted>> NeoEsp8266BitBang400KbpsMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeedApa106, NeoEspNotInverted>> NeoEsp8266BitBangApa106Method;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeedIntertek, NeoEspNotInverted>> NeoEsp8266BitBangIntertekMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedWs2811, NeoEspNotInverted, true> NeoEsp8266BitBangWs2811Method;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedWs2812x, NeoEspNotInverted, true> NeoEsp8266BitBangWs2812xMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedSk6812, NeoEspNotInverted, true> NeoEsp8266BitBangSk6812Method;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedTm1814, NeoEspInverted, true> NeoEsp8266BitBangTm1814Method;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedTm1829, NeoEspInverted, true> NeoEsp8266BitBangTm1829Method;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeed800Kbps, NeoEspNotInverted, true> NeoEsp8266BitBang800KbpsMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeed400Kbps, NeoEspNotInverted, true> NeoEsp8266BitBang400KbpsMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedApa106, NeoEspNotInverted, true> NeoEsp8266BitBangApa106Method;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedIntertek, NeoEspNotInverted, true> NeoEsp8266BitBangIntertekMethod;
|
||||
|
||||
typedef NeoEsp8266BitBangWs2812xMethod NeoEsp8266BitBangWs2813Method;
|
||||
typedef NeoEsp8266BitBang800KbpsMethod NeoEsp8266BitBangWs2812Method;
|
||||
@@ -341,15 +359,15 @@ typedef NeoEsp8266BitBangWs2812xMethod NeoEsp8266BitBangWs2816Method;
|
||||
typedef NeoEsp8266BitBangTm1814Method NeoEsp8266BitBangTm1914Method;
|
||||
typedef NeoEsp8266BitBangSk6812Method NeoEsp8266BitBangLc8812Method;
|
||||
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeedWs2811, NeoEspInverted>> NeoEsp8266BitBangWs2811InvertedMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeedWs2812x, NeoEspInverted>> NeoEsp8266BitBangWs2812xInvertedMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeedSk6812, NeoEspInverted>> NeoEsp8266BitBangSk6812InvertedMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeedTm1814, NeoEspNotInverted>> NeoEsp8266BitBangTm1814InvertedMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeedTm1829, NeoEspNotInverted>> NeoEsp8266BitBangTm1829InvertedMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeed800Kbps, NeoEspInverted>> NeoEsp8266BitBang800KbpsInvertedMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeed400Kbps, NeoEspInverted>> NeoEsp8266BitBang400KbpsInvertedMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeedApa106, NeoEspInverted>> NeoEsp8266BitBangApa106InvertedMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangEncode<NeoEspBitBangSpeedIntertek, NeoEspInverted>> NeoEsp8266BitBangIntertekInvertedMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedWs2811, NeoEspInverted, true> NeoEsp8266BitBangWs2811InvertedMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedWs2812x, NeoEspInverted, true> NeoEsp8266BitBangWs2812xInvertedMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedSk6812, NeoEspInverted, true> NeoEsp8266BitBangSk6812InvertedMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedTm1814, NeoEspNotInverted, true> NeoEsp8266BitBangTm1814InvertedMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedTm1829, NeoEspNotInverted, true> NeoEsp8266BitBangTm1829InvertedMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeed800Kbps, NeoEspInverted, true> NeoEsp8266BitBang800KbpsInvertedMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeed400Kbps, NeoEspInverted, true> NeoEsp8266BitBang400KbpsInvertedMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedApa106, NeoEspInverted, true> NeoEsp8266BitBangApa106InvertedMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedIntertek, NeoEspInverted, true> NeoEsp8266BitBangIntertekInvertedMethod;
|
||||
|
||||
typedef NeoEsp8266BitBangWs2812xInvertedMethod NeoEsp8266BitBangWs2813InvertedMethod;
|
||||
typedef NeoEsp8266BitBang800KbpsInvertedMethod NeoEsp8266BitBangWs2812InvertedMethod;
|
||||
@@ -357,6 +375,38 @@ typedef NeoEsp8266BitBangWs2812xInvertedMethod NeoEsp8266BitBangWs2816InvertedMe
|
||||
typedef NeoEsp8266BitBangTm1814InvertedMethod NeoEsp8266BitBangTm1914InvertedMethod;
|
||||
typedef NeoEsp8266BitBangSk6812InvertedMethod NeoEsp8266BitBangLc8812InvertedMethod;
|
||||
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedWs2811, NeoEspNotInverted, false> NeoEsp8266BitBangWs2811NoIntrMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedWs2812x, NeoEspNotInverted, false> NeoEsp8266BitBangWs2812xNoIntrMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedSk6812, NeoEspNotInverted, false> NeoEsp8266BitBangSk6812NoIntrMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedTm1814, NeoEspInverted, false> NeoEsp8266BitBangTm1814NoIntrMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedTm1829, NeoEspInverted, false> NeoEsp8266BitBangTm1829NoIntrMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeed800Kbps, NeoEspNotInverted, false> NeoEsp8266BitBang800KbpsNoIntrMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeed400Kbps, NeoEspNotInverted, false> NeoEsp8266BitBang400KbpsNoIntrMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedApa106, NeoEspNotInverted, false> NeoEsp8266BitBangApa106NoIntrMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedIntertek, NeoEspNotInverted, false> NeoEsp8266BitBangIntertekNoIntrMethod;
|
||||
|
||||
typedef NeoEsp8266BitBangWs2812xMethod NeoEsp8266BitBangWs2813NoIntrMethod;
|
||||
typedef NeoEsp8266BitBang800KbpsMethod NeoEsp8266BitBangWs2812NoIntrMethod;
|
||||
typedef NeoEsp8266BitBangWs2812xMethod NeoEsp8266BitBangWs2816NoIntrMethod;
|
||||
typedef NeoEsp8266BitBangTm1814Method NeoEsp8266BitBangTm1914NoIntrMethod;
|
||||
typedef NeoEsp8266BitBangSk6812Method NeoEsp8266BitBangLc8812NoIntrMethod;
|
||||
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedWs2811, NeoEspInverted, false> NeoEsp8266BitBangWs2811InvertedNoIntrMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedWs2812x, NeoEspInverted, false> NeoEsp8266BitBangWs2812xInvertedNoIntrMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedSk6812, NeoEspInverted, false> NeoEsp8266BitBangSk6812InvertedNoIntrMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedTm1814, NeoEspNotInverted, false> NeoEsp8266BitBangTm1814InvertedNoIntrMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedTm1829, NeoEspNotInverted, false> NeoEsp8266BitBangTm1829InvertedNoIntrMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeed800Kbps, NeoEspInverted, false> NeoEsp8266BitBang800KbpsInvertedNoIntrMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeed400Kbps, NeoEspInverted, false> NeoEsp8266BitBang400KbpsInvertedNoIntrMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedApa106, NeoEspInverted, false> NeoEsp8266BitBangApa106InvertedNoIntrMethod;
|
||||
typedef NeoEspBitBangMethodBase<NeoEspBitBangSpeedIntertek, NeoEspInverted, false> 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
|
||||
|
Reference in New Issue
Block a user