summaryrefslogtreecommitdiffstats
path: root/test1.hs
diff options
context:
space:
mode:
Diffstat (limited to 'test1.hs')
-rw-r--r--test1.hs138
1 files changed, 138 insertions, 0 deletions
diff --git a/test1.hs b/test1.hs
new file mode 100644
index 0000000..8ecfa36
--- /dev/null
+++ b/test1.hs
@@ -0,0 +1,138 @@
+module Main where
+
+import Blessings
+import Control.Applicative
+import Data.Map (Map); import qualified Data.Map as Map
+import Data.Monoid
+import System.Environment
+import Text.Megaparsec
+import Text.Megaparsec.Lexer
+import Text.Megaparsec.String
+import Text.Printf
+
+main :: IO ()
+main = do
+ [ueventPath] <- getArgs
+ p <- parse uevent ueventPath <$> readFile ueventPath
+ case p of
+ Left x -> print x
+ Right x ->
+ let
+ norm = (/10**6) . fromIntegral
+
+ getdec k = norm <$>
+ (Map.lookup k x >>= parseMaybe (decimal :: Parser Integer))
+
+ getstr k =
+ Map.lookup k x
+
+ name = getstr "POWER_SUPPLY_NAME"
+ charge_full = getdec "POWER_SUPPLY_CHARGE_FULL"
+ charge_now = getdec "POWER_SUPPLY_CHARGE_NOW"
+ current_now = getdec "POWER_SUPPLY_CURRENT_NOW"
+ energy_full = getdec "POWER_SUPPLY_ENERGY_FULL"
+ energy_now = getdec "POWER_SUPPLY_ENERGY_NOW"
+ power_now = getdec "POWER_SUPPLY_POWER_NOW"
+ voltage_min_design = getdec "POWER_SUPPLY_VOLTAGE_MIN_DESIGN"
+ voltage_now = getdec "POWER_SUPPLY_VOLTAGE_NOW"
+
+ capacity =
+ liftA2 (/) chargeNow chargeFull
+ -- as good: liftA2 (/) energyNow energyFull
+
+ chargeFull = charge_full <|>
+ liftA2 (/) energy_full voltage_min_design
+
+ chargeNow = charge_now <|>
+ liftA2 (/) energy_now voltage_min_design
+
+ currentNow = current_now <|>
+ liftA2 (/) power_now voltage_now
+
+ energyFull = energy_full <|>
+ liftA2 (*) charge_full voltage_min_design
+
+ energyNow = energy_now <|>
+ liftA2 (*) charge_now voltage_min_design
+
+ powerNow = power_now <|>
+ liftA2 (*) current_now voltage_now
+
+ timeRemain =
+ liftA2 (/) chargeNow currentNow
+ --liftA2 (/) energyNow powerNow
+
+ voltageMinDesign = voltage_min_design
+ voltageNow = voltage_now
+ in
+ do
+ putStrLn $ "name: " <> maybe "?" id name
+ putStrLn $ "capacity: " <> maybe "?" pperc capacity
+ putStrLn $ "chargeFull: " <> maybe "?" (ppu "Ah") chargeFull
+ putStrLn $ "chargeNow: " <> maybe "?" (ppu "Ah") chargeNow
+ putStrLn $ "currentNow: " <> maybe "?" (ppu "A") currentNow
+ putStrLn $ "energyFull: " <> maybe "?" (ppu "Wh") energyFull
+ putStrLn $ "energyNow: " <> maybe "?" (ppu "Wh") energyNow
+ putStrLn $ "powerNow: " <> maybe "?" (ppu "W") powerNow
+ putStrLn $ "timeRemain: " <> maybe "?" ppt timeRemain
+ putStrLn $ "voltageMinDesign: " <> maybe "?" (ppu "V") voltageMinDesign
+ putStrLn $ "voltageNow: " <> maybe "?" (ppu "V") voltageNow
+
+ putStrLn $ maybe "?" id name
+ <-> maybe "?" (pbar 10) capacity
+ <-> maybe "?" pperc capacity
+ <-> maybe "?" (ppu "Ah") chargeNow
+ <> "/" <>
+ maybe "?" (ppu "A") currentNow
+ <->
+ maybe "?" (ppu "Wh") energyNow
+ <> "/" <>
+ maybe "?" (ppu "W") powerNow
+ <->
+ maybe "?" ppt timeRemain
+
+
+
+(<->) :: String -> String -> String
+a <-> b = a <> " " <> b
+
+pperc :: Double -> String
+pperc x = ppu "%" (100 * x)
+
+ppu :: String -> Double -> String
+ppu unit x =
+ printf "%.2f" x ++ unit
+
+ppt :: Double -> String
+ppt t
+ | isInfinite t = "inf"
+ -- | isNaN t = "NaN"
+ -- | isDenormalized t = "denorm"
+ -- | isNegativeZero t = "-0"
+ | otherwise = show h ++ "h" ++ show m ++ "m"
+ where
+ h = floor t :: Integer
+ m = floor $ (t - fromIntegral h) * 60 :: Integer
+
+pbar :: Int -> Double -> String
+pbar n r =
+ pp (SGR color (Plain (take t1 (repeat '■'))) <>
+ SGR [30] (Plain (take t2 (repeat '■'))))
+ where
+ color
+ | r >= 0.42 = [1,32]
+ | r >= 0.23 = [1,33]
+ | r >= 0.11 = [1,31]
+ | otherwise = [5,1,31]
+ t1 = truncate (r * fromIntegral n)
+ t2 = n - t1
+
+uevent :: Parser (Map String String)
+uevent =
+ Map.fromList <$> some param
+
+param :: Parser (String,String)
+param = do
+ k <- someTill anyChar (char '=')
+ v <- someTill anyChar newline
+ return (k,v)