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