/** * 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 the actuator to the desired 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 a The actuator 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 Actuator_SetMode(Actuator * a, 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/actuator_%d", experiment_path, a->id); if (ret >= BUFSIZ) { Fatal("Experiment path \"%s\" too long (%d, limit %d)", experiment_path, ret, BUFSIZ); } Log(LOGDEBUG, "Actuator %d with DataFile \"%s\"", a->id, filename); // Open DataFile Data_Open(&(a->data_file), filename); } case CONTROL_RESUME: //Case fallthrough; no break before { int ret; a->activated = true; // Don't forget this a->control_changed = false; ret = pthread_create(&(a->thread), NULL, Actuator_Loop, (void*)(a)); if (ret != 0) { Fatal("Failed to create Actuator_Loop for Actuator %d", a->id); } Log(LOGDEBUG, "Resuming actuator %d", a->id); } break; case CONTROL_EMERGENCY: //TODO add proper case for emergency case CONTROL_PAUSE: a->activated = false; Actuator_SetControl(a, NULL); pthread_join(a->thread, NULL); // Wait for thread to exit Log(LOGDEBUG, "Paused actuator %d", a->id); break; break; case CONTROL_STOP: if (a->activated) //May have been paused before { a->activated = false; Actuator_SetControl(a, NULL); pthread_join(a->thread, NULL); // Wait for thread to exit } Data_Close(&(a->data_file)); // Close DataFile Log(LOGDEBUG, "Stopped actuator %d", a->id); break; default: Fatal("Unknown control mode: %d", mode); } }