From 77f8ca141f75df133dbcaacd018e19ae8c1a07e4 Mon Sep 17 00:00:00 2001 From: EUtrilla2002 <100451242@alumnos.uc3m.es> Date: Thu, 12 Mar 2026 12:48:38 +0100 Subject: [PATCH 1/2] fixed interrupts --- src/core/capi/arduino_functions.mts | 24 ++++++++++++++++--- src/core/events.mts | 20 ++++++++++++++++ src/web/arduino/pinstates.mts | 11 +++++++++ .../components/simulator/ArduinoTerminal.vue | 5 ++++ 4 files changed, 57 insertions(+), 3 deletions(-) diff --git a/src/core/capi/arduino_functions.mts b/src/core/capi/arduino_functions.mts index 7cfa6367..f2663dc3 100644 --- a/src/core/capi/arduino_functions.mts +++ b/src/core/capi/arduino_functions.mts @@ -715,11 +715,18 @@ export function cr_attachInterrupt() { // esp32vect.value[Number(interr_pos)]![2] = mode; //TODO: Graphic retroalimentation // const gpiopin = "GPIO" + esp32vect.value[Number(interr_pos)]![0]; - const gpiopin = "GPIO" + "6" + let gpiopin = "GPIO?"; // Valor por defecto + + coreEvents.emit("arduino-get-pin-from-slot", { + position: Number(interr_pos), + callback: (pin: string) => { + gpiopin = "GPIO" + pin; // El suscriptor nos devuelve el pin real + } + }); coreEvents.emit("arduino-terminal-write", { text: `attachInterrupt(${interr_pos}, 0x${interr_isr.toString(16)}, ${mode}) `, }); - coreEvents.emit("arduino-pin-interrupt", { pin: gpiopin }); + coreEvents.emit("arduino-pin-interrupt", { pin: gpiopin, mode: mode, isr: interr_isr, position: interr_pos }); } export function cr_detachInterrupt() { //TODO: Revise @@ -757,10 +764,15 @@ export function cr_digitalPinToInterrupt() { } var pin = BigInt.asUintN(32, readRegister(ret1.indexComp, ret1.indexElem)); //Find clean slot in the interrupt vector table + let pos = -1; // const pos = esp32vect.value.findIndex( // (slot: bigint[]) => slot[1] === 0n && slot[2] === 0n, // ); - const pos: number = 0; // Simulamos que siempre se asigna a la posición 0 para simplificar + coreEvents.emit("arduino-find-vector-slot", { + callback: (index: number) => { + pos = index; + } + }); // Si no encuentra ninguna posición libre, findIndex devuelve -1 if (pos === -1) { @@ -772,6 +784,12 @@ export function cr_digitalPinToInterrupt() { ); } // esp32vect.value[pos] = [BigInt(pin), 0n, 0n]; // Mark the slot as used with the position + coreEvents.emit("arduino-pin-interrupt", { + position: BigInt(pos), + pin: pin.toString(), + mode: 0n, + isr: 0n, + }); writeRegister(BigInt(pos), ret1.indexComp, ret1.indexElem); coreEvents.emit("arduino-terminal-write", { text: `digitalPinToInterrupt(${pin})`, diff --git a/src/core/events.mts b/src/core/events.mts index 49fbcc02..3b44da16 100644 --- a/src/core/events.mts +++ b/src/core/events.mts @@ -133,6 +133,10 @@ export type CoreEvents = { "arduino-pin-interrupt":ArduinoPinInterruptEvent; /** Emitted when a pin is detached from an interrupt */ "arduino-pin-detach-interrupt": ArduinoPinDetachInterruptEvent; + /** Emitted when the simulator requests to find a free slot in the interrupt vector table */ + "arduino-find-vector-slot": ArduinoFindSlotEvent; + /** Emitted when the simulator requests to get the pin assigned to an interrupt vector slot */ + "arduino-get-pin-from-slot": ArduinoGetPinFromSlotEvent; }; /** * Emitted when the simulator sends text to the Arduino Terminal @@ -167,6 +171,9 @@ export interface ArduinoPinMode{ export interface ArduinoPinInterruptEvent { /** The pin number */ pin: string; + isr: bigint; + mode: bigint; + position: bigint; } /** * Emitted when a pin is detached from an interrupt @@ -187,6 +194,19 @@ export interface ArduinoPinRead { callback: (value: number) => void; } +/** + * Event is emitted when searching a interrupt vector slot + */ export interface ArduinoFindSlotEvent { + /** Callback to return the found slot index */ + callback: (index: number) => void; +} + +export interface ArduinoGetPinFromSlotEvent { + position: number; + callback: (pin: string) => void; +} + + /** * Global event emitter for CREATOR core events diff --git a/src/web/arduino/pinstates.mts b/src/web/arduino/pinstates.mts index 7ac21178..0b2c2315 100644 --- a/src/web/arduino/pinstates.mts +++ b/src/web/arduino/pinstates.mts @@ -146,4 +146,15 @@ export function switchBoard(boardKey: string) { coreEvents.on("arduino-pin-read", (event: ArduinoPinRead) => { const value = pinStates.value[event.pin] ?? 0; event.callback(value); +}); +coreEvents.on("arduino-find-vector-slot", (event) => { + const indexEncontrado = esp32vect.value.findIndex( + (slot: bigint[]) => slot[1] === 0n && slot[2] === 0n + ); + event.callback(indexEncontrado); +}); + +coreEvents.on("arduino-get-pin-from-slot", (event) => { + const pinGuardado = esp32vect.value[event.position]?.[0]; + event.callback(pinGuardado?.toString() ?? "unknown"); }); \ No newline at end of file diff --git a/src/web/components/simulator/ArduinoTerminal.vue b/src/web/components/simulator/ArduinoTerminal.vue index a5f2effb..1fb4d917 100644 --- a/src/web/components/simulator/ArduinoTerminal.vue +++ b/src/web/components/simulator/ArduinoTerminal.vue @@ -240,6 +240,11 @@ export default { coreEvents.on("arduino-pin-interrupt", pinName => { this.interrupt[pinName.pin] = true; + esp32vect.value[pinName.position] = [ + BigInt(pinName.pin.replace(/\D/g, "")), + pinName.isr, + pinName.mode, + ]; }); coreEvents.on("arduino-pin-detach-interrupt", pinName => { delete this.interrupt[pinName.pin]; From c6a2d665b2e0500f45b9569fd42990e965283e4b Mon Sep 17 00:00:00 2001 From: EUtrilla2002 <100451242@alumnos.uc3m.es> Date: Thu, 12 Mar 2026 13:00:41 +0100 Subject: [PATCH 2/2] fixed example --- examples/RISCV-32-arduino/example4.s | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/RISCV-32-arduino/example4.s b/examples/RISCV-32-arduino/example4.s index 9b662357..85091089 100644 --- a/examples/RISCV-32-arduino/example4.s +++ b/examples/RISCV-32-arduino/example4.s @@ -76,6 +76,8 @@ lightUp: loop: #read LDR + la t0, ledPin + lw a0, 0(t0) addi sp, sp, -4 sw ra,0(sp) jal ra, analogRead #analogRead(lightSensorPin);