Thème
États système et états d'exploitation
Les états non zonés d'une centrale — les dix-sept clés de SystemFlagKeys (dotnet/shared/Profiles/), des synthèses feu et dérangement aux états d'unité de commande AVISS — sont décrits par des définitions de profil dont dérivent décodage, journal, acquittement, alertes, indicateurs de santé, plan et son.
Les quatre tables de zones étendues et les deux synthèses générales du firmware INIS-E16 sont supervisées de bout en bout sur ce socle : lecture Modbus, journalisation, acquittement, son, plan et contour d'application. Reste la validation au banc (essais JBUS E2 et E5).
Adressage
| Table | Adresse INIS (zone 1) | AVISS |
|---|---|---|
| Évacuation / Émission / DM | 8001 / 8021 / 8041 | identiques |
| Zones en neutralisation | 8061 | — |
| Zones en mode manuel seul | 8081 | — |
| Zones en arrêt d'urgence | 8101 | — |
| Zones en inhibition | 8121 | — |
| Synthèse générale | 1 (25 bits, 24 = neutralisation, 25 = manuel seul) | 1 (23 bits) |
Les quatre tables et les deux synthèses sont propres à l'INIS-E16. Le profil AVISS laisse leurs adresses nulles et ne déclare pas leurs bits : IncidentResolver.ZoneIncidents filtre sur ZoneAddress.HasValue et le décodage des états système ne retient que les bits déclarés. Aucune lecture n'est émise, aucun état n'est affiché, sans qu'aucun code ne teste le type de centrale.
Ajouter un état système
Trois entrées de données suffisent ; décodage, journalisation, acquittement, alertes, indicateurs de santé et son en dérivent. Il n'existe pas de table de sons système distincte : le son de l'état et son caractère critique se déclarent avec lui.
- La clé dans
SystemFlagKeys(dotnet/shared/Profiles/). - Le bit dans la carte
GlobalBitsde chaque centrale qui le sert (StandardPanelProfiles(dotnet/shared/Profiles/)). - La description dans
ModbusProfile.BuildStandardSystemFlags: type d'événement, sévérité, icône,AudioKeyetCritical, libellés (LabelKeypointant un nœud qui portelabeletdetails,ShortLabelKeypour les indicateurs de santé), index d'acquittement, priorité d'alerte. - Une migration de reseed, sur le modèle de
UpdateSystemFlagSeed: les profils standard sont semés parHasData, et le modèle EF diverge du snapshot tant que la migration manque. Les bases déjà en service sont, elles, réalignées au démarrage parDbInitializer.ApplyProfileMigration, qui recopieSystemFlagsJsondepuis la définition en code.
Une définition sans décalage de bit décrit un état que la centrale ne sert pas : il n'est ni lu, ni journalisé, ni acquittable, ni exposé au frontend. C'est ce qui distingue « non disponible sur ce firmware » de « inactif ».
Ajouter une table de zones suit le même principe avec IncidentDefinition : une adresse nulle sur un profil et la table n'est jamais lue.
Repli de lecture
Le profil INIS déclare 25 bobines de synthèse. Une centrale au firmware antérieur n'en sert que 23 et répond « adresse illégale » au-delà. GlobalCoilReader lit de façon optimiste, mémorise la dégradation par centrale et se replie sur la table de base : la centrale reste connectée en mode dégradé, ses états de zone restent fiables, et seules les deux synthèses deviennent indisponibles. Une exception esclave ne ferme jamais la connexion — c'est une réponse protocolaire, pas une panne.
Le simulateur reproduit ce cas : bascule « firmware ancien » dans l'IHM WPF, ou POST sim/{centrale}/firmware/{legacy|current} sur le canal headless.
Injection depuis le simulateur
La table des paramètres généraux du simulateur suit la structure du cahier : chaque bit servi par la centrale émulée est forçable indépendamment de l'état des zones — synthèses feu et dérangement, points hors service, zone en essai, défauts de communication des esclaves 01 à 08 sur AVISS, synthèses de neutralisation et de mode manuel seul sur INIS-E16. Chaque bit porte son adresse JBUS en infobulle. Les tables de zones étendues ne s'affichent que sur les centrales qui les servent, ce qui rend l'écran conforme au profil sans qu'aucun réglage ne soit à faire.
Habillage
- Sons : les quatre états de zone portent le son d'information, précédence 1 — sous le dérangement, jamais préemptif.
- Libellés :
useStatusLabelrésout l'acquittement, puis le profil d'incident, puis un repli i18n. Plus aucun statut brut à l'écran. - Alertes : chaque état s'affiche sous son propre statut, jamais en dérangement par défaut. Le statut vient de
DisplayStatus, aligné surSourceZoneStatus. - Chrome de l'application : ambre pour arrêt d'urgence et neutralisation, ciel pour inhibition et mode manuel seul, sous le dérangement. Le trait sous l'en-tête, la sélection des menus et le nom du site prennent cette couleur, sans clignotement.
- Plan : une centrale portant un état de synthèse reçoit un seul contour, dans la famille de couleur du statut le plus grave (
familyForStatus), la gravité venant de l'Orderdu profil. Les états qui causent un dérangement — alimentation, liaison, esclaves — sont couverts par le statut « dérangement ». Le contour englobe les éléments présents sur le plan affiché ; des grappes éloignées produisent une boucle chacune.
Groupement des incidents
Un incident réunit, pour une centrale et une nature d'événement, la synthèse générale et toutes les cibles qui la portent : GroupedIncident.states pour l'échelon centrale, targets pour les zones et leurs détecteurs. Les trois échelons sont signalés ensemble ; l'acquittement porte sur les états, si bien qu'un état non acquitté rejoignant un incident acquitté le repasse « à acquitter ».
Un échelon visible est un échelon acquittable : l'opérateur acquitte ce qu'il voit.
Acquittement
Tout état système ayant été actif reste exposé jusqu'à acquittement : à la retombée du bit sans acquittement, l'état passe à HardwareCleared (« Rétabli, en attente d'acquittement »). Aucun état ne s'efface de lui-même — un événement fugitif ne peut pas passer inaperçu.
Un acquittement vaut pour tout ce que son échelon contient, jamais pour ce qui le contient : PanelStateService.CascadeSystemAcknowledgmentAsync fait suivre aux zones résumées par la synthèse — celles dont le statut correspond à son SourceZoneStatus — l'acquittement de celle-ci, et ZoneManagementService fait de même des zones vers leurs points. Une synthèse sans SourceZoneStatus n'entraîne rien. Chaque échelon entraîné est consigné au journal sous le nom de l'opérateur.
Reste à faire
Validation au banc, bloquante avant livraison : campagne JBUS, essais E2 (têtes des quatre tables étendues) et E5 (table de base 1..23 puis extension 24..25, autorisée à échouer). L'essai E5 porte le verdict de génération de firmware ; il doit être passé sur au moins une centrale de chaque génération.