예제 #1
0
파일: bypassPC.c 프로젝트: AcdAcd/Domini
//----------------------------------------------------------------------
//!\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;
}
예제 #2
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);
}