diff --git a/sources/bdd_admin.c b/sources/bdd_admin.c index 7c51612..9790ae3 100644 --- a/sources/bdd_admin.c +++ b/sources/bdd_admin.c @@ -340,7 +340,7 @@ char tmp[MAX_LONGUEUR_BUFFER_TEMPORAIRE_DEBUG]; } //--------------------------------------------------------------------- - // NOUVEAU : marquage des lignes archivées (remplace l'incrémentation + // Marquage des lignes archivées (remplace l'incrémentation // de No_paquet). Même filtre que celui utilisé pour le dump (donc // 'AND Type=0' repris pour TB_Mesures_circuits), pour ne marquer que // ce qui vient réellement d'être archivé (cf synthèse §32.4) : @@ -363,7 +363,7 @@ char tmp[MAX_LONGUEUR_BUFFER_TEMPORAIRE_DEBUG]; } if (retour_commande != 0) break; - // NOUVEAU : remise à 'normale' - cette archive vient d'être confirmée transmise avec succès, le signal + // Remise à 'normale' de l'origine de la BDD : cette archive vient d'être confirmée transmise avec succès, le signal // 'factory'/'restauration' n'a donc plus besoin d'être retransmis à la prochaine archive (cf synthèse §35) : sprintf(requete, "UPDATE TB_Systeme SET Valeur='normale' WHERE Nom='Origine_bdd' "); if (mysql_query(bdd.pointeur, requete) != 0) @@ -373,7 +373,7 @@ char tmp[MAX_LONGUEUR_BUFFER_TEMPORAIRE_DEBUG]; retour_commande = -1; break; } - + } while(0); @@ -410,6 +410,9 @@ char tmp[MAX_LONGUEUR_BUFFER_TEMPORAIRE_DEBUG]; remove(nom_fichier_sauvegarde); sprintf(commande, "%s.%s", nom_fichier_sauvegarde, SUFFIXE_NOM_FICHIER_COMPRESSE_SAUVEGARDE_BDD); remove(commande); + + // Alerte Ship2net : + sonnette_vps("evenement"); } affichage_debug(__FILE__, __LINE__, "Fin de sauvegarde de la BDD", TYPE_MESSAGE_DEBUG_PAR_DEFAUT); diff --git a/sources/events.c b/sources/events.c index 5831afd..d0ce22c 100644 --- a/sources/events.c +++ b/sources/events.c @@ -350,6 +350,9 @@ char tmp[MAX_LONGUEUR_BUFFER_TEMPORAIRE_DEBUG]; // Enregistrement historique : enregistrement_historique(TYPE_SOURCE_HISTORIQUE_EVENTS, EVENT_DECLENCHEMENT, events.events[no_event].cle_primaire, 0, NULL); + // Alerte Ship2net : + if (events.events[no_event].alarme_email || events.events[no_event].alarme_sms) sonnette_vps("evenement"); + declenchement_event(no_event); if (events.events[no_event].conditions_horaires.nb > 0) events.events[no_event].sequenceur.etat = ETAT_SEQUENCEUR_EVENT_REPOS; // S'il y a condition horaire, on revient directement au repos, en attente de la prochaine condition horaire. @@ -373,6 +376,9 @@ char tmp[MAX_LONGUEUR_BUFFER_TEMPORAIRE_DEBUG]; // Enregistrement historique : enregistrement_historique(TYPE_SOURCE_HISTORIQUE_EVENTS, EVENT_FIN_DECLENCHEMENT, events.events[no_event].cle_primaire, 0, NULL); + + // Alerte Ship2net : + if (events.events[no_event].alarme_email || events.events[no_event].alarme_sms) sonnette_vps("evenement"); events.events[no_event].sequenceur.etat = ETAT_SEQUENCEUR_EVENT_REPOS; // Retour au repos } diff --git a/sources/fonctions.c b/sources/fonctions.c index 31ff065..b3117f6 100644 --- a/sources/fonctions.c +++ b/sources/fonctions.c @@ -8,6 +8,7 @@ #include "main.h" // Prototypes : +time_t maintenant_monotone(void); void date_courante(char* chaine, bool flag_ns, int format); int8_t set_date_heure(struct Struct_date date, struct Struct_heure heure); void delai_dixieme_sec(uint16_t tempo); @@ -28,6 +29,19 @@ volatile uint16_t tempo_delai_dixieme_sec; +//********************************************************************************************************************************************************************************** +// Fonction MAINTENANT_MONOTONE +// Renvoie un nombre de secondes insensible aux mises à l'heure +// Reçoit : Rien +// Retour : Valeur en secondes du compteur +//********************************************************************************************************************************************************************************** +time_t maintenant_monotone(void) +{ + struct timespec t; + clock_gettime(CLOCK_MONOTONIC, &t); + return t.tv_sec; +} + //********************************************************************************************************************************************************************************** // Fonction DATE_COURANTE diff --git a/sources/main.h b/sources/main.h index 32b8e37..d620a7d 100644 --- a/sources/main.h +++ b/sources/main.h @@ -1225,6 +1225,7 @@ struct Struct_systeme bool flag_new_download; // Positionné à TRUE (par 'modem.c') quand de nouveaux fichiers ont été downloadés du serveur. Permet à 'systeme.c' de lancer l'analyse de ces fichiers. uint16_t compteur_sauvegarde_bdd; // En secondes uint16_t compteur_check_new_download; // En secondes + time_t instant_derniere_sonnette; char cm3p_soft_version[MAX_TAILLE_VERSION_SOFT]; // Contient la version de soft de l'application char package_version[MAX_TAILLE_VERSION_SOFT]; // Contient la version de package sous la forme 'AAMMJJ_HHMMSS' char package_no_version[MAX_TAILLE_VERSION_SOFT]; // Contient le numéro de la version du package. Par exemple : "1.0.7" @@ -1410,6 +1411,7 @@ extern int8_t init_events(void); extern void gestion_events(void); // Fonctions.c +extern time_t maintenant_monotone(void); extern void date_courante(char* chaine, bool flag_ns, int format); extern int8_t set_date_heure(struct Struct_date date, struct Struct_heure heure); extern void delai_dixieme_sec(uint16_t tempo); @@ -1504,6 +1506,7 @@ extern struct Struct_json_version parse_json_version(char * nom_fichier, bool ve extern int8_t send_signal (int32_t pid, int32_t signal); extern int32_t get_pid_from_name (char * nom, char * parametres); extern int32_t get_pid_numbers_from_name (char * nom, char * parametres); +extern void sonnette_vps(const char *motif); // Usb.c extern int8_t init_usb(void); diff --git a/sources/systeme.c b/sources/systeme.c index f883316..52e4e42 100644 --- a/sources/systeme.c +++ b/sources/systeme.c @@ -29,6 +29,7 @@ int32_t get_pid_from_name (char * nom, char * parametres); int32_t get_pid_numbers_from_name (char * nom, char * parametres); int8_t version_compute_module(void); void affichage_ligne_version_compute_module(char * tmp, char * titre, char * valeur); +void sonnette_vps(const char *motif); // Variables globales : @@ -434,6 +435,14 @@ char tmp[MAX_LONGUEUR_BUFFER_TEMPORAIRE_DEBUG]; affichage_debug(__FILE__, __LINE__, "L'entrée Compagnon_Ready est passée à OFF", TYPE_MESSAGE_DEBUG_ERREUR); } } + + //============================================= + // Envoi des heartbeats au VPS pour Ship2net : + if (systeme.generation_shipbase >= GENERATION_SHIPBASE_V3) + { + if ((maintenant_monotone() - systeme.instant_derniere_sonnette) >= SYSTEME_PERIODE_HEARTBEAT_SHIP2NET) sonnette_vps("vie"); + } + //================================== // Sauvegarde régulière de la BDD : @@ -2182,3 +2191,16 @@ char chaine[MAX_LONGUEUR_BUFFER_TEMPORAIRE_DEBUG]; strcat(tmp, chaine); } + +//================================================================================================================================================================== +// Fonction : Lance la sonnette en arrière-plan : l'Appli n'attend jamais le réseau. +// Reçoit : Le motif à encapsuler dans le message de la sonnette +// Renvoit : Rien +//================================================================================================================================================================== +void sonnette_vps(const char *motif) +{ + char commande[96]; + snprintf(commande, sizeof(commande), "/usr/local/bin/sonnette_vps %s >/dev/null 2>&1 &", motif); + if (system(commande) == -1) { /* rien : le battement suivant ou le retour du réseau sonnera */ } + systeme.instant_derniere_sonnette = maintenant_monotone(); +} \ No newline at end of file diff --git a/sources/systeme.h b/sources/systeme.h index 05526c1..04eaf4e 100644 --- a/sources/systeme.h +++ b/sources/systeme.h @@ -50,6 +50,7 @@ #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_PERIODE_HEARTBEAT_SHIP2NET 600 // En secondes Le VPS déclare le bateau injoignable au-delà de 720 s sans signal #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 :