Home | History | Annotate | Download | only in mllite
      1 /*
      2  $License:
      3     Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
      4     See included License.txt for License information.
      5  $
      6  */
      7 #include "mltypes.h"
      8 
      9 #ifndef INV_DATA_BUILDER_H__
     10 #define INV_DATA_BUILDER_H__
     11 
     12 #ifdef __cplusplus
     13 extern "C" {
     14 #endif
     15 
     16 // Uncomment this flag to enable playback debug and record or playback scenarios
     17 //#define INV_PLAYBACK_DBG
     18 
     19 /** This is a new sample of accel data */
     20 #define INV_ACCEL_NEW 1
     21 /** This is a new sample of gyro data */
     22 #define INV_GYRO_NEW 2
     23 /** This is a new sample of compass data */
     24 #define INV_MAG_NEW 4
     25 /** This is a new sample of temperature data */
     26 #define INV_TEMP_NEW 8
     27 /** This is a new sample of quaternion data */
     28 #define INV_QUAT_NEW 16
     29 
     30 /** Set if the data is contiguous. Typically not set if a sample was skipped */
     31 #define INV_CONTIGUOUS 16
     32 /** Set if the calibrated data has been solved for */
     33 #define INV_CALIBRATED 32
     34 /* INV_NEW_DATA set for a new set of data, cleared if not available. */
     35 #define INV_NEW_DATA 64
     36 /* Set if raw data exists */
     37 #define INV_RAW_DATA 128
     38 /* Set if the sensor is on */
     39 #define INV_SENSOR_ON 256
     40 /* Set if quaternion has bias correction applied */
     41 #define INV_BIAS_APPLIED 512
     42 
     43 #define INV_PRIORITY_MOTION_NO_MOTION          100
     44 #define INV_PRIORITY_GYRO_TC                   150
     45 #define INV_PRIORITY_QUATERNION_GYRO_ACCEL     200
     46 #define INV_PRIORITY_QUATERNION_NO_GYRO        250
     47 #define INV_PRIORITY_MAGNETIC_DISTURBANCE      300
     48 #define INV_PRIORITY_HEADING_FROM_GYRO         350
     49 #define INV_PRIORITY_COMPASS_BIAS_W_GYRO       375
     50 #define INV_PRIORITY_COMPASS_VECTOR_CAL        400
     51 #define INV_PRIORITY_COMPASS_ADV_BIAS          500
     52 #define INV_PRIORITY_9_AXIS_FUSION             600
     53 #define INV_PRIORITY_QUATERNION_ADJUST_9_AXIS  700
     54 #define INV_PRIORITY_QUATERNION_ACCURACY       750
     55 #define INV_PRIORITY_RESULTS_HOLDER            800
     56 #define INV_PRIORITY_INUSE_AUTO_CALIBRATION    850
     57 #define INV_PRIORITY_HAL_OUTPUTS               900
     58 #define INV_PRIORITY_GLYPH                     950
     59 #define INV_PRIORITY_SHAKE                     975
     60 #define INV_PRIORITY_SM                        1000
     61 
     62 struct inv_single_sensor_t {
     63     /** Orientation Descriptor. Describes how to go from the mounting frame to the body frame when
     64     * the rotation matrix could be thought of only having elements of 0,1,-1.
     65     * 2 bits are used to describe the column of the 1 or -1 and the 3rd bit is used for the sign.
     66     * Bit 8 is sign of +/- 1 in third row. Bit 6-7 is column of +/-1 in third row.
     67     * Bit 5 is sign of +/- 1 in second row. Bit 3-4 is column of +/-1 in second row.
     68     * Bit 2 is sign of +/- 1 in first row. Bit 0-1 is column of +/-1 in first row.
     69     */
     70     int orientation;
     71     /** The raw data in raw data units in the mounting frame */
     72     short raw[3];
     73     /** Raw data in body frame */
     74     long raw_scaled[3];
     75     /** Calibrated data */
     76     long calibrated[3];
     77     long sensitivity;
     78     /** Sample rate in microseconds */
     79     long sample_rate_us;
     80     long sample_rate_ms;
     81     /** INV_CONTIGUOUS is set for contiguous data. Will not be set if there was a sample
     82     * skipped due to power savings turning off this sensor.
     83     * INV_NEW_DATA set for a new set of data, cleared if not available.
     84     * INV_CALIBRATED_SET if calibrated data has been solved for */
     85     int status;
     86     /** 0 to 3 for how well sensor data and biases are known. 3 is most accurate. */
     87     int accuracy;
     88     inv_time_t timestamp;
     89     inv_time_t timestamp_prev;
     90     /** Bandwidth in Hz */
     91     int bandwidth;
     92 };
     93 struct inv_quat_sensor_t {
     94     long raw[4];
     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     inv_time_t timestamp;
    101     long sample_rate_us;
    102     long sample_rate_ms;
    103 };
    104 
    105 struct inv_sensor_cal_t {
    106     struct inv_single_sensor_t gyro;
    107     struct inv_single_sensor_t accel;
    108     struct inv_single_sensor_t compass;
    109     struct inv_single_sensor_t temp;
    110     struct inv_quat_sensor_t quat;
    111     /** Combinations of INV_GYRO_NEW, INV_ACCEL_NEW, INV_MAG_NEW to indicate
    112     * which data is a new sample as these data points may have different sample rates.
    113     */
    114     int status;
    115 };
    116 
    117 // Useful for debug record and playback
    118 typedef enum {
    119     RD_NO_DEBUG,
    120     RD_RECORD,
    121     RD_PLAYBACK
    122 } rd_dbg_mode;
    123 
    124 typedef enum {
    125     PLAYBACK_DBG_TYPE_GYRO,
    126     PLAYBACK_DBG_TYPE_ACCEL,
    127     PLAYBACK_DBG_TYPE_COMPASS,
    128     PLAYBACK_DBG_TYPE_TEMPERATURE,
    129     PLAYBACK_DBG_TYPE_EXECUTE,
    130     PLAYBACK_DBG_TYPE_A_ORIENT,
    131     PLAYBACK_DBG_TYPE_G_ORIENT,
    132     PLAYBACK_DBG_TYPE_C_ORIENT,
    133     PLAYBACK_DBG_TYPE_A_SAMPLE_RATE,
    134     PLAYBACK_DBG_TYPE_C_SAMPLE_RATE,
    135     PLAYBACK_DBG_TYPE_G_SAMPLE_RATE,
    136     PLAYBACK_DBG_TYPE_GYRO_OFF,
    137     PLAYBACK_DBG_TYPE_ACCEL_OFF,
    138     PLAYBACK_DBG_TYPE_COMPASS_OFF,
    139     PLAYBACK_DBG_TYPE_Q_SAMPLE_RATE,
    140     PLAYBACK_DBG_TYPE_QUAT
    141 
    142 } inv_rd_dbg_states;
    143 
    144 /** Maximum number of data callbacks that are supported. Safe to increase if needed.*/
    145 #define INV_MAX_DATA_CB 20
    146 
    147 #ifdef INV_PLAYBACK_DBG
    148 #include <stdio.h>
    149 void inv_turn_on_data_logging(FILE *file);
    150 void inv_turn_off_data_logging();
    151 #endif
    152 
    153 void inv_set_gyro_orientation_and_scale(int orientation, long sensitivity);
    154 void inv_set_accel_orientation_and_scale(int orientation,
    155         long sensitivity);
    156 void inv_set_compass_orientation_and_scale(int orientation,
    157         long sensitivity);
    158 void inv_set_gyro_sample_rate(long sample_rate_us);
    159 void inv_set_compass_sample_rate(long sample_rate_us);
    160 void inv_set_quat_sample_rate(long sample_rate_us);
    161 void inv_set_accel_sample_rate(long sample_rate_us);
    162 void inv_set_gyro_bandwidth(int bandwidth_hz);
    163 void inv_set_accel_bandwidth(int bandwidth_hz);
    164 void inv_set_compass_bandwidth(int bandwidth_hz);
    165 
    166 void inv_get_gyro_sample_rate_ms(long *sample_rate_ms);
    167 void inv_get_accel_sample_rate_ms(long *sample_rate_ms);
    168 void inv_get_compass_sample_rate_ms(long *sample_rate_ms);
    169 
    170 inv_error_t inv_register_data_cb(inv_error_t (*func)
    171                                  (struct inv_sensor_cal_t * data), int priority,
    172                                  int sensor_type);
    173 inv_error_t inv_unregister_data_cb(inv_error_t (*func)
    174                                    (struct inv_sensor_cal_t * data));
    175 
    176 inv_error_t inv_build_gyro(const short *gyro, inv_time_t timestamp);
    177 inv_error_t inv_build_compass(const long *compass, int status,
    178                                   inv_time_t timestamp);
    179 inv_error_t inv_build_accel(const long *accel, int status,
    180                             inv_time_t timestamp);
    181 inv_error_t inv_build_temp(const long temp, inv_time_t timestamp);
    182 inv_error_t inv_build_quat(const long *quat, int status, inv_time_t timestamp);
    183 inv_error_t inv_execute_on_data(void);
    184 
    185 void inv_get_compass_bias(long *bias);
    186 
    187 void inv_set_compass_bias(const long *bias, int accuracy);
    188 void inv_set_compass_disturbance(int dist);
    189 void inv_set_gyro_bias(const long *bias, int accuracy);
    190 void inv_set_accel_bias(const long *bias, int accuracy);
    191 void inv_set_accel_accuracy(int accuracy);
    192 void inv_set_accel_bias_mask(const long *bias, int accuracy, int mask);
    193 
    194 void inv_get_gyro_bias(long *bias, long *temp);
    195 void inv_get_accel_bias(long *bias, long *temp);
    196 
    197 void inv_gyro_was_turned_off(void);
    198 void inv_accel_was_turned_off(void);
    199 void inv_compass_was_turned_off(void);
    200 void inv_quaternion_sensor_was_turned_off(void);
    201 inv_error_t inv_init_data_builder(void);
    202 long inv_get_gyro_sensitivity(void);
    203 long inv_get_accel_sensitivity(void);
    204 long inv_get_compass_sensitivity(void);
    205 
    206 void inv_get_accel_set(long *data, int8_t *accuracy, inv_time_t * timestamp);
    207 void inv_get_gyro_set(long *data, int8_t *accuracy, inv_time_t * timestamp);
    208 void inv_get_gyro_set_raw(long *data, int8_t *accuracy, inv_time_t * timestamp);
    209 void inv_get_compass_set(long *data, int8_t *accuracy, inv_time_t * timestamp);
    210 
    211 void inv_get_gyro(long *gyro);
    212 
    213 int inv_get_gyro_accuracy(void);
    214 int inv_get_accel_accuracy(void);
    215 int inv_get_mag_accuracy(void);
    216 
    217 int inv_get_compass_on(void);
    218 int inv_get_gyro_on(void);
    219 int inv_get_accel_on(void);
    220 
    221 inv_time_t inv_get_last_timestamp(void);
    222 int inv_get_compass_disturbance(void);
    223 
    224 //New DMP Cal Functions
    225 inv_error_t inv_get_gyro_orient(int *orient);
    226 inv_error_t inv_get_accel_orient(int *orient);
    227 
    228 
    229 #ifdef __cplusplus
    230 }
    231 #endif
    232 
    233 #endif  /* INV_DATA_BUILDER_H__ */
    234