Commit Graph

35 Commits

Author SHA1 Message Date
Claude
5a2ef4d5f0 docs(02-02): complete ESP32 UDP transport plan — CHR-05 fulfilled
- Add 02-02-SUMMARY.md: ESP32Transport asyncio DatagramProtocol implementation
- Update STATE.md: advance to plan 3/6, 50% overall progress
- Update ROADMAP.md: phase 02 in progress (1/6 summaries)
- Mark CHR-05 complete in REQUIREMENTS.md
2026-04-03 14:21:19 +02:00
Claude
ffc2379784 feat(02-01): bootstrap Python project scaffold with all Phase 2 dependencies
- uv project configured as led-sync-studio, requires-python >= 3.11
- Dependencies declared: miniaudio==1.61, sounddevice==0.5.5, numpy>=2.4.4, pydantic==2.12.5, aubio>=0.4.9
- aubio built from source (no aarch64 wheel on PyPI)
- sounddevice installed; requires libportaudio2 on target system (Raspberry Pi OS)
- dev deps: pytest>=8.0, pytest-asyncio>=0.23
- Tests pass: led_sync importable, all deps installed
2026-04-03 14:21:09 +02:00
Claude
378620e0bb feat(02-02): implement ESP32Transport UDP client with asyncio DatagramProtocol
- ESP32Transport.send_command() injects v:1, fire-and-forget, silent drop if not ready
- 512-byte payload limit enforced with warning log
- datagram_received() parses STATUS ok → connected=True, stores last_status
- on_status callback support for status update notifications
- connection_lost() sets connected=False, clears transport ref
- create_esp32_transport() async factory sends initial STATUS ping (D-12)
- All protocol behaviors match docs/protocol.md exactly (D-10, D-11, D-12, D-14)
- Add pytest-asyncio to dev deps + asyncio_mode=auto for test suite
2026-04-03 14:19:20 +02:00
Claude
f10fcf016e test(02-02): add failing tests for ESP32Transport UDP client
- Tests for send_command() v:1 injection, field preservation
- Tests for stop/brightness commands, pre-connection silent drop
- Tests for 512-byte payload limit enforcement
- Tests for STATUS ok response → connected=True + last_status
- Tests for malformed JSON silent handling, on_status callback
- Tests for send_status_ping, connection_lost, create_esp32_transport factory
- Tests for led_sync.transport package re-exports
2026-04-03 14:18:00 +02:00
Claude
4fe76b65ef docs(state): record phase 2 planning session 2026-04-03 14:14:39 +02:00
Claude
1afa95ffc3 docs(02-app-core-audio): create phase 2 plan (6 plans, 3 waves) 2026-04-03 14:14:07 +02:00
Claude
0cc9990fa7 docs(phase-02): research app core + audio phase
Research covers miniaudio playback, sounddevice+aubio beat detection,
asyncio DatagramProtocol UDP transport, Pydantic v2 choreography models,
absolute monotonic scheduler pattern, and ARM install paths for all deps.
Flags critical aarch64 wheel gaps (aubio, miniaudio) requiring Wave 0
Pi validation before implementation begins.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 14:04:12 +02:00
Claude
2f642daf0c docs(state): record phase 2 context session 2026-04-03 13:53:58 +02:00
Claude
21e7956f35 docs(02): capture phase context 2026-04-03 13:53:54 +02:00
Claude
01b0f3309d docs(phase-01): evolve PROJECT.md after phase completion 2026-04-03 13:42:31 +02:00
Claude
d63a856ee2 docs(phase-01): complete phase execution 2026-04-03 13:42:00 +02:00
Claude
ca49633357 docs(01-04): add self-check section to SUMMARY.md 2026-04-03 13:37:11 +02:00
Claude
1c0bf4a10a docs(01-04): complete integration plan — hardware acceptance approved, Phase 1 COMPLETE
- Task 2 (hardware acceptance checkpoint) approved — all 5 FW requirements pass on physical hardware
- Updated SUMMARY.md to reflect fully complete status with hardware validation results
- STATE.md: progress 100%, session stopped at Phase 1 complete, decision recorded
- ROADMAP.md: Phase 1 4/4 plans complete

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 13:36:54 +02:00
Claude
a737664e78 docs(01-04): complete integration plan — firmware wired, protocol documented, at hardware checkpoint
- 01-04-SUMMARY.md: integration plan summary with hardware acceptance test instructions
- STATE.md: advanced to plan 4 of 4, progress 100%, session updated
- ROADMAP.md: Phase 01 marked Complete (4/4 plans with summaries)
2026-04-03 13:34:32 +02:00
Claude
530e9da957 feat(01-04): wire all subsystems in main.cpp + protocol documentation
- initStrips() → initAnimationEngine() → WiFi → WIFI_PS_NONE → startUdpServer() order
- loop() handles WiFi reconnect: re-enables WIFI_PS_NONE, restarts UDP server
- Startup breathing animation fires during WiFi connect (D-11 compliance)
- D-10 WiFi timeout: continues last animation on disconnect, UDP auto-restarts
- docs/protocol.md: all 8 animations, all commands, zones, port 4210, error handling
2026-04-03 13:32:43 +02:00
Claude
d16445084a docs(01-03): complete animation engine plan — 8 animations, 50fps FreeRTOS task, RGBW support
- SUMMARY documents ANIM_REGISTRY name strings for Pi-side use
- W auto-derive formula documented for Phase 2 reference
- FW-03 (8 animations) and FW-04 (configurable params) requirements marked complete
- STATE updated: plan 4/4, progress 75%, decisions added
2026-04-03 13:30:33 +02:00
Claude
cba4b1789f feat(01-03): 8 animation implementations — Chase, Pulse, Rainbow, Strobe, Color Wash, Breathe, Sparkle, Gradient Sweep
- chase.cpp: moving window of ledCount/10 pixels, speed scales position advance per tick
- pulse.cpp: sine wave brightness oscillation on solid palette color
- rainbow.cpp: HSV rainbow via HsbColor, hue offset advances with tick, no palette (generates own)
- strobe.cpp: period = 20/speed ticks, on/off alternation, high speed = rapid flash
- color_wash.cpp: linear blend between palette colors, hold_ticks = 50/speed
- breathe.cpp: sine envelope, 5% min brightness (never fully off, D-11), slower tempo than pulse
- sparkle.cpp: dim base + random bright pixels via esp_random() hardware RNG
- gradient_sweep.cpp: 2-color gradient sweeps across strip, offset advances with tick
- All 8 handle isRGBW branch, use params.speed/intensity/colors[], call applyBrightnessW/R
2026-04-03 13:28:12 +02:00
Claude
273015a6eb docs(01-02): complete UDP protocol plan — LedCommand struct, AsyncUDP two-queue pattern
- SUMMARY.md with protocol schema documentation for Phase 2 Pi-side reference
- STATE.md: advanced to plan 4/4, progress 50%, decisions logged
- ROADMAP.md: phase 1 updated (2/4 summaries complete)
- REQUIREMENTS.md: FW-02 and FW-05 marked complete
2026-04-03 13:27:33 +02:00
Claude
230be9994e feat(01-02): wifi_server.h/.cpp — AsyncUDP listener with FreeRTOS queue
- RawPacket struct carries raw bytes, IP, port from AsyncUDP callback
- xQueueSendFromISR in callback (ISR-safe) — zero JSON parsing in callback
- parseTask runs in separate FreeRTOS task, drains rawQueue, parses JSON
- STATUS command handled immediately in parseTask with UDP response to sender
- commandQueue declared extern for animation engine (Plan 03) to consume
- main.cpp: include wifi_server.h, call startUdpServer() after WIFI_PS_NONE
2026-04-03 13:25:15 +02:00
Claude
3323a87ce0 feat(01-02): protocol.h/.cpp — JSON parsing into LedCommand
- LedCommand, AnimParams, Zone, CmdType structs with all fields per D-05/D-06
- parseCommand(): validates v:1 version, routes schrank/wand/all zones, parses cmd/animation
- RGBW colors array parsed from params.colors; defaults to single [255,255,255,255]
- buildStatusResponse(): serializes current state to JSON for STATUS cmd reply
- Errors logged to Serial, no UDP response on bad commands (per D-07)
2026-04-03 13:23:48 +02:00
Claude
0d82f9b7ba docs(01-01): complete plan — hardware checkpoint approved, coexistence validated
- Task 4 hardware checkpoint approved: zero flicker during 30s UDP burst test
- WIFI_PS_NONE confirmed working on ESP32-C3 SuperMini
- GPIO3/6/7 pin assignments validated on physical hardware
- Updated SUMMARY.md with hardware test result and plan completion
- STATE.md advanced to plan 3, progress bar updated to 25%
2026-04-03 13:21:53 +02:00
Claude
6548a84ec1 docs(01-01): complete ESP32 firmware scaffold plan — awaiting hardware checkpoint
- 01-01-SUMMARY.md: dual strip driver, WiFi+RMT coexistence test scaffold
- STATE.md: advanced to plan 2, recorded GPIO/SPI/RMT decisions, 25% progress
- ROADMAP.md: phase 1 in-progress (1/4 plans)
- REQUIREMENTS.md: FW-01 marked complete
2026-04-03 13:18:37 +02:00
Claude
88eb8d38c1 feat(01-01): main.cpp — WiFi init, WIFI_PS_NONE, startup animation, coexistence test
- main.cpp: setup() initializes strips, shows green (connecting) then white (connected)
- esp_wifi_set_ps(WIFI_PS_NONE) called immediately after WiFi connects for RMT coexistence
- loop() toggles LED colors every 5s to confirm strip responsiveness
- Coexistence test procedure documented as comment block in main.cpp
- firmware/.gitignore excludes .pio/ and credentials.h
2026-04-03 13:16:34 +02:00
Claude
55aea7a46b feat(01-01): LED driver — dual strip initialization and output
- led_driver.h declares StripWand (NeoGrbwFeature/RMT) + StripSchrank (NeoWs2801Spi2MhzMethod)
- led_driver.cpp implements initStrips, showBothStrips, setAllWand/Schrank, applyBrightness helpers
- showBothStrips calls stripWand.Show() first (non-blocking DMA) then stripSchrank.Show() (blocking SPI)
- Brightness clamped to [0.0f, BRIGHTNESS_MAX] before scaling
2026-04-03 13:15:41 +02:00
Claude
6fe86bc310 feat(01-01): PlatformIO scaffold + config.h
- platformio.ini with -DESP32_ARDUINO_NO_RGB_BUILTIN, NeoPixelBus ^2.8.0, ArduinoJson ^7.4.0
- config.h defines all pin, LED count, brightness, timing, and FreeRTOS constants
2026-04-03 13:15:06 +02:00
Claude
ee1f45b076 docs(state): record phase 1 planning session 2026-04-03 13:12:55 +02:00
Claude
e90cb3fa39 docs(01-esp32-firmware): create phase plan (4 plans, 3 waves) 2026-04-03 13:12:06 +02:00
Claude
028e2891e0 docs(phase-01): research ESP32-C3 firmware domain
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 13:02:30 +02:00
Claude
e591a4e1fa docs(state): record phase 1 context session 2026-04-03 12:52:15 +02:00
Claude
0d0d7e2061 docs(01): capture phase context 2026-04-03 12:52:06 +02:00
Claude
72ed07b0e9 docs: create roadmap (4 phases) 2026-04-03 12:39:17 +02:00
Claude
1d26fc2dc5 docs: define v1 requirements 2026-04-03 12:29:27 +02:00
Claude
c3680306ee docs: research complete 2026-04-03 12:14:03 +02:00
Claude
136a6c877d chore: add project config 2026-04-03 12:05:27 +02:00
Claude
f89ff71fd6 docs: initialize project 2026-04-03 12:02:56 +02:00