38 bool _Prompt = false; ///< Prompt display flag |
38 bool _Prompt = false; ///< Prompt display flag |
39 |
39 |
40 extern bool System_TimeOk; ///< System time is valid |
40 extern bool System_TimeOk; ///< System time is valid |
41 extern sButton Buttons[MAXBUTTONS]; ///< Buttons definitions |
41 extern sButton Buttons[MAXBUTTONS]; ///< Buttons definitions |
42 extern int Main_Screen; ///< Current screen |
42 extern int Main_Screen; ///< Current screen |
|
43 extern int Sub_Screen; ///< Sub screen during mash |
43 extern DS18B20_State *ds18b20_state; ///< DS18B20 state |
44 extern DS18B20_State *ds18b20_state; ///< DS18B20 state |
44 extern DRIVER_State *driver_state; ///< Relays driver state |
45 extern DRIVER_State *driver_state; ///< Relays driver state |
45 extern SemaphoreHandle_t xSemaphoreDS18B20; ///< DS18B20 lock semaphore |
46 extern SemaphoreHandle_t xSemaphoreDS18B20; ///< DS18B20 lock semaphore |
46 extern SemaphoreHandle_t xSemaphoreDriver; ///< Relays driver lock semaphore |
47 extern SemaphoreHandle_t xSemaphoreDriver; ///< Relays driver lock semaphore |
47 extern double Output; ///< Cakculated outpout power |
48 extern double Output; ///< Cakculated outpout power |
62 * Automation init function that only runs once when a |
63 * Automation init function that only runs once when a |
63 * new screen is entered. |
64 * new screen is entered. |
64 */ |
65 */ |
65 bool Automation_Init(void) |
66 bool Automation_Init(void) |
66 { |
67 { |
|
68 char msg[64]; |
|
69 |
67 switch (Main_Screen) { |
70 switch (Main_Screen) { |
68 case MAIN_AUTO_INIT: |
71 case MAIN_AUTO_INIT1: |
69 #ifdef CONFIG_TEMP_SENSORS_SIMULATOR |
72 #ifdef CONFIG_TEMP_SENSORS_SIMULATOR |
70 Fake_MLT = recipe.MashStep[0].Temperature - 10; |
73 Fake_MLT = recipe.MashStep[0].Temperature - 10; |
71 Fake_HLT = recipe.SpargeTemp - 15; |
74 Fake_HLT = recipe.SpargeTemp - 15; |
72 if (xSemaphoreTake(xSemaphoreDS18B20, 10) == pdTRUE) { |
75 if (xSemaphoreTake(xSemaphoreDS18B20, 10) == pdTRUE) { |
73 ds18b20_state->mlt_temperature = ((int)(Fake_MLT * 16)) / 16.0; |
76 ds18b20_state->mlt_temperature = ((int)(Fake_MLT * 16)) / 16.0; |
134 } |
137 } |
135 runtime.AutoModeStarted = true; |
138 runtime.AutoModeStarted = true; |
136 runtime.UseHLT = _UseHLT = false; |
139 runtime.UseHLT = _UseHLT = false; |
137 runtime.TimeBrewing = 0; |
140 runtime.TimeBrewing = 0; |
138 TimeBrewing = 0; |
141 TimeBrewing = 0; |
139 runtime.StageResume = MAIN_AUTO_INIT; |
142 runtime.StageResume = MAIN_AUTO_INIT1; |
140 runtime.StageTimeLeft = 0; |
143 runtime.StageTimeLeft = 0; |
141 runtime.HopAddition = 0; |
144 runtime.HopAddition = 0; |
142 runtime.Logfile[0] = '\0'; |
145 runtime.Logfile[0] = '\0'; |
143 runtime.PumpCooling = false; |
146 runtime.PumpCooling = false; |
144 write_runtime(); |
147 write_runtime(); |
145 power_MLT = power_HLT = counts = 0; |
148 power_MLT = power_HLT = counts = 0; |
146 log_clean(); |
149 log_clean(); |
147 vTaskDelay(250 / portTICK_PERIOD_MS); // Allow some time |
150 vTaskDelay(250 / portTICK_PERIOD_MS); // Allow some time |
148 break; |
151 break; |
149 |
152 |
|
153 case MAIN_AUTO_INIT2: |
150 case MAIN_AUTO_DELAYSTART: |
154 case MAIN_AUTO_DELAYSTART: |
151 break; |
155 break; |
152 |
156 |
153 case MAIN_AUTO_HEATUP: |
157 case MAIN_AUTO_HEATUP: |
154 if (runtime.UseHLT) { |
158 if (runtime.UseHLT) { |
194 MaxMash = recipe.MashStep[Main_Screen - MAIN_AUTO_MASH_IN + 1].Temperature; |
198 MaxMash = recipe.MashStep[Main_Screen - MAIN_AUTO_MASH_IN + 1].Temperature; |
195 } else { |
199 } else { |
196 MaxMash = 75.0; |
200 MaxMash = 75.0; |
197 } |
201 } |
198 } |
202 } |
199 MashState = MASH_NONE; |
203 MashState = Sub_Screen = MASH_NONE; |
|
204 snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen); |
|
205 ws_server_send_text_clients("/ws", msg, strlen(msg)); |
200 pumpTime = 0; |
206 pumpTime = 0; |
201 pumpRest = false; |
207 pumpRest = false; |
202 runtime.StageResume = Main_Screen; |
208 runtime.StageResume = Main_Screen; |
203 updateRuntime = true; |
209 updateRuntime = true; |
204 TopMessage("Maischen"); |
210 TopMessage("Maischen"); |
225 MLT_info(71, 26, false); |
231 MLT_info(71, 26, false); |
226 Buttons_Add( 5, 30, 60, 40, "+sp", 0); |
232 Buttons_Add( 5, 30, 60, 40, "+sp", 0); |
227 Buttons_Add(255, 30, 60, 40, "-sp", 1); |
233 Buttons_Add(255, 30, 60, 40, "-sp", 1); |
228 Buttons_Show(); |
234 Buttons_Show(); |
229 ESP_LOGI(TAG, "Mash done, going to boil."); |
235 ESP_LOGI(TAG, "Mash done, going to boil."); |
|
236 Sub_Screen = 0; |
230 break; |
237 break; |
231 |
238 |
232 case MAIN_AUTO_BOILING: |
239 case MAIN_AUTO_BOILING: |
233 if (Resume) { |
240 if (Resume) { |
234 TimeLeft = runtime.StageTimeLeft * 60; |
241 TimeLeft = runtime.StageTimeLeft * 60; |
235 } else { |
242 } else { |
236 // +1 minute for flameout and 2 seconds for a smooth transition. |
243 // +1 minute for flameout and for a smooth transition. |
237 runtime.StageTimeLeft = TimeLeft = (recipe.BoilTime * 60) + 60; |
244 runtime.StageTimeLeft = TimeLeft = (recipe.BoilTime * 60) + 60; |
238 runtime.StageResume = Main_Screen; |
245 runtime.StageResume = Main_Screen; |
239 runtime.HopAddition = 0; |
246 runtime.HopAddition = 0; |
240 } |
247 } |
241 SecsCount = 0; |
248 SecsCount = 0; |
255 Buttons_Add( 3, 190, 60, 40, "+1m", 2); |
262 Buttons_Add( 3, 190, 60, 40, "+1m", 2); |
256 Buttons_Add(257, 190, 60, 40, "-1m", 3); |
263 Buttons_Add(257, 190, 60, 40, "-1m", 3); |
257 Buttons_Show(); |
264 Buttons_Show(); |
258 ESP_LOGI(TAG, "Boil temperature reached, boil %d minutes", (TimeLeft / 60) -1); |
265 ESP_LOGI(TAG, "Boil temperature reached, boil %d minutes", (TimeLeft / 60) -1); |
259 log_annotation(ANNOTATION_STAGE, "Koken"); |
266 log_annotation(ANNOTATION_STAGE, "Koken"); |
|
267 Sub_Screen = 0; |
260 break; |
268 break; |
261 |
269 |
262 case MAIN_AUTO_COOLING_H: |
270 case MAIN_AUTO_COOLING_H: |
263 case MAIN_AUTO_COOLING_M: |
271 case MAIN_AUTO_COOLING_M: |
264 case MAIN_AUTO_COOLING_C: |
272 case MAIN_AUTO_COOLING_C: |
283 Buttons_Show(); |
291 Buttons_Show(); |
284 SoundPlay(SOUND_Prompt); |
292 SoundPlay(SOUND_Prompt); |
285 _Prompt = true; |
293 _Prompt = true; |
286 break; |
294 break; |
287 |
295 |
|
296 case MAIN_AUTO_WHIRLPOOL9: |
288 case MAIN_AUTO_WHIRLPOOL7: |
297 case MAIN_AUTO_WHIRLPOOL7: |
289 case MAIN_AUTO_WHIRLPOOL6: |
298 case MAIN_AUTO_WHIRLPOOL6: |
290 case MAIN_AUTO_WHIRLPOOL2: |
299 case MAIN_AUTO_WHIRLPOOL2: |
291 TempReached = true; |
300 TempReached = true; |
292 runtime.StageResume = Main_Screen; |
301 runtime.StageResume = Main_Screen; |
371 * Automation loop screens. Mostly non-blocking. |
380 * Automation loop screens. Mostly non-blocking. |
372 */ |
381 */ |
373 bool Automation_Loop(void) |
382 bool Automation_Loop(void) |
374 { |
383 { |
375 static bool beeped = false; |
384 static bool beeped = false; |
376 char tmp[32]; |
385 char tmp[32], msg[256]; |
377 uint16_t y; |
386 uint16_t y; |
378 |
387 |
379 switch (Main_Screen) { |
388 switch (Main_Screen) { |
380 |
389 |
381 case MAIN_AUTO_INIT: |
390 case MAIN_AUTO_INIT1: |
382 /* |
391 /* |
383 * Present selected equipment and recipe. |
392 * Present selected equipment and recipe. |
384 */ |
393 */ |
|
394 Sub_Screen = 1; |
385 read_recipe(config.RecipeRec); |
395 read_recipe(config.RecipeRec); |
|
396 snprintf(msg, 255, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\",\"brew1\":\"%s\",\"brew2\":\"%s\"}", |
|
397 Main_Screen, Sub_Screen, equipment.Name, recipe.Name); |
|
398 ws_server_send_text_clients("/ws", msg, strlen(msg)); |
386 y = 28; |
399 y = 28; |
387 TopMessage("Automaat"); |
400 TopMessage("Automaat"); |
388 TFT_setFont(DEFAULT_FONT, NULL); |
401 TFT_setFont(DEFAULT_FONT, NULL); |
389 ShowText(2,y,"Installatie", equipment.Name); |
402 ShowText(2,y,"Installatie", equipment.Name); |
390 y += 16; |
403 y += 16; |
460 case 0: loop = false; |
473 case 0: loop = false; |
461 Main_Screen = MAIN_AUTO_ABORT; |
474 Main_Screen = MAIN_AUTO_ABORT; |
462 break; |
475 break; |
463 |
476 |
464 case 1: loop = false; |
477 case 1: loop = false; |
|
478 Main_Screen = MAIN_AUTO_INIT2; |
465 break; |
479 break; |
466 |
480 |
467 default: break; |
481 default: break; |
468 } |
482 } |
469 vTaskDelay(20 / portTICK_PERIOD_MS); |
483 vTaskDelay(20 / portTICK_PERIOD_MS); |
470 } |
484 } |
471 if (Main_Screen == MAIN_AUTO_ABORT) |
485 Buttons_Clear(); |
472 break; |
486 break; |
473 |
487 |
|
488 case MAIN_AUTO_INIT2: |
474 _UseHLT = false; |
489 _UseHLT = false; |
475 _bg = TFT_BLACK; |
490 _bg = TFT_BLACK; |
476 TFT_fillScreen(_bg); |
491 TFT_fillScreen(_bg); |
477 TopMessage("Maisch water aanwezig?"); |
492 TopMessage("Maisch water aanwezig?"); |
478 Buttons_Clear(); |
493 Buttons_Clear(); |
596 if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
611 if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
597 driver_state->mlt_sp = stageTemp; |
612 driver_state->mlt_sp = stageTemp; |
598 driver_state->mlt_mode = MLT_MODE_PID; |
613 driver_state->mlt_mode = MLT_MODE_PID; |
599 xSemaphoreGive(xSemaphoreDriver); |
614 xSemaphoreGive(xSemaphoreDriver); |
600 } |
615 } |
601 MashState = MASH_WAITTEMP; |
616 MashState = Sub_Screen = MASH_WAITTEMP; |
|
617 snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen); |
|
618 ws_server_send_text_clients("/ws", msg, strlen(msg)); |
602 ESP_LOGI(TAG, "Mash step %d type: %s time: %d temp: %4.1f min: %4.1f max: %4.1f", |
619 ESP_LOGI(TAG, "Mash step %d type: %s time: %d temp: %4.1f min: %4.1f max: %4.1f", |
603 Main_Screen - MAIN_AUTO_MASH_IN, mashTypes[recipe.MashStep[Main_Screen - MAIN_AUTO_MASH_IN].Type], |
620 Main_Screen - MAIN_AUTO_MASH_IN, mashTypes[recipe.MashStep[Main_Screen - MAIN_AUTO_MASH_IN].Type], |
604 stageTime, stageTemp, MinMash, MaxMash); |
621 stageTime, stageTemp, MinMash, MaxMash); |
605 |
622 |
606 if (Main_Screen > MAIN_AUTO_MASH_IN) { |
623 if (Main_Screen > MAIN_AUTO_MASH_IN) { |
630 TFT_setFont(DEJAVU18_FONT, NULL); |
647 TFT_setFont(DEJAVU18_FONT, NULL); |
631 sprintf(temp_buf, "Infuse %.1f L/%.1f C", recipe.MashStep[Main_Screen - MAIN_AUTO_MASH_IN].Infusion_amount, |
648 sprintf(temp_buf, "Infuse %.1f L/%.1f C", recipe.MashStep[Main_Screen - MAIN_AUTO_MASH_IN].Infusion_amount, |
632 recipe.MashStep[Main_Screen - MAIN_AUTO_MASH_IN].Infusion_temp); |
649 recipe.MashStep[Main_Screen - MAIN_AUTO_MASH_IN].Infusion_temp); |
633 TFT_print(temp_buf, CENTER, 135); |
650 TFT_print(temp_buf, CENTER, 135); |
634 SoundPlay(SOUND_Prompt); |
651 SoundPlay(SOUND_Prompt); |
635 MashState = MASH_INFUSE; |
652 MashState = Sub_Screen = MASH_INFUSE; |
|
653 snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"%s\"}", Main_Screen, Sub_Screen, temp_buf); |
|
654 ws_server_send_text_clients("/ws", msg, strlen(msg)); |
636 if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
655 if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
637 // No heating during the infusion. |
656 // No heating during the infusion. |
638 driver_state->mlt_sp = stageTemp; |
657 driver_state->mlt_sp = stageTemp; |
639 driver_state->mlt_mode = MLT_MODE_OFF; |
658 driver_state->mlt_mode = MLT_MODE_OFF; |
640 xSemaphoreGive(xSemaphoreDriver); |
659 xSemaphoreGive(xSemaphoreDriver); |
652 Steady = 0; |
671 Steady = 0; |
653 } |
672 } |
654 if ((temp_MLT >= stageTemp) && (Steady > 10)) { |
673 if ((temp_MLT >= stageTemp) && (Steady > 10)) { |
655 SoundPlay(SOUND_TempReached); |
674 SoundPlay(SOUND_TempReached); |
656 TempReached = true; |
675 TempReached = true; |
657 MashState = MASH_REST; |
676 MashState = Sub_Screen = MASH_REST; |
|
677 snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen); |
|
678 ws_server_send_text_clients("/ws", msg, strlen(msg)); |
658 if (Main_Screen == MAIN_AUTO_MASH_IN) { |
679 if (Main_Screen == MAIN_AUTO_MASH_IN) { |
659 TimerSet(0); |
680 TimerSet(0); |
660 } else { |
681 } else { |
661 if (Resume && (runtime.StageTimeLeft < stageTime)) |
682 if (Resume && (runtime.StageTimeLeft < stageTime)) |
662 TimerSet(runtime.StageTimeLeft * 60); |
683 TimerSet(runtime.StageTimeLeft * 60); |
754 _fg = TFT_WHITE; |
775 _fg = TFT_WHITE; |
755 _bg = TFT_BLACK; |
776 _bg = TFT_BLACK; |
756 TFT_setFont(DEJAVU24_FONT, NULL); |
777 TFT_setFont(DEJAVU24_FONT, NULL); |
757 TFT_print("Mout storten?", CENTER, 135); |
778 TFT_print("Mout storten?", CENTER, 135); |
758 SoundPlay(SOUND_Prompt); |
779 SoundPlay(SOUND_Prompt); |
759 MashState = MASH_ADD; |
780 MashState = Sub_Screen = MASH_ADD; |
|
781 snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"Mout storten?\"}", Main_Screen, Sub_Screen); |
|
782 ws_server_send_text_clients("/ws", msg, strlen(msg)); |
760 ESP_LOGI(TAG, "Mash add prompt"); |
783 ESP_LOGI(TAG, "Mash add prompt"); |
761 break; |
784 break; |
762 } |
785 } |
763 if (((Main_Screen - MAIN_AUTO_MASH_IN) == LastMashStep) && config.AskIodine) { |
786 if (((Main_Screen - MAIN_AUTO_MASH_IN) == LastMashStep) && config.AskIodine) { |
764 /* |
787 /* |
776 TFT_setFont(DEJAVU24_FONT, NULL); |
799 TFT_setFont(DEJAVU24_FONT, NULL); |
777 TFT_print("Jodium test?", CENTER, 127); |
800 TFT_print("Jodium test?", CENTER, 127); |
778 SoundPlay(SOUND_Prompt); |
801 SoundPlay(SOUND_Prompt); |
779 beeped = false; |
802 beeped = false; |
780 TimerSet(config.IodineTime * 60); |
803 TimerSet(config.IodineTime * 60); |
781 MashState = MASH_IODINE; |
804 MashState = Sub_Screen = MASH_IODINE; |
|
805 snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"Jodium test?\"}", Main_Screen, Sub_Screen); |
|
806 ws_server_send_text_clients("/ws", msg, strlen(msg)); |
782 ESP_LOGI(TAG, "Mash iodine test prompt"); |
807 ESP_LOGI(TAG, "Mash iodine test prompt"); |
783 break; |
808 break; |
784 } |
809 } |
785 if ((Main_Screen == MAIN_AUTO_MASH_OUT) && config.AskRemove) { |
810 if ((Main_Screen == MAIN_AUTO_MASH_OUT) && config.AskRemove) { |
786 /* |
811 /* |
796 _fg = TFT_WHITE; |
821 _fg = TFT_WHITE; |
797 _bg = TFT_BLACK; |
822 _bg = TFT_BLACK; |
798 TFT_setFont(DEJAVU18_FONT, NULL); |
823 TFT_setFont(DEJAVU18_FONT, NULL); |
799 TFT_print("Mout verwijderen?", CENTER, 135); |
824 TFT_print("Mout verwijderen?", CENTER, 135); |
800 SoundPlay(SOUND_Prompt); |
825 SoundPlay(SOUND_Prompt); |
801 MashState = MASH_REMOVE; |
826 MashState = Sub_Screen = MASH_REMOVE; |
|
827 snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"Mout verwijderen?\"}", Main_Screen, Sub_Screen); |
|
828 ws_server_send_text_clients("/ws", msg, strlen(msg)); |
802 ESP_LOGI(TAG, "Mash remove prompt"); |
829 ESP_LOGI(TAG, "Mash remove prompt"); |
803 break; |
830 break; |
804 } |
831 } |
805 if (Main_Screen != MAIN_AUTO_ABORT) |
832 if (Main_Screen != MAIN_AUTO_ABORT) |
806 Main_Screen++; |
833 Main_Screen++; |
849 } |
876 } |
850 } else if (MashState == MASH_INFUSE) { |
877 } else if (MashState == MASH_INFUSE) { |
851 switch (Buttons_Scan()) { |
878 switch (Buttons_Scan()) { |
852 case 0: Main_Screen = MAIN_AUTO_ABORT; |
879 case 0: Main_Screen = MAIN_AUTO_ABORT; |
853 break; |
880 break; |
854 case 1: MashState = MASH_WAITTEMP; |
881 case 1: MashState = Sub_Screen = MASH_WAITTEMP; |
|
882 snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen); |
|
883 ws_server_send_text_clients("/ws", msg, strlen(msg)); |
855 if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
884 if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
856 // Start PID again. |
885 // Start PID again. |
857 driver_state->mlt_sp = stageTemp; |
886 driver_state->mlt_sp = stageTemp; |
858 driver_state->mlt_mode = MLT_MODE_PID; |
887 driver_state->mlt_mode = MLT_MODE_PID; |
859 xSemaphoreGive(xSemaphoreDriver); |
888 xSemaphoreGive(xSemaphoreDriver); |
1016 /* |
1045 /* |
1017 * Starting cooling, setup the screen. |
1046 * Starting cooling, setup the screen. |
1018 */ |
1047 */ |
1019 Buttons_Clear(); |
1048 Buttons_Clear(); |
1020 TFT_fillScreen(_bg); |
1049 TFT_fillScreen(_bg); |
|
1050 Sub_Screen = 1; |
1021 if (Main_Screen == MAIN_AUTO_COOLING_H) { |
1051 if (Main_Screen == MAIN_AUTO_COOLING_H) { |
1022 stageTemp = 77.0; |
1052 stageTemp = 77.0; |
1023 } else if (Main_Screen == MAIN_AUTO_COOLING_M) { |
1053 } else if (Main_Screen == MAIN_AUTO_COOLING_M) { |
1024 stageTemp = 66.0; |
1054 stageTemp = 66.0; |
1025 } else { |
1055 } else { |
1026 stageTemp = recipe.CoolTemp; |
1056 stageTemp = recipe.CoolTemp; |
1027 } |
1057 } |
|
1058 snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen); |
|
1059 ws_server_send_text_clients("/ws", msg, strlen(msg)); |
1028 CoolBeep = false; |
1060 CoolBeep = false; |
1029 ESP_LOGI(TAG, "Start cooling from %6.2f to %4.1f", ds18b20_state->mlt_temperature, stageTemp); |
1061 ESP_LOGI(TAG, "Start cooling from %6.2f to %4.1f", ds18b20_state->mlt_temperature, stageTemp); |
1030 if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
1062 if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
1031 driver_state->mlt_mode = MLT_MODE_OFF; |
1063 driver_state->mlt_mode = MLT_MODE_OFF; |
1032 driver_state->mlt_sp = stageTemp; |
1064 driver_state->mlt_sp = stageTemp; |
1177 /* |
1210 /* |
1178 * Prepare the screen for the actual whirpool. |
1211 * Prepare the screen for the actual whirpool. |
1179 */ |
1212 */ |
1180 Buttons_Clear(); |
1213 Buttons_Clear(); |
1181 TFT_fillScreen(_bg); |
1214 TFT_fillScreen(_bg); |
|
1215 Sub_Screen = 1; |
|
1216 snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen); |
|
1217 ws_server_send_text_clients("/ws", msg, strlen(msg)); |
1182 if (Main_Screen == MAIN_AUTO_WHIRLPOOL9) { |
1218 if (Main_Screen == MAIN_AUTO_WHIRLPOOL9) { |
1183 TimeWhirlPool = recipe.Whirlpool9; |
1219 TimeWhirlPool = recipe.Whirlpool9; |
1184 if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
1220 if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
1185 driver_state->mlt_sp = 93.0; |
1221 driver_state->mlt_sp = 93.0; |
1186 driver_state->mlt_mode = MLT_MODE_PID; |
1222 driver_state->mlt_mode = MLT_MODE_PID; |
1225 updateRuntime = true; |
1261 updateRuntime = true; |
1226 MLT_info(71, 26, false); |
1262 MLT_info(71, 26, false); |
1227 ESP_LOGI(TAG, "Whirlpool %d minutes, sp %4.1f", TimeWhirlPool, driver_state->mlt_sp); |
1263 ESP_LOGI(TAG, "Whirlpool %d minutes, sp %4.1f", TimeWhirlPool, driver_state->mlt_sp); |
1228 Buttons_Add(255, 120, 60, 40, "+1m", 0); |
1264 Buttons_Add(255, 120, 60, 40, "+1m", 0); |
1229 Buttons_Add( 5, 120, 60, 40, "-1m", 1); |
1265 Buttons_Add( 5, 120, 60, 40, "-1m", 1); |
1230 Buttons_Add(130, 200, 60, 40, "Pomp", 2); |
1266 Buttons_Add(255, 200, 60, 40, "Pomp", 2); |
1231 Buttons_Show(); |
1267 Buttons_Show(); |
1232 } |
1268 } |
1233 } else { |
1269 } else { |
1234 /* |
1270 /* |
1235 * Not running in prompt mode, do the whirlpool. |
1271 * Not running in prompt mode, do the whirlpool. |