diff options
Diffstat (limited to 'Plugins/Monitors')
| -rw-r--r-- | Plugins/Monitors/MultiCpu.hs | 67 | 
1 files changed, 67 insertions, 0 deletions
| diff --git a/Plugins/Monitors/MultiCpu.hs b/Plugins/Monitors/MultiCpu.hs new file mode 100644 index 0000000..02fa842 --- /dev/null +++ b/Plugins/Monitors/MultiCpu.hs @@ -0,0 +1,67 @@ +----------------------------------------------------------------------------- +-- | +-- Module      :  Plugins.Monitors.MultiCpu +-- Copyright   :  (c) Jose A Ortega Ruiz +-- License     :  BSD-style (see LICENSE) +-- +-- Maintainer  :  Jose A Ortega <jao@gnu.org> +-- Stability   :  unstable +-- Portability :  unportable +-- +-- A multi-cpu monitor for Xmobar +-- +----------------------------------------------------------------------------- + +module Plugins.Monitors.MultiCpu where + +import Plugins.Monitors.Common +import qualified Data.ByteString.Lazy.Char8 as B +import Data.List(isPrefixOf) + +multiCpuConfig :: IO MConfig +multiCpuConfig = mkMConfig +                 "Cpu: <total>" +                 [ k ++ n | n <- "":(map show [0 :: Int ..]) +                          , k <- ["total","user","nice","system","idle"]] + + +multiCpuData :: IO [[Float]] +multiCpuData = do s <- B.readFile "/proc/stat" +                  return $ multiCpuParser s + +multiCpuParser :: B.ByteString -> [[Float]] +multiCpuParser = map (map read . tail) . lns +  where lns = takeWhile isCpu . map unpW . B.lines +        isCpu (w:_) = "cpu" `isPrefixOf` w +        isCpu _ = False +        unpW = map B.unpack . B.words + +parseMultiCpu :: IO [[Float]] +parseMultiCpu = +  do (as, bs) <- doActionTwiceWithDelay 350000 multiCpuData +     let p0 = zipWith percent bs as +     (as', bs') <- doActionTwiceWithDelay 350000 multiCpuData +     let p1 = zipWith percent bs' as' +     return $ zipWith (\x y -> zipWith (\a b -> (a + b) / 2.0) x y)  p1 p0 + +percent :: [Float] -> [Float] -> [Float] +percent b a = map (/ tot) $ take 4 dif +  where dif = zipWith (-) b a +        tot = foldr (+) 0 dif + +formatMultiCpus :: [[Float]] -> Monitor [String] +formatMultiCpus [] = return $ take 15 (repeat "-1%") +formatMultiCpus xs = fmap concat $ mapM formatMultiCpu xs + +formatMultiCpu :: [Float] -> Monitor [String] +formatMultiCpu x +  | length x < 4 = return $ take 5 (repeat "") +  | otherwise  = mapM (showWithColors f) . map (* 100) $ (t:x) +            where f s = floatToPercent (s / 100) +                  t = foldr (+) 0 $ take 3 x + +runMultiCpu :: [String] -> Monitor String +runMultiCpu _ = +  do c <- io $ parseMultiCpu +     l <- formatMultiCpus c +     parseTemplate l | 
