import iTasks._Framework.IWorld
import iTasks._Framework.Store
+
import TTY
derive class iTask Queue, TTYSettings, Parity, BaudRate, ByteSize
derive class iTask MTaskMSGRecv, MTaskMSGSend, SerTCP, UserLED
-derive class iTask MTaskDevice
-
-:: SerTCP = Serial | TCP
:: *Resource | TTYd !*TTY
+:: Channels :== ([MTaskMSGRecv], [MTaskMSGSend], Bool)
+
+:: SerTCP = SerialDevice | TCPDevice
:: MTaskDevice = {
- deviceConnected :: Maybe (Shared ([String], [String], Bool)),
- deviceName :: String,
- deviceSettings :: Either (String, Int) (String, TTYSettings)
+ deviceConnected :: Maybe String,
+ deviceName :: String
}
Start :: *World -> *World
Start world = startEngine (mTaskManager
>>* [OnAction (Action "Shutdown") (always $ shutDown)]) world
-//Start world = startEngine mTaskTask world
bc :: Main (ByteCode () Stmt)
bc = sds \x=1 In sds \pinnetje=1 In {main =
bc3 d = {main = ledOff d}
:: MTaskDeviceStatus = {connected :: Bool, name :: String}
-derive class iTask MTaskDeviceStatus
+derive class iTask MTaskDeviceStatus, MTaskDevice
mTaskManager :: Task ()
-mTaskManager = forever (addDevice >>= \d->upd (\l->[d:l]) deviceStore)
- ||- viewSharedInformation "Devices" [ViewAs deviceviewer] deviceStore
- ||- whileUnchanged deviceStore (\m->if (isEmpty m)
- (viewInformation "No devices yet" [] "" @! ()) (connectDevice m)) @! ()
+mTaskManager = anyTask
+ [ viewmTasks @! ()
+ , whileUnchanged deviceStore viewDevices
+ , addDevice deviceStore
+ , viewChannels deviceStore
+ ] <<@ ApplyLayout layout
+// ||- whileUnchanged deviceStore (\m->if (isEmpty m)
+// (viewInformation "No devices yet" [] "" @! ()) (connectDevice m)) @! ()
// )
where
- connectDevice :: [MTaskDevice] -> Task ()
- connectDevice [] = treturn ()
- connectDevice [d:ds] = (case d.deviceConnected of
- (Just sh) = viewSharedInformation "Buffers" [] sh @! ()
- Nothing = viewInformation ("Connect " +++ d.deviceName) [] "" >>* [
- OnAction (Action "connect") (const $ Just $ connect d)]
- ) -|| connectDevice ds
-
- connect :: MTaskDevice -> Task ()
- connect d=:{deviceSettings} = withShared ([], [], False) $ \ch->
- case deviceSettings of
- Left (host, port) = syncNetworkChannel host port ch
- Right (dev, sett) = syncSerialChannel dev sett ch
- ||- viewSharedInformation "Buffers" [] ch @! ()
+ isValue (Value _ _) = True
+ isValue _ = False
+
+ viewmTasks = viewInformation "MTasks" [] ""
+
+ layout = sequenceLayouts
+ [ arrangeWithSideBar 0 LeftSide 260 True
+ , arrangeSplit Vertical True
+ , layoutSubs (SelectByPath [1, 0]) arrangeWithTabs
+ ]
+
+ viewChannels :: (Shared [MTaskDevice]) -> Task ()
+ viewChannels sh = whileUnchanged sh (\d->if (isEmpty d)
+ (viewInformation "No channels yet" [] "")
+ (viewInformation "Channels available" [] "")) @! ()
+
+ viewDevices :: [MTaskDevice] -> [Task ()]
+ viewDevices [] = viewInformation "No devices yet" [] "" @! ()
+ viewDevices ds = [viewInformation "Device" [] d <<@ Title d.deviceName\\d<-ds]
+
+ addDevice :: (Shared [MTaskDevice]) -> Task ()
+ addDevice devices = enterInformation "Device type and name" []
+ >>= \(name, ty)->get randomInt
+ >>= \ident->treturn (name +++ toString ident)
+ >>= \realname->let ch = channels realname in case ty of
+ TCPDevice = enterInformation "Hostname and port" []
+ >>= \(host, port)->cont realname name ||- syncNetworkChannel host port ch
+ SerialDevice = accWorld getDevices
+ >>= \dl->(enterChoice "Device" [] dl -&&- updateInformation "Settings" [] zero)
+ >>= \(device, settings)->cont realname name ||- syncSerialChannel device settings ch
+ where
+ cont rn nm = (upd (\l->[dev rn nm:l]) devices >>| addDevice devices)
+ dev rn nm = {deviceConnected=Just rn,deviceName=nm}
+
+ channels :: String -> Shared Channels
+ channels s = sdsFocus s $ memoryStore "" $ Just ([], [], False)
+
+ getDevices :: !*World -> *(![String], !*World)
+ getDevices w = case readDirectory "/dev" w of
+ (Error (errcode, errmsg), w) = abort errmsg
+ (Ok entries, w) = (map ((+++) "/dev/") (filter isTTY entries), w)
+
+ isTTY s = not (isEmpty (filter (flip startsWith s) prefixes))
+ prefixes = ["ttyS", "ttyACM", "ttyUSB", "tty.usbserial"]
+
+// connectDevice :: [MTaskDevice] -> Task ()
+// connectDevice [] = treturn ()
+// connectDevice [d:ds] = (case d.deviceConnected of
+// (Just sh) = viewSharedInformation "Buffers" [] sh @! ()
+// Nothing = viewInformation ("Connect " +++ d.deviceName) [] "" >>* [
+// OnAction (Action "connect") (const $ Just $ connect d)]
+// ) -|| connectDevice ds
deviceviewer :: [MTaskDevice] -> [MTaskDeviceStatus]
deviceviewer ds = [{MTaskDeviceStatus | name = d.deviceName,
allAtOnce t = foldr1 (||-) t @! ()
//allAtOnce = (flip (@!) ()) o foldr1 (||-)
-addDevice :: Task MTaskDevice
-addDevice = enterInformation "Device name" []
- -&&- enterInformation "Device type" []
- >>= \(name, ty)->(case ty of
- TCP = (enterInformation "Host" [] -&&- enterInformation "Port" [])
- >>= treturn o Left
- Serial = accWorld getDevices
- >>= \dl->(enterChoice "Device" [] dl -&&- updateInformation "Settings" [] zero)
- >>= treturn o Right
- ) >>= \set->treturn {MTaskDevice |
- deviceConnected=Nothing,
- deviceName=name,
- deviceSettings=set}
- where
- getDevices :: !*World -> *(![String], !*World)
- getDevices w = case readDirectory "/dev" w of
- (Error (errcode, errmsg), w) = abort errmsg
- (Ok entries, w) = (map ((+++) "/dev/") (filter isTTY entries), w)
- where
- isTTY s = not (isEmpty (filter (flip startsWith s) prefixes))
- prefixes = ["ttyS", "ttyACM", "ttyUSB", "tty.usbserial"]
//mTaskTask :: Task ()
//mTaskTask = let (msgs, sdsShares) = makeMsgs 1000 bc in
whileConnected :: (Maybe String) String ([MTaskMSGRecv], [MTaskMSGSend],Bool) -> (MaybeErrorString String, Maybe ([MTaskMSGRecv],[MTaskMSGSend],Bool), [String], Bool)
whileConnected Nothing acc (msgs,send,sendStopped)
= (Ok acc, Nothing, [], False)
-// = (Ok acc, Just (msgs,[],sendStopped), map encode send, False)
whileConnected (Just newData) acc (msgs,send,sendStopped)
| sendStopped = (Ok acc, Just (msgs ++ [decode newData],[],False), map encode send, False)