+ processMessages ch msgs sdss = forever (watch ch
+ >>* [OnValue (ifValue (not o isEmpty o fst3) (process ch))])
+ where
+ process :: (Shared ([MTaskMSGRecv],[MTaskMSGSend],Bool)) ([MTaskMSGRecv],[MTaskMSGSend],Bool) -> Task ()
+ process ch (r,_,_) = upd (appFst3 (const [])) ch >>| process` r
+ where
+ process` = foldr (\r t->updateSDSs sdss msgs r >>| t) (return ())
+
+ makeMsgs :: Int (Main (ByteCode () Stmt)) -> ([MTaskMSGSend], [(Int, Shared Int)])
+ makeMsgs timeout bc
+ # (msgs, st) = toMessages timeout (toRealByteCode (unMain bc))
+ = (msgs, map f st.sdss)
+ where
+ f (i,d) = (i, sharedStore ("mTaskSDS-" +++ toString i) 0)
+
+ updateSDSs :: [(Int, Shared Int)] (Shared [String]) MTaskMSGRecv -> Task ()
+ updateSDSs _ m (MTMessage s) = upd (\l->take 20 [s:l]) m @! ()
+ updateSDSs _ _ MTEmpty = return ()
+ updateSDSs [(id, sh):xs] m n=:(MTPub i d)
+ | id == i = set ((toInt d.[0])*265 + toInt d.[1]) sh @! ()
+ = updateSDSs xs m n
+
+ lens :: ([MTaskMSGRecv], [MTaskMSGSend],Bool) -> ([String], [String])
+ lens (r,s,_) = (map toString r, map toString s)
+
+ 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