Work on report
authorSam Moore <[email protected]>
Sun, 27 Oct 2013 08:39:59 +0000 (16:39 +0800)
committerSam Moore <[email protected]>
Sun, 27 Oct 2013 08:39:59 +0000 (16:39 +0800)
Blergh

reports/final/chapters/Design.tex
reports/final/chapters/Results.tex
reports/final/figures/sensor.svg [new file with mode: 0644]
reports/final/figures/server_overview.pdf [new file with mode: 0644]
reports/final/figures/server_overview.png [new file with mode: 0644]
reports/final/references/refs.bib
reports/final/report.pdf
reports/final/report.tex

index 07da112..090e453 100644 (file)
@@ -1,54 +1,74 @@
 \chapter{Design Implementation}
 
-\section{Overview}
+Figure \ref{} shows the earliest high level design of the software for the system created in the first week of the project. At this stage the options were kept open for specific implementation details. The early design essentially required software to be written for three devices; a client computer (GUI), an experiment server (control over access to the system, interface to the GUI, image processing) and an embedded device (controlling experiment hardware). 
 
-Figure \ref{software_overview.pdf} shows a high level block diagram of the software design.
+
+Figure \ref{} shows the revised diagram at the time of writing this report. To remove an extra layer of complexity it was decided to use a single device (the BeagleBone Black) to play the role of both the experiment server and the embedded device. From a software perspective, this eliminated the need for an entire layer of communication and synchronization. From a hardware perspective, use of the BeagleBone black instead of a Raspberry Pi removed the need to design or source analogue to digital conversion modules.
+
+Another major design change which occured quite early in the project\footnote{about week 2} is the switch from using multiple processes to running a single multithreaded process on the server. After performing some rudimentary testing it became clear that a system of seperate programs would be difficult to implement and maintain. Threads are similar to processes but are able to directly share memory, with the result that much less synchronisation is required in order to transfer information.
+
+\section{Hardware Interfacing}
+
+Figure \ref{} shows the pin out diagram of the BeagleBone black. There are many contradictory pin out diagrams available on the internet; Figure \ref{} was created by the software team after trial and error testing to determine the correct location of each pin.
+
+The final specification of the pins and functions was chosen by the electrical team, although several earlier specifications were rejected  after difficulties controlling the pins in software. These pins are identified in Table \ref{}.
+
+
+\subsection{Calibration Methods}
+
+Calibration of the sensors was done at a fairly late stage in the project and only a small number of test points were taken. With the exception of the microscope (discussed in Section \ref{}), all sensors used in this project produce an analogue output. After conditioning and signal processing, this arrives at an analogue input pin on the BeagleBone as a signal in the range $0\to1.8\text{V}$. 
 
 
 \section{Server Program}
 
-\subsection{Threads}
 
-The Server Program runs as a multithreaded process under a POSIX compliant GNU/Linux operating system\footnote{Tested on Debian and Ubuntu}. Each thread runs in parallel and is dedicated to a particular task; all threads share the same memory and rescources. The three types of threads we have implemented are:
+\subsection{Threads and Sampling Rates}
+
+The Server Program runs as a multithreaded process under a POSIX compliant GNU/Linux operating system\footnote{Tested on Debian and Ubuntu}. Each thread runs in parallel and is dedicated to a particular task; the three types of threads we have implemented are:
 \begin{enumerate}
-  \item Main Thread\ref{} - A single thread which accepts and responds to HTTP requests passed to the program by the HTTP server
-  \item Sensor Thread\ref{} - Each sensor in the system is monitored by a single thread
-  \item Actuator Thread\ref{} - Each actuator in the system is controlled by a single thread
+  \item Main Thread\ref{} - Starts all other threads, accepts and responds to HTTP requests passed to the program by the HTTP server in the \verb/FastCGI_Loop/ function.
+  \item Sensor Thread\ref{} - Each sensor in the system is monitored by an individual thread running the \verb/Sensor_Loop/ function.
+  \item Actuator Thread\ref{} - Each actuator in the system is controlled by an individual thread running the \verb/Actuator_Loop/ function.
 \end{enumerate}
 
-In reality, threads do not run simultaneously; the operating system is responsible for sharing execution time between threads in the same way as it shares execution times between processes. Because the linux kernel is not deterministic, it is not possible to predict when a given thread is actually running. This renders it impossible to maintain a consistent sampling rate, and necessitates the use of time stamps whenever a data point is recorded.
+
+In reality, threads do not run simultaneously; the operating system is responsible for sharing execution time between threads in the same way as it shares execution times between processes. Because the linux kernel is not deterministic, it is not possible to predict when a given thread is actually running. This renders it impossible to maintain a consistent sampling rate, and necessitates the use of time stamps whenever a data point is recorded. 
 
 Figure \ref{} shows a distribution of times between samples for a test sensor with the software sampling as fast as possible. 
 Figure \ref{} shows the distribution when the sampling rate is set to 20Hz. Caution should be taken when interpreting these results, as they rely on the accuracy of timestamps recorded by the same software that is being time sliced by the operating system.
 
+RTLinux is a version of the linux kernel that attempts to increase the predictability of when a process will have control\cite{rtlinux}. It was not possible to obtain a real time linux kernel for the BeagleBone. However, testing on an amd64 laptop (figure \ref{}) showed very little difference in the sampling time distribution when the real time linux kernel was used.
 
-RTLinux is a version of the linux kernel that attempts to increase the predictability of when a process will have control\cite{rtlinux}. It was not possible to obtain a real time linux kernel for the BeagleBone. However, testing on an amd64 laptop showed very little difference in the sampling time distribution when the real time linux kernel was used.
 
 
 
-\subsection{Safety Mechanisms}
 
+\subsection{Main Thread}
+
+The main thread of the process is responsible for transfering data between the server and the client through the Hypertext Transmission Protocol (HTTP). A library called FastCGI is used to interface with an existing webserver called nginx\cite{nginx}. This configuration and the format of data transferred between the GUI and the server is discussed in more detail Section \ref{}.
 
