FastLED 3.10.6
Loading...
Searching...
No Matches
uart_wave_encoder.h
Go to the documentation of this file.
1
39
40#pragma once
41
44#include "fl/stl/isr/memcpy.h"
45#include "fl/stl/cstddef.h"
46#include "fl/stl/stdint.h"
47#include "fl/stl/noexcept.h"
48
50
51namespace fl {
52
54constexpr u32 kMaxUartBaudRate = 5000000;
55
77struct Wave10Lut {
78 u8 lut[4];
80
83 return static_cast<u8>(2 * pulses_per_bit - 2);
84 }
85
88 u32 baudRate(const ChipsetTimingConfig& timing) const FL_NO_EXCEPT {
89 const u32 period_ns = timing.total_period_ns();
90 if (period_ns == 0 || pulses_per_bit == 0) return 0;
91 return static_cast<u32>(
92 static_cast<u64>(pulses_per_bit) * 1000000000ULL / period_ns);
93 }
94
99 const u32 period_ns = timing.total_period_ns();
100 if (period_ns == 0) return 0;
101 return static_cast<u32>(5000000000ULL / period_ns);
102 }
103};
104
119Wave10Lut buildWave10Lut(const ChipsetTimingConfig& timing) FL_NO_EXCEPT;
120
122Wave10Lut buildWave10LutForMaxBaud(const ChipsetTimingConfig& timing,
123 u32 max_baud_rate) FL_NO_EXCEPT;
124
138ChipsetTiming uartWireTiming(const ChipsetTimingConfig& timing,
139 u32 max_baud_rate) FL_NO_EXCEPT;
140
153bool canRepresentTiming(const ChipsetTimingConfig& timing) FL_NO_EXCEPT;
154
156bool canRepresentTimingForMaxBaud(const ChipsetTimingConfig& timing,
157 u32 max_baud_rate) FL_NO_EXCEPT;
158
159namespace detail {
160
167 return lut.lut[two_bits & 0x03];
168}
169
175void encodeUartByte(u8 led_byte, u8* output, const Wave10Lut& lut) FL_NO_EXCEPT {
176 output[0] = encodeUart2Bits((led_byte >> 6) & 0x03, lut); // Bits 7-6
177 output[1] = encodeUart2Bits((led_byte >> 4) & 0x03, lut); // Bits 5-4
178 output[2] = encodeUart2Bits((led_byte >> 2) & 0x03, lut); // Bits 3-2
179 output[3] = encodeUart2Bits((led_byte >> 0) & 0x03, lut); // Bits 1-0
180}
181
187 // Hardcoded WS2812 LUT for backward compatibility with existing tests
188 static constexpr u8 kWs2812Lut[4] = {0xEF, 0x8F, 0xEC, 0x8C};
189 return kWs2812Lut[two_bits & 0x03];
190}
191
196void encodeUartByte(u8 led_byte, u8* output) FL_NO_EXCEPT {
197 output[0] = encodeUart2Bits((led_byte >> 6) & 0x03); // Bits 7-6
198 output[1] = encodeUart2Bits((led_byte >> 4) & 0x03); // Bits 5-4
199 output[2] = encodeUart2Bits((led_byte >> 2) & 0x03); // Bits 3-2
200 output[3] = encodeUart2Bits((led_byte >> 0) & 0x03); // Bits 1-0
201}
202
203} // namespace detail
204
214size_t encodeLedsToUart(const u8* input,
215 size_t input_size,
216 u8* output,
217 size_t output_capacity,
218 const Wave10Lut& lut) FL_NO_EXCEPT;
219
222size_t encodeLedsToUart(const u8* input,
223 size_t input_size,
224 u8* output,
225 size_t output_capacity) FL_NO_EXCEPT;
226
231constexpr size_t calculateUartBufferSize(size_t input_size) FL_NO_EXCEPT {
232 return input_size * 4;
233}
234
239constexpr size_t calculateUartBufferSizeForLeds(size_t num_leds) FL_NO_EXCEPT {
240 return num_leds * 3 * 4; // 12 bytes per RGB LED
241}
242
243} // namespace fl
244
Runtime chipset timing configuration for clockless LED drivers.
#define FL_OPTIMIZATION_LEVEL_O3_BEGIN
#define FASTLED_FORCE_INLINE
#define FL_OPTIMIZATION_LEVEL_O3_END
#define FL_OPTIMIZE_FUNCTION
#define FL_IRAM
unsigned char u8
Definition stdint.h:131
ISR-safe memory operations (inline, header-only)
FASTLED_FORCE_INLINE FL_IRAM FL_OPTIMIZE_FUNCTION void encodeUartByte(u8 led_byte, u8 *output, const Wave10Lut &lut) FL_NO_EXCEPT
Encode 1 LED byte to 4 UART bytes using a Wave10 LUT.
FASTLED_FORCE_INLINE FL_IRAM FL_OPTIMIZE_FUNCTION u8 encodeUart2Bits(u8 two_bits, const Wave10Lut &lut) FL_NO_EXCEPT
Encode 2 LED bits to 1 UART byte using a Wave10 LUT.
bool canRepresentTiming(const ChipsetTimingConfig &timing) FL_NO_EXCEPT
Check if a chipset timing can be accurately represented by UART.
unsigned char u8
Definition stdint.h:131
FL_IRAM FL_OPTIMIZE_FUNCTION size_t encodeLedsToUart(const u8 *input, size_t input_size, u8 *output, size_t output_capacity, const Wave10Lut &lut) FL_NO_EXCEPT
Encode LED pixel data to UART bytes using a Wave10 LUT.
constexpr u32 kMaxUartBaudRate
Maximum UART baud rate supported by ESP32 variants.
Wave10Lut buildWave10LutForMaxBaud(const ChipsetTimingConfig &timing, u32 max_baud_rate) FL_NO_EXCEPT
Build a UART waveform LUT with a backend-specific baud ceiling.
Wave10Lut buildWave10Lut(const ChipsetTimingConfig &timing) FL_NO_EXCEPT
Build a Wave10 LUT from chipset timing parameters.
FASTLED_FORCE_INLINE constexpr size_t calculateUartBufferSizeForLeds(size_t num_leds) FL_NO_EXCEPT
Calculate required output buffer size for RGB LED encoding.
InputGamut g FL_NO_EXCEPT
Definition rgbw.h:121
ChipsetTiming uartWireTiming(const ChipsetTimingConfig &timing, u32 max_baud_rate) FL_NO_EXCEPT
The wire timing the UART encoder actually produces for a chipset.
FASTLED_FORCE_INLINE constexpr size_t calculateUartBufferSize(size_t input_size) FL_NO_EXCEPT
Calculate required output buffer size for LED encoding.
bool canRepresentTimingForMaxBaud(const ChipsetTimingConfig &timing, u32 max_baud_rate) FL_NO_EXCEPT
Timing feasibility with a backend-specific baud ceiling.
Base definition for an LED controller.
Definition crgb.hpp:179
#define FL_NO_EXCEPT
fl::u64 u64
Definition stdint.h:220
Runtime bit-period timing for a clockless chipset.
u32 baudRate(const ChipsetTimingConfig &timing) const FL_NO_EXCEPT
Baud rate this LUT's geometry requires for the timing (baud = P / bit_period; one UART bit per pulse)...
static u32 computeBaudRate(const ChipsetTimingConfig &timing) FL_NO_EXCEPT
Legacy fixed-wave10 baud computation (P = 5)
u8 lut[4]
2-bit input -> UART data byte
u8 dataBits() const FL_NO_EXCEPT
UART word length for this geometry (2P - 2 data bits)
u8 pulses_per_bit
Frame geometry: 5 (wave10) or 4 (wave8-frame); 0 = infeasible.
Wave lookup table for UART LED encoding (waveN family)