aboutsummaryrefslogtreecommitdiff
path: root/hsm-status/Hsm/Status.hs
diff options
context:
space:
mode:
authorPaul Oliver <contact@pauloliver.dev>2025-02-07 17:10:05 +0000
committerPaul Oliver <contact@pauloliver.dev>2025-02-18 20:35:35 +0000
commitab4591cb0e074ce98c24645cdb80cb5012aed566 (patch)
tree98451fa7e042e49ea83f265866754f3f6a3b406f /hsm-status/Hsm/Status.hs
InitialHEADmaster
Diffstat (limited to 'hsm-status/Hsm/Status.hs')
-rw-r--r--hsm-status/Hsm/Status.hs47
1 files changed, 47 insertions, 0 deletions
diff --git a/hsm-status/Hsm/Status.hs b/hsm-status/Hsm/Status.hs
new file mode 100644
index 0000000..94b6351
--- /dev/null
+++ b/hsm-status/Hsm/Status.hs
@@ -0,0 +1,47 @@
+{-# 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