Merged with default stable

Fri, 05 Jul 2019 16:17:04 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Fri, 05 Jul 2019 16:17:04 +0200
branch
stable
changeset 66
f066fdeb9650
parent 58
7ce410c79048 (current diff)
parent 65
dd7019356c8c (diff)
child 73
baa34eaca140

Merged with default

main/ca_cert.pem file | annotate | diff | comparison | revisions
--- a/Makefile	Tue Jul 02 17:33:23 2019 +0200
+++ b/Makefile	Fri Jul 05 16:17:04 2019 +0200
@@ -3,7 +3,7 @@
 # project subdirectory.
 #
 
-PROJECT_VER := "0.3.3"
+PROJECT_VER := "0.3.5"
 PROJECT_NAME := brewboard
 
 include $(IDF_PATH)/make/project.mk
--- a/docs/Doxyfile	Tue Jul 02 17:33:23 2019 +0200
+++ b/docs/Doxyfile	Fri Jul 05 16:17:04 2019 +0200
@@ -776,7 +776,6 @@
                          ../components/PID/ \
 			 ../components/spidriver/ \
 			 ../components/tft/ \
-			 ../components/vnc_server/ \
 			 ../components/websocket \
 			 ../components/websocket/include/
 
--- a/image/version.txt	Tue Jul 02 17:33:23 2019 +0200
+++ b/image/version.txt	Fri Jul 05 16:17:04 2019 +0200
@@ -1,1 +1,1 @@
-0.3.3
+0.3.5
Binary file image/w/index.html.gz has changed
--- a/main/automation.c	Tue Jul 02 17:33:23 2019 +0200
+++ b/main/automation.c	Fri Jul 05 16:17:04 2019 +0200
@@ -59,6 +59,39 @@
 static const char		*TAG = "automation";
 
 
