diff options
Diffstat (limited to 'Plugins/Monitors')
| -rw-r--r-- | Plugins/Monitors/Batt.hs | 53 | 
1 files changed, 38 insertions, 15 deletions
| diff --git a/Plugins/Monitors/Batt.hs b/Plugins/Monitors/Batt.hs index 79c0015..96cd8ef 100644 --- a/Plugins/Monitors/Batt.hs +++ b/Plugins/Monitors/Batt.hs @@ -15,10 +15,17 @@  module Plugins.Monitors.Batt where  import qualified Data.ByteString.Lazy.Char8 as B +import qualified Data.Map as M +import Data.Maybe +import Data.Either +import Control.Monad +import Text.ParserCombinators.Parsec  import System.Posix.Files  import Plugins.Monitors.Common +type BattMap = M.Map String Integer +  battConfig :: IO MConfig  battConfig = mkMConfig         "Batt: <left>" -- template @@ -34,25 +41,41 @@ checkFileBatt :: (String, String) -> IO Bool  checkFileBatt (i,_) =      fileExist i -readFileBatt :: (String, String) -> IO (B.ByteString, B.ByteString) +readFileBatt :: (String, String) -> IO BattMap  readFileBatt (i,s) =  -    do a <- B.readFile i -       b <- B.readFile s -       return (a,b) +    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 toAssoc $ concatMap B.lines [a, b] + +toAssoc bs = case parse parseLine "" (B.unpack bs) of +                Left _ -> Nothing +                Right a -> Just a + +parseLine = do hd <- many1 $ noneOf ":" +               char ':' +               spaces +               tl <- many1 digit +               let t = read tl +               return (hd, t)  parseBATT :: IO Float  parseBATT = -    do (a1,b1) <- readFileBatt fileB1 -       c <- checkFileBatt fileB2 -       let sp p s = read $ stringParser p s -           (fu, pr) = (sp (3,2) a1, sp (2,4) b1) -       case c of -         True -> do (a2,b2) <- readFileBatt fileB1 -                    let full = fu + (sp (3,2) a2) -                        present = pr + (sp (2,4) b2) -                    return $ present / full -         _ -> return $ pr / fu - +    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"  formatBatt :: Float -> Monitor [String]   formatBatt x = | 
