From e52b893541a1ff0f5eea156f67f0647654a13934 Mon Sep 17 00:00:00 2001 From: Jan Beinke <git@janbeinke.com> Date: Fri, 14 Feb 2020 14:38:49 +0100 Subject: [PATCH] Fix battery charging time estimate becoming negative in rare cases --- src/QBar/Blocks/Battery.hs | 10 ++++++++-- src/QBar/Blocks/Utils.hs | 5 +++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/QBar/Blocks/Battery.hs b/src/QBar/Blocks/Battery.hs index cfa9f28..f7d0358 100644 --- a/src/QBar/Blocks/Battery.hs +++ b/src/QBar/Blocks/Battery.hs @@ -158,8 +158,8 @@ batteryIsDischarging = any (singleBatteryIsDischarging . _status) batteryEstimate :: [BatteryState] -> Maybe Int batteryEstimate batteryStates | batteryPowerNow == 0 = Nothing - | isCharging, not isDischarging = Just $ div ((batteryEnergyFull - batteryEnergyNow) * 3600) batteryPowerNow - | isDischarging, not isCharging = Just $ div (batteryEnergyNow * 3600) batteryPowerNow + | isCharging, not isDischarging = ensure (>0) batteryEstimateCharging + | isDischarging, not isCharging = ensure (>0) batteryEstimateDischarging | otherwise = Nothing where isCharging :: Bool @@ -176,3 +176,9 @@ batteryEstimate batteryStates batteryEnergyFull :: Int batteryEnergyFull = sum . map _energyFull $ batteryStates + + batteryEstimateCharging :: Int + batteryEstimateCharging = div ((batteryEnergyFull - batteryEnergyNow) * 3600) batteryPowerNow + + batteryEstimateDischarging :: Int + batteryEstimateDischarging = div (batteryEnergyNow * 3600) batteryPowerNow diff --git a/src/QBar/Blocks/Utils.hs b/src/QBar/Blocks/Utils.hs index 17b759a..59304f2 100644 --- a/src/QBar/Blocks/Utils.hs +++ b/src/QBar/Blocks/Utils.hs @@ -14,6 +14,11 @@ formatFloatN = formatFloatN' 0 formatFloatN' :: RealFloat a => Int -> Int -> a -> T.Text formatFloatN' padWithZeros decimalPlaces f = T.justifyRight (fromIntegral padWithZeros) '0' . T.pack $ showFFloat (Just decimalPlaces) f "" +ensure :: (a -> Bool) -> a -> Maybe a +ensure f a + | f a = Just a + | otherwise = Nothing + tryMaybe :: IO a -> IO (Maybe a) tryMaybe a = tryMaybe' (Just <$> a) -- GitLab