Make the PIN timing-arc fill animate smoothly again
The dial filled in ~10 coarse blocks because each full repaint took ~300 ms, so
the loop only sampled the continuous fill ~3 times/second. The cost was the AA
ring rendering: isqrt64 ran a Newton-Raphson with a 64-bit divide per iteration
(the ESP32-S3 has no hardware 64-bit divide) once per pixel, over the whole dial
box, twice. The fill VALUE was always correct — only the redraw cadence was slow.
- isqrt64: replace the division-based Newton form with a division-free binary
(digit-by-digit) integer sqrt — only shifts/adds/compares, identical result.
- fillAnnulusSweepAA / strokeCircleAA: gate the per-pixel sqrt behind a cheap d^2
band test, so the inner hole and box corners (most of a thin ring's box) are
skipped without a sqrt; no change to the coverage math.
- Add fillAnnulusGaugeAA: paint the dim track and the bright progress wedge in
one band pass (distance/angle computed once), and use it in the PIN dial.
Net: the dial repaint drops from ~300 ms to ~67 ms, so the arc now fills ~44
frames over a 3 s sweep (was ~10) — a smooth growing bar. Visually identical.
Add a DEBUG_SERIAL_BUTTONS trace at the timing-arc output (elapsed/fill%/digit
per rendered frame) for on-device QA, and native boundary tests asserting the
exact digit slices (e.g. T=3000: 299 ms -> 0, 300 ms -> 1, and the 9 -> 0 wrap).