Build a Wave3BitExpansionLut from chipset timing data.
Converts three-phase LED timing (T1, T2, T3) into a nibble lookup table for 3-tick-per-bit waveform expansion. Each nibble maps to 12 bits.
70 {
71 Wave3BitExpansionLut lut;
72
73 const u32 period = timing.
T1 + timing.
T2 + timing.
T3;
74
75
76 const float t0h_norm =
static_cast<float>(timing.
T1) / period;
77 const float t1h_norm =
static_cast<float>(timing.
T1 + timing.
T2) / period;
78
79
80 u32 ticks_bit0 = static_cast<u32>(t0h_norm * 3.0f + 0.5f);
81 u32 ticks_bit1 = static_cast<u32>(t1h_norm * 3.0f + 0.5f);
82
83
84 if (ticks_bit0 > 3) ticks_bit0 = 3;
85 if (ticks_bit1 > 3) ticks_bit1 = 3;
86
87
88
89
92
93 for (u32 i = 0; i < ticks_bit0; i++) {
94 pattern_bit0 |= (0x4 >> i);
95 }
96 for (u32 i = 0; i < ticks_bit1; i++) {
97 pattern_bit1 |= (0x4 >> i);
98 }
99
100
101
102 for (
u8 nibble = 0; nibble < 16; nibble++) {
103 u16 pattern = 0;
104
105 for (int bit_pos = 3; bit_pos >= 0; bit_pos--) {
106 bool bit_set = (nibble >> bit_pos) & 1;
107 u8 tick_pattern = bit_set ? pattern_bit1 : pattern_bit0;
108 pattern = (pattern << 3) | (tick_pattern & 0x7);
109 }
110 lut.lut[nibble] = pattern;
111 }
112
113 return lut;
114}
u32 T2
Additional high time for bit 1 (nanoseconds)
u32 T3
Low tail duration (nanoseconds)
u32 T1
High time for bit 0 (nanoseconds)