# HG changeset patch # User Michiel Broek # Date 1408383881 -7200 # Node ID f3d0e9445fcda280b2c4a4c8348abfe0a41f0aac # Parent 6df404da35372eaeda37c4c4139c8c9fe3258541 Added profile panel menus and system panel menus diff -r 6df404da3537 -r f3d0e9445fcd thermferm/thermferm.c --- a/thermferm/thermferm.c Mon Aug 18 16:13:56 2014 +0200 +++ b/thermferm/thermferm.c Mon Aug 18 19:44:41 2014 +0200 @@ -44,6 +44,7 @@ extern int lcdHandle; int setupmenu = MENU_NONE; units_list *current_unit = NULL; /* In panel editor this points to the current unit. */ +profiles_list *current_profile = NULL; float temp_temp = 20.0; #endif @@ -106,7 +107,7 @@ void go_menu(int menu) { - char buf[21]; + char buf[21]; piLock(LOCK_LCD); piLock(LOCK_MENU); @@ -140,15 +141,15 @@ lcdPuts(lcdHandle, "New mode NONE"); break; - case MENU_NONE_HEAT: snprintf(buf, 20, "Set heater %s", current_unit->heater_state ? "OFF":"ON"); + case MENU_NONE_HEAT: snprintf(buf, Config.lcd_cols, "Set heater %s", current_unit->heater_state ? "OFF":"ON"); lcdPuts(lcdHandle, buf); break; - case MENU_NONE_COOL: snprintf(buf, 20, "Set cooler %s", current_unit->cooler_state ? "OFF":"ON"); + case MENU_NONE_COOL: snprintf(buf, Config.lcd_cols, "Set cooler %s", current_unit->cooler_state ? "OFF":"ON"); lcdPuts(lcdHandle, buf); break; - case MENU_NONE_FAN: snprintf(buf, 20, "Set fan %s", current_unit->fan_state ? "OFF":"ON"); + case MENU_NONE_FAN: snprintf(buf, Config.lcd_cols, "Set fan %s", current_unit->fan_state ? "OFF":"ON"); lcdPuts(lcdHandle, buf); break; @@ -158,7 +159,7 @@ case MENU_BEER_TEMP: lcdPuts(lcdHandle, "Set beer temp"); lcdPosition(lcdHandle, 0, 1); - snprintf(buf, 20, "Set %.1f", temp_temp); + snprintf(buf, Config.lcd_cols, "Set %.1f", temp_temp); lcdPuts(lcdHandle, buf); break; @@ -168,7 +169,7 @@ case MENU_FRIDGE_TEMP: lcdPuts(lcdHandle, "Set fridge temp"); lcdPosition(lcdHandle, 0, 1); - snprintf(buf, 20, "Set %.1f", temp_temp); + snprintf(buf, Config.lcd_cols, "Set %.1f", temp_temp); lcdPuts(lcdHandle, buf); break; @@ -176,22 +177,40 @@ lcdPuts(lcdHandle, "New mode PROFILE"); break; - case MENU_PROFILE_SELECT: lcdPuts(lcdHandle, "Select profile"); + case MENU_PROFILE_SELECT: snprintf(buf, Config.lcd_cols, "%s", current_profile->name); + lcdPuts(lcdHandle, buf); + lcdPosition(lcdHandle, 0, 1); + lcdPuts(lcdHandle, "Select profile"); break; - case MENU_PROFILE_START: lcdPuts(lcdHandle, "Start profile"); + case MENU_PROFILE_START: snprintf(buf, Config.lcd_cols, "%s", current_profile->name); + lcdPuts(lcdHandle, buf); + lcdPosition(lcdHandle, 0, 1); + lcdPuts(lcdHandle, "Start profile"); break; - case MENU_PROFILE_PAUSE: lcdPuts(lcdHandle, "Pause profile"); + case MENU_PROFILE_PAUSE: snprintf(buf, Config.lcd_cols, "%s", current_profile->name); + lcdPuts(lcdHandle, buf); + lcdPosition(lcdHandle, 0, 1); + lcdPuts(lcdHandle, "Pause profile"); break; - case MENU_PROFILE_ABORT: lcdPuts(lcdHandle, "Abort profile"); + case MENU_PROFILE_ABORT: snprintf(buf, Config.lcd_cols, "%s", current_profile->name); + lcdPuts(lcdHandle, buf); + lcdPosition(lcdHandle, 0, 1); + lcdPuts(lcdHandle, "Abort profile"); break; - case MENU_PROFILE_RESUME: lcdPuts(lcdHandle, "Resume profile"); + case MENU_PROFILE_RESUME: snprintf(buf, Config.lcd_cols, "%s", current_profile->name); + lcdPuts(lcdHandle, buf); + lcdPosition(lcdHandle, 0, 1); + lcdPuts(lcdHandle, "Resume profile"); break; - case MENU_PROFILE_GOOFF: lcdPuts(lcdHandle, "Set profile OFF"); + case MENU_PROFILE_GOOFF: snprintf(buf, Config.lcd_cols, "%s", current_profile->name); + lcdPuts(lcdHandle, buf); + lcdPosition(lcdHandle, 0, 1); + lcdPuts(lcdHandle, "Set profile OFF"); break; case MENU_TOP_SYS: lcdPuts(lcdHandle, "System menu"); @@ -203,10 +222,10 @@ case MENU_SYS_REBOOT: lcdPuts(lcdHandle, "Reboot system"); break; - case MENU_SYS_MASH: lcdPuts(lcdHandle, "Start Mash program"); + case MENU_SYS_MASH: lcdPuts(lcdHandle, "Run Mash program"); break; - case MENU_SYS_THERMS: lcdPuts(lcdHandle, "Start Thermometers"); + case MENU_SYS_THERMS: lcdPuts(lcdHandle, "Run Thermometers"); break; } @@ -285,7 +304,9 @@ #ifdef HAVE_WIRINGPI_H void panel_key_events(int key) { - units_list *unit; + units_list *unit; + profiles_list *profile; + int rc; switch (setupmenu) { case MENU_NONE: @@ -516,6 +537,14 @@ break; case MENU_MODE_PROFILE: + if (current_unit->profile) { + for (current_profile = Config.profiles; current_profile; current_profile = current_profile->next) { + if (strcmp(current_profile->uuid, current_unit->profile) == 0) + break; + } + } else { + current_profile = NULL; + } if (key == KEY_ESCAPE) go_menu(MENU_UNITS); if (key == KEY_DOWN) @@ -523,27 +552,119 @@ if (key == KEY_UP) go_menu(MENU_MODE_BEER); if (key == KEY_ENTER) { - change_mode(UNITMODE_PROFILE); - go_menu(MENU_MODE_PROFILE); + if (current_unit->mode == UNITMODE_PROFILE) { + switch (current_unit->prof_state) { + case PROFILE_OFF: if (current_unit->profile) + go_menu(MENU_PROFILE_START); + else + go_menu(MENU_PROFILE_SELECT); + break; + case PROFILE_PAUSE: go_menu(MENU_PROFILE_RESUME); + break; + case PROFILE_RUN: go_menu(MENU_PROFILE_PAUSE); + break; + case PROFILE_DONE: go_menu(MENU_PROFILE_GOOFF); + break; + } + } else { + change_mode(UNITMODE_PROFILE); + go_menu(MENU_MODE_PROFILE); + } } break; case MENU_PROFILE_SELECT: + if (key == KEY_ESCAPE) + go_menu(MENU_MODE_PROFILE); + if (key == KEY_DOWN) { + if (current_profile->next) { + current_profile = current_profile->next; + go_menu(MENU_PROFILE_SELECT); + } else { + go_menu(MENU_PROFILE_START); + } + } + if (key == KEY_UP) { + for (profile = Config.profiles; profile; profile = profile->next) { + if (profile->next && profile->next == current_profile) { + current_profile = profile; + go_menu(MENU_PROFILE_SELECT); + break; + } + } + go_menu(MENU_PROFILE_START); + } + if (key == KEY_ENTER) { + current_unit->profile = current_profile->uuid; + syslog(LOG_NOTICE, "Profile %s selected from panel", current_profile->name); + go_menu(MENU_PROFILE_START); + } break; case MENU_PROFILE_START: + if (key == KEY_ESCAPE) + go_menu(MENU_MODE_PROFILE); + if ((key == KEY_DOWN) || (key == KEY_UP)) + go_menu(MENU_PROFILE_SELECT); + if (key == KEY_ENTER) { + current_unit->prof_state = PROFILE_RUN; + current_unit->prof_started = time(NULL); + current_unit->prof_paused = 0; + syslog(LOG_NOTICE, "Profile started from the panel"); + go_menu(MENU_MODE_PROFILE); + } break; case MENU_PROFILE_PAUSE: + if (key == KEY_ESCAPE) + go_menu(MENU_MODE_PROFILE); + if ((key == KEY_DOWN) || (key == KEY_UP)) + go_menu(MENU_PROFILE_ABORT); + if (key == KEY_ENTER) { + current_unit->prof_state = PROFILE_PAUSE; + syslog(LOG_NOTICE, "Profile pause from the panel"); + go_menu(MENU_MODE_PROFILE); + } break; case MENU_PROFILE_ABORT: + if (key == KEY_ESCAPE) + go_menu(MENU_MODE_PROFILE); + if ((key == KEY_DOWN) || (key == KEY_UP)) { + if (current_unit->prof_state == PROFILE_PAUSE) + go_menu(MENU_PROFILE_RESUME); + else if (current_unit->prof_state == PROFILE_RUN) + go_menu(MENU_PROFILE_PAUSE); + } + if ((key == KEY_ENTER) && ((current_unit->prof_state == PROFILE_RUN) || (current_unit->prof_state == PROFILE_PAUSE))) { + current_unit->prof_state = PROFILE_OFF; + current_unit->prof_started = 0; + syslog(LOG_NOTICE, "Profile aborted from the panel"); + go_menu(MENU_MODE_PROFILE); + } break; case MENU_PROFILE_RESUME: + if (key == KEY_ESCAPE) + go_menu(MENU_MODE_PROFILE); + if ((key == KEY_DOWN) || (key == KEY_UP)) + go_menu(MENU_PROFILE_ABORT); + if (key == KEY_ENTER) { + current_unit->prof_state = PROFILE_RUN; + syslog(LOG_NOTICE, "Profile resume from the panel"); + go_menu(MENU_MODE_PROFILE); + } break; case MENU_PROFILE_GOOFF: + if (key == KEY_ESCAPE) + go_menu(MENU_MODE_PROFILE); + if (key == KEY_ENTER) { + if (current_unit->prof_state == PROFILE_DONE) { + current_unit->prof_state = PROFILE_OFF; + syslog(LOG_NOTICE, "Profile from done to off from the panel"); + } + } break; case MENU_TOP_SYS: @@ -564,6 +685,11 @@ go_menu(MENU_SYS_REBOOT); if (key == KEY_UP) go_menu(MENU_SYS_THERMS); + if (key == KEY_ENTER) { + rc = system("/sbin/halt"); + syslog(LOG_NOTICE, "System halt from panel: /sbin/halt rc=%d", rc); + go_menu(MENU_NONE); + } break; case MENU_SYS_REBOOT: @@ -573,6 +699,11 @@ go_menu(MENU_SYS_MASH); if (key == KEY_UP) go_menu(MENU_SYS_HALT); + if (key == KEY_ENTER) { + rc = system("/sbin/reboot"); + syslog(LOG_NOTICE, "System reboot from panel: /sbin/reboot rc=%d", rc); + go_menu(MENU_NONE); + } break; case MENU_SYS_MASH: