diff -r 7639cfa6aec0 -r c6a1a6ca5437 main/automation.c --- 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 {