+void change_sp(bool up)
+{
+    if (up)
+	stageTemp += 0.25;
+    else
+	stageTemp -= 0.25;
+    if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
+	driver_state->mlt_sp = stageTemp;
+	xSemaphoreGive(xSemaphoreDriver);
+    }
+    log_msg(TAG, "Changed sp to %.2f", stageTemp);
+}
+
+
+
+void change_tl(int max)
+{
+    if (max) {
+	if (TimeLeft < max)
+	    TimeLeft += 60;
+	else
+	    TimeLeft = max;
+    } else {
+	if (TimeLeft > 60)
+            TimeLeft -= 60;
+        else
+            TimeLeft = 0;
+    }
+    log_msg(TAG, "Changed timeleft to %d", TimeLeft / 60);
+}
+
+
+
 /*
  * Automation init function that only runs once when a
  * new screen is entered.
@@ -69,6 +102,7 @@
 
     switch (Main_Screen) {
 	case MAIN_AUTO_INIT1:
+		log_msg(TAG, "Automation startup");
 #ifdef CONFIG_TEMP_SENSORS_SIMULATOR
 		Fake_MLT = recipe.MashStep[0].Temperature - 10;
 		Fake_HLT = recipe.SpargeTemp - 15;
@@ -82,7 +116,7 @@
                     if (recipe.MashStep[i].Resttime)
                         LastMashStep = i;
                 }
-                ESP_LOGI(TAG, "Last mash step %d", LastMashStep);
+                log_msg(TAG, "Last mash step %d", LastMashStep);
 
                 // Check for a crashed session.
                 if (runtime.AutoModeStarted) {
@@ -111,7 +145,7 @@
 					    }
 					    xSemaphoreGive(xSemaphoreDriver);
 					}
-					ESP_LOGI(TAG, "Resume brew screen %d, time left %d", Main_Screen, TimeLeft);
+					log_msg(TAG, "Resume brew screen %d, time left %d", Main_Screen, TimeLeft);
 					log_begin((time_t)0);
 					update_json();
 					log_annotation(ANNOTATION_SYSTEM, (char *)"Resume");
@@ -232,7 +266,7 @@
                 Buttons_Add(  5,  30, 60, 40, (char *)"+sp",  0);
                 Buttons_Add(255,  30, 60, 40, (char *)"-sp",  1);
                 Buttons_Show();
-                ESP_LOGI(TAG, "Mash done, going to boil.");
+                log_msg(TAG, "Mash done, going to boil.");
 		Sub_Screen = 0;
                 break;
 
@@ -262,7 +296,7 @@
                 Buttons_Add(  3, 190, 60, 40, (char *)"+1m",  2);
                 Buttons_Add(257, 190, 60, 40, (char *)"-1m",  3);
                 Buttons_Show();
-                ESP_LOGI(TAG, "Boil temperature reached, boil %d minutes", (TimeLeft / 60) -1);
+                log_msg(TAG, "Boil temperature reached, boil %d minutes", (TimeLeft / 60) -1);
 		log_annotation(ANNOTATION_STAGE, (char *)"Koken");
 		Sub_Screen = 0;
                 break;
@@ -284,6 +318,7 @@
                     Main_Screen = MAIN_AUTO_COOLING_C;
                     return true; //goto startover;
                 }
+		log_msg(TAG, "Prompt start cooling");
                 TopMessage((char *)"Start koelen?");
                 Buttons_Add( 40, 100, 80, 40, (char *)"Start", 0);
                 Buttons_Add(200, 100, 80, 40, (char *)"Stop",  1);
@@ -321,6 +356,7 @@
                     return true; //goto startover;
                 }
 
+		log_msg(TAG, "Prompt start whirlpool");
                 TopMessage((char *)"Start Whirlpool?");
                 Buttons_Add( 40, 100, 80, 40, (char *)"Start", 0);
                 Buttons_Add(200, 100, 80, 40, (char *)"Stop",  1);
@@ -345,11 +381,11 @@
                 TFT_setFont(DEJAVU24_FONT, NULL);
                 if (Main_Screen == MAIN_AUTO_DONE) {
                     TFT_print((char *)"Brouwen is gereed.", CENTER, CENTER);
-                    ESP_LOGI(TAG, "Brew is done");
+                    log_msg(TAG, "Brew is done");
                     SoundPlay(SOUND_End);
                 } else {
                     TFT_print((char *)"Brouwen is afgebroken.", CENTER, CENTER);
-                    ESP_LOGI(TAG, "Brew is aborted");
+                    log_msg(TAG, "Brew is aborted");
                     SoundPlay(SOUND_Warn);
                 }
                 log_close();
@@ -476,6 +512,7 @@
 
 			case 1:         loop = false;
 					Main_Screen = MAIN_AUTO_INIT2;
+					log_msg(TAG, "Brew `%s' on `%s'", recipe.Name, equipment.Name); 
 					break;
 
 			default:        break;
@@ -533,6 +570,7 @@
 		} else {
 		    runtime.UseHLT = _UseHLT = false;
 		}
+		log_msg(TAG, "Use HLT %s", (_UseHLT)?"true":"false");
                 updateRuntime = true;
                 if (_UseHLT) {
                     /*
@@ -545,7 +583,7 @@
                         AvailableTime += recipe.MashStep[i].Resttime;
                     if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
                         driver_state->hlt_sp = recipe.SpargeTemp - ((AvailableTime / 2) + 2);
-                        ESP_LOGI(TAG, "HLT preheat set to %4.1f", driver_state->hlt_sp);
+                        log_msg(TAG, "HLT preheat set to %4.2f", driver_state->hlt_sp);
                         xSemaphoreGive(xSemaphoreDriver);
                     }
                 }
@@ -569,6 +607,7 @@
                     if (driver_state->hlt_pv >= driver_state->hlt_sp) {
                         Main_Screen = MAIN_AUTO_MASH_IN;
                         driver_state->hlt_sp = recipe.SpargeTemp;       // Set final setpoint
+			log_msg(TAG, "HLT preheat done");
                     }
                     xSemaphoreGive(xSemaphoreDriver);
                 }
@@ -616,9 +655,9 @@
                     MashState = Sub_Screen = MASH_WAITTEMP;
 		    snprintf(msg, 255, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen);
                     ws_server_send_text_clients((char *)"/ws", msg, strlen(msg));
-                    ESP_LOGI(TAG, "Mash step %d type: %s time: %d temp: %4.1f  min: %4.1f max: %4.1f",
+                    log_msg(TAG, "Mash step %d type: %s time: %d sp: %4.2f  sv: %4.3f",
 				    Main_Screen - MAIN_AUTO_MASH_IN, mashTypes[recipe.MashStep[Main_Screen - MAIN_AUTO_MASH_IN].Type],
-                                    stageTime, stageTemp, MinMash, MaxMash);
+                                    stageTime, stageTemp, temp_MLT);
 
 		    if (Main_Screen > MAIN_AUTO_MASH_IN) {
 			// Do not annotate before the log is open.
@@ -658,7 +697,7 @@
 			    driver_state->mlt_mode = MLT_MODE_OFF;
 			    xSemaphoreGive(xSemaphoreDriver);
 			}
-			ESP_LOGI(TAG, "Mash infusion prompt");
+			log_msg(TAG, "Mash infusion prompt");
 		    } else {
 			Buttons_Add(  5,  30, 60, 40, (char *)"+sp",   0);
 			Buttons_Add(255,  30, 60, 40, (char *)"-sp",   1);
@@ -687,29 +726,19 @@
 			Resume = false;
 			runtime.StageTimeLeft = TimeLeft / 60;
 			updateRuntime = true;
-                        ESP_LOGI(TAG, "Mash step %d temperature reached, rest time %d", Main_Screen - MAIN_AUTO_MASH_IN, TimeLeft / 60);
+                        log_msg(TAG, "Mash step %d temperature reached, rest %d minutes", Main_Screen - MAIN_AUTO_MASH_IN, TimeLeft / 60);
                         Buttons_Clear();
                         Buttons_Add(  0, 120, 60, 40, (char *)"+1m",   0);
                         Buttons_Add(260, 120, 60, 40, (char *)"-1m",   1);
                         Buttons_Show();
                     }
                     switch (Buttons_Scan()) {
-                        case 0:         if (stageTemp < MaxMash) {
-                                            stageTemp += 0.25;
-                                            if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
-                                                driver_state->mlt_sp = stageTemp;
-                                                xSemaphoreGive(xSemaphoreDriver);
-                                            }
-                                        }
+                        case 0:         if (stageTemp < MaxMash)
+					    change_sp(true);
                                         break;
 
-                        case 1:         if (stageTemp > MinMash) {
-                                            stageTemp -= 0.25;
-                                            if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
-                                                driver_state->mlt_sp = stageTemp;
-                                                xSemaphoreGive(xSemaphoreDriver);
-                                            }
-                                        }
+                        case 1:         if (stageTemp > MinMash)
+					    change_sp(false);
                                         break;
 
                         default:
@@ -731,26 +760,23 @@
                         if (pumpTime >= equipment.PumpCycle) {
                             if (! pumpRest) {
                                 pumpRest = true;
-                                ESP_LOGI(TAG, "Pump rest");
+                                log_msg(TAG, "Pump stop");
                             }
                         } else {
                             if (pumpRest) {
                                 pumpRest = false;
-                                ESP_LOGI(TAG, "Pump start");
+                                log_msg(TAG, "Pump start");
                             }
                         }
                     }
                     if (TimeLeft) {
                         switch (Buttons_Scan()) {
-                            case 0:     TimeLeft += 60;
+                            case 0:     change_tl(21600);
 					runtime.StageTimeLeft = TimeLeft / 60;
 					updateRuntime = true;
                                         break;
 
-                            case 1:     if (TimeLeft < 60)
-                                            TimeLeft = 0;
-                                        else
-                                            TimeLeft -= 60;
+                            case 1:     change_tl(0);
 					runtime.StageTimeLeft = TimeLeft / 60;
 					updateRuntime = true;
                                         break;
@@ -760,7 +786,7 @@
                     }
 
                     if (TimeLeft == 0) {
-			runtime.StageTimeLeft = TimeLeft / 60;
+			runtime.StageTimeLeft = 0;
 			updateRuntime = true;
                         if ((Main_Screen == MAIN_AUTO_MASH_IN) && config.AskAdd) {
                             /*
@@ -780,7 +806,7 @@
 			    MashState = Sub_Screen = MASH_ADD;
 			    snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"Mout storten?\"}", Main_Screen, Sub_Screen);
                 	    ws_server_send_text_clients((char *)"/ws", msg, strlen(msg));
-			    ESP_LOGI(TAG, "Mash add prompt");
+			    log_msg(TAG, "Mash add prompt");
 			    break;
                         }
                         if (((Main_Screen - MAIN_AUTO_MASH_IN) == LastMashStep) && config.AskIodine) {
@@ -804,7 +830,7 @@
 			    MashState = Sub_Screen = MASH_IODINE;
 			    snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"Jodium test?\"}", Main_Screen, Sub_Screen);
                 	    ws_server_send_text_clients((char *)"/ws", msg, strlen(msg));
-			    ESP_LOGI(TAG, "Mash iodine test prompt");
+			    log_msg(TAG, "Mash iodine test prompt");
 			    break;
                         }
                         if ((Main_Screen == MAIN_AUTO_MASH_OUT) && config.AskRemove) {
@@ -826,7 +852,7 @@
 			    MashState = Sub_Screen = MASH_REMOVE;
 			    snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"Mout verwijderen?\"}", Main_Screen, Sub_Screen);
                 	    ws_server_send_text_clients((char *)"/ws", msg, strlen(msg));
-			    ESP_LOGI(TAG, "Mash remove prompt");
+			    log_msg(TAG, "Mash remove prompt");
 			    break;
                         }
                         if (Main_Screen != MAIN_AUTO_ABORT)
@@ -839,22 +865,16 @@
 			    updateRuntime = true;
 			}
                     }
-		} else if (MashState == MASH_ADD) {
-		    switch (Buttons_Scan()) {
-			case 0:     Main_Screen = MAIN_AUTO_ABORT;
-				    break;
-			case 1:     Main_Screen++;
-				    break;
-			default:    break;
-		    }
-		} else if (MashState == MASH_IODINE) {
-		    if (TimeSpent % 45 == 0) {
-			if (! beeped) {
-			    SoundPlay(SOUND_Warn);
-			    beeped = true;
-			}
-		    } else {
-			beeped = false;
+		} else if (MashState == MASH_ADD || MashState == MASH_IODINE || MashState == MASH_REMOVE) {
+		    if (MashState == MASH_IODINE) {
+			if (TimeSpent % 45 == 0) {
+                            if (! beeped) {
+                            	SoundPlay(SOUND_Warn);
+                            	beeped = true;
+                            }
+                    	} else {
+                            beeped = false;
+                    	}
 		    }
 		    switch (Buttons_Scan()) {
 			case 0:     Main_Screen = MAIN_AUTO_ABORT;
@@ -863,17 +883,9 @@
 				    break;
 			default:    break;
 		    }
-		    if (TimeLeft == 0) {
+		    if (MashState == MASH_IODINE && TimeLeft == 0) {
 			Main_Screen++;
 		    }
-		} else if (MashState == MASH_REMOVE) {
-		    switch (Buttons_Scan()) {
-			case 0:     Main_Screen = MAIN_AUTO_ABORT;
-				    break;
-			case 1:     Main_Screen++;
-				    break;
-			default:    break;
-		    }
 		} else if (MashState == MASH_INFUSE) {
 		    switch (Buttons_Scan()) {
 			case 0:     Main_Screen = MAIN_AUTO_ABORT;
@@ -923,16 +935,14 @@
 
                 MLT_info(71, 26, true);
                 switch (Buttons_Scan()) {
-                    case 0:     if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
-                                    driver_state->mlt_sp += 0.25;
-                                    xSemaphoreGive(xSemaphoreDriver);
-                                }
+                    case 0:     if (stageTemp < 105) {
+				    change_sp(true);
+				}
                                 break;
 
-                    case 1:     if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
-                                    driver_state->mlt_sp -= 0.25;
-                                    xSemaphoreGive(xSemaphoreDriver);
-                                }
+                    case 1:     if (stageTemp > 80) {
+				    change_sp(false);
+				}
                                 break;
 
                     default:    break;
@@ -946,7 +956,7 @@
 		    Resume = false;
                 if (NewMinute) {
                     if ((runtime.HopAddition < recipe.Additions) && (TimeLeft <= ((recipe.Addition[runtime.HopAddition].Time * 60) + 60))) {
-                        ESP_LOGI(TAG, "Hop addition %d at %d minutes", runtime.HopAddition + 1, recipe.Addition[runtime.HopAddition].Time);
+                        log_msg(TAG, "Hop addition %d at %d minutes", runtime.HopAddition + 1, recipe.Addition[runtime.HopAddition].Time);
                         TopMessage(recipe.Addition[runtime.HopAddition].Name);
 			log_annotation(ANNOTATION_EVENT, recipe.Addition[runtime.HopAddition].Name);
                         SoundPlay(SOUND_AddHop);
@@ -960,6 +970,7 @@
                 if (TimeLeft < 60) {
 		    if (Output) {
 			log_annotation(ANNOTATION_STAGE, (char *)"Vlamuit");
+			log_msg(TAG, "Boil flame off");
 		    }
                     // Flameout
                     Output = 0;
@@ -984,33 +995,30 @@
                 TimerShow(TimeLeft, 65, 190);
 
                 switch (Buttons_Scan()) {
-                    case 0:     if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
-                                    driver_state->mlt_sp += 0.25;
-                                    xSemaphoreGive(xSemaphoreDriver);
-                                }
+                    case 0:     if (stageTemp < 105) {
+				    change_sp(true);
+				}
                                 break;
 
-                    case 1:     if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
-                                    driver_state->mlt_sp -= 0.25;
-                                    xSemaphoreGive(xSemaphoreDriver);
-                                }
+                    case 1:     if (stageTemp > 80) {
+				    change_sp(false);
+				}
                                 break;
 
-                    case 2:     TimeLeft += 60;
+                    case 2:     change_tl(21600);
                                 break;
 
-                    case 3:     if (TimeLeft > 60)
-                                    TimeLeft -= 60;
-                                else
-                                    TimeLeft = 0;
+                    case 3:     change_tl(0);
                                 break;
 
                     case 4:     if (BoilPower < 100)
                                     BoilPower++;
+				log_msg(TAG, "Increase boilpower to %d%%", BoilPower);
                                 break;
 
                     case 5:     if (BoilPower > 0)
                                     BoilPower--;
+				log_msg(TAG, "Decrease boilpower to %d%%", BoilPower);
                                 break;
 
                     default:    break;
@@ -1018,7 +1026,7 @@
 
                 if (TimeLeft == 0) {
                     Main_Screen = MAIN_AUTO_WHIRLPOOL9;
-                    ESP_LOGI(TAG, "Boil is ready");
+                    log_msg(TAG, "Boil is ready");
                 }
                 break;
 
@@ -1058,7 +1066,7 @@
 			snprintf(msg, 63, "{\"main\":\"%d\",\"sub\":\"%d\",\"timer\":\"\"}", Main_Screen, Sub_Screen);
                         ws_server_send_text_clients((char *)"/ws", msg, strlen(msg));
 			CoolBeep = false;
-			ESP_LOGI(TAG, "Start cooling from %6.2f to %4.1f", ds18b20_state->mlt_temperature, stageTemp);
+			log_msg(TAG, "Start cooling from %6.2f to %4.1f", ds18b20_state->mlt_temperature, stageTemp);
 			if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
 			    driver_state->mlt_mode = MLT_MODE_OFF;
 			    driver_state->mlt_sp = stageTemp;
@@ -1121,6 +1129,7 @@
                                     }
                                     xSemaphoreGive(xSemaphoreDriver);
                                 }
+				log_msg(TAG, "Increase sp to %.2f", driver_state->mlt_sp);
                                 break;
 
                     	case 0: Buttons_Add( 60, 150, 90, 40, (char *)"Stoppen", 4);
@@ -1142,6 +1151,7 @@
                                     }
                                     xSemaphoreGive(xSemaphoreDriver);
                                 }
+				log_msg(TAG, "Decrease sp to %.2f", driver_state->mlt_sp);
                                 break;
 
                     	case 3: if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
@@ -1154,6 +1164,7 @@
                                         driver_state->pump_run = 0;
                                     }
 				    runtime.PumpCooling = driver_state->pump_run;
+				    log_msg(TAG, "Pump turned %s", (driver_state->pump_run)?"on":"off");
 				    updateRuntime = true;
                                     xSemaphoreGive(xSemaphoreDriver);
                                 }
@@ -1260,7 +1271,7 @@
 			runtime.StageTimeLeft = TimeWhirlPool;
 			updateRuntime = true;
 			MLT_info(71, 26, false);
-			ESP_LOGI(TAG, "Whirlpool %d minutes, sp %4.1f", TimeWhirlPool, driver_state->mlt_sp);
+			log_msg(TAG, "Whirlpool %d minutes, sp %4.1f", TimeWhirlPool, driver_state->mlt_sp);
 			Buttons_Add(255, 120, 60, 40, (char *)"+1m", 0);
 			Buttons_Add(  5, 120, 60, 40, (char *)"-1m", 1);
 			Buttons_Add(255, 200, 60, 40, (char *)"Pomp",  2);
@@ -1290,19 +1301,17 @@
                     MLT_info(71, 26, true);
                     TimerShow(TimeLeft, 65, 122);
                     switch (Buttons_Scan()) {
-                    	case 0:     TimeLeft += 60;
+                    	case 0: change_tl(7200);
                                 break;
-                    	case 1:     if (TimeLeft > 60)
-                                    TimeLeft -= 60;
-                                else
-                                    TimeLeft = 0;
+                    	case 1: change_tl(0);
                                 break;
-                    	case 2:     if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
+                    	case 2: if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
                                     if (driver_state->mlt_pv < equipment.PumpMaxTemp) {
                                         if (driver_state->pump_run)
                                             driver_state->pump_run = 0;
                                         else
                                             driver_state->pump_run = 1;
+					log_msg(TAG, "Pump switched %s", (driver_state->pump_run)?"on":"off");
                                     } else {
                                         driver_state->pump_run = 0;
                                     }
--- a/main/ca_cert.pem	Tue Jul 02 17:33:23 2019 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIEEzCCAvugAwIBAgIBGzANBgkqhkiG9w0BAQUFADCBhzELMAkGA1UEBhMCTkwx
-EjAQBgNVBAgTCU4tSG9sbGFuZDERMA8GA1UEBxMISUptdWlkZW4xDTALBgNVBAoT
-BE1CU0UxEDAOBgNVBAsMB01CU0VfRVUxFTATBgNVBAMTDE1CU0UgUm9vdCBDQTEZ
-MBcGCSqGSIb3DQEJARYKY2EubWJzZS5ldTAeFw0xODA5MzAxNzQ3MDBaFw0yODA5
-MzAxNzQ3MDBaMIGNMQswCQYDVQQGEwJOTDESMBAGA1UECBMJTi1Ib2xsYW5kMREw
-DwYDVQQHEwhJSm11aWRlbjENMAsGA1UEChMETUJTRTEQMA4GA1UECwwHTUJTRV9F
-VTEYMBYGA1UEAxMPc2VhcG9ydC5tYnNlLnltMRwwGgYJKoZIhvcNAQkBFg1hZG1p
-bkBtYnNlLmV1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArA7LmULa
-Mav+wDHowQcu8PBTWeBSzuNQLVJmxrfWFM2FysQDD+3fSA54vzri1rOACOK7JG3e
-DlkzxwFjzwlAktIzCFkkfA6u+CM+TeTqZKo1shH6qFsVDkAu4ev0tSf1ml18boZR
-32b8OJrn5DR/TnXZiDBA2VPk8gdMLgG8DaNe8vnjzg8oc7i/9lElNT1P5nwZHLFC
-aRRvLBjw5e2YLQxIMeowkae2btyQSqG7EXoiZVYjLs5BrC2NrXfGuPc3s6Im9SLU
-xfcBwBj1LLPsN3OdMIq+jcJcblTPnqdq3w7HNDbRq8UJ8vkHY6GxS7I1FqvLg6QB
-eKxIbWTBCAhi/wIDAQABo4GBMH8wDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUNG9Y
-5nVkYsP9jA7DfXMLjwiLT4IwCwYDVR0PBAQDAgXgMDAGA1UdHwQpMCcwJaAjoCGG
-H2h0dHA6Ly9jZXJ0Lm1ic2UuZXUvbWJzZS1ldS5jcmwwEQYJYIZIAYb4QgEBBAQD
-AgZAMA0GCSqGSIb3DQEBBQUAA4IBAQCpU6ZVfE6U9w3mcDZe6aIMsH8PfK6fJUxP
-a2RX1pthu0vmveTyqAcQaQK76QxWbeeGeG0dMxP7viU1c1Mf/u9lhGTGBXN5X5tZ
-8V95H0NbpGyy+DV8N91TEfzHMcOED1K3MRKr/HpaDFtQCYgi+m0BFdQ8CREVkAeX
-3UtB1XmjIuaIiR9+lGrgdaopl03hc2RRLewuW8f6dELpBm+mPRnbCQC/1c1hyDa0
-APoUXafueFnA4bUf6vssIH3V0hezemTD3iNYXE+/xQF2zKqRoDcXROSlA9FvalfX
-OzxVIfaSUxfqt7bX5pfVl9fYSQes5QizMoCb6uP4OhvENyICUHeM
------END CERTIFICATE-----
--- a/main/manual.c	Tue Jul 02 17:33:23 2019 +0200
+++ b/main/manual.c	Fri Jul 05 16:17:04 2019 +0200
@@ -32,7 +32,7 @@
 {
     switch (Main_Screen) {
 	case MAIN_MANUAL_INIT:
-		ESP_LOGI(TAG, "Start manual mode");
+		log_msg(TAG, "Start manual mode");
 		if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
 		    driver_state->enable = true;
 		    xSemaphoreGive(xSemaphoreDriver);
@@ -121,7 +121,7 @@
 		Buttons_Clear();
 
 		if (! _ManualHLT && ! _ManualMLT) {
-		    ESP_LOGI(TAG, "End manual mode");
+		    log_msg(TAG, "End manual mode");
 		    Main_Screen = MAIN_MODE_FREE;
 		    break;
 		}
@@ -143,6 +143,7 @@
 			xSemaphoreGive(xSemaphoreDriver);
 		    }
 		}
+		log_msg(TAG, "HLT:%s MLT:%s", (_ManualHLT)?"true":"false", (_ManualMLT)?"true":"false");
 		Main_Screen = MAIN_MANUAL_MAIN;
 		break;
 
@@ -155,7 +156,7 @@
 		}
 		switch (Buttons_Scan()) {
 		    case 0:	Main_Screen = MAIN_MODE_FREE;
-				ESP_LOGI(TAG, "End manual mode");
+				log_msg(TAG, "End manual mode");
 				if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
 				    runtime.ManualHLT = driver_state->hlt_sp;
 				    runtime.ManualMLT = driver_state->mlt_sp;
@@ -173,8 +174,10 @@
 		    case 1:	if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
 				    if (_ManualMLT) {
 				    	driver_state->mlt_sp += 0.25;
+					log_msg(TAG, "MLT sp %.2f", driver_state->mlt_sp);
 				    } else {
 					driver_state->hlt_sp += 0.25;
+					log_msg(TAG, "HLT sp %.2f", driver_state->hlt_sp);
 				    }
 				    xSemaphoreGive(xSemaphoreDriver);
 				}
@@ -183,8 +186,10 @@
 		    case 2:	if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
 				    if (_ManualMLT) {
 					driver_state->mlt_sp -= 0.25;
+					log_msg(TAG, "MLT sp %.2f", driver_state->mlt_sp);
 				    } else {
 					driver_state->hlt_sp -= 0.25;
+					log_msg(TAG, "HLT sp %.2f", driver_state->hlt_sp);
 				    }
 				    xSemaphoreGive(xSemaphoreDriver);
 				}
@@ -198,16 +203,17 @@
 					    driver_state->pump_run = 1;
 					xSemaphoreGive(xSemaphoreDriver);
 				    }
+				    log_msg(TAG, "Pump turned %s", driver_state->pump_run?"on":"off");
 				} else {
 				    if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
 					if (driver_state->hlt_mode == HLT_MODE_BANG) {
 					    driver_state->hlt_mode = HLT_MODE_OFF;
 					    Buttons_Add(255, 200, 60, 40, (char *)"Aan"  , 3);
-					    ESP_LOGI(TAG, "HLT turned off");
+					    log_msg(TAG, "HLT turned off");
 					} else {
 					    driver_state->hlt_mode = HLT_MODE_BANG;
 					    Buttons_Add(255, 200, 60, 40, (char *)"Uit"  , 3);
-					    ESP_LOGI(TAG, "HLT turned on");
+					    log_msg(TAG, "HLT turned on sp %.2f", driver_state->hlt_sp);
 					}
 					xSemaphoreGive(xSemaphoreDriver);
 				    }
@@ -219,11 +225,11 @@
 				    if (driver_state->mlt_mode == MLT_MODE_PID) {
 					driver_state->mlt_mode = MLT_MODE_OFF;
 					Buttons_Add(255,  76, 60, 40, (char *)"Aan"  , 4);
-					ESP_LOGI(TAG, "MLT turned off");
+					log_msg(TAG, "MLT turned off");
 				    } else {
 					driver_state->mlt_mode = MLT_MODE_PID;
 					Buttons_Add(255,  76, 60, 40, (char *)"Uit"  , 4);
-					ESP_LOGI(TAG, "MLT turned on");
+					log_msg(TAG, "MLT turned on sp %.2f", driver_state->mlt_sp);
 				    }
 				    xSemaphoreGive(xSemaphoreDriver);
 				}
@@ -234,23 +240,25 @@
 				    driver_state->hlt_sp += 0.25;
 				    xSemaphoreGive(xSemaphoreDriver);
 				}
+				log_msg(TAG, "HLT sp %.2f", driver_state->hlt_sp);
 				break;
 
 		    case 6:	if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
 				    driver_state->hlt_sp -= 0.25;
 				    xSemaphoreGive(xSemaphoreDriver);
 				}
+				log_msg(TAG, "HLT sp %.2f", driver_state->hlt_sp);
 				break;
 
 		    case 7:	if (xSemaphoreTake(xSemaphoreDriver, 10) == pdTRUE) {
 				    if (driver_state->hlt_mode == HLT_MODE_BANG) {
 					driver_state->hlt_mode = HLT_MODE_OFF;
 					Buttons_Add(255, 200, 60, 40, (char *)"Aan"  , 7);
-					ESP_LOGI(TAG, "HLT turned off");
+					log_msg(TAG, "HLT turned off");
 				    } else {
 					driver_state->hlt_mode = HLT_MODE_BANG;
 					Buttons_Add(255, 200, 60, 40, (char *)"Uit"  , 7);
-					ESP_LOGI(TAG, "HLT turned on");
+					log_msg(TAG, "HLT turned on %.2f", driver_state->hlt_sp);
 				    }
 				    xSemaphoreGive(xSemaphoreDriver);
 				}
--- a/main/task_http.c	Tue Jul 02 17:33:23 2019 +0200
+++ b/main/task_http.c	Fri Jul 05 16:17:04 2019 +0200
@@ -139,6 +139,8 @@
 	sprintf(c_type, "text/html");
     } else if (strcmp(".css", &temp_url[strlen(temp_url) - 4]) == 0) {
 	sprintf(c_type, "text/css");
+    } else if (strcmp(".log", &temp_url[strlen(temp_url) - 4]) == 0) {
+        sprintf(c_type, "text/plain");
     } else if (strcmp(".js", &temp_url[strlen(temp_url) - 3]) == 0) {
 	sprintf(c_type, "text/javascript");
     } else if (strcmp(".json", &temp_url[strlen(temp_url) - 5]) == 0) {
@@ -173,7 +175,7 @@
     strncat(header, "\r\n", 255 - strlen(header));	// Add last empty line.
     err = netconn_write(conn, header, strlen(header), NETCONN_NOCOPY);
     if (err != ERR_OK) {
-	ESP_LOGE(TAG, "%s sendfile %s%s err=%d on header write", ipstr, temp_url, (send_gz) ? ".gz":"", err);
+	ESP_LOGW(TAG, "%s sendfile %s%s err=%d on header write", ipstr, temp_url, (send_gz) ? ".gz":"", err);
 	fclose(f);
 	return;
     }
@@ -192,7 +194,7 @@
 
 	err = netconn_write(conn, buff, bytes, NETCONN_NOCOPY);
 	if (err != ERR_OK) {
-	    ESP_LOGE(TAG, "%s sendfile %s%s err=%d send %u bytes of %ld bytes", ipstr, temp_url,  (send_gz) ? ".gz":"", err, sentsize, filesize);
+	    ESP_LOGW(TAG, "%s sendfile %s%s err=%d send %u bytes of %ld bytes", ipstr, temp_url,  (send_gz) ? ".gz":"", err, sentsize, filesize);
 	    break;
 	}
 	vTaskDelay(2 / portTICK_PERIOD_MS);
@@ -333,7 +335,7 @@
 
     if (err != ERR_OK) {
 	if (err != ERR_TIMEOUT) {	// Ignore timeout
-	    ESP_LOGI(TAG,"%s error %d on read", ipstr, err);
+	    ESP_LOGW(TAG,"%s error %d on read", ipstr, err);
 	}
 	netconn_close(conn);
 	netconn_delete(conn);
@@ -468,7 +470,7 @@
 	err = netconn_accept(conn, &newconn);
 	if (err == ERR_OK) {
 	    if (xQueueSendToBack(client_queue,&newconn,portMAX_DELAY) != pdTRUE) {
-		ESP_LOGE(TAG, "xQueueSendToBack() queue full");	    
+		ESP_LOGW(TAG, "xQueueSendToBack() queue full");	    
 	    };
 	}
 	vTaskDelay(5 / portTICK_PERIOD_MS);
--- a/main/task_sdcard.c	Tue Jul 02 17:33:23 2019 +0200
+++ b/main/task_sdcard.c	Fri Jul 05 16:17:04 2019 +0200
@@ -49,6 +49,35 @@
 extern time_t		now;
 extern struct tm	timeinfo;
 extern uint32_t		TimeBrewing;
+extern bool             System_TimeOk;
+
+
+
+void log_msg(const char *tag, const char *format, ...)
+{
+    char	*outstr, logfn[64], stamp[32];
+    va_list	va_ptr;
+    FILE	*fp;
+
+    outstr = calloc(1024, sizeof(char));
+    va_start(va_ptr, format);
+    vsnprintf(outstr, 1023, format, va_ptr);
+    ESP_LOGI(tag, "%s", outstr);
+
+    if (System_TimeOk && sdcard_state->card_present == true) {
+	snprintf(logfn, 64, "/sdcard/w/log/sys%04d%02d%02d.log", timeinfo.tm_year+1900, timeinfo.tm_mon+1, timeinfo.tm_mday);
+	snprintf(stamp, 31, "%02d-%02d %02d:%02d:%02d", timeinfo.tm_mday, timeinfo.tm_mon+1, timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);
+	fp = fopen(logfn, "a+");
+	if (fp) {
+	    fprintf(fp, "%s %s: %s\n", stamp, tag, outstr);
+	    fclose(fp);
+	}
+    }
+
+    va_end(va_ptr);
+    free(outstr);
+}
+
 
 
 void log_begin(time_t t)
@@ -60,7 +89,7 @@
      */
     if (! strlen(sdcard_state->logfile) && strlen(runtime.Logfile)) {
 	sprintf(sdcard_state->logfile, "%s", runtime.Logfile);
-	ESP_LOGI(TAG, "Resumed %s", sdcard_state->logfile);
+	log_msg(TAG, "Resumed %s", sdcard_state->logfile);
     } else {
     	localtime_r(&t, &timeinfo);
     	if (timeinfo.tm_year > (2016 - 1900)) {
@@ -69,7 +98,7 @@
     	} else {
 	    sprintf(sdcard_state->logfile, "brewlog");
     	}
-	ESP_LOGI(TAG, "Create %s", sdcard_state->logfile);
+	log_msg(TAG, "Create %s", sdcard_state->logfile);
     	sprintf(runtime.Logfile, "%s", sdcard_state->logfile);
     }
 }
