1071 lines
51 KiB
C
1071 lines
51 KiB
C
//**********************************************************************************************************************************************************************************
|
|
// 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<capteurs.nb; i++)
|
|
{
|
|
if ((!capteurs.capteurs[i].flag_validite) || (!capteurs.capteurs[i].flag_dde_maj_bdd)) continue;
|
|
|
|
capteurs.capteurs[i].flag_dde_maj_bdd = FALSE; // Reset du flag une fois la mise à jour faite dans la BDD
|
|
|
|
// sprintf(requete, "UPDATE TB_Capteurs SET Valeur='%f', Etat='%i' WHERE Cle_primaire='%i'", capteurs.capteurs[i].variables[CAPTEUR_VARIABLE_VALEUR].valeur_courante, capteurs.capteurs[i].etat, capteurs.capteurs[i].cle_primaire);
|
|
// SDIR #135 :
|
|
sprintf(requete, "UPDATE TB_Capteurs SET Valeur='%f', Valeur_brute='%.2f', Etat=%i, Etat_systeme=%i WHERE Cle_primaire=%i ",
|
|
capteurs.capteurs[i].variables[CAPTEUR_VARIABLE_VALEUR].valeur_courante,
|
|
capteurs.capteurs[i].valeur_brute,
|
|
capteurs.capteurs[i].etat,
|
|
capteurs.capteurs[i].etat_systeme,
|
|
capteurs.capteurs[i].cle_primaire);
|
|
// printf("Requete = [ %s; ]\n", requete);
|
|
mysql_query(bdd.pointeur, requete);
|
|
}
|
|
|
|
|
|
// ********************************************************************************************************************************************************
|
|
// BATTERIES
|
|
// ********************************************************************************************************************************************************
|
|
|
|
// Traitement des nouvelles commandes :
|
|
sprintf(requete, "SELECT Cle_primaire, New_cde FROM TB_Batteries WHERE New_cde!='-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
|
|
j = atoi(row[1]); // New Cde
|
|
|
|
int16_t no_batterie = batterie_cle_primaire(i); // No de la batterie
|
|
|
|
if (no_batterie >= 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<batteries.nb; i++)
|
|
{
|
|
if ((!batteries.batteries[i].flag_validite) || (!batteries.batteries[i].flag_dde_maj_bdd)) continue;
|
|
|
|
sprintf(requete, "UPDATE TB_Batteries SET Nombre_cycles=%i, Flag_increment_cycles=%i, Nombre_decharges_completes=%i, Flag_increment_decharges_completes=%i, \
|
|
Temperature='%f', Tension='%f', Courant_differentiel='%f', Courant_charge='%f', Courant_decharge='%f', \
|
|
Soh='%f', Soc='%f', Autonomie='%f', \
|
|
Tension_pleine_charge='%f', Eod='%f' WHERE Cle_primaire='%i'",
|
|
batteries.batteries[i].nombre_cycles, batteries.batteries[i].flag_increment_cycles, batteries.batteries[i].nombre_decharges_completes, batteries.batteries[i].flag_increment_decharges_completes,
|
|
batteries.batteries[i].variables[BATTERIE_VARIABLE_TEMPERATURE].valeur_courante,
|
|
batteries.batteries[i].variables[BATTERIE_VARIABLE_TENSION].valeur_courante,
|
|
batteries.batteries[i].variables[BATTERIE_VARIABLE_COURANT_DIFFERENTIEL].valeur_courante,
|
|
batteries.batteries[i].variables[BATTERIE_VARIABLE_COURANT_CHARGE].valeur_courante,
|
|
batteries.batteries[i].variables[BATTERIE_VARIABLE_COURANT_DECHARGE].valeur_courante,
|
|
batteries.batteries[i].variables[BATTERIE_VARIABLE_SOH].valeur_courante,
|
|
batteries.batteries[i].variables[BATTERIE_VARIABLE_SOC].valeur_courante,
|
|
batteries.batteries[i].variables[BATTERIE_VARIABLE_AUTONOMIE].valeur_courante,
|
|
batteries.batteries[i].tension_pleine_charge,
|
|
batteries.batteries[i].eod,
|
|
batteries.batteries[i].cle_primaire);
|
|
// printf("Requete d'enregistement batteries = %s\n", requete);
|
|
mysql_query(bdd.pointeur, requete);
|
|
|
|
batteries.batteries[i].flag_dde_maj_bdd = FALSE; // Reset du flag une fois la mise à jour faite dans la BDD
|
|
}
|
|
|
|
|
|
// ********************************************************************************************************************************************************
|
|
// RESERVOIRS
|
|
// ********************************************************************************************************************************************************
|
|
|
|
// Mise à jour des valeurs dans la BDD quand une demande a été formulée :
|
|
for (i = 0; i < reservoirs.nb; i ++)
|
|
{
|
|
if ((!reservoirs.reservoirs[i].flag_validite) || (!reservoirs.reservoirs[i].flag_dde_maj_bdd)) continue;
|
|
|
|
reservoirs.reservoirs[i].flag_dde_maj_bdd = FALSE; // Reset du flag une fois la mise à jour faite dans la BDD
|
|
|
|
// sprintf(requete, "UPDATE TB_Reservoirs SET Niveau='%f', Etat_entrees=%i WHERE Cle_primaire='%i'", reservoirs.reservoirs[i].variables[RESERVOIR_VARIABLE_NIVEAU].valeur_courante, reservoirs.reservoirs[i].etat_entrees, reservoirs.reservoirs[i].cle_primaire);
|
|
// SDIR #288 :
|
|
sprintf(requete, "UPDATE TB_Reservoirs SET Niveau='%f', Valeur_brute='%.2f', Etat_entrees=%i WHERE Cle_primaire='%i'", reservoirs.reservoirs[i].variables[RESERVOIR_VARIABLE_NIVEAU].valeur_courante, reservoirs.reservoirs[i].valeur_brute, reservoirs.reservoirs[i].etat_entrees, reservoirs.reservoirs[i].cle_primaire);
|
|
|
|
//printf("Requete d'enregistement réservoirs = %s\n", requete);
|
|
mysql_query(bdd.pointeur, requete);
|
|
}
|
|
|
|
|
|
// ********************************************************************************************************************************************************
|
|
// EVENEMENTS
|
|
// ********************************************************************************************************************************************************
|
|
|
|
// Mise à jour des valeurs dans la BDD quand une demande a été formulée :
|
|
for (i = 0; i < events.nb; i ++)
|
|
{
|
|
if (!events.events[i].flag_validite) continue; // Si l'event n'est pas valide, on ne le traite pas
|
|
if (!events.events[i].flag_dde_maj_bdd) continue;
|
|
|
|
events.events[i].flag_dde_maj_bdd = false;
|
|
|
|
sprintf(requete, "UPDATE TB_Events SET Etat_test=%i WHERE Cle_primaire=%i ", events.events[i].condition_test.etat_test, events.events[i].cle_primaire);
|
|
//printf("Requete d'enregistement events = [ %s; ]\n", requete);
|
|
mysql_query(bdd.pointeur, requete);
|
|
}
|
|
|
|
|
|
|
|
// ********************************************************************************************************************************************************
|
|
// ENTREES OW
|
|
// ********************************************************************************************************************************************************
|
|
|
|
// Mise à jour des valeurs dans la BDD quand une demande a été formulée :
|
|
// Note : On fonctionne ici sur les DEVICES (entrees.ow.devices[]) et PAS sur les ENTREES (entrees.ow.entrees[]).
|
|
// En effet, on remonte l'état de tous les devices présents sur le réseau OW, y compris ceux qui ne sont pas utilisés par un capteur.
|
|
// Au contraire, les ENTREES ne sont valides que pour celles utilisées par un capteur valide.
|
|
for (i=0; i<entrees.ow.nb_devices; i++)
|
|
{
|
|
if (!entrees.ow.devices[i].flag_dde_maj_bdd) continue;
|
|
|
|
sprintf(requete, "UPDATE TB_One_wire SET Etat=%i, Valeur='%.3f' WHERE Rom_code='%s'", entrees.ow.devices[i].etat, entrees.ow.devices[i].valeur, entrees.ow.devices[i].rom_code);
|
|
// printf("Requete d'enregistement device OW = %s\n", requete);
|
|
mysql_query(bdd.pointeur, requete);
|
|
|
|
entrees.ow.devices[i].flag_dde_maj_bdd = FALSE; // Reset du flag une fois la mise à jour faite dans la BDD
|
|
}
|
|
|
|
|
|
// ********************************************************************************************************************************************************
|
|
// PGN NMEA2000
|
|
// ********************************************************************************************************************************************************
|
|
|
|
// Mise à jour des valeurs dans la BDD quand une demande a été formulée :
|
|
// Note : La table de référence est TB_Nmea2000.
|
|
// Le flag 'Tb_Systeme.Flag_demande_maj_nmea' est positionné par Qt lorsqu'une modification a été faite sur au moins une entrée de cette table.
|
|
// Il faut donc balayer les enregistrement pour mettre à jour quelques champs dans l'annuaire en cours et envoyer une commande au Compagnon pour
|
|
// qu'il prenne en compte les modifications (généralement, changer le mode Actif dans un sens ou dans l'autre).
|
|
|
|
if (flag_demande_maj_nmea)
|
|
{
|
|
// Sélection des PGN qui ont au moins un Field Actif :
|
|
sprintf(requete, "SELECT PGN FROM TB_Nmea2000 WHERE Actif=1 GROUP BY Pgn ");
|
|
//printf("Requete = [ %s; ]\n", requete);
|
|
mysql_query(bdd.pointeur, requete);
|
|
result = mysql_store_result(bdd.pointeur);
|
|
while((row = mysql_fetch_row(result)))
|
|
{
|
|
for (i = 0; i < NMEA_MAX_NOMBRE_PGN; i ++)
|
|
{
|
|
val_u32 = atoi(row[0]); // Pgn
|
|
|
|
if (val_u32 == nmea.annuaire[i].pgn)
|
|
{
|
|
if (nmea.annuaire[i].actif != 1)
|
|
{
|
|
nmea.annuaire[i].actif = 1;
|
|
c_bus_down_commande_config_pgn_nmea(i); // Envoi de la commande de config de ce Pgn au Compagnon puisque son état à changé.
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
mysql_free_result(result);
|
|
|
|
// Sélection des PGN qui n'ont aucun Field Actif :
|
|
sprintf(requete, "SELECT PGN FROM TB_Nmea2000 WHERE Pgn NOT IN (SELECT Pgn FROM TB_Nmea2000 WHERE Actif=1) GROUP BY Pgn ");
|
|
//printf("Requete = [ %s; ]\n", requete);
|
|
mysql_query(bdd.pointeur, requete);
|
|
result = mysql_store_result(bdd.pointeur);
|
|
while((row = mysql_fetch_row(result)))
|
|
{
|
|
for (i = 0; i < NMEA_MAX_NOMBRE_PGN; i ++)
|
|
{
|
|
val_u32 = atoi(row[0]); // Pgn
|
|
|
|
if (val_u32 == nmea.annuaire[i].pgn)
|
|
{
|
|
if (nmea.annuaire[i].actif != 0)
|
|
{
|
|
nmea.annuaire[i].actif = 0;
|
|
c_bus_down_commande_config_pgn_nmea(i); // Envoi de la commande de config de ce Pgn au Compagnon puisque son état à changé.
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
mysql_free_result(result);
|
|
}
|
|
|
|
|
|
// ********************************************************************************************************************************************************
|
|
// HEART-BEAT
|
|
// ********************************************************************************************************************************************************
|
|
|
|
// Mise à jour du timestamp dans la BDD :
|
|
sprintf(requete, "UPDATE TB_Systeme SET Valeur='%li' WHERE Nom='Heart_beat'", (uint64_t) time(NULL)); // Enregistrement du timestamp de MAINTENANT (permet sur les pages Web d'afficher les feux vert, orange ou rouge en fonction de la dernière valeur écrite par l'application)
|
|
mysql_query(bdd.pointeur, requete);
|
|
|
|
|
|
// ********************************************************************************************************************************************************
|
|
// MESURES
|
|
// ********************************************************************************************************************************************************
|
|
|
|
#ifdef __DEBUG_TIMING_SYNCHRO_BDD
|
|
fin_1 = clock();
|
|
#endif
|
|
|
|
// Enregistrment des mesures des capteurs :
|
|
enregistrement_mesures(BDD_ENREGISTREMENT_MESURE_NORMAL);
|
|
|
|
#ifdef __DEBUG_TIMING_SYNCHRO_BDD
|
|
fin = clock();
|
|
sprintf(tmp, "Temps d'exécution synchro : sans mesures = %.0f µs ; avec mesures = %.0f µs (delta = %.0f µs)", ((float)(fin_1-deb)*1000000)/CLOCKS_PER_SEC, ((float)(fin-deb)*1000000)/CLOCKS_PER_SEC, ((float)(fin-fin_1)*1000000)/CLOCKS_PER_SEC);
|
|
affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_WARNING);
|
|
#endif
|
|
|
|
}
|
|
}
|
|
|
|
|