1/*
2 $License:
3    Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
4    See included License.txt for License information.
5 $
6 */
7#ifndef INV_DATA_BUILDER_H__
8#define INV_DATA_BUILDER_H__
9
10#include <stdio.h>
11#include "mltypes.h"
12
13#ifdef __cplusplus
14extern "C" {
15#endif
16
17// Uncomment this flag to enable playback debug and record or playback scenarios
18//#define INV_PLAYBACK_DBG
19
20/** This is a new sample of accel data */
21#define INV_ACCEL_NEW 1
22/** This is a new sample of gyro data */
23#define INV_GYRO_NEW 2
24/** This is a new sample of compass data */
25#define INV_MAG_NEW 4
26/** This is a new sample of temperature data */
27#define INV_TEMP_NEW 8
28/** This is a new sample of quaternion data */
29#define INV_QUAT_NEW 16
30/** This is a new sample of pressure data */
31#define INV_PRESSURE_NEW 32
32
33/** Set if the data is contiguous. Typically not set if a sample was skipped */
34#define INV_CONTIGUOUS 16
35/** Set if the calibrated data has been solved for */
36#define INV_CALIBRATED 32
37/** INV_NEW_DATA set for a new set of data, cleared if not available. */
38#define INV_NEW_DATA 64
39/** Set if raw data exists */
40#define INV_RAW_DATA 128
41/** Set if the sensor is on */
42#define INV_SENSOR_ON 256
43/** Set if quaternion has bias correction applied */
44#define INV_BIAS_APPLIED 512
45/** Set if quaternion is 6-axis from DMP */
46#define INV_QUAT_6AXIS 1024
47/** Set if quaternion is 9 axis from DMP */
48#define INV_QUAT_9AXIS 2048
49/** Set if quaternion is 3-axis from DMP */
50#define INV_QUAT_3AXIS 4096
51/** Set if DMP has applied bias */
52#define INV_DMP_BIAS_APPLIED 8192
53/** Set if quaternion is 3 elements (android only) */
54#define INV_QUAT_3ELEMENT 16384
55
56#define INV_PRIORITY_MOTION_NO_MOTION          100
57#define INV_PRIORITY_GYRO_TC                   150
58#define INV_PRIORITY_QUATERNION_GYRO_ACCEL     200
59#define INV_PRIORITY_QUATERNION_NO_GYRO        250
60#define INV_PRIORITY_MAGNETIC_DISTURBANCE      300
61#define INV_PRIORITY_HEADING_FROM_GYRO         350
62#define INV_PRIORITY_COMPASS_BIAS_W_GYRO       375
63#define INV_PRIORITY_COMPASS_VECTOR_CAL        400
64#define INV_PRIORITY_COMPASS_ADV_BIAS          500
65#define INV_PRIORITY_9_AXIS_FUSION             600
66#define INV_PRIORITY_9_AXIS_FUSION_LIGHT       650
67#define INV_PRIORITY_QUATERNION_ADJUST_9_AXIS  700
68#define INV_PRIORITY_QUATERNION_ACCURACY       750
69#define INV_PRIORITY_RESULTS_HOLDER            800
70#define INV_PRIORITY_INUSE_AUTO_CALIBRATION    850
71#define INV_PRIORITY_HAL_OUTPUTS               900
72#define INV_PRIORITY_GLYPH                     950
73#define INV_PRIORITY_SHAKE                     975
74#define INV_PRIORITY_SM                        1000
75
76struct inv_single_sensor_t {
77    /** Orientation Descriptor. Describes how to go from the mounting frame to the body frame when
78    * the rotation matrix could be thought of only having elements of 0,1,-1.
79    * 2 bits are used to describe the column of the 1 or -1 and the 3rd bit is used for the sign.
80    * Bit 8 is sign of +/- 1 in third row. Bit 6-7 is column of +/-1 in third row.
81    * Bit 5 is sign of +/- 1 in second row. Bit 3-4 is column of +/-1 in second row.
82    * Bit 2 is sign of +/- 1 in first row. Bit 0-1 is column of +/-1 in first row.
83    */
84    int orientation;
85    /** The raw data in raw data units in the mounting frame */
86    short raw[3];
87    /** Raw data in body frame */
88    long raw_scaled[3];
89    /** Calibrated data */
90    long calibrated[3];
91    long sensitivity;
92    /** Sample rate in microseconds */
93    long sample_rate_us;
94    long sample_rate_ms;
95    /** INV_CONTIGUOUS is set for contiguous data. Will not be set if there was a sample
96    * skipped due to power savings turning off this sensor.
97    * INV_NEW_DATA set for a new set of data, cleared if not available.
98    * INV_CALIBRATED_SET if calibrated data has been solved for */
99    int status;
100    /** 0 to 3 for how well sensor data and biases are known. 3 is most accurate. */
101    int accuracy;
102    inv_time_t timestamp;
103    inv_time_t timestamp_prev;
104    /** Bandwidth in Hz */
105    int bandwidth;
106};
107
108struct inv_quat_sensor_t {
109    long raw[4];
110    /** INV_CONTIGUOUS is set for contiguous data. Will not be set if there was a sample
111    * skipped due to power savings turning off this sensor.
112    * INV_NEW_DATA set for a new set of data, cleared if not available.
113    * INV_CALIBRATED_SET if calibrated data has been solved for */
114    int status;
115    inv_time_t timestamp;
116    inv_time_t timestamp_prev;
117    long sample_rate_us;
118    long sample_rate_ms;
119};
120
121struct inv_soft_iron_t {
122    long raw[3];
123    long trans[3];
124    long matrix_d[9];  // Q30 format fixed point. The dynamic range is (-2.0 to 2.0);
125    float matrix_f[9];
126
127    int enable;
128};
129
130struct inv_sensor_cal_t {
131    struct inv_single_sensor_t gyro;
132    struct inv_single_sensor_t accel;
133    struct inv_single_sensor_t compass;
134    struct inv_single_sensor_t temp;
135    struct inv_quat_sensor_t quat;
136    struct inv_single_sensor_t pressure;
137    struct inv_soft_iron_t soft_iron;
138    /** Combinations of INV_GYRO_NEW, INV_ACCEL_NEW, INV_MAG_NEW to indicate
139    * which data is a new sample as these data points may have different sample rates.
140    */
141    int status;
142};
143
144// Useful for debug record and playback
145typedef enum {
146    RD_NO_DEBUG,
147    RD_RECORD,
148    RD_PLAYBACK
149} rd_dbg_mode;
150
151typedef enum {
152    PLAYBACK_DBG_TYPE_GYRO,
153    PLAYBACK_DBG_TYPE_ACCEL,
154    PLAYBACK_DBG_TYPE_COMPASS,
155    PLAYBACK_DBG_TYPE_TEMPERATURE,
156    PLAYBACK_DBG_TYPE_EXECUTE,
157    PLAYBACK_DBG_TYPE_A_ORIENT,
158    PLAYBACK_DBG_TYPE_G_ORIENT,
159    PLAYBACK_DBG_TYPE_C_ORIENT,
160    PLAYBACK_DBG_TYPE_A_SAMPLE_RATE,
161    PLAYBACK_DBG_TYPE_C_SAMPLE_RATE,
162    PLAYBACK_DBG_TYPE_G_SAMPLE_RATE,
163    PLAYBACK_DBG_TYPE_GYRO_OFF,
164    PLAYBACK_DBG_TYPE_ACCEL_OFF,
165    PLAYBACK_DBG_TYPE_COMPASS_OFF,
166    PLAYBACK_DBG_TYPE_Q_SAMPLE_RATE,
167    PLAYBACK_DBG_TYPE_QUAT,
168    PLAYBACK_DBG_TYPE_QUAT_OFF
169} inv_rd_dbg_states;
170
171/** Change this key if the definition of the struct inv_db_save_t changes.
172    Previous keys: 53394, 53395, 53396 */
173#define INV_DB_SAVE_KEY (53397)
174
175#define INV_DB_SAVE_MPL_KEY (50001)
176#define INV_DB_SAVE_ACCEL_MPL_KEY (50002)
177
178struct inv_db_save_t {
179    /** compass Bias in chip frame, hardware units scaled by 2^16. */
180    long compass_bias[3];
181    /** gyro factory bias in chip frame, hardware units scaled by 2^16,
182        +/- 2000 dps full scale. */
183    long factory_gyro_bias[3];
184    /** accel factory bias in chip frame, hardware units scaled by 2^16,
185        +/- 2 gee full scale. */
186    long factory_accel_bias[3];
187    /** temperature when factory_gyro_bias was stored. */
188    long gyro_temp;
189    /** flag to indicate temperature compensation that biases where stored. */
190    int gyro_bias_tc_set;
191    /** temperature when accel bias was stored. */
192    long accel_temp;
193    long gyro_temp_slope[3];
194    /** sensor accuracies */
195    int gyro_accuracy;
196    int accel_accuracy;
197    int compass_accuracy;
198};
199
200struct inv_db_save_mpl_t {
201    /** gyro bias in chip frame, hardware units scaled by 2^16, +/- 2000 dps
202        full scale */
203    long gyro_bias[3];
204};
205
206struct inv_db_save_accel_mpl_t {
207    /** accel bias in chip frame, hardware units scaled by 2^16, +/- 2 gee
208        full scale */
209    long accel_bias[3];
210};
211
212/** Maximum number of data callbacks that are supported. Safe to increase if needed.*/
213#define INV_MAX_DATA_CB 20
214
215#ifdef INV_PLAYBACK_DBG
216void inv_turn_on_data_logging(FILE *file);
217void inv_turn_off_data_logging();
218#endif
219
220void inv_set_gyro_orientation_and_scale(int orientation, long sensitivity);
221void inv_set_accel_orientation_and_scale(int orientation,
222        long sensitivity);
223void inv_set_compass_orientation_and_scale(int orientation,
224        long sensitivity);
225void inv_set_gyro_sample_rate(long sample_rate_us);
226void inv_set_compass_sample_rate(long sample_rate_us);
227void inv_set_quat_sample_rate(long sample_rate_us);
228void inv_set_accel_sample_rate(long sample_rate_us);
229void inv_set_gyro_bandwidth(int bandwidth_hz);
230void inv_set_accel_bandwidth(int bandwidth_hz);
231void inv_set_compass_bandwidth(int bandwidth_hz);
232
233void inv_get_gyro_sample_rate_ms(long *sample_rate_ms);
234void inv_get_accel_sample_rate_ms(long *sample_rate_ms);
235void inv_get_compass_sample_rate_ms(long *sample_rate_ms);
236
237inv_error_t inv_register_data_cb(inv_error_t (*func)
238                                 (struct inv_sensor_cal_t * data), int priority,
239                                 int sensor_type);
240inv_error_t inv_unregister_data_cb(inv_error_t (*func)
241                                   (struct inv_sensor_cal_t * data));
242
243inv_error_t inv_build_gyro(const short *gyro, inv_time_t timestamp);
244inv_error_t inv_build_compass(const long *compass, int status,
245                                  inv_time_t timestamp);
246inv_error_t inv_build_accel(const long *accel, int status,
247                            inv_time_t timestamp);
248inv_error_t inv_build_temp(const long temp, inv_time_t timestamp);
249inv_error_t inv_build_quat(const long *quat, int status, inv_time_t timestamp);
250inv_error_t inv_build_pressure(const long pressure, int status, inv_time_t timestamp);
251inv_error_t inv_execute_on_data(void);
252
253void inv_get_compass_bias(long *bias);
254
255void inv_set_compass_bias(const long *bias, int accuracy);
256void inv_set_compass_disturbance(int dist);
257void inv_set_gyro_bias(const long *bias);
258void inv_set_mpl_gyro_bias(const long *bias, int accuracy);
259void inv_set_accel_bias(const long *bias);
260void inv_set_mpl_accel_bias(const long *bias, int accuracy);
261void inv_set_accel_accuracy(int accuracy);
262void inv_set_accel_bias_mask(const long *bias, int accuracy, int mask);
263
264void inv_get_compass_soft_iron_matrix_d(long *matrix);
265void inv_set_compass_soft_iron_matrix_d(long *matrix);
266
267void inv_get_compass_soft_iron_matrix_f(float *matrix);
268void inv_set_compass_soft_iron_matrix_f(float *matrix);
269
270void inv_get_compass_soft_iron_output_data(long *data);
271void inv_get_compass_soft_iron_input_data(long *data);
272void inv_set_compass_soft_iron_input_data(const long *data);
273
274void inv_reset_compass_soft_iron_matrix(void);
275void inv_enable_compass_soft_iron_matrix(void);
276void inv_disable_compass_soft_iron_matrix(void);
277
278void inv_get_mpl_gyro_bias(long *bias, long *temp);
279void inv_get_gyro_bias(long *bias);
280void inv_get_gyro_bias_dmp_units(long *bias);
281int inv_get_factory_accel_bias_mask();
282void inv_get_mpl_accel_bias(long *bias, long *temp);
283void inv_get_accel_bias(long *bias);
284void inv_get_accel_bias_dmp_units(long *bias);
285
286void inv_gyro_was_turned_off(void);
287void inv_accel_was_turned_off(void);
288void inv_compass_was_turned_off(void);
289void inv_quaternion_sensor_was_turned_off(void);
290inv_error_t inv_init_data_builder(void);
291long inv_get_gyro_sensitivity(void);
292long inv_get_accel_sensitivity(void);
293long inv_get_compass_sensitivity(void);
294
295void inv_get_accel_set(long *data, int8_t *accuracy, inv_time_t * timestamp);
296void inv_get_gyro_set(long *data, int8_t *accuracy, inv_time_t * timestamp);
297void inv_get_gyro_set_raw(long *data, int8_t *accuracy, inv_time_t * timestamp);
298void inv_get_compass_set(long *data, int8_t *accuracy, inv_time_t * timestamp);
299void inv_get_compass_set_raw(long *data, int8_t *accuracy, inv_time_t * timestamp);
300
301void inv_get_gyro(long *gyro);
302
303int inv_get_gyro_accuracy(void);
304int inv_get_accel_accuracy(void);
305int inv_get_mag_accuracy(void);
306void inv_get_raw_compass(short *raw);
307
308int inv_get_compass_on(void);
309int inv_get_gyro_on(void);
310int inv_get_accel_on(void);
311
312inv_time_t inv_get_last_timestamp(void);
313int inv_get_compass_disturbance(void);
314
315// new DMP cal functions
316inv_error_t inv_get_gyro_orient(int *orient);
317inv_error_t inv_get_accel_orient(int *orient);
318
319#ifdef WIN32
320void inv_overwrite_dmp_9quat(void);
321#endif
322
323// internal
324int inv_get_gyro_bias_tc_set(void);
325int inv_get_9_axis_timestamp(long sample_rate_us, inv_time_t *ts);
326int inv_get_6_axis_gyro_accel_timestamp(long sample_rate_us, inv_time_t *ts);
327int inv_get_6_axis_compass_accel_timestamp(long sample_rate_us, inv_time_t *ts);
328
329#ifdef __cplusplus
330}
331#endif
332
333#endif  /* INV_DATA_BUILDER_H__ */
334