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). |
||
|---|---|---|
| .. | ||
| api | ||
| core | ||
| database | ||
| mcp | ||
| models | ||
| schemas | ||
| services | ||
| utils | ||
| __init__.py | ||
| main.py | ||