altos: Record all failed sensors and report status at power up
[fw/altos] / src / kernel / ao_data.h
index 3918f4e04e4b9cf6931fcb5aaa85ad50695bc083..4fc9db8f16a7810ba8b54c89619bf9331f97608e 100644 (file)
 #define AO_DATA_ADXL375 0
 #endif
 
+#if HAS_MAX6691
+#include <ao_max6691.h>
+#define AO_DATA_MAX6691 (1 << 4)
+#else
+#define AO_DATA_MAX6691 0
+#endif
+
+#ifndef HAS_SENSOR_ERRORS
+#if HAS_IMU || HAS_MMA655X || HAS_MS5607 || HAS_MS5611
+#define HAS_SENSOR_ERRORS      1
+#endif
+#endif
+
+#if HAS_SENSOR_ERRORS
+extern uint8_t                 ao_sensor_errors;
+#endif
+
 #ifdef AO_DATA_RING
 
 #define AO_DATA_ALL    (AO_DATA_ADC|AO_DATA_MS5607|AO_DATA_MPU6000|AO_DATA_HMC5883|AO_DATA_MMA655X|AO_DATA_MPU9250|AO_DATA_ADXL375)
@@ -100,6 +117,12 @@ struct ao_data {
 #if HAS_ADXL375
        struct ao_adxl375_sample        adxl375;
 #endif
+#if HAS_MAX6691
+       struct ao_max6691_sample        max6691;
+#endif
+#if HAS_ADS131A0X
+       struct ao_ads131a0x_sample      ads131a0x;
+#endif
 };
 
 #define ao_data_ring_next(n)   (((n) + 1) & (AO_DATA_RING - 1))
@@ -119,6 +142,12 @@ extern volatile uint8_t            ao_data_count;
  */
 #define AO_DATA_PRESENT(bit)   (ao_data_present |= (bit))
 
+/*
+ * Mark sensor failed, and unblock the sample collection code by
+ * marking the data as present
+ */
+#define AO_SENSOR_ERROR(bit)   (ao_data_present |= (ao_sensor_errors |= (bit)))
+
 /*
  * Wait until it is time to write a sensor sample; this is
  * signaled by the timer tick
@@ -328,8 +357,6 @@ typedef int16_t     accel_t;
 
 #define HAS_ACCEL      1
 
-#define AO_ACCEL_INVERT                0
-
 typedef int16_t accel_t;
 
 /* MPU6000 is hooked up so that positive y is positive acceleration */
@@ -382,6 +409,7 @@ typedef int16_t angle_t;    /* in degrees */
 /* X axis is aligned in the other board axis (across) */
 /* Z axis is aligned perpendicular to the board (through) */
 
+#ifndef ao_data_along
 #define ao_data_along(packet)  ((packet)->mpu9250.accel_y)
 #define ao_data_across(packet) ((packet)->mpu9250.accel_x)
 #define ao_data_through(packet)        ((packet)->mpu9250.accel_z)
@@ -389,6 +417,7 @@ typedef int16_t angle_t;    /* in degrees */
 #define ao_data_roll(packet)   ((packet)->mpu9250.gyro_y)
 #define ao_data_pitch(packet)  ((packet)->mpu9250.gyro_x)
 #define ao_data_yaw(packet)    ((packet)->mpu9250.gyro_z)
+#endif
 
 static inline float ao_convert_gyro(float sensor)
 {
@@ -425,9 +454,11 @@ typedef int16_t ao_mag_t;          /* in raw sample units */
  * sensors. Also, the Z axis is flipped in sign.
  */
 
+#ifndef ao_data_mag_along
 #define ao_data_mag_along(packet)      ((packet)->mpu9250.mag_x)
 #define ao_data_mag_across(packet)     ((packet)->mpu9250.mag_y)
 #define ao_data_mag_through(packet)    ((packet)->mpu9250.mag_z)
+#endif
 
 #endif
 
@@ -453,6 +484,12 @@ ao_data_fill(int head) {
 #endif
 #if HAS_ADXL375
                ao_data_ring[head].adxl375 = ao_adxl375_current;
+#endif
+#if HAS_MAX6691
+               ao_data_ring[head].max6691 = ao_max6691_current;
+#endif
+#if HAS_ADS131A0X
+               ao_data_ring[head].ads131a0x = ao_ads131a0x_current;
 #endif
                ao_data_ring[head].tick = ao_tick_count;
                ao_data_head = ao_data_ring_next(head);