+Essentially, the main thread of the process responds to HTTP requests. The GUI is designed to send requests periodically (eg: to update a graph) or when a user action is taken (eg: changing the pressure setting). When this is received, the main thread parses the request, the requested action is performed, and a response is sent. The GUI is then responsible for updating its appearance or alerting the user based on this response. Figure \ref{server_overview.png} gives an overview of this process.
 
-\subsection{Sensors}
+
+\subsection{Sensor Threads}
 
 Figure \ref{sensor_thread.pdf} shows a flow chart for the thread controlling an individual sensor. This process is implemented by \verb/Sensor_Loop/ and associated helper functions.
 
-All sensors are treated as returning a single floating point number when read. A \verb/DataPoint/ consists of a time stamp and the sensor value. \verb/DataPoint/s are continously saved to a file as long as the experiment is in process. An appropriate HTTP request (see section\ref{}) will cause the main thread of the server program to respond with \verb/DataPoint/s read back from the file. By using independent threads for reading data and transferring it to the GUI, the system does not rely on maintaining a consistent and synchronised network connection. This means that a user can safely close the GUI or even shutdown their computer and return to the experiment later without losing any data.
+All sensors are treated as returning a single floating point number when read. A \verb/DataPoint/ consists of a time stamp and the sensor value. \verb/DataPoint/s are continously saved to a binary file as long as the experiment is in process. An appropriate HTTP request (see section\ref{}) will cause the main thread of the server program to respond with \verb/DataPoint/s read back from the file. By using independent threads for reading data and transferring it to the GUI, the system does not rely on maintaining a consistent and synchronised network connection. This means that one the experiment is started with the desired parameters, a user can safely close the GUI or even shutdown their computer without impacting on the operation of the experiment.
 
 
 
-As the chart indicates, the processes of actually controlling sensor hardware has been abstracted out of the control loop. A \verb/Sensor/ structure is defined in \verb/sensor.h/ to represent a single sensor. When this structure is initialised, function pointers must be provided; these functions can then be called by \verb/Sensor_Loop/ as needed. All functions related to control over specific sensor hardware can be found in the files within the \verb/sensors/ sub directory.
+As Figure \ref{sensor_thread.pdf} indicates, the processes of actually controlling sensor hardware has been abstracted out of the control loop. A \verb/Sensor/ structure is defined in \verb/sensor.h/ to represent a single sensor. When this structure is initialised, function pointers must be provided; these functions can then be called by \verb/Sensor_Loop/ as needed. All functions related to control over specific sensor hardware can be found in the files within the \verb/sensors/ sub directory.
 
 Earlier versions of the software instead used a \verb/switch/ statement based on the \verb/Sensor/'s id number to determine how to obtain the sensor value. This was found to be difficult to maintain as the number and types of sensors supported by the software were increased.
 
 
 
-\subsection{Actuators}
+\subsection{Actuator Threads}
 
 Actuators are controlled by threads in a similar way to sensors. Figure \ref{actuator_thread.pdf} shows a flow chart for these threads. This is implemented in \verb/Actuator_Loop/. Control over real hardware is seperated from the main logic in the same way as sensors (relevant files are in the \verb/actuators/ sub directory). The use of threads to control actuators gives similar advantages in terms of eliminating the need to syncronise the GUI and server software.
 
-The actuator thread has been designed for flexibility in how exactly an actuator is controlled. Rather than specifying a single value, the main thread initialises a structure that determines the behaviour of the actuator over a period of time. The current structure represents a simple set of discrete linear changes in the actuator value. This means that a user does not need to specify every single value for the actuator. The Actuator thread stores a value every time the actuator is changed to make it easy to compare the user settings
+The actuator thread has been designed for flexibility in how exactly an actuator is controlled. Rather than specifying a single value, the main thread initialises a structure that determines the behaviour of the actuator over a period of time. The current structure represents a simple set of discrete linear changes in the actuator value. This means that a user does not need to specify every single value for the actuator. The Actuator thread stores a value every time the actuator is changed which can be requested in a similar way to sensor data.
 
 
 
@@ -62,30 +82,55 @@ Several alternate means of data storage were considered for this project. Binary
 
 The \verb/Login_Handler/ function is called in the main thread when a HTTP request for authentication is received. This function checks the user's credentials and will give them access to the system if they are valid.
 
+
 Whilst we had originally planned to include only a single username and password, changing client requirements forced us to investigate many alternative authentication methods to cope with multiple users.
 
 Several authentication methods are supported by the server; the method to use can be specified as an argument when the server is started.
 \begin{enumerate}
-  \item Unix style authentication
-  Unix like operating systems store a plain text file (/etc/shadow) of usernames and encrypted passwords. To check a password is valid, it is encrypted and then compared to the stored encrypted password. The actual password is never stored anywhere. The /etc/shadow file must be maintained by shell commands on the beaglebone.
+  \item {\bf Unix style authentication}
+
+
+  Unix like operating systems store a plain text file (/etc/shadow) of usernames and encrypted passwords. To check a password is valid, it is encrypted and then compared to the stored encrypted password. The actual password is never stored anywhere. The /etc/shadow file must be maintained by shell commands run directly from the beaglebone. Alternatively a web based system to upload a similar file may be created.
+
+  \item {\bf Lightweight Directory Access Protocol (LDAP)}
+
+  LDAP is a widely used data base for storing user information. A central server is required to maintain the LDAP database; programs running on the same network can query the server for authentication purposes.
 