@@ -208,13 +237,13 @@
     // connect SDMMC driver to FATFS
     pdrv = 0xFF;
     if (ff_diskio_get_drive(&pdrv) != ESP_OK || pdrv == 0xFF) {
-	ESP_LOGI(TAG, "the maximum count of volumes is already mounted");
+	ESP_LOGE(TAG, "the maximum count of volumes is already mounted");
 	return ESP_ERR_NO_MEM;
     }
 
     s_base_path = strdup(base_path);
     if (!s_base_path) {
-	ESP_LOGI(TAG, "could not copy base_path");
+	ESP_LOGE(TAG, "could not copy base_path");
 	return ESP_ERR_NO_MEM;
     }
     esp_err_t err = ESP_OK;
@@ -226,7 +255,7 @@
 
     err = (*host_config->init)();
     if (err != ESP_OK) {
-	ESP_LOGI(TAG, "host init returned rc=0x%x", err);
+	ESP_LOGE(TAG, "host init returned rc=0x%x", err);
 	goto fail;
     }
 
@@ -237,7 +266,7 @@
 	err = sdmmc_host_init_slot(host_config->slot, (const sdmmc_slot_config_t*) slot_config);
     }
     if (err != ESP_OK) {
-	ESP_LOGI(TAG, "slot_config returned rc=0x%x", err);
+	ESP_LOGE(TAG, "slot_config returned rc=0x%x", err);
 	goto fail;
     }
     return ESP_OK;
