#define ao_data_ring_next(n) (((n) + 1) & (AO_DATA_RING - 1))
#define ao_data_ring_prev(n) (((n) - 1) & (AO_DATA_RING - 1))
+/* Get a copy of the last complete sample set */
+void
+ao_data_get(__xdata struct ao_data *packet);
+
extern volatile __xdata struct ao_data ao_data_ring[AO_DATA_RING];
extern volatile __data uint8_t ao_data_head;
extern volatile __data uint8_t ao_data_present;
#endif
+#if !HAS_GYRO && HAS_MPU6000
+
+#define HAS_GYRO 1
+
+typedef int16_t gyro_t;
+typedef int32_t angle_t;
+
+/* Y axis is aligned with the direction of motion (along) */
+/* X axis is aligned in the other board axis (across) */
+/* Z axis is aligned perpendicular to the board (through) */
+
+#define ao_data_along(packet) ((packet)->mpu6000.accel_y)
+#define ao_data_across(packet) ((packet)->mpu6000.accel_x)
+#define ao_data_through(packet) ((packet)->mpu6000.accel_z)
+
+#define ao_data_roll(packet) ((packet)->mpu6000.gyro_y)
+#define ao_data_pitch(packet) ((packet)->mpu6000.gyro_x)
+#define ao_data_yaw(packet) ((packet)->mpu6000.gyro_z)
+
+#endif
+
#endif /* _AO_DATA_H_ */