implementation module Tasks.mTaskTask import mTask import iTasks import Devices.mTaskDevice import Data.List from Data.Func import $ import iTasks._Framework.Serialization derive class iTask MTaskTask, MTaskInterval, Main, ByteCode, Stmt, Expr, BC, BCState, RWST, Identity makeTask :: String Int -> Task MTaskTask makeTask name ident = get currentDateTime @ \dt->{MTaskTask | name=name,ident=ident,dateAdded=dt} import StdDebug import StdMisc sendTaskToDevice :: String (Main (ByteCode a Stmt)) (MTaskDevice, MTaskInterval) -> Task MTaskTask sendTaskToDevice wta mTask (device, timeout) # (msgs, newState=:{sdss}) = toMessages timeout mTask device.deviceState # shares = [makeShare wta "" sdsi sdsval\\{sdsi,sdsval}<-sdss, (MTSds sdsi` _)<-msgs | sdsi == sdsi`] = updateShares device ((++) shares) >>| sendMessages msgs device >>| makeTask wta -1 >>= \t->upd (addTaskUpState newState t) (deviceShare device) >>| wait "Waiting for task to be acked" (taskAcked t) (deviceShare device) >>| treturn t where addTaskUpState :: BCState MTaskTask MTaskDevice -> MTaskDevice addTaskUpState st task device = { MTaskDevice | device & deviceState=st, deviceTasks=[task:device.deviceTasks]} taskAcked t d = maybe True (\t->t.ident <> -1) $ find (eq t) d.deviceTasks eq t1 t2 = t1.dateAdded == t2.dateAdded && t1.MTaskTask.name == t2.MTaskTask.name liftmTask :: String (Main (ByteCode () Stmt)) (MTaskDevice, MTaskInterval) -> Task () liftmTask wta mTask c=:(dev, _)= sendTaskToDevice wta mTask c >>= \t->wait "Waiting for mTask to return" (taskRemoved t) (deviceShare dev) >>| viewInformation "Done!" [] () where taskRemoved t d = isNothing $ find (\t1->t1.ident==t.ident) d.deviceTasks