main/automation.c

branch
novnc
changeset 42
c6a1a6ca5437
parent 27
e82484ef9d12
child 43
2079940c3989
--- a/main/automation.c	Sat May 04 21:18:51 2019 +0200
+++ b/main/automation.c	Tue May 07 22:03:38 2019 +0200
@@ -40,6 +40,7 @@
 extern bool			System_TimeOk;			///< System time is valid
 extern sButton			Buttons[MAXBUTTONS];		///< Buttons definitions
 extern int			Main_Screen;			///< Current screen
+extern int			Sub_Screen;			///< Sub screen during mash
 extern DS18B20_State            *ds18b20_state;			///< DS18B20 state
 extern DRIVER_State             *driver_state;			///< Relays driver state
 extern SemaphoreHandle_t        xSemaphoreDS18B20;		///< DS18B20 lock semaphore
@@ -64,8 +65,10 @@
  */
 bool Automation_Init(void)
 {
+    char	msg[64];
+
     switch (Main_Screen) {
-	case MAIN_AUTO_INIT:
+	case MAIN_AUTO_INIT1:
 #ifdef CONFIG_TEMP_SENSORS_SIMULATOR
 		Fake_MLT = recipe.MashStep[0].Temperature - 10;
 		Fake_HLT = recipe.SpargeTemp - 15;
@@ -136,7 +139,7 @@
                 runtime.UseHLT = _UseHLT = false;
 		runtime.TimeBrewing = 0;
                 TimeBrewing = 0;
-		runtime.StageResume = MAIN_AUTO_INIT;
+		runtime.StageResume = MAIN_AUTO_INIT1;
 		runtime.StageTimeLeft = 0;
 		runtime.HopAddition = 0;
 		runtime.Logfile[0] = '\0';
@@ -147,6 +150,7 @@
 		vTaskDelay(250 / portTICK_PERIOD_MS);	// Allow some time
                 break;
 
+	case MAIN_AUTO_INIT2:
 	case MAIN_AUTO_DELAYSTART:
 		break;
 
@@ -196,7 +200,9 @@
                         MaxMash = 75.0;
                     }
                 }
-                MashState = MASH_NONE;
+                MashState = Sub_Screen = MASH_NONE;
+		snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen);
+		ws_server_send_text_clients("/ws", msg, strlen(msg));
                 pumpTime = 0;
                 pumpRest = false;
 		runtime.StageResume = Main_Screen;
@@ -227,13 +233,14 @@
                 Buttons_Add(255,  30, 60, 40, "-sp",  1);
                 Buttons_Show();
                 ESP_LOGI(TAG, "Mash done, going to boil.");
+		Sub_Screen = 0;
                 break;
 
 	case MAIN_AUTO_BOILING:
                 if (Resume) {
                     TimeLeft = runtime.StageTimeLeft * 60;
                 } else {
-                    // +1 minute for flameout and 2 seconds for a smooth transition.
+                    // +1 minute for flameout and for a smooth transition.
                     runtime.StageTimeLeft = TimeLeft = (recipe.BoilTime * 60) + 60;
                     runtime.StageResume = Main_Screen;
                     runtime.HopAddition = 0;
@@ -257,6 +264,7 @@
                 Buttons_Show();
                 ESP_LOGI(TAG, "Boil temperature reached, boil %d minutes", (TimeLeft / 60) -1);
 		log_annotation(ANNOTATION_STAGE, "Koken");
+		Sub_Screen = 0;
                 break;
 
 	case MAIN_AUTO_COOLING_H:
@@ -373,16 +381,20 @@
 bool Automation_Loop(void)
 {
     static bool beeped = false;
-    char	tmp[32];
+    char	tmp[32], msg[256];
     uint16_t	y;
 
     switch (Main_Screen) {
 
-	case MAIN_AUTO_INIT:
+	case MAIN_AUTO_INIT1:
 		/*
 		 * Present selected equipment and recipe.
 		 */
+		Sub_Screen = 1;
 		read_recipe(config.RecipeRec);
+		snprintf(msg, 255, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\",\"brew1\":\"%s\",\"brew2\":\"%s\"}", 
+			Main_Screen, Sub_Screen, equipment.Name, recipe.Name);
+		ws_server_send_text_clients("/ws", msg, strlen(msg));
 		y = 28;
 		TopMessage("Automaat");
 		TFT_setFont(DEFAULT_FONT, NULL);
@@ -462,15 +474,17 @@
 					break;
 
 			case 1:         loop = false;
+					Main_Screen = MAIN_AUTO_INIT2;
 					break;
 
 			default:        break;
 		    }
 		    vTaskDelay(20 / portTICK_PERIOD_MS);
 		}
-		if (Main_Screen == MAIN_AUTO_ABORT)
-		    break;
+		Buttons_Clear();
+		break;
 
+	case MAIN_AUTO_INIT2:
                 _UseHLT = false;
 		_bg = TFT_BLACK;
 		TFT_fillScreen(_bg);
@@ -598,7 +612,9 @@
                         driver_state->mlt_mode = MLT_MODE_PID;
                         xSemaphoreGive(xSemaphoreDriver);
                     }
-                    MashState = MASH_WAITTEMP;
+                    MashState = Sub_Screen = MASH_WAITTEMP;
+		    snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen);
+                    ws_server_send_text_clients("/ws", msg, strlen(msg));
                     ESP_LOGI(TAG, "Mash step %d type: %s time: %d temp: %4.1f  min: %4.1f max: %4.1f",
 				    Main_Screen - MAIN_AUTO_MASH_IN, mashTypes[recipe.MashStep[Main_Screen - MAIN_AUTO_MASH_IN].Type],
                                     stageTime, stageTemp, MinMash, MaxMash);
