diff options
-rw-r--r-- | Plugins/Monitors/Batt.hs | 52 |
1 files changed, 11 insertions, 41 deletions
diff --git a/Plugins/Monitors/Batt.hs b/Plugins/Monitors/Batt.hs index 44ee378..0c2219a 100644 --- a/Plugins/Monitors/Batt.hs +++ b/Plugins/Monitors/Batt.hs @@ -15,17 +15,8 @@ module Plugins.Monitors.Batt where import qualified Data.ByteString.Lazy.Char8 as B -import qualified Data.Map as M -import Data.Char -import Data.List -import Data.Maybe -import Control.Monad -import System.Posix.Files - import Plugins.Monitors.Common -type BattMap = M.Map String Integer - battConfig :: IO MConfig battConfig = mkMConfig "Batt: <left>" -- template @@ -37,44 +28,23 @@ fileB1 = ("/proc/acpi/battery/BAT1/info", "/proc/acpi/battery/BAT1/state") fileB2 :: (String, String) fileB2 = ("/proc/acpi/battery/BAT2/info", "/proc/acpi/battery/BAT2/state") -checkFileBatt :: (String, String) -> IO Bool -checkFileBatt (i,_) = - fileExist i - -readFileBatt :: (String, String) -> IO BattMap +readFileBatt :: (String, String) -> IO (B.ByteString, B.ByteString) readFileBatt (i,s) = do a <- catch (B.readFile i) (const $ return B.empty) b <- catch (B.readFile s) (const $ return B.empty) - return $ mkMap a b - -mkMap :: B.ByteString -> B.ByteString -> BattMap -mkMap a b = M.fromList . mapMaybe parseLine $ concatMap B.lines [a, b] - -parseLine :: B.ByteString -> Maybe (String, Integer) -parseLine s = do - let (k, r) = B.break (==':') s - (_, r') = B.span (isSpace) (B.tail r) - (v, _) = B.span (isDigit) r' - (ks, vs) = (B.unpack k, B.unpack v) - guard $ all (> 0) (map B.length [r, k, v]) - return (ks, read vs) + return (a,b) parseBATT :: IO Float parseBATT = - do m1 <- readFileBatt fileB1 - m2 <- readFileBatt fileB2 - let pr1 = M.findWithDefault 0 remKey m1 - fu1 = M.findWithDefault 0 fullKey m1 - pr2 = M.findWithDefault 0 remKey m2 - fu2 = M.findWithDefault 0 fullKey m2 - pr = pr1 + pr2 - fu = fu1 + fu2 - pc = if fu /= 0 then fromInteger pr / fromInteger fu else 0.0 - return pc - where - remKey = "remaining capacity" - fullKey = "last full capacity" - + do (a1,b1) <- readFileBatt fileB1 + (a2,b2) <- readFileBatt fileB2 + let sp p s = case stringParser p s of + [] -> 0 + x -> read x + (f1, p1) = (sp (3,2) a1, sp (2,4) b1) + (f2, p2) = (sp (3,2) a2, sp (2,4) b2) + return $ (p1 + p2) / (f1 + f2) --present / full + formatBatt :: Float -> Monitor [String] formatBatt x = do let f s = floatToPercent (s / 100) |