implementation module Devices.mTaskDevice import Generics.gCons import mTaskInterpret import iTasks import iTasksTTY import TTY import qualified Data.Map as DM import Utils import GenBimap import Devices.mTaskSerial import Devices.mTaskTCP import iTasks._Framework.Store from Data.Func import $ derive class iTask MTaskDevice, MTaskResource, MTaskMSGRecv, MTaskMSGSend derive conses MTaskResource, TTYSettings, BaudRate, Parity, ByteSize, TCPSettings derive consName MTaskResource, TTYSettings, BaudRate, Parity, ByteSize, TCPSettings channels :: MTaskDevice -> Shared Channels channels d = memoryShare d.deviceChannels ([], [], False) makeDevice :: String MTaskResource -> Task MTaskDevice makeDevice name res = get randomInt @ \rand->{MTaskDevice |deviceChannels=name +++ toString rand ,deviceName=name ,deviceTasks=[] ,deviceTask=Nothing ,deviceData=res} getSynFun :: MTaskResource -> ((Shared Channels) -> Task ()) getSynFun (TCPDevice t) = synFun t getSynFun (SerialDevice t) = synFun t addDevice :: (Shared [MTaskDevice]) -> Task String addDevice devices = enterChoice "Device type" [] (map consName{|*|} deviceTypes) >&^ \sh->whileUnchanged sh $ \mty->case mty of Nothing = viewInformation "No type selected yet" [] "" Just ty = enterInformation "Name" [] -&&- deviceSettings ty >>= \(name, settings)->makeDevice name settings >>= \dev->appendTopLevelTask 'DM'.newMap True (let ch=channels dev in getSynFun dev.deviceData ch) >>= \tid->upd (\l->[{dev & deviceTask=Just tid}:l]) devices @! "" where deviceSettings "SerialDevice" = getmTaskSerialDevice deviceSettings "TCPDevice" = getmTaskTCPDevice deviceTypes :: [MTaskResource] deviceTypes = conses{|*|}