thermferm/thermferm.c

changeset 247
f3d0e9445fcd
parent 246
6df404da3537
child 248
870d0be6880d
--- 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:

mercurial