FastLED 3.10.6
Loading...
Searching...
No Matches
wave3.cpp.hpp
Go to the documentation of this file.
1
8
9// IWYU pragma: private
10
14#include "fl/stl/isr/memcpy.h"
15
17
18namespace fl {
19
20namespace detail {
21
24 const Wave3BitExpansionLut& lut,
25 Wave3Byte* output) FL_NO_EXCEPT {
26 u16 high_pattern = lut.lut[(byte_value >> 4) & 0xF];
27 u16 low_pattern = lut.lut[byte_value & 0xF];
28
29 output->data[0] = (u8)(high_pattern >> 4);
30 output->data[1] = (u8)(((high_pattern & 0xF) << 4) | ((low_pattern >> 8) & 0xF));
31 output->data[2] = (u8)(low_pattern & 0xFF);
32}
33
35void wave3_transpose_2(const Wave3Byte lane_waves[2],
36 u8 output[2 * sizeof(Wave3Byte)]) FL_NO_EXCEPT {
37 for (int symbol_idx = 0; symbol_idx < 3; symbol_idx++) {
38 u8 l0 = lane_waves[0].data[symbol_idx];
39 u8 l1 = lane_waves[1].data[symbol_idx];
40
41 u16 interleaved = 0;
42 for (int bit = 0; bit < 8; bit++) {
43 u16 b0 = (l0 >> bit) & 1;
44 u16 b1 = (l1 >> bit) & 1;
45 interleaved |= (b1 << (bit * 2));
46 interleaved |= (b0 << (bit * 2 + 1));
47 }
48
49 output[symbol_idx * 2] = (u8)(interleaved >> 8);
50 output[symbol_idx * 2 + 1] = (u8)(interleaved & 0xFF);
51 }
52}
53
55void wave3_transpose_4(const Wave3Byte lane_waves[4],
56 u8 output[4 * sizeof(Wave3Byte)]) FL_NO_EXCEPT {
57 for (int symbol_idx = 0; symbol_idx < 3; symbol_idx++) {
58 u8 l0 = lane_waves[0].data[symbol_idx];
59 u8 l1 = lane_waves[1].data[symbol_idx];
60 u8 l2 = lane_waves[2].data[symbol_idx];
61 u8 l3 = lane_waves[3].data[symbol_idx];
62
63 output[symbol_idx * 4 + 0] =
64 ((l3 >> 7) & 1) << 7 |
65 ((l2 >> 7) & 1) << 6 |
66 ((l1 >> 7) & 1) << 5 |
67 ((l0 >> 7) & 1) << 4 |
68 ((l3 >> 6) & 1) << 3 |
69 ((l2 >> 6) & 1) << 2 |
70 ((l1 >> 6) & 1) << 1 |
71 ((l0 >> 6) & 1);
72
73 output[symbol_idx * 4 + 1] =
74 ((l3 >> 5) & 1) << 7 |
75 ((l2 >> 5) & 1) << 6 |
76 ((l1 >> 5) & 1) << 5 |
77 ((l0 >> 5) & 1) << 4 |
78 ((l3 >> 4) & 1) << 3 |
79 ((l2 >> 4) & 1) << 2 |
80 ((l1 >> 4) & 1) << 1 |
81 ((l0 >> 4) & 1);
82
83 output[symbol_idx * 4 + 2] =
84 ((l3 >> 3) & 1) << 7 |
85 ((l2 >> 3) & 1) << 6 |
86 ((l1 >> 3) & 1) << 5 |
87 ((l0 >> 3) & 1) << 4 |
88 ((l3 >> 2) & 1) << 3 |
89 ((l2 >> 2) & 1) << 2 |
90 ((l1 >> 2) & 1) << 1 |
91 ((l0 >> 2) & 1);
92
93 output[symbol_idx * 4 + 3] =
94 ((l3 >> 1) & 1) << 7 |
95 ((l2 >> 1) & 1) << 6 |
96 ((l1 >> 1) & 1) << 5 |
97 ((l0 >> 1) & 1) << 4 |
98 ((l3 >> 0) & 1) << 3 |
99 ((l2 >> 0) & 1) << 2 |
100 ((l1 >> 0) & 1) << 1 |
101 ((l0 >> 0) & 1);
102 }
103}
104
106void wave3_transpose_8(const Wave3Byte lane_waves[8],
107 u8 output[8 * sizeof(Wave3Byte)]) FL_NO_EXCEPT {
108 for (int symbol_idx = 0; symbol_idx < 3; symbol_idx++) {
109 u8 l[8];
110 for (int lane = 0; lane < 8; lane++) {
111 l[lane] = lane_waves[lane].data[symbol_idx];
112 }
113 spread_transpose8_symbol(l, output + symbol_idx * 8);
114 }
115}
116
118void wave3_transpose_16(const Wave3Byte lane_waves[16],
119 u8 output[16 * sizeof(Wave3Byte)]) FL_NO_EXCEPT {
120 for (int symbol_idx = 0; symbol_idx < 3; symbol_idx++) {
121 u8 l[16];
122 for (int lane = 0; lane < 16; lane++) {
123 l[lane] = lane_waves[lane].data[symbol_idx];
124 }
125 spread_transpose16_symbol(l, output + symbol_idx * 16);
126 }
127}
128
129} // namespace detail
130
132void wave3(u8 lane,
133 const Wave3BitExpansionLut& lut,
134 u8 (&FL_RESTRICT_PARAM output)[sizeof(Wave3Byte)]) FL_NO_EXCEPT {
135 Wave3Byte wave3_output;
136 detail::wave3_convert_byte_to_wave3byte(lane, lut, &wave3_output);
137 output[0] = wave3_output.data[0];
138 output[1] = wave3_output.data[1];
139 output[2] = wave3_output.data[2];
140}
141
142} // namespace fl
143
Shared u32 "spread LUT" bit-matrix transpose primitive (no SIMD, no u64).
#define FL_OPTIMIZATION_LEVEL_O3_BEGIN
#define FL_OPTIMIZATION_LEVEL_O3_END
#define FL_OPTIMIZE_FUNCTION
#define FL_IRAM
#define FL_RESTRICT_PARAM
Out-of-line declarations for wave3 transposition internals.
ISR-safe memory operations (inline, header-only)
FASTLED_FORCE_INLINE FL_IRAM FL_OPTIMIZE_FUNCTION void spread_transpose16_symbol(const u8 l[16], u8 out[16])
Transpose one symbol of 16 lanes (16 input bytes) into 16 output bytes: 8 pulses × 2 bytes,...
FL_IRAM FL_OPTIMIZE_FUNCTION void wave3_transpose_4(const Wave3Byte lane_waves[4], u8 output[4 *sizeof(Wave3Byte)]) FL_NO_EXCEPT
Transpose 4 lanes of Wave3Byte data.
Definition wave3.cpp.hpp:55
FASTLED_FORCE_INLINE FL_IRAM FL_OPTIMIZE_FUNCTION void spread_transpose8_symbol(const u8 l[8], u8 out[8])
Transpose one symbol of 8 lanes (8 input bytes) into 8 output bytes: 8 pulses × 1 byte (bit L = lane ...
FL_IRAM FL_OPTIMIZE_FUNCTION void wave3_convert_byte_to_wave3byte(u8 byte_value, const Wave3BitExpansionLut &lut, Wave3Byte *output) FL_NO_EXCEPT
Convert one byte to a Wave3Byte using the nibble LUT.
Definition wave3.cpp.hpp:23
FL_IRAM FL_OPTIMIZE_FUNCTION void wave3_transpose_2(const Wave3Byte lane_waves[2], u8 output[2 *sizeof(Wave3Byte)]) FL_NO_EXCEPT
Transpose 2 lanes of Wave3Byte data into interleaved format.
Definition wave3.cpp.hpp:35
FL_IRAM FL_OPTIMIZE_FUNCTION void wave3_transpose_8(const Wave3Byte lane_waves[8], u8 output[8 *sizeof(Wave3Byte)]) FL_NO_EXCEPT
Transpose 8 lanes of Wave3Byte data via the spread-LUT path (#2533).
FL_IRAM FL_OPTIMIZE_FUNCTION void wave3_transpose_16(const Wave3Byte lane_waves[16], u8 output[16 *sizeof(Wave3Byte)]) FL_NO_EXCEPT
Transpose 16 lanes of Wave3Byte data via the spread-LUT path (#2533).
Compile-time linker keep-alive hook for a single fl::Bus.
Definition bus_info.h:57
unsigned char u8
Definition stdint.h:131
FL_IRAM FL_OPTIMIZE_FUNCTION void wave3(u8 lane, const Wave3BitExpansionLut &lut, u8(&FL_RESTRICT_PARAM output)[sizeof(Wave3Byte)]) FL_NO_EXCEPT
Public single-lane wave3 encoder.
InputGamut g FL_NO_EXCEPT
Definition rgbw.h:121
Base definition for an LED controller.
Definition crgb.hpp:179
u8 data[3]
Definition wave3.h:21
Type-safe container for 3-byte wave pulse pattern (wave3 encoding)
Definition wave3.h:20