--- /dev/null
+digraph {
+ { rank=same;
+ task1 [label=<device<SUB>1</SUB>>];
+ task2 [label=<device<SUB>2</SUB>>];
+ taskp [label=<device<SUB>...</SUB>>];
+ taskn [label=<device<SUB>n</SUB>>];
+ }
+ { rank=same;
+ dev1 [label=<device<SUB>1</SUB>>];
+ dev2 [label=<device<SUB>2</SUB>>];
+ devp [label=<device<SUB>...</SUB>>];
+ devn [label=<device<SUB>n</SUB>>];
+ }
+ server [label=<Shared [MTaskDevice]>];
+
+ dev1 -> server;
+ dev2 -> server;
+ devp -> server [style=invis];
+ devn -> server;
+}
-/section{Devices}
+\section{Overview}
+The goal of the architecture is to facilitate an ecosystem in which an
+\gls{iTasks}-system can add, change and remove devices at runtime. Moreover,
+the \gls{iTasks}-system can send \glspl{mTask}, compiled at runtime to
+bytecode, to the device. The device runs an interpreter which can execute the
+\gls{Task}'s bytecode. Devices are persistent during reboots of the
+\gls{iTasks}-system. The methods of interacting with \glspl{mTask} is analogous
+to interacting with \gls{iTasks}-\glspl{Task}.
+
+An overview of the architecture is visible in Figure~\ref{fig:system}.
+
+\begin{figure}[H]
+ \centering
+ \includegraphics[width=\linewidth]{system}
+ \caption{Overview of the architecture}\label{fig:system}
+\end{figure}
+
+
+\section{Devices}
The client code for the devices is compiled from one codebase. For a device to
be eligible for \glspl{mTask}, it must be able to compile the shared codebase
and implement (part of) the device specific interface. The shared codebase only
\begin{lstlisting}[label={lst:devicespec},
caption={Device specification for \glspl{mTask}}]
:: MTaskDeviceSpec =
- {haveLed :: Bool
- ,haveAio :: Bool
- ,haveDio :: Bool
- ,bytesMemory :: Int
+ { haveLed :: Bool
+ , haveAio :: Bool
+ , haveDio :: Bool
+ , bytesMemory :: Int
}
\end{lstlisting}