878d911065
✅ P1.1 Phase 9 Touch Input (4h) - TouchEmulator: 4x4 grid navigation via buttons (UP/DOWN/LEFT/RIGHT toggle) - Files: touch_emulator.{h,cpp} + AmigaUIShell integration - Button mapping: 0=UP, 1=SELECT, 2=DOWN, 3=MENU, 4=TOGGLE_LR - Build SUCCESS (31.06s, 64.4% RAM, 42.0% Flash) ✅ P1.2 Documentation Update (1h) - AGENT_TODO.md: Phase 9 completion + Sprint 9 section added - Root cause analysis: watchdog timeout (cycle 9) → stack fix (8192→16384) - Troubleshooting guide: common issues + debug commands Files: + touch_emulator.{h,cpp} ~ ui_amiga_shell.* + main.cpp + AGENT_TODO.md Next: P1.3 (Sprint 1 endurance validation) + P2 (main.cpp refactor)
8.7 KiB
8.7 KiB
Plan Sprint Applications Zacus
Date de reference: 2026-03-02
Scope: 20 apps declarees dans data/apps/registry.json
1. Strategie de priorisation
Principe:
- Priorite P0: tout ce qui bloque le parcours utilisateur "launcher -> app -> retour launcher".
- Priorite P1: apps coeur (utility, capture, audio) utilisables en conditions reelles.
- Priorite P2: apps kids et NES, une fois la plateforme stable.
Ordre d'execution:
- Platforme runtime/launcher
- Packs apps par module (pour mutualiser le code)
- Hardening, perf, et validation hardware
2. Macro planning (6 sprints)
Hypothese charge: 1 dev principal, 5 jours/sprint.
Sprint 0 (Semaine 1) - Fondations P0
Objectif:
- Rendre operationnel le flux complet de lancement d'app depuis
AmigaUIShell.
Progression (2026-03-02):
- Bridge launcher/runtime implemente.
launchSelectedApp()relie au runtime apps.- Anti double-launch (debounce + garde etat running/starting).
APP_STATUSserie expose + HELP mis a jour.- Logs normalises
APP_OPEN_*,APP_CLOSE_*,APP_ACTION_*. - LVGL passe en 8.4.x.
- QR lib pinnee sur commit.
- tinyexpr ajoute explicitement.
- [~]
ESP32-audioI2S3.4.4 teste puis rollback en 2.3.0 (incompatibilite<span>avec toolchain actuelle). - Gate build
pio run -e freenove_esp32s3_full_with_uiverte.
Scope:
ui_amiga_shell.cpp: brancherlaunchSelectedApp()versAPP_OPEN(ou appel direct runtime manager).- Navigation launcher: touch + boutons + prevention double launch.
- Retour propre vers
SCENE_READYapresAPP_CLOSE. - Normalisation logs:
APP_OPEN_OK/FAIL,APP_CLOSE_OK/FAIL.
Effort estime:
- 3 a 4 jh
Risque:
- Eleve (couplage UI/runtime actuel)
Gate sortie:
APP_OPEN audio_playerdepuis launcher fonctionne.APP_CLOSEramene sur launcher sans freeze.- Build
freenove_esp32s3_full_with_uiOK.
Sprint 1 (Semaine 2) - Utility Pack P1
Apps:
calculatortimer_toolsflashlight
Objectif:
- Finaliser les apps les moins risquées pour valider le pipeline UX.
Progression (2026-03-02):
- Calculator: tinyexpr actif + erreurs explicites (
eval_error@pos) + actionstatus. - Timer: actions chrono/countdown stabilisées + action
status. - Timer: signal fin countdown implémenté (audio/LED opportuniste si ressources disponibles).
- Flashlight:
light_on/offrobustes +light_toggle+set_levelappliqué à chaud. - Script d'endurance et de contrat serial/API ajouté:
tests/sprint1_utility_contract.py. - Build + flash validés sur cible:
pio run -e freenove_esp32s3_full_with_uipuis-t upload. - Smoke série court validé:
--cycles 5vert (3 apps). - Gate hardware 20 cycles/app à exécuter et archiver (logs + verdict).
- Essai 2026-03-02: échec à
calculator cycle 9/20avec reboot panic (reset_reason=4).
- Essai 2026-03-02: échec à
- Gate HTTP
/api/apps/*à valider (reachability/auth encore instable côté poste de test).
Effort estime:
- calculator: 1 jh
- timer_tools: 1.5 jh
- flashlight: 1 jh
- integration/tests: 1 jh
- Total: 4.5 jh
Risque:
- Faible a moyen
Gate sortie:
- 3 apps stables sur 20 cycles open/close.
- Aucune erreur runtime persistante (
last_errorvide en nominal).
Sprint 2 (Semaine 3) - Capture Pack P1
Apps:
camera_videoqr_scannerdictaphone
Objectif:
- Stabiliser camera/micro/filesystem en usage reel.
Progression (2026-03-02):
CameraVideoModule: actionstatus+ événements normalisés preview/clip/frame.QrScannerModule: actionstatus+ aliasscan_payload+ classificationurl/app/text.DictaphoneModule: actionstatus+ normalisation chemins relatifs (/recorder/...).- Harness Sprint 2 ajouté:
tests/sprint2_capture_contract.py. - Gate série Sprint 2 (1 cycle/app) verte.
python3 tests/sprint2_capture_contract.py --mode serial --cycles 1-> SUCCESS.
- Endurance courte Sprint 2 (3 cycles/app) verte.
python3 tests/sprint2_capture_contract.py --mode serial --cycles 3-> SUCCESS.
- Endurance intermédiaire Sprint 2 (10 cycles/app) verte.
python3 tests/sprint2_capture_contract.py --mode serial --cycles 10-> SUCCESS.
- Déblocage mémoire/coex validé:
BOARD_HAS_PSRAMactivé (psram_found=1au boot).- tuning runtime:
UI_FX_TARGET_FPS=12,UI_DMA_TRANS_BUF_LINES=1,UI_LV_MEM_SIZE_KB=54,ARDUINO_LOOP_STACK_SIZE=16384. - fix runtime QR/camera ownership + profil ressource auto (caméra/micro) à l’ouverture app.
- Gate endurance longue (20 cycles/app) encore à passer pour valider la sortie Sprint 2.
Effort estime:
- camera_video: 2.5 jh
- qr_scanner: 1.5 jh
- dictaphone: 2 jh
- integration/tests hardware: 1 jh
- Total: 7 jh
Risque:
- Eleve (camera + audio + FS + contention)
Gate sortie:
- Snapshot/photo/record/list/delete valides.
- Pas de crash sur enchainement camera <-> dictaphone.
Sprint 3 (Semaine 4) - Audio Pack P1
Apps:
audio_playeraudiobook_playerkids_webradiokids_podcastkids_music
Objectif:
- Unifier la stack audio locale/streaming + fallback offline.
Effort estime:
- audio_player: 2 jh
- audiobook_player: 2 jh
- declinaisons kids_media (3 apps): 2 jh
- integration/tests reseau/offline: 1.5 jh
- Total: 7.5 jh
Risque:
- Eleve (Wi-Fi instable, URLs, fallback)
Gate sortie:
- Streaming fonctionne si Wi-Fi present.
- Fallback offline automatique si Wi-Fi absent.
- Reprise audiobook (progress + bookmark) apres reboot.
Sprint 4 (Semaine 5) - Kids Learning/Creative Pack P2
Apps:
kids_drawingkids_coloringkids_yogakids_meditationkids_languageskids_mathkids_sciencekids_geography
Objectif:
- Finaliser les 2 familles modules:
KidsCreativeModuleetKidsLearningModule.
Effort estime:
- base creative (2 apps): 3 jh
- base learning (6 apps): 4 jh
- contenus/fixtures progression: 1.5 jh
- tests endurance: 1 jh
- Total: 9.5 jh
Risque:
- Moyen (beaucoup d'apps, logique mutualisee)
Gate sortie:
- Sauvegarde/reprise validee pour creative + learning.
- Score/progression lesson persistants pour learning apps.
Sprint 5 (Semaine 6) - NES + Hardening global P2
Apps:
nes_emulator
Objectif:
- Verrouiller la qualite de fin de lot sur les 20 apps.
Effort estime:
- NES core integration UI/input: 3 jh
- hardening global (errors, watchdog, retry): 2 jh
- regression matrix 20 apps: 2 jh
- Total: 7 jh
Risque:
- Moyen a eleve (charge CPU/loop timing)
Gate sortie:
- Validation ROM mapper0 + controls de base.
- Regression matrix complete verte.
3. Matrice effort/risque par application
| App | Module | Priorite | Effort (jh) | Risque |
|---|---|---|---|---|
| audio_player | AudioPlayerModule | P1 | 2.0 | Eleve |
| audiobook_player | AudiobookModule | P1 | 2.0 | Moyen |
| calculator | CalculatorModule | P1 | 1.0 | Faible |
| timer_tools | TimerToolsModule | P1 | 1.5 | Faible |
| flashlight | FlashlightModule | P1 | 1.0 | Faible |
| camera_video | CameraVideoModule | P1 | 2.5 | Eleve |
| qr_scanner | QrScannerModule | P1 | 1.5 | Moyen |
| dictaphone | DictaphoneModule | P1 | 2.0 | Eleve |
| kids_webradio | AudioPlayerModule | P1 | 0.8 | Moyen |
| kids_podcast | AudioPlayerModule | P1 | 0.8 | Moyen |
| kids_music | AudioPlayerModule | P1 | 0.8 | Moyen |
| kids_drawing | KidsCreativeModule | P2 | 1.5 | Moyen |
| kids_coloring | KidsCreativeModule | P2 | 1.5 | Moyen |
| kids_yoga | KidsLearningModule | P2 | 1.2 | Moyen |
| kids_meditation | KidsLearningModule | P2 | 1.2 | Moyen |
| kids_languages | KidsLearningModule | P2 | 1.2 | Moyen |
| kids_math | KidsLearningModule | P2 | 1.2 | Moyen |
| kids_science | KidsLearningModule | P2 | 1.2 | Moyen |
| kids_geography | KidsLearningModule | P2 | 1.2 | Moyen |
| nes_emulator | NesEmulatorModule | P2 | 3.0 | Eleve |
4. Risques transverses et mitigation
- Couplage launcher/runtime incomplet
- Mitigation: fermer Sprint 0 avant toute extension app.
- Contention camera/audio/LVGL
- Mitigation: tests de bascule entre apps capture/audio a chaque sprint.
- Variabilite Wi-Fi sur apps streaming
- Mitigation: fallback offline obligatoire et tests en mode deconnecte.
- Regression silencieuse des actions app
- Mitigation: suite smoke serial/API standardisee (
APP_OPEN,APP_ACTION,APP_CLOSE).
5. Definition of Done globale
- 20/20 apps ouvrables depuis launcher + API.
- Chaque app execute au moins 3 actions metier sans erreur critique.
- Retour launcher stable apres 50 cycles open/close mixes.
- Build firmware + buildfs + upload smoke validates.
6. Execution immediate proposee
Ordre concret des 10 prochains jours:
- J1-J2: Sprint 0 (launcher runtime bridge + retour launcher)
- J3-J4: Sprint 1 (calculator/timer/flashlight)
- J5-J7: Sprint 2 (camera/qr/dictaphone)
- J8-J10: Debut Sprint 3 (audio_player + audiobook_player)