+\subsection{Device Specification}
+The server stores a description for every device available in a record type.
+From the macro settings in the client --- in the interface file--- a profile
+is created that describes the specification of the device. When the connection
+between the server and a client is established, the server will send a request
+for specification. The client serializes its specification and send it to the
+server so that the server knows what the client is capable of. The exact
+specification is shown in Listing~\ref{lst:devicespec} and stores the
+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}[language=Clean,label={lst:devicespec},
+ caption={Device specification for \gls{mTask}-\glspl{Task}}]
+:: MTaskDeviceSpec =
+ { haveLed :: Bool
+ , haveLCD :: Bool
+ , have...
+ , bytesMemory :: Int
+ , stackSize :: Int
+ , aPins :: Int
+ , dPins :: Int
+ }
+\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}
+