Merge branch 'master' of git.martlubbers.net:msc-thesis1617
[msc-thesis1617.git] / arch.communication.tex
index 56cab7c..0bb3746 100644 (file)
@@ -8,7 +8,7 @@ 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.
 
-\begin{lstlisting}[label={lst:avmsg},caption={Available messages}]
+\begin{lstlisting}[language=Clean,label={lst:avmsg},caption={Available messages}]
 :: MTaskId :== Int
 :: MSDSId :== Int
 :: MTaskFreeBytes :== Int
@@ -38,7 +38,7 @@ peripheral availability, the memory available for storing \glspl{Task} and
 \glspl{SDS} and the size of the stack. Not all peripheral flags are shown for
 brevity.
 
-\begin{lstlisting}[label={lst:devicespec},
+\begin{lstlisting}[language=Clean,label={lst:devicespec},
        caption={Device specification for \gls{mTask}-\glspl{Task}}]
 :: MTaskDeviceSpec =
        { haveLed     :: Bool
@@ -51,6 +51,52 @@ brevity.
        }
 \end{lstlisting}
 
+The code on the device generates the specification. When a device does not have
+a specific peripheral, the code will also not be on the device. In the
+interface file, the code for peripherals is always guarded by macros. Thus, if
+the peripheral is not there, the macro is set accordingly and the code will not
+be included. To illustrate this, Listings~\ref{lst:macro}-\ref{lst:macro3}
+show parts of the interface file and device specification generation function
+for the \emph{NodeMCU} microcontroller which only boasts a single analog pin
+and eight digital pins.
+
+\begin{minipage}{.49\textwidth}
+       \begin{lstlisting}[label={lst:macro},language=C,%
+               caption={Specification in the interface}]
+...
+#elif defined ARDUINO_ESP8266_NODEMCU
+#define APINS 1
+#define DPINS 8
+#define STACKSIZE 1024
+#define MEMSIZE 1024
+#define HAVELED 0
+#define HAVEHB 0
+
+#if APINS > 0
+void write_apin(uint8_t p, uint8_t v);
+uint8_t read_apin(uint8_t pin);
+#endif
+       \end{lstlisting}
+\end{minipage}
+\begin{minipage}{.49\textwidth}
+       \begin{lstlisting}[label={lst:macro3},language=C,%
+               caption={Actual generation}]
+...
+void spec_send(void) {
+       write_byte('c');
+       write_byte(0 | (HAVELED << 0)
+                    | (HAVELCD << 1)
+                    | (HAVEHB  << 2)
+                    | ...);
+       write16(MEMSIZE);
+       write16(STACKSIZE);
+       write_byte(APINS);
+       write_byte(DPINS);
+       write_byte('\n');
+}
+       \end{lstlisting}
+\end{minipage}
+
 \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 and
@@ -64,7 +110,7 @@ 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},%
+\begin{lstlisting}[language=Clean,label={lst:connectDevice},%
        caption={Connect a device}]
 process :: MTaskDevice (Shared Channels) -> Task ()
 process device ch = forever $ wait "process" (not o isEmpty o fst3) ch
@@ -78,7 +124,7 @@ where
                MTDevSpec s = deviceAddSpec device s @! ()
                ) >>| proc ms
 
-connectDevice :: MTaskDevice -> Task Channels
+connectDevice :: MTaskDevice -> Task MTaskDevice
 connectDevice device = set ([], [], False) ch
        >>| appendTopLevelTask 'DM'.newMap True
        (       process device ch -||- catchAll (getSynFun device.deviceData ch) errHdl)
@@ -136,7 +182,7 @@ 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
 is updated again and the \gls{Task} returns.
 
-\begin{lstlisting}[label={lst:sendtask},%
+\begin{lstlisting}[language=Clean,label={lst:sendtask},%
        caption={Sending a \gls{Task} to a device}]
 makeTask :: String Int -> Task MTaskTask
 makeTask name ident = get currentDateTime @ \dt->{MTaskTask | name=name, ident=ident, dateAdded=dt}
@@ -175,7 +221,7 @@ residing in the \gls{SDS} must be cleaned up. It might be the case that they
 contain \glspl{Task}, \glspl{SDS} or errors that are no longer applicable in
 this run. A user or programmer can later choose to reconnect to some devices.
 
-\begin{lstlisting}[caption={Starting up the devices},%
+\begin{lstlisting}[language=Clean,caption={Starting up the devices},%
        label={lst:startupdevs}]
 startupDevices :: Task [MTaskDevice]
 startupDevices = upd (map reset) deviceStoreNP
@@ -196,7 +242,7 @@ 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]
+\begin{figure}[ht]
        \centering
        \includegraphics[width=\linewidth]{manage}
        \caption{The device management interface}\label{lst:manage}