Values can be assigned to all expressions that have an \CI{Upd} role. Examples
of such expressions are \glspl{SDS} and \gls{GPIO} pins. Moreover, class
extensions can be created for specific peripherals such as built-in
\glspl{LED}. The classes facilitating this are shown in
Listing~\ref{lst:sdsio}. In this way the assignment is the same for every
assignable entity.

\begin{lstlisting}[%
	label={lst:sdsio},caption={Input/Output classes}]
:: DigitalPin = D0 | D1 | D2 | D3 | D4 | D5 |D6 | D7 | D8 | D9 | D10 | D11 | D12 | D13
:: AnalogPin  = A0 | A1 | A2 | A3 | A4 | A5
:: UserLED = LED1 | LED2 | LED3

class dIO v where dIO :: DigitalPin -> v Bool Upd
class aIO v where aIO :: AnalogPin -> v Int Upd
class analogRead v where
  analogRead :: AnalogPin -> v Int Expr
  analogWrite :: AnalogPin (v Int p) -> v Int Expr
class digitalRead v where
  digitalRead :: DigitalPin -> v Bin Expr
  digitalWrite :: DigitalPin (v Bool p) -> v Int Expr

:: UserLED = LED1 | LED2 | LED3
class userLed v where
  ledOn  :: (v UserLED q) -> (v () Stmt)
  ledOff :: (v UserLED q) -> (v () Stmt)

class assign v where
  (=.) infixr 2 :: (v t Upd) (v t p) -> v t Expr | ...
\end{lstlisting}

One way of storing data in \gls{mTask}-\glspl{Task} is using \glspl{SDS}.
\glspl{SDS} serve as variables in \gls{mTask} and maintain their value across
executions.  \glspl{SDS} can be used by multiple \glspl{Task} and can be used
to share data. The classes associated with \glspl{SDS} are listed in
Listing~\ref{lst:sdsclass}. The \CI{Main} type is introduced to box an
\gls{mTask} and make it recognizable by the type system by separating programs
and decorations such as \glspl{SDS}.

\begin{lstlisting}[%
	label={lst:sdsclass},caption={\glspl{SDS} in \gls{mTask}}]
:: In a b = In infix 0 a b
:: Main a = {main :: a}

class sds v where
  sds :: ((v t Upd)->In t (Main (v c s))) -> (Main (v c s)) | ...
\end{lstlisting}

In the \emph{Arduino} ecosystem, shields are available to plug into the
microcontroller and add functionality. These shields range from Bluetooth,
WiFi, Ethernet, LoRa, LCD screens and much more. Often the functionality
available in these shields is housed in a \gls{C++} class. This functionality
is ported using little work to \gls{mTask} by just creating a corresponding
class with the same functions. As an example, Listing~\ref{lst:lcd} shows parts
of the \gls{LCD} class as an \gls{mTask} class functions and as
Listing~\ref{lst:lcdc} shown the corresponding \emph{Arduino} class functions.

\begin{lstlisting}[label={lst:lcd},%
	caption={Adding the \gls{LCD} to the \gls{mTask} language}]
:: LCD = ...

class lcd v where
  begin          :: (v LCD Expr) (v Int p) (v Int q) -> v () Expr
  ...
  scrollLeft     :: (v LCD Expr) -> v () Expr
  scrollRight    :: (v LCD Expr) -> v () Expr
  ...
\end{lstlisting}

\begin{lstlisting}[language=C++,label={lst:lcdc},%
	caption={Functions from the \gls{Arduino} \gls{LCD} library}]
class LiquidCrystal {
public:
  void begin(uint8_t cols, uint8_t rows);
  ...
  void scrollDisplayLeft();
  void scrollDisplayRight();
  ...
}
\end{lstlisting}
