From f8e1b13ae53928c6cb74571257bbaf4833582eea Mon Sep 17 00:00:00 2001 From: fabianArbeit Date: Wed, 6 Aug 2025 10:31:31 +0200 Subject: [PATCH] more elegant handling of pre-lunch-time/ shorter total times in general --- .../src/main/java/de/szimnau/DrinkingBar.java | 33 +++++++++++++++---- .../main/java/de/szimnau/WorkLoadingBar.java | 17 +++++----- 2 files changed, 36 insertions(+), 14 deletions(-) diff --git a/zeitlaeufer/src/main/java/de/szimnau/DrinkingBar.java b/zeitlaeufer/src/main/java/de/szimnau/DrinkingBar.java index c22912c..e51e890 100644 --- a/zeitlaeufer/src/main/java/de/szimnau/DrinkingBar.java +++ b/zeitlaeufer/src/main/java/de/szimnau/DrinkingBar.java @@ -20,11 +20,31 @@ public class DrinkingBar extends AbstractLoadingBar { private static final int MINUTES_BEFORE_PAUSE = 4 * CommonTools.MINS_PER_HOUR + MINS_PER_HALF_HOUR; private static final int MINUTES_WITH_PAUSE = 6 * CommonTools.MINS_PER_HOUR; private static final int DEFAULT_TOTAL_TIME = 8 * CommonTools.MINS_PER_HOUR + MINS_PER_HALF_HOUR; + private static final double DEFAULT_TOTAL_LITRES = 2.0; + private static final double QUARTER_LITRE = 0.25; private static final DecimalFormat LITER_FORMAT = new DecimalFormat("0.00"); + private double totalLitres; + protected DrinkingBar(LocalTime startTime) { super(startTime, DEFAULT_TOTAL_TIME); + this.totalLitres = DEFAULT_TOTAL_LITRES; + } + + + @Override + protected void setEndTime(LocalTime endTime) { + super.setEndTime(endTime); + // correct necessary litres to drink based on the end time. + // lower the volume in quarter litre steps + double calcTotalLitres = DEFAULT_TOTAL_LITRES; + double totalLitresFromMinutes = calcTotalLitres / DEFAULT_TOTAL_TIME * getTotalMinutes(); + do { + calcTotalLitres -= QUARTER_LITRE; + } while (calcTotalLitres >= totalLitresFromMinutes); + // add quarter since we always did a step "too many", due to the do ... while loop + this.totalLitres = calcTotalLitres + QUARTER_LITRE; } @@ -40,12 +60,12 @@ public class DrinkingBar extends AbstractLoadingBar { @Override protected String fillLoadingBar(long passedMinutes, boolean progressive) { long effectivePassedMinutes = passedMinutes; - if (passedMinutes > MINUTES_BEFORE_PAUSE && passedMinutes <= MINUTES_WITH_PAUSE) { + if (getTotalMinutes() > MINUTES_WITH_PAUSE && passedMinutes > MINUTES_BEFORE_PAUSE && passedMinutes <= MINUTES_WITH_PAUSE) { effectivePassedMinutes = MINUTES_BEFORE_PAUSE; } - double currentLitres = 2.0 / getTotalMinutes() * effectivePassedMinutes + 0.25; - double printedLitres = currentLitres - (currentLitres % 0.25); - // double currentProgressToNextStep = 100 / 0.25 * (currentLitres - printedLitres); + double currentLitres = totalLitres / getTotalMinutes() * effectivePassedMinutes + QUARTER_LITRE; + double printedLitres = currentLitres - (currentLitres % QUARTER_LITRE); + // double currentProgressToNextStep = 100 / QUARTER_LITRE * (currentLitres - printedLitres); BigDecimal minutesToNextStep = getMinutesToNextStep(currentLitres); String progressivePart = progressive ? "\r" : ""; return progressivePart + "Aktuelles Volumen: " + LITER_FORMAT.format(printedLitres) + "L - " @@ -56,10 +76,11 @@ public class DrinkingBar extends AbstractLoadingBar { private BigDecimal getMinutesToNextStep(double currentLitres) { // berechne Liter benötigt bis zum nächsten 0.25er Schritt - double litresToNextStep = 0.25 - (currentLitres % 0.25); + double litresToNextStep = QUARTER_LITRE - (currentLitres % QUARTER_LITRE); // berechne Minuten benötigt für 1 Liter - double minutesPerLitre = getTotalMinutes() / 2.0; + double minutesPerLitre = getTotalMinutes() / totalLitres; // berechne Minuten benötigt bis zum nächsten 0.25er Schritt + // + 1 since we only show minutes and have to adjust for the "ignored" seconds return BigDecimal.valueOf((minutesPerLitre * litresToNextStep) + 1); } } diff --git a/zeitlaeufer/src/main/java/de/szimnau/WorkLoadingBar.java b/zeitlaeufer/src/main/java/de/szimnau/WorkLoadingBar.java index 3e98e7f..9510138 100644 --- a/zeitlaeufer/src/main/java/de/szimnau/WorkLoadingBar.java +++ b/zeitlaeufer/src/main/java/de/szimnau/WorkLoadingBar.java @@ -54,13 +54,15 @@ public class WorkLoadingBar extends AbstractProgressBar { private static void handleMittagspause(BufferedReader br, WorkLoadingBar wlb) throws IOException { LoadingBar.handleMittagspause(br, wlb.loadingBar); - wlb.setEndTime(wlb.loadingBar.getEndTime(), false); + // FSFIXME add functionality that regards this end time as lunch time (thus making the 30 mins pause right before the end). + // it can maybe save that end time and when setting the final end time, making the 30 mins pause prevEndTime + lunchDuration. + wlb.setEndTime(wlb.loadingBar.getEndTime()); } private static void handleZapfenstreich(BufferedReader br, WorkLoadingBar wlb) throws IOException { LoadingBar.handleZapfenstreich(br, wlb.loadingBar); - wlb.setEndTime(wlb.loadingBar.getEndTime(), true); + wlb.setEndTime(wlb.loadingBar.getEndTime()); } @@ -68,17 +70,16 @@ public class WorkLoadingBar extends AbstractProgressBar { LoadingBar lb = LoadingBar.getLoadingBarFromCLI(args); var db = new DrinkingBar(lb.getStartTime()); var wlb = new WorkLoadingBar(lb, db); - wlb.setEndTime(wlb.loadingBar.getEndTime(), true); + wlb.setEndTime(wlb.loadingBar.getEndTime()); wlb.showLoadingBar(); // wlb.showLoadingBarDebug(); // DEBUG } - protected void setEndTime(LocalTime endTime, boolean finalEndTime) { - setEndTime(endTime); - if (finalEndTime) { - drinkingBar.setEndTime(endTime); - } + @Override + protected void setEndTime(LocalTime endTime) { + super.setEndTime(endTime); + drinkingBar.setEndTime(endTime); }