-  \item Lightweight Directory Access Protocol (LDAP)
-  LDAP is a widely used data base for storing user information. A program that uses LDAP for authentication can query an LDAP server over a network; the LDAP server will respond indicating if the user and password match those stored in its database.
+  The UWA user management system (pheme) employs an LDAP server for storing user information and passwords. The software has been designed so that it can interface with an LDAP server configured similarly to the server on UWA's network. Unfortunately we were unable to gain permission to query this server. However an alternative server could be setup to provide this authentication mechanism for our system.
+
+
+  \item {\bf MySQL Database}
+
+       MySQL is a popular and free database system that is widely used in web applications. The ability to search for a user in a MySQL database and check their encrypted password was added late in the design as an alternative to LDAP. There are several existing online user management systems which interface with a MySQL database, and so it is feasable to employ one of these to maintain a list of users authorised to access the experiment. UserCake is recommended, as it is both minimalistic and open source, so can be modified to suit future requirements.
+
+
+  MySQL and other databases are vulnerable to many different security issues which we did not have sufficient time to fully explore. Care should be taken to ensure that all these issues are addressed before deploying the system.
 
-  The UWA user management system (pheme) employs an LDAP server for storing user information and passwords. The software has been designed so that it can interface with an LDAP server configured similarly to the server on UWA's network. Unfortunately we were unable to gain permission to query this server.
 
-  \item MySQL Database
-  BLARGH
 
-  MySQL databases are vulnerable to many different security issues. Care should be taken to ensure that all these issues are addressed before deploying the system.
 \end{enumerate}
 
-\subsection{Server API}
+\subsection{Safety Mechanisms}
+
+Given the inexperienced nature of the software team, the limited development time, and the unclear specifications, it is not wise to trust safety aspects of the system to software alone. It should also be mentioned that the correct functioning of the system is reliant not only upon the software written during this project, but also the many libraries which are used, and the operating system under which it runs. We found during development that many of the mechanisms for controlling BeagleBone hardware are unreliable and have unresolved issues. We attempted to incorporate safety mechanisms into the software wherever possible.
+
+Sensors and Actuators should define an initialisation and cleanup function. For an actuator (eg: the pressure regulator), the cleanup function must set the actuator to a predefined safe value (in the case of pressure, atmospheric pressure) before it can be deinitialised. In the case of a software error or user defined emergency, the \verb/Fatal/ function can be called from any point in the software; this will lead to the cleanup functions of devices being called, which will in turn lead to the pressure being set to a safe value. The cleanup functions will also be called if the software exits unexpectedly.
+
+Sensors and Actuators are designed to include a \verb/sanity/ function which will check a reading or setting is safe respectively. These checks occur whenever a sensor value is read or an actuator is about to be set. In the case of a sensor reading failing the sanity check, \verb/Fatal/ is called immediately and the software shuts down the experiment. In the case of an actuator being set to an unsafe value the software will simply refuse to set the value.
+
 
 \subsection{Performance}
 
 Figure \ref{} shows the CPU and memory usage of the server program with different numbers of dummy sensor threads. This gives an idea of how well the system would scale if all sensors were run on the same BeagleBone.
 
+\begin{figure}[H]
+       \centering
+       \includegraphics[width=1.0\textwidth]{figures/server_overview.png}
+       \caption{Server overview} 
+       \label{server_overview.png}
+\end{figure}
+
+
 \pagebreak
 \begin{figure}[H]
        \centering
@@ -107,6 +152,8 @@ Figure \ref{} shows the CPU and memory usage of the server program with differen
 
 \section{Client Program}
 
+
+
 \subsection{Human Computer Interaction}
 
 \subsection{Interaction with API}
index b0d7e5c..4a65f35 100644 (file)
@@ -2,8 +2,17 @@
 
 \section{Results}
 
+\subsection{Calibration}
+
+\subsection{Server Performance}
+
+\subsection{Customer Satisfaction}
+
+No matter what we did, no one was satisfied.
+
 \section{Conclusion}
 
+
 \section{Recommendations}
 
 
