From 75780faeb8d16686f8bedd169e04b430b4618e19 Mon Sep 17 00:00:00 2001 From: "Jose A. Ortega Ruiz" Date: Sun, 17 Jan 2010 23:15:00 +0100 Subject: New MultiCpu monitor that works like Cpu for multiple CPU cores Ignore-this: 64152f888f1e007612dc8e1f1eace875 darcs-hash:20100117221500-40885-23930af67e2b5446712b1bced29ce56ec696965e.gz --- Plugins/Monitors.hs | 4 +++ Plugins/Monitors/MultiCpu.hs | 67 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 Plugins/Monitors/MultiCpu.hs diff --git a/Plugins/Monitors.hs b/Plugins/Monitors.hs index 07662be..72e0d50 100644 --- a/Plugins/Monitors.hs +++ b/Plugins/Monitors.hs @@ -22,6 +22,7 @@ import Plugins.Monitors.Net import Plugins.Monitors.Mem import Plugins.Monitors.Swap import Plugins.Monitors.Cpu +import Plugins.Monitors.MultiCpu import Plugins.Monitors.Batt import Plugins.Monitors.Thermal import Plugins.Monitors.CpuFreq @@ -32,6 +33,7 @@ data Monitors = Weather Station Args Rate | Memory Args Rate | Swap Args Rate | Cpu Args Rate + | MultiCpu Args Rate | Battery Args Rate | BatteryP [String] Args Rate | Thermal Zone Args Rate @@ -54,6 +56,7 @@ instance Exec Monitors where alias (Memory _ _) = "memory" alias (Swap _ _) = "swap" alias (Cpu _ _) = "cpu" + alias (MultiCpu _ _) = "multicpu" alias (Battery _ _) = "battery" alias (BatteryP _ _ _)= "battery" alias (CpuFreq _ _) = "cpufreq" @@ -64,6 +67,7 @@ instance Exec Monitors where start (Memory a r) = runM a memConfig runMem r start (Swap a r) = runM a swapConfig runSwap r start (Cpu a r) = runM a cpuConfig runCpu r + start (MultiCpu a r) = runM a multiCpuConfig runMultiCpu r start (Battery a r) = runM a battConfig runBatt r start (BatteryP s a r) = runM a battConfig (runBatt' s) r start (CpuFreq a r) = runM a cpuFreqConfig runCpuFreq r 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 +-- 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: " + [ 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 -- cgit v1.2.3