Commit Graph

130 Commits

Author SHA1 Message Date
clement d1db8862c1 docs: retire plan legacy ESP32-S3/AG1171S 2026-06-24 10:04:50 +02:00
clement e8efda1ce4 docs: retire la doc Arduino A252 legacy
Le repo gardait ~76 docs de l'ancien projet Arduino A252 (ESP-NOW, UI web,
WiFi, hotline WAV/FFat, ancienne archi RTOS/audio/SLIC en classes C++,
rapports d'audit/tests du code supprime, orchestration d'agents, CI web).

Garde la doc du firmware actuel : specs/plans de la migration ESP-IDF
(docs/superpowers/), specs Bluetooth HFP/PBAP, spec materielle carte A1S/
ES8388 (a252_board_spec.md + ai_thinker_esp32_a1s_*.yaml), artefacts de
debug d'appairage HFP.

Impact : docs/ aligne sur le firmware mains-libres Bluetooth ESP-IDF.
2026-06-22 08:30:43 +02:00
clement bef10a0a49 chore: retire test/scripts/tools/CI Arduino-era
Suite au retrait de l'arbre Arduino (src/, platformio.ini), les outils et la
CI qui en dependaient sont devenus morts ou cassants. Verifie : rien dans
components/main ne les reference, le build idf.py reste OK.

Supprime :
- test/ : tests Unity qui incluaient le code C++ supprime (DtmfDecoder,
  AudioCodec...), aucune infra de test IDF
- scripts/ : gate A252, controle ESP-NOW, flash FFat/USB-MSC, validation
  hardware A252, contrats runtime PlatformIO
- tools/dev/ (flasheur universel multi-cibles) + tools/repo_state/ + Makefile.flash
- .github/workflows/ : ci.yml et release.yml lancaient PlatformIO + gate a252
  sur du code supprime (CI cassee), repo_state.yml
- .github/agents/ : 19 docs decrivant src/ et PlatformIO
- .github/prompts/plan-roadmapHardwareFirmware : roadmap A252

Garde : tools/phone_tui.py, templates .github generiques (issue/PR/prompts).

Impact : plus aucun residu du projet Arduino dans le repo ; build inchange.
2026-06-22 08:20:39 +02:00
clement 1df3dc5971 docs: aligne README et CLAUDE.md sur le firmware ESP-IDF
Repo State / repo-state (push) Failing after 19s
Les deux fichiers decrivaient encore le projet Arduino d'origine (ESP32-S3,
hotline WAV, ESP-NOW, pio run). Reecrits pour la realite actuelle : kit
mains-libres Bluetooth HFP-HF sur ESP32 classique, build idf.py, CLI de
reglage audio, organisation en components/. CLAUDE.md desormais versionne.
2026-06-21 21:54:59 +02:00
clement dbd789f335 chore: retire l'arbre Arduino legacy, doc ESP-IDF
Repo State / repo-state (push) Failing after 24s
Contexte : le repo contenait deux projets superposés — le projet Arduino/
PlatformIO d'origine (ESP32-S3, hotline WAV, ESP-NOW, UI web) et le firmware
ESP-IDF actuel (kit mains-libres Bluetooth, ESP32 classique). Le code Arduino
n'est plus utilise par le build IDF (verifie : aucune reference dans
CMakeLists/main/components) et entretenait une dette de confusion.

Approche : suppression du code mort verifie independant du build, et reecriture
de la doc pour la realite ESP-IDF. Build IDF revalide apres coup (binaire OK).

Changements :
- supprime src/ (56 fichiers C++ Arduino : AudioCodec, AudioFilePlayer,
  SlicK50835F, web/, wifi/, usb/, ...)
- supprime platformio.ini (build Arduino) et data/webui/ (UI web abandonnee,
  aucune partition data)
- supprime les CLAUDE.md imbriques documentant ces dossiers
- README.md : reecrit pour le kit mains-libres BT HFP-HF / ESP-IDF
- CLAUDE.md : reecrit (Arduino/ESP32-S3 -> ESP-IDF/ESP32 classique) et versionne

