Le serveur de contrôle des concours. Une seule application de bureau fait tourner la compétition sur le réseau de votre stade : elle conserve les épreuves et les athlètes, reçoit les résultats en direct depuis l’application de terrain PolyField, pilote les écrans en direct, enregistre le vent, produit des statistiques et des visuels pour les réseaux sociaux et (en option) publie les résultats en ligne. Fonctionne sur Windows et Mac ; fonctionne sur un réseau local.
Télécharger depuis polyfield.co.uk
PolyField Server est le cœur d’une compétition de concours. Il tourne sur un seul ordinateur du réseau de votre stade et fait quatre choses à la fois :
Tout fonctionne sur le réseau local — aucune connexion internet n’est nécessaire pour faire tourner une compétition, mais elle est requise pour télécharger les listes de départ depuis les fournisseurs de gestion de compétition et pour renvoyer les résultats en temps réel vers leurs systèmes. Une synchronisation est possible après le concours pour envoyer tous les résultats en une fois.
Validation positive. Le serveur n’invente jamais de résultats — chaque marque provient d’un officiel via l’application de terrain. Cela garantit une chaîne claire, de la mesure au cercle jusqu’à ce qui s’affiche sur le tableau.
Ouvrez l’application ; le Tableau de bord est le poste de l’opérateur. Démarrez une compétition de trois façons :
Une fois chargée, chaque épreuve apparaît sous forme de carte sur le tableau de bord, indiquant son statut (Non commencée, En cours, Terminée).
Sur chaque appareil de terrain, vérifiez l’adresse du serveur dans l’application de terrain PolyField pour la connecter au serveur. L’officiel sélectionne alors son épreuve, calibre l’EDM sur le cercle ou la piste d’élan, et commence à mesurer. Voir Les résultats et l’application de terrain.
Sur chaque écran, ouvrez un navigateur à l’adresse du serveur et ajoutez la page voulue — par exemple http://polyfieldserver.local:8080/tables. Utilisez Écrans sur le tableau de bord pour obtenir des liens en un clic et des QR codes vers chaque écran. Voir Les écrans.
Astuce. Laissez l’application de bureau sur le tableau de bord et pilotez tout depuis là. Les résultats arrivent automatiquement depuis l’application de terrain pendant que vous surveillez l’avancement et les écrans.

Le tableau de bord liste chaque épreuve et propose les commandes principales. En haut figurent l’adresse du serveur (avec un sélecteur de réseau sur les machines à plusieurs cartes) et l’état des envois ou de la synchronisation en attente. Les actions clés :
| Commande | Rôle |
|---|---|
| Nouvelle compétition | Effacer la compétition en cours et repartir de zéro. |
| Créer une nouvelle épreuve | Ajouter une épreuve et ses athlètes à la main. |
| Fusionner les épreuves | Combiner des épreuves (p. ex. deux groupes de la même discipline) en une seule, ou Fusionner toutes les épreuves identiques pour combiner d’un coup toutes les paires correspondantes. |
| Écrans | Afficher les liens cliquables et les QR codes de chaque page d’affichage (tableau, classements, speaker, RAZA). |
| Exporter les visuels | Générer les visuels pour les réseaux sociaux, les cartes de chaleur détaillées et les visuels de vent de la compétition (voir Visuels pour les réseaux sociaux). |
| Exporter les statistiques | Produire le PDF des statistiques de la compétition (également sur la page Statistiques). |
Sélectionner une épreuve ouvre sa vue Résultats en direct, où vous voyez la série de chaque athlète, suivez l’arrivée des essais et consultez le classement.

Utilisez Lien de compétition / import pour charger une compétition plutôt que de la saisir :
Les épreuves importées conservent leur numérotation et leurs codes d’origine, afin de correspondre au programme publié et à l’export des résultats.

Les résultats sont saisis sur le terrain, pas sur le serveur. Chaque épreuve utilise l’application de terrain PolyField sur un appareil Android :
À mesure que les résultats arrivent, la carte de l’épreuve se met à jour, les classements se recalculent, et tout écran connecté s’actualise instantanément.


Le serveur diffuse quatre pages d’affichage en direct. Chacune est une page web ordinaire — ouvrez-la dans n’importe quel navigateur du réseau ; rien n’est à installer sur l’écran. Toutes se mettent à jour automatiquement : les nouveaux résultats sont poussés dès leur arrivée, avec une interrogation périodique en filet de sécurité, si bien qu’un écran n’a jamais besoin d’être actualisé.
| Page | URL |
|---|---|
| Tableau de résultats (derniers résultats) | / |
| Classements des épreuves (tables) | /tables |
| Fil du speaker | /announcer |
| Classements RAZA (para-athlétisme) | /raza |
Un grand tableau des performances les plus récentes, avec l’athlète, l’épreuve, la marque et — pour les lancers — une visualisation de l’impact. Idéal comme écran de résultats principal pour le public.

