128 {
131 if (period_ns == 0) return fit;
132
133
134
136 static_cast<u64>(pulses_per_bit) * 1000000000ULL / period_ns;
137 if (baud == 0 || baud > max_baud_rate) return fit;
138
139 const u32 pulse_width_ns = period_ns / pulses_per_bit;
140 if (pulse_width_ns == 0) return fit;
141
142 const u32 t0h_ns = timing.
t1_ns;
143 const u32 t1h_ns = timing.
t1_ns + timing.
t2_ns;
144 const u8 max_pulses =
static_cast<u8>(pulses_per_bit - 1);
145
148 if (pulses_0 < 1 || pulses_0 > max_pulses) return fit;
149 if (pulses_1 < 1 || pulses_1 > max_pulses) return fit;
150 if (pulses_0 == pulses_1) return fit;
151
152
153
154
155
156
157
158
159
160 constexpr u32 kMinSymbolSeparationNs = 400;
161 const u8 pulses_1_raw = pulses_1;
162 while (pulses_1 < max_pulses &&
163 static_cast<u32>(pulses_1 - pulses_0) * pulse_width_ns <
164 kMinSymbolSeparationNs) {
165 ++pulses_1;
166 }
167
168
169
170
171
172 const u32 tolerance_ns = pulse_width_ns / 2;
173 const u32 actual_t0h = static_cast<u32>(pulses_0) * pulse_width_ns;
174 const u32 actual_t1h = static_cast<u32>(pulses_1) * pulse_width_ns;
175 const u32 t1h_tolerance_ns =
176 tolerance_ns +
177 static_cast<u32>(pulses_1 - pulses_1_raw) * pulse_width_ns;
178 const u32 err_t0h =
absDiff(actual_t0h, t0h_ns);
179 const u32 err_t1h =
absDiff(actual_t1h, t1h_ns);
180 if (err_t0h > tolerance_ns) return fit;
181 if (err_t1h > t1h_tolerance_ns) return fit;
182
183 const u32 raw_t1h = static_cast<u32>(pulses_1_raw) * pulse_width_ns;
184 const u32 err_t1h_raw =
absDiff(raw_t1h, t1h_ns);
185
190 fit.
max_err_ns = err_t0h > err_t1h_raw ? err_t0h : err_t1h_raw;
191 return fit;
192}
u8 computePulseCount(u32 timing_ns, u32 pulse_width_ns) FL_NO_EXCEPT
Compute HIGH pulse count for a given timing value.
u32 absDiff(u32 a, u32 b) FL_NO_EXCEPT
Absolute value of difference (unsigned-safe)
u32 total_err_ns
|T0H err| + |T1H err| vs nominal, post-bump
u32 max_err_ns
Worst single-symbol error, measured pre-bump.
Fit result for one UART wave geometry (P pulses per LED bit)
u32 t1_ns
T0H: High time for bit 0 (nanoseconds)
u32 t2_ns
T1H-T0H: Additional high time for bit 1 (nanoseconds)
constexpr u32 total_period_ns() const FL_NO_EXCEPT
Get total bit period (T1 + T2 + T3)