Commit Graph

3 Commits

Author SHA1 Message Date
David Montero Crespo 00e7dd8b11 fix(boards): pads that resolved to nothing, and supply pads that drove a GPIO
boardPinToNumber had two failure shapes across the ESP32 family, both silent.

A pad the mapper cannot name returns null, and a null pin means the wire
connects to nothing: the part sits on the canvas, the sketch drives a dead
pin, and the only trace is one console.warn from WirePin.

  - DevKit V1 RX0/TX0. Unlike RX2/TX2, which have numeric twins at the same
    coordinate ('16'/'17', be24243e), these have none, so they were the only
    route to GPIO3 and GPIO1 and a wire to either did nothing.
  - S3 DevKitC 40/41/42/45/46/47/48, rejected by a GPIO ceiling of 39 shared
    with the classic ESP32. The ceiling is now per family.
  - Nano ESP32 RX0/TX1/B0/B1. Its map named them D0/D1, pads the element does
    not draw, leaving GPIO44 and GPIO43 unreachable.
  - Reset pads (RST) on the S3, C3 and Nano, now -1 like the classic board's
    EN rather than null.

The second shape is worse, because the pad does something wrong instead of
nothing: the numeric fallback is parseInt(pinName, 10), and parseInt('3V', 10)
is 3. The Wemos Lolin32 Lite's supply pad resolved to GPIO3, and the XIAO S3,
XIAO C3, Nano ESP32 and Aitewin C3 SuperMini resolved 3V3 to GPIO3 and 5V to
GPIO5 — a wire to the rail drove a real pin. Those branches had no power
guard at all; the shared POWER_PAD_RE replaces the ad-hoc startsWith checks.
Same reason the Wemos SPICE group now lists the '3V' pad it actually draws:
it declared '3V3', a name that board does not expose.

Every expected value is cross-checked against the `target` field of the
upstream wokwi-boards board.json, which is what surfaced this: the pad data
in PR #165 (naweiss) generates that field, and diffing it against our tables
turned up the whole class. Six of the ten ESP32-family boards now match
upstream exactly.

Left deliberately: the UART pad numbers (S3 TX/RX are GPIO43/44 and C3
TX/RX are GPIO21/20, not the classic 1/3) and the DevKitC V4 flash block
(D0-D3/CMD/CLK are GPIO6-11). Unlike the above, those pads resolve today, so
changing them moves an existing wire to a different pin.

The test walks every pad of every ESP32-family board and fails on either
shape. Pad lists are copied from Esp32Element.ts, as in
pin-inspector-layout.test.ts, because vitest runs in the node environment.

Co-authored-by: naweiss <naweiss@g.jct.ac.il>
2026-08-21 06:12:24 +02:00
David Montero Crespo cc3b67f724 feat(m5stack-core): header pins resolve, and PWM tones carry their real pitch
Two faults from the same audit. Every wire from the Core's M-Bus header
resolved to null: the kind does not start with 'esp32', so boardPinToNumber
fell through every branch and a part wired to the header never saw a signal,
with nothing anywhere saying why. A dedicated branch (like the Cardputer's)
maps the bare-number pads, sends 5V/GND/3V3/BAT to -1, and three new tests
pin it — the board had zero test coverage before.

And LEDC events now carry the carrier frequency. The engines have always
known it; LedcDuty just had no field for it, so a speaker listener could only
ever play a canned note — the Core's piano spent its life on 660 Hz. The duty
handler stashes it per pin in the PinManager (getPwmFreq), a side table
rather than a new callback parameter so the existing two- and three-arg PWM
listeners stay untouched.
2026-08-12 15:19:30 +02:00
David Montero Crespo a698534b7b fix(pins): la cabecera del M5 Cardputer ya resuelve a numeros de GPIO
boardPinToNumber no tenia rama para 'cardputer-adv', asi que caia al return
null del final: cada cable a su cabecera EXT o al Grove Port A se conectaba a
nada. La pieza quedaba en el lienzo, el sketch leia un pin muerto y nadie
avisaba de nada.

La rama compartida de esp32 tampoco habria servido: recorta en 39 y este board
saca G40 en la cabecera. El S3 tiene 48 GPIOs.
2026-07-26 02:47:05 +02:00