@@ -344,13 +373,13 @@
 
     f = fopen(ff, "r");
     if (f == NULL) {
-	ESP_LOGE(TAG, "FileCopy cannot open %s for read, error %d", ff, errno);
+	ESP_LOGW(TAG, "FileCopy cannot open %s for read, error %d", ff, errno);
 	return 1;
     }
 
     t = fopen(tf, "w+");
     if (t == NULL) {
-	ESP_LOGE(TAG, "FileCopy cannot open %s for create/write, error %d", tf, errno);
+	ESP_LOGW(TAG, "FileCopy cannot open %s for create/write, error %d", tf, errno);
 	fclose(f);
 	return 1;
     }
@@ -482,7 +511,7 @@
 	if (uxBits & TASK_SDCARD_LOG_CLOSE) {
 	    // Close the logfile.
 	    if (strlen(sdcard_state->logfile) && (sdcard_state->card_present == true)) {
-		ESP_LOGI(TAG, "Closing logfile");
+		log_msg(TAG, "Closing logfile");
 		char	destname[64];
 		sprintf(destname, "/sdcard/w/log");
 		int rc = mkdir(destname, 0755);
@@ -517,7 +546,7 @@
 		    }
 		    sprintf(destname, "/sdcard/w/log/%s.json", sdcard_state->logfile);
 		    if (FileCopy(filename, destname) == 0) {
-			ESP_LOGI(TAG, "JSON file copied to %s", destname);
+			log_msg(TAG, "JSON file copied to %s", destname);
 			unlink(filename);
 		    }
 		}
