e67fb754c2
Session kxkm-ai 25-26 mars 2026 — 98/98 tâches TODO complétées. Hardware: - KiCad 10.0.0 native avec sym/fp-lib-table locales - Nouveau block SPI (gen_spi_header.py), ERC clean - Module partagé hardware/lib/kicad_gen.py (5 générateurs refactorisés) - Pipeline export: tools/hw/hw_export.sh (ERC + SVG + PDF + netlist) - KiBot 1.8.5 installé, .kibot.yaml configuré Firmware: - Fix I2S driver conflict: migration I2sMic vers nouvelle API i2s_channel_* - Fix WDT risk: yield() dans CompletePushToTalk (voice_controller.cpp) - Fix XSS wifi_manager.cpp: innerHTML → createElement/textContent - Fix null check FwIsValidWavHeader - Dead code supprimé: i2s_audio.cpp.bak, i2s_audio.h Simulation MCU: - QEMU ESP32-S3 v9.2.2 installé (tools/sim/) - Script run_qemu_esp32s3.sh — boot OK vérifié - [env:esp32s3_qemu] dans platformio.ini - Wokwi CI: wokwi.toml + diagram.json + scenario.yaml - SPICE bridge POC: tools/sim/spice_bridge.py (ngspice → ADC/brownout) Compliance: - Profil iot_wifi_eu validé (16 standards, 8 evidence) - 4 evidence remplis: risk_assessment, security_architecture, test_plan_radio_emc, supply_chain_declarations - plan.yaml complété avec données produit réelles CI: - Job hardware-export (KiCad 10 ERC + SVG + PDF + netlist) - Job firmware-sim (Wokwi, conditionnel WOKWI_CLI_TOKEN) - evidence_pack.yml enrichi avec exports hardware Docs & RAG: - specs/02_arch.md complet (481 lignes, 4 ADR, diagrammes) - docs/SIMULATION.md (3 niveaux: native, QEMU, Wokwi) - 6 chunks ingérés dans kb-kicad RAG - Dataset HF: tools/generate_hf_dataset.py + datasets/kb_kicad_qa.jsonl - Rapport analyse: docs/plans/ANALYSIS_REPORT_2026-03-25.md - Recherche OSS: docs/research/oss_similar_projects.md Infra: - ZeroClaw 0.1.7 installé (cargo install) - APIFY_API_KEY configurée, smoke OK - Tests: 39/39 firmware + 26/26 Python stable Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
74 lines
2.0 KiB
C++
74 lines
2.0 KiB
C++
#pragma once
|
||
|
||
#include "voice_controller.h"
|
||
|
||
#include <string>
|
||
#include <vector>
|
||
|
||
class Audio; // Forward-declare from ESP32-audioI2S
|
||
|
||
/// Web radio + TTS playback using ESP32-audioI2S library.
|
||
/// Manages the I2S output (PCM5101 DAC) for both radio streaming
|
||
/// and TTS reply audio.
|
||
class RadioPlayer : public MediaController {
|
||
public:
|
||
RadioPlayer();
|
||
~RadioPlayer();
|
||
|
||
/// Initialise I2S output via the Audio library.
|
||
bool Begin(int bck, int ws, int dout);
|
||
|
||
/// Must be called from loop() to feed the audio decoder.
|
||
void Loop();
|
||
|
||
// -- MediaController interface --
|
||
MediaSnapshot Snapshot() const override;
|
||
void ApplyIntent(const VoiceIntent& intent) override;
|
||
void PrepareForReply(PlayerAction action) override;
|
||
void RestoreAfterReply(bool resume) override;
|
||
bool PlayReplyAudio(const std::vector<uint8_t>& wav) override;
|
||
|
||
// -- Station management --
|
||
void SetStations(const std::vector<std::pair<std::string, std::string>>& list);
|
||
void PlayStation(int index);
|
||
void PlayStation(const std::string& name);
|
||
void Next();
|
||
void Previous();
|
||
void Stop();
|
||
void SetVolume(int vol); // 0–100
|
||
bool IsPlaying() const;
|
||
|
||
// -- Callbacks from Audio lib (set in main.cpp) --
|
||
void OnInfo(const char* info);
|
||
void OnTitle(const char* title);
|
||
|
||
private:
|
||
void StartCurrentStation();
|
||
|
||
Audio* audio_ = nullptr;
|
||
bool initialized_ = false;
|
||
|
||
// Station list: {name, url}
|
||
std::vector<std::pair<std::string, std::string>> stations_;
|
||
int current_station_ = 0;
|
||
MediaMode mode_ = MediaMode::kRadio;
|
||
bool playing_ = false;
|
||
int volume_ = 40; // 0–100
|
||
std::string current_title_;
|
||
|
||
// State saved before TTS reply.
|
||
bool was_playing_ = false;
|
||
int saved_volume_ = -1;
|
||
std::string saved_url_;
|
||
|
||
// WiFi info (updated externally).
|
||
std::string wifi_ssid_;
|
||
int wifi_rssi_ = 0;
|
||
int battery_pct_ = -1;
|
||
|
||
friend void updatePlayerWifi(RadioPlayer& p, const std::string& ssid, int rssi);
|
||
};
|
||
|
||
/// Update WiFi info in the player snapshot.
|
||
void updatePlayerWifi(RadioPlayer& p, const std::string& ssid, int rssi);
|