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>
2.4 KiB
2.4 KiB
Easter Egg musique concrète
« La spec vibre lentement, comme une onde analogique dans le silence du hardware. » — Éliane Radigue
Spec
Objectifs
- O1 Scanner les réseaux WiFi visibles depuis l’ESP32-S3 en ≤ 5s.
- O2 Sérialiser les résultats en JSON et les envoyer au backend Mascarade.
- O3 Exposer une qualité de signal 0–100 calculable en pur C++ (testable natif).
Non-objectifs
- N1 Sélection automatique du réseau (c’est le rôle du portail captif).
- N2 Scan continu en arrière-plan (bloquant, déclenché à la demande).
- N3 Support WPA-Enterprise ou réseaux cachés.
User stories
- US1: En tant qu’utilisateur, je veux voir la liste des réseaux WiFi disponibles sur le Serial monitor afin de diagnostiquer la connectivité.
- US2: En tant que backend Mascarade, je veux recevoir l’événement
wifi_scan_completeavec le JSON des réseaux afin d’alerter l’utilisateur si le signal est faible.
Exigences fonctionnelles
- F1
WifiScanner::Scan(timeout_ms)retournestd::vector<Network>triés par RSSI décroissant. - F2
WifiScanner::ToJson(networks, duration_ms)produit un JSON valide UTF-8. - F3
WifiScanner::RssiQuality(rssi)mappe [-100, -50] → [0, 100] (clampé, pur C++). - F4 Le résultat JSON est imprimé sur Serial et envoyé via
SendPlayerEvent. - F5 En cas de timeout (0 réseaux trouvés), le JSON retourne
{"networks": [], "count": 0}.
Exigences non-fonctionnelles
- Perf: durée totale
Scan()≤ 5 000 ms sur hardware réel. - Observabilité: log
[wifi_scan]sur Serial avec count et durée. - Conso: scan ponctuel uniquement (pas de scan périodique automatique).
Critères d’acceptation (AC)
- AC1
Scan()retourne ≥ 1 réseau dans un environnement avec WiFi disponible, en ≤ 5s. - AC2 Le JSON produit est parseable par
ArduinoJsonet par Pythonjson.loads(). - AC3 Les champs obligatoires sont présents :
ssid,rssi,open,channel,quality. - AC4
RssiQuality(-50) == 100,RssiQuality(-100) == 0,RssiQuality(-75) == 50. - AC5 Les réseaux sont triés par RSSI décroissant (meilleur signal en premier).
- AC6 28 + N tests Unity natifs verts (N ≥ 8 nouveaux tests WiFi scanner).
Interfaces (contrats)
{
"networks": [
{"ssid": "MyNetwork", "rssi": -62, "open": false, "channel": 6, "quality": 76}
],
"count": 1,
"duration_ms": 2340
}
Événement backend : SendPlayerEvent(device_id, "wifi_scan_complete", snapshot, json_string).