+
+deleteDevice :: MTaskDevice -> Task ()
+deleteDevice d = upd (\(r,s,ss)->(r,s,True)) (channels d)
+ >>| maybe (treturn ()) (flip removeTask topLevelTasks) d.deviceTask
+ >>| upd (filter ((==)d)) deviceStore
+ @! ()
+
+sendToDevice :: String (Main (ByteCode () Stmt)) (MTaskDevice, Int) -> Task ()
+sendToDevice wta mTask (device, timeout) =
+ get bcStateStore @ toMessages timeout o toRealByteCode (unMain mTask)
+ >>= \(msgs, st1)->set st1 bcStateStore @ toSDSRecords
+ >>= \sdss->upd ((++)sdss) sdsStore//MTaskShareaddToSDSShare
+ >>| makeShares sdss
+ >>| sendMessage device msgs
+ >>| makeTask wta -1
+ >>= withDevices device o addTask timeout
+ @! ()
+ where
+ sharename i = device.deviceChannels +++ "-" +++ toString i
+ toSDSRecords st = [{MTaskShare |
+ initValue=toInt d1*265 + toInt d2,
+ withTask=wta,
+ identifier=i,
+ realShare="mTaskSDS-" +++ toString i}
+ \\(i,[d1,d2])<-st.sdss]
+ makeShares = foldr (\sh t->set sh.initValue (getSDSStore sh) >>| t) (treturn ())
+
+ addTask :: Int MTaskTask MTaskDevice -> MTaskDevice
+ addTask timeout task device = {device & deviceTasks=[task:device.deviceTasks]}
+
+sendMessage :: MTaskDevice [MTaskMSGSend] -> Task ()
+sendMessage dev msgs = upd (\(r,s,ss)->(r,msgs++s,ss)) (channels dev) @! ()
+
+withDevices :: MTaskDevice (MTaskDevice -> MTaskDevice) -> Task ()
+withDevices a trans = upd (map \b->if (b == a) (trans b) b) deviceStore @! ()
+
+deviceTaskAcked :: MTaskDevice Int -> Task ()
+deviceTaskAcked dev i
+ = withDevices dev (\d->{d&deviceTasks=ackFirst d.deviceTasks})
+ where
+ ackFirst :: [MTaskTask] -> [MTaskTask]
+ ackFirst [] = []
+ ackFirst [t:ts] = if (t.ident == -1)
+ [{t & ident=i}:ts] [t:ackFirst ts]
+
+deviceTaskDelete :: MTaskDevice MTaskTask -> Task ()
+deviceTaskDelete dev task = sendMessage dev [MTTaskDel task.ident]
+
+deviceTaskDeleteAcked :: MTaskDevice Int -> Task ()
+deviceTaskDeleteAcked d i = withDevices d $ deleteTask
+ where deleteTask d = {d & deviceTasks=[s\\s<-d.deviceTasks | i <> s.ident]}