//---------------------------------------------------------------------- //!\brief le main ! //---------------------------------------------------------------------- int main(void) { //*************************** //* INITIALISATION //*************************** printf("Installing signal handler..."); (void) signal(SIGINT, sigfun); printf("done\n"); openlog(log_name, LOG_CONS, LOG_USER); syslog(LOG_DEBUG, "***************************************************************"); syslog(LOG_DEBUG, "Demarrage bypassPC.c, logiciel de gestion du bypass du puits canadien"); printf("Pour les messages de DEBUG, voir syslog : \\var\\log\\user.log \n"); //lecture de la date/heure courante t = time(NULL); // conversion en heure locale local = localtime(&t); syslog(LOG_DEBUG, "Heure et date courante : %s", asctime(local)); syslog(LOG_DEBUG, "Unixtime : %d", t); //*************************************************************************** //* PROGRAMME PRINCIPAL //*************************************************************************** //initialisation BDD if(init_mysql() == 1) { // erreur de liaison avec la bdd // prévoir un msg de log vers un fichier de log exit(1); } // Récupération des données de températures : Ext, Int et PC if(recup_temperatures() == 1){ // erreur sur la recuperation des messages // prévoir un msg de log vers un fichier de log exit(1); } // récupération des infos du jour dans la table planning if(recup_info_jour("calendrier") == 1) { // erreur sur la recuperation des messages // prévoir un msg de log vers un fichier de log exit(1); } // on lit les infos du jour dans le résultat de la reqête (1 seule ligne) if(read_info_jour() == 1){ // erreur sur la recuperation des messages // prévoir un msg de log vers un fichier de log exit(1); } //Récupération du type de consigne : Hiver / Ete / Auto et de la température de consigne // on récupére les infos de températures en fonction de la saison if(read_info_saison(inf_saison) == 1){ // erreur sur la recuperation des messages // prévoir un msg de log vers un fichier de log exit(1); } int consignebypass = calcul_consigne_bypass(inf_saison, fconsigne_temperature); // Préparation du message à envoyer make_message(consignebypass); // Copie du message dans la BDD if(envoie_msg_radio(msg_radio) == 1){ // erreur sur la recuperation des messages // prévoir un msg de log vers un fichier de log exit(1); } //avant de sortir, on log les données de la structure stDonnees pour la mise au pointeur if(log_donnees(consignebypass) == 1) { // erreur dans le log // prévoir un msg de log vers un fichier de log exit(1); } //Fermeture de MySQL mysql_close(conn); syslog(LOG_DEBUG, "Exit normally"); closelog(); return 0; }
//---------------------------------------------------------------------- //!\brief On affecte chaque jour du planning avec les paramètres caractéristiques du type de jour et saison //!\return 1 si erreur, 0 sinon //---------------------------------------------------------------------- int affectation_jour_planning(void){ //pour chaque jour de l'année, défini par un l'Id=1 à l'Id=nNbJour (365) for(stJourTraite.nIdJour = 1; stJourTraite.nIdJour <= nNbJour ; stJourTraite.nIdJour++){ //récupérer le type de jour et saison recup_info_jour(stJourTraite.nIdJour); //A partir de la saison , on récupére la température de chauffe read_consigne_chauffe(stJourTraite.inf_saison); unsigned int nPrio = 1; // Maintenant, on va traiter chaque créneau de chauffe du type de jour , puis remplir la table planning en conséquence (température de consigne à mettre à jour dans les créneau concernés) // Preparation de la requete MySQL // on ne récupère que les infos du jour en cours sprintf(query, "SELECT `heure_debut`, `heure_fin`, `priorite` FROM `calendrier_type_jour` WHERE `type_jour` = '%s'", stJourTraite.inf_type_jour); // envoi de la requete printf("\n\nEnvoi de la requete : %s", query); if (mysql_query(conn, query)) { // si la requete echoue on retourne 1 fprintf(stderr, "%s\n", mysql_error(conn)); return(1); } // la requête s'est bien passée, on rend le jeu de résultats disponible via le pointeur result printf("\nRecuperation des donnees"); result = mysql_store_result(conn); while ((row = mysql_fetch_row(result))) { // on stocke la taille dans le pointeur lengths = mysql_fetch_lengths(result); // on récupère l'heure de début du créneau de l'action a effectuer sprintf(stJourTraite.stheure_debut,"%.*s", (char) lengths[ROW_HEURE_DEBUT], row[ROW_HEURE_DEBUT]); // on récupère l'heure de fin du créneau de l'action a effectuer sprintf(stJourTraite.stheure_fin,"%.*s", (char) lengths[ROW_HEURE_FIN], row[ROW_HEURE_FIN]); // on récupère la priorité sprintf(stJourTraite.stheure_priorite,"%.*s", (char) lengths[ROW_PRIORITE], row[ROW_PRIORITE]); // send SQL query // Exemple , ajout condition AND addtime( `date` , `heure_fin` ) > addtime( `date` , `heure_debut` ) pour éviter que le créneau 23:30:00 - 00:00:00 soit compté (minuit étant plus petit que 23:30, on écrirait une consigne de température!) // SELECT `id` , `date` , `heure_debut` , `heure_fin` // FROM `calendrier_30min` // WHERE `date` = '2012-11-05' // AND `heure_debut` >= '18:00:00' // AND `heure_fin` <= '22:00:00' // AND addtime( `date` , `heure_fin` ) > addtime( `date` , `heure_debut` ) sprintf(query, "SELECT `id` FROM `calendrier_30min` WHERE `date` = FROM_UNIXTIME( %d, '%%Y-%%m-%%d' ) AND `heure_debut` >= '%s' AND `heure_fin` <= '%s' AND addtime( `date` , `heure_fin` ) > addtime( `date` , `heure_debut` );", stJourTraite.nUnixTime, stJourTraite.stheure_debut, stJourTraite.stheure_fin); // envoi de la requete //printf("\nEnvoi de la requete : %s", query); if (mysql_query(conn, query)) { // si la requete echoue on retourne 1 fprintf(stderr, "%s\n", mysql_error(conn)); return(1); } // la requête s'est bien passée, on rend le jeu de résultats disponible via le pointeur result2 //printf("\nRecuperation des donnees"); result2 = mysql_store_result(conn); unsigned int nIdCreneau = 0; while ((row2 = mysql_fetch_row(result2))) { // on récupère l'id du créneau horaire nIdCreneau = atoi(row2[0]); // send SQL query sprintf(query, "UPDATE `domotique`.`calendrier_30min` SET `temperature` = '%.1f', `priorite` = '%d' WHERE `calendrier_30min`.`id` = %d;", stJourTraite.fconsigne_temperature, nPrio, nIdCreneau); if (mysql_query(conn, query)) { fprintf(stderr, "%s\n", mysql_error(conn)); return(1); } } // on libère la requête mysql_free_result(result2); nPrio++; } // on libère la requête mysql_free_result(result); } //l'affectation s'est bien passé, on retourne 0 return(0); }