33 #ifdef ARDUINO_ARCH_ESP8266
36 class NeoEsp8266DmaSpeedBase
39 static const uint8_t IdleLevel = 0;
40 static uint16_t Convert(uint8_t value)
42 const uint16_t bitpatterns[16] =
44 0b1000100010001000, 0b1000100010001110, 0b1000100011101000, 0b1000100011101110,
45 0b1000111010001000, 0b1000111010001110, 0b1000111011101000, 0b1000111011101110,
46 0b1110100010001000, 0b1110100010001110, 0b1110100011101000, 0b1110100011101110,
47 0b1110111010001000, 0b1110111010001110, 0b1110111011101000, 0b1110111011101110,
50 return bitpatterns[value];
54 class NeoEsp8266DmaInvertedSpeedBase
57 static const uint8_t IdleLevel = 1;
58 static uint16_t Convert(uint8_t value)
60 const uint16_t bitpatterns[16] =
62 0b0111011101110111, 0b0111011101110001, 0b0111011100010111, 0b0111011100010001,
63 0b0111000101110111, 0b0111000101110001, 0b0111000100010111, 0b0111000100010001,
64 0b0001011101110111, 0b0001011101110001, 0b0001011100010111, 0b0001011100010001,
65 0b0001000101110111, 0b0001000101110001, 0b0001000100010111, 0b0001000100010001,
68 return bitpatterns[value];
72 class NeoEsp8266DmaSpeed800KbpsBase :
public NeoEsp8266DmaSpeedBase
75 const static uint32_t I2sClockDivisor = 5;
76 const static uint32_t I2sBaseClockDivisor = 10;
77 const static uint32_t ByteSendTimeUs = 10;
80 class NeoEsp8266DmaSpeedWs2812x :
public NeoEsp8266DmaSpeed800KbpsBase
83 const static uint32_t ResetTimeUs = 300;
86 class NeoEsp8266DmaSpeedSk6812 :
public NeoEsp8266DmaSpeed800KbpsBase
89 const static uint32_t ResetTimeUs = 80;
92 class NeoEsp8266DmaInvertedSpeedTm1814 :
public NeoEsp8266DmaSpeed800KbpsBase
95 const static uint32_t ResetTimeUs = 200;
98 class NeoEsp8266DmaInvertedSpeedTm1829 :
public NeoEsp8266DmaSpeed800KbpsBase
101 const static uint32_t ResetTimeUs = 200;
104 class NeoEsp8266DmaSpeed800Kbps :
public NeoEsp8266DmaSpeed800KbpsBase
107 const static uint32_t ResetTimeUs = 50;
110 class NeoEsp8266DmaSpeed400Kbps :
public NeoEsp8266DmaSpeedBase
113 const static uint32_t I2sClockDivisor = 10;
114 const static uint32_t I2sBaseClockDivisor = 10;
115 const static uint32_t ByteSendTimeUs = 20;
116 const static uint32_t ResetTimeUs = 50;
119 class NeoEsp8266DmaSpeedApa106 :
public NeoEsp8266DmaSpeedBase
122 const static uint32_t I2sClockDivisor = 4;
123 const static uint32_t I2sBaseClockDivisor = 17;
124 const static uint32_t ByteSendTimeUs = 14;
125 const static uint32_t ResetTimeUs = 50;
128 class NeoEsp8266DmaSpeedIntertek :
public NeoEsp8266DmaSpeedBase
131 const static uint32_t I2sClockDivisor = 5;
132 const static uint32_t I2sBaseClockDivisor = 10;
133 const static uint32_t ByteSendTimeUs = 10;
134 const static uint32_t ResetTimeUs = 12470;
135 const static uint32_t InterPixelTimeUs = 20;
138 class NeoEsp8266DmaInvertedSpeed800KbpsBase :
public NeoEsp8266DmaInvertedSpeedBase
141 const static uint32_t I2sClockDivisor = 5;
142 const static uint32_t I2sBaseClockDivisor = 10;
143 const static uint32_t ByteSendTimeUs = 10;
146 class NeoEsp8266DmaInvertedSpeedWs2812x :
public NeoEsp8266DmaInvertedSpeed800KbpsBase
149 const static uint32_t ResetTimeUs = 300;
152 class NeoEsp8266DmaInvertedSpeedSk6812 :
public NeoEsp8266DmaInvertedSpeed800KbpsBase
155 const static uint32_t ResetTimeUs = 80;
158 class NeoEsp8266DmaSpeedTm1814 :
public NeoEsp8266DmaInvertedSpeed800KbpsBase
161 const static uint32_t ResetTimeUs = 200;
164 class NeoEsp8266DmaSpeedTm1829 :
public NeoEsp8266DmaInvertedSpeed800KbpsBase
167 const static uint32_t ResetTimeUs = 200;
170 class NeoEsp8266DmaInvertedSpeed800Kbps :
public NeoEsp8266DmaInvertedSpeed800KbpsBase
173 const static uint32_t ResetTimeUs = 50;
176 class NeoEsp8266DmaInvertedSpeed400Kbps :
public NeoEsp8266DmaInvertedSpeedBase
179 const static uint32_t I2sClockDivisor = 10;
180 const static uint32_t I2sBaseClockDivisor = 10;
181 const static uint32_t ByteSendTimeUs = 20;
182 const static uint32_t ResetTimeUs = 50;
185 class NeoEsp8266DmaInvertedSpeedApa106 :
public NeoEsp8266DmaInvertedSpeedBase
188 const static uint32_t I2sClockDivisor = 4;
189 const static uint32_t I2sBaseClockDivisor = 17;
190 const static uint32_t ByteSendTimeUs = 14;
191 const static uint32_t ResetTimeUs = 50;
194 class NeoEsp8266DmaInvertedSpeedIntertek :
public NeoEsp8266DmaInvertedSpeedBase
197 const static uint32_t I2sClockDivisor = 5;
198 const static uint32_t I2sBaseClockDivisor = 10;
199 const static uint32_t ByteSendTimeUs = 10;
200 const static uint32_t ResetTimeUs = 12470;
201 const static uint32_t InterPixelTimeUs = 20;
204 template<
typename T_SPEED>
class NeoEsp8266DmaEncode :
public T_SPEED
207 static size_t SpacingPixelSize(
size_t sizePixel)
212 static void FillBuffers(uint8_t* i2sBuffer,
215 [[maybe_unused]]
size_t sizePixel)
217 uint16_t* pDma = (uint16_t*)i2sBuffer;
218 const uint8_t* pEnd = data + sizeData;
219 for (
const uint8_t* pData = data; pData < pEnd; pData++)
221 *(pDma++) = T_SPEED::Convert(((*pData) & 0x0f));
222 *(pDma++) = T_SPEED::Convert(((*pData) >> 4) & 0x0f);
227 template<
typename T_SPEED>
class NeoEsp8266DmaPixelSpacingEncode :
public T_SPEED
230 static size_t SpacingPixelSize(
size_t sizePixel)
232 return sizePixel + T_SPEED::InterPixelTimeUs / T_SPEED::ByteSendTimeUs;
235 static void FillBuffers(uint8_t* i2sBuffer,
240 uint16_t* pDma = (uint16_t*)i2sBuffer;
241 const uint8_t* pEnd = data + sizeData;
243 for (
const uint8_t* pData = data; pData < pEnd; pData++)
245 *(pDma++) = T_SPEED::Convert(((*pData) & 0x0f));
246 *(pDma++) = T_SPEED::Convert(((*pData) >> 4) & 0x0f);
249 if (element == sizePixel)
253 for (uint8_t padding = 0;
254 padding < (T_SPEED::InterPixelTimeUs / T_SPEED::ByteSendTimeUs);
257 *(pDma++) = T_SPEED::IdleLevel * 0xffff;
258 *(pDma++) = T_SPEED::IdleLevel * 0xffff;
265 template<
typename T_ENCODER>
class NeoEsp8266DmaMethodBase : NeoEsp8266I2sMethodCore
270 NeoEsp8266DmaMethodBase(uint16_t pixelCount,
size_t elementSize,
size_t settingsSize) :
271 _sizePixel(elementSize),
272 _sizeData(pixelCount * elementSize + settingsSize)
274 size_t dmaPixelSize = DmaBytesPerPixelBytes * T_ENCODER::SpacingPixelSize(_sizePixel);
275 size_t dmaSettingsSize = DmaBytesPerPixelBytes * settingsSize;
277 size_t i2sBufferSize = pixelCount * dmaPixelSize + dmaSettingsSize;
282 size_t i2sResetSize = T_ENCODER::ResetTimeUs * DmaBytesPerPixelBytes / T_ENCODER::ByteSendTimeUs;
285 size_t is2BufMaxBlockSize = (c_maxDmaBlockSize / dmaPixelSize) * dmaPixelSize;
287 _data =
static_cast<uint8_t*
>(malloc(_sizeData));
290 AllocateI2s(i2sBufferSize, i2sResetSize, is2BufMaxBlockSize, T_ENCODER::IdleLevel);
293 NeoEsp8266DmaMethodBase([[maybe_unused]] uint8_t pin, uint16_t pixelCount,
size_t elementSize,
size_t settingsSize) :
294 NeoEsp8266DmaMethodBase(pixelCount, elementSize, settingsSize)
298 ~NeoEsp8266DmaMethodBase()
301 while (!IsReadyToUpdate())
309 uint32_t time = micros();
310 while ((micros() - time) < ((getPixelTime() + T_ENCODER::ResetTimeUs) * waits))
320 bool IsReadyToUpdate()
const
327 InitializeI2s(T_ENCODER::I2sClockDivisor, T_ENCODER::I2sBaseClockDivisor);
330 void IRAM_ATTR Update(
bool)
333 while (!IsReadyToUpdate())
337 T_ENCODER::FillBuffers(_i2sBuffer, _data, _sizeData, _sizePixel);
348 uint8_t* getData()
const
353 size_t getDataSize()
const
358 void applySettings([[maybe_unused]]
const SettingsObject& settings)
364 static const uint16_t DmaBytesPerPixelBytes = 4;
366 const size_t _sizePixel;
367 const size_t _sizeData;
370 uint32_t getPixelTime()
const
372 return (T_ENCODER::ByteSendTimeUs * GetSendSize() / DmaBytesPerPixelBytes);
380 typedef NeoEsp8266DmaMethodBase<NeoEsp8266DmaEncode<NeoEsp8266DmaSpeedWs2812x>> NeoEsp8266DmaWs2812xMethod;
381 typedef NeoEsp8266DmaMethodBase<NeoEsp8266DmaEncode<NeoEsp8266DmaSpeedSk6812>> NeoEsp8266DmaSk6812Method;
382 typedef NeoEsp8266DmaMethodBase<NeoEsp8266DmaEncode<NeoEsp8266DmaSpeedTm1814>> NeoEsp8266DmaTm1814Method;
383 typedef NeoEsp8266DmaMethodBase<NeoEsp8266DmaEncode<NeoEsp8266DmaSpeedTm1829>> NeoEsp8266DmaTm1829Method;
384 typedef NeoEsp8266DmaTm1814Method NeoEsp8266DmaTm1914Method;
385 typedef NeoEsp8266DmaMethodBase<NeoEsp8266DmaEncode<NeoEsp8266DmaSpeed800Kbps>> NeoEsp8266Dma800KbpsMethod;
386 typedef NeoEsp8266DmaMethodBase<NeoEsp8266DmaEncode<NeoEsp8266DmaSpeed400Kbps>> NeoEsp8266Dma400KbpsMethod;
387 typedef NeoEsp8266DmaMethodBase<NeoEsp8266DmaEncode<NeoEsp8266DmaSpeedApa106>> NeoEsp8266DmaApa106Method;
388 typedef NeoEsp8266DmaMethodBase<NeoEsp8266DmaPixelSpacingEncode<NeoEsp8266DmaSpeedIntertek>> NeoEsp8266DmaIntertekMethod;
392 typedef NeoEsp8266DmaMethodBase<NeoEsp8266DmaEncode<NeoEsp8266DmaInvertedSpeedWs2812x>> NeoEsp8266DmaInvertedWs2812xMethod;
393 typedef NeoEsp8266DmaMethodBase<NeoEsp8266DmaEncode<NeoEsp8266DmaInvertedSpeedSk6812>> NeoEsp8266DmaInvertedSk6812Method;
394 typedef NeoEsp8266DmaMethodBase<NeoEsp8266DmaEncode<NeoEsp8266DmaInvertedSpeedTm1814>> NeoEsp8266DmaInvertedTm1814Method;
395 typedef NeoEsp8266DmaMethodBase<NeoEsp8266DmaEncode<NeoEsp8266DmaInvertedSpeedTm1829>> NeoEsp8266DmaInvertedTm1829Method;
396 typedef NeoEsp8266DmaInvertedTm1814Method NeoEsp8266DmaInvertedTm1914Method;
397 typedef NeoEsp8266DmaMethodBase<NeoEsp8266DmaEncode<NeoEsp8266DmaInvertedSpeed800Kbps>> NeoEsp8266DmaInverted800KbpsMethod;
398 typedef NeoEsp8266DmaMethodBase<NeoEsp8266DmaEncode<NeoEsp8266DmaInvertedSpeed400Kbps>> NeoEsp8266DmaInverted400KbpsMethod;
399 typedef NeoEsp8266DmaMethodBase<NeoEsp8266DmaEncode<NeoEsp8266DmaInvertedSpeedApa106>> NeoEsp8266DmaInvertedApa106Method;
400 typedef NeoEsp8266DmaMethodBase<NeoEsp8266DmaPixelSpacingEncode<NeoEsp8266DmaInvertedSpeedIntertek>> NeoEsp8266DmaInvertedIntertekMethod;
403 typedef NeoEsp8266DmaWs2812xMethod NeoWs2813Method;
404 typedef NeoEsp8266DmaWs2812xMethod NeoWs2812xMethod;
405 typedef NeoEsp8266Dma800KbpsMethod NeoWs2812Method;
406 typedef NeoEsp8266DmaWs2812xMethod NeoWs2811Method;
407 typedef NeoEsp8266DmaWs2812xMethod NeoWs2816Method;
408 typedef NeoEsp8266DmaSk6812Method NeoSk6812Method;
409 typedef NeoEsp8266DmaTm1814Method NeoTm1814Method;
410 typedef NeoEsp8266DmaTm1829Method NeoTm1829Method;
411 typedef NeoEsp8266DmaTm1914Method NeoTm1914Method;
412 typedef NeoEsp8266DmaSk6812Method NeoLc8812Method;
413 typedef NeoEsp8266DmaApa106Method NeoApa106Method;
414 typedef NeoEsp8266DmaIntertekMethod NeoIntertekMethod;
416 typedef NeoEsp8266DmaWs2812xMethod Neo800KbpsMethod;
417 typedef NeoEsp8266Dma400KbpsMethod Neo400KbpsMethod;
420 typedef NeoEsp8266DmaInvertedWs2812xMethod NeoWs2813InvertedMethod;
421 typedef NeoEsp8266DmaInvertedWs2812xMethod NeoWs2812xInvertedMethod;
422 typedef NeoEsp8266DmaInverted800KbpsMethod NeoWs2812InvertedMethod;
423 typedef NeoEsp8266DmaInvertedWs2812xMethod NeoWs2811InvertedMethod;
424 typedef NeoEsp8266DmaInvertedWs2812xMethod NeoWs2816InvertedMethod;
425 typedef NeoEsp8266DmaInvertedSk6812Method NeoSk6812InvertedMethod;
426 typedef NeoEsp8266DmaInvertedTm1814Method NeoTm1814InvertedMethod;
427 typedef NeoEsp8266DmaInvertedTm1829Method NeoTm1829InvertedMethod;
428 typedef NeoEsp8266DmaInvertedTm1914Method NeoTm1914InvertedMethod;
429 typedef NeoEsp8266DmaInvertedSk6812Method NeoLc8812InvertedMethod;
430 typedef NeoEsp8266DmaInvertedApa106Method NeoApa106InvertedMethod;
431 typedef NeoEsp8266DmaInvertedIntertekMethod NeoInvertedIntertekMethod;
433 typedef NeoEsp8266DmaInvertedWs2812xMethod Neo800KbpsInvertedMethod;
434 typedef NeoEsp8266DmaInverted400KbpsMethod Neo400KbpsInvertedMethod;
Definition: NeoSettings.h:29
static size_t RoundUp(size_t numToRound, size_t multiple)
Definition: NeoUtil.h:62