Impact : un seul projet dans le repo, doc alignee sur le code, build inchange.
2026-06-21 21:54:15 +02:00
clement 8625665a41 refactor(audio): retire l'instrumentation SCO de debug 2026-06-21 21:48:36 +02:00
clement 8a2280edb0 feat(pwr): poll adaptatif des taches au repos
Repo State / repo-state (push) Failing after 27s
2026-06-20 00:33:10 +02:00
clement 216dc2523e feat(pwr): DFS 160/80 + light sleep (eco batterie)
Repo State / repo-state (push) Failing after 13m59s
2026-06-19 23:58:33 +02:00
clement 577a351124 feat(pwr): codec+I2S en veille au repos 2026-06-19 23:51:10 +02:00
clement 6d3454dffd feat(tools): TUI reglage audio HFP (serie)
Repo State / repo-state (push) Failing after 25s
2026-06-19 22:56:40 +02:00
clement 178931899a feat(audio): AEC NLMS adaptatif (mode aec 2)
Repo State / repo-state (push) Failing after 12m17s
2026-06-19 22:53:12 +02:00
clement baed6f4290 feat(audio): suppression d'echo (mic ducking)
Repo State / repo-state (push) Failing after 15s
2026-06-19 22:42:55 +02:00
clement fc67a1eef8 feat(audio): persiste gains/filtre en NVS
Repo State / repo-state (push) Failing after 17s
2026-06-19 22:10:00 +02:00
clement 2be3729824 tune(audio): gain ecouteur defaut a 8
Repo State / repo-state (push) Failing after 18s
2026-06-19 19:43:57 +02:00
clement b930411829 tune(audio): gain micro defaut a 12
Repo State / repo-state (push) Failing after 19s
2026-06-19 19:20:14 +02:00
clement 2eb97bc4de feat(audio): gains runtime + filtre voix + CLI
Repo State / repo-state (push) Failing after 17s
2026-06-19 17:50:41 +02:00
clement e4123bd32f tune(bt): gain micro a 5
Repo State / repo-state (push) Failing after 31s
2026-06-19 17:43:17 +02:00
clement 452f3efcf6 tune(bt): gain micro a 3
Repo State / repo-state (push) Failing after 31s
2026-06-19 17:41:31 +02:00
clement 935772c1b1 fix(bt): coupe DTMF sur appel entrant
Repo State / repo-state (push) Failing after 21s
2026-06-19 17:15:06 +02:00
clement f9283bc14f tune(bt): gain micro a 2
Repo State / repo-state (push) Failing after 18s
2026-06-19 15:43:18 +02:00
clement f8e3dfb442 feat(bt): reconnexion HFP auto au boot
Repo State / repo-state (push) Failing after 30s
2026-06-19 15:33:49 +02:00
clement 7956cebde1 fix(bt): dtmf_stop sans delete force du RX 2026-06-19 15:22:15 +02:00
clement 8f722db9f4 feat(bt): gain numerique SCO downlink+uplink
Repo State / repo-state (push) Failing after 17s
2026-06-19 15:01:44 +02:00
clement a978357a47 fix(bt): micro partiel + frames SCO completes 2026-06-19 14:57:55 +02:00
clement c382d4d8a1 fix(bt): cadence SCO + flux sonnerie + diag RX 2026-06-19 14:52:07 +02:00
clement 2102d14487 chore(bt): compteurs diag pont SCO (temp) 2026-06-19 14:30:18 +02:00
clement d95513481a fix(bt): appairage Just Works (IO_CAP_NONE) 2026-06-19 14:22:25 +02:00
clement 4d9c81918f fix(bt): mobile initie le SLC (anti-collision) 2026-06-19 14:18:55 +02:00
clement 4aedf7756d fix(bt): initie connexion HFP a l'appairage 2026-06-19 14:02:39 +02:00
clement 9cb31bdea9 fix(bt): RX exclusif dtmf/SCO + perte lien BT
Problème 1 : dtmf_task lisait le canal I2S RX après dtmf_stop(),
provoquant une double lecture concurrente avec sco_mic_task (même
buffer scratch -> corruption micro).

- dtmf.c : ajout de s_run (volatile bool) séparé de s_armed_flag.
  dtmf_task() tourne dans while(s_run) ; quand s_armed_flag=false,
  break immédiat -> s_task_handle=NULL -> vTaskDelete(NULL).
  Plus aucun appel hal_i2s_capture_read_frame après dtmf_stop().
- dtmf_stop() : pose s_run=false, attend (poll 5 ms, timeout 100 ms)
  que s_task_handle==NULL, sinon vTaskDelete forcé + LOGW.
- dtmf_start() : recrée la tâche si handle==NULL.

Correction 1b (call_manager) : appel idempotent dtmf_stop() AVANT
audio_router_sco_begin() dans BT_HFP_EV_AUDIO_CONNECTED.

