+ viewSh :: [(Int, Shared Int)] (Shared ([MTaskMSGRecv],[MTaskMSGSend],Bool)) -> Task ()
+ viewSh [] ch = return ()
+ viewSh [(i, sh):xs] ch
+ # sharename = "SDS-" +++ toString i
+ = (
+ viewSharedInformation ("SDS-" +++ toString i) [] sh ||-
+ forever (
+ enterInformation sharename []
+ >>* [OnAction ActionOk
+ (ifValue (\j->j>=1 && j <= 3)
+ (\c->set c sh
+ >>= \_->sendMsg (toSDSUpdate i c) ch
+ @! ()
+ )
+ )]
+ )
+ ) ||- viewSh xs ch
+
+sendMsg :: [MTaskMSGSend] (Shared ([MTaskMSGRecv],[MTaskMSGSend],Bool)) -> Task ()
+sendMsg m ch = upd (\(r,s,ss)->(r,s ++ m,True)) ch @! ()
+
+syncSerialChannel :: String TTYSettings (Shared ([MTaskMSGRecv],[MTaskMSGSend],Bool)) -> Task ()
+syncSerialChannel dev opts rw = Task eval
+ where
+ eval event evalOpts tree=:(TCInit taskId ts) iworld=:{IWorld|world}
+ = case TTYopen dev opts world of
+ (False, _, world)
+ # (err, world) = TTYerror world
+ = (ExceptionResult (exception err), {iworld & world=world})
+ (True, tty, world)
+ # iworld = {iworld & world=world, resources=Just (TTYd tty)}
+ = case addBackgroundTask 42 (BackgroundTask (serialDeviceBackgroundTask rw)) iworld of
+ (Error e, iworld) = (ExceptionResult (exception "h"), iworld)
+ (Ok _, iworld) = (ValueResult NoValue {TaskEvalInfo|lastEvent=ts,removedTasks=[],refreshSensitive=True} NoRep (TCBasic taskId ts JSONNull False), iworld)
+
+ eval _ _ tree=:(TCBasic _ ts _ _) iworld
+ = (ValueResult NoValue {TaskEvalInfo|lastEvent=ts,removedTasks=[],refreshSensitive=False} NoRep tree, iworld)
+
+ eval event evalOpts tree=:(TCDestroy _) iworld=:{IWorld|resources,world}
+ # (TTYd tty) = fromJust resources
+ # (ok, world) = TTYclose tty world
+ # iworld = {iworld & world=world,resources=Nothing}
+ = case removeBackgroundTask 42 iworld of
+ (Error e, iworld) = (ExceptionResult (exception "h"), iworld)
+ (Ok _, iworld) = (DestroyedResult, iworld)
+
+serialDeviceBackgroundTask :: (Shared ([MTaskMSGRecv],[MTaskMSGSend],Bool)) !*IWorld -> *IWorld
+serialDeviceBackgroundTask rw iworld
+ = case read rw iworld of
+ (Error e, iworld) = abort "share couldn't be read"
+ (Ok (r,s,ss), iworld)
+ # (Just (TTYd tty)) = iworld.resources
+ # tty = writet (map encode s) tty
+ # (ml, tty) = case TTYavailable tty of
+ (False, tty) = ([], tty)
+ (_, tty)
+ # (l, tty) = TTYreadline tty
+ = ([decode l], tty)
+ # iworld = {iworld & resources=Just (TTYd tty)}
+ = case write (r++ml,[],False) rw iworld of
+ (Error e, iworld) = abort "share couldn't be written"
+ (Ok _, iworld) = case notify rw iworld of
+ (Error e, iworld) = abort "share couldn't be notified"
+ (Ok _, iworld) = iworld
+ where
+ writet :: [String] -> (*TTY -> *TTY)
+ writet [] = id
+ writet [x:xs] = writet xs o TTYwrite x
+
+
+syncNetworkChannel :: String Int (Shared ([MTaskMSGRecv], [MTaskMSGSend], Bool)) -> Task ()
+syncNetworkChannel server port channel