packages feed

obd-0.1.0.0: src/System/Hardware/ELM327/Car.hs

{-# LANGUAGE NoImplicitPrelude #-}
-- | A generic car data type
module System.Hardware.ELM327.Car where

import Control.Monad.IO.Class (MonadIO, liftIO)
import Control.Monad.Trans.Either (EitherT(..), runEitherT)

import Numeric.Units.Dimensional.Prelude

import System.Hardware.ELM327.Connection (Con)
import System.Hardware.ELM327.Errors (OBDError)
import qualified System.Hardware.ELM327.Connection.OBD as OBD

-- | Some info about the car.
type I m a = m (Either OBDError a)

-- | A monad transform for information about the car.
infoT :: I m a -> EitherT OBDError m a
infoT = EitherT

-- | Run the monad transform for inforamtion about the ar.
runInfoT :: EitherT OBDError m a -> I m a
runInfoT = runEitherT

-- | A car that has some properties.
data Car m = Car { engineCoolantTemperature :: I m (ThermodynamicTemperature Double)
                 , engineFuelRate :: I m (VolumeFlow Double)
                 , engineRPM :: I m (Frequency Double)
                 , intakeAirTemperature :: I m (ThermodynamicTemperature Double)
                 , intakeManifoldAbsolutePressure :: I m (Pressure Double)
                 , massAirFlowRate :: I m (MassFlow Double)
                 , throttlePosition :: I m Double
                 , vehicleSpeed :: I m (Velocity Double) }

-- | The default car, that uses straight forward OBD commands to get
-- most of the data.
defaultCar :: MonadIO m => Con -> Car m
defaultCar c = Car { engineCoolantTemperature = liftIO $ OBD.engineCoolantTemperature c
                   , engineFuelRate = liftIO $ OBD.engineFuelRate c
                   , engineRPM = liftIO $ OBD.engineRPM c
                   , intakeAirTemperature = liftIO $ OBD.intakeAirTemperature c
                   , intakeManifoldAbsolutePressure = liftIO $ OBD.intakeManifoldAbsolutePressure c
                   , massAirFlowRate = liftIO $ OBD.massAirFlowRate c
                   , throttlePosition = liftIO $ OBD.throttlePosition c
                   , vehicleSpeed = liftIO $ OBD.vehicleSpeed c }