Les classements en direct, plusieurs épreuves à la fois, chacun classé avec les surlignages or/argent/bronze. La mise en page s’adapte à la hauteur : elle remplit l’écran, empile davantage d’épreuves sur les écrans hauts ou en mode portrait, et lorsqu’une épreuve compte beaucoup d’athlètes, elle les fait défiler page par page. Les épreuves alternent aussi pour que chaque épreuve du programme passe à l’écran.

Un fil des résultats à mesure qu’ils arrivent — le plus récent en haut, avec la place, l’athlète, le club, l’épreuve et la marque — dimensionné pour être lu d’un coup d’œil depuis un poste de speaker ou de commentaire.

Classements para-athlétisme calculés avec le système de points World Para Athletics (RAZA), afin de comparer sur un même tableau des athlètes de classifications différentes. Une classification et un genre doivent être renseignés pour qu’un score RAZA soit calculé.

PolyField Server lit les anémomètres via le réseau et enregistre le vent pour toute la journée de compétition. Il prend en charge le Gill WindSonic 75 et le PolyField Wind Mini, et détecte le type d’anémomètre automatiquement d’après son flux de données — aucun protocole à choisir. Ajoutez un anémomètre avec son adresse réseau ; dès qu’il émet, le serveur affiche le modèle détecté et commence l’enregistrement.

La page Statistiques transforme les données de la compétition en analyse :
Les graphiques et les cartes de chaleur s’adaptent au réglage de taille d’affichage afin de rester lisibles sur l’écran de l’opérateur.

Exporter les visuels produit un ensemble d’images carrées (1080 × 1080) prêtes à publier, toutes dans un style PolyField cohérent :
Les visuels ne sont produits que pour les épreuves qui ont eu lieu, et chaque carte porte la date de la compétition et l’identité visuelle PolyField.


En option, le serveur publie les résultats vers le cloud PolyField pour que le public puisse suivre en ligne sur results.polyfield.co.uk. Deux choses peuvent être envoyées, chacune activable dans les Réglages :
Les envois sont mis en file d’attente et réessayés, de sorte qu’une brève coupure d’internet ne perd aucune donnée — la compétition elle-même continue de tourner sur le réseau local quoi qu’il arrive.
Lien de compétition est l’endroit où vous connectez les fournisseurs de gestion de compétition au serveur. Il propose les commandes d’import OpenTrack / Athletics.app pour charger les épreuves.


polyfieldserver.local, si bien que les appareils de terrain et les écrans peuvent utiliser http://polyfieldserver.local:8080 sans connaître l’adresse IP. Certains appareils Android exigent l’adresse IP complète ; vous pouvez alors utiliser http://192.168.0.10:8080 en remplaçant 192.168.0.10 par l’adresse du serveur affichée sur le tableau de bord.En cas de problème, utilisez le rapport de diagnostic. Il rassemble la compétition en cours (que le support peut rejouer), les journaux et les données de vent du jour dans un seul fichier zip, et pré-remplit un e-mail vers support@polyfield.co.uk. Joignez le fichier enregistré avant l’envoi. Le même fichier peut servir à récupérer une compétition s’il faut changer de machine en cours de concours.

