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/<nom>/) contenant un fichier par événement, nommé exactement comme l’événement (.wav,.mp3ou.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=<n>, 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.