0.9.0 - MAX7219 Display (max7219.js v1.0.0, engine in max7219-lib.js):
- 8-digit LED driver on a firmware bit-banged DIN/CLK/LOAD bus (hardware
SPI stays invisible, M0). Level-driven shift engine samples DIN on the
CLK rising edge, latches MSB-first 16-bit words on the LOAD rising edge;
misaligned frames are dropped and counted in `dropped`, never garbled.
Datasheet register model: Code B decode (independent DP), intensity PWM,
scan limit, shutdown/display test, power-on defaults. 8x8 matrix and
7-segment Views auto-selected from the decode-mode register; daisy
chains share the three pads (sharedBus) and latch their chain position.
Lease sizing measured against the tightest real firmware (gun 0.1.0,
delay-free pulses ~20 instructions apart): fine at the scheduler floor
20, arm 60. Smoke S12 boots the gun 0.1.0 release (machine-local, skips
when absent) with zero drops; examples/esp32s3-gun.json wires it.
0.10.0 - Logic analyzer (logic-analyzer.js v1.0.0, logic in la-lib.js):
- Multi-channel GPIO waveform capture: up to 8 pads, channel+edge or
immediate trigger, 1-1000 ms guest-time window, auto re-arm, Z shown
when the pad is released; rides the M4 scheduler (arm 1000, fine lease
per resolution preset 20/100/300, renewed per edge); 20 000-edge buffer
freezes with an overflow flag. sharedBus makes it a pure tap on other
bus devices' pads (smoke S13 arms it on the P4 soft-I2C bus: SCL 1950 /
SDA 352 alternating edges in a 40 ms window, frozen afterwards).
- Floating analyzer window: draggable, resizable, non-modal popup
(position fixed, no backdrop - the page underneath keeps every pointer
event; geometry clamped + persisted). One drawWaveform painter feeds
the popup, the details mini-preview and the row icon (AGENT 3.8);
channels picked from a GPIO grid, occupied pins greyed.
- Saleae-style plot interactions: wheel zoom anchored at the cursor (1 ns
floor), left/middle-drag pan, double-click/F fit; hover measurement
shades the pulse and reads level + width + period + frequency + PWM
duty (rise-to-rise cycle); A/B cursors with delta-t and 1/delta-t;
lane selection + </> buttons and arrow keys jump view-centre onto the
previous/next edge; lane gutter shows the right-edge level; a fresh
capture re-fits the view and drops cursors (capId).
- Device API v1 additions (backwards compatible): ctx.pinLevel(pin)
snapshot read of the driven level; ViewHost.pinInfo() for multi-pin
pickers; View.destroy() teardown on row removal / list rebuild so Views
owning DOM outside their row (floating windows) clean it up.
- Tests: la-lib units (parsePins, levelAt, axis ticks, fit span, pixel
transform, zoom/pan view model, pulseAround, pwmOf, fmtHz/levelChar),
the capture state machine via fake ctx (immediate/triggered starts,
direction filtering incl. Z-as-falling, window end, stop/clear/auto,
buffer overflow, onEmuReady reset, capId), sigbus.pinLevel against a
fake emulator; smoke S13 + S1 grows to 12 devices;
examples/esp32c3-probe.json wires the analyzer on the I2C pair.
- Docs (both languages): CHANGELOG 0.9.0 + 0.10.0 + device version table,
ROADMAP shipped sections, DEVICE-API instrument section + new ctx/host/
View members, ARCHITECTURE GUI checklist + floating-window note,
README capability table + tree, AGENT rule 3.11 + GUI-smoke bug-table
rows; version synced to 0.10.0 in all three places.