Problème 2 : BT_HFP_EV_SLC_DISCONNECTED non géré -> perte du lien
BT silencieuse (SCO et sonnerie restaient actifs).

- call_manager.c : case BT_HFP_EV_SLC_DISCONNECTED : coupe SCO si
  actif, slic_ring_stop(), go_idle(), st=ST_IDLE + LOGW.

Tests : host dtmf 3/3 OK, build vert, boot propre flashé.
2026-06-19 13:52:06 +02:00
clement 6b9ecbf2e4 fix(bt): file FreeRTOS pour evenements BT
Remplace s_bt_ev/s_bt_dirty (scalaire 1 slot) par une file
xQueueCreate(8) + xQueueSend non-bloquant + drain complet dans
call_task — evite de perdre un evenement si deux arrivent dans
la meme fenetre de 50 ms (ex. INCOMING suivi AUDIO_CONNECTED).
2026-06-19 13:40:27 +02:00
clement 24e82fbf3b feat(bt): call_manager HFP appels entrant/sortant
- FSM étendue : ST_OUTGOING, ST_INCOMING, ST_ACTIVE
- call_manager_bt_event() : pont léger BT→FSM (flags + strncpy)
- Transitions hook : answer/hangup/dial HFP câblés
- go_idle() coupe SCO si actif
- bt_hfp.c : désenregistrement SCO sur AUDIO_DISCONNECTED
- CMake REQUIRES += bt_hfp slic_ks0835
- app_main : call_manager_start() avant bt_hfp_init()
2026-06-19 13:32:45 +02:00
clement 0ff2c5d4f1 feat(bt): pont data SCO HCI vers audio_router
Ajoute sco_incoming_cb et sco_outgoing_cb dans bt_hfp.c.
Enregistre les callbacks sur AUDIO_STATE connecte (CVSD/mSBC).
REQUIRES audio_router dans CMakeLists.txt.
Build vert, boot non regressé (flash + monitor 2026-06-19).
2026-06-19 13:25:48 +02:00
clement a430a24f39 fix(bt): sco_end synchrone + stack tone_task
- sco_end: s_mode=NONE avant s_sco_active=false pour que
  tone_task quitte la branche SCO avant l'arret du flag mic.
- Attente active s_sco_mic_task==NULL (max 200 ms, pas 5 ms).
- Settle 25 ms avant hal_audio_pa_set(false) evite le clic PA.
- tone_task stack: 3072 -> 4096 (buf stereo SCO 1280 octets).
2026-06-19 13:21:34 +02:00
clement 1695539493 feat(bt): audio_router mode SCO (pont PCM I2S)
- Ajoute TONE_SCO a l enum tone_mode_t
- Ring buffers FreeRTOS (play + cap, 4 KB chacun)
- sco_mic_task : capture I2S -> ring sortant (decimation CVSD 8k)
- tone_task : lit ring entrant, mono->stereo, underrun = silence
- 4 fonctions pub : sco_begin/end/feed_playback/take_capture
- CMakeLists.txt : + esp_ringbuf dans REQUIRES
- Header : + stdbool.h / stdint.h (types bool/uint8_t/uint32_t)
2026-06-19 13:14:57 +02:00
clement 578ef4ffb2 feat(bt): pile HFP-HF + evenements
- composant bt_hfp : init Bluedroid Classic, GAP, esp_hf_client
- garde SSP retiree (pas de CONFIG_EXAMPLE_SSP_ENABLED dans ce projet)
- evenements haut niveau : SLC, appel entrant, audio SCO
- cable dans app_main apres call_manager_start
- build vert 1349 steps, boot sans panique confirme sur materiel
2026-06-19 13:06:19 +02:00
clement eb2d7fb860 feat(bt): active HFP audio HCI + WBS mSBC 2026-06-19 12:58:53 +02:00
clement 8ca352d173 docs: decisions HFP + plan Phase 4 bluetooth 2026-06-19 12:56:03 +02:00
clement 55b54da086 fix(tel): coupe PA en DIALING + warning dtmf
- dtmf.c: retire volatile sur s_task_handle (meme coeur)
- call_manager.c: hal_audio_pa_set(false) en DIALING
- es8388.c: log init corrige (PA off par defaut)
- app_main.c: slic_init avant audio_router_init
2026-06-19 11:07:32 +02:00
clement 21ca98f869 feat(tel): call_manager local + PA single-owner
- Crée composant call_manager: FSM IDLE/DIALTONE/DIALING
- PA single-owner: es8388_init la coupe (niveau 0) au démarrage
- dtmf: #include dialer.h, volatile task_handle, got<0 vs got==0
- hook_monitor: guard double-start + stack 4096
- app_main: retire sondes + tonalité boot, câble call_manager_start
2026-06-19 11:00:19 +02:00
clement aec7599a22 feat(tel): hook_monitor decroche + impulsions
Composant FreeRTOS qui surveille SHK via slic_is_offhook(),
decoode la numerotation par impulsions (cadran rotatif) et
pousse les chiffres au dialer. Build vert sans câblage main.
2026-06-19 10:51:01 +02:00
clement a89fa2b746 feat(tel): dialer accumulateur + test host
- components/dialer/{dialer.c,include/dialer.h,CMakeLists.txt}
- garde DIALER_HOST_TEST : stub esp_timer + ESP_LOGI no-op
- test host : 6/6 assertions OK (RED sans garde, GREEN avec)
- main/CMakeLists.txt : REQUIRES += dialer
- idf.py build : 1343/1343 OK
2026-06-19 10:43:30 +02:00
clement c5eabc44c5 feat(tel): DTMF Goertzel + test host
Context: Phase 3 migration ESP-IDF - detecteur DTMF par Goertzel.

