{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}
module System.Hardware.Arduino.SamplePrograms.Counter where
import Control.Monad.Trans (liftIO)
import System.Hardware.Arduino
counter :: IO ()
counter :: IO ()
counter = Bool -> FilePath -> Arduino () -> IO ()
withArduino Bool
False FilePath
"/dev/cu.usbmodemFD131" forall a b. (a -> b) -> a -> b
$ do
Pin -> PinMode -> Arduino ()
setPinMode Pin
led PinMode
OUTPUT
Pin -> PinMode -> Arduino ()
setPinMode Pin
bUp PinMode
INPUT
Pin -> PinMode -> Arduino ()
setPinMode Pin
bDown PinMode
INPUT
forall {t} {b}. (Show t, Eq t, Num t) => t -> Arduino b
update (Int
0::Int)
where bUp :: Pin
bUp = Word8 -> Pin
digital Word8
4
bDown :: Pin
bDown = Word8 -> Pin
digital Word8
2
led :: Pin
led = Word8 -> Pin
digital Word8
13
update :: t -> Arduino b
update t
curVal = do
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ forall a. Show a => a -> IO ()
print t
curVal
Pin -> Bool -> Arduino ()
digitalWrite Pin
led (t
curVal forall a. Eq a => a -> a -> Bool
== t
0)
~[Bool
up, Bool
down] <- [Pin] -> Arduino [Bool]
waitAnyHigh [Pin
bUp, Pin
bDown]
let newVal :: t
newVal = case (Bool
up, Bool
down) of
(Bool
True, Bool
True) -> t
curVal
(Bool
True, Bool
False) -> t
curValforall a. Num a => a -> a -> a
+t
1
(Bool
False, Bool
True) -> t
curValforall a. Num a => a -> a -> a
-t
1
(Bool
False, Bool
False) -> t
curVal
t -> Arduino b
update t
newVal