X-Git-Url: https://git.martlubbers.net/?a=blobdiff_plain;f=results.itasks.tex;h=3c253174a5102bee304ea5d0e4aea71d002fe99c;hb=0810fd13a4d0701b7191ac4195ae933c4caa3e6d;hp=7a87936eecf225f7012bda2a3901e79a22fc6d6d;hpb=2a4d91380ae0d2a7dfac58b8d5194d57d61af3ae;p=msc-thesis1617.git diff --git a/results.itasks.tex b/results.itasks.tex index 7a87936..3c25317 100644 --- a/results.itasks.tex +++ b/results.itasks.tex @@ -1,13 +1,13 @@ The glue in the system is written in \gls{iTasks}. Functions for managing devices, \glspl{Task} and \glspl{SDS} are created. An interface is made that allows an interactive management console for the \gls{mTask} system. This -interface provides functionality to list shares, add tasks, remove tasks, -administrate devices and view the state of the system. +interface provides functionality to list \glspl{SDS}, add \glspl{Task}, remove +\glspl{Task}, administrate devices and view the state of the system. \section{Integration} When the system starts up the devices residing in the \gls{SDS} must be cleaned -up. It might be the case that they contain tasks, shares or errors. A user or -programmer can then choose to reconnect some devices using the +up. It might be the case that they contain \glspl{Task}, \glspl{SDS} or errors. +A user or programmer can then choose to reconnect some devices using the \CI{connectDevice} function. \begin{lstlisting}[caption={Starting up the devices},% @@ -21,10 +21,11 @@ An image of the management interface is shown in Figure~\ref{lst:manage}. The system management is done by a single \gls{Task} called \CI{mTaskManager}. To manage the system, a couple of different functionalities are needed and are launched. The left sidebar of the interface shows the list of example -\glspl{Task} that are present in the system. When clicking a task, a dialog -opens in which you can select the device to send the task to. The dialog might -contain user specified variables. All example \glspl{mTask} are of the type -\CI{Task (Main (ByteCode () Stmt))} and can thus ask for user input first. +\glspl{Task} that are present in the system. When clicking a \gls{Task}, a +dialog opens in which you can select the device to send the \gls{Task} to. The +dialog might contain user specified variables. All example \glspl{mTask} are of +the type \CI{Task (Main (ByteCode () Stmt))} and can thus ask for user input +first. The bottom panel shows the device information. In this panel, the devices can be created and modified. Moreover, this panel allows the user to reconnect with @@ -50,7 +51,7 @@ Listing~\ref{lst:actualdev} shows the actual types for the device storage. Programmers wanting to access the entire \gls{SDS} use the \CI{deviceStoreNP}. Programmers wanting to access a single \gls{SDS} on a device can use the \CI{getRealShare} function which is a wrapper around the \CI{deviceStore} which -applies a parametric lens. +applies a parametric lens to the \gls{SDS}. \begin{lstlisting}[label={lst:actualdev},% caption={Real types for the device \gls{SDS}}] @@ -63,5 +64,48 @@ getRealShare :: MTaskDevice MTaskShare -> Shared BCValue \end{lstlisting} \subsection{Parametric Lens} -Therefore the main device store -\todo{Semantiek van shares, hoe ze in iTasks zijn, hoe typering} +The type of the parametric lens is \CI{Maybe (MTaskDevice, Int)} where the +\CI{Int} is the identifier of the \gls{SDS}. The \gls{iTasks} way of applying +lenses is through the \CI{sdsFocus} function and through the \CI{sdsLens} +functions. \CI{sdsFocus} allows the programmer to fix the parameter. +\CI{sdsLens} is basically a \CI{mapReadWrite} that has access to the parameter. +This allows the programmer to create filters and lenses. Both of the methods +are not good enough for the device \gls{SDS} because they do not achieve the +writing to the actual device. Writing to a device requires being able to write +to \glspl{SDS}. To solve this problem, a real base \gls{SDS} is created. All +the details are visible in Listing~\ref{shareimpl}. +\todo{elaborate} + +\begin{lstlisting}[label={lst:shareimpl},% + caption={Base share implementation}] +realDeviceStore :: Shared [MTaskDevice] +realDeviceStore = memoryShare "mTaskDevices" [] + +deviceStore :: RWShared (Maybe (MTaskDevice, Int)) [MTaskDevice] [MTaskDevice] +deviceStore = SDSSource {SDSSource | name="deviceStore", read=realRead, write=realWrite} +where + realRead :: (Maybe (MTaskDevice,Int)) *IWorld -> (MaybeError TaskException [MTaskDevice], *IWorld) + realRead p iw = read realDeviceStore iw + + realWrite :: (Maybe (MTaskDevice,Int)) [MTaskDevice] *IWorld + -> (MaybeError TaskException (SDSNotifyPred (Maybe (MTaskDevice,Int))), *IWorld) + realWrite mi w iw + # (merr, iw) = write w realDeviceStore iw + | isError merr || isNothing mi = (merr $> notifyPred mi, iw) + # (Just (dev, ident)) = mi + | ident == -1 = (merr $> notifyPred mi, iw) + = case find ((==)dev) w of + Nothing = (Error $ exception "Device doesn't exist anymore", iw) + Just {deviceShares} = case find (\d->d.identifier == ident) deviceShares of + Nothing = (Error $ exception $ "deviceStore: Share doesn't exist: " +++ toString ident, iw) + Just s = case sendMessagesIW [MTUpd ident s.MTaskShare.value] dev iw of + (Error e, iw) = (Error e, iw) + (Ok _, iw) = (Ok $ notifyPred mi, iw) + + notifyPred :: (Maybe (MTaskDevice, Int)) (Maybe (MTaskDevice, Int)) -> Bool + notifyPred Nothing Nothing = True + notifyPred Nothing (Just _) = False + notifyPred (Just _) Nothing = False + notifyPred (Just (d1, -1)) (Just (d2, _)) = d1 == d2 + notifyPred (Just (d1, i1)) (Just (d2, i2)) = d1 == d2 && i1 == i2 +\end{lstlisting}