1/*
2 $License:
3   Copyright 2011 InvenSense, Inc.
4
5 Licensed under the Apache License, Version 2.0 (the "License");
6 you may not use this file except in compliance with the License.
7 You may obtain a copy of the License at
8
9 http://www.apache.org/licenses/LICENSE-2.0
10
11 Unless required by applicable law or agreed to in writing, software
12 distributed under the License is distributed on an "AS IS" BASIS,
13 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 See the License for the specific language governing permissions and
15 limitations under the License.
16  $
17 */
18/******************************************************************************
19 *
20 * $Id: ml.h 5653 2011-06-16 21:06:55Z nroyer $
21 *
22 *****************************************************************************/
23
24/**
25 *  @defgroup ML
26 *  @brief  The Motion Library processes gyroscopes and accelerometers to
27 *          provide a physical model of the movement of the sensors.
28 *          The results of this processing may be used to control objects
29 *          within a user interface environment, detect gestures, track 3D
30 *          movement for gaming applications, and analyze the blur created
31 *          due to hand movement while taking a picture.
32 *
33 *  @{
34 *      @file ml.h
35 *      @brief Header file for the Motion Library.
36**/
37
38#ifndef INV_H
39#define INV_H
40
41#ifdef __cplusplus
42extern "C" {
43#endif
44
45#include "mltypes.h"
46#include "mldmp.h"
47#include "mlsl.h"
48#include "mpu.h"
49#ifdef INV_INCLUDE_LEGACY_HEADERS
50#include "ml_legacy.h"
51#endif
52
53/* ------------ */
54/* - Defines. - */
55/* ------------ */
56
57/* - Module defines. - */
58
59/*************************************************************************/
60/*  Motion Library Vesion                                                */
61/*************************************************************************/
62
63#define INV_VERSION_MAJOR                 4
64#define INV_VERSION_MINOR                 0
65#define INV_VERSION_SUB_MINOR             0
66
67#define INV_VERSION_MAJOR_STR            "4"
68#define INV_VERSION_MINOR_STR            "0"
69#define INV_VERSION_SUB_MINOR_STR        "0"
70
71#define INV_VERSION_NONE                 ""
72#define INV_VERSION_PROTOTYPE            "ProtoA "
73#define INV_VERSION_ENGINEERING          "EngA "
74#define INV_VERSION_PRE_ALPHA            "Pre-Alpha "
75#define INV_VERSION_ALPHA                "Alpha "
76#define INV_VERSION_BETA                 "Beta "
77#define INV_VERSION_PRODUCTION           "Production "
78
79#ifndef INV_VERSION_TYPE
80#define INV_VERSION_TYPE INV_VERSION_NONE
81#endif
82
83#define INV_VERSION  "InvenSense MPL" " " \
84    "v" INV_VERSION_MAJOR_STR "." INV_VERSION_MINOR_STR "." INV_VERSION_SUB_MINOR_STR " " \
85    INV_VERSION_TYPE \
86    __DATE__ " " __TIME__
87
88/*************************************************************************/
89/*  Motion processing engines                                            */
90/*************************************************************************/
91#define INV_MOTION_DETECT                (0x0004)
92#define INV_BIAS_UPDATE                  (0x0008)
93#define INV_GESTURE                      (0x0020)
94#define INV_CONTROL                      (0x0040)
95#define INV_ORIENTATION                  (0x0100)
96#define INV_PEDOMETER                    (0x0200)
97#define INV_BASIC                        (INV_MOTION_DETECT | INV_BIAS_UPDATE)
98
99/*************************************************************************/
100/*  Data Source - Obsolete                                               */
101/*************************************************************************/
102#define INV_DATA_FIFO                    (0x1)
103#define INV_DATA_POLL                    (0x2)
104
105/*************************************************************************/
106/*  Interrupt Source                                                     */
107/*************************************************************************/
108#define INV_INT_MOTION                   (0x01)
109#define INV_INT_FIFO                     (0x02)
110#define INV_INT_TAP                      (0x04)
111#define INV_INT_ORIENTATION              (0x08)
112#define INV_INT_SHAKE_PITCH              (0x10)
113#define INV_INT_SHAKE_ROLL               (0x20)
114#define INV_INT_SHAKE_YAW                (0x40)
115
116/*************************************************************************/
117/*  Bias update functions                                                */
118/*************************************************************************/
119#define INV_BIAS_FROM_NO_MOTION          0x0001
120#define INV_BIAS_FROM_GRAVITY            0x0002
121#define INV_BIAS_FROM_TEMPERATURE        0x0004
122#define INV_BIAS_FROM_LPF                0x0008
123#define INV_MAG_BIAS_FROM_MOTION         0x0010
124#define INV_MAG_BIAS_FROM_GYRO           0x0020
125#define INV_LEARN_BIAS_FROM_TEMPERATURE  0x0040
126#define INV_AUTO_RESET_MAG_BIAS          0x0080
127#define INV_REJECT_MAG_DISTURBANCE       0x0100
128#define INV_PROGRESSIVE_NO_MOTION        0x0200
129#define INV_BIAS_FROM_FAST_NO_MOTION     0x0400
130
131/*************************************************************************/
132/*  Euler angles and axis names                                          */
133/*************************************************************************/
134#define INV_X_AXIS                       (0x01)
135#define INV_Y_AXIS                       (0x02)
136#define INV_Z_AXIS                       (0x04)
137
138#define INV_PITCH                        (INV_X_AXIS)
139#define INV_ROLL                         (INV_Y_AXIS)
140#define INV_YAW                          (INV_Z_AXIS)
141
142/*************************************************************************/
143/*  Sensor types                                                         */
144/*************************************************************************/
145#define INV_GYROS                        0x0001
146#define INV_ACCELS                       0x0002
147
148/*************************************************************************/
149/*  Motion arrays                                                        */
150/*************************************************************************/
151#define INV_ROTATION_MATRIX              0x0003
152#define INV_QUATERNION                   0x0004
153#define INV_EULER_ANGLES                 0x0005
154#define INV_LINEAR_ACCELERATION          0x0006
155#define INV_LINEAR_ACCELERATION_WORLD    0x0007
156#define INV_GRAVITY                      0x0008
157#define INV_ANGULAR_VELOCITY             0x0009
158
159#define INV_GYRO_CALIBRATION_MATRIX      0x000B
160#define INV_ACCEL_CALIBRATION_MATRIX     0x000C
161#define INV_GYRO_BIAS                    0x000D
162#define INV_ACCEL_BIAS                   0x000E
163#define INV_GYRO_TEMP_SLOPE              0x000F
164
165#define INV_RAW_DATA                     0x0011
166#define INV_DMP_TAP                      0x0012
167#define INV_DMP_TAP2                     0x0021
168
169#define INV_EULER_ANGLES_X               0x0013
170#define INV_EULER_ANGLES_Y               0x0014
171#define INV_EULER_ANGLES_Z               0x0015
172
173#define INV_BIAS_UNCERTAINTY             0x0016
174#define INV_DMP_PACKET_NUMBER            0x0017
175#define INV_FOOTER                       0x0018
176
177#define INV_CONTROL_DATA                 0x0019
178
179#define INV_MAGNETOMETER                 0x001A
180#define INV_PEDLBS                       0x001B
181#define INV_MAG_RAW_DATA                 0x001C
182#define INV_MAG_CALIBRATION_MATRIX       0x001D
183#define INV_MAG_BIAS                     0x001E
184#define INV_HEADING                      0x001F
185
186#define INV_MAG_BIAS_ERROR               0x0020
187
188#define INV_PRESSURE                     0x0021
189#define INV_LOCAL_FIELD                  0x0022
190#define INV_MAG_SCALE                    0x0023
191
192#define INV_RELATIVE_QUATERNION          0x0024
193
194#define SET_QUATERNION                                  0x0001
195#define SET_GYROS                                       0x0002
196#define SET_LINEAR_ACCELERATION                         0x0004
197#define SET_GRAVITY                                     0x0008
198#define SET_ACCELS                                      0x0010
199#define SET_TAP                                         0x0020
200#define SET_PEDLBS                                      0x0040
201#define SET_LINEAR_ACCELERATION_WORLD                   0x0080
202#define SET_CONTROL                                     0x0100
203#define SET_PACKET_NUMBER                               0x4000
204#define SET_FOOTER                                      0x8000
205
206/*************************************************************************/
207/*  Integral reset options                                               */
208/*************************************************************************/
209#define INV_NO_RESET                     0x0000
210#define INV_RESET                        0x0001
211
212/*************************************************************************/
213/*  Motion states                                                        */
214/*************************************************************************/
215#define INV_MOTION                       0x0001
216#define INV_NO_MOTION                    0x0002
217
218/*************************************************************************/
219/* Orientation and Gesture states                                        */
220/*************************************************************************/
221#define INV_STATE_IDLE                   (0)
222#define INV_STATE_RUNNING                (1)
223
224/*************************************************************************/
225/* Gyroscope Temperature Compensation bins                               */
226/*************************************************************************/
227#define BINS                            (25)
228#define PTS_PER_BIN                     (5)
229#define MIN_TEMP                        (-40)
230#define MAX_TEMP                        (+85)
231#define TEMP_PER_BIN                    ((MAX_TEMP - MIN_TEMP) / BINS)
232
233/*************************************************************************/
234/*  Flags                                                                */
235/*************************************************************************/
236#define INV_RAW_DATA_READY               0x0001
237#define INV_PROCESSED_DATA_READY         0x0002
238
239#define INV_GOT_GESTURE                  0x0004
240
241#define INV_MOTION_STATE_CHANGE          0x0006
242#define INV_COMPASS_OFFSET_VALID         0x0007
243
244/*************************************************************************/
245/*  General                                                              */
246/*************************************************************************/
247#define INV_NONE                         (0x0000)
248#define INV_INVALID_FIFO_RATE            (0xFFFF)
249
250/*************************************************************************/
251/*  ML Params Structure Default Values                                   */
252/*************************************************************************/
253#define INV_BIAS_UPDATE_FUNC_DEFAULT               (INV_BIAS_FROM_NO_MOTION | INV_BIAS_FROM_GRAVITY)
254#define INV_ORIENTATION_MASK_DEFAULT               0x3f
255#define INV_PROCESSED_DATA_CALLBACK_DEFAULT           0
256#define INV_ORIENTATION_CALLBACK_DEFAULT              0
257#define INV_MOTION_CALLBACK_DEFAULT                   0
258
259/* ------------ */
260/* - Defines. - */
261/* ------------ */
262/* Priority for various features */
263#define INV_PRIORITY_BUS_ACCEL              100
264#define INV_PRIORITY_EXTERNAL_SLAVE_MAG     110
265#define INV_PRIORITY_FAST_NO_MOTION         120
266#define INV_PRIORITY_BIAS_NO_MOTION         125
267#define INV_PRIORITY_SET_GYRO_BIASES        150
268#define INV_PRIORITY_TEMP_COMP              175
269#define INV_PRIORITY_CONTROL                200
270#define INV_PRIORITY_EIS                    300
271#define INV_PRIORITY_ORIENTATION            400
272#define INV_PRIORITY_PEDOMETER_FULLPOWER    500
273#define INV_PRIORITY_NAVIGATION_PEDOMETER   600
274#define INV_PRIORITY_GESTURE                700
275#define INV_PRIORITY_GLYPH                  800
276
277#define MAX_INTERRUPT_PROCESSES 5
278/* Number of quantized accel samples */
279#define INV_MAX_NUM_ACCEL_SAMPLES (8)
280
281#define PRECISION 10000.f
282#define RANGE_FLOAT_TO_FIXEDPOINT(range, x) {               \
283    range.mantissa = (long)x;                               \
284    range.fraction = (long)((float)(x-(long)x)*PRECISION);  \
285}
286#define RANGE_FIXEDPOINT_TO_FLOAT(range, x) {   \
287    x = (float)(range.mantissa);                \
288    x += ((float)range.fraction/PRECISION);     \
289}
290
291    /* --------------- */
292    /* - Structures. - */
293    /* --------------- */
294
295struct inv_obj_t {
296        //Calibration parameters
297        /* Raw sensor orientation */
298        long gyro_bias[3];
299        long accel_bias[3];
300        long compass_bias[3];
301
302        /* Cached values after orietnation is applied */
303        long scaled_gyro_bias[3];
304        long scaled_accel_bias[3];
305        long scaled_compass_bias[3];
306
307        long compass_scale[3];
308        long compass_test_bias[3];
309        long compass_test_scale[3];
310        long compass_asa[3];
311        long compass_offsets[3];
312
313        long compass_bias_error[3];
314
315        long got_no_motion_bias;
316        long got_compass_bias;
317        long compass_state;
318        long large_field;
319        long acc_state;
320
321        long factory_temp_comp;
322        long got_coarse_heading;
323        long gyro_temp_bias[3];
324        long prog_no_motion_bias[3];
325
326        long accel_cal[9];
327        // Deprecated, used gyro_orient
328        long gyro_cal[GYRO_NUM_AXES * GYRO_NUM_AXES];
329        long gyro_orient[GYRO_NUM_AXES * GYRO_NUM_AXES];
330        long accel_sens;
331        long compass_cal[9];
332        long gyro_sens;
333        long gyro_sf;
334        long temp_slope[GYRO_NUM_AXES];
335        long compass_sens;
336        long temp_offset[GYRO_NUM_AXES];
337
338        int cal_loaded_flag;
339
340        /* temperature compensation */
341        float x_gyro_coef[3];
342        float y_gyro_coef[3];
343        float z_gyro_coef[3];
344        float x_gyro_temp_data[BINS][PTS_PER_BIN];
345        float y_gyro_temp_data[BINS][PTS_PER_BIN];
346        float z_gyro_temp_data[BINS][PTS_PER_BIN];
347        float temp_data[BINS][PTS_PER_BIN];
348        int temp_ptrs[BINS];
349        long temp_valid_data[BINS];
350
351        long compass_correction[4];
352        long compass_correction_relative[4];
353        long compass_disturb_correction[4];
354        long compass_correction_offset[4];
355        long relative_quat[4];
356        long local_field[3];
357        long new_local_field;
358        long sync_grav_body[3];
359        int gyro_bias_err;
360
361        double compass_bias_ptr[9];
362        double compass_bias_v[3];
363        double compass_prev_m[36];
364        double compass_prev_xty[6];
365
366        int compass_peaks[18];
367        int all_sensors_no_motion;
368
369        long init_compass_bias[3];
370
371        int got_init_compass_bias;
372        int resetting_compass;
373
374        long ang_v_body[GYRO_NUM_AXES];
375        unsigned char compass_raw_data[24]; /* Sensor data plus status etc */
376        long compass_sensor_data[3]; /* Raw sensor data only */
377        long compass_calibrated_data[3];
378        long compass_test_calibrated_data[3];
379        long pressure;
380        inv_error_t (*external_slave_callback)(struct inv_obj_t *);
381        int  compass_accuracy;
382        int compass_overunder;
383
384        unsigned short flags[8];
385        unsigned short suspend;
386
387        long no_motion_threshold;
388        unsigned long motion_duration;
389
390        unsigned short motion_state;
391
392        unsigned short data_mode;
393        unsigned short interrupt_sources;
394
395        unsigned short bias_update_time;
396        short last_motion;
397        unsigned short bias_calc_time;
398
399        unsigned char internal_motion_state;
400        long start_time;
401
402        long accel_lpf_gain;
403        long accel_lpf[3];
404        unsigned long poll_no_motion;
405        long no_motion_accel_threshold;
406        unsigned long no_motion_accel_time;
407        inv_error_t(*mode_change_func) (unsigned long, unsigned long);
408    };
409
410    typedef inv_error_t(*inv_obj_func) (struct inv_obj_t *);
411
412    extern struct inv_obj_t inv_obj;
413
414    /* --------------------- */
415    /* - Params Structure. - */
416    /* --------------------- */
417
418    struct inv_params_obj {
419
420        unsigned short bias_mode;   // A function or bitwise OR of functions that determine how the gyroscope bias will be automatically updated.
421        // Functions include INV_BIAS_FROM_NO_MOTION, INV_BIAS_FROM_GRAVITY, and INV_BIAS_FROM_TEMPERATURE.
422        // The engine INV_BIAS_UPDATE must be enabled for these algorithms to run.
423
424        unsigned short orientation_mask;    // Allows a user to register which orientations will trigger the user defined callback function.
425        // The orientations are INV_X_UP, INV_X_DOWN, INV_Y_UP, INV_Y_DOWN, INV_Z_UP, and INV_Z_DOWN.
426        // INV_ORIENTATION_ALL is equivalent to INV_X_UP | INV_X_DOWN | INV_Y_UP | INV_Y_DOWN | INV_Z_UP | INV_Z_DOWN.
427
428        void (*fifo_processed_func) (void); // Callback function that triggers when all the processing has been finished by the motion processing engines.
429
430        void (*orientation_cb_func) (unsigned short orient);    // Callback function that will run when a change of orientation is detected.
431        // The new orientation. May be one of INV_X_UP, INV_X_DOWN, INV_Y_UP, INV_Y_DOWN, INV_Z_UP, or INV_Z_DOWN.
432
433        void (*motion_cb_func) (unsigned short motion_state);   // Callback function that will run when a change of motion state is detected.
434        // The new motion state. May be one of INV_MOTION, or INV_NO_MOTION.
435
436        unsigned char state;
437
438    };
439
440    extern struct inv_params_obj inv_params_obj;
441    /* --------------------- */
442    /* - Function p-types. - */
443    /* --------------------- */
444
445    inv_error_t inv_serial_start(char const *port);
446    inv_error_t inv_serial_stop(void);
447    inv_error_t inv_set_mpu_sensors(unsigned long sensors);
448    void *inv_get_serial_handle(void);
449
450    /*API for handling the buffer */
451    inv_error_t inv_update_data(void);
452
453    /*API for handling polling */
454    int inv_check_flag(int flag);
455
456    /*API for setting bias update function */
457    inv_error_t inv_set_bias_update(unsigned short biasFunction);
458
459#if defined CONFIG_MPU_SENSORS_MPU6050A2 || \
460    defined CONFIG_MPU_SENSORS_MPU6050B1
461    inv_error_t inv_turn_on_bias_from_no_motion(void);
462    inv_error_t inv_turn_off_bias_from_no_motion(void);
463    inv_error_t inv_set_mpu_6050_config(void);
464#endif
465
466    /* Legacy functions for handling augmented data*/
467    inv_error_t inv_get_array(int dataSet, long *data);
468    inv_error_t inv_get_float_array(int dataSet, float *data);
469    inv_error_t inv_set_array(int dataSet, long *data);
470    inv_error_t inv_set_float_array(int dataSet, float *data);
471    /* Individual functions for augmented data, per specific dataset */
472
473
474    inv_error_t inv_get_gyro(long *data);
475    inv_error_t inv_get_accel(long *data);
476    inv_error_t inv_get_temperature(long *data);
477    inv_error_t inv_get_temperature_raw(short *data);
478    inv_error_t inv_get_rot_mat(long *data);
479    inv_error_t inv_get_quaternion(long *data);
480    inv_error_t inv_get_linear_accel(long *data);
481    inv_error_t inv_get_linear_accel_in_world(long *data);
482    inv_error_t inv_get_gravity(long *data);
483    inv_error_t inv_get_angular_velocity(long *data);
484    inv_error_t inv_get_euler_angles(long *data);
485    inv_error_t inv_get_euler_angles_x(long *data);
486    inv_error_t inv_get_euler_angles_y(long *data);
487    inv_error_t inv_get_euler_angles_z(long *data);
488    inv_error_t inv_get_gyro_temp_slope(long *data);
489    inv_error_t inv_get_gyro_bias(long *data);
490    inv_error_t inv_get_accel_bias(long *data);
491    inv_error_t inv_get_mag_bias(long *data);
492    inv_error_t inv_get_gyro_and_accel_sensor(long *data);
493    inv_error_t inv_get_mag_raw_data(long *data);
494    inv_error_t inv_get_magnetometer(long *data);
495    inv_error_t inv_get_pressure(long *data);
496    inv_error_t inv_get_heading(long *data);
497    inv_error_t inv_get_gyro_cal_matrix(long *data);
498    inv_error_t inv_get_accel_cal_matrix(long *data);
499    inv_error_t inv_get_mag_cal_matrix(long *data);
500    inv_error_t inv_get_mag_bias_error(long *data);
501    inv_error_t inv_get_mag_scale(long *data);
502    inv_error_t inv_get_local_field(long *data);
503    inv_error_t inv_get_relative_quaternion(long *data);
504    inv_error_t inv_get_gyro_float(float *data);
505    inv_error_t inv_get_accel_float(float *data);
506    inv_error_t inv_get_temperature_float(float *data);
507    inv_error_t inv_get_rot_mat_float(float *data);
508    inv_error_t inv_get_quaternion_float(float *data);
509    inv_error_t inv_get_linear_accel_float(float *data);
510    inv_error_t inv_get_linear_accel_in_world_float(float *data);
511    inv_error_t inv_get_gravity_float(float *data);
512    inv_error_t inv_get_angular_velocity_float(float *data);
513    inv_error_t inv_get_euler_angles_float(float *data);
514    inv_error_t inv_get_euler_angles_x_float(float *data);
515    inv_error_t inv_get_euler_angles_y_float(float *data);
516    inv_error_t inv_get_euler_angles_z_float(float *data);
517    inv_error_t inv_get_gyro_temp_slope_float(float *data);
518    inv_error_t inv_get_gyro_bias_float(float *data);
519    inv_error_t inv_get_accel_bias_float(float *data);
520    inv_error_t inv_get_mag_bias_float(float *data);
521    inv_error_t inv_get_gyro_and_accel_sensor_float(float *data);
522    inv_error_t inv_get_mag_raw_data_float(float *data);
523    inv_error_t inv_get_magnetometer_float(float *data);
524    inv_error_t inv_get_pressure_float(float *data);
525    inv_error_t inv_get_heading_float(float *data);
526    inv_error_t inv_get_gyro_cal_matrix_float(float *data);
527    inv_error_t inv_get_accel_cal_matrix_float(float *data);
528    inv_error_t inv_get_mag_cal_matrix_float(float *data);
529    inv_error_t inv_get_mag_bias_error_float(float *data);
530    inv_error_t inv_get_mag_scale_float(float *data);
531    inv_error_t inv_get_local_field_float(float *data);
532    inv_error_t inv_get_relative_quaternion_float(float *data);
533    inv_error_t inv_get_compass_accuracy(int *accuracy);
534    inv_error_t inv_set_gyro_bias(long *data);
535    inv_error_t inv_set_accel_bias(long *data);
536    inv_error_t inv_set_mag_bias(long *data);
537    inv_error_t inv_set_gyro_temp_slope(long *data);
538    inv_error_t inv_set_local_field(long *data);
539    inv_error_t inv_set_mag_scale(long *data);
540    inv_error_t inv_set_gyro_temp_slope_float(float *data);
541    inv_error_t inv_set_gyro_bias_float(float *data);
542    inv_error_t inv_set_accel_bias_float(float *data);
543    inv_error_t inv_set_mag_bias_float(float *data);
544    inv_error_t inv_set_local_field_float(float *data);
545    inv_error_t inv_set_mag_scale_float(float *data);
546
547    inv_error_t inv_apply_endian_accel(void);
548    inv_error_t inv_apply_calibration(void);
549    inv_error_t inv_set_gyro_calibration(float range, signed char *orientation);
550    inv_error_t inv_set_accel_calibration(float range,
551                                          signed char *orientation);
552    inv_error_t inv_set_compass_calibration(float range,
553                                            signed char *orientation);
554
555    /*API for detecting change of state */
556     inv_error_t
557        inv_set_motion_callback(void (*func) (unsigned short motion_state));
558    int inv_get_motion_state(void);
559
560    /*API for getting ML version. */
561    inv_error_t inv_get_version(unsigned char **version);
562
563    inv_error_t inv_set_motion_interrupt(unsigned char on);
564    inv_error_t inv_set_fifo_interrupt(unsigned char on);
565
566    int inv_get_interrupts(void);
567
568    /* Simulated DMP */
569    int inv_get_gyro_present(void);
570
571    inv_error_t inv_set_no_motion_time(float time);
572    inv_error_t inv_set_no_motion_thresh(float thresh);
573    inv_error_t inv_set_no_motion_threshAccel(long thresh);
574    inv_error_t inv_reset_motion(void);
575
576    inv_error_t inv_update_bias(void);
577    inv_error_t inv_set_dead_zone(void);
578    void inv_start_bias_calc(void);
579    void inv_stop_bias_calc(void);
580
581    // Private functions shared accross modules
582    void inv_init_ml(void);
583
584    inv_error_t inv_register_dmp_interupt_cb(inv_obj_func func);
585    inv_error_t inv_unregister_dmp_interupt_cb(inv_obj_func func);
586    void inv_run_dmp_interupt_cb(void);
587    void inv_set_mode_change(inv_error_t(*mode_change_func)
588                              (unsigned long, unsigned long));
589
590#ifdef __cplusplus
591}
592#endif
593#endif                          // INV_H
594/**
595 * @}
596 */
597