+#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)->z_accel)
+#define ao_data_accel_cook(packet) (-(packet)->mpu6000.accel_y)
+#define ao_data_set_accel(packet, accel) ((packet)->z_accel = (accel))
+#define ao_data_accel_invert(a) (-(a))
+
+#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