add device shares
[mTask.git] / Tasks / mTaskTask.icl
1 implementation module Tasks.mTaskTask
2
3 import mTask
4 import iTasks
5 import Devices.mTaskDevice
6 import Data.List
7 from Data.Func import $
8
9 import iTasks._Framework.Serialization
10
11 derive class iTask MTaskTask, MTaskInterval, Main, ByteCode, Stmt, Expr, BC, BCState, RWST, Identity
12
13 makeTask :: String Int -> Task MTaskTask
14 makeTask name ident = get currentDateTime
15 @ \dt->{MTaskTask | name=name,ident=ident,dateAdded=dt}
16
17 import StdDebug
18 import StdMisc
19 sendTaskToDevice :: String (Main (ByteCode a Stmt)) (MTaskDevice, MTaskInterval) -> Task MTaskTask
20 sendTaskToDevice wta mTask (device, timeout)
21 # (msgs, newState=:{sdss}) = toMessages timeout mTask device.deviceState
22 # shares = [makeShare wta "" sdsi sdsval\\{sdsi,sdsval}<-sdss, (MTSds sdsi` _)<-msgs | sdsi == sdsi`]
23 = updateShares device ((++) shares)
24 >>| sendMessages msgs device
25 >>| makeTask wta -1
26 >>= \t->upd (addTaskUpState newState t) (deviceShare device)
27 >>| wait "Waiting for task to be acked" (taskAcked t) (deviceShare device)
28 >>| treturn t
29 where
30 addTaskUpState :: BCState MTaskTask MTaskDevice -> MTaskDevice
31 addTaskUpState st task device = { MTaskDevice | device &
32 deviceState=st, deviceTasks=[task:device.deviceTasks]}
33 taskAcked t d = maybe True (\t->t.ident <> -1) $ find (eq t) d.deviceTasks
34 eq t1 t2 = t1.dateAdded == t2.dateAdded &&
35 t1.MTaskTask.name == t2.MTaskTask.name
36
37 liftmTask :: String (Main (ByteCode () Stmt)) (MTaskDevice, MTaskInterval) -> Task ()
38 liftmTask wta mTask c=:(dev, _)= sendTaskToDevice wta mTask c
39 >>= \t->wait "Waiting for mTask to return" (taskRemoved t) (deviceShare dev)
40 >>| viewInformation "Done!" [] ()
41 where
42 taskRemoved t d = isNothing $ find (\t1->t1.ident==t.ident) d.deviceTasks