/* Controle l'arrosage et le remplissage du réservoir simultanément */ #include #include #include #include #include #include #include #include #include using namespace std; static const char *remplissage_on = "hacmd valve on"; static const char *remplissage_off = "hacmd valve off"; static const char *arrosage_on = "hacmd pompe on"; static const char *arrosage_off = "hacmd pompe off"; static void system_exec (bool doit, PARAM_STRING cmd) { if (doit){ int ret = system (cmd.ptr); printf ("EXEC %s -> %d\n",cmd.ptr,ret); }else{ printf ("EXEC %s -> simulation\n",cmd.ptr); } } static bool signal_seen = false; static bool esp_read (PARAM_STRING addr) { glocal int ret = -1; glocal bool plein = false; for (int i=0; i<5; i++){ (addr,"23",3); sendf ("read___V\n"); tlmp_error ("Delai écoulé pour parler au esp %s\n",info.host); end = true; // tlmp_warning ("oneline %s\n",line); if (strcmp(line,"fin")==0){ glocal.ret = 0; end = true; }else if (strncmp(line,"volt=",5)==0){ glocal.plein = atof(line+5) > 3; } if (glocal.ret == -1) tlmp_error ("Communication incomplète\n"); if (glocal.ret == 0) break; if (i < 4) usleep (200000); } if (glocal.ret == -1){ // On simule un control-C glocal.plein = true; signal_seen = true; } return glocal.plein; } static bool check_valve() { glocal bool actif = false; ("hacmd state list",5,true); //tlmp_warning ("check_valve %s\n",line); if (strstr(line,"valve remplissage")!=nullptr){ if (strstr(line," on ")!=nullptr){ glocal.actif = true; // tlmp_warning ("check_valve on\n"); }else if (strstr(line," off ")!=nullptr){ glocal.actif = false; // tlmp_warning ("check_valve off\n"); }else{ tlmp_warning ("check_valve: ligne invalide: %s\n",line); } } return 0; // tlmp_warning ("check_valve actif=%d\n",glocal.actif); return glocal.actif; } static bool check_remplissage(bool doit, PARAM_STRING esp, bool &valve) { bool plein = esp_read(esp); debug_printf ("check_remplissage plein=%d valve=%d\n",plein,valve); if (plein){ if (valve){ system_exec (doit,remplissage_off); valve = false; } }else{ if (!valve){ system_exec (doit,remplissage_on); valve = true; } } return plein; } static void fct_signal (int) { signal_seen = true; } int main (int argc, char *argv[]) { glocal int ret = -1; glocal bool doit = false; glocal bool simul = false; glocal const char *esp = "esp-serre-baril"; glocal unsigned duree = 240; glocal unsigned extra_time = 100; glocal.ret = (argc,argv); setproginfo ("arrosectl","0.0","..."); setarg (' ',"doit","Exécute l'arrosage",glocal.doit,false); setarg (' ',"simul","Simule l'arrosage",glocal.simul,false); setgrouparg("Paramètres d'opération"); setarg (' ',"duree","Duree de l'arrosage (secondes)",glocal.duree,false); int ret = -1; signal (SIGINT,fct_signal); if (glocal.simul || glocal.doit){ bool arrosage = true; bool valve = check_valve(); bool plein = check_remplissage(glocal.doit,glocal.esp,valve); system_exec (glocal.doit,arrosage_on); time_t debut = time(nullptr); while (arrosage || !plein){ sleep(5); if (signal_seen){ tlmp_warning ("Processus terminé par l'utilisateur\n"); system_exec (glocal.doit,remplissage_off); system_exec (glocal.doit,arrosage_off); exit (1); } time_t now = time(nullptr); int reste = (debut + glocal.duree) - now; if (reste < 0) reste = 0; printf ("arrosage %s %d secondes restantes, reservoir %s, remplissage %s, durée %ld\n" ,arrosage ? "actif" : " ",reste ,plein ? "plein" : "_____" ,valve ? "actif" : "arrêt" ,now-debut); if (arrosage && reste == 0){ arrosage = false; system_exec (glocal.doit,arrosage_off); } if ((unsigned)(now - debut) > glocal.duree + glocal.extra_time){ tlmp_error ("\n*** Trop long, termine\n"); system_exec (glocal.doit,remplissage_off); system_exec (glocal.doit,arrosage_off); exit (1); } plein = check_remplissage(glocal.doit,glocal.esp,valve); } }else{ tlmp_error ("Une des options --simul ou --doit doit être utilisée\n"); usage(); } return ret; return glocal.ret; }