Logical rendering on legacy strips and v2 ears¶
ear_view_t borrows a pixel buffer, count and optional immutable board topology.
The render owner supplies descriptors already validated against the output map;
no renderer reads files, allocates memory or selects GPIOs. A NULL topology keeps
the legacy open outline and exact legacy height/path arithmetic. V2 keeps saved
outer_pixels=0: the number 48 is a ring size, never a legacy edge length.
The v2 board imports 69 PCB-derived centres. Each ring runs from its own first component (D1 or D49) around a closed path, with arc length proportional to physical distance including the closing segment. Both rings share animation phase and retain component order on the reflected right ear. A geometric reflection therefore reverses apparent world rotation without changing identities. This is a CAD convention; mounted optical direction still needs validation.
| Rendering | V2 sampling and centre policy |
|---|---|
| Static, gradient, breathing, sparkle, rainbow, comet | Each ring gets one complete palette/hue sequence. The centre takes the mean inner-ring RGB after animation. |
| Twinklefox, Chase bands, Motion twinkle, Inertia, Stardust | Closed-ring paths; per-pixel random clocks retain logical identities. The centre takes the mean inner-ring RGB. |
| Aurora | Brightness clouds use physical X; palette colour follows ring arc. The centre uses its actual X and the mean palette colour. |
| Liquid light | Fill uses global physical height across both rings and centre; palette colours follow ring arc, with mean palette colour at the centre. |
| Motion aurora | Its moving colour/brightness field uses physical X and global height, including the centre. |
| Turn trail | A trail on each closed ring; the centre has no trail arc. |
| Move shimmer, radio mode wave | Global physical height, including the centre. Shimmer uses mean palette colour at the centre. |
| Raised tip | Separate regional height sweeps up each ring; the centre is excluded. The held colour uses the explicit two highest samples of each ring. |
Blended ring palettes interpolate the last colour back to the first. Banded palettes keep their intentional colour boundaries. Comet distance wraps across the ring join. Chase bands uses ring-local arc/length for phase and edge smoothing. Spatial fields use global height or physical X rather than treating D69 as the end of a strip. A centre mean is computed in logical 16-bit RGB before physical output gain, trims, composition and current limits.
Raised-tip progress spans each ring's own minimum/maximum height so the shorter
inner ring reaches its tip with the outer ring. Its softened sweep width is two
effective height samples at half the ring count, rather than a claim that exactly
two physical LEDs are always lit on a nonuniform curve. The held samples are D13,
D14, D54 and D55 in geometry revision espurr-v2-ear-69-r1. The v1 pair straddles its short/long split (indices 5/6 for 18 pixels, 12 long);
its pulse/travel arithmetic is retained. Uniform gestures, forward lean,
Enforcer, flashlight, diagnostics and OTA retain their existing layer/output rules.
Diagnostic walking still names logical component order; it is not a spatial effect.
The topology identity/hash is logged at v2 startup. No new protocol fields or settings are needed for these adapters: both phone clients already recognise the fixed 69-pixel layout and continue sending artistic RGB/effect parameters. Runtime geometry remains firmware-owned. Future spatial editors would need an explicit geometry transfer contract rather than guessing XY from electrical indices.
Host checks cover both closed seams, independent ring starts, real spatial height, right reflection, centre policies, all catalogue effects at 69 pixels, new v2 frame hashes and v1 logical-buffer goldens and canonical short-edge-first height/tip tests. Four-chain output checks run the rendered frames through the actual composition/current/quantisation path with independent per-ear and combined allowances. These checks do not establish physical appearance, output timing under audio/radio load, electrical current or wearable acceptance.