aboutsummaryrefslogtreecommitdiff
path: root/hsm-status/Hsm/Status.hs
diff options
context:
space:
mode:
Diffstat (limited to 'hsm-status/Hsm/Status.hs')
-rw-r--r--hsm-status/Hsm/Status.hs41
1 files changed, 41 insertions, 0 deletions
diff --git a/hsm-status/Hsm/Status.hs b/hsm-status/Hsm/Status.hs
new file mode 100644
index 0000000..8154611
--- /dev/null
+++ b/hsm-status/Hsm/Status.hs
@@ -0,0 +1,41 @@
+{-# 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
+
+data StatusEnv = StatusEnv
+ { gpioOk :: GPIO
+ , gpioError :: GPIO
+ }
+
+statusEnvDefault :: StatusEnv
+statusEnvDefault = StatusEnv {gpioOk = GPIO17, gpioError = GPIO27}
+
+status ::
+ HasField "statusEnv" env StatusEnv
+ => Ptr LineRequest
+ -> env
+ -> [Bool]
+ -> IO ()
+status lineRequest env signals = do
+ 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"]