X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=server%2Factuator.c;h=40f9b46f292a7687d5abf8a6a357eb5f52f35360;hb=0ef0945e8d83258400fabc61fa81725c5e8e533f;hp=6d544f2e0c494d72581d98c4b824274c2026ee8e;hpb=8b7f6f32024dee5f15f44e231a48c51fdde1b32f;p=matches%2FMCTX3420.git diff --git a/server/actuator.c b/server/actuator.c index 6d544f2..40f9b46 100644 --- a/server/actuator.c +++ b/server/actuator.c @@ -53,7 +53,6 @@ void Actuator_SetMode(Actuator * a, ControlModes mode, void *arg) { char filename[BUFSIZ]; const char *experiment_name = (const char*) arg; - int ret; if (snprintf(filename, BUFSIZ, "%s_a%d", experiment_name, a->id) >= BUFSIZ) { @@ -63,34 +62,43 @@ void Actuator_SetMode(Actuator * a, ControlModes mode, void *arg) 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->allow_actuation = true; - a->control_changed = false; - // Create the thread 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->allow_actuation = false; + 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; - case CONTROL_RESUME: - a->allow_actuation = true; + break; case CONTROL_STOP: - a->allow_actuation = false; - a->activated = false; - Actuator_SetControl(a, NULL); - pthread_join(a->thread, NULL); // Wait for thread to exit + 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); @@ -130,8 +138,6 @@ void * Actuator_Loop(void * arg) pthread_mutex_unlock(&(a->mutex)); if (!a->activated) break; - else if (!a->allow_actuation) - continue; Actuator_SetValue(a, a->control.value); } @@ -257,8 +263,6 @@ void Actuator_EndResponse(FCGIContext * context, ActuatorId id, DataFormat forma } - - /** * Handle a request for an Actuator * @param context - FCGI context