from Data.Func import $
-derive class iTask MTaskDevice, MTaskResource, MTaskDeviceSpec, MTaskMSGRecv, MTaskMSGSend, BCShare
+derive class iTask MTaskDevice, MTaskResource, MTaskMSGRecv, MTaskMSGSend, BCShare
derive conses MTaskResource, TTYSettings, BaudRate, Parity, ByteSize, TCPSettings
derive consName MTaskResource, TTYSettings, BaudRate, Parity, ByteSize, TCPSettings
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 :: 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, MTaskInterval) -> Task ()
-sendToDevice wta mTask (device, timeout) =
- traceValue "starting to send"
- >>| get bcStateStore @ toMessages timeout o toRealByteCode (unMain mTask)
- >>= \(msgs, st1)->traceValue "messages generated"
- >>| set st1 bcStateStore
- >>| traceValue "bcstate store updated"
- >>| toSDSRecords st1
- >>= \sdss->traceValue "Shares created"
- >>| set sdss sdsStore//MTaskShareaddToSDSShare
- >>| traceValue "Shares store updated"
- >>| sendMessages msgs device
- >>| traceValue "Messages sent"
- >>| makeTask wta -1
- >>= \t->traceValue "Task made"
- >>| withDevices device (addTask t)
- >>| traceValue "Tasks share updated"
+ >>| upd (filter ((<>)d)) deviceStore
+// >>| upd (removeShares d) sdsStore
@! ()
- 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
[{t & ident=i}:ts] [t:ackFirst ts]
deviceTaskDelete :: MTaskDevice MTaskTask -> Task ()
-deviceTaskDelete dev task = sendMessages [MTTaskDel task.ident] dev
- >>| upd (\ds->filter ((<>) dev) ds) deviceStore @! ()
+deviceTaskDelete dev task = sendMessages [MTTaskDel task.ident] dev @! ()
deviceTaskDeleteAcked :: MTaskDevice Int -> Task ()
deviceTaskDeleteAcked d i = withDevices d $ deleteTask
where deleteTask d = {d & deviceTasks=[s\\s<-d.deviceTasks | i <> s.ident]}
deviceAddSpec :: MTaskDevice MTaskDeviceSpec -> Task ()
-deviceAddSpec d s = withDevices d $ \r->{r&deviceSpec=Just s}
+deviceAddSpec d s = withDevices d $ \r->{MTaskDevice | r & deviceSpec=Just s}