------------------------------------------------------------------------------
-- |
-- Module       :  Plugins.Monitors.ThermalZone
-- Copyright    :  (c) 2011, 2013 Jose Antonio Ortega Ruiz
-- License      :  BSD3-style (see LICENSE)
--
-- Maintainer   :  jao@gnu.org
-- Stability    :  unstable
-- Portability  :  portable
-- Created      :  Fri Feb 25, 2011 03:18
--
--
-- A thermal zone plugin based on the sysfs linux interface.
-- See http://kernel.org/doc/Documentation/thermal/sysfs-api.txt
--
------------------------------------------------------------------------------

module Xmobar.Plugins.Monitors.ThermalZone (thermalZoneConfig, runThermalZone) where

import Xmobar.Plugins.Monitors.Common

import System.Posix.Files (fileExist)
import Control.Exception (IOException, catch)
import qualified Data.ByteString.Char8 as B

-- | Default thermal configuration.
thermalZoneConfig :: IO MConfig
thermalZoneConfig :: IO MConfig
thermalZoneConfig = String -> [String] -> IO MConfig
mkMConfig String
"<temp>C" [String
"temp"]

-- | Retrieves thermal information. Argument is name of thermal
-- directory in \/sys\/clas\/thermal. Returns the monitor string
-- parsed according to template (either default or user specified).
runThermalZone :: [String] -> Monitor String
runThermalZone :: [String] -> Monitor String
runThermalZone [String]
args = do
    let zone :: String
zone = [String] -> String
forall a. [a] -> a
head [String]
args
        file :: String
file = String
"/sys/class/thermal/thermal_zone" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
zone String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"/temp"
        handleIOError :: IOException -> IO (Maybe B.ByteString)
        handleIOError :: IOException -> IO (Maybe ByteString)
handleIOError IOException
_ = Maybe ByteString -> IO (Maybe ByteString)
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe ByteString
forall a. Maybe a
Nothing
        parse :: ByteString -> ReaderT MConfig IO Int
parse = Int -> ReaderT MConfig IO Int
forall (m :: * -> *) a. Monad m => a -> m a
return (Int -> ReaderT MConfig IO Int)
-> (ByteString -> Int) -> ByteString -> ReaderT MConfig IO Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Int
forall a. Read a => String -> a
read :: String -> Int) (String -> Int) -> (ByteString -> String) -> ByteString -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> String
B.unpack
    Bool
exists <- IO Bool -> Monitor Bool
forall a. IO a -> Monitor a
io (IO Bool -> Monitor Bool) -> IO Bool -> Monitor Bool
forall a b. (a -> b) -> a -> b
$ String -> IO Bool
fileExist String
file
    if Bool
exists
      then do Maybe ByteString
contents <- IO (Maybe ByteString) -> Monitor (Maybe ByteString)
forall a. IO a -> Monitor a
io (IO (Maybe ByteString) -> Monitor (Maybe ByteString))
-> IO (Maybe ByteString) -> Monitor (Maybe ByteString)
forall a b. (a -> b) -> a -> b
$ IO (Maybe ByteString)
-> (IOException -> IO (Maybe ByteString)) -> IO (Maybe ByteString)
forall e a. Exception e => IO a -> (e -> IO a) -> IO a
catch ((ByteString -> Maybe ByteString)
-> IO ByteString -> IO (Maybe ByteString)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just (IO ByteString -> IO (Maybe ByteString))
-> IO ByteString -> IO (Maybe ByteString)
forall a b. (a -> b) -> a -> b
$ String -> IO ByteString
B.readFile String
file) IOException -> IO (Maybe ByteString)
handleIOError
              case Maybe ByteString
contents of
                Just ByteString
d -> do
                  Int
mdegrees <- ByteString -> ReaderT MConfig IO Int
parse ByteString
d
                  String
temp <- (Int -> String) -> Int -> Monitor String
forall a. (Num a, Ord a) => (a -> String) -> a -> Monitor String
showWithColors Int -> String
forall a. Show a => a -> String
show (Int
mdegrees Int -> Int -> Int
forall a. Integral a => a -> a -> a
`quot` Int
1000)
                  [String] -> Monitor String
parseTemplate [ String
temp ]
                Maybe ByteString
Nothing -> Selector String -> Monitor String
forall a. Selector a -> Monitor a
getConfigValue Selector String
naString
      else Selector String -> Monitor String
forall a. Selector a -> Monitor a
getConfigValue Selector String
naString