diff --git a/reports/final/figures/sensor.svg b/reports/final/figures/sensor.svg
new file mode 100644 (file)
index 0000000..ec190d6
--- /dev/null
@@ -0,0 +1 @@
+<svg xmlns:gliffy="http://www.gliffy.com" xmlns:x="http://ns.adobe.com/Extensibility/1.0/" xmlns:i="http://ns.adobe.com/AdobeIllustrator/10.0/" xmlns:graph="http://ns.adobe.com/Graphs/1.0/" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="721" height="1078"><rect stroke="#000000" stroke-width="0" fill="#ffffff" x="0" y="0" width="720" height="1077"/><g transform='translate(397.0,276.0) rotate(0.0 50.0 50.0)'><polygon  points="50.0,0 100.0,50.0 50.0,100.0 0,50.0" stroke="#90b328" stroke-width="2" fill="#c6dd58"/><g  transform='translate(0.0,47.0)'><text x='50.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#1C210C' >Is Experiment</tspan></text><text x='50.0' style='text-anchor: middle' y='12.8'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#1C210C' >Running</tspan></text></g></g><g transform='translate(397.0,396.25) rotate(0.0 50.0 31.25)'><rect width="100.0" height="62.5" stroke="#0e75ab" stroke-width="2" fill="#0099cc"/><g  transform='translate(0.0,36.25)'><text x='50.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#FFFFFF' >Get Sensor Value</tspan></text></g></g><g transform='translate(532.5,405.0) rotate(0.0 27.5 22.5)'><polygon points="9.166666666666666,0 64.16666666666667,0 45.833333333333336,45.0 -9.166666666666666,45.0" stroke="#aaaaaa" stroke-width="2" fill="#eeeeee"/><g  transform='translate(0.0,19.5)'><text x='27.5' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#000000' >Sensor</tspan></text><text x='27.5' style='text-anchor: middle' y='12.8'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#000000' >Value</tspan></text></g></g><g transform='translate(397.0,486.0) rotate(0.0 50.0 50.0)'><polygon  points="50.0,0 100.0,50.0 50.0,100.0 0,50.0" stroke="#90b328" stroke-width="2" fill="#c6dd58"/><g  transform='translate(0.0,55.0)'><text x='50.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#1C210C' >Success?</tspan></text></g></g><g transform='translate(447.0,376.0)'><path d='M0.0,0.0 Q0.0,6.5 0.0,10.0 Q0.0,13.5 0.0,20.0 ' stroke-dasharray='23, 0' fill='none' stroke='#000000' stroke-width='2' /><g transform='translate(0.0,0.0)'></g></g><g transform='translate(447.0,458.5)'><path d='M0.0,0.0 Q0.0,9.0 0.0,13.75 Q0.0,18.5 0.0,27.5 ' stroke-dasharray='23, 0' fill='none' stroke='#000000' stroke-width='2' /><g transform='translate(0.0,27.5) rotate(270.0)'><polygon points='3.0,0 9.0,-3.0 9.0,3.0' fill='#000000' stroke='#000000' stroke-width='2.0' /></g><g transform='translate(0.0,0.0)'></g></g><g transform='translate(252.5,511.0) rotate(0.0 50.0 25.0)'><path d="M25.0,0 L75.0,0 Q100.0,0 100.0,25.0 Q100.0,50.0 75.0,50.0 L25.0,50.0 L0,25.0 L25.0,0 Z" stroke="#aaaaaa" stroke-width="2" fill="#eeeeee"/><g  transform='translate(0.0,30.0)'><text x='50.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#000000' >Log Error</tspan></text></g></g><g transform='translate(22.0,22.5) rotate(0.0 50.0 50.0)'><path d='M0.0,0.0L79.68127490039839,0.0L79.68127490039839,69.7211155378486Q59.7609561752988,49.800796812749,39.840637450199196,69.7211155378486Q19.920318725099598,89.6414342629482,0.0,69.7211155378486L0.0,0.0' stroke="#0e75ab" stroke-width="2.0" fill="#0099cc"/><path d='M9.960159362549799,9.960159362549799L89.6414342629482,9.960159362549799L89.6414342629482,79.68127490039839Q69.7211155378486,59.7609561752988,49.800796812749,79.68127490039839Q29.8804780876494,99.601593625498,9.960159362549799,79.68127490039839L9.960159362549799,9.960159362549799' stroke="#0e75ab" stroke-width="2.0" fill="#0099cc"/><path d='M19.920318725099598,19.920318725099598L99.601593625498,19.920318725099598L99.601593625498,89.6414342629482Q79.68127490039839,69.7211155378486,59.7609561752988,89.6414342629482Q39.840637450199196,109.5617529880478,19.920318725099598,89.6414342629482L19.920318725099598,19.920318725099598' stroke="#0e75ab" stroke-width="2.0" fill="#0099cc"/><g  transform='translate(0.0,40.0)'><text x='50.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#FFFFFF' >"sensor.h"</tspan></text><text x='50.0' style='text-anchor: middle' y='12.8'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#FFFFFF' >"sensor.c"</tspan></text><text x='50.0' style='text-anchor: middle' y='27.6'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#FFFFFF' >"sensors"</tspan></text></g></g><g transform='translate(249.0,160.5) rotate(0.0 50.0 37.5)'><polygon points="25.0,0 75.0,0 100.0,37.5 75.0,75.0 25.0,75.0 0,37.5" stroke="#0e75ab" stroke-width="2" fill="#0099cc"/><g  transform='translate(0.0,42.5)'><text x='50.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#FFFFFF' >Initialise</tspan></text></g></g><g transform='translate(402.5,621.0) rotate(0.0 50.0 37.5)'><rect width="100.0" height="75.0" stroke="#0e75ab" stroke-width="2" fill="#0099cc"/><g  transform='translate(0.0,34.5)'><text x='50.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#FFFFFF' >Check Va</tspan><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#FFFFFF' >lue is</tspan></text><text x='50.0' style='text-anchor: middle' y='12.8'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#FFFFFF' >Safe</tspan></text></g></g><g transform='translate(404.5,721.0) rotate(0.0 50.0 50.0)'><polygon  points="50.0,0 100.0,50.0 50.0,100.0 0,50.0" stroke="#90b328" stroke-width="2" fill="#c6dd58"/><g  transform='translate(0.0,55.0)'><text x='50.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#1C210C' >Safe?</tspan></text></g></g><g transform='translate(557.5,733.5) rotate(0.0 50.0 37.5)'><rect width="100.0" height="75.0" stroke="#0e75ab" stroke-width="2" fill="#0099cc"/><line x1="10" y1="0" x2="10" y2="75.0"  stroke="#0e75ab" stroke-width="2" fill="#0099cc"/><line x1="90.0" y1="0" x2="90.0" y2="75.0"  stroke="#0e75ab" stroke-width="2" fill="#0099cc"/><g  transform='translate(0.0,34.5)'><text x='50.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#FFFFFF' font-weight='bold' >EMERGENCY</tspan></text><text x='50.0' style='text-anchor: middle' y='12.8'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#FFFFFF' font-weight='bold' >STOP</tspan></text></g></g><g transform='translate(264.0,732.5) rotate(0.0 50.0 37.5)'><rect width="100.0" height="75.0" stroke="#0e75ab" stroke-width="2" fill="#0099cc"/><g  transform='translate(0.0,34.5)'><text x='50.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#FFFFFF' >Record</tspan></text><text x='50.0' style='text-anchor: middle' y='12.8'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#FFFFFF' >Time stamp</tspan></text></g></g><g transform='translate(447.0,586.0)'><path d='M0.0,0.0 Q0.0,12.0 0.0,17.75 Q0.0,23.5 0.0,35.5 ' stroke-dasharray='23, 0' fill='none' stroke='#000000' stroke-width='2' /><g transform='translate(0.0,35.5) rotate(270.0)'><polygon points='3.0,0 9.0,-3.0 9.0,3.0' fill='#000000' stroke='#000000' stroke-width='2.0' /></g><g transform='translate(0.0,0.0)'></g></g><g transform='translate(452.5,696.0)'><path d='M0.0,0.0 Q0.0,8.5 0.0,12.5 Q0.0,16.5 0.0,25.0 ' stroke-dasharray='23, 0' fill='none' stroke='#000000' stroke-width='2' /><g transform='translate(0.0,25.0) rotate(270.0)'><polygon points='3.0,0 9.0,-3.0 9.0,3.0' fill='#000000' stroke='#000000' stroke-width='2.0' /></g><g transform='translate(0.0,0.0)'></g></g><g transform='translate(404.5,770.0)'><path d='M0.0,0.0 Q-13.5,0.0 -20.25,0.0 Q-27.0,0.0 -40.5,0.0 ' stroke-dasharray='23, 0' fill='none' stroke='#000000' stroke-width='2' /><g transform='translate(-40.5,0.0) rotate(360.0)'><polygon points='3.0,0 9.0,-3.0 9.0,3.0' fill='#000000' stroke='#000000' stroke-width='2.0' /></g><g transform='translate(0.0,0.0)'></g></g><g transform='translate(497.0,427.5)'><path d='M0.0,0.0 Q11.5,0.0 17.5,0.0 Q23.5,0.0 35.0,0.0 ' stroke-dasharray='23, 0' fill='none' stroke='#000000' stroke-width='2' /><g transform='translate(0.0,0.0) rotate(0.0)'><polygon points='3.0,0 9.0,-3.0 9.0,3.0' fill='#000000' stroke='#000000' stroke-width='2.0' /></g><g transform='translate(0.0,0.0)'></g></g><g transform='translate(397.0,536.0)'><path d='M0.0,0.0 Q-15.0,0.0 -22.25,0.0 Q-29.5,0.0 -44.5,0.0 ' stroke-dasharray='23, 0' fill='none' stroke='#000000' stroke-width='2' /><g transform='translate(-44.5,0.0) rotate(360.0)'><polygon points='3.0,0 9.0,-3.0 9.0,3.0' fill='#000000' stroke='#000000' stroke-width='2.0' /></g><g transform='translate(0.0,0.0)'></g></g><g transform='translate(404.5,870.0) rotate(0.0 50.0 25.0)'><path d="M25.0,0 L75.0,0 Q100.0,0 100.0,25.0 Q100.0,50.0 75.0,50.0 L25.0,50.0 L0,25.0 L25.0,0 Z" stroke="#aaaaaa" stroke-width="2" fill="#eeeeee"/><g  transform='translate(0.0,30.0)'><text x='50.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#000000' >Log Warning</tspan></text></g></g><g transform='translate(454.5,821.0)'><path d='M0.0,0.0 Q0.0,16.5 0.0,24.5 Q0.0,32.5 0.0,49.0 ' stroke-dasharray='23, 0' fill='none' stroke='#000000' stroke-width='2' /><g transform='translate(0.0,49.0) rotate(270.0)'><polygon points='3.0,0 9.0,-3.0 9.0,3.0' fill='#000000' stroke='#000000' stroke-width='2.0' /></g><g transform='translate(0.0,0.0)'></g></g><g transform='translate(144.0,720.0) rotate(0.0 50.0 50.0)'><polygon  points="50.0,0 100.0,50.0 50.0,100.0 0,50.0" stroke="#90b328" stroke-width="2" fill="#c6dd58"/><g  transform='translate(0.0,40.0)'><text x='50.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#1C210C' >Collected</tspan></text><text x='50.0' style='text-anchor: middle' y='12.8'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#1C210C' >enough points to</tspan></text><text x='50.0' style='text-anchor: middle' y='27.6'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#1C210C' >average?</tspan></text></g></g><g transform='translate(22.0,732.5) rotate(0.0 50.0 37.5)'><rect width="100.0" height="75.0" stroke="#0e75ab" stroke-width="2" fill="#0099cc"/><g  transform='translate(0.0,42.5)'><text x='50.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#FFFFFF' >Store Data</tspan></text></g></g><g transform='translate(244.0,770.0)'><path d='M0.0,0.0 Q6.5,0.0 10.0,0.0 Q13.5,0.0 20.0,0.0 ' stroke-dasharray='23, 0' fill='none' stroke='#000000' stroke-width='2' /><g transform='translate(0.0,0.0) rotate(0.0)'><polygon points='3.0,0 9.0,-3.0 9.0,3.0' fill='#000000' stroke='#000000' stroke-width='2.0' /></g><g transform='translate(0.0,0.0)'></g></g><g transform='translate(144.0,770.0)'><path d='M0.0,0.0 Q-7.5,0.0 -11.0,0.0 Q-14.5,0.0 -22.0,0.0 ' stroke-dasharray='23, 0' fill='none' stroke='#000000' stroke-width='2' /><g transform='translate(-22.0,0.0) rotate(360.0)'><polygon points='3.0,0 9.0,-3.0 9.0,3.0' fill='#000000' stroke='#000000' stroke-width='2.0' /></g><g transform='translate(0.0,0.0)'></g></g><g transform='translate(364.0,785.5)'><path d='M0.0,0.0 Q20.5,0.0 20.5,54.75 Q20.5,109.5 40.5,109.5 ' stroke-dasharray='23, 0' fill='none' stroke='#000000' stroke-width='2' /><g transform='translate(0.0,0.0) rotate(21.5)'><polygon points='3.0,0 9.0,-3.0 9.0,3.0' fill='#000000' stroke='#000000' stroke-width='2.0' /></g><g transform='translate(0.0,0.0)'></g></g><g transform='translate(22.0,856.5) rotate(0.0 50.0 37.5)'><path d="M0,0 Q0,-9.375 50.0,-9.375 Q100.0,-9.375 100.0,0 L100.0,65.625 Q100.0,75.0 50.0,75.0 Q0,75.0 0,65.625 L0,0 Z" stroke="#b5bf5e" stroke-width="2" fill="#eef19f"/><path d="M0,0 Q0,9.375 50.0,9.375 Q100.0,9.375 100.0,0" stroke="#b5bf5e" stroke-width="2" fill="none"/><path d="M0,4.6875 Q0,14.0625 50.0,14.0625 Q100.0,14.0625 100.0,4.6875" stroke="#b5bf5e" stroke-width="2" fill="none"/><path d="M0,9.375 Q0,18.75 50.0,18.75 Q100.0,18.75 100.0,9.375 " stroke="#b5bf5e" stroke-width="2" fill="none"/><g  transform='translate(0.0,34.5)'><text x='50.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#1A1B11' >DataFile</tspan></text><text x='50.0' style='text-anchor: middle' y='12.8'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#1A1B11' >(binary file)</tspan></text></g></g><g transform='translate(257.5,275.5) rotate(0.0 45.0 45.0)'><ellipse cx="45.0" cy="45.0" rx="45.0" ry="45.0" stroke="#aaaaaa" stroke-width="2" fill="#eeeeee"/><g  transform='translate(0.0,50.0)'><text x='45.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#000000' >Sensor Loop</tspan></text></g></g><g transform='translate(557.5,943.0) rotate(0.0 50.0 25.0)'><path d="M25.0,0 L75.0,0 Q85.35533905932738,-3.552713678800501E-15 92.67766952966369,7.322330470336308 Q100.0,14.644660940672619 100.0,24.999999999999993 Q100.0,35.35533905932738 92.67766952966369,42.67766952966369 Q85.35533905932738,50.0 75.0,50.0 L25.0,50.0 Q14.644660940672626,50.0 7.322330470336315,42.67766952966369 Q0.0,35.35533905932738 0.0,25.0 Q-3.552713678800501E-15,14.644660940672626 7.322330470336308,7.322330470336315 Q14.644660940672619,0.0 24.999999999999996,0.0 Z" stroke="#90b328" stroke-width="2" fill="#c6dd58"/><g  transform='translate(0.0,30.0)'><text x='50.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#1C210C' >Exit Loop</tspan></text></g></g><g transform='translate(557.5,847.0) rotate(0.0 50.0 37.5)'><polygon points="25.0,0 75.0,0 100.0,37.5 75.0,75.0 25.0,75.0 0,37.5" stroke="#0e75ab" stroke-width="2" fill="#0099cc"/><g  transform='translate(0.0,42.5)'><text x='50.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#FFFFFF' >Deinitialise</tspan></text></g></g><g transform='translate(607.5,922.0)'><path d='M0.0,0.0 Q0.0,7.0 0.0,10.5 Q0.0,14.0 0.0,21.5 ' stroke-dasharray='23, 0' fill='none' stroke='#000000' stroke-width='2' /><g transform='translate(0.0,21.5) rotate(270.0)'><polygon points='3.0,0 9.0,-3.0 9.0,3.0' fill='#000000' stroke='#000000' stroke-width='2.0' /></g><g transform='translate(0.0,0.0)'></g></g><g transform='translate(73.0,455.0) rotate(0.0 50.0 25.0)'><path d="M0,0 L75.0,0 Q85.35533905932738,-3.552713678800501E-15 92.67766952966369,7.322330470336308 Q100.0,14.644660940672619 100.0,24.999999999999993 Q100.0,35.35533905932738 92.67766952966369,42.67766952966369 Q85.35533905932738,50.0 75.0,50.0 L0,50.0 L0,0 Z" stroke="#b5bf5e" stroke-width="2" fill="#eef19f"/><g  transform='translate(0.0,15.0)'><text x='50.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#1A1B11' >Wait until next</tspan></text><text x='50.0' style='text-anchor: middle' y='12.8'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#1A1B11' >sample should</tspan></text><text x='50.0' style='text-anchor: middle' y='27.6'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#1A1B11' >occur</tspan></text></g></g><g transform='translate(194.0,720.0)'><path d='M0.0,0.0 Q0.0,-107.5 -35.5,-107.5 Q-71.0,-107.5 -71.0,-215.0 ' stroke-dasharray='23, 0' fill='none' stroke='#000000' stroke-width='2' /><g transform='translate(-71.0,-215.0) rotate(89.5)'><polygon points='3.0,0 9.0,-3.0 9.0,3.0' fill='#000000' stroke='#000000' stroke-width='2.0' /></g><g transform='translate(0.0,0.0)'></g></g><g transform='translate(123.0,455.0)'><path d='M0.0,0.0 Q0.0,-134.5 134.5,-134.5' stroke-dasharray='23, 0' fill='none' stroke='#000000' stroke-width='2' /><g transform='translate(134.5,-134.5) rotate(179.0)'><polygon points='3.0,0 9.0,-3.0 9.0,3.0' fill='#000000' stroke='#000000' stroke-width='2.0' /></g><g transform='translate(0.0,0.0)'></g></g><g transform='translate(51.5,732.5)'><path d='M0.0,0.0 Q0.0,-252.5 21.5,-252.5' stroke-dasharray='23, 0' fill='none' stroke='#000000' stroke-width='2' /><g transform='translate(21.5,-252.5) rotate(133.5)'><polygon points='3.0,0 9.0,-3.0 9.0,3.0' fill='#000000' stroke='#000000' stroke-width='2.0' /></g><g transform='translate(0.0,0.0)'></g></g><g transform='translate(302.5,511.0)'><path d='M0.0,0.0 Q0.0,-48.5 0.0,-72.75 Q0.0,-97.0 0.0,-145.5 ' stroke-dasharray='23, 0' fill='none' stroke='#000000' stroke-width='2' /><g transform='translate(0.0,-145.5) rotate(90.0)'><polygon points='3.0,0 9.0,-3.0 9.0,3.0' fill='#000000' stroke='#000000' stroke-width='2.0' /></g><g transform='translate(0.0,0.0)'></g></g><g transform='translate(299.0,235.5)'><path d='M0.0,0.0 Q0.0,13.5 0.0,20.25 Q0.0,27.0 0.0,40.0 ' stroke-dasharray='23, 0' fill='none' stroke='#000000' stroke-width='2' /><g transform='translate(0.0,40.0) rotate(270.0)'><polygon points='3.0,0 9.0,-3.0 9.0,3.0' fill='#000000' stroke='#000000' stroke-width='2.0' /></g><g transform='translate(0.0,0.0)'></g></g><g transform='translate(497.0,326.0)'><path d='M0.0,0.0 Q200.5,0.0 200.5,279.25 Q200.5,558.5 160.5,558.5 ' stroke-dasharray='23, 0' fill='none' stroke='#000000' stroke-width='2' /><g transform='translate(160.5,558.5) rotate(336.0)'><polygon points='3.0,0 9.0,-3.0 9.0,3.0' fill='#000000' stroke='#000000' stroke-width='2.0' /></g><g transform='translate(0.0,0.0)'></g></g><g transform='translate(607.5,808.5)'><path d='M0.0,0.0 Q0.0,13.0 0.0,19.25 Q0.0,25.5 0.0,38.5 ' stroke-dasharray='23, 0' fill='none' stroke='#000000' stroke-width='2' /><g transform='translate(0.0,38.5) rotate(270.0)'><polygon points='3.0,0 9.0,-3.0 9.0,3.0' fill='#000000' stroke='#000000' stroke-width='2.0' /></g><g transform='translate(0.0,0.0)'></g></g><g transform='translate(504.5,771.0)'><path d='M0.0,0.0 Q17.5,0.0 26.25,0.0 Q35.0,0.0 52.5,0.0 ' stroke-dasharray='23, 0' fill='none' stroke='#000000' stroke-width='2' /><g transform='translate(52.5,0.0) rotate(180.0)'><polygon points='3.0,0 9.0,-3.0 9.0,3.0' fill='#000000' stroke='#000000' stroke-width='2.0' /></g><g transform='translate(0.0,0.0)'></g></g><g transform='translate(402.25,172.5) rotate(0.0 38.75 20.0)'><polygon points="12.916666666666666,0 90.41666666666667,0 64.58333333333333,40.0 -12.916666666666666,40.0" stroke="#aaaaaa" stroke-width="2" fill="#eeeeee"/><g  transform='translate(0.0,17.0)'><text x='38.75' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#000000' >Experiment</tspan></text><text x='38.75' style='text-anchor: middle' y='12.8'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#000000' >State</tspan></text></g></g><g transform='translate(442.0,112.5)'><path d='M0.0,0.0 Q0.0,31.0 -0.5,31.0 Q-1.0,31.0 -1.0,58.0 ' stroke-dasharray='23, 0' fill='none' stroke='#000000' stroke-width='2' /><g transform='translate(-1.0,58.0) rotate(270.0)'><polygon points='3.0,0 9.0,-3.0 9.0,3.0' fill='#000000' stroke='#000000' stroke-width='2.0' /></g><g transform='translate(0.0,0.0)'></g></g><g transform='translate(441.0,276.5)'><path d='M0.0,0.0 Q0.0,-21.5 0.0,-32.0 Q0.0,-42.5 0.0,-64.0 ' stroke-dasharray='23, 0' fill='none' stroke='#000000' stroke-width='2' /><g transform='translate(0.0,0.0) rotate(-90.0)'><polygon points='3.0,0 9.0,-3.0 9.0,3.0' fill='#000000' stroke='#000000' stroke-width='2.0' /></g><g transform='translate(0.0,0.0)'></g></g><g transform='translate(347.5,320.5)'><path d='M0.0,0.0 Q16.5,0.0 24.75,0.0 Q33.0,0.0 50.0,0.0 ' stroke-dasharray='23, 0' fill='none' stroke='#000000' stroke-width='2' /><g transform='translate(50.0,0.0) rotate(180.0)'><polygon points='3.0,0 9.0,-3.0 9.0,3.0' fill='#000000' stroke='#000000' stroke-width='2.0' /></g><g transform='translate(0.0,0.0)'></g></g><g transform='translate(72.0,807.5)'><path d='M0.0,0.0 Q0.0,16.5 0.0,24.5 Q0.0,32.5 0.0,49.0 ' stroke-dasharray='23, 0' fill='none' stroke='#000000' stroke-width='2' /><g transform='translate(0.0,49.0) rotate(270.0)'><polygon points='3.0,0 9.0,-3.0 9.0,3.0' fill='#000000' stroke='#000000' stroke-width='2.0' /></g><g transform='translate(0.0,0.0)'></g></g><g transform='translate(28.0,967.0) rotate(0.0 45.0 45.0)'><polygon  points="0,0 90.0,0 90.0,60.0 45.0,90.0 0,60.0" stroke="#aaaaaa" stroke-width="2" fill="#eeeeee"/><g  transform='translate(0.0,50.0)'><text x='45.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#000000' >FastCGI Loop</tspan></text></g></g><g transform='translate(259.0,22.5) rotate(0.0 45.0 45.0)'><polygon  points="0,0 90.0,0 90.0,60.0 45.0,90.0 0,60.0" stroke="#aaaaaa" stroke-width="2" fill="#eeeeee"/><g  transform='translate(0.0,42.0)'><text x='45.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#000000' >Start</tspan></text><text x='45.0' style='text-anchor: middle' y='12.8'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#000000' >Experiment</tspan></text></g></g><g transform='translate(397.0,22.5) rotate(0.0 45.0 45.0)'><polygon  points="0,0 90.0,0 90.0,60.0 45.0,90.0 0,60.0" stroke="#aaaaaa" stroke-width="2" fill="#eeeeee"/><g  transform='translate(0.0,42.0)'><text x='45.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#000000' >Stop</tspan></text><text x='45.0' style='text-anchor: middle' y='12.8'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#000000' >Experiment</tspan></text></g></g><g transform='translate(349.0,192.5)'><path d='M0.0,0.0 Q18.0,0.0 26.75,0.0 Q35.5,0.0 53.5,0.0 ' stroke-dasharray='23, 0' fill='none' stroke='#000000' stroke-width='2' /><g transform='translate(53.5,0.0) rotate(180.0)'><polygon points='3.0,0 9.0,-3.0 9.0,3.0' fill='#000000' stroke='#000000' stroke-width='2.0' /></g><g transform='translate(0.0,0.0)'></g></g><g transform='translate(304.0,112.5)'><path d='M0.0,0.0 Q0.0,16.0 0.0,24.0 Q0.0,32.0 0.0,48.0 ' stroke-dasharray='23, 0' fill='none' stroke='#000000' stroke-width='2' /><g transform='translate(0.0,48.0) rotate(270.0)'><polygon points='3.0,0 9.0,-3.0 9.0,3.0' fill='#000000' stroke='#000000' stroke-width='2.0' /></g><g transform='translate(0.0,0.0)'></g></g><g transform='translate(72.0,931.5)'><path d='M0.0,0.0 Q0.0,12.0 0.0,18.0 Q0.0,24.0 0.0,35.5 ' stroke-dasharray='23, 0' fill='none' stroke='#000000' stroke-width='2' /><g transform='translate(0.0,35.5) rotate(270.0)'><polygon points='3.0,0 9.0,-3.0 9.0,3.0' fill='#000000' stroke='#000000' stroke-width='2.0' /></g><g transform='translate(0.0,0.0)'></g></g><g transform='translate(432.0,303.5) rotate(0.0 75.0 7.5)'><g  transform='translate(0.0,12.5)'><text x='75.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#071E2D' >No</tspan></text></g></g><g transform='translate(387.0,375.5) rotate(0.0 75.0 7.5)'><g  transform='translate(0.0,12.5)'><text x='75.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#071E2D' >Yes</tspan></text></g></g><g transform='translate(388.0,582.5) rotate(0.0 75.0 7.5)'><g  transform='translate(0.0,12.5)'><text x='75.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#071E2D' >Yes</tspan></text></g></g><g transform='translate(302.5,510.5) rotate(0.0 75.0 7.5)'><g  transform='translate(0.0,12.5)'><text x='75.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#071E2D' >No</tspan></text></g></g><g transform='translate(410.5,832.5) rotate(0.0 75.0 7.5)'><g  transform='translate(0.0,12.5)'><text x='75.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#071E2D' >Marginal</tspan></text></g></g><g transform='translate(135.0,688.5) rotate(0.0 75.0 7.5)'><g  transform='translate(0.0,12.5)'><text x='75.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#071E2D' >No</tspan></text></g></g><g transform='translate(58.0,782.5) rotate(0.0 75.0 7.5)'><g  transform='translate(0.0,12.5)'><text x='75.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#071E2D' >Yes</tspan></text></g></g><g transform='translate(532.5,719.5) rotate(0.0 75.0 7.5)'><g  transform='translate(0.0,12.5)'><text x='75.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#071E2D' >CallĀ </tspan><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#071E2D' font-style='italic' >Fatal</tspan></text></g></g><g transform='translate(441.0,746.5) rotate(0.0 75.0 7.5)'><g  transform='translate(0.0,12.5)'><text x='75.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#071E2D' >No</tspan></text></g></g><g transform='translate(314.0,746.5) rotate(0.0 75.0 7.5)'><g  transform='translate(0.0,12.5)'><text x='75.0' style='text-anchor: middle' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#071E2D' >Yes</tspan></text></g></g><g transform='translate(22.0,148.0) rotate(0.0 75.0 40.5)'><g  transform='translate(0.0,-7.5)'><text x='2' style='text-anchor: start' y='-2.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#071E2D' >"sensor.c" and "sensor.h"</tspan></text><text x='2' style='text-anchor: start' y='12.8'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#071E2D' >contain the</tspan></text><text x='2' style='text-anchor: start' y='27.6'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#071E2D' >implementation of the</tspan></text><text x='2' style='text-anchor: start' y='42.400000000000006'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#071E2D' >sensor thread logic. The</tspan></text><text x='2' style='text-anchor: start' y='57.2'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#071E2D' >implementation of sensor</tspan></text><text x='2' style='text-anchor: start' y='72.0'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#071E2D' >reading is in files</tspan></text><text x='2' style='text-anchor: start' y='86.8'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#071E2D' >contained in the "sensors"</tspan></text><text x='2' style='text-anchor: start' y='101.6'><tspan xml:space='preserve' font-size='12' font-family='Arial' fill='#071E2D' >directory</tspan></text></g></g></svg>
\ No newline at end of file
diff --git a/reports/final/figures/server_overview.pdf b/reports/final/figures/server_overview.pdf
new file mode 100644 (file)
index 0000000..c8bb04b
Binary files /dev/null and b/reports/final/figures/server_overview.pdf differ
diff --git a/reports/final/figures/server_overview.png b/reports/final/figures/server_overview.png
new file mode 100644 (file)
index 0000000..6690f50
Binary files /dev/null and b/reports/final/figures/server_overview.png differ
index d058a8a..60805d2 100644 (file)
@@ -6,3 +6,18 @@
        howpublished = "\url{http://guides.is.uwa.edu.au/harvard}",
        note = "UWA Reference guide"
 }
