# Spécifications fonctionnelles ## Contexte Le club organise chaque année en février un concours officiel FFTL comprenant : - **2 manches Indoor** : chacune composée de 2 séries de 6 volées de 5 flèches, à 20 yards (règle IFAA). - **1 manche Flint** : composée de 2 unités standards (= 1 parcours), selon les règles Flint FFTL (voir ci-dessous). Le logiciel gère le chronométrage et l'affichage pour ces deux types de manches, avec une architecture générique (un mode = une classe) pensée pour accueillir d'autres modes FFTL/World Archery par la suite sans toucher aux modes existants. ## Règles de l'Indoor (rappel) - 2 séries de 6 volées de 5 flèches, 20 yards, 4 minutes de tir par volée (240s, passage à l'orange dans les 30 dernières secondes), 10s de mise en place avant chaque volée. - Les archers tirent en deux relais (A-B et C-D) qui partagent le même blason : les deux relais tirent **la même volée** (le numéro ne change pas entre eux), seul le tireur actif change. Le numéro de volée n'incrémente qu'une fois les deux relais passés. - L'ordre des relais (A-B puis C-D, ou l'inverse) est configurable, et alterne automatiquement d'une série à l'autre par défaut (série 1 : A-B puis C-D ; série 2 : C-D puis A-B) — comportement désactivable. - Deux blasons affichés simultanément à l'écran (recourbe/trad et poulies), côte à côte, puisque les deux catégories tirent souvent ensemble. ## Règles du round Flint (rappel) Une **unité standard** consiste en 7 manches de 4 flèches : 6 volées standards à distance fixe (25 yards, 20 pieds, 30 yards, 15 yards, 20 yards, 10 yards, dans cet ordre précis — celui des lignes de tir réelles, pas un ordre croissant) plus une **volée finale walk-up** (4 flèches à 4 distances différentes, décroissantes : 30, 25, 20, 15 yards). Un **parcours** Flint = 2 unités standards. Points structurants pour le chronométrage : - **Volées standards** : 180s de tir continu (3 min), passage à l'orange dans les 20 dernières secondes, 10s de mise en place avant chacune. - **Volée walk-up** : 45 secondes par flèche, 10s de mise en place avant chaque flèche, passage à l'orange dans les 10 dernières secondes — le groupe avance ensemble entre chaque flèche, sans pause de récupération entre elles (contrairement aux volées standards, où on récupère les flèches à chaque fois). - **Blason** : alterne selon la parité de la volée — 1 spot (35cm) pour les volées impaires (1, 3, 5, et la volée 7/walk-up), 4 spots (20cm) pour les volées paires (2, 4, 6). - **Relais A-B/C-D** : contrairement à l'Indoor, un relais tire l'**unité entière** (les 7 volées) avant que l'autre relais ne reprenne la même unité depuis le début — pas d'alternance au sein d'une volée (pas de place pour deux blasons par ligne de tir, changer de tireur à chaque volée serait dangereux). L'ordre alterne par défaut d'une unité à l'autre, comme pour l'Indoor. ## Exigences fonctionnelles ### Chronométrage - Décompte continu par volée (pas deux minuteurs qui s'enchaînent) : le temps affiché ne redémarre ni ne saute jamais, seule la couleur change au passage du seuil d'alerte (orange). - Phases visuelles : mise en place (rouge), tir (vert puis orange), pause de fin de volée (récupération des flèches, décompte à l'arrêt), urgence. - Séquence walk-up Flint : 4 flèches enchaînées automatiquement (45s chacune), sans pause entre elles. - Commandes du responsable du chronométrage : avancer manuellement (Next), mettre en pause temporairement et reprendre, arrêter le match, recommencer depuis le début, aller directement à une volée précise (utile en cas d'erreur ou d'incident). - Urgence : arrêt immédiat, décompte figé, reprise avec possibilité de corriger le temps restant (cf. règlement FFTL sur les défaillances matérielles). - Tous les réglages (temps, distances, nombre de volées/flèches, images de cible) sont configurables sans toucher au code (voir Configuration). ### Affichage (par pas de tir / lane) Chaque écran affiche : - Le temps restant, avec code couleur, et le relais actif (A-B / C-D ou numéro de flèche pour le walk-up). - Série et volée distinctement (pas un compteur global qui grimperait jusqu'à 12 pour l'Indoor par exemple). - Le blason de la volée en cours : deux images côte à côte pour l'Indoor (recourbe/trad et poulies), une seule pour le Flint (alternance 1 spot/4 spots selon la parité de la volée). - Le numéro du pas de tir et un titre d'événement permanent (choisi par le responsable du chronométrage, ex. "Concours FFTL Indoor — Février 2026"). En dehors des phases de tir actif (avant le concours, après sa fin, en cas de déconnexion réseau) : un **écran neutre unique et cohérent** — logo du club et horloge en direct, sans texte superflu (les messages du responsable du chronométrage restent indépendants et s'affichent par-dessus si besoin). Un diaporama alterne automatiquement cet écran neutre avec des bannières sponsors déposées par le club, jamais pendant le tir actif. L'interface est bilingue (français/anglais, choix du responsable du chronométrage, appliqué à tous les écrans) et propose un thème clair/sombre (suit la préférence système ou choix explicite). ### Son - Système de packs de sons interchangeables : un pack = un dossier (`web/assets/sounds/packs//`) contenant un fichier par événement, nommé exactement comme l'événement (`.wav`, `.mp3` ou `.ogg`). - Pack "classic" fourni par défaut (généré par synthèse, libre de droits) ; les clubs peuvent créer autant de packs personnalisés qu'ils veulent, non versionnés dans le dépôt public. - Un événement sans fichier correspondant retombe automatiquement sur un bip générique — pas besoin de fournir tous les sons d'un coup. - 10 événements distincts : début de mise en place, début de tir, passage à l'orange, décompte des dernières secondes (nombre de secondes configurable, 5 par défaut, 0 pour désactiver), fin de volée, pause/reprise manuelle du responsable du chronométrage, urgence/fin d'urgence, fin de match. - Réglage global (pas par mode) : un seul pack actif à la fois pour toute l'application, changement pris en compte immédiatement sur tous les écrans déjà connectés. ### Configuration / administration - Paramétrage sans édition de code : fichiers TOML lisibles (`config/indoor.toml`, `config/flint.toml`, `config/app.toml`), modifiables à la main ou via une page dédiée (`config.html`) qui lit les valeurs actuelles et écrit le fichier à l'enregistrement. - Impossible de modifier la configuration d'un mode (Indoor ou Flint) tant qu'un match de ce même mode est en cours (actif, en pause, ou en urgence) — évite de changer les règles d'une compétition en plein déroulement. - Logo du club, bannières sponsors et images de cible : dépôt manuel de fichiers dans les dossiers prévus (`web/assets/club/`, `web/assets/banners/`, `web/assets/targets/`), détection automatique par le serveur (listing de répertoire), sans upload à construire. - Utilisable par une personne non-développeuse (bénévole du club, arbitre). - Mot de passe optionnel pour protéger le contrôle et la configuration sur un réseau partagé (vide par défaut = aucune protection, comme avant l'ajout de cette fonctionnalité). ### Multi-écrans - Un service centralisé pilote l'état de la compétition et diffuse à tous les clients connectés. - N'importe quel navigateur sur le réseau local peut devenir un écran d'affichage via `/display.html?lane=`, synchronisé en temps réel. - Le poste de contrôle voit quels pas de tir sont effectivement connectés, et peut envoyer un message à tous les écrans ou à un seul en particulier. - Le poste de contrôle (responsable du chronométrage) et un écran peuvent cohabiter sur le même appareil (miniature d'aperçu en direct intégrée à l'interface de contrôle). ## Hors périmètre (pour l'instant) - Pilotage de matériel physique (feux tricolores, buzzer externe Arduino/GPIO) — non nécessaire pour ce club, mais l'architecture ne l'exclut pas. - Gestion des scores / feuilles de marque (hors sujet chronométrage). - Accès distant hors réseau local (pas de cloud, tout fonctionne sans Internet). - Authentification sur le serveur WebSocket (n'importe qui sur le même WiFi peut actuellement envoyer des commandes de contrôle) — noté en backlog, voir `docs/roadmap.md`. - Exécutable autoporteur (Windows/Mac/Linux) et web app installable (PWA) — idées notées en backlog, pas encore programmées dans une étape.