Decode a WS2812 edge-pair stream into bytes.
19 {
20 const size_t edge_count = edges.
size();
21 if (edge_count == 0) {
23 }
24
25 size_t bytes_written = 0;
26 size_t bit_index = 0;
28 u32 error_count = 0;
29
30 size_t i = 0;
31 while (i + 1 < edge_count) {
33 const EdgeTime low_edge = edges[i + 1];
34
35 if (!high_edge.
high || low_edge.
high) {
36 error_count++;
37 i++;
38 continue;
39 }
40
41 const u32 high_ns = high_edge.
ns;
42 const u32 low_ns = low_edge.
ns;
43
48
49 if (!is_bit0 && !is_bit1) {
50 if (low_ns >=
static_cast<u32
>(timing.
reset_min_us) * 1000u) {
51 break;
52 }
55 is_bit1 = true;
57 is_bit0 = true;
58 }
59 }
60 if (!is_bit0 && !is_bit1) {
61 error_count++;
62 i += 2;
63 continue;
64 }
65 }
66
67 const u8 bit = is_bit1 ?
u8{1} :
u8{0};
68 current_byte =
static_cast<u8>((current_byte << 1) | bit);
69 bit_index++;
70
71 if (bit_index == 8) {
72 if (bytes_written >= out.
size()) {
74 }
75 out[bytes_written++] = current_byte;
76 current_byte = 0;
77 bit_index = 0;
78 }
79
80 i += 2;
81 }
82
83 if (bytes_written > 0 && error_count * 10 > bytes_written * 8) {
85 }
86
88}
static expected failure(E err, const char *msg=nullptr) FL_NOEXCEPT
Create error result.
static expected success(T value) FL_NOEXCEPT
Create successful result.
constexpr fl::size size() const FL_NOEXCEPT
@ HIGH_ERROR_RATE
Symbol decode error rate too high (>10%)
@ BUFFER_OVERFLOW
Output buffer overflow.
@ INVALID_ARGUMENT
Invalid input arguments.
u32 t1h_min_ns
Bit 1 high time minimum (e.g., 650ns)
u32 reset_min_us
Reset pulse minimum duration (e.g., 50us)
u32 gap_tolerance_ns
Maximum gap duration to tolerate (0 = no gap tolerance, treat as error)
u32 t0l_min_ns
Bit 0 low time minimum (e.g., 700ns)
u32 t1l_min_ns
Bit 1 low time minimum (e.g., 300ns)
u32 t1h_max_ns
Bit 1 high time maximum (e.g., 950ns)
u32 t0h_min_ns
Bit 0 high time minimum (e.g., 250ns)
u32 t0h_max_ns
Bit 0 high time maximum (e.g., 550ns)
u32 t1l_max_ns
Bit 1 low time maximum (e.g., 600ns)
u32 t0l_max_ns
Bit 0 low time maximum (e.g., 1000ns)
u32 ns
Duration in nanoseconds (31 bits, max ~2.1s)
u32 high
High/low level (1 bit: 1=high, 0=low)
Universal edge timing representation (platform-agnostic)