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: |
371 * Automation loop screens. Mostly non-blocking. |
379 * Automation loop screens. Mostly non-blocking. |
372 */ |
380 */ |
373 bool Automation_Loop(void) |
381 bool Automation_Loop(void) |
374 { |
382 { |
375 static bool beeped = false; |
383 static bool beeped = false; |
376 char tmp[32]; |
384 char tmp[32], msg[256]; |
377 uint16_t y; |
385 uint16_t y; |
378 |
386 |
379 switch (Main_Screen) { |
387 switch (Main_Screen) { |
380 |
388 |
381 case MAIN_AUTO_INIT: |
389 case MAIN_AUTO_INIT1: |
382 /* |
390 /* |
383 * Present selected equipment and recipe. |
391 * Present selected equipment and recipe. |
384 */ |
392 */ |
|
393 Sub_Screen = 1; |
385 read_recipe(config.RecipeRec); |
394 read_recipe(config.RecipeRec); |
|
395 snprintf(msg, 255, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\",\"brew1\":\"%s\",\"brew2\":\"%s\"}", |
|
396 Main_Screen, Sub_Screen, equipment.Name, recipe.Name); |
|
397 ws_server_send_text_clients("/ws", msg, strlen(msg)); |
386 y = 28; |
398 y = 28; |
387 TopMessage("Automaat"); |
399 TopMessage("Automaat"); |
388 TFT_setFont(DEFAULT_FONT, NULL); |
400 TFT_setFont(DEFAULT_FONT, NULL); |
389 ShowText(2,y,"Installatie", equipment.Name); |
401 ShowText(2,y,"Installatie", equipment.Name); |
390 y += 16; |
402 y += 16; |
460 case 0: loop = false; |
472 case 0: loop = false; |
461 Main_Screen = MAIN_AUTO_ABORT; |
473 Main_Screen = MAIN_AUTO_ABORT; |
462 break; |
474 break; |
463 |
475 |
464 case 1: loop = false; |
476 case 1: loop = false; |
|
477 Main_Screen = MAIN_AUTO_INIT2; |
465 break; |
478 break; |
466 |
479 |
467 default: break; |
480 default: break; |
468 } |
481 } |
469 vTaskDelay(20 / portTICK_PERIOD_MS); |
482 vTaskDelay(20 / portTICK_PERIOD_MS); |
470 } |
483 } |
471 if (Main_Screen == MAIN_AUTO_ABORT) |
484 Buttons_Clear(); |
472 break; |
485 break; |
473 |
486 |
|
487 case MAIN_AUTO_INIT2: |
474 _UseHLT = false; |
488 _UseHLT = false; |
475 _bg = TFT_BLACK; |
489 _bg = TFT_BLACK; |
476 TFT_fillScreen(_bg); |
490 TFT_fillScreen(_bg); |
477 TopMessage("Maisch water aanwezig?"); |
491 TopMessage("Maisch water aanwezig?"); |
478 Buttons_Clear(); |
492 Buttons_Clear(); |
596 if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
610 if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
597 driver_state->mlt_sp = stageTemp; |
611 driver_state->mlt_sp = stageTemp; |
598 driver_state->mlt_mode = MLT_MODE_PID; |
612 driver_state->mlt_mode = MLT_MODE_PID; |
599 xSemaphoreGive(xSemaphoreDriver); |
613 xSemaphoreGive(xSemaphoreDriver); |
600 } |
614 } |
601 MashState = MASH_WAITTEMP; |
615 MashState = Sub_Screen = MASH_WAITTEMP; |
|
616 snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen); |
|
617 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", |
618 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], |
619 Main_Screen - MAIN_AUTO_MASH_IN, mashTypes[recipe.MashStep[Main_Screen - MAIN_AUTO_MASH_IN].Type], |
604 stageTime, stageTemp, MinMash, MaxMash); |
620 stageTime, stageTemp, MinMash, MaxMash); |
605 |
621 |
606 if (Main_Screen > MAIN_AUTO_MASH_IN) { |
622 if (Main_Screen > MAIN_AUTO_MASH_IN) { |
630 TFT_setFont(DEJAVU18_FONT, NULL); |
646 TFT_setFont(DEJAVU18_FONT, NULL); |
631 sprintf(temp_buf, "Infuse %.1f L/%.1f C", recipe.MashStep[Main_Screen - MAIN_AUTO_MASH_IN].Infusion_amount, |
647 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); |
648 recipe.MashStep[Main_Screen - MAIN_AUTO_MASH_IN].Infusion_temp); |
633 TFT_print(temp_buf, CENTER, 135); |
649 TFT_print(temp_buf, CENTER, 135); |
634 SoundPlay(SOUND_Prompt); |
650 SoundPlay(SOUND_Prompt); |
635 MashState = MASH_INFUSE; |
651 MashState = Sub_Screen = MASH_INFUSE; |
|
652 snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"%s\"}", Main_Screen, Sub_Screen, temp_buf); |
|
653 ws_server_send_text_clients("/ws", msg, strlen(msg)); |
636 if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
654 if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
637 // No heating during the infusion. |
655 // No heating during the infusion. |
638 driver_state->mlt_sp = stageTemp; |
656 driver_state->mlt_sp = stageTemp; |
639 driver_state->mlt_mode = MLT_MODE_OFF; |
657 driver_state->mlt_mode = MLT_MODE_OFF; |
640 xSemaphoreGive(xSemaphoreDriver); |
658 xSemaphoreGive(xSemaphoreDriver); |
652 Steady = 0; |
670 Steady = 0; |
653 } |
671 } |
654 if ((temp_MLT >= stageTemp) && (Steady > 10)) { |
672 if ((temp_MLT >= stageTemp) && (Steady > 10)) { |
655 SoundPlay(SOUND_TempReached); |
673 SoundPlay(SOUND_TempReached); |
656 TempReached = true; |
674 TempReached = true; |
657 MashState = MASH_REST; |
675 MashState = Sub_Screen = MASH_REST; |
|
676 snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen); |
|
677 ws_server_send_text_clients("/ws", msg, strlen(msg)); |
658 if (Main_Screen == MAIN_AUTO_MASH_IN) { |
678 if (Main_Screen == MAIN_AUTO_MASH_IN) { |
659 TimerSet(0); |
679 TimerSet(0); |
660 } else { |
680 } else { |
661 if (Resume && (runtime.StageTimeLeft < stageTime)) |
681 if (Resume && (runtime.StageTimeLeft < stageTime)) |
662 TimerSet(runtime.StageTimeLeft * 60); |
682 TimerSet(runtime.StageTimeLeft * 60); |
754 _fg = TFT_WHITE; |
774 _fg = TFT_WHITE; |
755 _bg = TFT_BLACK; |
775 _bg = TFT_BLACK; |
756 TFT_setFont(DEJAVU24_FONT, NULL); |
776 TFT_setFont(DEJAVU24_FONT, NULL); |
757 TFT_print("Mout storten?", CENTER, 135); |
777 TFT_print("Mout storten?", CENTER, 135); |
758 SoundPlay(SOUND_Prompt); |
778 SoundPlay(SOUND_Prompt); |
759 MashState = MASH_ADD; |
779 MashState = Sub_Screen = MASH_ADD; |
|
780 snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"Mout storten?\"}", Main_Screen, Sub_Screen); |
|
781 ws_server_send_text_clients("/ws", msg, strlen(msg)); |
760 ESP_LOGI(TAG, "Mash add prompt"); |
782 ESP_LOGI(TAG, "Mash add prompt"); |
761 break; |
783 break; |
762 } |
784 } |
763 if (((Main_Screen - MAIN_AUTO_MASH_IN) == LastMashStep) && config.AskIodine) { |
785 if (((Main_Screen - MAIN_AUTO_MASH_IN) == LastMashStep) && config.AskIodine) { |
764 /* |
786 /* |
776 TFT_setFont(DEJAVU24_FONT, NULL); |
798 TFT_setFont(DEJAVU24_FONT, NULL); |
777 TFT_print("Jodium test?", CENTER, 127); |
799 TFT_print("Jodium test?", CENTER, 127); |
778 SoundPlay(SOUND_Prompt); |
800 SoundPlay(SOUND_Prompt); |
779 beeped = false; |
801 beeped = false; |
780 TimerSet(config.IodineTime * 60); |
802 TimerSet(config.IodineTime * 60); |
781 MashState = MASH_IODINE; |
803 MashState = Sub_Screen = MASH_IODINE; |
|
804 snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"Jodium test?\"}", Main_Screen, Sub_Screen); |
|
805 ws_server_send_text_clients("/ws", msg, strlen(msg)); |
782 ESP_LOGI(TAG, "Mash iodine test prompt"); |
806 ESP_LOGI(TAG, "Mash iodine test prompt"); |
783 break; |
807 break; |
784 } |
808 } |
785 if ((Main_Screen == MAIN_AUTO_MASH_OUT) && config.AskRemove) { |
809 if ((Main_Screen == MAIN_AUTO_MASH_OUT) && config.AskRemove) { |
786 /* |
810 /* |
796 _fg = TFT_WHITE; |
820 _fg = TFT_WHITE; |
797 _bg = TFT_BLACK; |
821 _bg = TFT_BLACK; |
798 TFT_setFont(DEJAVU18_FONT, NULL); |
822 TFT_setFont(DEJAVU18_FONT, NULL); |
799 TFT_print("Mout verwijderen?", CENTER, 135); |
823 TFT_print("Mout verwijderen?", CENTER, 135); |
800 SoundPlay(SOUND_Prompt); |
824 SoundPlay(SOUND_Prompt); |
801 MashState = MASH_REMOVE; |
825 MashState = Sub_Screen = MASH_REMOVE; |
|
826 snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"Mout verwijderen?\"}", Main_Screen, Sub_Screen); |
|
827 ws_server_send_text_clients("/ws", msg, strlen(msg)); |
802 ESP_LOGI(TAG, "Mash remove prompt"); |
828 ESP_LOGI(TAG, "Mash remove prompt"); |
803 break; |
829 break; |
804 } |
830 } |
805 if (Main_Screen != MAIN_AUTO_ABORT) |
831 if (Main_Screen != MAIN_AUTO_ABORT) |
806 Main_Screen++; |
832 Main_Screen++; |
849 } |
875 } |
850 } else if (MashState == MASH_INFUSE) { |
876 } else if (MashState == MASH_INFUSE) { |
851 switch (Buttons_Scan()) { |
877 switch (Buttons_Scan()) { |
852 case 0: Main_Screen = MAIN_AUTO_ABORT; |
878 case 0: Main_Screen = MAIN_AUTO_ABORT; |
853 break; |
879 break; |
854 case 1: MashState = MASH_WAITTEMP; |
880 case 1: MashState = Sub_Screen = MASH_WAITTEMP; |
|
881 snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen); |
|
882 ws_server_send_text_clients("/ws", msg, strlen(msg)); |
855 if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
883 if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
856 // Start PID again. |
884 // Start PID again. |
857 driver_state->mlt_sp = stageTemp; |
885 driver_state->mlt_sp = stageTemp; |
858 driver_state->mlt_mode = MLT_MODE_PID; |
886 driver_state->mlt_mode = MLT_MODE_PID; |
859 xSemaphoreGive(xSemaphoreDriver); |
887 xSemaphoreGive(xSemaphoreDriver); |
1016 /* |
1044 /* |
1017 * Starting cooling, setup the screen. |
1045 * Starting cooling, setup the screen. |
1018 */ |
1046 */ |
1019 Buttons_Clear(); |
1047 Buttons_Clear(); |
1020 TFT_fillScreen(_bg); |
1048 TFT_fillScreen(_bg); |
|
1049 Sub_Screen = 1; |
1021 if (Main_Screen == MAIN_AUTO_COOLING_H) { |
1050 if (Main_Screen == MAIN_AUTO_COOLING_H) { |
1022 stageTemp = 77.0; |
1051 stageTemp = 77.0; |
1023 } else if (Main_Screen == MAIN_AUTO_COOLING_M) { |
1052 } else if (Main_Screen == MAIN_AUTO_COOLING_M) { |
1024 stageTemp = 66.0; |
1053 stageTemp = 66.0; |
1025 } else { |
1054 } else { |
1026 stageTemp = recipe.CoolTemp; |
1055 stageTemp = recipe.CoolTemp; |
1027 } |
1056 } |
|
1057 snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen); |
|
1058 ws_server_send_text_clients("/ws", msg, strlen(msg)); |
1028 CoolBeep = false; |
1059 CoolBeep = false; |
1029 ESP_LOGI(TAG, "Start cooling from %6.2f to %4.1f", ds18b20_state->mlt_temperature, stageTemp); |
1060 ESP_LOGI(TAG, "Start cooling from %6.2f to %4.1f", ds18b20_state->mlt_temperature, stageTemp); |
1030 if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
1061 if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
1031 driver_state->mlt_mode = MLT_MODE_OFF; |
1062 driver_state->mlt_mode = MLT_MODE_OFF; |
1032 driver_state->mlt_sp = stageTemp; |
1063 driver_state->mlt_sp = stageTemp; |
1177 /* |
1209 /* |
1178 * Prepare the screen for the actual whirpool. |
1210 * Prepare the screen for the actual whirpool. |
1179 */ |
1211 */ |
1180 Buttons_Clear(); |
1212 Buttons_Clear(); |
1181 TFT_fillScreen(_bg); |
1213 TFT_fillScreen(_bg); |
|
1214 Sub_Screen = 1; |
|
1215 snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen); |
|
1216 ws_server_send_text_clients("/ws", msg, strlen(msg)); |
1182 if (Main_Screen == MAIN_AUTO_WHIRLPOOL9) { |
1217 if (Main_Screen == MAIN_AUTO_WHIRLPOOL9) { |
1183 TimeWhirlPool = recipe.Whirlpool9; |
1218 TimeWhirlPool = recipe.Whirlpool9; |
1184 if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
1219 if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) { |
1185 driver_state->mlt_sp = 93.0; |
1220 driver_state->mlt_sp = 93.0; |
1186 driver_state->mlt_mode = MLT_MODE_PID; |
1221 driver_state->mlt_mode = MLT_MODE_PID; |
1225 updateRuntime = true; |
1260 updateRuntime = true; |
1226 MLT_info(71, 26, false); |
1261 MLT_info(71, 26, false); |
1227 ESP_LOGI(TAG, "Whirlpool %d minutes, sp %4.1f", TimeWhirlPool, driver_state->mlt_sp); |
1262 ESP_LOGI(TAG, "Whirlpool %d minutes, sp %4.1f", TimeWhirlPool, driver_state->mlt_sp); |
1228 Buttons_Add(255, 120, 60, 40, "+1m", 0); |
1263 Buttons_Add(255, 120, 60, 40, "+1m", 0); |
1229 Buttons_Add( 5, 120, 60, 40, "-1m", 1); |
1264 Buttons_Add( 5, 120, 60, 40, "-1m", 1); |
1230 Buttons_Add(130, 200, 60, 40, "Pomp", 2); |
1265 Buttons_Add(255, 200, 60, 40, "Pomp", 2); |
1231 Buttons_Show(); |
1266 Buttons_Show(); |
1232 } |
1267 } |
1233 } else { |
1268 } else { |
1234 /* |
1269 /* |
1235 * Not running in prompt mode, do the whirlpool. |
1270 * Not running in prompt mode, do the whirlpool. |