implementation module Devices.mTaskTCP
+import GenPrint
+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" []
instance MTaskDuplex TCPSettings where
synFun :: TCPSettings (Shared Channels) -> Task ()
- synFun s channels = catchAll (
+ synFun s channels =
tcpconnect s.host s.port channels {ConnectionHandlers|
onConnect=onConnect,
whileConnected=whileConnected,
- onDisconnect=onDisconnect} @! ())
- (\v->traceValue v @! ())
+ onDisconnect=onDisconnect} @! ()
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 acc (msgs,send,sendStopped) = (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 acc (msgs,send,sendStopped) = (Ok acc, Nothing, [], False)
- whileConnected (Just newData) acc (msgs,send,sendStopped) = (Ok acc, Just (msgs ++ [decode newData],[],False), map encode send, False)
+ //We stop
+ whileConnected _ _ (_,_,True) = (Ok "", Nothing, [], True)
+ //No new data and nothing to send
+ whileConnected Nothing acc (_,[],_) = (Ok acc, Nothing, [], False)
+ //New data and possibly something to send
+ whileConnected newdata acc (msgs,send,sendStopped)
+ # (acc, nd) = process (acc +++ fromMaybe "" newdata)
+ | isEmpty nd && isEmpty send = (Ok acc, Nothing, [], False)
+ = (Ok acc, Just (msgs++map decode nd,[],sendStopped), map encode send, False)
+
+ process :: String -> (String, [String])
+ process s
+ | not (trace_tn ("process: " +++ toString (toJSON s))) = undef
+ = case indexOf "\n" s of
+ -1 = (s, [])
+ i = appSnd (\ss->[s % (0,i-1):ss]) (process (s % (i+1, size s)))
onDisconnect :: String ([MTaskMSGRecv],[MTaskMSGSend],Bool) -> (MaybeErrorString String, Maybe ([MTaskMSGRecv],[MTaskMSGSend],Bool))
- onDisconnect l (msgs,send,sendStopped) = (Ok l, Nothing)
+ onDisconnect _ (msgs,send,sendStopped) = (Ok "", Nothing)