module miTask import StdDebug, StdMisc from StdFunc import flip import iTasks import mTask import Devices.mTaskDevice import Shares.mTaskShare import Utils.SDS from Text import class Text(startsWith,concat,split,join), instance Text String import qualified Data.Map as DM from Data.Func import $ import Data.Tuple import Data.List import System.Directory import iTasks._Framework.Store import TTY, iTasksTTY derive class iTask UserLED Start :: *World -> *World Start world = startEngine (mTaskManager >>* [OnAction (Action "Shutdown") (always $ shutDown)]) world mTaskMap :: Map String (Main (ByteCode () Stmt)) mTaskMap = 'DM'.fromList [("count", bc), ("ledon", bc2 LED1), ("ledoff", bc3 LED3)] bc :: Main (ByteCode () Stmt) bc = sds \x=1 In sds \pinnetje=1 In {main = IF (digitalRead D3) ( x =. x +. lit 1 :. pub x ) ( noOp ) :. IF (pinnetje ==. lit 1) ( ledOn LED1 ) ( IF (pinnetje ==. lit 2) ( ledOn LED2 ) ( ledOn LED3 ) )} bc2 :: UserLED -> Main (ByteCode () Stmt) bc2 d = {main = ledOn d} bc3 :: UserLED -> Main (ByteCode () Stmt) bc3 d = {main = ledOff d} mTaskManager :: Task () mTaskManager = anyTask [ viewmTasks @! () , whileUnchanged sdsStore viewShares , whileUnchanged deviceStore $ manageDevices process ] <<@ ApplyLayout layout where layout = sequenceLayouts [ arrangeWithSideBar 0 LeftSide 260 True , arrangeSplit Vertical True ] viewmTasks = listmTasks >&^ \sh->whileUnchanged sh $ \mi->forever (case mi of Nothing = viewInformation "No task selected" [] () Just mTaskTask = get deviceStore >>= \devices->case devices of [] = viewInformation "No devices yet" [] () ds = sendmTask mTaskTask ds @! ()) where listmTasks :: Task String listmTasks = enterChoiceWithShared "Available mTasks" [ChooseFromList id] mTaskTaskStore sendmTask mTaskId ds = (enterChoice "Choose Device" [ChooseFromDropdown \t->t.deviceName] ds -&&- enterInformation "Timeout, 0 for one-shot" []) >>* [OnAction (Action "Send") (withValue $ Just o sendToDevice mTaskMap mTaskId)] process :: MTaskDevice (Shared Channels) -> Task () process device ch = forever (watch ch >>* [OnValue ( ifValue (not o isEmpty o fst3) (\t->upd (appFst3 (const [])) ch >>| proc (fst3 t)))]) where proc :: [MTaskMSGRecv] -> Task () proc [] = treturn () proc [m:ms] = (case m of // MTSDSAck i = traceValue (toString m) @! () // MTSDSDelAck i = traceValue (toString m) @! () MTPub i val = getSDSRecord i >>= set (toInt val.[0]*256 + toInt val.[1]) o getSDSStore @! () MTTaskAck i = deviceTaskAcked device i MTTaskDelAck i = deviceTaskDeleteAcked device i @! () MTEmpty = treturn () _ = traceValue (toString m) @! () ) >>| proc ms mapPar :: (a -> Task a) [a] -> Task () mapPar f l = foldr1 (\x y->f x ||- y) l <<@ ArrangeWithTabs @! () allAtOnce t = foldr1 (||-) t @! () //allAtOnce = (flip (@!) ()) o foldr1 (||-)