@@ -632,7 +648,9 @@
 					recipe.MashStep[Main_Screen - MAIN_AUTO_MASH_IN].Infusion_temp);
 			TFT_print(temp_buf, CENTER, 135);
 			SoundPlay(SOUND_Prompt);
-			MashState = MASH_INFUSE;
+			MashState = Sub_Screen = MASH_INFUSE;
+			snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"%s\"}", Main_Screen, Sub_Screen, temp_buf);
+                	ws_server_send_text_clients("/ws", msg, strlen(msg));
 			if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
 			    // No heating during the infusion.
 			    driver_state->mlt_sp = stageTemp;
@@ -654,7 +672,9 @@
                     if ((temp_MLT >= stageTemp) && (Steady > 10)) {
                         SoundPlay(SOUND_TempReached);
                         TempReached = true;
-                        MashState = MASH_REST;
+                        MashState = Sub_Screen = MASH_REST;
+			snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen);
+                	ws_server_send_text_clients("/ws", msg, strlen(msg));
                         if (Main_Screen == MAIN_AUTO_MASH_IN) {
                             TimerSet(0);
                         } else {
@@ -756,7 +776,9 @@
                             TFT_setFont(DEJAVU24_FONT, NULL);
                             TFT_print("Mout storten?", CENTER, 135);
                             SoundPlay(SOUND_Prompt);
-			    MashState = MASH_ADD;
+			    MashState = Sub_Screen = MASH_ADD;
+			    snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"Mout storten?\"}", Main_Screen, Sub_Screen);
+                	    ws_server_send_text_clients("/ws", msg, strlen(msg));
 			    ESP_LOGI(TAG, "Mash add prompt");
 			    break;
                         }
@@ -778,7 +800,9 @@
                             SoundPlay(SOUND_Prompt);
                             beeped = false;
                             TimerSet(config.IodineTime * 60);
-			    MashState = MASH_IODINE;
+			    MashState = Sub_Screen = MASH_IODINE;
+			    snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"Jodium test?\"}", Main_Screen, Sub_Screen);
+                	    ws_server_send_text_clients("/ws", msg, strlen(msg));
 			    ESP_LOGI(TAG, "Mash iodine test prompt");
 			    break;
                         }
@@ -798,7 +822,9 @@
                             TFT_setFont(DEJAVU18_FONT, NULL);
                             TFT_print("Mout verwijderen?", CENTER, 135);
                             SoundPlay(SOUND_Prompt);
-			    MashState = MASH_REMOVE;
+			    MashState = Sub_Screen = MASH_REMOVE;
+			    snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"Mout verwijderen?\"}", Main_Screen, Sub_Screen);
+                	    ws_server_send_text_clients("/ws", msg, strlen(msg));
 			    ESP_LOGI(TAG, "Mash remove prompt");
 			    break;
                         }
@@ -851,7 +877,9 @@
 		    switch (Buttons_Scan()) {
 			case 0:     Main_Screen = MAIN_AUTO_ABORT;
 				    break;
-			case 1:	    MashState = MASH_WAITTEMP;
+			case 1:	    MashState = Sub_Screen = MASH_WAITTEMP;
+				    snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen);
+                		    ws_server_send_text_clients("/ws", msg, strlen(msg));
 				    if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
 					// Start PID again.
 					driver_state->mlt_sp = stageTemp;
@@ -1018,6 +1046,7 @@
 			 */
 			Buttons_Clear();
 			TFT_fillScreen(_bg);
+			Sub_Screen = 1;
 			if (Main_Screen == MAIN_AUTO_COOLING_H) {
 			    stageTemp = 77.0;
 			} else if (Main_Screen == MAIN_AUTO_COOLING_M) {
@@ -1025,6 +1054,8 @@
 			} else {
 			    stageTemp = recipe.CoolTemp;
 			}
+			snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen);
+                        ws_server_send_text_clients("/ws", msg, strlen(msg));
 			CoolBeep = false;
 			ESP_LOGI(TAG, "Start cooling from %6.2f to %4.1f", ds18b20_state->mlt_temperature, stageTemp);
 			if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
@@ -1146,6 +1177,7 @@
                     	if (driver_state->mlt_pv <= driver_state->mlt_sp) {
                             SoundPlay(SOUND_TempReached);
                             Main_Screen++;
+			    Sub_Screen = 0;
                     	}
                     	xSemaphoreGive(xSemaphoreDriver);
                     }
@@ -1179,6 +1211,9 @@
 			 */
 			Buttons_Clear();
 			TFT_fillScreen(_bg);
+			Sub_Screen = 1;
+                        snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen);
+                        ws_server_send_text_clients("/ws", msg, strlen(msg));
 			if (Main_Screen == MAIN_AUTO_WHIRLPOOL9) {
 			    TimeWhirlPool = recipe.Whirlpool9;
 			    if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
@@ -1227,7 +1262,7 @@
 			ESP_LOGI(TAG, "Whirlpool %d minutes, sp %4.1f", TimeWhirlPool, driver_state->mlt_sp);
 			Buttons_Add(255, 120, 60, 40, "+1m", 0);
 			Buttons_Add(  5, 120, 60, 40, "-1m", 1);
-			Buttons_Add(130, 200, 60, 40, "Pomp",  2);
+			Buttons_Add(255, 200, 60, 40, "Pomp",  2);
 			Buttons_Show();
 		    }
 		} else {

mercurial