Automatic commit of irc logs
[matches/MCTX3420.git] / BBB code / GetData_real.c
index 2192772..c724e62 100644 (file)
@@ -1,93 +1,61 @@
-DataPoint * GetData(int sensor_id, DataPoint * d)
-{      
-       //TODO: We should ensure the time is *never* allowed to change on the server if we use gettimeofday
-       //              Another way people might think of getting the time is to count CPU cycles with clock()
-       //              But this will not work because a) CPU clock speed may change on some devices (RPi?) and b) It counts cycles used by all threads
-       gettimeofday(&(d->time_stamp), NULL);
+#include "gpio.h"
+
+/**
+ * Read a DataPoint from a Sensor; block until value is read
+ * @param id - The ID of the sensor
+ * @param d - DataPoint to set
+ * @returns True if the DataPoint was different from the most recently recorded.
+ */
+bool Sensor_Read(Sensor * s, DataPoint * d)
+{
        
-       switch (sensor_id)
+       // Set time stamp
+       struct timeval t;
+       gettimeofday(&t, NULL);
+       d->time_stamp = TIMEVAL_DIFF(t, g_options.start_time);
+
+       // Read value based on Sensor Id
+       switch (s->id)
        {
-               //TODO: test buffer size on actual hardware
-               //              maybe map the sensor path to an array/structure that can be looked up via sensor_id?
-               //              not sure about the best place to do unit conversions, especially for nonlinear sensors
-               case SENSOR_TEST0:
+               case ANALOG_TEST0:
+                       d->value = ADCRead(0);  //ADC #0 on the Beaglebone
+                       break;
+               case ANALOG_TEST1:
                {
-                       int sensor = open("/sys/devices/platform/tsc/ain0", O_RDONLY); //need unique path for each sensor ADC, check path in documentation
-                       char buffer[128];                                                                                       //ADCs on Beaglebone are 12 bits?
-                       int read = read(sensor, buffer, sizeof(buffer);
-                       if (read != -1) {
-                               buffer[read] = NULL;                                                                            //string returned by read is not null terminated
-                               int value = atoi(buffer);
-                               double convert = (value/4096) * 1800;                                           //sample conversion from ADC input to 'true value'
-                d->value = convert;
-                               lseek(sensor, 0, 0);                                                                            //after read string must be rewound to start of file using lseek
-            }
-                       else {
-                               perror("Failed to get value from sensor");
-                       }
-                       close(sensor);
+                       d->value = ADCRead(1);
                        break;
                }
-               case SENSOR_TEST1:
-                       int sensor = open("/sys/devices/platform/tsc/ain1", O_RDONLY); 
-                       char buffer[128];       
-                       int read = read(sensor, buffer, sizeof(buffer);
-                       if (read != -1) {
-                               buffer[read] = NULL;    
-                               int value = atoi(buffer);
-                               double convert = (value/4096) * 1800;   
-                d->value = convert;
-                               lseek(sensor, 0, 0);    
-            }
-                       else {
-                               perror("Failed to get value from sensor");
-                       }
-                       close(sensor);
-                       break;
+               case ANALOG_FAIL0:
+                       d->value = (double)(rand() % 6) * -( rand() % 2) / ( rand() % 100 + 1);
+                       //Gives a value between -5 and 5
                        break;
-               }
-               //TODO: think about a better way to address individual pins
-               //              i.e. pass an int to a separate function that builds the correct filename
-               //              doesn't really matter if the pins we're using are fixed though
                case DIGITAL_TEST0:
-                       int fd = open("/sys/class/gpio/gpio17/value", O_RDONLY)         //again need the right addresses for each pin
-                       char ch;                                                                                                        //just one character for binary info
-                       lseek(fd, 0, SEEK_SET);
-                       int read = read(fd, &ch, sizeof(ch);
-                       if (read != -1) {
-                               if (ch != '0') {
-                                       d->value = 1;
-                               }
-                               else {
-                                       d->value = 0;
-                               }
-                       }
-                       else {
-                               perror("Failed to get value from pin"); 
-                       }
+                       d->value = pinRead(0);  //replace 0 with correct pin number
                        break;
                case DIGITAL_TEST1:
-                       int fd = open("/sys/class/gpio/gpio23/value", O_RDONLY)
-                       char ch;
-                       lseek(fd, 0, SEEK_SET);
-                       int read = read(fd, &ch, sizeof(ch);
-                       if (read != -1) {
-                               if (ch != '0') {
-                                       d->value = 1;
-                               }
-                               else {
-                                       d->value = 0;
-                               }
-                       }
-                       else {
-                               perror("Failed to get value from pin"); 
-                       }
+                       d->value = pinRead(1);  //replace 1 with correct pin number
+                       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", sensor_id);
+                       Fatal("Unknown sensor id: %d", s->id);
                        break;
        }       
        usleep(100000); // simulate delay in sensor polling
 
-       return d;
+       // 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;
+               s->newest_data.value = d->value;
+       }
+       return result;
 }
\ No newline at end of file

UCC git Repository :: git.ucc.asn.au