- if (g_controls.state == STATE_STOPPED) {
- gettimeofday(&(g_controls.start_time), NULL);
- Sensor_StartAll(experiment_name);
- Actuator_StartAll(experiment_name);
- g_controls.state = STATE_RUNNING;
- ret = true;
+ if (g_controls.current_mode == CONTROL_EMERGENCY && desired_mode != CONTROL_STOP) {
+ ret = "In emergency mode. Stop before doing anything else.";
+ } else if (g_controls.current_mode == desired_mode) {
+ ret = "Already in desired mode.";
+ } else if (desired_mode == CONTROL_START) {
+ if (g_controls.current_mode == CONTROL_STOP) {
+ //TODO Sanitise name (ensure it contains no special chars eg \ / .. .
+ FILE *fp = fopen((const char*) arg, "a");
+ if (fp) {
+ fclose(fp);
+ gettimeofday(&(g_controls.start_time), NULL);
+ } else {
+ ret = "Cannot open experiment name marker";
+ }
+ } else {
+ ret = "Cannot start when not in a stopped state.";
+ }
+ } else if (desired_mode == CONTROL_RESUME) {
+ if (g_controls.current_mode != CONTROL_PAUSE)
+ ret = "Cannot resume when not in a paused state.";
+ }
+
+ if (ret == NULL) {
+ Actuator_SetModeAll(desired_mode, arg);
+ Sensor_SetModeAll(desired_mode, arg);
+ if (desired_mode != CONTROL_RESUME)
+ g_controls.current_mode = desired_mode;
+ else
+ g_controls.current_mode = CONTROL_START;