module System.Hardware.Arduino.SamplePrograms.Pulse where
import Control.Monad (forever)
import Control.Monad.Trans (liftIO)
import System.Hardware.Arduino
pulseInDemo :: IO ()
pulseInDemo :: IO ()
pulseInDemo = Bool -> FilePath -> Arduino () -> IO ()
withArduino Bool
False FilePath
"/dev/cu.usbmodemFD131" forall a b. (a -> b) -> a -> b
$ do
Pin -> PinMode -> Arduino ()
setPinMode Pin
pb PinMode
INPUT
forall {b}. Arduino b
go
where pb :: Pin
pb = Word8 -> Pin
digital Word8
2
go :: Arduino b
go = forall (f :: * -> *) a b. Applicative f => f a -> f b
forever forall a b. (a -> b) -> a -> b
$ do
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ FilePath -> IO ()
putStr FilePath
"Ready, push-and-hold for less than 5 seconds: "
Maybe Int
mbDur <- Pin -> Bool -> Maybe Int -> Arduino (Maybe Int)
pulseIn_hostTiming Pin
pb Bool
True (forall a. a -> Maybe a
Just Int
5000000)
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ FilePath -> IO ()
putStrLn forall a b. (a -> b) -> a -> b
$ case Maybe Int
mbDur of
Maybe Int
Nothing -> FilePath
"Time out!"
Just Int
d -> FilePath
"Button stayed high for: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> FilePath
show Int
d forall a. [a] -> [a] -> [a]
++ FilePath
" micro-seconds"
pulseOutDemo :: IO ()
pulseOutDemo :: IO ()
pulseOutDemo = 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 -> Bool -> Arduino ()
digitalWrite Pin
led Bool
False
forall (f :: * -> *) a b. Applicative f => f a -> f b
forever Arduino ()
trigger
where led :: Pin
led = Word8 -> Pin
digital Word8
13
trigger :: Arduino ()
trigger = do forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ FilePath -> IO ()
putStr FilePath
"Pulse duration? (microseconds) "
FilePath
d <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO IO FilePath
getLine
case forall a. Read a => ReadS a
reads FilePath
d of
[(Int
v, FilePath
"")] -> Pin -> Bool -> Int -> Int -> Arduino ()
pulseOut_hostTiming Pin
led Bool
True Int
0 Int
v
[(Int, FilePath)]
_ -> forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ FilePath -> IO ()
putStrLn FilePath
"Please enter a number."