+
+@misc{UserCake,
+       author = "Tyson et. al"
+       year = 2012
+       title = "UserCake: The fully open source user management script",
+       howpublished = "\url{http://usercake.com}"
+}
+
+@misc{github,
+       author = "Sam Moore and Jeremy Tan and Justin Kruger and Callum Schofield and James Rosher and Rowan Heinrich",
+       year = 2013,
+       title = "MCTX3420 2013 Git Repository on GitHub",
+       howpublished = "\url{https://github.com/szmoore/MCTX3420}"
+}
+       
index b4e09ac..c7a9548 100644 (file)
Binary files a/reports/final/report.pdf and b/reports/final/report.pdf differ
index b360be6..8a499e3 100644 (file)
@@ -2,9 +2,9 @@
 \linespread{0.9}
 \usepackage{setspace}
 %\onehalfspacing  % 1.5 spacing is uuuglly
- \parskip 10pt           % sets spacing between paragraphs
+ \parskip 15pt           % sets spacing between paragraphs
  %\renewcommand{\baselinestretch}{1.5}         % Uncomment for 1.5 spacing between lines
%\parindent 0pt                 % sets leading space for paragraphs
\parindent 8pt                  % sets leading space for paragraphs
 
 
 %\usepackage{natbib}

UCC git Repository :: git.ucc.asn.au