30 #if defined(ARDUINO_ARCH_AVR) || defined(ARDUINO_ARCH_MEGAAVR)
34 void send_data_8mhz_800_PortD(uint8_t* data,
size_t sizeData, uint8_t pinMask);
35 void send_data_8mhz_800_PortB(uint8_t* data,
size_t sizeData, uint8_t pinMask);
36 void send_data_8mhz_400(uint8_t* data,
size_t sizeData,
volatile uint8_t* port, uint8_t pinMask);
37 void send_data_12mhz_800_PortD(uint8_t* data,
size_t sizeData, uint8_t pinMask);
38 void send_data_12mhz_800_PortB(uint8_t* data,
size_t sizeData, uint8_t pinMask);
39 void send_data_12mhz_400(uint8_t* data,
size_t sizeData,
volatile uint8_t* port, uint8_t pinMask);
40 void send_data_16mhz_800(uint8_t* data,
size_t sizeData,
volatile uint8_t* port, uint8_t pinMask);
41 void send_data_16mhz_400(uint8_t* data,
size_t sizeData,
volatile uint8_t* port, uint8_t pinMask);
42 void send_data_16mhz_600(uint8_t* data,
size_t sizeData,
volatile uint8_t* port, uint8_t pinMask);
43 void send_data_32mhz(uint8_t* data,
size_t sizeData,
volatile uint8_t* port, uint8_t pinMask,
const uint8_t cycleTiming);
46 class NeoAvrSpeed800KbpsBase
49 static void send_data(uint8_t* data,
size_t sizeData,
volatile uint8_t* port, uint8_t pinMask)
51 #if (F_CPU >= 7400000UL) && (F_CPU <= 9500000UL)
54 send_data_8mhz_800_PortD(data, sizeData, pinMask);
55 else if (port == &PORTB)
57 send_data_8mhz_800_PortB(data, sizeData, pinMask);
59 #elif (F_CPU >= 11100000UL) && (F_CPU <= 14300000UL)
62 send_data_12mhz_800_PortD(data, sizeData, pinMask);
63 else if (port == &PORTB)
65 send_data_12mhz_800_PortB(data, sizeData, pinMask);
67 #elif (F_CPU >= 15400000UL) && (F_CPU <= 19000000UL)
68 send_data_16mhz_800(data, sizeData, port, pinMask);
69 #elif (F_CPU >= 31000000UL) && (F_CPU <= 35000000UL)
70 send_data_32mhz(data, sizeData, port, pinMask, 3);
72 #error "CPU SPEED NOT SUPPORTED"
78 class NeoAvrSpeed600KbpsBase
81 static void send_data(uint8_t* data,
size_t sizeData,
volatile uint8_t* port, uint8_t pinMask)
83 #if (F_CPU >= 7400000UL) && (F_CPU <= 9500000UL)
86 send_data_8mhz_800_PortD(data, sizeData, pinMask);
87 else if (port == &PORTB)
89 send_data_8mhz_800_PortB(data, sizeData, pinMask);
91 #elif (F_CPU >= 11100000UL) && (F_CPU <= 14300000UL)
94 send_data_12mhz_800_PortD(data, sizeData, pinMask);
95 else if (port == &PORTB)
97 send_data_12mhz_800_PortB(data, sizeData, pinMask);
99 #elif (F_CPU >= 15400000UL) && (F_CPU <= 19000000UL)
100 send_data_16mhz_600(data, sizeData, port, pinMask);
101 #elif (F_CPU >= 31000000UL) && (F_CPU <= 35000000UL)
102 send_data_32mhz(data, sizeData, port, pinMask, 3);
104 #error "CPU SPEED NOT SUPPORTED"
110 class NeoAvrSpeedWs2812x :
public NeoAvrSpeed800KbpsBase
113 static const uint32_t ResetTimeUs = 300;
116 class NeoAvrSpeedSk6812 :
public NeoAvrSpeed800KbpsBase
119 static const uint32_t ResetTimeUs = 80;
122 class NeoAvrSpeedApa106 :
public NeoAvrSpeed600KbpsBase
125 static const uint32_t ResetTimeUs = 100;
128 class NeoAvrSpeed600KbpsIps :
public NeoAvrSpeed600KbpsBase
131 static const uint32_t ResetTimeUs = 300;
132 static const uint16_t InterpixelTimeUs = 8;
135 class NeoAvrSpeedTm1814 :
public NeoAvrSpeed800KbpsBase
138 static const uint32_t ResetTimeUs = 200;
141 class NeoAvrSpeedTm1829 :
public NeoAvrSpeed800KbpsBase
144 static const uint32_t ResetTimeUs = 200;
147 class NeoAvrSpeed800Kbps:
public NeoAvrSpeed800KbpsBase
150 static const uint32_t ResetTimeUs = 50;
153 class NeoAvrSpeed400Kbps
156 static void send_data(uint8_t* data,
size_t sizeData,
volatile uint8_t* port, uint8_t pinMask)
158 #if (F_CPU >= 7400000UL) && (F_CPU <= 9500000UL)
159 send_data_8mhz_400(data, sizeData, port, pinMask);
161 #elif (F_CPU >= 11100000UL) && (F_CPU <= 14300000UL)
162 send_data_12mhz_400(data, sizeData, port, pinMask);
164 #elif (F_CPU >= 15400000UL) && (F_CPU <= 19000000UL)
165 send_data_16mhz_400(data, sizeData, port, pinMask);
166 #elif (F_CPU >= 31000000UL) && (F_CPU <= 35000000UL)
167 send_data_32mhz(data, sizeData, port, pinMask, 7);
169 #error "CPU SPEED NOT SUPPORTED"
172 static const uint32_t ResetTimeUs = 50;
175 template<
typename T_SPEED>
class NeoAvrMethodBase
180 NeoAvrMethodBase(uint8_t pin, uint16_t pixelCount,
size_t elementSize,
size_t settingsSize) :
181 _sizeData(pixelCount * elementSize + settingsSize),
186 pinMode(pin, OUTPUT);
188 _data =
static_cast<uint8_t*
>(malloc(_sizeData));
191 _port = portOutputRegister(digitalPinToPort(pin));
192 _pinMask = digitalPinToBitMask(pin);
197 pinMode(_pin, INPUT);
202 bool IsReadyToUpdate()
const
204 uint32_t delta = micros() - _endTime;
206 return (delta >= T_SPEED::ResetTimeUs);
211 digitalWrite(_pin, LOW);
224 while (!IsReadyToUpdate())
226 #if !defined(ARDUINO_TEEONARDU_LEO) && !defined(ARDUINO_TEEONARDU_FLORA)
233 T_SPEED::send_data(_data, _sizeData, _port, _pinMask);
247 uint8_t* getData()
const
252 size_t getDataSize()
const
257 void applySettings([[maybe_unused]]
const SettingsObject& settings)
262 const size_t _sizeData;
268 volatile uint8_t* _port;
272 template<
typename T_SPEED>
class NeoAvrIpsMethodBase :
public NeoAvrMethodBase<T_SPEED>
275 NeoAvrIpsMethodBase(uint8_t pin, uint16_t pixelCount,
size_t elementSize,
size_t settingsSize) :
276 NeoAvrMethodBase<T_SPEED>(pin, pixelCount, elementSize, settingsSize),
277 _elementSize(elementSize)
281 ~NeoAvrIpsMethodBase()
293 while (!NeoAvrMethodBase<T_SPEED>::IsReadyToUpdate())
295 #if !defined(ARDUINO_TEEONARDU_LEO) && !defined(ARDUINO_TEEONARDU_FLORA)
302 uint8_t* dataPixel = NeoAvrMethodBase<T_SPEED>::_data;
303 const uint8_t* dataEnd = dataPixel + NeoAvrMethodBase<T_SPEED>::_sizeData;
305 while (dataPixel < dataEnd)
307 T_SPEED::send_data(dataPixel,
309 NeoAvrMethodBase<T_SPEED>::_port,
310 NeoAvrMethodBase<T_SPEED>::_pinMask);
311 dataPixel += _elementSize;
312 delayMicroseconds(T_SPEED::InterpixelTimeUs);
318 NeoAvrMethodBase<T_SPEED>::_endTime = micros();
322 const size_t _elementSize;
325 typedef NeoAvrMethodBase<NeoAvrSpeedWs2812x> NeoAvrWs2812xMethod;
326 typedef NeoAvrMethodBase<NeoAvrSpeedSk6812> NeoAvrSk6812Method;
327 typedef NeoAvrMethodBase<NeoAvrSpeedApa106> NeoAvrApa106Method;
328 typedef NeoAvrIpsMethodBase<NeoAvrSpeed600KbpsIps> NeoAvr600KbpsIpsMethod;
330 typedef NeoAvrMethodBase<NeoAvrSpeedTm1814> NeoAvrTm1814InvertedMethod;
331 typedef NeoAvrMethodBase<NeoAvrSpeedTm1829> NeoAvrTm1829InvertedMethod;
332 typedef NeoAvrMethodBase<NeoAvrSpeed800Kbps> NeoAvr800KbpsMethod;
333 typedef NeoAvrMethodBase<NeoAvrSpeed400Kbps> NeoAvr400KbpsMethod;
334 typedef NeoAvrTm1814InvertedMethod NeoAvrTm1914InvertedMethod;
337 typedef NeoAvrWs2812xMethod NeoWs2813Method;
338 typedef NeoAvrWs2812xMethod NeoWs2812xMethod;
339 typedef NeoAvr800KbpsMethod NeoWs2812Method;
340 typedef NeoAvrWs2812xMethod NeoWs2811Method;
341 typedef NeoAvrWs2812xMethod NeoWs2816Method;
342 typedef NeoAvrSk6812Method NeoSk6812Method;
343 typedef NeoAvrSk6812Method NeoLc8812Method;
344 typedef NeoAvrApa106Method NeoApa106Method;
345 typedef NeoAvrWs2812xMethod Neo800KbpsMethod;
346 typedef NeoAvr400KbpsMethod Neo400KbpsMethod;
349 typedef NeoAvrTm1814InvertedMethod NeoTm1814InvertedMethod;
350 typedef NeoAvrTm1914InvertedMethod NeoTm1914InvertedMethod;
351 typedef NeoAvrTm1829InvertedMethod NeoTm1829InvertedMethod;
Definition: NeoSettings.h:29