import iTasksTTY
import TTY
import qualified Data.Map as DM
+import qualified Data.List as DL
import Utils.SDS
import Utils.Devices
connectDevice :: (MTaskDevice (Shared Channels) -> Task ()) MTaskDevice -> Task ()
connectDevice pf d = let ch = channels d in appendTopLevelTask 'DM'.newMap True
(pf d ch -||- catchAll (getSynFun d.deviceData ch) errorHandle)
- >>= \tid->withDevices d (\d->{d&deviceTask=Just tid,deviceError=Nothing}) @! ()
+ >>= \tid->withDevices d (\d->{d&deviceTask=Just tid,deviceError=Nothing})
+ >>| upd (\(r,s,ss)->(r,s++[MTSpec],ss)) ch
+ @! ()
where
errorHandle e = withDevices d (\d->{d&deviceTask=Nothing,deviceError=Just e})
deleteDevice d = upd (\(r,s,ss)->(r,s,True)) (channels d)
>>| maybe (treturn ()) (flip removeTask topLevelTasks) d.deviceTask
>>| upd (filter ((<>)d)) deviceStore
+// >>| upd (removeShares d) sdsStore
@! ()
-sendToDevice :: String (Main (ByteCode () Stmt)) (MTaskDevice, MTaskInterval) -> Task ()
-sendToDevice wta mTask (device, timeout) =
- get bcStateStore @ toMessages timeout o toRealByteCode (unMain mTask)
- >>= \(msgs, st1)->set st1 bcStateStore
- >>| toSDSRecords st1
- >>= \sdss->set sdss sdsStore//MTaskShareaddToSDSShare
- >>| sendMessages msgs device
- >>| makeTask wta -1
- >>= withDevices device o addTask
- @! ()
- where
- sharename i = device.deviceChannels +++ "-" +++ toString i
- toSDSRecords st = sequence "" [makeShare wta sdsi sdsval\\{sdsi,sdspub,sdsval}<-st.sdss]// | sdspub]
-
- addTask :: MTaskTask MTaskDevice -> MTaskDevice
- addTask task device = {device & deviceTasks=[task:device.deviceTasks]}
sendMessages :: [MTaskMSGSend] -> (MTaskDevice -> Task Channels)
sendMessages msgs = upd (\(r,s,ss)->(r,msgs++s,ss)) o channels
ackFirst [t:ts] = if (t.ident == -1)
[{t & ident=i}:ts] [t:ackFirst ts]
+getDevice :: String -> Task MTaskDevice
+getDevice n = get deviceStore @ fromJust o 'DL'.find (\s->s.deviceName == n)
+
deviceTaskDelete :: MTaskDevice MTaskTask -> Task ()
deviceTaskDelete dev task = sendMessages [MTTaskDel task.ident] dev @! ()