--- a/main/task_sdcard.h	Tue Jul 02 17:33:23 2019 +0200
+++ b/main/task_sdcard.h	Fri Jul 05 16:17:04 2019 +0200
@@ -50,6 +50,17 @@
     char	event[64];		///< Event message.
 } JSON_log;
 
+
+/**
+ * @brief Write application messages to a logfile on the sdcard. The
+ *        logfile is /sdcard/log/sysyyymmdd.log and is only used
+ *        when the time is set from NTP and a card is mounted.
+ *        Log messages are always copied to ESP_LOGI() too.
+ * @param tag is the log tag just as in ESP_LOGx().
+ * @param * is the formatted string.
+ */
+void log_msg(const char *tag, const char *, ...);
+
 /**
  * @brief Begin a new logfile. The logfile is created and written to on
  *        the spiffs filesystem.
--- a/main/task_wifi.c	Tue Jul 02 17:33:23 2019 +0200
+++ b/main/task_wifi.c	Fri Jul 05 16:17:04 2019 +0200
@@ -106,7 +106,7 @@
 	    sprintf(config.lastSSID, "%s", task_wifi_ConfigSTA->sta.ssid);
 	    write_config();
 	}
-//	ESP_LOGI(TAG, "SaveStaConfig %s, record %d", wifiStation.SSID, record);
+	ESP_LOGD(TAG, "SaveStaConfig %s, record %d", wifiStation.SSID, record);
     }
 
     return ESP_OK;
@@ -181,7 +181,7 @@
 		const system_event_sta_disconnected_t *disconnected = &event->event_info.disconnected;
 		wifi_ap_record_t    ap;
 
-            	ESP_LOGI(TAG, "Event STA disconnected, ssid:%s, ssid_len:%d, bssid:" MACSTR ", reason:%d",
+            	ESP_LOGW(TAG, "Event STA disconnected, ssid:%s, ssid_len:%d, bssid:" MACSTR ", reason:%d",
                        disconnected->ssid, disconnected->ssid_len, MAC2STR(disconnected->bssid), disconnected->reason);
 		if (xSemaphoreTake(xSemaphoreWiFi, 10) == pdTRUE) {
 		    wifi_state->STA_connected = false;
@@ -203,7 +203,7 @@
 		    break;
 		}
 		if (disconnected->reason == WIFI_REASON_NO_AP_FOUND && _wifi_ScanAPs && _wifi_ScanDone) {
-//		    ESP_LOGI(TAG, "Scan completed, look for another AP, found:%d", _wifi_Scanned);
+		    ESP_LOGD(TAG, "Scan completed, look for another AP, found:%d", _wifi_Scanned);
 		    _wifi_ScanAPs = false;
                     _wifi_ScanDone = false;
 		    for (int i = 0; i < _wifi_Scanned; i++) {
@@ -217,7 +217,7 @@
                             memset(config, 0x00, sizeof(wifi_config_t));
                             memcpy(config->sta.ssid, wifiStation.SSID, strlen(wifiStation.SSID));
                             memcpy(config->sta.password, wifiStation.Password, strlen(wifiStation.Password));
-//			ESP_LOGI(TAG, "new AP %s %s", wifiStation.SSID, wifiStation.Password);
+			    ESP_LOGD(TAG, "new AP %s %s", wifiStation.SSID, wifiStation.Password);
                             xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_REQUEST_STA_CONNECT);
 			    break;
 			}
@@ -269,7 +269,7 @@
 		break;
 
 	case SYSTEM_EVENT_STA_LOST_IP:
-		ESP_LOGI(TAG, "Lost IP address");
+		ESP_LOGW(TAG, "Lost IP address");
 		xEventGroupClearBits(xEventGroupWifi, TASK_WIFI_HAS_IP);
 		if (xSemaphoreTake(xSemaphoreWiFi, 10) == pdTRUE) {
 		    wifi_state->STA_ip[0] = '\0';
@@ -356,7 +356,7 @@
         localtime_r(&now, &timeinfo);
 	System_TimeOk = true;
         strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo);
-        ESP_LOGI(TAG, "NTP time is set: %s", strftime_buf);
+	log_msg(TAG, "NTP time is set: %s", strftime_buf);
     } else {
     	ESP_LOGI(TAG, "NTP unknown time sync event rc=%d", rc);
     }
@@ -529,7 +529,7 @@
 		    /* save wifi config */
 		    SaveStaConfig();
 		} else {
-		    ESP_LOGI(TAG, "Connection failed");
+		    ESP_LOGW(TAG, "Connection failed");
 		    /* failed attempt to connect regardles of the reason */
 
 		    /* otherwise: reset the config */
@@ -538,7 +538,7 @@
 		xEventGroupClearBits(xEventGroupWifi, TASK_WIFI_REQUEST_STA_CONNECT);
 	    } else {
 		/* hit 10 seconds timeout */
-		ESP_LOGI(TAG, "Connection timeout");
+		ESP_LOGW(TAG, "Connection timeout");
 		xEventGroupClearBits(xEventGroupWifi, TASK_WIFI_REQUEST_STA_CONNECT);
                 vTaskDelay(100 / portTICK_PERIOD_MS);
 		xEventGroupSetBits(xEventGroupWifi, TASK_WIFI_REQUEST_STA_CONNECT);
--- a/sdkconfig	Tue Jul 02 17:33:23 2019 +0200
+++ b/sdkconfig	Fri Jul 05 16:17:04 2019 +0200
@@ -520,8 +520,8 @@
 CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y
 # CONFIG_UNITY_ENABLE_FIXTURE is not set
 # CONFIG_UNITY_ENABLE_BACKTRACE_ON_FAIL is not set
-CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT=y
-# CONFIG_SUPPORT_TERMIOS is not set
+CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT=y
+# CONFIG_VFS_SUPPORT_TERMIOS is not set
 CONFIG_SEMIHOSTFS_MAX_MOUNT_POINTS=1
 CONFIG_SEMIHOSTFS_HOST_PATH_MAX_LEN=128
 # CONFIG_WL_SECTOR_SIZE_512 is not set
@@ -675,4 +675,6 @@
 # CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_FAILS is not set
 # CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ALLOWED is not set
 CONFIG_IP_LOST_TIMER_INTERVAL=120
+CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT=y
+# CONFIG_SUPPORT_TERMIOS is not set
 # End of deprecated options

mercurial