module example import StdEnv import Data.Func import iTasks import mTask.Interpret import mTask.Interpret.Device.TCP import mTask.Interpret.Device.Serial Start w = doTasks autoHome w arduino = {TTYSettings | zero & devicePath="/dev/ttyACM0"}/*\label{lst:example:spec1}*/ nodeMCU = {TCPSettings | host="192.168.0.1", port=8123, pingTimeout= ?None}/*\label{lst:example:spec2}*/ autoHome :: Task ()/*\label{lst:example:task1}*/ autoHome = withDevice arduino \dev1-> /*\label{lst:example:conn1}*/ withDevice nodeMCU \dev2-> /*\label{lst:example:conn2}*/ parallel [(Embedded, chooseTask dev1 dev2)] [] <<@ ArrangeWithTabs True/*\label{lst:example:par1}*/ >>* [OnAction (Action "Shutdown") (always (shutDown 0))]/*\label{lst:example:task2}\label{lst:example:par2}*/ chooseTask :: MTDevice MTDevice (SharedTaskList ()) -> Task ()/*\label{lst:example:ct1}*/ chooseTask dev1 dev2 stl = tune (Title "Run a task") $ enterChoice [] (zip2 [0..] (map fst tasks)) <<@ Hint "Choose a task" >>? \(i, n)->enterChoice [] ["arduino", "node"]/*\label{lst:example:selectdev}*/ <<@ Hint "Which device?" >>? \device->appendTask Embedded (mkTask n i device) stl >-| chooseTask dev1 dev2 stl where mkTask n i device stl = ((snd (tasks !! i) $ dev) >>* [OnAction ActionClose $ always $ return ()]) <<@ Title n/*\label{lst:example:ct2}*/ where dev = if (device == "node") dev2 dev1 tasks :: [(String, MTDevice -> Task ())]/*\label{lst:example:tasks1}*/ tasks = [ ("temp", \dev-> liftmTask (DHT (DHT_DHT (DigitalPin D6) DHT22) \dht-> {main=temperature dht} ) dev >&> \t->viewSharedInformation [ViewAs \i->toString (fromMaybe 0.0 i) +++ "C"] t <<@ Hint "Current Temperature" @! ()) , ("lightswitch", \dev-> /*\label{lst:example:ls1}*/ withShared False \sh-> liftmTask (lightswitch sh) dev -|| updateSharedInformation [] sh <<@ Hint "Switch")/*\label{lst:example:ls2}*/ , ("remote computation", \dev-> updateInformation [] 5 <<@ Hint "Factorial of what?" >>? \i->liftmTask (factorial i) dev >>- \r->viewInformation [] r <<@ Hint "Result" @! ()) ] factorial :: Int -> Main (MTask v Int) | mtask v factorial i = fun \fac=(\i->If (i ==. lit 0) (lit 1) (i *. fac (i -. lit 1))) In {main=rtrn (fac (lit i))} blink :: Int -> Main (MTask v ()) | mtask v blink d = declarePin D13 PMOutput \d13-> fun \bl=(\st-> writeD d13 st >>|. delay (lit d) >>|. bl (Not st)) In {main=bl true} lightswitch :: (Shared sds Bool) -> Main (MTask v ()) | lowerSds, mtask v & RWShared sds & TC (sds () Bool Bool) lightswitch sh = declarePin D13 PMOutput \d13-> lowerSds \ls=sh In fun \f=(\st-> getSds ls >>*. [IfValue ((!=.)st) (\v->writeD d13 v)] >>|. f (Not st)) In {main=f true}