import StdDebug
import Devices.mTaskDevice
import iTasks
+from Data.Tuple import appSnd
+from Data.Maybe import fromMaybe
+from Text import class Text(indexOf), instance Text String
derive class iTask TCPSettings
derive gPrint MTaskMSGRecv
getmTaskTCPDevice :: Task MTaskResource
getmTaskTCPDevice = TCPDevice <$> enterInformation "Settings" []
+:: ChD :== ([MTaskMSGRecv], [MTaskMSGSend], Bool)
+
instance MTaskDuplex TCPSettings where
synFun :: TCPSettings (Shared Channels) -> Task ()
- synFun s channels =
- tcpconnect s.host s.port channels {ConnectionHandlers|
+ synFun s channels
+ | not (trace_tn "synFun started") = undef
+ = tcpconnect s.host s.port channels {ConnectionHandlers|
onConnect=onConnect,
- whileConnected=whileConnected,
- onDisconnect=onDisconnect} @! ()
+ onData=onData,
+ onShareChange=onShareChange,
+ onDisconnect=onDisconnect}
+ >>| throw "Device disconnected"
where
- onConnect :: String ([MTaskMSGRecv],[MTaskMSGSend],Bool) -> (MaybeErrorString String, Maybe ([MTaskMSGRecv],[MTaskMSGSend],Bool), [String], Bool)
- onConnect _ (msgs,send,sendStopped) = (Ok "", Just (msgs,[],sendStopped), map encode send, False)
+ onConnect :: String ChD -> (MaybeErrorString String, Maybe ChD, [String], Bool)
+ onConnect acc (msgs,send,sendStopped)
+ | not (trace_tn "onConnect") = undef
+ | isEmpty send = (Ok "", Nothing, [], False)
+ = (Ok "", Just (msgs, [], sendStopped), map encode send, False)
- whileConnected :: (Maybe String) String ([MTaskMSGRecv], [MTaskMSGSend],Bool) -> (MaybeErrorString String, Maybe ([MTaskMSGRecv],[MTaskMSGSend],Bool), [String], Bool)
- whileConnected Nothing _ (_,[],_) = (Ok "", Nothing, [], False)
- whileConnected md _ (msgs,send,sendStopped)
- = (Ok "", Just (msgs++map decode (maybeToList md),[],sendStopped), map encode send, False)
+ onData :: String String ChD -> (MaybeErrorString String, Maybe ChD, [String], Bool)
+ onData newdata acc (msgs,send,True)
+ | not (trace_tn "onData: stop") = undef
+ = (Ok acc, Nothing, [], True)
+ onData newdata acc (msgs,send,sendStopped)
+ | not (trace_tn "onData: notstop") = undef
+ # split = indexOf "\n" newdata
+ | split == -1 = (Ok acc, Just (msgs, send, False), [], False)
+ # newMsg = decode (newdata % (0, split-1))
+ // Recurse with smaller data, empty accumulator and new message
+ = onData (newdata % (split+1, size newdata - split))
+ "" (msgs ++ [newMsg], send, False)
- onDisconnect :: String ([MTaskMSGRecv],[MTaskMSGSend],Bool) -> (MaybeErrorString String, Maybe ([MTaskMSGRecv],[MTaskMSGSend],Bool))
- onDisconnect _ (msgs,send,sendStopped) = (Ok "", Nothing)
+ onShareChange :: String ChD -> (MaybeErrorString String, Maybe ChD, [String], Bool)
+ // Stop!
+ onShareChange acc (msgs,send,True)
+ | not (trace_tn "onSC: stop") = undef
+ = (Ok acc, Nothing, [], True)
+ // Nothing to send
+ onShareChange acc (msgs,[], _) = (Ok acc, Nothing, [], False)
+ // Something to send
+ onShareChange acc (msgs,send, ss)
+ | not (trace_tn "onSC: send") = undef
+ = (Ok acc, Just (msgs,[],ss), map encode send, False)
+
+ onDisconnect :: String ChD -> (MaybeErrorString String, Maybe ChD)
+ onDisconnect _ (msgs,send,_)
+ | not (trace_tn "ondisconnect") = undef
+ = (Ok "", Just ([], [], True))