} while (0);
/*
- * Wait for data to be completed by looking at the
- * indicated bit
+ * Wait until it is time to write a sensor sample; this is
+ * signaled by the timer tick
*/
#define AO_DATA_WAIT() do { \
ao_sleep((void *) &ao_data_count); \
} while (0)
+#if !HAS_BARO && HAS_MS5607
-#if HAS_MS5607
+/* Either an MS5607 or an MS5611 hooked to a SPI port
+ */
+
+#define HAS_BARO 1
typedef int32_t pres_t;
typedef int32_t alt_t;
#define pres_to_altitude(p) ao_pa_to_altitude(p)
-#else /* HAS_MS5607 */
+#endif
+
+#if !HAS_BARO && HAS_ADC
+
+#define HAS_BARO 1
typedef int16_t pres_t;
typedef int16_t alt_t;
#define pres_to_altitude(p) ao_pres_to_altitude(p)
#define ao_data_pres_cook(p)
-#endif /* else HAS_MS5607 */
+#endif
/*
* Need a few macros to pull data from the sensors:
* ao_data_accel_invert - flip rocket ends for positive acceleration
*/
-#if HAS_MPU6000 && !HAS_HIGHG_ACCEL
-
-typedef int16_t accel_t;
-
-/* MPU6000 is hooked up so that positive y is positive acceleration */
-#define ao_data_accel(packet) ((packet)->mpu6000.accel_y)
-#define ao_data_accel_cook(packet) (-(packet)->mpu6000.accel_y)
-#define ao_data_set_accel(packet, accel) ((packet)->mpu6000.accel_y = (accel))
-#define ao_data_accel_invert(a) (-(a))
+#if HAS_ACCEL
-#else /* HAS_MPU6000 && !HAS_HIGHG_ACCEL */
+/* This section is for an analog accelerometer hooked to one of the ADC pins. As
+ * those are 5V parts, this also requires that the 5V supply be hooked to to anothe ADC
+ * pin so that the both can be measured to correct for changes between the 3.3V and 5V rails
+ */
typedef int16_t accel_t;
#define ao_data_accel(packet) ((packet)->adc.accel)
#endif /* HAS_ACCEL_REF */
-#endif /* else some other accel sensor */
+#endif /* HAS_ACCEL */
+
+#if !HAS_ACCEL && HAS_MMA655X
+
+#define HAS_ACCEL 1
+
+typedef int16_t accel_t;
+
+/* MMA655X is hooked up so that positive values represent negative acceleration */
+
+#define ao_data_accel(packet) ((packet)->mma655x)
+#define ao_data_accel_cook(packet) ((packet)->mma655x)
+#define ao_data_set_accel(packet, accel) ((packet)->mma655x = (accel))
+#define ao_data_accel_invert(accel) (4095 - (accel))
+
+#endif
+
+#if !HAS_ACCEL && HAS_MPU6000
+
+#define HAS_ACCEL 1
+
+typedef int16_t accel_t;
+
+/* MPU6000 is hooked up so that positive y is positive acceleration */
+#define ao_data_accel(packet) ((packet)->mpu6000.accel_y)
+#define ao_data_accel_cook(packet) (-(packet)->mpu6000.accel_y)
+#define ao_data_set_accel(packet, accel) ((packet)->mpu6000.accel_y = (accel))
+#define ao_data_accel_invert(a) (-(a))
+
+#endif
#endif /* _AO_DATA_H_ */
/*
* Above this height, the baro sensor doesn't work
*/
+#if HAS_MS5607
+#define AO_MAX_BARO_HEIGHT 30000
+#else
#define AO_MAX_BARO_HEIGHT 12000
+#endif
/*
* Above this speed, baro measurements are unreliable
#define AO_MSS_TO_ACCEL(mss) ((int16_t) ((mss) * 16))
extern __pdata uint16_t ao_sample_tick; /* time of last data */
-extern __pdata pres_t ao_sample_pres; /* most recent pressure sensor reading */
-extern __pdata alt_t ao_sample_alt; /* MSL of ao_sample_pres */
-extern __pdata alt_t ao_sample_height; /* AGL of ao_sample_pres */
extern __data uint8_t ao_sample_adc; /* Ring position of last processed sample */
extern __data uint8_t ao_sample_data; /* Ring position of last processed sample */
-#if HAS_ACCEL
-extern __pdata accel_t ao_sample_accel; /* most recent accel sensor reading */
-#endif
-
+#if HAS_BARO
+extern __pdata pres_t ao_sample_pres; /* most recent pressure sensor reading */
+extern __pdata alt_t ao_sample_alt; /* MSL of ao_sample_pres */
+extern __pdata alt_t ao_sample_height; /* AGL of ao_sample_pres */
extern __pdata pres_t ao_ground_pres; /* startup pressure */
extern __pdata alt_t ao_ground_height; /* MSL of ao_ground_pres */
+#endif
#if HAS_ACCEL
+extern __pdata accel_t ao_sample_accel; /* most recent accel sensor reading */
extern __pdata accel_t ao_ground_accel; /* startup acceleration */
extern __pdata accel_t ao_accel_2g; /* factory accel calibration */
extern __pdata int32_t ao_accel_scale; /* sensor to m/s² conversion */
#define __code
#define __reentrant
+#define HAS_FLIGHT 1
+#define HAS_IGNITE 1
+#define HAS_USB 1
+#define HAS_GPS 1
+#ifndef HAS_ACCEL
+#define HAS_ACCEL 1
+#define HAS_ACCEL_REF 0
+#endif
+
#include <ao_data.h>
#define to_fix16(x) ((int16_t) ((x) * 65536.0 + 0.5))
#define DATA_TO_XDATA(x) (x)
-#define HAS_FLIGHT 1
-#define HAS_IGNITE 1
-#define HAS_ADC 1
-#define HAS_USB 1
-#define HAS_GPS 1
-#ifndef HAS_ACCEL
-#define HAS_ACCEL 1
-#define HAS_ACCEL_REF 0
-#endif
#define GRAVITY 9.80665
extern int16_t ao_ground_accel, ao_flight_accel;
extern int16_t ao_accel_2g;
+typedef int16_t accel_t;
+
extern uint16_t ao_sample_tick;
extern int16_t ao_sample_height;
-extern int16_t ao_sample_accel;
+extern accel_t ao_sample_accel;
extern int32_t ao_accel_scale;
extern int16_t ao_ground_height;
extern int16_t ao_sample_alt;