velxio/backend/app/services
David Montero Crespo 2a4d19e9c2 fix(esp32): matrix keypad — active-row model, idempotent install, gap-free listeners
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).
2026-08-19 22:19:27 +02:00
..
boot_images feat(pi): gpiozero core + boot feedback, terminal and upload UX 2026-06-22 20:21:06 +02:00
esp-idf-template fix(espidf): enable BLE 4.2 legacy APIs on BLE5-only SoCs 2026-08-15 04:19:21 +02:00
__init__.py
…
arduino_cli.py fix(arduino-cli): library search/install failures become one actionable sentence 2026-08-18 00:28:07 +02:00
asm8080.py feat(chips): programmable retro CPU chips with external ROM 2026-05-18 23:38:18 -03:00
asmz80.py feat(chips): programmable Z80 chip + Larson scanner example 2026-05-19 00:21:08 -03:00
board_access.py feat: STM32 (Blue Pill / Black Pill) QEMU emulation + Pro board gating 2026-05-30 19:06:14 -03:00
c_compile.py fix(c-compile): drop --code-loc 0x100 that overwrote SDCC's crt0 init (Z80) 2026-06-03 20:11:01 +02:00
chip_compile.py
…
esp32_flash_image.py
…
esp32_i2c_slaves.py
…
esp32_lib_bridge.py
…
esp32_lib_manager.py feat(microsd): SD-over-SPI card storage for AVR, RP2040 and ESP32 2026-06-11 03:59:53 +02:00
esp32_sd_slave.py feat(microsd): SD-over-SPI card storage for AVR, RP2040 and ESP32 2026-06-11 03:59:53 +02:00
esp32_signals.py
…
esp32_spi_slaves.py feat(epaper): decode the UC8179/GD7965 7.5" panel + fix its BUSY polarity 2026-06-04 23:45:37 -03:00
esp32_worker.py fix(esp32): matrix keypad — active-row model, idempotent install, gap-free listeners 2026-08-19 22:19:27 +02:00
esp_qemu_manager.py
…
espidf_compiler.py fix(espidf): run library resolution/merge off the event loop 2026-08-19 20:25:01 +02:00
gpio_shim.py
…
qemu_manager.py feat(pi): techo de capacidad para los guests QEMU (multiusuario) 2026-07-29 21:15:04 +02:00
rom_compile.py feat(chips): C-to-Z80 compile via SDCC + LED chaser example 2026-05-19 00:31:10 -03:00
signal_router.py
…
stm32_lib_manager.py feat(boards): add 6 STM32 boards (F4 Discovery, Olimex H405, Netduino 2/+2, Pill variants) 2026-05-31 03:19:26 -03:00
stm32_worker.py sim: drive RP2040 + STM32 digital inputs from the real circuit 2026-06-26 22:05:24 +02:00
symbol_extract.py feat(intellisense): /type/ follows inheritance; extractor records bases and splits comma declarators 2026-08-17 19:08:57 +02:00
wasm_chip_runtime.py
…
wasm_chip_slave.py
…
wifi_status_parser.py
…