From: Sam Moore Date: Sun, 22 Sep 2013 04:04:49 +0000 (+0800) Subject: Merge branch 'master' of github:/szmoore/MCTX3420 X-Git-Url: https://git.ucc.asn.au/?a=commitdiff_plain;h=e0f849d11ae14ee0637786b6663436aafff90254;hp=-c;p=matches%2FMCTX3420.git Merge branch 'master' of github:/szmoore/MCTX3420 --- e0f849d11ae14ee0637786b6663436aafff90254 diff --combined server/actuator.c index 6d544f2,f5d7cd6..40f9b46 --- a/server/actuator.c +++ b/server/actuator.c @@@ -32,7 -32,6 +32,7 @@@ void Actuator_Init( // Initialise pins used GPIO_Export(GPIO1_16); PWM_Export(EHRPWM0A); + PWM_Export(EHRPWM0B); } @@@ -53,7 -52,6 +53,6 @@@ void Actuator_SetMode(Actuator * a, Con { 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 -61,43 +62,43 @@@ 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 -137,6 +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 -262,6 +263,6 @@@ void Actuator_EndResponse(FCGIContext } - - /** * Handle a request for an Actuator * @param context - FCGI context diff --combined server/sensor.c index 28c3f5e,e429958..98896e8 --- a/server/sensor.c +++ b/server/sensor.c @@@ -43,7 -43,6 +43,6 @@@ void Sensor_Init( { g_sensors[i].id = i; Data_Init(&(g_sensors[i].data_file)); - g_sensors[i].record_data = false; } // Get the ADCs @@@ -73,7 -72,6 +72,6 @@@ void Sensor_SetMode(Sensor * s, Control // Set filename char filename[BUFSIZ]; const char *experiment_name = (const char*) arg; - int ret; if (snprintf(filename, BUFSIZ, "%s_s%d", experiment_name, s->id) >= BUFSIZ) { @@@ -83,9 -81,11 +81,11 @@@ Log(LOGDEBUG, "Sensor %d with DataFile \"%s\"", s->id, filename); // Open DataFile Data_Open(&(s->data_file), filename); - - s->activated = true; - s->record_data = true; // Don't forget this! + } + 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)); @@@ -93,23 -93,29 +93,29 @@@ { Fatal("Failed to create Sensor_Loop for Sensor %d", s->id); } + + Log(LOGDEBUG, "Resuming sensor %d", s->id); } - break; + break; + case CONTROL_EMERGENCY: case CONTROL_PAUSE: - s->record_data = false; - break; - case CONTROL_RESUME: - s->record_data = true; - break; - case CONTROL_STOP: s->activated = false; - s->record_data = 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 s->newest_data.time_stamp = 0; s->newest_data.value = 0; + Log(LOGDEBUG, "Stopped sensor %d", s->id); break; default: Fatal("Unknown control mode: %d", mode); @@@ -138,12 -144,13 +144,13 @@@ void Sensor_CheckData(SensorId id, doub { if( value > thresholds[id].max_error || value < thresholds[id].min_error) { - Log(LOGERR, "Sensor %s is above or below its safety value of %f or %f\n", g_sensor_names[id],thresholds[id].max_error, thresholds[id].min_error); + Log(LOGERR, "Sensor %s at %f is above or below its safety value of %f or %f\n", value, g_sensor_names[id],thresholds[id].max_error, thresholds[id].min_error); //new function that stops actuators? + //Control_SetMode(CONTROL_EMERGENCY, NULL) } else if( value > thresholds[id].max_warn || value < thresholds[id].min_warn) { - Log(LOGWARN, "Sensor %s is above or below its warning value of %f or %f\n", g_sensor_names[id],thresholds[id].max_warn, thresholds[id].min_warn); + Log(LOGWARN, "Sensor %s at %f is above or below its warning value of %f or %f\n", value, g_sensor_names[id],thresholds[id].max_warn, thresholds[id].min_warn); } } @@@ -173,7 -180,7 +180,7 @@@ bool Sensor_Read(Sensor * s, DataPoint static bool set = false; GPIO_Set(GPIO0_30, true); - d->value = (double)ADC_Read(ADC0); //ADC #0 on the Beaglebone + d->value = 0;//(double)ADC_Read(ADC0); //ADC #0 on the Beaglebone //Log(LOGDEBUG, "Got value %f from ADC0", d->value); GPIO_Set(GPIO0_30, false); set = !set; @@@ -258,20 -265,12 +265,12 @@@ void * Sensor_Loop(void * arg // Until the sensor is stopped, record data points while (s->activated) { - if (s->record_data) - { - DataPoint d; - //Log(LOGDEBUG, "Sensor %d reads data [%f,%f]", s->id, d.time_stamp, d.value); - if (Sensor_Read(s, &d)) // If new DataPoint is read: - { - //Log(LOGDEBUG, "Sensor %d saves data [%f,%f]", s->id, d.time_stamp, d.value); - Data_Save(&(s->data_file), &d, 1); // Record it - } - } - else + DataPoint d; + //Log(LOGDEBUG, "Sensor %d reads data [%f,%f]", s->id, d.time_stamp, d.value); + if (Sensor_Read(s, &d)) // If new DataPoint is read: { - //Do something? wait? - usleep(100000); + //Log(LOGDEBUG, "Sensor %d saves data [%f,%f]", s->id, d.time_stamp, d.value); + Data_Save(&(s->data_file), &d, 1); // Record it } }