+ * Initialise all sensors used by the program
+ * TODO: Edit this to add any extra sensors you need
+ * TODO: Edit the includes as well
+ */
+#include "sensors/resource.h"
+#include "sensors/strain.h"
+#include "sensors/pressure.h"
+#include "sensors/dilatometer.h"
+#include "sensors/microphone.h"
+void Sensor_Init()
+{
+ //Sensor_Add("cpu_stime", RESOURCE_CPU_SYS, Resource_Read, NULL, NULL, NULL);
+ //Sensor_Add("cpu_utime", RESOURCE_CPU_USER, Resource_Read, NULL, NULL, NULL);
+ Sensor_Add("pressure_high0", PRES_HIGH0, Pressure_Read, Pressure_Init, Pressure_Cleanup, NULL);
+ Sensor_Add("pressure_high1", PRES_HIGH1, Pressure_Read, Pressure_Init, Pressure_Cleanup, NULL);
+ Sensor_Add("pressure_low0", PRES_LOW0, Pressure_Read, Pressure_Init, Pressure_Cleanup, NULL);
+ //Sensor_Add("../testing/count.py", 0, Piped_Read, Piped_Init, Piped_Cleanup, 1e50,-1e50,1e50,-1e50);
+ //Sensor_Add("strain0_endhoop", STRAIN0, Strain_Read, Strain_Init, Strain_Cleanup, Strain_Sanity);
+ //Sensor_Add("strain1_endlong", STRAIN1, Strain_Read, Strain_Init, Strain_Cleanup, Strain_Sanity);
+ //Sensor_Add("strain2_midhoop", STRAIN2, Strain_Read, Strain_Init, Strain_Cleanup, Strain_Sanity);
+ //Sensor_Add("strain3_midlong", STRAIN3, Strain_Read, Strain_Init, Strain_Cleanup, Strain_Sanity);
+
+ //Sensor_Add("microphone", 0, Microphone_Read, Microphone_Init, Microphone_Cleanup, Microphone_Sanity);
+ //Sensor_Add("pressure0", PRESSURE0, Pressure_Read, Pressure_Init, 5000,0,5000,0);
+ //Sensor_Add("pressure1", PRESSURE1, Pressure_Read, Pressure_Init, 5000,0,5000,0);
+ //Sensor_Add("pressure_feedback", PRESSURE_FEEDBACK, Pressure_Read, Pressure_Init, 5000,0,5000,0);
+ //Sensor_Add("enclosure", ENCLOSURE, Enclosure_Read, Enclosure_Init, 1,1,1,1); // Does not exist...
+
+ //NOTE: DO NOT ENABLE DILATOMETER WITHOUT FURTHER TESTING; CAUSES SEGFAULTS
+ //Sensor_Add("dilatometer0", 0, Dilatometer_Read, Dilatometer_Init, Dilatometer_Cleanup, NULL);
+ //Sensor_Add("dilatometer1",1, Dilatometer_Read, Dilatometer_Init, Dilatometer_Cleanup, NULL);
+}
+
+/**
+ * Cleanup all sensors
+ */
+void Sensor_Cleanup()
+{
+ for (int i = 0; i < g_num_sensors; ++i)
+ {
+ Sensor * s = g_sensors+i;
+ if (s->cleanup != NULL)
+ s->cleanup(s->user_id);
+ }
+ g_num_sensors = 0;
+}
+
+/**
+ * Sets the sensor to the desired control mode. No checks are
+ * done to see if setting to the desired mode will conflict with
+ * the current mode - the caller must guarantee this itself.
+ * @param s The sensor whose mode is to be changed
+ * @param mode The mode to be changed to
+ * @param arg An argument specific to the mode to be set.
+ * e.g for CONTROL_START it represents the experiment name.
+ */
+void Sensor_SetMode(Sensor * s, ControlModes mode, void * arg)
+{
+ switch(mode)
+ {
+ case CONTROL_START:
+ {
+ // Set filename
+ char filename[BUFSIZ];
+ const char *experiment_path = (const char*) arg;
+ int ret;
+
+ ret = snprintf(filename, BUFSIZ, "%s/sensor_%d", experiment_path, s->id);
+
+ if (ret >= BUFSIZ)
+ {
+ Fatal("Experiment path \"%s\" too long (%d, limit %d)",
+ experiment_path, ret, BUFSIZ);
+ }
+
+ Log(LOGDEBUG, "Sensor %d with DataFile \"%s\"", s->id, filename);
+ // Open DataFile
+ Data_Open(&(s->data_file), filename);
+ }
+ case CONTROL_RESUME: //Case fallthrough, no break before
+ {
+ int ret;
+ s->activated = true; // Don't forget this!
+
+ // Create the thread
+ ret = pthread_create(&(s->thread), NULL, Sensor_Loop, (void*)(s));
+ if (ret != 0)
+ {
+ Fatal("Failed to create Sensor_Loop for Sensor %d", s->id);
+ }
+
+ Log(LOGDEBUG, "Resuming sensor %d", s->id);
+ }
+ break;
+
+ case CONTROL_EMERGENCY:
+ case CONTROL_PAUSE:
+ s->activated = false;
+ pthread_join(s->thread, NULL);
+ Log(LOGDEBUG, "Paused sensor %d", s->id);
+ break;
+
+ case CONTROL_STOP:
+ if (s->activated) //May have been paused before
+ {
+ s->activated = false;
+ pthread_join(s->thread, NULL);
+ }
+
+ Data_Close(&(s->data_file)); // Close DataFile
+ Log(LOGDEBUG, "Stopped sensor %d", s->id);
+ break;
+ default:
+ Fatal("Unknown control mode: %d", mode);
+ }
+}
+
+/**
+ * Sets all sensors to the desired mode.
+ * @see Sensor_SetMode for more information.
+ * @param mode The mode to be changed to
+ * @param arg An argument specific to the mode to be set.
+ */
+void Sensor_SetModeAll(ControlModes mode, void * arg)
+{
+ if (mode == CONTROL_START)
+ Sensor_Init();
+ for (int i = 0; i < g_num_sensors; i++)
+ Sensor_SetMode(&g_sensors[i], mode, arg);
+ if (mode == CONTROL_STOP)
+ Sensor_Cleanup();
+}
+
+
+/**
+ * Record data from a single Sensor; to be run in a seperate thread
+ * @param arg - Cast to Sensor* - Sensor that the thread will handle