//********************************************************************************************************************************************************************************** // Fichier SYSTEME.H // // Contient tous les define liés aux fonctions système... //**********************************************************************************************************************************************************************************/ // Maximums : #define MAX_NOMBRE_MODULES (32+1) // Nombre maximal de cartes (y compris Compagnon) commandées par ShipHeart. A priori, toutes sont sur le k-bus + Compagnon #define MAX_NOMBRE_DEVICES_OW 32 // Nombre physique de device max (!= de MAX_NOMBRE_ENTREES_OW dans 'entrees.h') #define MAX_TAILLE_UNIQUE_ID 12 // Nombre d'octets de l'Unique ID stocké en ROM du µC #define MAX_TAILLE_TYPE_SOFT 20 // Taille de la chaine de caractère contenant les infos de type de logiciel (EXTENSION ou COMPAGNON) #define MAX_TAILLE_VERSION_SOFT 100 // Taille de la chaine de caractères contenant les infos de version logicielle #define MAX_TAILLE_EEPROM 256 // Taille, en octets, de la zone d'EEPROM utilisée pour stocker des paramètres de configuration. NB : cette dimension a un lien avec le champ 'Eeprom' dans TB_Modules_physiques qui fait 2xMAX_TAILLE_EEPROM pour pouvoir stocker chaque valeur sur 2 caractères alphas codés en hexa. #define MAX_BOUCLES_CALCUL_CRC 3 // Nombre de boucles max pour vérifier la lecture du CRC de l'application #define TAILLE_ADRESSE_MAC 6 // 6 octets stockés directement #define TAILLE_ADRESSE_IP_V4 16 // en caractères, pour stocker sous forme de chaine. Exemple : '123.123.123.123' #define TAILLE_ADRESSE_IP_V6 40 // en caractères, pour stocker sous forme de chaine. Exemple : '0123:0123:0123:0123:0123:0123:0123:0123' #define TAILLE_ADRESSE_IP TAILLE_ADRESSE_IP_V6 // Dans le doute... #define TAILLE_ROM_CODE_OW 8 // Nombre d'octets utilisés par les ROM Codes #define MAX_TAILLE_CRC 20 // Nombre maxi de caractères pour un CRC #define MAX_LONGUEUR_TOKEN_SHA256 32 // Le SHA256 est formé de... 256 bits, soit 32 octets. Attention : la chaine correspondante est formée de 65 caractères (32 x 2 car (hexa codé en Ascii) + NULL de fin) #define MAX_LONGUEUR_CHAINE_VERSION_CM 100 // Longueur maxi de la chaine représentant la version de Compute Module (renvoyée dans TB_Systeme.Version_cm) #define MAX_LONGUEUR_NOM_REPERTOIRE_LOCAL 200 // Longueur maxi du nom d'un répertoire local #define MAX_LONGUEUR_NOM_FICHIER 100 // Longueur maxi, y compris NULL de fin de chaine, d'un nom de fichier (SANS répertoire) #define MAX_LONGUEUR_NOM_BATEAU 50 // Nomre maxi de caractères du nom de bateau #define MAX_TAILLE_COMMANDE_SHELL 2000 // Taille maxi d'une commande Shell lancée via 'systeme()' #define MAX_LONGUEUR_URL 256 // Longueur maxi de l'URL (notament en HTTP). A priori, selon retour de AT+SHCONF?, le max serait 512. #define MAX_LONGUEUR_REQUETE_HTTP 512 // Longueur maxi de la requête HTTP (notamment GET). Cette longueur est vérifiable par 'AT+SHREQ=?' #define MAX_TAILLE_FICHIER_UPLOAD 10000000 // En octets. Tout fichier de taille supérieure ne pourra pas être uploadé #define MAX_TAILLE_BUFFER_UPLOAD 1500 // A priori, le modem limite à 1360 mais c'est quelque chose qui peut évoluer en fonction de la version de firmware, vorie en dynamique. #define MAX_TAILLE_FICHIER_DOWNLOAD 10000000 // En octets. Tout fichier de taille supérieure ne pourra pas être downloadé #define MAX_TAILLE_BUFFER_DOWNLOAD 5000 #define MAX_NOMBRE_FICHIERS_DOWNLOAD 100 // Nombre maxi de fichiers qui pourront être traités (s'il y en a plus, ils seront traités quand les premiers seront effacés). #define MAX_NOMBRE_PARAMETRES_LISTE_DOWNLOAD 12 // Nombre de paramètres d'une ligne FTPLIST (type commande 'ls -l') #define MAX_TAILLE_BLOC_DATA_CHARGEMENT_CODE 256 // Taille maximale d'un bloc de data lors du chargement de code (nb : c'est cette quantité qui est émise par défaut. Or, le chargement ne fonctionne qu'avec des multiples de 4 octets. Donc, merci de laisser une valeur multiple de 4...!!!!!) #define MAX_TAILLE_FICHIER_JSON 10000 // Taille maximale d'un fichier JSON #define MAX_TAILLE_DESCRIPTION_PACKAGE 4096 // Taille maxi du champ 'Description' d'un fichier JSON de version. #define MAX_REPETITIONS_CHARGEMENT_CODE 5 // Nb max de tentatives de répétitions lorsque le chargement sur une carte ne fonctionne pas // Timings : #define SYSTEME_TEMPO_INIT 0 // En x 10ms #define SYSTEME_TEMPO_ATTENTE_REINIT_PAR_DEFAUT 60 // En x 100ms Temporisation entre la réception d'une demande de réinit (transmise au Compagnon pour action) et l'arrêt "propre" de l'application. NB : sur le compagnon, l'exécution est temporisé de 8s ; il est donc prudent de caler cette tempo là en-dessous de cette valeur... #define SYSTEME_TEMPO_PERIODE_CHECK_NEW_DOWNLOAD 3600 // En secondes En pratique, la tempo est ramenée à 1min après chaque connexion réseau. Cette valeur est donc un max si aucune connexion réseau n'est faite... #define SYSTEME_TEMPO_REPORT_SAUVEGARDE 5 // En secondes Temporisation si une sauvagarde est demandée alors qu'un archivage est déjà en cours (non critique car la test d'archivage en cours sera effectué à la fin de cette tempo et, si besoin, relancée) #define SYSTEME_TEMPO_ATTENTE_DISPO_C_BUS 10 // En x 10ms NB : tempo non critique car attentes multiples jusqu'à ce que C-Bus soit dispo #define SYSTEME_TEMPO_LECTURE_ID_CARTES 1 // En x 10ms NB : Tempo non critique, elle permet juste de ne pas faire des tests en permanence en attendant la réception de tous les ID #define SYSTEME_TIME_OUT_LECTURE_ID_CARTES 10 // En x 100ms SDIR #304 #define SYSTEME_TIME_OUT_ANNUAIRE_ONE_WIRE 5 // En x 100ms #define SYSTEME_TEMPO_ATTENTE_CONFIG_CARTES 30 // En x 10ms NB : tempo non critique car permet juste d'éviter de recevoir des commandes UP sur des cartes non configurées (donc générant des retours d'erreur vers le Compagnon). NB : les commandes UP génériques ET avec Haute Priorité passent quand même pendant ce temps... #define SYSTEME_ATTENTE_DEMARRAGE_COMPTEUR_BOUCLE_PRINCIPALE 5 // en secondes. Défini l'attente avant prise en compte des mesures de nb de boucles principales #define SYSTEME_ATTENTE_BOUCLE_PRINCIPALE_TEMPO 1000 // en nanosecondes théoriquement... Cf ci-dessous // Mesures effectuées le 28/04/2018, le 02/09/2020 et le 26/03/2021 sur CM3+ pour ShipHeart : // Valeur Boucles/secondes Load average @1min (première valeur de HTOP) // 0 65 000 3.2 - 3.8 (sur 4.0 max !) (==> mise en commentaires du 'delai_nano_sec') // 1 10 000 - 11000 3.1 - 3.8 // 2 9 500 - 11 000 2.3 - 2.6 // 5 9 500 - 10 500 2.3 - 2.6 // 10 => environ 11 000 boucles/sec. Charge CPU = 40% // 100 => environ 11 000 boucles/sec. Charge CPU = 40% // 1 000 => environ 10 500 boucles/sec. Charge CPU = 39% // 10 000 => environ 9 500 boucles/sec. Charge CPU = 35-38%. Load Average (@1min) = 0.25-0.30 avec pointes à 0.55 // 100 000 => environ 4 300 boucles/sec. Charge CPU = 29% // 1 000 000 => environ 800 boucles/sec. Charge CPU = 6% ==> déclenche des erreurs de bus SPI (plusieurs dizaines par jour... d'où ces mesures) // 10 000 000 => environ 90 boucles/sec. Charge CPU = 1% // Nouvelles mesures sur CM4 (4Go) le 23/12/2023 : // 1 000 => environ 12 000 boucles/sec (très stable !). Charge CPU = 30-35%. Load average 0.33-0.35 avec des pointes à 0.50 // 10 000 => entre 7000 et 11000 (avg = 9500) boucles/sec (assez instable). Charge CPU = 28-35%. Load average 0.60-0.80 avec des pointes à 0.90 #define MISE_A_JOUR_TEMPO_INIT 20 // En x 100ms Dans tous les cas, l'init du séquenceur de Mise_à_jour ne se fera que lorsque l'analyse de l'annuaire aura été fait. Cette tempo n'est donc pas critique... #define MISE_A_JOUR_TIME_OUT_HTTP_GET 600 // En x 100ms Time-out de l'échange HTTP GET #define CHARGEMENT_CODE_TEMPO_INIT 2 // En x 100ms // Il n'y a aucune raison d'attendre... #define CHARGEMENT_CODE_TEMPO_ATTENTE_EFFACEMENT_FLASH 50 // En x 100ms // Durée théorique env. 1.9s voire 3.4s pour les L151 @12MHz #define CHARGEMENT_CODE_TIME_OUT_ATTENTE_ECRITURE_BLOC 10 // En x 100ms #define CHARGEMENT_CODE_TEMPO_ATTENTE_INTER_BLOCS_COMPAGNON 1 // En x 100ms #define CHARGEMENT_CODE_TEMPO_ATTENTE_INTER_BLOCS_K_BUS 3 // En x 100ms // Tests Ok fait avec 200ms sur ShipBS (lent...) mais 2 noeuds sur K-Bus. Par sécurité, la tempo est laissée à 300ms... #define CHARGEMENT_CODE_TEMPO_ATTENTE_FIN_ACTIVATION 50 // En x 100ms // Durée entre l'envoi des commandes d'activation après chargement et demande de réinitialisation // Erreurs système : #define ERREUR_SYSTEME_AUCUNE 0 #define ERREUR_SYSTEME_CONFIG -1 #define ERREUR_SYSTEME_RESEAU -2 // Types de cartes : #define TYPE_CARTE_INCONNU -1 #define TYPE_CARTE_SHIPBASE 0 #define TYPE_CARTE_SP812 1 #define TYPE_CARTE_SBS 2 #define TYPE_CARTE_SP4AC 3 #define TYPE_CARTE_SP8DC 4 #define GENERATION_SHIPBASE_INCONNUE 0 #define GENERATION_SHIPBASE_V1 1 // Entre 2020 et 2022, équipés de CM3+ #define GENERATION_SHIPBASE_V2 2 // A partir de 2023, équipés de CM4. A noter que la 'hardware_version' reçue du Compagnon doit correspondre à cette évolution. #define GENERATION_SHIPBASE_V3 3 // Les SHipBase V2, équipés de CM5 (début = 08/2026) // Adresses IP : #define ADRESSE_IP_INCONNUE "inconnue" // Valeur utilisée par défaut, au démarrage de l'application. Attention, la taille doit être inférieure à TAILLE_ADRESSE_IP - 1. // Demandes Système : #define SYSTEME_SIGNAL_AUCUN 0 // Valeur par défaut. Les valeurs de signaux ont toute une valeur > 0 // Valeurs de Mode_validation_maj : #define MODE_VALIDATION_MAJ_AUCUNE 0 #define MODE_VALIDATION_MAJ_MANUELLE 1 #define MODE_VALIDATION_MAJ_AUTOMATIQUE 2 // Valeurs de Mode_maj_firmwares : #define MODE_MAJ_FIRMWARES_NORMAL 0 #define MODE_MAJ_FIRMWARES_SI_DIFFERENTS 1 #define MODE_MAJ_FIRMWARES_TOUJOURS 2 // Valeurs de Demande_maj_soft : // #define DEMANDE_MAJ_SOFT_AUCUNE 0 // Valeur de repos // #define DEMANDE_MAJ_SOFT_VALIDATION 1 // Vlaidation du fichier dans A_VALIDER qui sera copié dans A_CHARGER // #define DEMANDE_MAJ_SOFT_CHARGEMENT 2 // Idem VALIDATION + demande de reset pour prise en compte immédiate // #define DEMANDE_MAJ_SOFT_ANNULATION -1 // Suppression du fichier présent dans A_VALIDER ou dans A_CHARGER (les 2 sont vidés) // Etat de veille #define SYSTEME_VEILLE_AUCUNE 0 #define SYSTEME_VEILLE_LEGERE 1 #define SYSTEME_VEILLE_PROFONDE 2 // Modes de chargement de code : #define CHARGEMENT_CODE_MODE_EFFACEMENT_FLASH 0 #define CHARGEMENT_CODE_MODE_CHARGEMENT_BLOC 1 #define CHARGEMENT_CODE_MODE_CHECK_CRC 2 #define CHARGEMENT_CODE_MODE_VALIDATION_VERSION 3 // Etat séquenceur Système : #define ETAT_SEQUENCEUR_SYSTEME_INIT 0 #define ETAT_SEQUENCEUR_SYSTEME_ATTENTE_ANNUAIRE_K_BUS 1 #define ETAT_SEQUENCEUR_SYSTEME_LECTURE_ID_CARTES 2 #define ETAT_SEQUENCEUR_SYSTEME_ATTENTE_ANNUAIRE_ONE_WIRE 3 #define ETAT_SEQUENCEUR_SYSTEME_CHARGEMENT_CONFIG_CARTES 4 #define ETAT_SEQUENCEUR_SYSTEME_ATTENTE_CONFIG_CARTES 5 #define ETAT_SEQUENCEUR_SYSTEME_REPOS 10 #define ETAT_SEQUENCEUR_SYSTEME_DEMARRAGE_IMPOSSIBLE 20 // Etat séquenceur Chargement de Code : #define ETAT_SEQUENCEUR_CHARGEMENT_CODE_INIT 0 #define ETAT_SEQUENCEUR_CHARGEMENT_CODE_REPOS 1 #define ETAT_SEQUENCEUR_CHARGEMENT_CODE_LANCEMENT 2 #define ETAT_SEQUENCEUR_CHARGEMENT_CODE_LANCEMENT_CARTE 3 #define ETAT_SEQUENCEUR_CHARGEMENT_CODE_EFFACEMENT_FLASH 4 #define ETAT_SEQUENCEUR_CHARGEMENT_CODE_CHARGEMENT_BLOC 5 #define ETAT_SEQUENCEUR_CHARGEMENT_CODE_ATTENTE_INTER_BLOCS 6 #define ETAT_SEQUENCEUR_CHARGEMENT_CODE_VERIFICATION_CRC 7 #define ETAT_SEQUENCEUR_CHARGEMENT_CODE_FIN_CARTE 8 #define ETAT_SEQUENCEUR_CHARGEMENT_CODE_FIN_CHARGEMENT 9 #define ETAT_SEQUENCEUR_CHARGEMENT_CODE_FIN_ACTIVATION 10 #define ETAT_SEQUENCEUR_CHARGEMENT_CODE_ERREUR 11