From 2aa7607428dcd44fd14c844f41a1b4a53bbc7ae1 Mon Sep 17 00:00:00 2001 From: David Montero Crespo Date: Sun, 8 Mar 2026 02:20:21 -0300 Subject: [PATCH] feat: add sensor parts and utilities for simulation - Introduced new SensorParts.ts to handle various sensors including tilt switch, temperature sensor, gas sensor, flame sensor, heart beat sensor, and sound sensors. - Implemented stepper motor simulation with full-step decoding. - Added utility functions for ADC voltage injection in partUtils.ts, supporting both AVR and RP2040. - Updated BasicParts.ts to avoid re-registering the 7-segment display. - Enhanced ComplexParts.ts by removing unused ADC helper functions. - Updated index.ts to include the new SensorParts module. - Updated Vite environment definitions to include new custom elements for sensors and stepper motors. --- frontend/public/components-metadata.json | 199 +++++++ frontend/public/og-image.png | Bin 73778 -> 84914 bytes frontend/src/__tests__/motor-parts.test.ts | 291 +++++++++++ frontend/src/__tests__/sensor-parts.test.ts | 413 +++++++++++++++ .../src/__tests__/simulation-parts.test.ts | 2 + frontend/src/simulation/parts/BasicParts.ts | 159 +++++- frontend/src/simulation/parts/ComplexParts.ts | 35 +- frontend/src/simulation/parts/SensorParts.ts | 491 ++++++++++++++++++ frontend/src/simulation/parts/index.ts | 1 + frontend/src/simulation/parts/partUtils.ts | 45 ++ frontend/src/vite-env.d.ts | 13 + 11 files changed, 1593 insertions(+), 56 deletions(-) create mode 100644 frontend/src/__tests__/motor-parts.test.ts create mode 100644 frontend/src/__tests__/sensor-parts.test.ts create mode 100644 frontend/src/simulation/parts/SensorParts.ts create mode 100644 frontend/src/simulation/parts/partUtils.ts diff --git a/frontend/public/components-metadata.json b/frontend/public/components-metadata.json index f9c895e..0247c73 100644 --- a/frontend/public/components-metadata.json +++ b/frontend/public/components-metadata.json @@ -1729,6 +1729,205 @@ "motion", "sensor" ] + }, + { + "id": "lcd1602", + "tagName": "wokwi-lcd1602", + "name": "LCD 1602", + "category": "displays", + "thumbnail": "LCD 1602", + "properties": [ + { + "name": "color", + "type": "string", + "defaultValue": "black", + "control": "text" + }, + { + "name": "background", + "type": "string", + "defaultValue": "green", + "control": "text" + }, + { + "name": "pins", + "type": "string", + "defaultValue": "full", + "control": "text" + } + ], + "defaultValues": { + "color": "black", + "background": "green", + "pins": "full" + }, + "pinCount": 16, + "tags": [ + "lcd1602", + "lcd 1602", + "lcd", + "16x2", + "1602", + "display", + "hd44780" + ] + }, + { + "id": "stepper-motor", + "tagName": "wokwi-stepper-motor", + "name": "Stepper Motor", + "category": "output", + "thumbnail": "STEPPER", + "properties": [ + { + "name": "angle", + "type": "number", + "defaultValue": 0, + "control": "text" + }, + { + "name": "size", + "type": "string", + "defaultValue": "23", + "control": "text" + }, + { + "name": "value", + "type": "string", + "defaultValue": "", + "control": "text" + }, + { + "name": "units", + "type": "string", + "defaultValue": "", + "control": "text" + } + ], + "defaultValues": { + "angle": 0, + "size": "23", + "value": "", + "units": "" + }, + "pinCount": 4, + "tags": [ + "stepper-motor", + "stepper motor", + "stepper", + "motor", + "nema" + ] + }, + { + "id": "tilt-switch", + "tagName": "wokwi-tilt-switch", + "name": "Tilt Switch", + "category": "sensors", + "thumbnail": "TILT", + "properties": [], + "defaultValues": {}, + "pinCount": 3, + "tags": [ + "tilt-switch", + "tilt switch", + "tilt", + "ball switch" + ] + }, + { + "id": "ntc-temperature-sensor", + "tagName": "wokwi-ntc-temperature-sensor", + "name": "NTC Temperature Sensor", + "category": "sensors", + "thumbnail": "NTC TEMP", + "properties": [], + "defaultValues": {}, + "pinCount": 3, + "tags": [ + "ntc-temperature-sensor", + "ntc temperature sensor", + "ntc", + "temperature", + "sensor", + "thermistor" + ] + }, + { + "id": "heart-beat-sensor", + "tagName": "wokwi-heart-beat-sensor", + "name": "Heart Beat Sensor", + "category": "sensors", + "thumbnail": "HEARTBEAT", + "properties": [], + "defaultValues": {}, + "pinCount": 3, + "tags": [ + "heart-beat-sensor", + "heart beat sensor", + "heart", + "pulse", + "sensor" + ] + }, + { + "id": "neopixel-matrix", + "tagName": "wokwi-neopixel-matrix", + "name": "NeoPixel Matrix", + "category": "displays", + "thumbnail": "", + "properties": [ + { + "name": "rows", + "type": "number", + "defaultValue": 8, + "control": "text" + }, + { + "name": "cols", + "type": "number", + "defaultValue": 8, + "control": "text" + } + ], + "defaultValues": { + "rows": 8, + "cols": 8 + }, + "pinCount": 4, + "tags": [ + "neopixel-matrix", + "neopixel matrix", + "ws2812b", + "led matrix", + "neopixel" + ] + }, + { + "id": "led-ring", + "tagName": "wokwi-led-ring", + "name": "WS2812B LED Ring", + "category": "displays", + "thumbnail": "", + "properties": [ + { + "name": "pixels", + "type": "number", + "defaultValue": 16, + "control": "text" + } + ], + "defaultValues": { + "pixels": 16 + }, + "pinCount": 4, + "tags": [ + "led-ring", + "led ring", + "ws2812b", + "neopixel ring", + "ring" + ] } ] } \ No newline at end of file diff --git a/frontend/public/og-image.png b/frontend/public/og-image.png index 7fcba51a1c38f3575271befaaa54f18c7d64acfb..660a7fbedc17fa6037251fa60c57bf5c76ba7fec 100644 GIT binary patch literal 84914 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

3w%) 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

