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#include "mltypes.h"
8c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
9c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifndef INV_RESULTS_HOLDER_H__
10c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define INV_RESULTS_HOLDER_H__
11c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
12c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef __cplusplus
13c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroextern "C" {
14c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
15c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
16c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define INV_MOTION                       0x0001
17c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define INV_NO_MOTION                    0x0002
18c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
19c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
20c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
21c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /**************************************************************************/
22c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /*  The value of inv_get_gyro_sum_of_sqr is scaled such the (1 dps)^2 =   */
23c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /*  2^GYRO_MAG_SQR_SHIFT. This number must be >=0 and even.               */
24c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /*  The value of inv_accel_sum_of_sqr is scaled such that (1g)^2 =        */
25c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /*  2^ACC_MAG_SQR_SHIFT                                                   */
26c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /**************************************************************************/
27c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define ACC_MAG_SQR_SHIFT 16
28c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
29c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroenum compass_local_field_e {
30c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    // status for user input earth magnetic local field
31c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    LOCAL_FILED_NOT_SET_BY_USER                     = 0,
32c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    LOCAL_FILED_SET_BY_USER                         = 1,
33c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
34c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    // status for mpl calibrated based magnetical field
35c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    LOCAL_FILED_NOT_SET_BY_USER_BUT_SET_BY_MPL      = 2,
36c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    LOCAL_FIELD_SET_BUT_NOT_MATCH_WITH_MPL          = 3,
37c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    LOCAL_FIELD_SET_MATCH_WITH_MPL                  = 4,
38c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro};
39c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
40c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarostruct local_field_t {
41c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    float intensity;  // radius
42c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    float inclination; // dip angle angle degree
43c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    float declination; // yaw deviation angle from true north, eastward as positive
44c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    enum compass_local_field_e mpl_match_status;
45c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro};
46c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
47c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro// earth magnetic field access API
48c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroenum compass_local_field_e inv_get_local_field_status(void);
49c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid inv_set_local_field_status(enum compass_local_field_e status);
50c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
51c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid inv_set_earth_magnetic_local_field_parameter(struct local_field_t *parameters);
52c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid inv_get_earth_magnetic_local_field_parameter(struct local_field_t *parameters);
53c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
54c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro// mpl calibrated magnetic field access API
55c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroenum compass_local_field_e inv_get_mpl_mag_field_status(void);
56c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid inv_set_mpl_mag_field_status(enum compass_local_field_e status);
57c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
58c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_set_mpl_magnetic_local_field_parameter(struct local_field_t *parameters);
59c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid inv_get_mpl_magnetic_local_field_parameter(struct local_field_t *parameters);
60c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
61c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro// quaternion store API
62c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid inv_store_gaming_quaternion(const long *quat, inv_time_t timestamp);
63c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid inv_store_accel_quaternion(const long *quat, inv_time_t timestamp);
64c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid inv_store_nav_quaternion(const float *quat, inv_time_t timestamp);
65c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid inv_store_game_quaternion(const float *quat, inv_time_t timestamp);
66c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid inv_store_geomag_quaternion(const float *quat, inv_time_t timestamp);
67c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
68c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro// States
69c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define SF_NORMAL 0
70c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define SF_UNCALIBRATED 1
71c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define SF_STARTUP_SETTLE 2
72c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define SF_FAST_SETTLE 3
73c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define SF_DISTURBANCE 4
74c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define SF_SLOW_SETTLE 5
75c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
76c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro// These 2 status bits are used to control when the 9 axis quaternion is updated
77c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define INV_COMPASS_CORRECTION_SET 1
78c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define INV_6_AXIS_QUAT_SET 2
79c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define INV_GEOMAGNETIC_CORRECTION_SET 4
80c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
81c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint inv_get_acc_state();
82c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid inv_set_acc_state(int state);
83c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint inv_get_motion_state(unsigned int *cntr);
84c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid inv_set_motion_state(unsigned char state);
85c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_get_gravity(long *data);
86c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_get_gravity_6x(long *data);
87c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_get_6axis_quaternion(long *data, inv_time_t *timestamp);
88c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_get_quaternion(long *data);
89c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_get_quaternion_float(float *data);
90c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_get_6axis_quaternion_float(float *data, inv_time_t *timestamp);
91c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_get_geomagnetic_quaternion_float(float *data, inv_time_t *timestamp);
92c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef WIN32
93c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_get_last_quaternion(long *data);
94c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_set_last_quaternion(long *data);
95c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
96c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid inv_get_quaternion_set(long *data, int *accuracy, inv_time_t *timestamp);
97c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_get_accel_quaternion(long *data);
98c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_get_geomagnetic_quaternion(long *data, inv_time_t *timestamp);
99c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid inv_set_geomagnetic_compass_correction(const long *data, inv_time_t timestamp);
100c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid inv_get_geomagnetic_compass_correction(long *data, inv_time_t *timestamp);
101c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_get_result_holder_status(long *rh_status);
102c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_set_result_holder_status(long rh_status);
103c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_get_quaternion_validity(int *value);
104c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_set_quaternion_validity(int value);
105c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
106c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro// set magnetic field by location
107c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_set_local_magnetic_field(float intensity, float inclination, float declination);
108c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
109c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_enable_results_holder();
110c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_init_results_holder(void);
111c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
112c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/* Magnetic Field Parameters*/
113c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid inv_set_mag_scale(const long *data);
114c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid inv_get_mag_scale(long *data);
115c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid inv_set_compass_correction(const long *data, inv_time_t timestamp);
116c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid inv_get_compass_correction(long *data, inv_time_t *timestamp);
117c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint inv_got_compass_bias();
118c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid inv_set_compass_bias_found(int state);
119c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint inv_get_large_mag_field();
120c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid inv_set_large_mag_field(int state);
121c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid inv_set_compass_state(int state);
122c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint inv_get_compass_state();
123c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid inv_set_compass_bias_error(const long *bias_error);
124c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid inv_get_compass_bias_error(long *bias_error);
125c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_get_linear_accel(long *data);
126c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_get_accel(long *data);
127c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_get_accel_float(float *data);
128c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_get_gyro_float(float *data);
129c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_get_linear_accel_float(float *data);
130c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid inv_set_heading_confidence_interval(float ci);
131c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarofloat inv_get_heading_confidence_interval(void);
132c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
133c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid inv_set_accel_compass_confidence_interval(float ci);
134c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarofloat inv_get_accel_compass_confidence_interval(void);
135c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
136c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroint inv_got_accel_bias();
137c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarovoid inv_set_accel_bias_found(int state);
138c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
139c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
140c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#ifdef __cplusplus
141c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
142c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif
143c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
144c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#endif // INV_RESULTS_HOLDER_H__
145