From 0b7c9e1dd6ebf78ef623fc98e6f64e17bf44284c Mon Sep 17 00:00:00 2001 From: David Montero Crespo Date: Tue, 28 Jul 2026 02:01:15 +0200 Subject: [PATCH] =?UTF-8?q?fix(esp32):=20completeTransfer=20del=20shim=20S?= =?UTF-8?q?PI=20ya=20no=20es=20un=20no-op=20=E2=80=94=20el=20MISO=20de=20l?= =?UTF-8?q?os=20parts=20llega=20al=20guest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit El adaptador SPI del Esp32BridgeShim descartaba el MISO de los parts ('el worker lo lleva por _spi_response'), cierto solo en la era QEMU: cualquier part SPI que RESPONDE (una SD contestando CMD0) hablaba con nadie en modo js — medido como SD.begin()=0 con sd_diskio reintentando CMD0 para siempre en el Round Display. Ahora reenvia a bridge.setSpiResponse, que todos los puentes tienen: el de QEMU lo manda al worker, y los motores js fijan el byte que su SpiForwarder devuelve para ESTA transferencia (toda la cadena onByte corre sincrona dentro del transfer del motor). El reposo lo restaura el decodificador compartido, que ya completa cada byte ajeno con 0xff. --- frontend/src/store/useSimulatorStore.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/frontend/src/store/useSimulatorStore.ts b/frontend/src/store/useSimulatorStore.ts index c29e19d1..9b1c574f 100644 --- a/frontend/src/store/useSimulatorStore.ts +++ b/frontend/src/store/useSimulatorStore.ts @@ -301,8 +301,17 @@ class Esp32BridgeShim { if (!this._spiAdapter) { const adapter = { onByte: null as ((mosi: number) => void) | null, - completeTransfer: (_miso: number) => { - /* ESP32 worker drives MISO via _spi_response — no-op here. */ + // MISO goes back through the bridge's setSpiResponse — every bridge + // has it (QEMU forwards to the worker's _spi_response; the JS engines + // set the byte their SpiForwarder returns for THIS transfer, since the + // whole onByte chain runs synchronously inside the engine's transfer). + // This used to be a no-op "because the worker drives MISO", which was + // only true for QEMU-era parts: any SPI part that ANSWERS (an SD card + // reponding to CMD0) was talking to nobody in js mode — measured as + // SD.begin()=0 with sd_diskio retrying CMD0 forever. + completeTransfer: (miso: number) => { + (this.bridge as unknown as { setSpiResponse?: (b: number) => void }) + .setSpiResponse?.(miso); }, }; // Forward every per-byte WS event into whichever handler the part