From bd99e674006d5262501243aadfafeff841633e6e Mon Sep 17 00:00:00 2001 From: Juraj Hercek Date: Fri, 30 Nov 2007 21:54:30 +0100 Subject: Added thermal, cpufreq and coretemp monitors. Prerequisities: thermal - thermal module should be loaded/compiled in kernel - available in (at least) intel centrino processors cpufreq - acpi_cpufreq module should be loaded/compiled in kernel - available in modern processors coretemp - coretemp module should be loaded/compiled in kernel - available (at least) in core 2 duo processors darcs-hash:20071130205430-f49a6-0ff042af60c91416fd8dd8190cbd9022bcabb269.gz --- Plugins/Monitors.hs | 24 ++++++++++++++++++------ Plugins/Monitors/CoreCommon.hs | 41 +++++++++++++++++++++++++++++++++++++++++ Plugins/Monitors/CoreTemp.hs | 33 +++++++++++++++++++++++++++++++++ Plugins/Monitors/CpuFreq.hs | 33 +++++++++++++++++++++++++++++++++ Plugins/Monitors/Thermal.hs | 37 +++++++++++++++++++++++++++++++++++++ xmobar.cabal | 2 +- 6 files changed, 163 insertions(+), 7 deletions(-) create mode 100644 Plugins/Monitors/CoreCommon.hs create mode 100644 Plugins/Monitors/CoreTemp.hs create mode 100644 Plugins/Monitors/CpuFreq.hs create mode 100644 Plugins/Monitors/Thermal.hs diff --git a/Plugins/Monitors.hs b/Plugins/Monitors.hs index 1321e38..553862b 100644 --- a/Plugins/Monitors.hs +++ b/Plugins/Monitors.hs @@ -23,6 +23,9 @@ import Plugins.Monitors.Mem import Plugins.Monitors.Swap import Plugins.Monitors.Cpu import Plugins.Monitors.Batt +import Plugins.Monitors.Thermal +import Plugins.Monitors.CpuFreq +import Plugins.Monitors.CoreTemp data Monitors = Weather Station Args Rate | Network Interface Args Rate @@ -30,6 +33,9 @@ data Monitors = Weather Station Args Rate | Swap Args Rate | Cpu Args Rate | Battery Args Rate + | Thermal Args Rate + | CpuFreq Args Rate + | CoreTemp Args Rate deriving (Show,Read,Eq) type Args = [String] @@ -46,9 +52,15 @@ instance Exec Monitors where alias (Swap _ _) = "swap" alias (Cpu _ _) = "cpu" alias (Battery _ _) = "battery" - start (Weather s a r) = runM (a ++ [s]) weatherConfig runWeather r - start (Network i a r) = runM (a ++ [i]) netConfig runNet r - 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 (Battery a r) = runM a battConfig runBatt r + alias (Thermal _ _) = "thermal" + alias (CpuFreq _ _) = "cpufreq" + alias (CoreTemp _ _) = "coretemp" + start (Weather s a r) = runM (a ++ [s]) weatherConfig runWeather r + start (Network i a r) = runM (a ++ [i]) netConfig runNet r + 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 (Battery a r) = runM a battConfig runBatt r + start (Thermal a r) = runM a thermalConfig runThermal r + start (CpuFreq a r) = runM a cpuFreqConfig runCpuFreq r + start (CoreTemp a r) = runM a coreTempConfig runCoreTemp r diff --git a/Plugins/Monitors/CoreCommon.hs b/Plugins/Monitors/CoreCommon.hs new file mode 100644 index 0000000..de737d4 --- /dev/null +++ b/Plugins/Monitors/CoreCommon.hs @@ -0,0 +1,41 @@ +----------------------------------------------------------------------------- +-- | +-- Module : Plugins.Monitors.CoreCommon +-- Copyright : (c) Juraj Hercek +-- License : BSD-style (see LICENSE) +-- +-- Maintainer : Juraj Hercek +-- Stability : unstable +-- Portability : unportable +-- +-- The common part for cpu core monitors (e.g. cpufreq, coretemp) +-- +----------------------------------------------------------------------------- + +module Plugins.Monitors.CoreCommon where + +import Plugins.Monitors.Common +import System.Posix.Files (fileExist) +import System.Directory + +checkedDataRetrieval :: String -> String -> String -> String -> Double -> Monitor String +checkedDataRetrieval failureMessage dir file pattern divisor = do + exists <- io $ fileExist $ foldl (++) dir ["/", pattern, "0/", file] + case exists of + False -> return failureMessage + True -> retrieveData dir file pattern divisor + +retrieveData :: String -> String -> String -> Double -> Monitor String +retrieveData dir file pattern divisor = do + count <- io $ dirCount dir pattern + contents <- io $ mapM readFile $ files count + values <- mapM (showWithColors show) $ map conversion contents + parseTemplate values + where + dirCount path str = getDirectoryContents path + >>= return . length + . filter ((str ==) . take (length str)) + files count = [ foldl (++) dir [ "/", pattern, show i, "/", file ] + | i <- [0 .. count - 1] ] + conversion = flip (/) divisor . (read :: String -> Double) + diff --git a/Plugins/Monitors/CoreTemp.hs b/Plugins/Monitors/CoreTemp.hs new file mode 100644 index 0000000..e59f0d3 --- /dev/null +++ b/Plugins/Monitors/CoreTemp.hs @@ -0,0 +1,33 @@ +----------------------------------------------------------------------------- +-- | +-- Module : Plugins.Monitors.CoreTemp +-- Copyright : (c) Juraj Hercek +-- License : BSD-style (see LICENSE) +-- +-- Maintainer : Juraj Hercek +-- Stability : unstable +-- Portability : unportable +-- +-- A core temperature monitor for Xmobar +-- +----------------------------------------------------------------------------- + +module Plugins.Monitors.CoreTemp where + +import Plugins.Monitors.Common +import Plugins.Monitors.CoreCommon + +coreTempConfig :: IO MConfig +coreTempConfig = mkMConfig + "Temp: C" -- template + (zipWith (++) (repeat "core") (map show [0 :: Int ..])) -- available + -- replacements +runCoreTemp :: [String] -> Monitor String +runCoreTemp _ = do + let dir = "/sys/bus/platform/devices" + file = "temp1_input" + pattern = "coretemp." + divisor = 1e3 :: Double + failureMessage = "CoreTemp: N/A" + checkedDataRetrieval failureMessage dir file pattern divisor + diff --git a/Plugins/Monitors/CpuFreq.hs b/Plugins/Monitors/CpuFreq.hs new file mode 100644 index 0000000..0258037 --- /dev/null +++ b/Plugins/Monitors/CpuFreq.hs @@ -0,0 +1,33 @@ +----------------------------------------------------------------------------- +-- | +-- Module : Plugins.Monitors.CpuFreq +-- Copyright : (c) Juraj Hercek +-- License : BSD-style (see LICENSE) +-- +-- Maintainer : Juraj Hercek +-- Stability : unstable +-- Portability : unportable +-- +-- A cpu frequency monitor for Xmobar +-- +----------------------------------------------------------------------------- + +module Plugins.Monitors.CpuFreq where + +import Plugins.Monitors.Common +import Plugins.Monitors.CoreCommon + +cpuFreqConfig :: IO MConfig +cpuFreqConfig = mkMConfig + "Freq: GHz" -- template + (zipWith (++) (repeat "core") (map show [0 :: Int ..])) -- available + -- replacements +runCpuFreq :: [String] -> Monitor String +runCpuFreq _ = do + let dir = "/sys/devices/system/cpu" + file = "cpufreq/scaling_cur_freq" + pattern = "cpu" + divisor = 1e6 :: Double + failureMessage = "CpuFreq: N/A" + checkedDataRetrieval failureMessage dir file pattern divisor + diff --git a/Plugins/Monitors/Thermal.hs b/Plugins/Monitors/Thermal.hs new file mode 100644 index 0000000..2794a60 --- /dev/null +++ b/Plugins/Monitors/Thermal.hs @@ -0,0 +1,37 @@ +----------------------------------------------------------------------------- +-- | +-- Module : Plugins.Monitors.Thermal +-- Copyright : (c) Juraj Hercek +-- License : BSD-style (see LICENSE) +-- +-- Maintainer : Juraj Hercek +-- Stability : unstable +-- Portability : unportable +-- +-- A thermal monitor for Xmobar +-- +----------------------------------------------------------------------------- + +module Plugins.Monitors.Thermal where + +import qualified Data.ByteString.Lazy.Char8 as B +import Plugins.Monitors.Common +import System.Posix.Files (fileExist) + +thermalConfig :: IO MConfig +thermalConfig = mkMConfig + "Thm: C" -- template + ["temp"] -- available replacements + +runThermal :: [String] -> Monitor String +runThermal _ = do + let file = "/proc/acpi/thermal_zone/THM/temperature" + exists <- io $ fileExist file + case exists of + False -> return "Thermal: N/A" + True -> do number <- io $ B.readFile file + >>= return . (read :: String -> Int) + . stringParser (1, 0) + thermal <- showWithColors show number + parseTemplate [ thermal ] + diff --git a/xmobar.cabal b/xmobar.cabal index 4840df9..61cc32f 100644 --- a/xmobar.cabal +++ b/xmobar.cabal @@ -25,5 +25,5 @@ executable xmobar build-depends: base >= 3, containers, process, old-time, old-locale, bytestring else build-depends: base < 3 - build-depends: X11>=1.3.0, mtl, unix, parsec, filepath, stm + build-depends: X11>=1.3.0, mtl, unix, parsec, filepath, stm, directory -- cgit v1.2.3