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.
69 {
70 Wave3BitExpansionLut lut;
71
72 const u32 period = timing.
T1 + timing.
T2 + timing.
T3;
73
74
75 const float t0h_norm =
static_cast<float>(timing.
T1) / period;
76 const float t1h_norm =
static_cast<float>(timing.
T1 + timing.
T2) / period;
77
78
79 u32 ticks_bit0 = static_cast<u32>(t0h_norm * 3.0f + 0.5f);
80 u32 ticks_bit1 = static_cast<u32>(t1h_norm * 3.0f + 0.5f);
81
82
83 if (ticks_bit0 > 3) ticks_bit0 = 3;
84 if (ticks_bit1 > 3) ticks_bit1 = 3;
85
86
87
88
91
92 for (u32 i = 0; i < ticks_bit0; i++) {
93 pattern_bit0 |= (0x4 >> i);
94 }
95 for (u32 i = 0; i < ticks_bit1; i++) {
96 pattern_bit1 |= (0x4 >> i);
97 }
98
99
100
101 for (
u8 nibble = 0; nibble < 16; nibble++) {
102 u16 pattern = 0;
103
104 for (int bit_pos = 3; bit_pos >= 0; bit_pos--) {
105 bool bit_set = (nibble >> bit_pos) & 1;
106 u8 tick_pattern = bit_set ? pattern_bit1 : pattern_bit0;
107 pattern = (pattern << 3) | (tick_pattern & 0x7);
108 }
109 lut.lut[nibble] = pattern;
110 }
111
112 return lut;
113}
u32 T2
Additional high time for bit 1 (nanoseconds)
u32 T3
Low tail duration (nanoseconds)
u32 T1
High time for bit 0 (nanoseconds)