feat(firmware): M1 recording core - mic capture to WAV on SD
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>
This commit is contained in:
parent
031074c9a9
commit
054b2f6981
14 changed files with 508 additions and 43 deletions
|
|
@ -33,11 +33,11 @@ Three sync paths, exactly as specified:
|
|||
- Responsibility: capture audio, store it, manage power/controls, expose control + data
|
||||
over BLE and WiFi, and upload autonomously when powered.
|
||||
- Location: `firmware/` (PlatformIO, Arduino-ESP32, target ESP32-S3).
|
||||
- Modules (planned):
|
||||
- `audio` - I2S mic driver, DMA capture, PSRAM ring buffer, WAV encoder.
|
||||
- `storage`- microSD (FAT) recording files + sidecar JSON metadata.
|
||||
- `recorder` - session state machine (idle/recording), file naming, metadata.
|
||||
- `ux` - button (start/stop, long-press pair), LED/haptic status.
|
||||
- Modules (M1 landed: audio, storage, recorder, ux; rest planned per milestone):
|
||||
- `audio` - I2S/PDM mic capture presenting 16-bit PCM mono (ESP_I2S). [M1]
|
||||
- `storage`- microSD (FAT) streaming WAV writer + sidecar JSON metadata. [M1]
|
||||
- `recorder` - session state machine (idle/recording), file naming, metadata. [M1]
|
||||
- `ux` - button (short-press start/stop) + status LED (haptic later). [M1]
|
||||
- `power` - battery read (ADC), charge/VBUS detect -> mode switch.
|
||||
- `config` - NVS-stored settings (WiFi creds, upload target + keys, codec).
|
||||
- `net_wifi` - WiFi manager (join, reconnect), mDNS.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue