X-Git-Url: https://git.ucc.asn.au/?p=matches%2FMCTX3420.git;a=blobdiff_plain;f=server%2Fsensor.c;fp=server%2Fsensor.c;h=e429958168019beb5c8e90320e90efc9d30a41eb;hp=64c7aa9a83938d86f658f7974db7fb7487614a25;hb=ed189a5dd5b5ca6c052d75704dec3f58fe410387;hpb=3b075e3cade9dcd625fab07a713856f657bb2230 diff --git a/server/sensor.c b/server/sensor.c index 64c7aa9..e429958 100644 --- a/server/sensor.c +++ b/server/sensor.c @@ -7,6 +7,7 @@ #include "common.h" #include "sensor.h" #include "options.h" +#include "bbb_pin.h" #include /** Array of sensors, initialised by Sensor_Init **/ @@ -17,17 +18,20 @@ const SensorThreshold thresholds[NUMSENSORS]= { //Max Safety, Min safety, Max warning, Min warning {1,-1,1,-1}, // ANALOG_TEST0 {500,0,499,0}, // ANALOG_TEST1 + {5000,0,5000,0}, // ANALOG_REALTEST {5,-5,4,-4}, // ANALOG_FAIL0 {1,0,1,0}, // DIGITAL_TEST0 {1,0,1,0}, // DIGITAL_TEST1 + {1,0,1,0}, // DIGITAL_REALTEST {1,0,1,0} // DIGITAL_FAIL0 }; /** Human readable names for the sensors **/ const char * g_sensor_names[NUMSENSORS] = { "analog_test0", "analog_test1", - "analog_fail0", "digital_test0", - "digital_test1", "digital_fail0" + "analog_realtest", "analog_fail0", + "digital_test0", "digital_test1", + "digital_realtest", "digital_fail0" }; /** @@ -40,6 +44,14 @@ void Sensor_Init() g_sensors[i].id = i; Data_Init(&(g_sensors[i].data_file)); } + + // Get the ADCs + ADC_Export(); + + // GPIO1_28 used as a pulse for sampling + GPIO_Export(GPIO1_28); + // GPIO0_30 toggled during sampling + GPIO_Export(GPIO0_30); } /** @@ -157,12 +169,37 @@ bool Sensor_Read(Sensor * s, DataPoint * d) gettimeofday(&t, NULL); d->time_stamp = TIMEVAL_DIFF(t, *Control_GetStartTime()); + static bool result = true; + + // Read value based on Sensor Id switch (s->id) { + case ANALOG_REALTEST: + { + static bool set = false; + + GPIO_Set(GPIO0_30, true); + d->value = (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; + GPIO_Set(GPIO1_28, set); + + break; + } + + default: + d->value = rand() % 2; + usleep(1000000); + break; + + case ANALOG_TEST0: + { d->value = (double)(rand() % 100) / 100; break; + } case ANALOG_TEST1: { static int count = 0; @@ -170,33 +207,43 @@ bool Sensor_Read(Sensor * s, DataPoint * d) d->value = count++; break; } + case ANALOG_FAIL0: - d->value = (double)(rand() % 6) * -( rand() % 2) / ( rand() % 100 + 1); + d->value = 0; + //d->value = (double)(rand() % 6) * -( rand() % 2) / ( rand() % 100 + 1); //Gives a value between -5 and 5 break; case DIGITAL_TEST0: d->value = t.tv_sec % 2; + break; case DIGITAL_TEST1: d->value = (t.tv_sec+1)%2; break; + case DIGITAL_REALTEST: + { + // Can pass pin as argument, just using 20 as an example here + // Although since pins will be fixed, can just define it here if we need to + //d->value = pinRead(20); //Pin 20 on the Beaglebone + break; + } case DIGITAL_FAIL0: if( rand() % 100 > 98) d->value = 2; d->value = rand() % 2; //Gives 0 or 1 or a 2 every 1/100 times break; - default: - Fatal("Unknown sensor id: %d", s->id); - break; + //default: + // Fatal("Unknown sensor id: %d", s->id); + // break; } - usleep(100000); // simulate delay in sensor polling + // Perform sanity check based on Sensor's ID and the DataPoint Sensor_CheckData(s->id, d->value); // Update latest DataPoint if necessary - bool result = (d->value != s->newest_data.value); + if (result) { s->newest_data.time_stamp = d->time_stamp; @@ -270,6 +317,7 @@ void Sensor_BeginResponse(FCGIContext * context, SensorId id, DataFormat format) case JSON: FCGI_BeginJSON(context, STATUS_OK); FCGI_JSONLong("id", id); + FCGI_JSONPair("name", g_sensor_names[id]); break; default: FCGI_PrintRaw("Content-type: text/plain\r\n\r\n");