| Symptôme | À vérifier |
|---|---|
| Un appareil de terrain ne se connecte pas | Vérifiez qu’il est sur le même réseau, que le port 8080 est accessible et (PC multi-cartes) que la bonne carte réseau est sélectionnée en haut du tableau de bord. Assurez-vous que votre pare-feu ne bloque pas PolyField Server. |
| Un import renvoie 0 épreuve | La compétition source n’a peut-être pas encore d’inscrits, ou une autre compétition est sélectionnée. Vérifiez que les listes de départ ont bien été publiées. |
| Un écran ne se met pas à jour | Les pages se mettent à jour toutes seules ; si l’une est figée, actualisez-la une fois. Vérifiez qu’elle pointe vers l’adresse actuelle du serveur. Les écrans affichent l’heure courante et la mention « LIVE » lorsqu’ils sont connectés, pour aider à vérifier. |
| Un anémomètre n’affiche aucune valeur | Vérifiez l’adresse réseau de l’anémomètre, qu’il est alimenté et qu’il émet ; le modèle est détecté automatiquement dès que des données arrivent. L’anémomètre affiche un statut En ligne / Hors ligne sur le serveur. |
| Le tableau RAZA est vide | Une classification et un genre doivent être renseignés pour qu’un score RAZA soit calculé. |
| Les résultats semblent dans le désordre ou un tour manque | Chaque résultat est horodaté par l’application de terrain ; assurez-vous que les appareils de terrain sont sur la bonne épreuve et à jour. Vérifiez que l’horloge de l’appareil de terrain et du serveur est correcte, elle peut dériver en usage hors ligne prolongé. |
Téléchargez la dernière version depuis www.polyfield.co.uk ou la page des versions. L’application vérifie les mises à jour au démarrage et affiche une bannière quand une version plus récente est disponible. Support : support@polyfield.co.uk.
PolyField Server expose une API simple en HTTP + JSON afin que d’autres logiciels sur le réseau du stade — tableaux d’affichage, visuels de diffusion, widgets d’affichage personnalisés ou une archive de résultats — puissent lire la compétition en direct et, le cas échéant, y envoyer des données. Elle est conçue pour le réseau local (LAN) uniquement : le serveur écoute sur le port 8080 à http://polyfieldserver.local:8080 (ou l’IP de l’hôte, p. ex. http://192.168.0.10:8080), en HTTP simple, sans authentification — il fait confiance à tous les appareils du réseau du stade. Gardez ce réseau privé ; n’exposez pas le port 8080 à Internet. Toute intégration exposée au WAN / à Internet (accéder au serveur depuis l’extérieur du stade, ou publier au-delà des résultats en ligne déjà intégrés) nécessite un chemin sécurisé et authentifié et doit d’abord être discutée avec nous — contactez support@polyfield.co.uk avant de développer contre une adresse publique.
Tous les points d’accès ci-dessous sont préfixés par /api/v1. Les lectures se font en GET, renvoient application/json et se mettent à jour dès qu’un résultat arrive. Pour rester en direct, ouvrez le flux Server-Sent Events GET /api/v1/stream et relisez le flux qui vous intéresse chaque fois qu’il émet un événement update (ou interrogez toutes les une à deux secondes).
| Méthode | Chemin | Rôle |
|---|---|---|
| GET | /api/v1/events |
Lister toutes les épreuves (id, nom, type) |
| GET | /api/v1/events/{id} |
Épreuve complète : athlètes, tous les essais, calibration, validation |
| GET | /api/v1/broadcast/recent |
Les 10 derniers essais, plus récents d’abord, avec coordonnées d’impact |
| GET | /api/v1/display/standings |
Classements ordonnés de toutes les épreuves |
| GET | /api/v1/athlete/active/{eventId} |
Sauteur horizontal actuel : planche + meilleures marques |
| GET | /api/v1/stream |
Signal de mise à jour en direct (Server-Sent Events) |
| POST | /api/v1/results |
Envoyer les essais d’un athlète (ingestion de l’application de terrain) |
| POST | /api/v1/athlete/active |
Annoncer le sauteur horizontal actuel |
Les marques sont des chaînes de caractères afin de pouvoir contenir des résultats non numériques : une distance/hauteur comme "54.37", ou "NM" (nul), "X" (hauteur manquée), "P"/"-" (impasse). wind est une chaîne en mètres par seconde (p. ex. "+1.2") ou absente. Les coordinates des lancers comprennent à la fois l’impact brut (x, y) et les rx/ry pivotés, relatifs au centre du cercle, en mètres.
GET /api/v1/events
[
{ "id": "T01", "name": "F09 O Discus Throw", "type": "Throws" },
{ "id": "T02", "name": "F03 O Long Jump", "type": "Horizontal Jumps" }
]
type vaut Throws, Horizontal Jumps ou Vertical Jumps.
GET /api/v1/events/{id}
{
"id": "T01",
"name": "F09 O Discus Throw",
"type": "Throws",
"status": "In Progress",
"rules": { "attempts": 6, "cutEnabled": false, "cutQualifiers": 0 },
"signedOff": true,
"signedOffBy": "A. Referee",
"signedOffAt": "2026-09-24T17:55:00+01:00",
"calibrationMetadata": {
"circleType": "DISCUS",
"circleRadius": 1.25,
"sectorLines": { "rightLine": { "x": 6.18, "y": 19.64 }, "leftLine": { "x": -6.18, "y": 19.64 }, "sectorAngle": 34.92 }
},
"athletes": [
{
"bib": "1", "order": 1, "name": "Dillon Claydon", "club": "Blackheath & Bromley HAC",
"series": [
{
"attempt": 1, "mark": "54.37", "unit": "m", "valid": true, "wind": null,
"coordinates": { "x": -1.54, "y": 19.08, "distance": 54.37, "round": 1, "attempt": 1, "valid": true, "rx": 1.68, "ry": 55.61 }
}
]
}
]
}
GET /api/v1/broadcast/recent — les 10 essais les plus récents, plus récents d’abord.
{
"results": [
{
"eventId": "T01", "eventName": "F09 O Discus Throw", "eventType": "Throws",
"athleteBib": "1", "athleteName": "Dillon Claydon", "athleteClub": "Blackheath & Bromley HAC",
"athleteBest": "55.80", "attempt": 3, "mark": "55.80", "unit": "m", "wind": null, "valid": true,
"timestamp": "2026-09-24T17:54:44+01:00",
"sectorLines": { "rightLine": { "x": 6.18, "y": 19.64 }, "leftLine": { "x": -6.18, "y": 19.64 }, "sectorAngle": 34.92 },
"coordinates": { "x": 41.7, "y": -36.5, "distance": 55.80, "round": 3, "attempt": 3, "valid": true, "rx": 0.90, "ry": 57.04 }
}
]
}
Les sauts verticaux utilisent height et attemptsAtHeight (p. ex. "XXO") au lieu d’une distance ; les sauts horizontaux comportent wind ; les lancers comportent sectorLines + coordinates.
GET /api/v1/display/standings
{
"events": [
{
"id": "T01", "name": "F09 O Discus Throw", "type": "Throws",
"athletes": [
{ "position": 1, "name": "Dillon Claydon", "club": "…", "bestMark": "55.80", "unit": "m", "wind": null }
]
}
]
}
GET /api/v1/athlete/active/{eventId} — qui saute maintenant pour une épreuve de saut en longueur/triple saut, pour un affichage règle de planche d’appel. Renvoie {"active": null} entre les athlètes.
{
"active": {
"eventId": "T02", "athleteBib": "11", "athleteName": "Jack Gunnell",
"board": 0, "topPerformances": [7.34, 7.28, 7.12],
"updatedAt": "2026-09-24T17:39:40+01:00"
}
}
board est la planche d’appel en mètres — 7, 9, 11 ou 13 au triple saut ; 0 est la planche du saut en longueur. topPerformances sont les meilleures marques valables de l’athlète jusqu’à présent dans cette épreuve, la meilleure d’abord, au maximum trois.
GET /api/v1/stream est un flux Server-Sent Events, pas un corps JSON. À la connexion, il envoie une ligne de commentaire, puis un simple message update chaque fois que les données de la compétition changent, ainsi que des pings de maintien sur une connexion inactive. Traitez tout update comme « quelque chose a changé — relisez le flux que vous affichez ».
: connected
data: update
: ping
Consommez-le avec un EventSource standard (navigateur) ou tout client SSE ; il n’y a aucun contenu à analyser — le jeton update constitue tout le signal.
Deux points d’accès POST acceptent du JSON. L’application de terrain utilise les deux ; toute ingestion par un tiers doit être convenue avec nous au préalable.
POST /api/v1/results — les essais d’un athlète (toute la série actuelle de cet athlète ; elle remplace ce que le serveur détient) :
{
"eventId": "T01",
"athleteBib": "1",
"series": [
{ "attempt": 1, "mark": "54.37", "unit": "m", "valid": true, "wind": null }
],
"heatmapCoordinates": [
{ "x": -1.54, "y": 19.08, "distance": 54.37, "round": 1, "attempt": 1, "valid": true }
],
"calibrationMetadata": { "circleType": "DISCUS", "circleRadius": 1.25, "sectorLines": { "rightLine": { "x": 6.18, "y": 19.64 }, "leftLine": { "x": -6.18, "y": 19.64 }, "sectorAngle": 34.92 } }
}
POST /api/v1/athlete/active — un signal « saute maintenant », envoyé sans attendre de réponse (planche en mètres, 0 = planche du saut en longueur ; topPerformances la meilleure d’abord, ≤3) :
{ "eventId": "T02", "athleteBib": "11", "athleteName": "Jack Gunnell", "board": 11.0, "topPerformances": [7.65, 7.42, 7.30] }
Les deux renvoient 200 avec un petit accusé de réception JSON. L’état de l’athlète actif est transitoire (uniquement en mémoire, effacé au redémarrage) ; tout le reste est sauvegardé avec la compétition.