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.
}
\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
\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},%
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`]
>>| 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]}
interface shows the list of example \glspl{Task} that are present in the
system. When clicking a \gls{Task}, a dialog opens in which a device can be
selected to send the \gls{Task} to. The dialog might contain user specified
-variables. All example \gls{mTask}-\glspl{Task} are of the type \CI{Task (Main
-(ByteCode () Stmt))} and can thus ask for user input first if needed for
-parameterized \gls{mTask}-\glspl{Task}. The bottom panel shows the device
-information. In this panel, the devices can be created and modified. Moreover,
-this panel allows the user to reconnect with a device after a restart of the
-server application.
-
-\begin{figure}[H]
+variables. All example \gls{mTask}-\glspl{Task} are of the type
+\CI{Task (Main (ByteCode () Stmt))} and can thus ask for user input first if
+needed for parameterized \gls{mTask}-\glspl{Task}. The bottom panel shows the
+device information. In this panel, the devices can be created and modified.
+Moreover, this panel allows the user to reconnect with a device after a restart
+of the server application.
+
+\begin{figure}[ht]
\centering
\includegraphics[width=\linewidth]{manage}
\caption{The device management interface}\label{lst:manage}