{-# LANGUAGE DataKinds #-} {-# LANGUAGE OverloadedRecordDot #-} {-# LANGUAGE OverloadedStrings #-} module Hsm.Status ( StatusEnv(..) , statusEnvDefault , status ) where import Foreign.Ptr (Ptr) import GHC.Records (HasField) import Hsm.GPIO (GPIO(..), LineRequest, active, inactive, setPins) import Hsm.Log qualified as L import Hsm.PWM (PWMChannel(PWM2), PWMHandle, setDutyCycle, setPeriod) data StatusEnv = StatusEnv { gpioError :: GPIO , gpioOK :: GPIO } statusEnvDefault :: StatusEnv statusEnvDefault = StatusEnv {gpioError = GPIO17, gpioOK = GPIO27} status :: HasField "statusEnv" env StatusEnv => Ptr LineRequest -> PWMHandle -> env -> [Bool] -> IO () status lineRequest pwmHandle env signals = do setDutyCycle pwmHandle PWM2 pwmDutyCycle setPeriod pwmHandle PWM2 pwmPeriod if and signals then do logMsg "All signals OK" setPins lineRequest [env.statusEnv.gpioError] inactive setPins lineRequest [env.statusEnv.gpioOK] active else do logMsg "Error signal received" setPins lineRequest [env.statusEnv.gpioError] active setPins lineRequest [env.statusEnv.gpioOK] inactive where logMsg = L.logMsg ["status"] pwmDutyCycle = 1000000000 pwmPeriod = 2000000000