X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=server%2Fsensor.c;h=ae5cdf400f6e95f7623c6a7b7034a9b3a281823f;hb=4a7e2a370cfc471bb80266a3b04b612a88509638;hp=8cc8c82a7242ca35f3e3f85f505baf162cb6f72f;hpb=5a9a05166c4b22e7b7a522063d3dd6f75d1fa589;p=matches%2FMCTX3420.git diff --git a/server/sensor.c b/server/sensor.c index 8cc8c82..ae5cdf4 100644 --- a/server/sensor.c +++ b/server/sensor.c @@ -47,9 +47,9 @@ int Sensor_Add(const char * name, int user_id, ReadFn read, InitFn init, CleanFn s->init = init; // Set init function // Start by averaging values taken over a second - s->sample_time.tv_sec = 1; - s->sample_time.tv_nsec = 0; + DOUBLE_TO_TIMEVAL(1e-4, &(s->sample_time)); s->averages = 1; + s->num_read = 0; // Set sanity function s->sanity = sanity; @@ -60,7 +60,8 @@ int Sensor_Add(const char * name, int user_id, ReadFn read, InitFn init, CleanFn Fatal("Couldn't init sensor %s", name); } - + s->current_data.time_stamp = 0; + s->current_data.value = 0; return g_num_sensors; } @@ -121,11 +122,15 @@ void Sensor_SetMode(Sensor * s, ControlModes mode, void * arg) { // Set filename char filename[BUFSIZ]; - const char *experiment_name = (const char*) arg; + const char *experiment_path = (const char*) arg; + int ret; + + ret = snprintf(filename, BUFSIZ, "%s/sensor_%d", experiment_path, s->id); - if (snprintf(filename, BUFSIZ, "%s_%d", experiment_name, s->id) >= BUFSIZ) + if (ret >= BUFSIZ) { - Fatal("Experiment name \"%s\" too long (>%d)", experiment_name, BUFSIZ); + Fatal("Experiment path \"%s\" too long (%d, limit %d)", + experiment_path, ret, BUFSIZ); } Log(LOGDEBUG, "Sensor %d with DataFile \"%s\"", s->id, filename); @@ -213,7 +218,18 @@ void * Sensor_Loop(void * arg) Fatal("Sensor %s (%d,%d) reads unsafe value", s->name, s->id, s->user_id); } } - Data_Save(&(s->data_file), &d, 1); // Record it + s->current_data.time_stamp += d.time_stamp; + s->current_data.value += d.value; + + if (++(s->num_read) >= s->averages) + { + s->current_data.time_stamp /= s->averages; + s->current_data.value /= s->averages; + Data_Save(&(s->data_file), &(s->current_data), 1); // Record it + s->num_read = 0; + s->current_data.time_stamp = 0; + s->current_data.value = 0; + } } else Log(LOGWARN, "Failed to read sensor %s (%d,%d)", s->name, s->id,s->user_id); @@ -294,7 +310,6 @@ void Sensor_Handler(FCGIContext *context, char * params) struct timespec now; clock_gettime(CLOCK_MONOTONIC, &now); double current_time = TIMEVAL_DIFF(now, *Control_GetStartTime()); - int id = 0; const char * name = ""; double start_time = 0;