1 implementation module Devices.mTaskDevice
3 from StdFunc import flip
9 import qualified Data.Map as DM
13 import Devices.mTaskSerial
14 import Devices.mTaskTCP
15 import iTasks._Framework.Store
17 from Data.Func import $
19 derive class iTask MTaskDevice, MTaskResource, MTaskMSGRecv, MTaskMSGSend
20 derive conses MTaskResource, TTYSettings, BaudRate, Parity, ByteSize, TCPSettings
21 derive consName MTaskResource, TTYSettings, BaudRate, Parity, ByteSize, TCPSettings
23 instance == MTaskDevice where
24 (==) a b = a.deviceChannels == b.deviceChannels
26 channels :: MTaskDevice -> Shared Channels
27 channels d = memoryShare d.deviceChannels ([], [], False)
29 makeDevice :: String MTaskResource -> Task MTaskDevice
30 makeDevice name res = get randomInt @ \rand->{MTaskDevice
31 |deviceChannels=name +++ toString rand
37 getSynFun :: MTaskResource -> ((Shared Channels) -> Task ())
38 getSynFun (TCPDevice t) = synFun t
39 getSynFun (SerialDevice t) = synFun t
41 addDevice :: (Shared [MTaskDevice]) (MTaskDevice (Shared Channels) -> Task ()) -> Task String
42 addDevice devices processFun
43 = enterChoice "Device type" [] (map consName{|*|} deviceTypes)
44 >&^ \sh->whileUnchanged sh $ \mty->case mty of
45 Nothing = viewInformation "No type selected yet" [] ""
46 Just ty = enterInformation "Name" [] -&&- deviceSettings ty
47 >>= \(name, settings)->makeDevice name settings
48 >>= \dev->appendTopLevelTask 'DM'.newMap True (tlt dev)
49 >>= \tid->upd (\l->[{dev & deviceTask=Just tid}:l]) devices
52 tlt dev = let ch = channels dev in processFun dev ch -||- getSynFun dev.deviceData ch
54 deviceSettings "SerialDevice" = getmTaskSerialDevice
55 deviceSettings "TCPDevice" = getmTaskTCPDevice
57 deviceTypes :: [MTaskResource]
58 deviceTypes = conses{|*|}
60 manageDevices :: (MTaskDevice (Shared Channels) -> Task ()) [MTaskDevice] -> Task ()
61 manageDevices processFun ds = anyTask [
62 addDevice deviceStore processFun <<@ Title "Add new device" @! ():
63 [viewDevice d <<@ Title d.deviceName\\d<-ds]]
64 <<@ ArrangeWithTabs @! ()
66 viewDevice :: MTaskDevice -> Task ()
67 viewDevice d = forever $ anyTask
68 [viewInformation "Device settings" [] d @! ()
69 ,viewSharedInformation "Channels" [ViewAs dropEmpty] (channels d) @! ()
71 enterChoice "Delete task on device" [ChooseFromGrid id] d.deviceTasks
72 >>* [OnAction (Action "Delete") $ ifValue (\t->t.ident <> -1) (deviceTaskDelete d)]
74 ] <<@ ArrangeHorizontal
75 >>* [OnAction (Action "Delete Device") (always $ deleteDevice d)]
77 dropEmpty (r,s,ss) = (filter ((=!=)MTEmpty) r,s,ss)
79 deleteDevice :: MTaskDevice -> Task ()
80 deleteDevice d = upd (\(r,s,ss)->(r,s,True)) (channels d)
81 >>| maybe (treturn ()) (flip removeTask topLevelTasks) d.deviceTask
82 >>| upd (filter ((==)d)) deviceStore
85 sendToDevice :: String (Main (ByteCode () Stmt)) (MTaskDevice, MTaskInterval) -> Task ()
86 sendToDevice wta mTask (device, timeout) =
87 get bcStateStore @ toMessages timeout o toRealByteCode (unMain mTask)
88 >>= \(msgs, st1)->set st1 bcStateStore @ toSDSRecords
89 >>= \sdss->upd ((++)sdss) sdsStore//MTaskShareaddToSDSShare
91 >>| sendMessage device msgs
93 >>= withDevices device o addTask
96 sharename i = device.deviceChannels +++ "-" +++ toString i
97 toSDSRecords st = [{MTaskShare |
98 initValue=toInt d1*265 + toInt d2,
101 realShare="mTaskSDS-" +++ toString i}
102 \\(i,[d1,d2])<-st.sdss]
103 makeShares = foldr (\sh t->set sh.initValue (getSDSStore sh) >>| t) (treturn ())
105 addTask :: MTaskTask MTaskDevice -> MTaskDevice
106 addTask task device = {device & deviceTasks=[task:device.deviceTasks]}
108 sendMessage :: MTaskDevice [MTaskMSGSend] -> Task ()
109 sendMessage dev msgs = upd (\(r,s,ss)->(r,msgs++s,ss)) (channels dev) @! ()
111 withDevices :: MTaskDevice (MTaskDevice -> MTaskDevice) -> Task ()
112 withDevices a trans = upd (map \b->if (b == a) (trans b) b) deviceStore @! ()
114 deviceTaskAcked :: MTaskDevice Int -> Task ()
115 deviceTaskAcked dev i
116 = withDevices dev (\d->{d&deviceTasks=ackFirst d.deviceTasks})
118 ackFirst :: [MTaskTask] -> [MTaskTask]
120 ackFirst [t:ts] = if (t.ident == -1)
121 [{t & ident=i}:ts] [t:ackFirst ts]
123 deviceTaskDelete :: MTaskDevice MTaskTask -> Task ()
124 deviceTaskDelete dev task = sendMessage dev [MTTaskDel task.ident]
126 deviceTaskDeleteAcked :: MTaskDevice Int -> Task ()
127 deviceTaskDeleteAcked d i = withDevices d $ deleteTask
128 where deleteTask d = {d & deviceTasks=[s\\s<-d.deviceTasks | i <> s.ident]}