wDT-!|^ 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 LJYRP1+MoXh{|Ehc literal 73778 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 diff --git a/frontend/src/__tests__/motor-parts.test.ts b/frontend/src/__tests__/motor-parts.test.ts new file mode 100644 index 0000000..912da8f --- /dev/null +++ b/frontend/src/__tests__/motor-parts.test.ts @@ -0,0 +1,291 @@ +/** + * motor-parts.test.ts + * + * Tests simulation logic for interactive motor/encoder components: + * - ky-040 rotary encoder (BasicParts.ts) + * - biaxial-stepper motor (BasicParts.ts) + */ + +import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; +import { PartSimulationRegistry } from '../simulation/parts/PartSimulationRegistry'; + +// Side-effect imports — register all parts +import '../simulation/parts/BasicParts'; +import '../simulation/parts/ComplexParts'; +import '../simulation/parts/ChipParts'; +import '../simulation/parts/SensorParts'; + +// ─── Mocks ──────────────────────────────────────────────────────────────────── + +beforeEach(() => { + let counter = 0; + vi.stubGlobal('requestAnimationFrame', (_cb: FrameRequestCallback) => ++counter); + vi.stubGlobal('cancelAnimationFrame', vi.fn()); + // Allow setTimeout to be called but track it (not immediately invoked) + vi.stubGlobal('setTimeout', vi.fn().mockReturnValue(1)); + vi.stubGlobal('clearTimeout', vi.fn()); +}); +afterEach(() => vi.unstubAllGlobals()); + +// ─── Mock factories ─────────────────────────────────────────────────────────── + +function makeElement(props: Record = {}): HTMLElement { + return { + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + ...props, + } as unknown as HTMLElement; +} + +function makeSimulator() { + const pinManager = { + onPinChange: vi.fn().mockReturnValue(() => {}), + onPwmChange: vi.fn().mockReturnValue(() => {}), + triggerPinChange: vi.fn(), + }; + return { + pinManager, + setPinState: vi.fn(), + cpu: { data: new Uint8Array(512).fill(0), cycles: 0 }, + }; +} + +const pinMap = (map: Record) => (name: string): number | null => + name in map ? map[name] : null; + +const noPins = (_name: string): number | null => null; + +// ─── KY-040 Rotary Encoder ──────────────────────────────────────────────────── + +describe('ky-040 — registration', () => { + it('is registered in PartSimulationRegistry', () => { + expect(PartSimulationRegistry.get('ky-040')).toBeDefined(); + }); +}); + +describe('ky-040 — attachEvents', () => { + it('initialises CLK, DT HIGH and SW HIGH (not pressed) on attach', () => { + const logic = PartSimulationRegistry.get('ky-040')!; + const sim = makeSimulator(); + const element = makeElement(); + + logic.attachEvents!(element, sim as any, pinMap({ CLK: 2, DT: 3, SW: 4 })); + + // All three pins should have been set HIGH on init + expect(sim.setPinState).toHaveBeenCalledWith(4, true); // SW HIGH + expect(sim.setPinState).toHaveBeenCalledWith(2, true); // CLK HIGH (idle) + expect(sim.setPinState).toHaveBeenCalledWith(3, true); // DT HIGH (idle) + }); + + it('registers event listeners for rotate-cw, rotate-ccw, button-press, button-release', () => { + const logic = PartSimulationRegistry.get('ky-040')!; + const sim = makeSimulator(); + const element = makeElement(); + + logic.attachEvents!(element, sim as any, pinMap({ CLK: 2, DT: 3, SW: 4 })); + + const events = (element.addEventListener as ReturnType).mock.calls.map( + ([event]: [string]) => event + ); + expect(events).toContain('rotate-cw'); + expect(events).toContain('rotate-ccw'); + expect(events).toContain('button-press'); + expect(events).toContain('button-release'); + }); + + it('pulses CLK with DT LOW on rotate-cw (clockwise)', () => { + const logic = PartSimulationRegistry.get('ky-040')!; + const sim = makeSimulator(); + const element = makeElement(); + + const listeners: Record void> = {}; + (element.addEventListener as ReturnType).mockImplementation( + (ev: string, handler: (...args: any[]) => void) => { listeners[ev] = handler; } + ); + + logic.attachEvents!(element, sim as any, pinMap({ CLK: 2, DT: 3, SW: 4 })); + sim.setPinState.mockClear(); + + listeners['rotate-cw']?.(); + + // DT should be set LOW for CW direction + expect(sim.setPinState).toHaveBeenCalledWith(3, false); // DT LOW + // CLK should be set LOW first then HIGH (via setTimeout) + expect(sim.setPinState).toHaveBeenCalledWith(2, false); // CLK pulse starts LOW + }); + + it('pulses CLK with DT HIGH on rotate-ccw (counter-clockwise)', () => { + const logic = PartSimulationRegistry.get('ky-040')!; + const sim = makeSimulator(); + const element = makeElement(); + + const listeners: Record void> = {}; + (element.addEventListener as ReturnType).mockImplementation( + (ev: string, handler: (...args: any[]) => void) => { listeners[ev] = handler; } + ); + + logic.attachEvents!(element, sim as any, pinMap({ CLK: 2, DT: 3, SW: 4 })); + sim.setPinState.mockClear(); + + listeners['rotate-ccw']?.(); + + // DT should be set HIGH for CCW direction + expect(sim.setPinState).toHaveBeenCalledWith(3, true); // DT HIGH + expect(sim.setPinState).toHaveBeenCalledWith(2, false); // CLK LOW + }); + + it('drives SW pin LOW on button-press and HIGH on button-release', () => { + const logic = PartSimulationRegistry.get('ky-040')!; + const sim = makeSimulator(); + const element = makeElement(); + + const listeners: Record void> = {}; + (element.addEventListener as ReturnType).mockImplementation( + (ev: string, handler: (...args: any[]) => void) => { listeners[ev] = handler; } + ); + + logic.attachEvents!(element, sim as any, pinMap({ CLK: 2, DT: 3, SW: 4 })); + sim.setPinState.mockClear(); + + listeners['button-press']?.(); + expect(sim.setPinState).toHaveBeenCalledWith(4, false); // SW active LOW + + sim.setPinState.mockClear(); + listeners['button-release']?.(); + expect(sim.setPinState).toHaveBeenCalledWith(4, true); // SW release HIGH + }); + + it('removes all event listeners on cleanup', () => { + const logic = PartSimulationRegistry.get('ky-040')!; + const sim = makeSimulator(); + const element = makeElement(); + + const cleanup = logic.attachEvents!(element, sim as any, pinMap({ CLK: 2, DT: 3, SW: 4 })); + cleanup(); + + expect(element.removeEventListener).toHaveBeenCalledWith('rotate-cw', expect.any(Function)); + expect(element.removeEventListener).toHaveBeenCalledWith('rotate-ccw', expect.any(Function)); + expect(element.removeEventListener).toHaveBeenCalledWith('button-press', expect.any(Function)); + expect(element.removeEventListener).toHaveBeenCalledWith('button-release', expect.any(Function)); + }); +}); + +// ─── Biaxial Stepper Motor ──────────────────────────────────────────────────── + +describe('biaxial-stepper — registration', () => { + it('is registered in PartSimulationRegistry', () => { + expect(PartSimulationRegistry.get('biaxial-stepper')).toBeDefined(); + }); +}); + +describe('biaxial-stepper — attachEvents', () => { + it('registers 8 coil pin-change listeners (4 per motor)', () => { + const logic = PartSimulationRegistry.get('biaxial-stepper')!; + const sim = makeSimulator(); + const el = makeElement() as any; + el.outerHandAngle = 0; + el.innerHandAngle = 0; + + logic.attachEvents!(el, sim as any, pinMap({ + 'A1-': 2, 'A1+': 3, 'B1+': 4, 'B1-': 5, + 'A2-': 6, 'A2+': 7, 'B2+': 8, 'B2-': 9, + })); + + expect(sim.pinManager.onPinChange).toHaveBeenCalledTimes(8); + }); + + it('advances outerHandAngle by 1.8° per forward step on motor 1', () => { + const logic = PartSimulationRegistry.get('biaxial-stepper')!; + const sim = makeSimulator(); + const el = makeElement() as any; + el.outerHandAngle = 0; + el.innerHandAngle = 0; + + logic.attachEvents!(el, sim as any, pinMap({ + 'A1-': 2, 'A1+': 3, 'B1+': 4, 'B1-': 5, + 'A2-': 6, 'A2+': 7, 'B2+': 8, 'B2-': 9, + })); + + // Collect handlers indexed by pin number + const handlers: Record void> = {}; + for (const [pin, handler] of sim.pinManager.onPinChange.mock.calls) { + handlers[pin as number] = handler; + } + + // Full-step sequence motor 1: + // Step 0: A1+ = HIGH + handlers[3]?.(3, true); // A1+ HIGH → step 0 + + // Step 1: A1+ = LOW, B1+ = HIGH → forward step + handlers[3]?.(3, false); // A1+ LOW + handlers[4]?.(4, true); // B1+ HIGH → step 1 + + expect(el.outerHandAngle).toBeCloseTo(1.8, 1); + }); + + it('advances innerHandAngle by 1.8° per forward step on motor 2', () => { + const logic = PartSimulationRegistry.get('biaxial-stepper')!; + const sim = makeSimulator(); + const el = makeElement() as any; + el.outerHandAngle = 0; + el.innerHandAngle = 0; + + logic.attachEvents!(el, sim as any, pinMap({ + 'A1-': 2, 'A1+': 3, 'B1+': 4, 'B1-': 5, + 'A2-': 6, 'A2+': 7, 'B2+': 8, 'B2-': 9, + })); + + const handlers: Record void> = {}; + for (const [pin, handler] of sim.pinManager.onPinChange.mock.calls) { + handlers[pin as number] = handler; + } + + // Step 0 for motor 2: A2+ = HIGH + handlers[7]?.(7, true); + + // Step 1 for motor 2: A2+ = LOW, B2+ = HIGH + handlers[7]?.(7, false); + handlers[8]?.(8, true); + + expect(el.innerHandAngle).toBeCloseTo(1.8, 1); + }); + + it('reverses outerHandAngle when motor 1 steps backwards', () => { + const logic = PartSimulationRegistry.get('biaxial-stepper')!; + const sim = makeSimulator(); + const el = makeElement() as any; + el.outerHandAngle = 0; + el.innerHandAngle = 0; + + logic.attachEvents!(el, sim as any, pinMap({ + 'A1-': 2, 'A1+': 3, 'B1+': 4, 'B1-': 5, + 'A2-': 6, 'A2+': 7, 'B2+': 8, 'B2-': 9, + })); + + const handlers: Record void> = {}; + for (const [pin, handler] of sim.pinManager.onPinChange.mock.calls) { + handlers[pin as number] = handler; + } + + // Start at step 0: A1+ HIGH + handlers[3]?.(3, true); + + // Step backwards to step 3: B1- HIGH, A1+ LOW → diff = -1 (= +3 mod 4) + handlers[3]?.(3, false); + handlers[5]?.(5, true); // B1- HIGH → step 3 (backwards from step 0) + + expect(el.outerHandAngle).toBeCloseTo(360 - 1.8, 1); + }); + + it('does nothing when no coil pins are connected', () => { + const logic = PartSimulationRegistry.get('biaxial-stepper')!; + const sim = makeSimulator(); + const el = makeElement() as any; + el.outerHandAngle = 0; + el.innerHandAngle = 0; + + logic.attachEvents!(el, sim as any, noPins); + + expect(sim.pinManager.onPinChange).not.toHaveBeenCalled(); + }); +}); diff --git a/frontend/src/__tests__/sensor-parts.test.ts b/frontend/src/__tests__/sensor-parts.test.ts new file mode 100644 index 0000000..1f72395 --- /dev/null +++ b/frontend/src/__tests__/sensor-parts.test.ts @@ -0,0 +1,413 @@ +/** + * sensor-parts.test.ts + * + * Tests simulation logic for sensor and stepper-motor components registered + * in SensorParts.ts (and stepper-motor in particular). + */ + +import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; +import { PartSimulationRegistry } from '../simulation/parts/PartSimulationRegistry'; + +// Side-effect imports — register all parts (including SensorParts) +import '../simulation/parts/BasicParts'; +import '../simulation/parts/ComplexParts'; +import '../simulation/parts/ChipParts'; +import '../simulation/parts/SensorParts'; + +// ─── RAF mock (no-op to prevent infinite loops) ─────────────────────────────── +beforeEach(() => { + let counter = 0; + vi.stubGlobal('requestAnimationFrame', (_cb: FrameRequestCallback) => ++counter); + vi.stubGlobal('cancelAnimationFrame', vi.fn()); + vi.stubGlobal('setInterval', vi.fn().mockReturnValue(42)); + vi.stubGlobal('clearInterval', vi.fn()); + vi.stubGlobal('setTimeout', vi.fn().mockReturnValue(1)); + vi.stubGlobal('clearTimeout', vi.fn()); +}); +afterEach(() => vi.unstubAllGlobals()); + +// ─── Mock factories ─────────────────────────────────────────────────────────── + +function makeElement(props: Record = {}): HTMLElement { + return { + addEventListener: vi.fn(), + removeEventListener: vi.fn(), + ...props, + } as unknown as HTMLElement; +} + +function makeADC() { + return { channelValues: new Array(8).fill(0) }; +} + +function makeSimulator(adc?: ReturnType | null) { + const pinManager = { + onPinChange: vi.fn().mockReturnValue(() => {}), + onPwmChange: vi.fn().mockReturnValue(() => {}), + triggerPinChange: vi.fn(), + }; + return { + pinManager, + getADC: vi.fn().mockReturnValue(adc ?? null), + setPinState: vi.fn(), + cpu: { data: new Uint8Array(512).fill(0), cycles: 0 }, + }; +} + +const pinMap = (map: Record) => (name: string): number | null => + name in map ? map[name] : null; + +const noPins = (_name: string): number | null => null; + +// ─── SensorParts registration check ────────────────────────────────────────── + +describe('SensorParts — registration', () => { + const SENSOR_IDS = [ + 'tilt-switch', + 'ntc-temperature-sensor', + 'gas-sensor', + 'flame-sensor', + 'heart-beat-sensor', + 'big-sound-sensor', + 'small-sound-sensor', + 'stepper-motor', + 'led-ring', + 'neopixel-matrix', + ]; + + it('registers all sensor and stepper component types', () => { + for (const id of SENSOR_IDS) { + expect(PartSimulationRegistry.get(id), `missing: ${id}`).toBeDefined(); + } + }); +}); + +// ─── Tilt Switch ───────────────────────────────────────────────────────────── + +describe('tilt-switch — attachEvents', () => { + it('sets OUT pin LOW on attach (upright), then HIGH after click, then LOW again', () => { + const logic = PartSimulationRegistry.get('tilt-switch')!; + const sim = makeSimulator(); + const element = makeElement(); + + // Capture addEventListener calls + const listeners: Record void> = {}; + (element.addEventListener as ReturnType).mockImplementation( + (event: string, handler: (...args: any[]) => void) => { + listeners[event] = handler; + } + ); + + logic.attachEvents!(element, sim as any, pinMap({ OUT: 14 })); + + // Should have started LOW (upright) + expect(sim.setPinState).toHaveBeenCalledWith(14, false); + + // First click — tilts HIGH + sim.setPinState.mockClear(); + listeners['click']?.(); + expect(sim.setPinState).toHaveBeenCalledWith(14, true); + + // Second click — returns LOW + sim.setPinState.mockClear(); + listeners['click']?.(); + expect(sim.setPinState).toHaveBeenCalledWith(14, false); + }); + + it('does nothing when OUT pin is not connected', () => { + const logic = PartSimulationRegistry.get('tilt-switch')!; + const sim = makeSimulator(); + const element = makeElement(); + + const cleanup = logic.attachEvents!(element, sim as any, noPins); + expect(cleanup).toBeDefined(); + expect(sim.setPinState).not.toHaveBeenCalled(); + }); +}); + +// ─── NTC Temperature Sensor ────────────────────────────────────────────────── + +describe('ntc-temperature-sensor — attachEvents', () => { + it('injects 2.5V (mid-range) on OUT pin at room temperature', () => { + const logic = PartSimulationRegistry.get('ntc-temperature-sensor')!; + const adc = makeADC(); + const sim = makeSimulator(adc); + const element = makeElement(); + + logic.attachEvents!(element, sim as any, pinMap({ OUT: 14 })); + + // Pin 14 = ADC channel 0. 2.5V should be stored in channelValues[0] + expect(adc.channelValues[0]).toBeCloseTo(2.5, 2); + }); + + it('does nothing when OUT pin is not connected', () => { + const logic = PartSimulationRegistry.get('ntc-temperature-sensor')!; + const adc = makeADC(); + const sim = makeSimulator(adc); + const element = makeElement(); + + logic.attachEvents!(element, sim as any, noPins); + // ADC should remain zeroed + expect(adc.channelValues[0]).toBe(0); + }); +}); + +// ─── Gas Sensor ────────────────────────────────────────────────────────────── + +describe('gas-sensor — attachEvents', () => { + it('injects baseline analog voltage on AOUT and sets ledPower=true', () => { + const logic = PartSimulationRegistry.get('gas-sensor')!; + const adc = makeADC(); + const sim = makeSimulator(adc); + const el = makeElement() as any; + + logic.attachEvents!(el, sim as any, pinMap({ AOUT: 14, DOUT: 7 })); + + // AOUT → ADC channel 0, baseline 1.5V + expect(adc.channelValues[0]).toBeCloseTo(1.5, 2); + expect(el.ledPower).toBe(true); + }); + + it('registers pin-change listener for DOUT to update ledD0', () => { + const logic = PartSimulationRegistry.get('gas-sensor')!; + const sim = makeSimulator(); + const el = makeElement() as any; + + logic.attachEvents!(el, sim as any, pinMap({ DOUT: 7 })); + + // Should have registered a onPinChange listener for DOUT (pin 7) + expect(sim.pinManager.onPinChange).toHaveBeenCalledWith(7, expect.any(Function)); + + // Simulate DOUT going HIGH → ledD0 should update + const handler = sim.pinManager.onPinChange.mock.calls[0][1]; + handler(7, true); + expect(el.ledD0).toBe(true); + + handler(7, false); + expect(el.ledD0).toBe(false); + }); +}); + +// ─── Flame Sensor ──────────────────────────────────────────────────────────── + +describe('flame-sensor — attachEvents', () => { + it('injects baseline analog voltage on AOUT and sets ledPower=true', () => { + const logic = PartSimulationRegistry.get('flame-sensor')!; + const adc = makeADC(); + const sim = makeSimulator(adc); + const el = makeElement() as any; + + logic.attachEvents!(el, sim as any, pinMap({ AOUT: 14 })); + + expect(adc.channelValues[0]).toBeCloseTo(1.5, 2); + expect(el.ledPower).toBe(true); + }); + + it('updates ledSignal when DOUT pin state changes', () => { + const logic = PartSimulationRegistry.get('flame-sensor')!; + const sim = makeSimulator(); + const el = makeElement() as any; + + logic.attachEvents!(el, sim as any, pinMap({ DOUT: 8 })); + + expect(sim.pinManager.onPinChange).toHaveBeenCalledWith(8, expect.any(Function)); + + const handler = sim.pinManager.onPinChange.mock.calls[0][1]; + handler(8, true); + expect(el.ledSignal).toBe(true); + handler(8, false); + expect(el.ledSignal).toBe(false); + }); +}); + +// ─── Heart Beat Sensor ─────────────────────────────────────────────────────── + +describe('heart-beat-sensor — attachEvents', () => { + it('starts OUT pin LOW and sets up an interval for pulse generation', () => { + const logic = PartSimulationRegistry.get('heart-beat-sensor')!; + const sim = makeSimulator(); + const element = makeElement(); + + logic.attachEvents!(element, sim as any, pinMap({ OUT: 14 })); + + // Should start LOW + expect(sim.setPinState).toHaveBeenCalledWith(14, false); + // Should have called setInterval + expect(setInterval).toHaveBeenCalled(); + }); + + it('clears the interval on cleanup', () => { + const logic = PartSimulationRegistry.get('heart-beat-sensor')!; + const sim = makeSimulator(); + const element = makeElement(); + + const cleanup = logic.attachEvents!(element, sim as any, pinMap({ OUT: 14 })); + cleanup(); + + expect(clearInterval).toHaveBeenCalledWith(42); // 42 is the mock return from setInterval + }); + + it('does nothing when OUT pin is not connected', () => { + const logic = PartSimulationRegistry.get('heart-beat-sensor')!; + const sim = makeSimulator(); + const element = makeElement(); + + logic.attachEvents!(element, sim as any, noPins); + expect(setInterval).not.toHaveBeenCalled(); + }); +}); + +// ─── Big Sound Sensor ──────────────────────────────────────────────────────── + +describe('big-sound-sensor — attachEvents', () => { + it('injects 2.5V on AOUT and sets led2=true (power LED)', () => { + const logic = PartSimulationRegistry.get('big-sound-sensor')!; + const adc = makeADC(); + const sim = makeSimulator(adc); + const el = makeElement() as any; + + logic.attachEvents!(el, sim as any, pinMap({ AOUT: 14 })); + + expect(adc.channelValues[0]).toBeCloseTo(2.5, 2); + expect(el.led2).toBe(true); + }); + + it('updates led1 when DOUT pin changes', () => { + const logic = PartSimulationRegistry.get('big-sound-sensor')!; + const sim = makeSimulator(); + const el = makeElement() as any; + + logic.attachEvents!(el, sim as any, pinMap({ DOUT: 9 })); + + expect(sim.pinManager.onPinChange).toHaveBeenCalledWith(9, expect.any(Function)); + const handler = sim.pinManager.onPinChange.mock.calls[0][1]; + handler(9, true); expect(el.led1).toBe(true); + handler(9, false); expect(el.led1).toBe(false); + }); +}); + +// ─── Small Sound Sensor ────────────────────────────────────────────────────── + +describe('small-sound-sensor — attachEvents', () => { + it('injects 2.5V on AOUT and sets ledPower=true', () => { + const logic = PartSimulationRegistry.get('small-sound-sensor')!; + const adc = makeADC(); + const sim = makeSimulator(adc); + const el = makeElement() as any; + + logic.attachEvents!(el, sim as any, pinMap({ AOUT: 14 })); + + expect(adc.channelValues[0]).toBeCloseTo(2.5, 2); + expect(el.ledPower).toBe(true); + }); + + it('updates ledSignal when DOUT pin changes', () => { + const logic = PartSimulationRegistry.get('small-sound-sensor')!; + const sim = makeSimulator(); + const el = makeElement() as any; + + logic.attachEvents!(el, sim as any, pinMap({ DOUT: 10 })); + + const handler = sim.pinManager.onPinChange.mock.calls[0][1]; + handler(10, true); expect(el.ledSignal).toBe(true); + handler(10, false); expect(el.ledSignal).toBe(false); + }); +}); + +// ─── Stepper Motor ─────────────────────────────────────────────────────────── + +describe('stepper-motor — attachEvents', () => { + it('registers pin-change listeners for all 4 coil pins', () => { + const logic = PartSimulationRegistry.get('stepper-motor')!; + const sim = makeSimulator(); + const el = makeElement() as any; + el.angle = 0; + + const pins = { 'A-': 4, 'A+': 5, 'B+': 6, 'B-': 7 }; + logic.attachEvents!(el, sim as any, pinMap(pins)); + + expect(sim.pinManager.onPinChange).toHaveBeenCalledTimes(4); + const registeredPins = sim.pinManager.onPinChange.mock.calls.map(([p]: [number]) => p); + expect(registeredPins).toEqual(expect.arrayContaining([4, 5, 6, 7])); + }); + + it('advances angle by 1.8° per forward step (full-step sequence)', () => { + const logic = PartSimulationRegistry.get('stepper-motor')!; + const sim = makeSimulator(); + const el = makeElement() as any; + el.angle = 0; + + const pins = { 'A-': 4, 'A+': 5, 'B+': 6, 'B-': 7 }; + logic.attachEvents!(el, sim as any, pinMap(pins)); + + // Collect handlers indexed by pin number + const handlers: Record void> = {}; + for (const [pin, handler] of sim.pinManager.onPinChange.mock.calls) { + handlers[pin as number] = handler; + } + + // Step 0: A+ = HIGH (others LOW) + handlers[5]?.(5, true); // A+ + + // Step 1: B+ = HIGH, A+ = LOW → should advance angle + handlers[5]?.(5, false); // A+ LOW + handlers[6]?.(6, true); // B+ HIGH + + expect(el.angle).toBeCloseTo(1.8, 1); + }); + + it('does nothing with zero coil pins connected', () => { + const logic = PartSimulationRegistry.get('stepper-motor')!; + const sim = makeSimulator(); + const el = makeElement() as any; + el.angle = 0; + + logic.attachEvents!(el, sim as any, noPins); + + expect(sim.pinManager.onPinChange).not.toHaveBeenCalled(); + expect(el.angle).toBe(0); + }); +}); + +// ─── LED Ring (NeoPixel) ───────────────────────────────────────────────────── + +describe('led-ring — attachEvents', () => { + it('registers a pin-change listener on the DIN pin', () => { + const logic = PartSimulationRegistry.get('led-ring')!; + const sim = makeSimulator(); + sim.cpu = { data: new Uint8Array(512), cycles: 0 } as any; + const el = makeElement() as any; + el.setPixel = vi.fn(); + + logic.attachEvents!(el, sim as any, pinMap({ DIN: 6 })); + + expect(sim.pinManager.onPinChange).toHaveBeenCalledWith(6, expect.any(Function)); + }); + + it('does nothing when DIN pin is not connected', () => { + const logic = PartSimulationRegistry.get('led-ring')!; + const sim = makeSimulator(); + const el = makeElement() as any; + + const cleanup = logic.attachEvents!(el, sim as any, noPins); + expect(cleanup).toBeDefined(); + expect(sim.pinManager.onPinChange).not.toHaveBeenCalled(); + }); +}); + +// ─── NeoPixel Matrix ───────────────────────────────────────────────────────── + +describe('neopixel-matrix — attachEvents', () => { + it('registers a pin-change listener on the DIN pin', () => { + const logic = PartSimulationRegistry.get('neopixel-matrix')!; + const sim = makeSimulator(); + sim.cpu = { data: new Uint8Array(512), cycles: 0 } as any; + const el = makeElement() as any; + el.setPixel = vi.fn(); + el.cols = 8; + + logic.attachEvents!(el, sim as any, pinMap({ DIN: 6 })); + + expect(sim.pinManager.onPinChange).toHaveBeenCalledWith(6, expect.any(Function)); + }); +}); diff --git a/frontend/src/__tests__/simulation-parts.test.ts b/frontend/src/__tests__/simulation-parts.test.ts index 979ca7a..6dd6d2b 100644 --- a/frontend/src/__tests__/simulation-parts.test.ts +++ b/frontend/src/__tests__/simulation-parts.test.ts @@ -21,6 +21,8 @@ import { PartSimulationRegistry } from '../simulation/parts/PartSimulationRegist // Side-effect imports — register all parts import '../simulation/parts/BasicParts'; import '../simulation/parts/ComplexParts'; +import '../simulation/parts/ChipParts'; +import '../simulation/parts/SensorParts'; // ─── RAF depth-limited mock ─────────────────────────────────────────────────── // Calls the callback once synchronously but prevents re-entrancy so that diff --git a/frontend/src/simulation/parts/BasicParts.ts b/frontend/src/simulation/parts/BasicParts.ts index 2c4cf1e..bbcb955 100644 --- a/frontend/src/simulation/parts/BasicParts.ts +++ b/frontend/src/simulation/parts/BasicParts.ts @@ -164,33 +164,148 @@ PartSimulationRegistry.register('led-bar-graph', { }, }); +// NOTE: '7segment' is registered in ChipParts.ts which supports both direct-drive +// and 74HC595-driven modes. Do not re-register it here. + +// ─── KY-040 Rotary Encoder ─────────────────────────────────────────────────── + /** - * 7-Segment Display - * Pins: A, B, C, D, E, F, G, DP (common cathode — segments light when HIGH) - * The wokwi-7segment 'values' property is an array of 8 values (A B C D E F G DP) + * KY-040 rotary encoder — maps element events to Arduino CLK/DT/SW pins. + * + * The element emits: + * - 'rotate-cw' → clockwise step + * - 'rotate-ccw' → counter-clockwise step + * - 'button-press' → push-button pressed + * - 'button-release' → push-button released + * + * Most Arduino encoder libraries sample CLK and read DT on a CLK rising edge: + * DT LOW on CLK rising → clockwise + * DT HIGH on CLK rising → counter-clockwise + * + * The SW pin is active LOW (HIGH when not pressed). */ -PartSimulationRegistry.register('7segment', { - attachEvents: (element, avrSimulator, getArduinoPinHelper) => { - const pinManager = (avrSimulator as any).pinManager; - if (!pinManager) return () => { }; +PartSimulationRegistry.register('ky-040', { + attachEvents: (element, simulator, getArduinoPinHelper) => { + const pinCLK = getArduinoPinHelper('CLK'); + const pinDT = getArduinoPinHelper('DT'); + const pinSW = getArduinoPinHelper('SW'); - // Order matches wokwi-elements values array: [A, B, C, D, E, F, G, DP] - const segmentPinNames = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'DP']; - const values = new Array(8).fill(0); - const unsubscribers: (() => void)[] = []; + // SW starts HIGH (not pressed, active LOW) + if (pinSW !== null) simulator.setPinState(pinSW, true); + // CLK and DT start HIGH (idle) + if (pinCLK !== null) simulator.setPinState(pinCLK, true); + if (pinDT !== null) simulator.setPinState(pinDT, true); - segmentPinNames.forEach((segName, idx) => { - const pin = getArduinoPinHelper(segName); - if (pin !== null) { - unsubscribers.push( - pinManager.onPinChange(pin, (_p: number, state: boolean) => { - values[idx] = state ? 1 : 0; - (element as any).values = [...values]; - }) - ); + /** Emit one encoder pulse: set DT to dtLevel, pulse CLK HIGH→LOW. */ + function emitPulse(dtLevel: boolean) { + if (pinDT !== null) simulator.setPinState(pinDT, dtLevel); + if (pinCLK !== null) { + simulator.setPinState(pinCLK, false); // CLK LOW first + // Small delay then CLK rising edge (encoder sampled on rising edge) + setTimeout(() => { + if (pinCLK !== null) simulator.setPinState(pinCLK, true); + setTimeout(() => { + if (pinCLK !== null) simulator.setPinState(pinCLK, false); + if (pinDT !== null) simulator.setPinState(pinDT, true); // restore DT + }, 1); + }, 1); } - }); + } - return () => unsubscribers.forEach(u => u()); + const onCW = () => emitPulse(false); // DT LOW = CW + const onCCW = () => emitPulse(true); // DT HIGH = CCW + const onPress = () => { if (pinSW !== null) simulator.setPinState(pinSW, false); }; + const onRelease = () => { if (pinSW !== null) simulator.setPinState(pinSW, true); }; + + element.addEventListener('rotate-cw', onCW); + element.addEventListener('rotate-ccw', onCCW); + element.addEventListener('button-press', onPress); + element.addEventListener('button-release', onRelease); + + return () => { + element.removeEventListener('rotate-cw', onCW); + element.removeEventListener('rotate-ccw', onCCW); + element.removeEventListener('button-press', onPress); + element.removeEventListener('button-release', onRelease); + }; + }, +}); + +// ─── Biaxial Stepper Motor ──────────────────────────────────────────────────── + +/** + * Biaxial stepper motor — monitors 8 coil pins for two independent motors. + * + * Motor 1 pins: A1-, A1+, B1+, B1- → outerHandAngle + * Motor 2 pins: A2-, A2+, B2+, B2- → innerHandAngle + * + * Full-step decode: each motor uses the same 4-step lookup table as + * the single stepper-motor. 1.8° per step. + */ +PartSimulationRegistry.register('biaxial-stepper', { + attachEvents: (element, simulator, getArduinoPinHelper) => { + const pinManager = (simulator as any).pinManager; + if (!pinManager) return () => {}; + + const el = element as any; + const STEP_ANGLE = 1.8; + + // Full-step table: [A+, B+, A-, B-] + const stepTable: [boolean, boolean, boolean, boolean][] = [ + [true, false, false, false], + [false, true, false, false], + [false, false, true, false], + [false, false, false, true], + ]; + + function stepIndexFromCoils(ap: boolean, bp: boolean, am: boolean, bm: boolean): number { + for (let i = 0; i < stepTable.length; i++) { + const [tap, tbp, tam, tbm] = stepTable[i]; + if (ap === tap && bp === tbp && am === tam && bm === tbm) return i; + } + return -1; + } + + function makeMotorTracker( + pinAminus: number | null, pinAplus: number | null, + pinBplus: number | null, pinBminus: number | null, + setAngle: (deg: number) => void, + ) { + let aMinus = false, aPlus = false, bPlus = false, bMinus = false; + let cumAngle = 0; + let prevIdx = -1; + const unsubs: (() => void)[] = []; + + function onCoilChange() { + const idx = stepIndexFromCoils(aPlus, bPlus, aMinus, bMinus); + if (idx < 0) return; + if (prevIdx < 0) { prevIdx = idx; return; } + const diff = (idx - prevIdx + 4) % 4; + if (diff === 1) cumAngle += STEP_ANGLE; + else if (diff === 3) cumAngle -= STEP_ANGLE; + prevIdx = idx; + setAngle(((cumAngle % 360) + 360) % 360); + } + + if (pinAminus !== null) unsubs.push(pinManager.onPinChange(pinAminus, (_: number, s: boolean) => { aMinus = s; onCoilChange(); })); + if (pinAplus !== null) unsubs.push(pinManager.onPinChange(pinAplus, (_: number, s: boolean) => { aPlus = s; onCoilChange(); })); + if (pinBplus !== null) unsubs.push(pinManager.onPinChange(pinBplus, (_: number, s: boolean) => { bPlus = s; onCoilChange(); })); + if (pinBminus !== null) unsubs.push(pinManager.onPinChange(pinBminus, (_: number, s: boolean) => { bMinus = s; onCoilChange(); })); + + return () => unsubs.forEach(u => u()); + } + + const cleanup1 = makeMotorTracker( + getArduinoPinHelper('A1-'), getArduinoPinHelper('A1+'), + getArduinoPinHelper('B1+'), getArduinoPinHelper('B1-'), + (deg) => { el.outerHandAngle = deg; }, + ); + const cleanup2 = makeMotorTracker( + getArduinoPinHelper('A2-'), getArduinoPinHelper('A2+'), + getArduinoPinHelper('B2+'), getArduinoPinHelper('B2-'), + (deg) => { el.innerHandAngle = deg; }, + ); + + return () => { cleanup1(); cleanup2(); }; }, }); diff --git a/frontend/src/simulation/parts/ComplexParts.ts b/frontend/src/simulation/parts/ComplexParts.ts index db23b30..9500188 100644 --- a/frontend/src/simulation/parts/ComplexParts.ts +++ b/frontend/src/simulation/parts/ComplexParts.ts @@ -1,43 +1,10 @@ import { PartSimulationRegistry } from './PartSimulationRegistry'; import type { AnySimulator } from './PartSimulationRegistry'; import { RP2040Simulator } from '../RP2040Simulator'; +import { getADC, setAdcVoltage } from './partUtils'; // ─── Helpers ──────────────────────────────────────────────────────────────── -/** Read the ADC instance from the simulator (returns null if not initialized) */ -function getADC(avrSimulator: AnySimulator): any | null { - return (avrSimulator as any).getADC?.() ?? null; -} - -/** - * Write an analog voltage to an ADC channel, supporting both AVR and RP2040. - * - * AVR: pins 14-19 → ADC channels 0-5, voltage stored directly (0-5V) - * RP2040: GPIO 26-29 → ADC channels 0-3, converted to 12-bit value (0-4095) - */ -function setAdcVoltage(simulator: AnySimulator, pin: number, voltage: number): boolean { - // RP2040: GPIO26-29 → ADC channels 0-3 - if (simulator instanceof RP2040Simulator) { - if (pin >= 26 && pin <= 29) { - const channel = pin - 26; - // RP2040 ADC: 12-bit, 3.3V reference - const adcValue = Math.round((voltage / 3.3) * 4095); - console.log(`[setAdcVoltage] RP2040 ch${channel} = ${adcValue} (${voltage.toFixed(3)}V)`); - simulator.setADCValue(channel, adcValue); - return true; - } - console.warn(`[setAdcVoltage] RP2040 pin ${pin} is not an ADC pin (26-29)`); - return false; - } - // AVR: pins 14-19 → ADC channels 0-5 - if (pin < 14 || pin > 19) return false; - const channel = pin - 14; - const adc = getADC(simulator); - if (!adc) return false; - adc.channelValues[channel] = voltage; - return true; -} - // ─── RGB LED (PWM-aware) ───────────────────────────────────────────────────── /** diff --git a/frontend/src/simulation/parts/SensorParts.ts b/frontend/src/simulation/parts/SensorParts.ts new file mode 100644 index 0000000..2698115 --- /dev/null +++ b/frontend/src/simulation/parts/SensorParts.ts @@ -0,0 +1,491 @@ +/** + * SensorParts.ts — Simulation logic for sensors, stepper motor, and NeoPixel devices. + * + * Implements: + * - tilt-switch + * - ntc-temperature-sensor + * - gas-sensor (MQ-series) + * - flame-sensor + * - heart-beat-sensor + * - big-sound-sensor + * - small-sound-sensor + * - stepper-motor (NEMA full-step decode) + * - led-ring (WS2812B NeoPixel ring) + * - neopixel-matrix (WS2812B NeoPixel matrix) + */ + +import { PartSimulationRegistry } from './PartSimulationRegistry'; +import { setAdcVoltage } from './partUtils'; + +// ─── Tilt Switch ───────────────────────────────────────────────────────────── + +/** + * Tilt switch — click the element to toggle between tilted (OUT HIGH) and + * upright (OUT LOW). Starts upright (LOW). + */ +PartSimulationRegistry.register('tilt-switch', { + attachEvents: (element, simulator, getArduinoPinHelper) => { + const pin = getArduinoPinHelper('OUT'); + if (pin === null) return () => {}; + + let tilted = false; + + const onClick = () => { + tilted = !tilted; + simulator.setPinState(pin, tilted); + console.log(`[TiltSwitch] pin ${pin} → ${tilted ? 'HIGH' : 'LOW'}`); + }; + + // Start LOW (upright) + simulator.setPinState(pin, false); + element.addEventListener('click', onClick); + return () => element.removeEventListener('click', onClick); + }, +}); + +// ─── NTC Temperature Sensor ────────────────────────────────────────────────── + +/** + * NTC thermistor sensor — injects a mid-range analog voltage on the OUT pin + * representing room temperature (~25°C, ~2.5V on a 5V divider). + * Listens to `input` events in case the element ever gains a drag slider. + */ +PartSimulationRegistry.register('ntc-temperature-sensor', { + attachEvents: (element, simulator, getArduinoPinHelper) => { + const pin = getArduinoPinHelper('OUT'); + if (pin === null) return () => {}; + + // Room temperature default (2.5V = mid-range) + setAdcVoltage(simulator, pin, 2.5); + + const onInput = () => { + const val = (element as any).value; + if (val !== undefined) { + setAdcVoltage(simulator, pin, (val / 1023.0) * 5.0); + } + }; + element.addEventListener('input', onInput); + return () => element.removeEventListener('input', onInput); + }, +}); + +// ─── Gas Sensor (MQ-series) ────────────────────────────────────────────────── + +/** + * Gas sensor — injects a low baseline voltage on AOUT (clean air), + * shows power LED. When Arduino drives DOUT → updates threshold LED D0. + */ +PartSimulationRegistry.register('gas-sensor', { + attachEvents: (element, simulator, getArduinoPinHelper) => { + const pinAOUT = getArduinoPinHelper('AOUT'); + const pinDOUT = getArduinoPinHelper('DOUT'); + const pinManager = (simulator as any).pinManager; + + const el = element as any; + el.ledPower = true; + + const unsubscribers: (() => void)[] = []; + + // Inject baseline analog voltage (1.5V ≈ clean air / low gas) + if (pinAOUT !== null) { + setAdcVoltage(simulator, pinAOUT, 1.5); + } + + // DOUT from Arduino → threshold LED indicator + if (pinDOUT !== null && pinManager) { + unsubscribers.push( + pinManager.onPinChange(pinDOUT, (_: number, state: boolean) => { + el.ledD0 = state; + }) + ); + } + + // Allow element to update analog value if it fires input events + const onInput = () => { + const val = (el as any).value; + if (val !== undefined && pinAOUT !== null) { + setAdcVoltage(simulator, pinAOUT, (val / 1023.0) * 5.0); + } + }; + element.addEventListener('input', onInput); + unsubscribers.push(() => element.removeEventListener('input', onInput)); + + return () => unsubscribers.forEach(u => u()); + }, +}); + +// ─── Flame Sensor ──────────────────────────────────────────────────────────── + +/** + * Flame sensor — injects a low baseline voltage on AOUT (no flame), + * shows power LED. Arduino driving DOUT → updates signal LED. + */ +PartSimulationRegistry.register('flame-sensor', { + attachEvents: (element, simulator, getArduinoPinHelper) => { + const pinAOUT = getArduinoPinHelper('AOUT'); + const pinDOUT = getArduinoPinHelper('DOUT'); + const pinManager = (simulator as any).pinManager; + + const el = element as any; + el.ledPower = true; + + const unsubscribers: (() => void)[] = []; + + if (pinAOUT !== null) { + setAdcVoltage(simulator, pinAOUT, 1.5); + } + + if (pinDOUT !== null && pinManager) { + unsubscribers.push( + pinManager.onPinChange(pinDOUT, (_: number, state: boolean) => { + el.ledSignal = state; + }) + ); + } + + const onInput = () => { + const val = (el as any).value; + if (val !== undefined && pinAOUT !== null) { + setAdcVoltage(simulator, pinAOUT, (val / 1023.0) * 5.0); + } + }; + element.addEventListener('input', onInput); + unsubscribers.push(() => element.removeEventListener('input', onInput)); + + return () => unsubscribers.forEach(u => u()); + }, +}); + +// ─── Heart Beat Sensor ─────────────────────────────────────────────────────── + +/** + * Heart beat sensor — simulates a 60 BPM signal on OUT pin. + * Every 1000ms: briefly pulls OUT HIGH for 100ms, then LOW again. + */ +PartSimulationRegistry.register('heart-beat-sensor', { + attachEvents: (element, simulator, getArduinoPinHelper) => { + const pin = getArduinoPinHelper('OUT'); + if (pin === null) return () => {}; + + simulator.setPinState(pin, false); + + const intervalId = setInterval(() => { + simulator.setPinState(pin, true); // pulse HIGH + setTimeout(() => simulator.setPinState(pin, false), 100); + }, 1000); + + return () => clearInterval(intervalId); + }, +}); + +// ─── Big Sound Sensor ──────────────────────────────────────────────────────── + +/** + * Big sound sensor (FC-04) — injects mid-range analog on AOUT, + * shows power LED (led2). Arduino driving DOUT → signal LED (led1). + */ +PartSimulationRegistry.register('big-sound-sensor', { + attachEvents: (element, simulator, getArduinoPinHelper) => { + const pinAOUT = getArduinoPinHelper('AOUT'); + const pinDOUT = getArduinoPinHelper('DOUT'); + const pinManager = (simulator as any).pinManager; + + const el = element as any; + el.led2 = true; // Power LED + + const unsubscribers: (() => void)[] = []; + + if (pinAOUT !== null) { + setAdcVoltage(simulator, pinAOUT, 2.5); + } + + if (pinDOUT !== null && pinManager) { + unsubscribers.push( + pinManager.onPinChange(pinDOUT, (_: number, state: boolean) => { + el.led1 = state; + }) + ); + } + + const onInput = () => { + const val = (el as any).value; + if (val !== undefined && pinAOUT !== null) { + setAdcVoltage(simulator, pinAOUT, (val / 1023.0) * 5.0); + } + }; + element.addEventListener('input', onInput); + unsubscribers.push(() => element.removeEventListener('input', onInput)); + + return () => unsubscribers.forEach(u => u()); + }, +}); + +// ─── Small Sound Sensor ────────────────────────────────────────────────────── + +/** + * Small sound sensor (KY-038) — injects mid-range analog on AOUT, + * shows power LED. Arduino driving DOUT → signal LED. + */ +PartSimulationRegistry.register('small-sound-sensor', { + attachEvents: (element, simulator, getArduinoPinHelper) => { + const pinAOUT = getArduinoPinHelper('AOUT'); + const pinDOUT = getArduinoPinHelper('DOUT'); + const pinManager = (simulator as any).pinManager; + + const el = element as any; + el.ledPower = true; + + const unsubscribers: (() => void)[] = []; + + if (pinAOUT !== null) { + setAdcVoltage(simulator, pinAOUT, 2.5); + } + + if (pinDOUT !== null && pinManager) { + unsubscribers.push( + pinManager.onPinChange(pinDOUT, (_: number, state: boolean) => { + el.ledSignal = state; + }) + ); + } + + const onInput = () => { + const val = (el as any).value; + if (val !== undefined && pinAOUT !== null) { + setAdcVoltage(simulator, pinAOUT, (val / 1023.0) * 5.0); + } + }; + element.addEventListener('input', onInput); + unsubscribers.push(() => element.removeEventListener('input', onInput)); + + return () => unsubscribers.forEach(u => u()); + }, +}); + +// ─── Stepper Motor (NEMA full-step decode) ─────────────────────────────────── + +/** + * Stepper motor — monitors the 4 coil pins (A-, A+, B+, B-). + * Uses a full-step lookup table to detect direction of rotation and + * accumulates the shaft angle (1.8° per step = 200 steps per revolution). + * + * Full-step sequence (active-HIGH per coil): + * Step 0: A+ = 1, B+ = 0, A- = 0, B- = 0 + * Step 1: A+ = 0, B+ = 1, A- = 0, B- = 0 + * Step 2: A+ = 0, B+ = 0, A- = 1, B- = 0 + * Step 3: A+ = 0, B+ = 0, A- = 0, B- = 1 + */ +PartSimulationRegistry.register('stepper-motor', { + attachEvents: (element, simulator, getArduinoPinHelper) => { + const pinManager = (simulator as any).pinManager; + if (!pinManager) return () => {}; + + const el = element as any; + const STEP_ANGLE = 1.8; // degrees per step + + const pinAMinus = getArduinoPinHelper('A-'); + const pinAPlus = getArduinoPinHelper('A+'); + const pinBPlus = getArduinoPinHelper('B+'); + const pinBMinus = getArduinoPinHelper('B-'); + + const coils = { aMinus: false, aPlus: false, bPlus: false, bMinus: false }; + let cumAngle = el.angle ?? 0; + let prevStepIndex = -1; + + // Full-step table: index → [A+, B+, A-, B-] + const stepTable: [boolean, boolean, boolean, boolean][] = [ + [true, false, false, false], // step 0 + [false, true, false, false], // step 1 + [false, false, true, false], // step 2 + [false, false, false, true], // step 3 + ]; + + function coilToStepIndex(): number { + for (let i = 0; i < stepTable.length; i++) { + const [ap, bp, am, bm] = stepTable[i]; + if (coils.aPlus === ap && coils.bPlus === bp && + coils.aMinus === am && coils.bMinus === bm) { + return i; + } + } + return -1; // energized coil pattern not in full-step table + } + + function onCoilChange() { + const idx = coilToStepIndex(); + if (idx < 0) return; // half-step or off state — ignore + if (prevStepIndex < 0) { prevStepIndex = idx; return; } + + const diff = (idx - prevStepIndex + 4) % 4; + if (diff === 1) { + cumAngle += STEP_ANGLE; + } else if (diff === 3) { + cumAngle -= STEP_ANGLE; + } + prevStepIndex = idx; + el.angle = ((cumAngle % 360) + 360) % 360; + } + + const unsubscribers: (() => void)[] = []; + + if (pinAMinus !== null) { + unsubscribers.push(pinManager.onPinChange(pinAMinus, (_: number, s: boolean) => { + coils.aMinus = s; onCoilChange(); + })); + } + if (pinAPlus !== null) { + unsubscribers.push(pinManager.onPinChange(pinAPlus, (_: number, s: boolean) => { + coils.aPlus = s; onCoilChange(); + })); + } + if (pinBPlus !== null) { + unsubscribers.push(pinManager.onPinChange(pinBPlus, (_: number, s: boolean) => { + coils.bPlus = s; onCoilChange(); + })); + } + if (pinBMinus !== null) { + unsubscribers.push(pinManager.onPinChange(pinBMinus, (_: number, s: boolean) => { + coils.bMinus = s; onCoilChange(); + })); + } + + return () => unsubscribers.forEach(u => u()); + }, +}); + +// ─── WS2812B NeoPixel decode helper ────────────────────────────────────────── + +/** + * Decode WS2812B bit-stream from DIN pin changes for NeoPixel devices. + * + * Protocol (800 kHz, 16 MHz AVR: 1 tick = 62.5 ns): + * - bit 0: HIGH for ~0.35µs (≤8 cycles); LOW for ~0.80µs + * - bit 1: HIGH for ~0.70µs (>8 cycles); LOW for ~0.40µs + * - RESET: LOW for >50µs (≥800 cycles) + * + * We measure HIGH pulse_width via cpu.cycles difference. + * 8 bits (GRB order from WS2812B) → 1 byte; 3 bytes → 1 pixel. + */ +function createNeopixelDecoder( + simulator: any, + pinDIN: number, + onPixel: (index: number, r: number, g: number, b: number) => void, +): () => void { + const pinManager = simulator.pinManager; + if (!pinManager) return () => {}; + + const CPU_CYCLES_PER_US = 16; // 16 MHz + const RESET_CYCLES = 800; // 50µs × 16 cycles/µs + const BIT1_THRESHOLD = 8; // ~0.5µs threshold between bit-0 and bit-1 + + let lastRisingCycle = 0; + let lastFallingCycle = 0; + let lastHigh = false; + + let bitBuf = 0; + let bitsCollected = 0; + let byteBuf: number[] = []; + let pixelIndex = 0; + + const unsub = pinManager.onPinChange(pinDIN, (_: number, high: boolean) => { + const cpu = simulator.cpu ?? (simulator as any).cpu; + const now: number = cpu?.cycles ?? 0; + + if (high) { + // Rising edge — check if preceding LOW was a RESET + const lowDur = now - lastFallingCycle; + if (lowDur > RESET_CYCLES) { + // RESET pulse received — flush and restart + pixelIndex = 0; + byteBuf = []; + bitBuf = 0; + bitsCollected = 0; + } + lastRisingCycle = now; + lastHigh = true; + } else { + // Falling edge — measure HIGH pulse width + if (lastHigh) { + const highDur = now - lastRisingCycle; + const bit = highDur > BIT1_THRESHOLD ? 1 : 0; + + // WS2812B transmits MSB first + bitBuf = (bitBuf << 1) | bit; + bitsCollected++; + + if (bitsCollected === 8) { + byteBuf.push(bitBuf & 0xFF); + bitBuf = 0; + bitsCollected = 0; + + if (byteBuf.length === 3) { + // WS2812B byte order is GRB + const g = byteBuf[0]; + const r = byteBuf[1]; + const b = byteBuf[2]; + onPixel(pixelIndex++, r, g, b); + byteBuf = []; + } + } + } + lastFallingCycle = now; + lastHigh = false; + } + }); + + return unsub; +} + +// ─── LED Ring (WS2812B NeoPixel ring) ──────────────────────────────────────── + +PartSimulationRegistry.register('led-ring', { + attachEvents: (element, simulator, getArduinoPinHelper) => { + const pinDIN = getArduinoPinHelper('DIN'); + if (pinDIN === null) return () => {}; + + const el = element as any; + + const unsub = createNeopixelDecoder( + (simulator as any), + pinDIN, + (index, r, g, b) => { + try { + el.setPixel(index, { r, g, b }); + } catch (_) { + // setPixel not yet available (element not upgraded) — ignore + } + }, + ); + + return unsub; + }, +}); + +// ─── NeoPixel Matrix (WS2812B matrix grid) ──────────────────────────────────── + +PartSimulationRegistry.register('neopixel-matrix', { + attachEvents: (element, simulator, getArduinoPinHelper) => { + const pinDIN = getArduinoPinHelper('DIN'); + if (pinDIN === null) return () => {}; + + const el = element as any; + + const unsub = createNeopixelDecoder( + (simulator as any), + pinDIN, + (index, r, g, b) => { + // cols is set by the element property (default 8) + const cols: number = el.cols ?? 8; + const row = Math.floor(index / cols); + const col = index % cols; + try { + el.setPixel(row, col, { r, g, b }); + } catch (_) { + // ignore + } + }, + ); + + return unsub; + }, +}); diff --git a/frontend/src/simulation/parts/index.ts b/frontend/src/simulation/parts/index.ts index c7f2b58..df05b33 100644 --- a/frontend/src/simulation/parts/index.ts +++ b/frontend/src/simulation/parts/index.ts @@ -2,3 +2,4 @@ export * from './PartSimulationRegistry'; import './BasicParts'; import './ComplexParts'; import './ChipParts'; +import './SensorParts'; diff --git a/frontend/src/simulation/parts/partUtils.ts b/frontend/src/simulation/parts/partUtils.ts new file mode 100644 index 0000000..1e0295b --- /dev/null +++ b/frontend/src/simulation/parts/partUtils.ts @@ -0,0 +1,45 @@ +/** + * partUtils.ts — Shared simulation helpers + * + * Provides ADC voltage injection utilities used by both ComplexParts and + * SensorParts, supporting both AVR (ATmega328p) and RP2040 boards. + */ + +import type { AnySimulator } from './PartSimulationRegistry'; +import { RP2040Simulator } from '../RP2040Simulator'; + +/** Read the ADC instance from the simulator (returns null if not initialized) */ +export function getADC(avrSimulator: AnySimulator): any | null { + return (avrSimulator as any).getADC?.() ?? null; +} + +/** + * Write an analog voltage to an ADC channel, supporting both AVR and RP2040. + * + * AVR: pins 14-19 → ADC channels 0-5, voltage stored directly (0-5V) + * RP2040: GPIO 26-29 → ADC channels 0-3, converted to 12-bit value (0-4095) + * + * Returns true if the voltage was successfully injected. + */ +export function setAdcVoltage(simulator: AnySimulator, pin: number, voltage: number): boolean { + // RP2040: GPIO26-29 → ADC channels 0-3 + if (simulator instanceof RP2040Simulator) { + if (pin >= 26 && pin <= 29) { + const channel = pin - 26; + // RP2040 ADC: 12-bit, 3.3V reference + const adcValue = Math.round((voltage / 3.3) * 4095); + console.log(`[setAdcVoltage] RP2040 ch${channel} = ${adcValue} (${voltage.toFixed(3)}V)`); + simulator.setADCValue(channel, adcValue); + return true; + } + console.warn(`[setAdcVoltage] RP2040 pin ${pin} is not an ADC pin (26-29)`); + return false; + } + // AVR: pins 14-19 → ADC channels 0-5 + if (pin < 14 || pin > 19) return false; + const channel = pin - 14; + const adc = getADC(simulator); + if (!adc) return false; + adc.channelValues[channel] = voltage; + return true; +} diff --git a/frontend/src/vite-env.d.ts b/frontend/src/vite-env.d.ts index 553d84a..aea0ea6 100644 --- a/frontend/src/vite-env.d.ts +++ b/frontend/src/vite-env.d.ts @@ -24,5 +24,18 @@ declare namespace JSX { 'wokwi-pir-motion-sensor': any; 'wokwi-photoresistor-sensor': any; 'wokwi-74hc595': any; + 'wokwi-stepper-motor': any; + 'wokwi-biaxial-stepper': any; + 'wokwi-tilt-switch': any; + 'wokwi-ntc-temperature-sensor': any; + 'wokwi-gas-sensor': any; + 'wokwi-flame-sensor': any; + 'wokwi-heart-beat-sensor': any; + 'wokwi-big-sound-sensor': any; + 'wokwi-small-sound-sensor': any; + 'wokwi-led-ring': any; + 'wokwi-neopixel-matrix': any; + 'wokwi-lcd1602': any; + 'wokwi-ky-040': any; } }