Thème
Shared — sources uniques partagées
Bibliothèque de classes contenant ce que plusieurs exécutables doivent lire de façon identique : adresses Modbus des centrales livrées, vocabulaire des états système, empreinte matérielle du poste, format de licence, configuration applicative et identité de marque.
| Technologie | C# .NET 9, bibliothèque de classes |
| Namespace racine | FireSupervisor.Shared |
| Paquet | System.Management — requis par la lecture WMI de l'empreinte poste |
| Consommateurs | backend, client, manager, simulator, simulator.core, license-generator, tests/tools |
Structure
| Fichier | Contenu |
|---|---|
AppConfig.cs | Lecture de app.config.json : noms, version, éditeur, service, port, chemins, configuration de l'installateur |
BrandProfile.cs | Identité du distributeur appliquée au poste — noms, couleurs, images |
Hardware/HardwareInfo.cs | Empreinte matérielle du poste |
Licensing/ | LicenseEnvelope, LicensePayload, LicenseRequest, LicenseStatus, LicenseStore, LicenseVerifier |
Profiles/PanelRegisterMap.cs | Forme d'une cartographie de registres |
Profiles/StandardPanelProfiles.cs | Cartographies INIS-E16 et AVISS |
Profiles/SystemFlagKeys.cs | 17 clés d'état système |
Mécanismes non évidents
Une adresse Modbus n'est déclarée qu'ici
StandardPanelProfiles est la source unique des adresses fil JBUS et des codes de commande des centrales livrées. Le backend en dérive ses profils (ModbusProfile.CreateInisE16() / CreateAviss()) et le simulateur en dérive les centrales qu'il sert. Corriger une adresse d'un seul côté est impossible : les deux lisent le même enregistrement.
Deux valeurs y sont documentées comme des écarts assumés au cahier des charges Desautel :
| Valeur | Ce qu'elle porte |
|---|---|
PointDisableAddress | 1001 sur AVISS, valeur décimale de la table d'échange ; 953 sur INIS-E16, relevé sur centrales réelles. La colonne hexadécimale du cahier (0x03B9 = 953) est erronée sur cette ligne |
AddressOffset = 0 | Les adresses du cahier sont des adresses fil brutes, envoyées telles quelles |
Un état système est identifié par sa clé, pas par son bit
SystemFlagKeys porte 17 clés. Chaque cartographie déclare quels bits elle sert et à quelle position — l'INIS-E16 en déclare 11, l'AVISS 15, et les deux ensembles ne se recouvrent pas complètement.
| Cas | Détail |
|---|---|
| Un état porté à des positions différentes | La clé est la même, GlobalBits diffère |
| Un état non porté par une centrale | Sa clé est simplement absente de GlobalBits |
| Une clé traverse toute la chaîne | Cartographie → définitions du backend → persistance des acquittements → frontend |
Les bits 8 à 21 ne sont pas déclarés sur l'INIS-E16 : le cahier les y marque « non utilisable ». Les bits 23 et 24 lui sont au contraire propres.
L'empreinte matérielle doit être calculée à l'identique par trois exécutables
HardwareInfo est la source unique consommée par le client de supervision, le gestionnaire de service et le générateur de licences. Une divergence invaliderait silencieusement toutes les licences.
| Calcul | SHA-256 (256 bits, 64 caractères hexadécimaux) de l'UUID système, du numéro de série de la carte mère et de l'identifiant CPU |
| Hors Windows | Les appels WMI sont gardés en interne ; une valeur sentinelle est rendue, sans contrainte de plateforme imposée aux appelants |
La licence est liée au matériel, pas à une session Windows
LicenseStore cherche le fichier dans cet ordre :
| Rang | Emplacement | Rôle |
|---|---|---|
| 1 | %ProgramData%\Superviseur\license.key | Couvre tous les comptes du poste |
| 2 | %AppData%\Superviseur\license.key | Repli en écriture quand le processus n'a pas les droits sur le premier |
Une licence refusée n'écrase jamais celle en place.
Une marque n'apporte que des données
BrandProfile lit un dossier de marque déposé par l'installateur. L'application ne l'écrit jamais et une marque ne porte aucun code. Le backend sert cette identité à l'interface ; le client de bureau et le gestionnaire y prennent leurs couleurs.
app.config.json est cherché à côté de l'exécutable
Chaque exécutable qui en dépend en reçoit une copie à la compilation. Sans elle, AppConfig.Load() retombe silencieusement sur ses valeurs par défaut — version 0.0.0, port 5000, URL https://localhost:5000.
Le chemin de données applicatif est résolu par PathsConfig : AppDataDev (%LOCALAPPDATA%\Superviseur_Dev) ou AppDataProd (%ProgramData%\Superviseur) selon l'environnement.
Contraintes actives
| Contrainte | Conséquence si elle est ignorée |
|---|---|
La clé publique de vérification des licences vit dans Licensing/LicenseVerifier.cs | La changer sans régénérer les licences déployées rend tous les postes non activés |
| Aucune clé privée n'entre dans ce projet | Seule la vérification est partagée ; l'émission vit dans license-generator |
Le projet cible net9.0 sans dépendance graphique | Il est référencé par des projets Windows comme par des projets multiplateformes |