diff --git a/src/brewHandler.h b/src/brewHandler.h index f9cc16bc..61b93485 100644 --- a/src/brewHandler.h +++ b/src/brewHandler.h @@ -58,7 +58,6 @@ double preinfusion = PRE_INFUSION_TIME; // preinfusion time in s double preinfusionPause = PRE_INFUSION_PAUSE_TIME; // preinfusion pause time in s double totalBrewTime = 0; // total brewtime including preinfusion and preinfusion pause double timeBrewed = 0; // total brewed time -double lastBrewTimeMillis = 0; // for shottimer delay after brew is finished unsigned long startingTime = 0; // start time of brew bool brewPIDDisabled = false; // is PID disabled for delay after brew has started? @@ -259,7 +258,6 @@ bool brew() { valveRelay.off(); pumpRelay.off(); currentMillisTemp = 0; - lastBrewTimeMillis = millis(); // time brew finished for shottimer delay brewSwitchWasOff = false; LOG(INFO, "Brew finished"); LOGF(INFO, "Shot time: %4.1f s", timeBrewed / 1000); @@ -291,7 +289,6 @@ bool brew() { case kBrewFinished: currentMillisTemp = 0; - lastBrewTimeMillis = millis(); // time brew finished for shottimer delay LOG(INFO, "Brew finished"); LOGF(INFO, "Shot time: %4.1f s", timeBrewed / 1000); LOG(INFO, "Brew idle"); diff --git a/src/display/displayCommon.h b/src/display/displayCommon.h index e8aa62d2..6fa480e2 100644 --- a/src/display/displayCommon.h +++ b/src/display/displayCommon.h @@ -138,6 +138,46 @@ void displayTemperature(int x, int y) { u8g2.drawCircle(x + 72, y + 4, 3); } +/** + * @brief determines if brew timer should be visible; postBrewTimerDuration defines how long the timer after the brew is shown + * @return true if timer should be visible, false otherwise + */ +bool shouldDisplayBrewTimer() { + + enum BrewTimerState { + kBrewTimerIdle = 10, + kBrewTimerRunning = 20, + kBrewTimerPostBrew = 30 + }; + + static BrewTimerState currBrewTimerState = kBrewTimerIdle; + + static uint32_t brewEndTime = 0; + + switch (currBrewTimerState) { + case kBrewTimerIdle: + if (brew()) { + currBrewTimerState = kBrewTimerRunning; + } + break; + + case kBrewTimerRunning: + if (!brew()) { + currBrewTimerState = kBrewTimerPostBrew; + brewEndTime = millis(); + } + break; + + case kBrewTimerPostBrew: + if ((millis() - brewEndTime) > (uint32_t)(postBrewTimerDuration * 1000)) { + currBrewTimerState = kBrewTimerIdle; + } + break; + } + + return (currBrewTimerState != kBrewTimerIdle); +} + /** * @brief Draw the brew time at given position */ @@ -241,7 +281,7 @@ bool displayFullscreenBrewTimer() { return false; } - if (machineState == kBrew || ((millis() - lastBrewTimeMillis) < (postBrewTimerDuration * 1000) && lastBrewTimeMillis > 0)) { + if (shouldDisplayBrewTimer()) { u8g2.clearBuffer(); u8g2.drawXBMP(-1, 11, Brew_Cup_Logo_width, Brew_Cup_Logo_height, Brew_Cup_Logo); #if (FEATURE_SCALE == 1) diff --git a/src/display/displayTemplateStandard.h b/src/display/displayTemplateStandard.h index 0c2a053d..b07d3570 100644 --- a/src/display/displayTemplateStandard.h +++ b/src/display/displayTemplateStandard.h @@ -70,7 +70,7 @@ void printScreen() { if (featureBrewControl) { // Shown brew time while machine is brewing and after the brewing during postBrewTimerDuration - if (machineState == kBrew || ((millis() - lastBrewTimeMillis) < (postBrewTimerDuration * 1000) && lastBrewTimeMillis > 0)) { + if (shouldDisplayBrewTimer()) { u8g2.setCursor(34, 36); u8g2.print(langstring_brew); u8g2.setCursor(84, 36); @@ -95,7 +95,7 @@ void printScreen() { // Brew Timer with optocoupler // Shown brew time while machine is brewing and after the brewing during postBrewTimerDuration - if (machineState == kBrew || ((millis() - lastBrewTimeMillis) < (postBrewTimerDuration * 1000) && lastBrewTimeMillis > 0)) { + if (shouldDisplayBrewTimer()) { u8g2.setCursor(34, 36); u8g2.print(langstring_brew); u8g2.setCursor(84, 36); diff --git a/src/main.cpp b/src/main.cpp index c79fc884..1cfd65c7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1703,6 +1703,11 @@ void looppid() { updateStandbyTimer(); handleMachineState(); + // Check if brew timer should be shown +#if (FEATURE_BREWSWITCH == 1) + shouldDisplayBrewTimer(); +#endif + // Check if PID should run or not. If not, set to manual and force output to zero #if OLED_DISPLAY != 0 printDisplayTimer();