//********************************************************************************************************************************************************************************** // Fichier BDD_SYNCHRO.C // // Contient les fonctions de synchronisation de la BDD avec l'appli // //********************************************************************************************************************************************************************************** //#define __DEBUG_TIMING_SYNCHRO_BDD // Si cette ligne est active, affiche à chaque synchro (T=1s) le temps d'exécution de la boucle complète, avec et sans l'appel à la fonction 'enregistrement_mesures()'. // Include : #include "main.h" // Prototypes : void synchro_bdd(void); // Variables globales : //********************************************************************************************************************************************************************************** // Fonction SYNCHRO_BDD // // Fonction initialisant l'accès à la base de données... //********************************************************************************************************************************************************************************** void synchro_bdd(void) { int8_t val_8; int16_t val_16; uint8_t val_u8; uint16_t val_u16; uint32_t val_u32; float val_f; bool flag_synchro_web = FALSE; bool flag_synchro_wifi = FALSE; bool flag_scan_wifi_sta = FALSE; bool flag_demande_maj_nmea = FALSE; uint16_t i, j, k; char *ptr[MAX_NOMBRE_CHAMPS_INTERNES]; char requete[MAX_LONGUEUR_REQUETE_MYSQL]; MYSQL_RES *result = NULL; MYSQL_ROW row = NULL; time_t now; struct tm date; struct tm date_fin; char chaine_date_fin[MAX_LONGUEUR_DATE_COURANTE]; char tmp[MAX_LONGUEUR_BUFFER_TEMPORAIRE_DEBUG]; // Lecture "fréquente" du flag de synchro dans la BDD : if (bdd.compteur_synchro == 0) { bdd.compteur_synchro = PERIODE_CHECK_SYNCHRO_WEB; sprintf(requete, "SELECT Valeur FROM TB_Systeme WHERE Nom='Synchro' AND Valeur!=0 "); mysql_query(bdd.pointeur, requete); // Envoi de la requête à MYSQL result = mysql_store_result(bdd.pointeur); // Récup des résultats de la requête while((row = mysql_fetch_row(result))) // Boucle sur tous les résultats de la requête { i = atoi(row[0]); sprintf(requete, "UPDATE TB_Systeme SET Valeur='0' WHERE Nom='Synchro'"); // RAZ du flag de synchro dans la BDD (faite immédiatement car le traitement ensuite peut être long) mysql_query(bdd.pointeur, requete); switch(i) { case 1: // Demande de synchro { flag_synchro_web = TRUE; break; } case 2: // Changement de config { //printf("Demande de resynchro reçue\n"); re_configuration_systeme(); break; } default : ; } } mysql_free_result(result); //Libération du jeu de résultat } // Synchronisation avec la BDD toutes les secondes si aucune demande spécifique n'a été reçue OU synchro immédiate si demande reçue : if (((bdd.compteur == 0) || flag_synchro_web) && (systeme.flag_cm3p_ready)) { #ifdef __DEBUG_TIMING_SYNCHRO_BDD uint32_t deb, fin_1, fin; deb = clock(); #endif bdd.compteur = PERIODE_MAJ_BDD; // A priori, toute les secondes (cf GESTION_BDD.H). NB : si la demande vient du web, on relance la tempo asynchrone... // ******************************************************************************************************************************************************** // SYSTEME // ******************************************************************************************************************************************************** // Recherche d'une condition d'archivage : now = time (NULL); // lire l'heure courante, date = *localtime (&now); // et la convertir en heure locale. if (date.tm_sec == 0) // Si on n'est pas sur une minute ronde, on ne fait rien... { now = now - 1; // On se met 1s avant (donc xx:xx:59). Un peu "symbolique" mais permet de bien marquer que c'est la FIN de la période (et on enregistre ensuite les mesures d'énergie avec cette valeur...) date_fin = *localtime (&now); // Conversion en heure locale strftime (chaine_date_fin, MAX_LONGUEUR_DATE_COURANTE, "%Y-%m-%d %H:%M:%S", &date_fin); // Passage en chaine au format SQL. Exemple : "2023-12-19 13:04:59" if ((date.tm_min % 5) == 0) // Si on est sur "5min rondes" : { if (date.tm_min == 0) // Si on est sur une "heure ronde" : { sprintf(tmp, "Periode de type 2 détectée avec Fin = %s", chaine_date_fin); affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_PAR_DEFAUT); archivage_bdd(chaine_date_fin, BDD_TYPE_ARCHIVAGE_1_HEURE); // Déclenchera d'abord un archivage de Type 3 avant d'enchainer directement sur un archivage de Type 2 } else // Sinon, c'est qu'on est sur xx:05, xx:10, xx:15... (mais PAS sur xx:00) { if ((date.tm_hour == 0) && (date.tm_min == 5)) // La purge est volontairement décalée à 00h05 car l'archivage de 00h00 fait un Type 3 puis un Type 2 dans la foulée. Ici, on fera "juste" un Type 3 avant de faire la purge. { sprintf(tmp, "Periode de type 3 + purge détectée avec Fin = %s", chaine_date_fin); affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_PAR_DEFAUT); archivage_bdd(chaine_date_fin, BDD_TYPE_ARCHIVAGE_5_MINUTES_ET_PURGE); } else { sprintf(tmp, "Periode de type 3 détectée avec Fin = %s", chaine_date_fin); affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_PAR_DEFAUT); archivage_bdd(chaine_date_fin, BDD_TYPE_ARCHIVAGE_5_MINUTES); } } } } // Recherche des nouvelles consignes reçues depuis le web : sprintf(requete, "SELECT Nom, Valeur FROM TB_Systeme "); mysql_query(bdd.pointeur, requete); // Envoi de la requête à MYSQL result = mysql_store_result(bdd.pointeur); // Récup des résultats de la requête while((row = mysql_fetch_row(result))) // Boucle sur tous les résultats de la requête { //--------------------------------------------------------------- if (strstr(row[0], "New_bip") != NULL) { if (row[1][0] != 0) // On ne traite que si Valeur != "" : { i = 0; ptr[i] = strtok (row[1],"/"); // Extraction du premier segment avant le premier '/' ATTENTION : si aucun délimiteur trouvé, la fonction renvoit la chaine entière (et pas NULL...) while ((ptr[i] != NULL) && (i < MAX_NOMBRE_CHAMPS_INTERNES)) { i ++; ptr[i] = strtok (NULL, "/"); // Extraction du segment suivant le prochain '/' } // Check du nombre de champs trouvés : if (i != 4) { sprintf(tmp, "La demande de New_bip n'a pas un format acceptable (%i segments pour 4 attendus). La demande est rejetée...", i); affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_ERREUR); } else if (strlen(ptr[0]) >= MAX_LONGUEUR_NOM_FICHIER) { sprintf(tmp, "Le nom de fichier reçu via le champ New_bip est trop long (%li caractères pour %i max). La demande est rejetée...", strlen(ptr[0]), MAX_LONGUEUR_NOM_FICHIER); affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_ERREUR); } else emission_bip(ptr[0], atoi(ptr[1]), atoi(ptr[2]), atoi(ptr[3])); // NB : si 'atoi()' rencontre une erreur, il retourne '0' qui sera traité sans problème par 'emission_bip()' } // RAZ de la demande dans la BDD : sprintf(requete, "UPDATE TB_Systeme SET Valeur='' WHERE Nom='New_bip' "); mysql_query(bdd.pointeur, requete); } //--------------------------------------------------------------- if (strstr(row[0], "Consigne_modem") != NULL) { val_8 = atoi(row[1]); if ((val_8 == 0) || (val_8 == 1)) { modem.consigne = val_8; // RAZ de la demande dans la BDD : sprintf(requete, "UPDATE TB_Systeme SET Valeur='-1' WHERE Nom='Consigne_modem' "); mysql_query(bdd.pointeur, requete); // Enregistrement dans l'historique : enregistrement_historique(TYPE_SOURCE_HISTORIQUE_SYSTEME, SYSTEME_MODEM_DEMANDE_ACTIVATION, 0, modem.consigne, NULL); } } //--------------------------------------------------------------- else if (strstr(row[0], "Veille") != NULL) { val_u8 = atoi(row[1]); if ((val_u8 != systeme.veille) && (val_u8 <= SYSTEME_VEILLE_PROFONDE)) { systeme.veille = val_u8; if (systeme.veille == 0) set_luminosite_ecran(ecran.consigne_backlight); else set_luminosite_ecran(0); // Enregistrement dans l'historique : enregistrement_historique(TYPE_SOURCE_HISTORIQUE_SYSTEME, SYSTEME_CHANGEMENT_VEILLE, 0, systeme.veille, NULL); } } //--------------------------------------------------------------- else if (strstr(row[0], "Demande_decouverte_ow") != NULL) { val_u8 = atoi(row[1]); if (val_u8 == 1) { c_bus_down_commande_config_ow(); // Envoi de la demande au Compagnon. // NB : à la fin de la découverte réseau, le Compagnon va remonter une commande 'c_bus_up_commande_etat_entrees_ow' avec un code // particulier (code_reinit) qui permettra automatiquement au CM4, et de façon synchrone, d'émettre une commande 'c_bus_down_reponse_annuaire_ow()' // RAZ de la demande dans la BDD : sprintf(requete, "UPDATE TB_Systeme SET Valeur='0' WHERE Nom='Demande_decouverte_ow' "); mysql_query(bdd.pointeur, requete); } } //--------------------------------------------------------------- else if (strstr(row[0], "Demande_connexion_serveur") != NULL) { val_u8 = atoi(row[1]); switch (val_u8) { default: case MODEM_DEMANDE_UTILISATEUR_AUCUNE: break; case MODEM_DEMANDE_UTILISATEUR_DOWNLOAD: { if (modem.compteur_periode_download > MODEM_DEMANDE_UTILISATEUR_TEMPO_MINI) modem.compteur_periode_download = MODEM_DEMANDE_UTILISATEUR_TEMPO_MINI; break; } case MODEM_DEMANDE_UTILISATEUR_UPLOAD: { if (modem.compteur_periode_upload > MODEM_DEMANDE_UTILISATEUR_TEMPO_MINI) modem.compteur_periode_upload = MODEM_DEMANDE_UTILISATEUR_TEMPO_MINI; break; } case MODEM_DEMANDE_UTILISATEUR_DOWNLOAD_UPLOAD: { if (modem.compteur_periode_download > MODEM_DEMANDE_UTILISATEUR_TEMPO_MINI) modem.compteur_periode_download = MODEM_DEMANDE_UTILISATEUR_TEMPO_MINI; if (modem.compteur_periode_upload > MODEM_DEMANDE_UTILISATEUR_TEMPO_MINI) modem.compteur_periode_upload = MODEM_DEMANDE_UTILISATEUR_TEMPO_MINI + 1; // A priori, on force l'Upload à passer après le download. break; } } if (val_u8 != MODEM_DEMANDE_UTILISATEUR_AUCUNE) // RAZ de la demande dans la BDD : { sprintf(requete, "UPDATE TB_Systeme SET Valeur='%i' WHERE Nom='Demande_connexion_serveur' ", MODEM_DEMANDE_UTILISATEUR_AUCUNE); mysql_query(bdd.pointeur, requete); } } //--------------------------------------------------------------- else if (strstr(row[0], "Demande_reboot") != NULL) { if (strcmp(row[1], "Reboot") == 0) { // RAZ du flag dans la BDD : sprintf(requete, "UPDATE TB_Systeme SET Valeur='' WHERE Nom='Demande_reboot' "); mysql_query(bdd.pointeur, requete); // Lancement de la réinit : lancement_reinit(0); // La valeur 0 indique d'utiliser la valeur par défaut } } //--------------------------------------------------------------- else if (strstr(row[0], "Aube_nautique") != NULL) { if ((strlen(row[1]) == 5) && (row[1][2] == ':')) // Doit être de la forme "hh:mm" { tmp[0] = row[1][0]; tmp[1] = row[1][1]; tmp[2] = 0; systeme.heures_speciales[HEURE_SPECIALE_AUBE_NAUTIQUE].heures = atoi(tmp); tmp[0] = row[1][3]; tmp[1] = row[1][4]; tmp[2] = 0; systeme.heures_speciales[HEURE_SPECIALE_AUBE_NAUTIQUE].minutes = atoi(tmp); systeme.heures_speciales[HEURE_SPECIALE_AUBE_NAUTIQUE].secondes = 0; } } //--------------------------------------------------------------- else if (strstr(row[0], "Lever_soleil") != NULL) { if ((strlen(row[1]) == 5) && (row[1][2] == ':')) // Doit être de la forme "hh:mm" { tmp[0] = row[1][0]; tmp[1] = row[1][1]; tmp[2] = 0; systeme.heures_speciales[HEURE_SPECIALE_LEVER_SOLEIL].heures = atoi(tmp); tmp[0] = row[1][3]; tmp[1] = row[1][4]; tmp[2] = 0; systeme.heures_speciales[HEURE_SPECIALE_LEVER_SOLEIL].minutes = atoi(tmp); systeme.heures_speciales[HEURE_SPECIALE_LEVER_SOLEIL].secondes = 0; } } //--------------------------------------------------------------- else if (strstr(row[0], "Zenith") != NULL) { if ((strlen(row[1]) == 5) && (row[1][2] == ':')) // Doit être de la forme "hh:mm" { tmp[0] = row[1][0]; tmp[1] = row[1][1]; tmp[2] = 0; systeme.heures_speciales[HEURE_SPECIALE_ZENITH].heures = atoi(tmp); tmp[0] = row[1][3]; tmp[1] = row[1][4]; tmp[2] = 0; systeme.heures_speciales[HEURE_SPECIALE_ZENITH].minutes = atoi(tmp); systeme.heures_speciales[HEURE_SPECIALE_ZENITH].secondes = 0; } } //--------------------------------------------------------------- else if (strstr(row[0], "Coucher_soleil") != NULL) { if ((strlen(row[1]) == 5) && (row[1][2] == ':')) // Doit être de la forme "hh:mm" { tmp[0] = row[1][0]; tmp[1] = row[1][1]; tmp[2] = 0; systeme.heures_speciales[HEURE_SPECIALE_COUCHER_SOLEIL].heures = atoi(tmp); tmp[0] = row[1][3]; tmp[1] = row[1][4]; tmp[2] = 0; systeme.heures_speciales[HEURE_SPECIALE_COUCHER_SOLEIL].minutes = atoi(tmp); systeme.heures_speciales[HEURE_SPECIALE_COUCHER_SOLEIL].secondes = 0; } } //--------------------------------------------------------------- else if (strstr(row[0], "Crepuscule_nautique") != NULL) { if ((strlen(row[1]) == 5) && (row[1][2] == ':')) // Doit être de la forme "hh:mm" { tmp[0] = row[1][0]; tmp[1] = row[1][1]; tmp[2] = 0; systeme.heures_speciales[HEURE_SPECIALE_CREPUSCULE_NAUTIQUE].heures = atoi(tmp); tmp[0] = row[1][3]; tmp[1] = row[1][4]; tmp[2] = 0; systeme.heures_speciales[HEURE_SPECIALE_CREPUSCULE_NAUTIQUE].minutes = atoi(tmp); systeme.heures_speciales[HEURE_SPECIALE_CREPUSCULE_NAUTIQUE].secondes = 0; } } //--------------------------------------------------------------- else if (strstr(row[0], "Demande_maj_nmea") != NULL) { val_u8 = atoi(row[1]); if (val_u8 == 1) { flag_demande_maj_nmea = TRUE; // Flag traité en fin de cette fonction... // RAZ de la demande dans la BDD : sprintf(requete, "UPDATE TB_Systeme SET Valeur='0' WHERE Nom='Demande_maj_nmea' "); mysql_query(bdd.pointeur, requete); } } } mysql_free_result(result); //Libération du jeu de résultat // Recherche des nouveaux paramètres de config reçus depuis le web : sprintf(requete, "SELECT Nom, Valeur FROM TB_Configuration "); mysql_query(bdd.pointeur, requete); // Envoi de la requête à MYSQL result = mysql_store_result(bdd.pointeur); // Récup des résultats de la requête while((row = mysql_fetch_row(result))) // Boucle sur tous les résultats de la requête { //--------------------------------------------------------------- if (strstr(row[0], "Fuseau_horaire") != NULL) { val_8 = atoi(row[1]); if (val_8 != systeme.fuseau_horaire) { if ((val_8 >= -14) && (val_8 <= 12)) systeme.fuseau_horaire = val_8; } } //--------------------------------------------------------------- if (strstr(row[0], "Heure_ete") != NULL) { val_u8 = atoi(row[1]); if (val_u8 != systeme.heure_ete) { if ((val_u8 == 0) || (val_u8 == 1)) systeme.heure_ete = val_u8; } } //--------------------------------------------------------------- if (strstr(row[0], "Validation_leds") != NULL) { val_u16 = atoi(row[1]); if ((val_u16 != ecran.validation_leds) && (val_u16 <= 1)) { ecran.validation_leds = val_u16; if (systeme.veille == SYSTEME_VEILLE_AUCUNE) { if (ecran.validation_leds == 0) c_bus_down_commande_cde_backlight(ecran.consigne_backlight, 0); else c_bus_down_commande_cde_backlight(ecran.consigne_backlight, ecran.consigne_leds); } else { if (ecran.validation_leds == 0) c_bus_down_commande_cde_backlight(0, 0); else c_bus_down_commande_cde_backlight(0, ecran.consigne_leds); } // Enregistrement dans l'historique : enregistrement_historique(TYPE_SOURCE_HISTORIQUE_SYSTEME, SYSTEME_LEDS_CHANGEMENT_CONSIGNE, 0, ecran.consigne_leds, NULL); } } //--------------------------------------------------------------- if (strstr(row[0], "Consigne_leds") != NULL) { val_f = atof(row[1]); if ((val_f != ecran.consigne_leds) && (val_f >=LEDS_CONSIGNE_MIN) && (val_f <= LEDS_CONSIGNE_MAX)) { ecran.consigne_leds = val_f; if (systeme.veille == SYSTEME_VEILLE_AUCUNE) { if (ecran.validation_leds == 0) c_bus_down_commande_cde_backlight(ecran.consigne_backlight, 0); else c_bus_down_commande_cde_backlight(ecran.consigne_backlight, ecran.consigne_leds); } else { if (ecran.validation_leds == 0) c_bus_down_commande_cde_backlight(0, 0); else c_bus_down_commande_cde_backlight(0, ecran.consigne_leds); } // Enregistrement dans l'historique : enregistrement_historique(TYPE_SOURCE_HISTORIQUE_SYSTEME, SYSTEME_LEDS_CHANGEMENT_CONSIGNE, 0, ecran.consigne_leds, NULL); } } //--------------------------------------------------------------- if (strstr(row[0], "Consigne_backlight") != NULL) { val_f = atof(row[1]); if ((val_f != ecran.consigne_backlight) && (val_f >=ECRAN_CONSIGNE_MIN) && (val_f <= ECRAN_CONSIGNE_MAX)) { ecran.consigne_backlight = val_f; if (systeme.veille == SYSTEME_VEILLE_AUCUNE) set_luminosite_ecran(ecran.consigne_backlight); // Mise à jour de la luminosité de l'écran avec cette nouvelle valeur // Enregistrement dans l'historique : enregistrement_historique(TYPE_SOURCE_HISTORIQUE_SYSTEME, SYSTEME_BACKLIGHT_CHANGEMENT_CONSIGNE, 0, ecran.consigne_backlight, NULL); } } //--------------------------------------------------------------- else if (strstr(row[0], "Consigne_volume") != NULL) { val_f = atof(row[1]); if (val_f != audio.consigne_volume) set_volume(val_f, AUDIO_SET_VOLUME_ECHO_ON); // Mise à jour de la consigne de volume (les tests de validité et la mise à jour du volume se font dans la fonction...) } //--------------------------------------------------------------- else if (strstr(row[0], "Wifi_new_config") != NULL) { val_8 = atoi(row[1]); if (val_8 == 1) flag_synchro_wifi = TRUE; else if (val_8 == 2) flag_scan_wifi_sta = TRUE; //reseaux.wifi_new.sta.flag_dde_scan = TRUE; } } mysql_free_result(result); //Libération du jeu de résultat // Mise à jour de la config du Wifi : if (flag_synchro_wifi) { // Récupération des valeurs de la BDD : sprintf(requete, "SELECT Nom, Valeur FROM TB_Configuration WHERE (Nom='Wifi_sta_cde' OR Nom='BSSID_Wifi_sta' OR Nom='Wifi_ap_cde' OR Nom='Wifi_ap_ssid' OR Nom='Wifi_ap_pwd' OR Nom='Wifi_ap_canal') "); mysql_query(bdd.pointeur, requete); // Envoi de la requête à MYSQL result = mysql_store_result(bdd.pointeur); // Récup des résultats de la requête while((row = mysql_fetch_row(result))) // Boucle sur tous les résultats de la requête { if (strcmp(row[0], "Wifi_sta_cde") == 0) reseaux.wifi_new.sta.cde = atoi(row[1]); else if (strcmp(row[0], "Wifi_ap_cde") == 0) reseaux.wifi_new.ap.cde = atoi(row[1]); else if (strcmp(row[0], "BSSID_Wifi_sta") == 0) { if (strlen(row[1]) < MAX_RESEAUX_WIFI_STA_TAILLE_BSSID) strcpy(reseaux.wifi_new.sta.bssid, row[1]); } else if (strcmp(row[0], "Wifi_ap_ssid") == 0) { if (strlen(row[1]) < MAX_RESEAUX_WIFI_AP_TAILLE_SSID) strcpy(reseaux.wifi_new.ap.ssid, row[1]); } else if (strcmp(row[0], "Wifi_ap_pwd") == 0) { if (strlen(row[1]) < MAX_RESEAUX_WIFI_AP_TAILLE_PWD) strcpy(reseaux.wifi_new.ap.pwd, row[1]); } else if (strcmp(row[0], "Wifi_ap_canal") == 0) reseaux.wifi_new.ap.canal = atoi(row[1]); } // Mise à jour des infos du réseau STA en cours d'utilisation : if (reseaux.wifi_new.sta.cde == ON) // Le mode STA est ON (sinon, pas la peine d'aller chercher des infos complémentaires qui ne seront pas utilisées) { if (reseaux.wifi_new.sta.bssid[0] != 0) // Si 'BSSID_Wifi_sta' n'est pas vide : { sprintf(requete, "SELECT Nom, Psk FROM TB_Wifi_sta WHERE Bssid='%s' ", reseaux.wifi_new.sta.bssid); mysql_query(bdd.pointeur, requete); // Envoi de la requête à MYSQL result = mysql_store_result(bdd.pointeur); // Récup des résultats de la requête while((row = mysql_fetch_row(result))) // Boucle sur tous les résultats de la requête { if (strlen(row[0]) < MAX_RESEAUX_WIFI_STA_TAILLE_SSID) strcpy(reseaux.wifi_new.sta.ssid, row[0]); else strcpy(reseaux.wifi_new.sta.ssid, ""); if (strlen(row[1]) < MAX_RESEAUX_WIFI_STA_TAILLE_PSK) strcpy(reseaux.wifi_new.sta.psk, row[1]); else strcpy(reseaux.wifi_new.sta.psk, ""); } } else // Si 'BSSID_Wifi_sta' est vide : { strcpy(reseaux.wifi_new.sta.ssid, ""); // ... on passe le SSID et le PSK à vide également strcpy(reseaux.wifi_new.sta.psk, ""); } } // Enregistrement dans l'historique : sprintf(tmp, "Sta_cde=%i, Sta_ssid=%s, Sta_psk=%s, Ap_cde=%i, Ap_ssid=%s, Ap_pwd=%s, Ap_canal=%i", reseaux.wifi_new.sta.cde, reseaux.wifi_new.sta.ssid, reseaux.wifi_new.sta.psk, reseaux.wifi_new.ap.cde, reseaux.wifi_new.ap.ssid, reseaux.wifi_new.ap.pwd, reseaux.wifi_new.ap.canal); enregistrement_historique(TYPE_SOURCE_HISTORIQUE_SYSTEME, SYSTEME_WIFI_MISE_A_JOUR_CONFIG, 0, 0, tmp); // Positionnement du flag pour prise en compte par le gestionnaire de réseaux : reseaux.wifi_new.flag_new_config = TRUE; } // Lancement du scan Wifi STA : if (flag_scan_wifi_sta) reseaux.wifi_new.sta.flag_dde_scan = TRUE; // Remise au repos du flag de synchro Wifi de la BDD : if ((flag_synchro_wifi) || (flag_scan_wifi_sta)) { sprintf(requete, "UPDATE TB_Configuration SET Valeur=-1 WHERE Nom='Wifi_new_config' "); mysql_query(bdd.pointeur, requete); } // Mise à jour de la présence d'une fiche jack dans la BDD : sprintf(requete, "UPDATE TB_Systeme SET Valeur='%i' WHERE Nom='Presence_jack' ", audio.etat_presence_jack); mysql_query(bdd.pointeur, requete); // Mise à jour de l'adresse IP du port Ethernet : sprintf(requete, "UPDATE TB_Systeme SET Valeur='%s' WHERE Nom='Adresse_ip_ethernet' ", reseaux.ethernet.adresse_ip); mysql_query(bdd.pointeur, requete); // Mise à jour de l'adresse IP du port Wifi_sta : sprintf(requete, "UPDATE TB_Systeme SET Valeur='%s' WHERE Nom='Adresse_ip_wifi_sta' ", reseaux.wifi.sta.adresse_ip); mysql_query(bdd.pointeur, requete); // Mise à jour de l'adresse IP du port Wifi_ap : sprintf(requete, "UPDATE TB_Systeme SET Valeur='%s' WHERE Nom='Adresse_ip_wifi_ap' ", reseaux.wifi.ap.adresse_ip); mysql_query(bdd.pointeur, requete); // Mise à jour de l'état du modem dans la BDD : sprintf(requete, "UPDATE TB_Systeme SET Valeur='%i' WHERE Nom='Etat_modem' ", modem.etat); mysql_query(bdd.pointeur, requete); // Mise à jour de la présence de la carte SIM dans la BDD : sprintf(requete, "UPDATE TB_Systeme SET Valeur='%i' WHERE Nom='Presence_sim' ", modem.etat_presence_sim); mysql_query(bdd.pointeur, requete); // Mise à jour de l'état de la 4G-LTE dans la BDD : if (modem.etat_4g_lte == OFF) sprintf(requete, "UPDATE TB_Systeme SET Valeur=0 WHERE Nom='Etat_4g_lte' "); else { val_16 = entree_no(TYPE_ENTREES_PREDEFINIES, 0, ENTREE_PREDEFINIE_RSRP); // 0 est l'adresse de ShipBase if (val_16 < 0) sprintf(requete, "UPDATE TB_Systeme SET Valeur=0 WHERE Nom='Etat_4g_lte' "); // Si l'entrée n'existe pas (retour de -1), on considère la valeur à 0 else { if (entrees.predefinies.entrees[val_16].valeur <= -112) sprintf(requete, "UPDATE TB_Systeme SET Valeur=1 WHERE Nom='Etat_4g_lte' "); else if (entrees.predefinies.entrees[val_16].valeur <= -103) sprintf(requete, "UPDATE TB_Systeme SET Valeur=2 WHERE Nom='Etat_4g_lte' "); else if (entrees.predefinies.entrees[val_16].valeur <= -85) sprintf(requete, "UPDATE TB_Systeme SET Valeur=3 WHERE Nom='Etat_4g_lte' "); else sprintf(requete, "UPDATE TB_Systeme SET Valeur=4 WHERE Nom='Etat_4g_lte' "); } } mysql_query(bdd.pointeur, requete); // Mise à jour de l'état du GNSS dans la BDD : sprintf(requete, "UPDATE TB_Systeme SET Valeur='%i' WHERE Nom='Etat_gnss' ", gnss.etat); mysql_query(bdd.pointeur, requete); // Mise à jour de l'état du bus OW : sprintf(requete, "UPDATE TB_Systeme SET Valeur='%i' WHERE Nom='Defaut_bus_ow' ", entrees.ow.defaut_bus); mysql_query(bdd.pointeur, requete); // Mise à jour de l'état des ports USB : for (i = 0; i < USB_MAX_NOMBRE_PORTS; i ++) { if (usb.ports[i].flag_validite == FALSE) continue; if (i < 3) sprintf(requete, "UPDATE TB_Systeme SET Valeur='%i' WHERE Nom='Defaut_port_usb_%i' ", usb.ports[i].defaut, (i+1)); else sprintf(requete, "UPDATE TB_Systeme SET Valeur='%i' WHERE Nom='Defaut_port_usb_arriere' ", usb.ports[i].defaut); mysql_query(bdd.pointeur, requete); } // ******************************************************************************************************************************************************** // MODULES // ******************************************************************************************************************************************************** //------------------------------------------------------------------------------------------ // Traitement des nouvelles demandes de mise à jour de l'EEPROM des modules : int8_t maj_eeprom_modules[MAX_NOMBRE_MODULES]; for (i = 0; i < MAX_NOMBRE_MODULES; i ++) maj_eeprom_modules[i] = C_BUS_CONFIG_AUCUNE; sprintf(requete, "SELECT Adresse_k_bus, New_eeprom FROM TB_Modules_physiques WHERE Presence=1 AND New_eeprom!='-1' "); mysql_query(bdd.pointeur, requete); // Envoi de la requête à MYSQL result = mysql_store_result(bdd.pointeur); // Récup des résultats de la requête while((row = mysql_fetch_row(result))) // Boucle sur tous les résultats de la requête { val_u8 = (uint8_t) atoi(row[0]); // Adresse K-Bus maj_eeprom_modules[val_u8] = (int8_t) atoi(row[1]); // Le flag de maj contient le mode de mise à jour demandé (-1=Rien, 1=write normal, 2=write config usine) // Remise à -1 (repos), la valeur de New_eeprom dans la BDD : sprintf(requete, "UPDATE TB_Modules_physiques SET New_eeprom='-1' WHERE Adresse_k_bus='%i'", val_u8); mysql_query(bdd.pointeur, requete); } mysql_free_result(result); //Libération du jeu de résultat //------------------------------------------------------------------------------------------ // Traitement des nouvelles commandes de modules : sprintf(requete, "SELECT Adresse_k_bus, New_cde FROM TB_Modules_config WHERE Presence=1 AND New_cde!='' "); mysql_query(bdd.pointeur, requete); // Envoi de la requête à MYSQL result = mysql_store_result(bdd.pointeur); // Récup des résultats de la requête while((row = mysql_fetch_row(result))) // Boucle sur tous les résultats de la requête { val_u8 = (uint8_t) atoi(row[0]); // Adresse K-Bus i = 0; ptr[i] = strtok (row[1],"/"); // Extraction du premier segment avant le premier '/' ATTENTION : si aucun délimiteur trouvé, la fonction renvoit la chaine entière (et pas NULL...) while ((ptr[i] != NULL) && (i < MAX_NOMBRE_CHAMPS_INTERNES)) { i ++; ptr[i] = strtok (NULL, "/"); // Extraction du segment suivant le prochain '/' } // Check du nombre de champs trouvés : if (i != 2) { sprintf(tmp, "La demande de New_cde sur le module @%i n'a pas un format acceptable (%i segments pour 2 attendus). La demande est rejetée...", val_u8, i); affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_ERREUR); } else c_bus_down_commande_cde_carte(val_u8, (uint8_t) atoi(ptr[0]), (uint8_t) atoi(ptr[1])); // On ne fait pas plus de vérification ici car elles seront faites dans la fonction qui, si besoin, rejettera la demande. sprintf(requete, "UPDATE TB_Modules_config SET New_cde='' WHERE Adresse_k_bus='%i'", val_u8); mysql_query(bdd.pointeur, requete); // Remise à -1 (repos), la valeur de Cde dans la BDD } mysql_free_result(result); //Libération du jeu de résultat //------------------------------------------------------------------------------------------ // Mise à jour des modules : for (i = 0; i < MAX_NOMBRE_MODULES; i ++) { if (systeme.modules_config[i].flag_presence == FALSE) continue; // On ne taite que les modules présents // Mise à jour de l'EEPROM du module si besoin : if (maj_eeprom_modules[i] > C_BUS_CONFIG_AUCUNE) // Si la demande n'est pas au moins un 'Read', 'Write normal' ou 'write config usine', on ne fait rien { // Recherche des valeurs de l'EEPROM stockées dans la BDD (et qui ont probablement été modifiées par QT puisqu'on demande une action de maj) // pour mise à jour de l'image stockée dans 'systeme.modules[].eeprom[]' : sprintf(requete, "SELECT Eeprom FROM TB_Modules_physiques WHERE Adresse_k_bus='%i'", i); // NB : le contenu de l'EEPROM est stocké dans le module PHYSIQUE ! //printf("Requete = [ %s; ]\n", requete); mysql_query(bdd.pointeur, requete); // Envoi de la requête à MYSQL result = mysql_store_result(bdd.pointeur); // Récup des résultats de la requête while((row = mysql_fetch_row(result))) // Boucle sur tous les résultats de la requête { if (row[0] == NULL) break; // Si le champ EEPROM est NULL, on ne fait rien k = 0; for (j = 0; (j < MAX_TAILLE_EEPROM); j ++) // On traite au maxi MAX_TAILLE_EEPROM { if (row[0][k] == 0) break; // On s'arrête de traiter les octets quand on atteint le NULL de fin de chaine (le stockage en VARCHAR permet de ne pas aller au bout de la taille maximale). tmp[0] = row[0][k ++]; tmp[1] = row[0][k ++]; tmp[2] = 0; systeme.modules_physiques[i].eeprom[j] = (uint8_t) strtol(tmp, NULL, 16); // L'utilisation de 'strtol' permet de passer de l'hexa dans la chaine... } // Envoi vers le module des ces nouvelles valeurs (en tenant compte du mode demandé dans 'New_eeprom') : c_bus_down_commande_config_carte(i, maj_eeprom_modules[i]); } mysql_free_result(result); //Libération du jeu de résultat } // Mise à jour de l'état du module : sprintf(requete, "UPDATE TB_Modules_config SET Mode_test=%i, Tension_etat=%i, Origine_reset=%i, Courant_masses=%.3f WHERE Adresse_k_bus=%i ", systeme.modules_config[i].mode_test, systeme.modules_config[i].alim_etat, systeme.modules_config[i].origine_reset, systeme.modules_config[i].courant_masses, // SDIR #318 i); //printf("Requete = [ %s; ]\n", requete); mysql_query(bdd.pointeur, requete); // Supervision des défauts d'alimentation et du mode test des modules : if (systeme.modules_config[i].alim_etat == CIRCUITS_TENSION_CARTE_OK) // Alim du module = OK { if (systeme.modules_config[i].mode_test == OFF) // Module en mode Normal { systeme.modules_config[i].etat_commande_carte = CIRCUITS_ETAT_COMMANDE_CARTE_OK; } else // Module en mode Test { systeme.modules_config[i].etat_commande_carte = CIRCUITS_ETAT_COMMANDE_CARTE_TEST; } } else // Alim du module = UNDERVOLTAGE { systeme.modules_config[i].etat_commande_carte = CIRCUITS_ETAT_COMMANDE_CARTE_UNDERVOLTAGE; } } // ******************************************************************************************************************************************************** // CIRCUITS // ******************************************************************************************************************************************************** //------------------------------------------- // Traitement des nouvelles consignes : sprintf(requete, "SELECT Cle_primaire, New_consigne, Consigne FROM TB_Circuits WHERE New_consigne!=-1 "); mysql_query(bdd.pointeur, requete); result = mysql_store_result(bdd.pointeur); while((row = mysql_fetch_row(result))) { i = atoi(row[0]); // Clé primaire du circuit int16_t no_circuit = circuit_cle_primaire(i); // No du circuit j = atoi(row[1]); // New Consigne k = atoi(row[2]); // Consigne actuelle bool flag_consigne_valide = false; if (no_circuit >= 0) // Si le n° de circuit n'a pu être trouvé, on ne traite pas la valeur. { switch(systeme.modules_config[circuits.circuits[no_circuit].adresse_module].type) // Recherche du type de module : { case TYPE_CARTE_SHIPBASE : { if ((j == OFF) || (j == MAX_CONSIGNE_CIRCUIT)) flag_consigne_valide = TRUE; break; } case TYPE_CARTE_SP812 : case TYPE_CARTE_SP8DC : { if ((j >= OFF) && (j <= MAX_CONSIGNE_CIRCUIT)) flag_consigne_valide = TRUE; break; } case TYPE_CARTE_SP4AC : { if ((j == OFF) || (j == MAX_CONSIGNE_CIRCUIT)) flag_consigne_valide = TRUE; break; } // SDIR #79 default : ; } if (flag_consigne_valide) // Vérifie que la nouvelle valeur de consigne est valide. { if ((uint16_t)circuits.circuits[no_circuit].variables[CIRCUIT_VARIABLE_CONSIGNE].valeur_courante != j) // On ne traite que si la nouvelle consigne est différente de l'ancienne : { k = j; // SDIR #79 - Permet la mise à jour dans la BDD dans tous les cas (yc les cas d'erreur) changement_consigne_circuit(no_circuit, j, CIRCUITS_ORIGINE_CONSIGNE_SHIPBASE, 0); enregistrement_historique(TYPE_SOURCE_HISTORIQUE_CIRCUITS, CIRCUIT_CHANGEMENT_CONSIGNE, i, j, NULL); // Enregistrement dans l'historique } } } sprintf(requete, "UPDATE TB_Circuits SET New_consigne='-1', Consigne=%i WHERE Cle_primaire=%i ", k, i); // SDIR #79 - RAZ de la demande et mise à jour de la consigne dans la BDD //printf("Requete = [ %s; ]\n", requete); mysql_query(bdd.pointeur, requete); } mysql_free_result(result); //------------------------------------------------------------- // Traitement des nouvelles données, autre que les consignes : sprintf(requete, "SELECT Cle_primaire, Validation_cdes_events FROM TB_Circuits "); mysql_query(bdd.pointeur, requete); result = mysql_store_result(bdd.pointeur); while((row = mysql_fetch_row(result))) { i = atoi(row[0]); // Clé primaire du circuit int16_t no_circuit = circuit_cle_primaire(i); // No du circuit // Mise à jour du flag de validation des commandes par events : if (no_circuit >= 0) circuits.circuits[no_circuit].validation_cdes_events = atoi(row[1]); // On fait la mise à jour dans tous les cas (y compris si la valeur n'a pas changée) car c'est plus simple... } mysql_free_result(result); //-------------------------------------------------- // Mise à jour de l'état des circuits vers la BDD : for (i = 0; i < circuits.nb; i ++) { if (!circuits.circuits[i].flag_dde_maj_bdd) continue; circuits.circuits[i].flag_dde_maj_bdd = FALSE; // Reset du flag une fois la mise à jour faite dans la BDD if (circuits.circuits[i].adresse_module != 0) circuits.circuits[i].etat_commande_carte = systeme.modules_config[circuits.circuits[i].adresse_module].etat_commande_carte; else circuits.circuits[i].etat_commande_carte = CIRCUITS_ETAT_COMMANDE_CARTE_OK; sprintf(requete, "UPDATE TB_Circuits SET Etat='%i', Origine_consigne=%i, ID_Origine_consigne=%i, Consigne='%f', Mode_test=%i, Etat_commande_carte=%i, \ Tension=%f, Intensite=%f, Frequence=%f WHERE Cle_primaire='%i'", circuits.circuits[i].etat, circuits.circuits[i].origine_consigne, circuits.circuits[i].id_origine_consigne, circuits.circuits[i].variables[CIRCUIT_VARIABLE_CONSIGNE].valeur_courante, circuits.circuits[i].mode_test, circuits.circuits[i].etat_commande_carte, (systeme.modules_config[circuits.circuits[i].adresse_module].type != TYPE_CARTE_SP4AC) ? circuits.circuits[i].variables[CIRCUIT_VARIABLE_TENSION].valeur_courante : circuits.circuits[i].variables[CIRCUIT_VARIABLE_TENSION_SECTEUR].valeur_courante, circuits.circuits[i].variables[CIRCUIT_VARIABLE_COURANT].valeur_courante, circuits.circuits[i].variables[CIRCUIT_VARIABLE_FREQUENCE].valeur_courante, circuits.circuits[i].cle_primaire); //printf("Requete sur circuit n° %i = [ %s; ]\n", i, requete); mysql_query(bdd.pointeur, requete); } // ******************************************************************************************************************************************************** // CAPTEURS // ******************************************************************************************************************************************************** // Mise à jour des valeurs dans la BDD quand une demande a été formulée : for (i=0; i= 0) // Si le n° de batterie n'a pu être trouvé, on ne traite pas la valeur. { switch(j) // Recherche du type de commande : { //----------------------------------------------- case BATTERIE_COMMMANDE_FORCAGE_PLEINE_CHARGE : { batteries.batteries[no_batterie].variables[BATTERIE_VARIABLE_SOC].valeur_courante = 100; batteries.batteries[no_batterie].eod = 0; enregistrement_historique(TYPE_SOURCE_HISTORIQUE_BATTERIES, BATTERIE_RX_CDE_FORCAGE_PLEINE_CHARGE, i, 0, NULL); break; } //----------------------------------------------- case BATTERIE_COMMMANDE_RESET_SOH : { batteries.batteries[no_batterie].variables[BATTERIE_VARIABLE_SOH].valeur_courante = 100; enregistrement_historique(TYPE_SOURCE_HISTORIQUE_BATTERIES, BATTERIE_RX_CDE_RESET_SOH, i, 0, NULL); break; } //----------------------------------------------- case BATTERIE_COMMMANDE_RESET_COMPTEURS : { batteries.batteries[no_batterie].nombre_cycles = 0; batteries.batteries[no_batterie].nombre_decharges_completes = 0; enregistrement_historique(TYPE_SOURCE_HISTORIQUE_BATTERIES, BATTERIE_RX_CDE_RESET_COMPTEURS, i, 0, NULL); break; } //----------------------------------------------- default : ; } batteries.batteries[no_batterie].flag_dde_maj_bdd = TRUE; // Positionné même dans le cas d'une commande non valide (puisqu'on n'aura rien fait dans ce cas) } sprintf(requete, "UPDATE TB_Batteries SET New_cde='-1' WHERE Cle_primaire=%i ", i); //printf("Requete = [%s]\n", requete); mysql_query(bdd.pointeur, requete); } mysql_free_result(result); // Mise à jour des valeurs dans la BDD quand une demande a été formulée : for (i=0; i