Implements the first working feature: the device records audio to the microSD
card, toggled by the button, with LED status and per-recording JSON metadata.
What changed:
- firmware/src/audio.{h,cpp}: mic capture via the core-bundled ESP_I2S. Dev board
uses I2S standard mode (INMP441/ICS-43434); XIAO uses PDM mode (onboard mic).
Presents 16-bit PCM mono to callers regardless of board.
- firmware/src/storage.{h,cpp}: microSD on a dedicated HSPI bus + a streaming
WavWriter that writes a 44-byte PCM header and patches RIFF/data sizes on close;
plus sidecar JSON metadata writer.
- firmware/src/recorder.{h,cpp}: idle/recording state machine; creates
/recordings/<id>.wav, pumps mic chunks in on update(), finalises + writes
<id>.json (Recording schema from api/openapi.yaml) on stop.
- firmware/src/ux.{h,cpp}: debounced button (short press toggles) + status LED
patterns (idle/recording/error), active-low aware.
- firmware/src/main.cpp: wires ux + recorder; loop toggles on button and drains
the mic while recording.
- firmware/include/audio_config.h: 16 kHz mono 16-bit, chunk size, rec dir.
- firmware/include/pins.h: added XIAO PDM mic + onboard SD pins, LED active-low flag.
- state/: TODO, ARCHITECTURE, NOTES updated for M1 and the deferred follow-ups.
Why:
- Recording is the foundation every later milestone (transfer, upload, transcription)
builds on. Kept dependency-free (only core-bundled ESP_I2S + SD) for simple CI builds.
Notes:
- Not compiled locally (no PlatformIO on the dev host) or hardware-verified; Forgejo
Actions CI builds both board profiles. Follow-ups tracked in state/TODO.md:
INMP441 16-bit level calibration, and real NTP timestamps (ids are uptime-based
until M2 brings WiFi/NTP).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
41 lines
No EOL
1.6 KiB
C
41 lines
No EOL
1.6 KiB
C
// SPDX-License-Identifier: GPL-3.0-only
|
|
// OpenScribe pin map. Defaults match hardware/BOM.md (Build B, ESP32-S3 devkit).
|
|
// Override per board via the OPENSCRIBE_BOARD_* flags set in platformio.ini.
|
|
#pragma once
|
|
|
|
#if defined(OPENSCRIBE_BOARD_XIAO)
|
|
// Seeed XIAO ESP32-S3 Sense: onboard PDM mic + microSD use the Sense board's fixed pins.
|
|
// The audio driver selects the PDM path for this board.
|
|
#define PIN_PDM_CLK 42 // XIAO ESP32-S3 Sense onboard PDM mic clock
|
|
#define PIN_PDM_DIN 41 // XIAO ESP32-S3 Sense onboard PDM mic data
|
|
// XIAO Sense onboard microSD (SDMMC-on-SPI fixed pins)
|
|
#define PIN_SD_CS 21
|
|
#define PIN_SD_SCK 7
|
|
#define PIN_SD_MOSI 9
|
|
#define PIN_SD_MISO 8
|
|
#define PIN_BUTTON 2 // external tactile button to GND
|
|
#define PIN_LED LED_BUILTIN // XIAO onboard user LED (active-low)
|
|
#define PIN_LED_ACTIVE_LOW 1
|
|
#define PIN_VBUS_SENSE -1 // use USB-serial/VBUS API on XIAO
|
|
#define PIN_CHARGE_STAT -1
|
|
|
|
#else // OPENSCRIBE_BOARD_DEV (default)
|
|
// I2S MEMS microphone (INMP441 / ICS-43434)
|
|
#define PIN_I2S_BCLK 4
|
|
#define PIN_I2S_WS 5
|
|
#define PIN_I2S_DIN 6
|
|
|
|
// microSD (SPI mode)
|
|
#define PIN_SD_SCK 12
|
|
#define PIN_SD_MOSI 11
|
|
#define PIN_SD_MISO 13
|
|
#define PIN_SD_CS 10
|
|
|
|
// Controls / status
|
|
#define PIN_BUTTON 7 // active-low, internal pull-up
|
|
#define PIN_LED 48 // plain LED via 330R (WS2812 support added later)
|
|
#define PIN_LED_ACTIVE_LOW 0
|
|
#define PIN_CHARGE_STAT 14 // TP4056 STAT (open-drain)
|
|
#define PIN_VBUS_SENSE 15 // USB 5V present -> on-charge / powered mode
|
|
#define PIN_MOTOR 16 // optional haptic, via transistor
|
|
#endif |