included analog and digital fail test sensors
authorCallum <callum@callum-ubuntu.(none)>
Thu, 12 Sep 2013 13:26:53 +0000 (21:26 +0800)
committerCallum <callum@callum-ubuntu.(none)>
Thu, 12 Sep 2013 13:26:53 +0000 (21:26 +0800)
server/sensor.c
server/sensor.h

index 9055409..2a0e762 100644 (file)
 static Sensor g_sensors[NUMSENSORS]; //global to this file
 const char * g_sensor_names[NUMSENSORS] = {    
        "analog_test0", "analog_test1", 
-       "digital_test0", "digital_test1"
+       "analog_fail0", "digital_test0", 
+       "digital_test1", "digital_fail0"
 };
 
+/**
+ * Checks the sensor data for unsafe or unexpected results 
+ * @param sensor_id - The ID of the sensor
+ * @param value - The value of the sensor to check
+ */
+void CheckSensor( SensorId sensor_id, double value)
+{
+       switch (sensor_id)
+       {
+               case ANALOG_FAIL0:
+               {
+                       if( value > ANALOG_FAIL0_SAFETY || value < ANALOG_FAIL0_MIN_SAFETY)
+                       {
+                               Log(LOGERR, "Sensor analog_fail0 is above or below its safety value of %d or %d\n", ANALOG_FAIL0_SAFETY, ANALOG_FAIL0_MIN_SAFETY);
+                       //new function that stops actuators?
+                       }
+                       else if( value > ANALOG_FAIL0_WARN || value < ANALOG_FAIL0_MIN_WARN)
+                       {
+                               Log(LOGWARN, "Sensor analog_test0 is above or below its warning value of %d or %d\n", ANALOG_FAIL0_WARN, ANALOG_FAIL0_MIN_WARN);        
+                       }
+                       break;
+               }
+               case DIGITAL_FAIL0:
+               {       
+                       if( value != 0 && value != 1)
+                       {
+                               Log(LOGERR, "Sensor digital_fail0 is not 0 or 1\n");
+                       }
+                       break;
+               }
+               default:
+               {
+               //So it doesn't complain about the missing cases - in practice we will need all sensors to be checked as above, no need to include a default as we should only pass valid sensor_id's; unless for some reason we have a sensor we don't need to check (but then why would you pass to this function in the first place :P)
+               }
+       }
+}
+
 /**
  * Read a data value from a sensor; block until value is read
  * @param sensor_id - The ID of the sensor
@@ -45,8 +83,6 @@ DataPoint * GetData(SensorId sensor_id, DataPoint * d)
        {
                case ANALOG_TEST0:
                {
-                       //CheckSensor( sensor_id, *sensor value*); 
-               
                        static int count = 0;
                        d->value = count++;
                        break;
@@ -54,7 +90,11 @@ DataPoint * GetData(SensorId sensor_id, DataPoint * d)
                case ANALOG_TEST1:
                        d->value = (double)(rand() % 100) / 100;
                        break;
-       
+               case ANALOG_FAIL0:
+                       d->value = (double)(rand() % 6) * -( rand() % 2) / ( rand() % 100 + 1);
+                       //Gives a value between -5 and 5
+                       CheckSensor(sensor_id, d->value);
+                       break;
                //TODO: For digital sensors, consider only updating when sensor is actually changed
                case DIGITAL_TEST0:
                        d->value = t.tv_sec % 2;
@@ -62,6 +102,13 @@ DataPoint * GetData(SensorId sensor_id, DataPoint * d)
                case DIGITAL_TEST1:
                        d->value = (t.tv_sec+1)%2;
                        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
+                       CheckSensor(sensor_id, d->value);
+                       break;
                default:
                        Fatal("Unknown sensor id: %d", sensor_id);
                        break;
@@ -71,34 +118,6 @@ DataPoint * GetData(SensorId sensor_id, DataPoint * d)
        return d;
 }
 
-/**
- * Checks the sensor data for unsafe or unexpected results 
- * @param sensor_id - The ID of the sensor
- *
-*
-void CheckSensor( SensorId sensor_id)
-{
-       switch (sensor_id)
-       {
-               case ANALOG_TEST0:
-               {
-                       if( *sensor value* > ANALOG_TEST0_SAFETY)
-                       {
-                               LogEx(LOGERR, GetData, Sensor analog_test0 is above the safe value);
-                       //new log function that stops actuators?
-                       }
-                       //Also include a warning level?
-                       else if( *sensor value* > ANALOG_TEST0_WARN)
-                       {
-                               LogEx(LOGWARN, GetData, Sensor analog_test0);   
-                       }
-               }
-       }
-               
-       
-*/     
-
-
 /**
  * Destroy a sensor
  * @param s - Sensor to destroy
index 36fdb27..f834f7a 100644 (file)
 #define SENSOR_QUERYBUFSIZ 10
 
 /** Number of sensors **/
-#define NUMSENSORS 4
+#define NUMSENSORS 6
 
 /** Safety Values for sensors **/
-#define ANALOG_TEST0_SAFETY 1000
-#define ANALOG_TEST1_SAFETY 1000
-#define DIGITAL_TEST0_SAFETY 1
-#define DIGITAL_TEST1_SAFETY 1
-
+#define ANALOG_FAIL0_WARN 4
+#define ANALOG_FAIL0_SAFETY 5
+#define ANALOG_FAIL0_MIN_WARN -4
+#define ANALOG_FAIL0_MIN_SAFETY -5
 
 typedef enum SensorId {
        ANALOG_TEST0,
        ANALOG_TEST1,
+       ANALOG_FAIL0,
        DIGITAL_TEST0,
-       DIGITAL_TEST1
+       DIGITAL_TEST1,
+       DIGITAL_FAIL0
 } SensorId;
 
 typedef enum

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