- 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 = listmTasks
+ >&^ \sh->whileUnchanged sh $ \mi->case mi of
+ Nothing = viewInformation "No task selected" [] ()
+ Just mTaskTask = get deviceStore
+ >>= \devices->case devices of
+ [] = viewInformation "No devices yet" [] ()
+ ds = sendmTask mTaskTask ds @! ()
+ where
+ listmTasks :: Task String
+ listmTasks = enterChoiceWithShared "Available mTasks" [ChooseFromList id] mTaskTaskStore
+
+ sendmTask mTaskId ds = enterChoice "Choose Device" [ChooseFromDropdown (\t->t.deviceName)] ds <<@ Title mTaskId
+ >>* [OnAction (Action "Send") (withValue $ sendToDevice mTaskId)]
+
+ sendToDevice mTask device = Just $ viewInformation "" [] device
+
+
+
+ layout = sequenceLayouts
+ [ arrangeWithSideBar 0 LeftSide 260 True
+ , arrangeSplit Vertical True
+ ]
+
+ viewShares :: Task ()
+ viewShares = forever $
+ enterChoiceWithShared "Shares" [ChooseFromList sdsvw] sdsShare
+ >>* [OnValue $ withValue $ Just o updateShare]
+ >>* [OnAction (Action "Back") (const $ Just $ treturn ())]
+ where
+ sdsvw (k, v) = concat ["SDS ", toString k, ": ", toString v]
+ updateShare (k, v) = (viewInformation "Key" [] k
+ ||- updateInformation "Value" [] v)
+
+
+ viewDevices :: [MTaskDevice] -> Task ()
+ viewDevices ds = anyTask [
+ addDevice deviceStore <<@ Title "Add new device" @! ():
+ [viewDevice d <<@ Title d.deviceName\\d<-ds]]
+ <<@ ArrangeWithTabs @! ()
+
+ viewDevice :: MTaskDevice -> Task ()
+ viewDevice d = (viewInformation "Device settings" [] d
+ ||- (case d.deviceConnected of
+ Just s = viewSharedInformation "Channels" [] (channels d.deviceName) @! ()
+ Nothing = viewInformation "No channels yet" [] "" @! ()
+ )) <<@ ArrangeHorizontal
+
+ channels :: String -> Shared Channels
+ channels s = sdsFocus s $ memoryStore "" $ Just ([], [], False)
+
+ sdsShare :: Shared [(Int, Int)]
+ sdsShare = sdsFocus "mTaskSDSs" $ memoryStore "" $ Just [(1, 1)]
+
+ addDevice :: (Shared [MTaskDevice]) -> Task ()
+ addDevice devices = enterInformation "Device type and name" []
+ >>= \(name, ty)->get randomInt @ ((+++) name o toString)
+ >>= \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,deviceTasks=[]}
+
+ 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