diff --git a/frontend/src/components/simulator/SimulatorCanvas.tsx b/frontend/src/components/simulator/SimulatorCanvas.tsx index 04b6b01a..a9828b58 100644 --- a/frontend/src/components/simulator/SimulatorCanvas.tsx +++ b/frontend/src/components/simulator/SimulatorCanvas.tsx @@ -2731,15 +2731,22 @@ export const SimulatorCanvas = ({ headerSlot }: SimulatorCanvasProps = {}) => { ESP32-CAM (OV2640 over I2S0 DVP) and the XIAO ESP32S3 Sense (OV2640-compatible over LCD_CAM). */} {(activeBoard?.boardKind === 'esp32-cam' || - activeBoard?.boardKind === 'xiao-esp32s3-sense') && ( + activeBoard?.boardKind === 'xiao-esp32s3-sense' || + (activeBoard && + Boolean(getProBoard(activeBoard.boardKind)?.builtInCamera))) && ( (typeof cam === 'object' ? cam.maxFrameBytes : undefined))( + getProBoard(activeBoard.boardKind)?.builtInCamera, + ) } /> )} diff --git a/frontend/src/lib/onlineOnlyBoards.ts b/frontend/src/lib/onlineOnlyBoards.ts index b1be03b9..a53d59b7 100644 --- a/frontend/src/lib/onlineOnlyBoards.ts +++ b/frontend/src/lib/onlineOnlyBoards.ts @@ -47,6 +47,22 @@ export function isOnlineOnlyAdSuppressed(id: string): boolean { } export const ONLINE_ONLY_BOARD_ADS: OnlineOnlyBoardAd[] = [ + { + id: 'esp-eye', + label: 'ESP-EYE', + description: 'Espressif AI vision devkit: ESP32 + OV2640 camera, I2S mic, face-recognition heritage — in-browser emulation', + thumbnailSvg: + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '', + }, { id: 'esp32-c3-lcdkit', label: 'ESP32-C3-LCDkit', diff --git a/frontend/src/lib/proBoardRegistry.ts b/frontend/src/lib/proBoardRegistry.ts index 54318b5a..f8897411 100644 --- a/frontend/src/lib/proBoardRegistry.ts +++ b/frontend/src/lib/proBoardRegistry.ts @@ -105,6 +105,10 @@ export interface ProBoardDef { * setMicrophoneSource (I2S RX sample injection): shows the canvas-header * Mic toggle that streams the computer's microphone into it. */ builtInMicrophone?: boolean; + /** The board carries a camera fed from the host webcam (CameraToggle in the + * canvas header; the bridge implements pushCameraFrame). An object form + * caps the injected JPEG size for drivers with tight frame buffers. */ + builtInCamera?: boolean | { maxFrameBytes?: number }; /** Display-controller identity for panel autodetect probes. Vendor * libraries (M5GFX and friends) identify a board by reading the panel's * RDDID over SPI with the display's own chip-select — and reject the