From: Mart Lubbers Date: Sun, 4 Jun 2017 12:06:24 +0000 (+0200) Subject: add connection diagrams and add todo combinators X-Git-Tag: hand-in~99 X-Git-Url: https://git.martlubbers.net/?a=commitdiff_plain;h=7ca87066ed1f3a962d993a9ac32ab761cfdc05a9;p=msc-thesis1617.git add connection diagrams and add todo combinators --- diff --git a/conclusion.tex b/conclusion.tex index bde2501..94b75ff 100644 --- a/conclusion.tex +++ b/conclusion.tex @@ -25,7 +25,7 @@ broken device without needing to recompile the code. \section{Discussion} \todo{class based shallow doesn't have multiple backend support} -\todo{slow client software because of intepretation} +\todo{slow client software because of interpretation} \todo{What happens if a device dies? Task resending, add to handshake} @@ -67,7 +67,7 @@ given. This idea could be extended to the analysis of stack size and possibly communication bandwidth. With this functionality ever more reliable fail-over -systems can be designed. When the system knows more precise bounds it can +systems can be designed. When the system knows preciser bounds it can allocate more \glspl{Task} on a device whilst staying within safe memory bounds. The resource allocation can be done at runtime within the backend itself or a general backend can be devices that can calculate the resources diff --git a/methods.top.tex b/methods.top.tex index e29f16d..3acfb17 100644 --- a/methods.top.tex +++ b/methods.top.tex @@ -67,6 +67,7 @@ specialization instances for these functions and show an according interface. Generated interfaces can be modified with decoration operators. \section{Combinators} +\todo{check and refine} \Glspl{Task} can be combined using so called \gls{Task}-combinators. Combinators describe relations between \glspl{Task}. \Glspl{Task} can be combined in parallel, sequenced and their result values can be converted to diff --git a/results.arch.tex b/results.arch.tex index 626f0a4..30fbc7a 100644 --- a/results.arch.tex +++ b/results.arch.tex @@ -64,16 +64,19 @@ occurs. All communication goes via these channels. If the system wants to send a message to the device it just puts it in the channels. Messages sent from the client to the server are also placed in there. In the case of the \gls{TCP} device type the \gls{Task} is just a simple wrapper around the existing -\CI{tcpconnect} function in \gls{iTasks}. In case of the serial device type -it uses the newly developed serial port library of \gls{Clean}\footnote{\url{% +\CI{tcpconnect} function in \gls{iTasks}. In case of the serial device type it +uses the newly developed serial port library of \gls{Clean}\footnote{\url{% https://gitlab.science.ru.nl/mlubbers/CleanSerial}}. Besides all the communication information the record also keeps track of the \glspl{Task} currently on the device and the according \glspl{SDS}. Finally it stores the specification of the device that is received when connecting. -All of this is listed in Listing~\ref{lst:mtaskdevice}. +All of this is listed in Listing~\ref{lst:mtaskdevice}. The definitions of the +message format are explained in the following section. \begin{lstlisting}[language=Clean,caption={Device type},label={lst:mtaskdevice}] +deviceStore :: Shared [MTaskDevice] + :: Channels :== ([MTaskMSGRecv], [MTaskMSGSend], Bool) :: MTaskResource = TCPDevice TCPSettings @@ -96,4 +99,65 @@ class MTaskDuplex a where \end{lstlisting} \section{Communication} +All \gls{mTask} messages are encoded following the specification given in +Appendix~\ref{app:communication-protocol}. Available messages are: +\begin{lstlisting}[language=Clean,caption={Available messages}] +:: MTaskMSGRecv + = MTTaskAck Int Int | MTTaskDelAck Int + | MTSDSAck Int | MTSDSDelAck Int + | MTPub Int BCValue | MTMessage String + | MTDevSpec MTaskDeviceSpec | MTEmpty + +:: MTaskMSGSend + = MTTask MTaskInterval String | MTTaskDel Int + | MTShutdown | MTSds Int BCValue + | MTUpd Int BCValue | MTSpec + +:: MTaskInterval = OneShot | OnInterval Int | OnInterrupt Int +\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}, 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 the device functionality heavily +depends on the \CI{withDevices} function that applies a function a device in +the \gls{SDS} when they are equal. Device equality is defined as equality on +their channels. This allows you to give an old device record to the function +and still update the latest instance. Listing~\ref{lst:connectDevice} shows the +connection function. + +\begin{lstlisting}[language=Clean,label={lst:connectDevice},% + caption={Connect a device}] +withDevices :: MTaskDevice (MTaskDevice -> MTaskDevice) -> Task [MTaskDevice] + +connectDevice :: (MTaskDevice (Shared Channels) -> Task ()) MTaskDevice -> Task Channels +connectDevice procFun device = let ch = channels device + in appendTopLevelTask 'DM'.newMap True + (procFun device ch -||- catchAll (getSynFun d.deviceData ch) errHdl) + >>= \tid->withDevices device (\d->{d&deviceTask=Just tid,deviceError=Nothing}) + >>| upd (\(r,s,ss)->(r,s++[MTSpec],ss)) ch + where + errHdl e = withDevices device (\d->{d & deviceTask=Nothing, deviceError=Just e}) @! () +\end{lstlisting} + +Figure~\ref{fig:handshake} shows the connection diagram. The client responds to +the server with their device specification. This is detected by the processing +function and the record is updated accordingly. + +\begin{figure}[H] + \begin{sequencediagram} + \newthread{c}{Server} + \newinst[4]{s}{Client} + \mess{c}{MTSpec}{s} + \mess{s}{MTDevSpec d}{c} + \end{sequencediagram} + \caption{Connect a device}\label{fig:handshake} +\end{figure} + +\subsection{\glspl{Task}} +\subsection{\glspl{SDS}} \todo{Connectie, hoe gaat dat in zijn werk} diff --git a/thesis.pre b/thesis.pre index 896e0c5..7e46909 100644 --- a/thesis.pre +++ b/thesis.pre @@ -15,6 +15,9 @@ \usepackage{float} % floating images \usepackage{lmodern} % Better teletype fonts \usepackage{textcomp} % Nice listings quotes +\usepackage{pgf-umlsd} % Connection diagrams + +\usetikzlibrary{arrows,shadows} \graphicspath{{img/}}