Validated live against the ESP32 alarm-keypad project. Three fixes over the initial implementation: - Active-row model: the write-pin callback only fires on OUTPUT-latch changes (after the first pass re-driving the row LOW is a no-change write), and dir alone misses the first pass. A matrix scan drives one row at a time with the latch LOW, so 'the row that most recently went active (dir=OUTPUT, or latch write LOW)' IS the scanned row. - Idempotent install: the canvas effect re-attaches on every boards[] mutation (each serial line); reinstalling wiped the pressed-key set mid-scan. Same wiring now keeps the existing state dict. - Gap-free listeners: the keypad's button-press listeners were attached on a 300ms setTimeout per effect run, opening a listener-less window on every re-run in which a press was lost entirely. Attach synchronously and drop the sendSensorDetach cleanup (detach+reattach on unrelated re-renders is exactly the wipe the idempotent install guards against). |
||
|---|---|---|
| .. | ||
| app | ||
| board-indexes | ||
| scripts | ||
| sdk | ||
| tests | ||
| .env.example | ||
| Dockerfile | ||
| debug_qemu.py | ||
| mcp_server.py | ||
| mcp_sse_server.py | ||
| requirements.txt | ||