diff --git a/src/QBar/Blocks/Battery.hs b/src/QBar/Blocks/Battery.hs index d0da081213004a56fff0248c92f480cd7c379326..33df50516bd2e3835e32b1897e70f6ca6fb71624 100644 --- a/src/QBar/Blocks/Battery.hs +++ b/src/QBar/Blocks/Battery.hs @@ -1,3 +1,4 @@ +{-# LANGUAGE MultiWayIf #-} {-# LANGUAGE ScopedTypeVariables #-} @@ -13,7 +14,6 @@ import qualified Data.Text.Lazy.IO as TIO import System.Directory import Data.Maybe -import Text.Read (readMaybe) import Control.Lens @@ -31,23 +31,51 @@ data BatteryState = BatteryState getBatteryState :: FilePath -> IO (Maybe BatteryState) -getBatteryState path = tryMaybe $ do - status' <- TIO.readFile (path <> "/status") - powerNow' <- tryMaybe $ TIO.readFile (path <> "/power_now") - energyNow' <- readIO =<< readFile (path <> "/energy_now") - energyFull' <- readIO =<< readFile (path <> "/energy_full") - return BatteryState - { _status = batteryStatus . T.strip $ status' - , _powerNow = readMaybe . T.unpack =<< powerNow' - , _energyNow = energyNow' - , _energyFull = energyFull' - } +getBatteryState path = maybe getBatteryStateCharge (return . Just) =<< getBatteryStateEnergy where - batteryStatus :: T.Text -> BatteryStatus - batteryStatus statusText - | statusText == "Charging" = BatteryCharging - | statusText == "Discharging" = BatteryDischarging - | otherwise = BatteryOther + getVoltage :: IO Double + getVoltage = readIO =<< readFile (path <> "/voltage_now") + getBatteryStateEnergy :: IO (Maybe BatteryState) + getBatteryStateEnergy = tryMaybe $ do + status' <- batteryStatus + energyNow' <- readIO =<< readFile (path <> "/energy_now") + energyFull' <- readIO =<< readFile (path <> "/energy_full") + powerNow' <- batteryPower getVoltage + return BatteryState + { _status = status' + , _powerNow = powerNow' + , _energyNow = energyNow' + , _energyFull = energyFull' + } + getBatteryStateCharge :: IO (Maybe BatteryState) + getBatteryStateCharge = tryMaybe $ do + status' <- batteryStatus + voltageNow' <- getVoltage + powerNow' <- batteryPower (return voltageNow') + chargeNow' <- readIO =<< readFile (path <> "/charge_now") + chargeFull' <- readIO =<< readFile (path <> "/charge_full") + return BatteryState + { _status = status' + , _powerNow = powerNow' + , _energyNow = round $ voltageNow' * chargeNow' / 1000000 + , _energyFull = round $ voltageNow' * chargeFull' / 1000000 + } + batteryPower :: IO Double -> IO (Maybe Int) + batteryPower getVoltage' = do + power' <- tryMaybe $ readIO =<< readFile (path <> "/power_now") + case power' of + power@(Just _) -> return power + Nothing -> tryMaybe $ do + current <- readIO =<< readFile (path <> "/current_now") + voltage <- getVoltage' + return $ round $ voltage * current / 1000000 + batteryStatus :: IO BatteryStatus + batteryStatus = do + statusText <- tryMaybe $ T.strip <$> TIO.readFile (path <> "/status") + return $ if + | statusText == Just "Charging" -> BatteryCharging + | statusText == Just "Discharging" -> BatteryDischarging + | otherwise -> BatteryOther batteryBlock :: PullBlock