# HG changeset patch # User Michiel Broek # Date 1562336224 -7200 # Node ID f066fdeb9650df3634aa75dfa58670c6ac35cd8c # Parent 7ce410c79048fd4e81b297fb7a8f376e16cad5ba# Parent dd7019356c8cc75e74a297d947f7fe705cf6fc21 Merged with default diff -r 7ce410c79048 -r f066fdeb9650 Makefile --- 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 diff -r 7ce410c79048 -r f066fdeb9650 docs/Doxyfile --- 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/ diff -r 7ce410c79048 -r f066fdeb9650 image/version.txt --- 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 diff -r 7ce410c79048 -r f066fdeb9650 image/w/index.html.gz Binary file image/w/index.html.gz has changed diff -r 7ce410c79048 -r f066fdeb9650 main/automation.c --- 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; } diff -r 7ce410c79048 -r f066fdeb9650 main/ca_cert.pem --- 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----- diff -r 7ce410c79048 -r f066fdeb9650 main/manual.c --- 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); } diff -r 7ce410c79048 -r f066fdeb9650 main/task_http.c --- 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); diff -r 7ce410c79048 -r f066fdeb9650 main/task_sdcard.c --- 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); } } diff -r 7ce410c79048 -r f066fdeb9650 main/task_sdcard.h --- 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. diff -r 7ce410c79048 -r f066fdeb9650 main/task_wifi.c --- 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); diff -r 7ce410c79048 -r f066fdeb9650 sdkconfig --- 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