Approach: Adapter dtmf.c/h de plip_voice pour le projet RTC_BL_PHONE
en isolant la partie pure (dtmf_detect_frame + Goertzel) de la partie
IDF (tache FreeRTOS, hal_i2s, dialer) via garde #ifndef DTMF_HOST_TEST.

Changes:
- components/dtmf/include/dtmf.h : header adapte, sans sdkconfig.h ni
  CONFIG_PLIP_DIAL_DTMF, gardes DTMF_HOST_TEST sur dtmf_start/stop
- components/dtmf/dtmf.c : remplace audio.h->hal_i2s.h,
  audio_capture_*->hal_i2s_capture_*, stub forward dialer_push_digit,
  corrige signature hal_i2s_capture_begin(void)
- components/dtmf/test_dtmf.c : TDD host, synth 6000+6000 par freq,
  3 assertions (1, silence, 9)
- components/dtmf/CMakeLists.txt : REQUIRES hal_i2s (dialer en Task 6)

Impact: TDD RED->GREEN 3/3. Build IDF vert. dtmf non reference dans
main pour l'instant (dialer manque) - sera tire par call_manager T6.
2026-06-19 10:35:02 +02:00
clement c11572307e fix(audio): distingue timeout/erreur capture RX 2026-06-19 10:30:09 +02:00
clement f3b92bf6e3 feat(audio): API capture micro RX hal_i2s
Ajoute hal_i2s_capture_begin/read_frame/end : scratch PSRAM,
downmix L+R->mono, energie RMS. Sonde app_main valide le canal.
2026-06-19 10:27:02 +02:00
clement 04a12e9351 feat(tel): SLIC KS0835 hook + sonnerie
Composant slic_ks0835: GPIO RM/FR/SHK/PD, tache sonnerie FT,
sonde polarite SHK. slic_init() place avant audio_router_init()
pour eviter la contention GPIO/mutex avec la tache tone I2S.
SLIC_SHK_OFFHOOK_LEVEL=1 confirme: SHK=0 au raccroché (on-hook).
2026-06-19 10:19:08 +02:00
clement 7844378e2c docs(plan): plan Phase 3 telephonie locale 2026-06-19 09:46:56 +02:00
clement 808f66595b fix(audio): monte niveau tonalite ecouteur
HAL_I2S_EARPIECE_VOL 60->95, TONE_AMPLITUDE 8000->14000.0f.
2026-06-19 09:36:46 +02:00
clement 22aca75e57 feat(audio): tonalite via audio_router
Composant audio_router cree : tache FreeRTOS 440 Hz,
machine d'etat DIAL/BUSY/RINGBACK. Cable dans app_main,
tonalite active au boot (PA ON confirme en serie).
2026-06-19 09:25:19 +02:00
clement aea32cfd41 fix(audio): borne amplitude tone_gen a int16
Sature s dans [-32768, 32767] avant le cast int16_t pour
eviter l'UB C99. Documente le contrat dans l'en-tete.
Ajoute assertion 5/5 : amplitude 40000 ne deborde pas.
2026-06-19 09:21:01 +02:00