blob: a4c7a39f5f2996bc67582c3a58abd2479f1f00c3 [file] [log] [blame]
/*
$License:
Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
See included License.txt for License information.
$
*/
#ifndef INV_DATA_BUILDER_H__
#define INV_DATA_BUILDER_H__
#include <stdio.h>
#include "mltypes.h"
#ifdef __cplusplus
extern "C" {
#endif
// Uncomment this flag to enable playback debug and record or playback scenarios
//#define INV_PLAYBACK_DBG
/** This is a new sample of accel data */
#define INV_ACCEL_NEW 1
/** This is a new sample of gyro data */
#define INV_GYRO_NEW 2
/** This is a new sample of compass data */
#define INV_MAG_NEW 4
/** This is a new sample of temperature data */
#define INV_TEMP_NEW 8
/** This is a new sample of quaternion data */
#define INV_QUAT_NEW 16
/** This is a new sample of pressure data */
#define INV_PRESSURE_NEW 32
/** Set if the data is contiguous. Typically not set if a sample was skipped */
#define INV_CONTIGUOUS 16
/** Set if the calibrated data has been solved for */
#define INV_CALIBRATED 32
/** INV_NEW_DATA set for a new set of data, cleared if not available. */
#define INV_NEW_DATA 64
/** Set if raw data exists */
#define INV_RAW_DATA 128
/** Set if the sensor is on */
#define INV_SENSOR_ON 256
/** Set if quaternion has bias correction applied */
#define INV_BIAS_APPLIED 512
/** Set if quaternion is 6-axis */
#define INV_QUAT_6AXIS 1024
/** Set if quaternion is 9 axis */
#define INV_QUAT_9AXIS 2048
/** Set if quaternion is 3-axis, 3 elements (android only) */
#define INV_QUAT_3AXIS 4096
/** Set if DMP has applied bias */
#define INV_DMP_BIAS_APPLIED 8192
#define INV_PRIORITY_MOTION_NO_MOTION 100
#define INV_PRIORITY_GYRO_TC 150
#define INV_PRIORITY_QUATERNION_GYRO_ACCEL 200
#define INV_PRIORITY_QUATERNION_NO_GYRO 250
#define INV_PRIORITY_MAGNETIC_DISTURBANCE 300
#define INV_PRIORITY_HEADING_FROM_GYRO 350
#define INV_PRIORITY_COMPASS_BIAS_W_GYRO 375
#define INV_PRIORITY_COMPASS_VECTOR_CAL 400
#define INV_PRIORITY_COMPASS_ADV_BIAS 500
#define INV_PRIORITY_9_AXIS_FUSION 600
#define INV_PRIORITY_9_AXIS_FUSION_LIGHT 650
#define INV_PRIORITY_QUATERNION_ADJUST_9_AXIS 700
#define INV_PRIORITY_QUATERNION_ACCURACY 750
#define INV_PRIORITY_RESULTS_HOLDER 800
#define INV_PRIORITY_INUSE_AUTO_CALIBRATION 850
#define INV_PRIORITY_HAL_OUTPUTS 900
#define INV_PRIORITY_GLYPH 950
#define INV_PRIORITY_SHAKE 975
#define INV_PRIORITY_SM 1000
struct inv_single_sensor_t {
/** Orientation Descriptor. Describes how to go from the mounting frame to the body frame when
* the rotation matrix could be thought of only having elements of 0,1,-1.
* 2 bits are used to describe the column of the 1 or -1 and the 3rd bit is used for the sign.
* Bit 8 is sign of +/- 1 in third row. Bit 6-7 is column of +/-1 in third row.
* Bit 5 is sign of +/- 1 in second row. Bit 3-4 is column of +/-1 in second row.
* Bit 2 is sign of +/- 1 in first row. Bit 0-1 is column of +/-1 in first row.
*/
int orientation;
/** The raw data in raw data units in the mounting frame */
short raw[3];
/** Raw data in body frame */
long raw_scaled[3];
/** Calibrated data */
long calibrated[3];
long sensitivity;
/** Sample rate in microseconds */
long sample_rate_us;
long sample_rate_ms;
/** INV_CONTIGUOUS is set for contiguous data. Will not be set if there was a sample
* skipped due to power savings turning off this sensor.
* INV_NEW_DATA set for a new set of data, cleared if not available.
* INV_CALIBRATED_SET if calibrated data has been solved for */
int status;
/** 0 to 3 for how well sensor data and biases are known. 3 is most accurate. */
int accuracy;
inv_time_t timestamp;
inv_time_t timestamp_prev;
/** Bandwidth in Hz */
int bandwidth;
};
struct inv_quat_sensor_t {
long raw[4];
/** INV_CONTIGUOUS is set for contiguous data. Will not be set if there was a sample
* skipped due to power savings turning off this sensor.
* INV_NEW_DATA set for a new set of data, cleared if not available.
* INV_CALIBRATED_SET if calibrated data has been solved for */
int status;
inv_time_t timestamp;
long sample_rate_us;
long sample_rate_ms;
};
struct inv_soft_iron_t {
long raw[3];
long trans[3];
long matrix_d[9]; // Q30 format fixed point. The dynamic range is (-2.0 to 2.0);
float matrix_f[9];
int enable;
};
struct inv_sensor_cal_t {
struct inv_single_sensor_t gyro;
struct inv_single_sensor_t accel;
struct inv_single_sensor_t compass;
struct inv_single_sensor_t temp;
struct inv_quat_sensor_t quat;
struct inv_single_sensor_t pressure;
struct inv_soft_iron_t soft_iron;
/** Combinations of INV_GYRO_NEW, INV_ACCEL_NEW, INV_MAG_NEW to indicate
* which data is a new sample as these data points may have different sample rates.
*/
int status;
};
// Useful for debug record and playback
typedef enum {
RD_NO_DEBUG,
RD_RECORD,
RD_PLAYBACK
} rd_dbg_mode;
typedef enum {
PLAYBACK_DBG_TYPE_GYRO,
PLAYBACK_DBG_TYPE_ACCEL,
PLAYBACK_DBG_TYPE_COMPASS,
PLAYBACK_DBG_TYPE_TEMPERATURE,
PLAYBACK_DBG_TYPE_EXECUTE,
PLAYBACK_DBG_TYPE_A_ORIENT,
PLAYBACK_DBG_TYPE_G_ORIENT,
PLAYBACK_DBG_TYPE_C_ORIENT,
PLAYBACK_DBG_TYPE_A_SAMPLE_RATE,
PLAYBACK_DBG_TYPE_C_SAMPLE_RATE,
PLAYBACK_DBG_TYPE_G_SAMPLE_RATE,
PLAYBACK_DBG_TYPE_GYRO_OFF,
PLAYBACK_DBG_TYPE_ACCEL_OFF,
PLAYBACK_DBG_TYPE_COMPASS_OFF,
PLAYBACK_DBG_TYPE_Q_SAMPLE_RATE,
PLAYBACK_DBG_TYPE_QUAT,
PLAYBACK_DBG_TYPE_QUAT_OFF
} inv_rd_dbg_states;
/** Change this key if the definition of the struct inv_db_save_t changes.
Previous keys: 53394, 53395, 53396 */
#define INV_DB_SAVE_KEY (53397)
#define INV_DB_SAVE_MPL_KEY (50001)
#define INV_DB_SAVE_ACCEL_MPL_KEY (50002)
struct inv_db_save_t {
/** compass Bias in chip frame, hardware units scaled by 2^16. */
long compass_bias[3];
/** gyro factory bias in chip frame, hardware units scaled by 2^16,
+/- 2000 dps full scale. */
long factory_gyro_bias[3];
/** accel factory bias in chip frame, hardware units scaled by 2^16,
+/- 2 gee full scale. */
long factory_accel_bias[3];
/** temperature when factory_gyro_bias was stored. */
long gyro_temp;
/** flag to indicate temperature compensation that biases where stored. */
int gyro_bias_tc_set;
/** temperature when accel bias was stored. */
long accel_temp;
long gyro_temp_slope[3];
/** sensor accuracies */
int gyro_accuracy;
int accel_accuracy;
int compass_accuracy;
};
struct inv_db_save_mpl_t {
/** gyro bias in chip frame, hardware units scaled by 2^16, +/- 2000 dps
full scale */
long gyro_bias[3];
};
struct inv_db_save_accel_mpl_t {
/** accel bias in chip frame, hardware units scaled by 2^16, +/- 2 gee
full scale */
long accel_bias[3];
};
/** Maximum number of data callbacks that are supported. Safe to increase if needed.*/
#define INV_MAX_DATA_CB 20
#ifdef INV_PLAYBACK_DBG
void inv_turn_on_data_logging(FILE *file);
void inv_turn_off_data_logging();
#endif
void inv_set_gyro_orientation_and_scale(int orientation, long sensitivity);
void inv_set_accel_orientation_and_scale(int orientation,
long sensitivity);
void inv_set_compass_orientation_and_scale(int orientation,
long sensitivity);
void inv_set_gyro_sample_rate(long sample_rate_us);
void inv_set_compass_sample_rate(long sample_rate_us);
void inv_set_quat_sample_rate(long sample_rate_us);
void inv_set_accel_sample_rate(long sample_rate_us);
void inv_set_gyro_bandwidth(int bandwidth_hz);
void inv_set_accel_bandwidth(int bandwidth_hz);
void inv_set_compass_bandwidth(int bandwidth_hz);
void inv_get_gyro_sample_rate_ms(long *sample_rate_ms);
void inv_get_accel_sample_rate_ms(long *sample_rate_ms);
void inv_get_compass_sample_rate_ms(long *sample_rate_ms);
inv_error_t inv_register_data_cb(inv_error_t (*func)
(struct inv_sensor_cal_t * data), int priority,
int sensor_type);
inv_error_t inv_unregister_data_cb(inv_error_t (*func)
(struct inv_sensor_cal_t * data));
inv_error_t inv_build_gyro(const short *gyro, inv_time_t timestamp);
inv_error_t inv_build_compass(const long *compass, int status,
inv_time_t timestamp);
inv_error_t inv_build_accel(const long *accel, int status,
inv_time_t timestamp);
inv_error_t inv_build_temp(const long temp, inv_time_t timestamp);
inv_error_t inv_build_quat(const long *quat, int status, inv_time_t timestamp);
inv_error_t inv_build_pressure(const long pressure, int status, inv_time_t timestamp);
inv_error_t inv_execute_on_data(void);
void inv_get_compass_bias(long *bias);
void inv_set_compass_bias(const long *bias, int accuracy);
void inv_set_compass_disturbance(int dist);
void inv_set_gyro_bias(const long *bias);
void inv_set_mpl_gyro_bias(const long *bias, int accuracy);
void inv_set_accel_bias(const long *bias);
void inv_set_mpl_accel_bias(const long *bias, int accuracy);
void inv_set_accel_accuracy(int accuracy);
void inv_set_accel_bias_mask(const long *bias, int accuracy, int mask);
void inv_get_compass_soft_iron_matrix_d(long *matrix);
void inv_set_compass_soft_iron_matrix_d(long *matrix);
void inv_get_compass_soft_iron_matrix_f(float *matrix);
void inv_set_compass_soft_iron_matrix_f(float *matrix);
void inv_get_compass_soft_iron_output_data(long *data);
void inv_get_compass_soft_iron_input_data(long *data);
void inv_set_compass_soft_iron_input_data(const long *data);
void inv_reset_compass_soft_iron_matrix(void);
void inv_enable_compass_soft_iron_matrix(void);
void inv_disable_compass_soft_iron_matrix(void);
void inv_get_mpl_gyro_bias(long *bias, long *temp);
void inv_get_gyro_bias(long *bias);
void inv_get_gyro_bias_dmp_units(long *bias);
int inv_get_factory_accel_bias_mask();
void inv_get_mpl_accel_bias(long *bias, long *temp);
void inv_get_accel_bias(long *bias);
void inv_gyro_was_turned_off(void);
void inv_accel_was_turned_off(void);
void inv_compass_was_turned_off(void);
void inv_quaternion_sensor_was_turned_off(void);
inv_error_t inv_init_data_builder(void);
long inv_get_gyro_sensitivity(void);
long inv_get_accel_sensitivity(void);
long inv_get_compass_sensitivity(void);
void inv_get_accel_set(long *data, int8_t *accuracy, inv_time_t * timestamp);
void inv_get_gyro_set(long *data, int8_t *accuracy, inv_time_t * timestamp);
void inv_get_gyro_set_raw(long *data, int8_t *accuracy, inv_time_t * timestamp);
void inv_get_compass_set(long *data, int8_t *accuracy, inv_time_t * timestamp);
void inv_get_compass_set_raw(long *data, int8_t *accuracy, inv_time_t * timestamp);
void inv_get_gyro(long *gyro);
int inv_get_gyro_accuracy(void);
int inv_get_accel_accuracy(void);
int inv_get_mag_accuracy(void);
void inv_get_raw_compass(short *raw);
int inv_get_compass_on(void);
int inv_get_gyro_on(void);
int inv_get_accel_on(void);
inv_time_t inv_get_last_timestamp(void);
int inv_get_compass_disturbance(void);
// new DMP cal functions
inv_error_t inv_get_gyro_orient(int *orient);
inv_error_t inv_get_accel_orient(int *orient);
// internal
int inv_get_gyro_bias_tc_set(void);
#ifdef __cplusplus
}
#endif
#endif /* INV_DATA_BUILDER_H__ */