X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=arch.communication.tex;h=2472ab7b9fe0fb99456c915d62789cf4dabdc5ab;hb=7b82824c3f3af1d6bc2d9824aae2cc2979ca8180;hp=7da8ad1d76a867468ff3610599ad864cda0a7495;hpb=b8953a28b8a7db87f446bc74a6e6f854e19cd639;p=msc-thesis1617.git diff --git a/arch.communication.tex b/arch.communication.tex index 7da8ad1..2472ab7 100644 --- a/arch.communication.tex +++ b/arch.communication.tex @@ -2,8 +2,8 @@ The communication from the server to the client and vice versa is just a character stream containing encoded \gls{mTask} messages. The \CI{synFun} belonging to the device is responsible for sending the content in the left channel and putting received messages in the right channel. Moreover, the -boolean value should be set to \CI{True} when the connection is terminated. The -specific encoding of the messages is visible in +boolean flag in the channel type should be set to \CI{True} when the connection +is terminated. The specific encoding of the messages is visible in Appendix~\ref{app:communication-protocol}. The type holding the messages is shown in Listing~\ref{lst:avmsg}. Detailed explanation about the message types and according actions will be given in the following subsections. @@ -51,28 +51,40 @@ brevity. } \end{lstlisting} - \subsection{Add a device} A device can be added by filling in the \CI{MTaskDevice} record as much as -possible and running the \CI{connectDevice} function. This function grabs the -channels, starts the synchronization \gls{Task} (\CI{synFun}), makes sure the -errors are handled when needed and runs a processing function in parallel to -react on the incoming messages. Moreover, it sends a specification request to -the device in question to determine the details of the device and updates the -record to contain the top-level \gls{Task}-id. All device functionality -heavily depends on the specific \CI{deviceShare} function that generates an -\gls{SDS} for a specific device. This allows giving an old device record to the -function and still update the latest instance. Listing~\ref{lst:connectDevice} -shows the connection function. +possible and running the \CI{connectDevice} function. This function grabs and +clears the channels, starts the synchronization \gls{Task} (\CI{synFun}), makes +sure the errors are handled when needed and runs a processing function in +parallel to react on the incoming messages. Moreover, it sends a specification +request to the device in question to determine the details of the device and +updates the record to contain the top-level \gls{Task}-id. All device +functionality heavily depends on the specific \CI{deviceShare} function that +generates an \gls{SDS} for a specific device. This allows giving an old device +record to the function and still update the latest instance. +Listing~\ref{lst:connectDevice} shows the connection function. \begin{lstlisting}[label={lst:connectDevice},% caption={Connect a device}] -connectDevice :: (MTaskDevice (Shared Channels) -> Task ()) MTaskDevice -> Task Channels -connectDevice procFun device = set ([], [], False) ch - >>| appendTopLevelTask 'DM'.newMap True - ( procFun device ch -||- catchAll (getSynFun device.deviceData ch) errHdl) - >>= \tid->upd (\d->{d&deviceTask=Just tid,deviceError=Nothing}) (deviceShare device) - >>| upd (\(r,s,ss)->(r,s++[MTSpec],ss)) ch +process :: MTaskDevice (Shared Channels) -> Task () +process device ch = forever $ wait "process" (not o isEmpty o fst3) ch + >>= \(r,s,ss)->upd (appFst3 (const [])) ch >>| proc r +where + proc :: [MTaskMSGRecv] -> Task () + proc [] = treturn () + proc [m:ms] = (case m of + MTPub i val = updateShareFromPublish device i val @! () + ... + MTDevSpec s = deviceAddSpec device s @! () + ) >>| proc ms + +connectDevice :: MTaskDevice -> Task Channels +connectDevice device = set ([], [], False) ch + >>| appendTopLevelTask 'DM'.newMap True + ( process device ch -||- catchAll (getSynFun device.deviceData ch) errHdl) + >>= \tid->upd (\d->{d&deviceTask=Just tid,deviceError=Nothing}) (deviceShare device) + >>| set (r,[MTSpec],ss) ch + >>| treturn device where errHdl e = upd (\d->{d & deviceTask=Nothing, deviceError=Just e}) (deviceShare device) @! () ch = channels device @@ -121,7 +133,7 @@ channel \gls{SDS} of the device. This will result in sending the actual \gls{SDS} specification and \gls{Task} specifications to the device. A \gls{Task} record is created with the identifier $-1$ to denote a \gls{Task} not yet acknowledged. Finally the device itself is updated with the new state -and with the new \gls{Task}. After waiting for the acknowledgement the device +and with the new \gls{Task}. After waiting for the acknowledgement the device is updated again and the \gls{Task} returns. \begin{lstlisting}[label={lst:sendtask},% @@ -132,7 +144,7 @@ makeTask name ident = get currentDateTime @ \dt->{MTaskTask | name=name, ident=i makeShare :: String Int BCValue -> MTaskShare makeShare withTask identifier value = {MTaskShare | withTask=[withTask], identifier=identifier, value=value} -sendTaskToDevice :: String (Main (ByteCode a Stmt)) (MTaskDevice, MTaskInterval) -> Task MTaskTask +sendTaskToDevice :: String (Main (ByteCode a Stmt)) (MTaskDevice, MTaskInterval) -> Task (MTaskTask, [MTaskShare]) sendTaskToDevice wta mTask (device, timeout) # (msgs, newState=:{sdss}) = toMessages timeout mTask device.deviceState # shares = [makeShare wta "" sdsi sdsval\\{sdsi,sdsval}<-sdss, (MTSds sdsi` _)<-msgs | sdsi == sdsi`] @@ -141,7 +153,7 @@ sendTaskToDevice wta mTask (device, timeout) >>| makeTask wta -1 >>= \t->upd (addTaskUpState newState t) (deviceShare device) >>| wait "Waiting for task to be acked" (taskAcked t) (deviceShare device) - >>| treturn t + >>| treturn (t, shares) where addTaskUpState :: BCState MTaskTask MTaskDevice -> MTaskDevice addTaskUpState st task device = {MTaskDevice | device & deviceState=st, deviceTasks=[task:device.deviceTasks]}