1895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/*
2895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall $License:
3895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall   Copyright 2011 InvenSense, Inc.
4895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
5895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall Licensed under the Apache License, Version 2.0 (the "License");
6895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall you may not use this file except in compliance with the License.
7895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall You may obtain a copy of the License at
8895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
9895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall http://www.apache.org/licenses/LICENSE-2.0
10895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
11895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall Unless required by applicable law or agreed to in writing, software
12895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall distributed under the License is distributed on an "AS IS" BASIS,
13895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall See the License for the specific language governing permissions and
15895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall limitations under the License.
16895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall  $
17895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
18895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/******************************************************************************
19895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
20895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * $Id: mlarray.c 5085 2011-04-08 22:25:14Z phickey $
21895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
22895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *****************************************************************************/
23895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
24895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
25895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @defgroup ML
26895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @{
27895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *      @file   mlarray.c
28895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *      @brief  APIs to read different data sets from FIFO.
29895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
30895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
31895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/* ------------------ */
32895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/* - Include Files. - */
33895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/* ------------------ */
34895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "ml.h"
35895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mltypes.h"
36895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mlinclude.h"
37895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mlMathFunc.h"
38895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mlmath.h"
39895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mlstates.h"
40895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mlFIFO.h"
41895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mlsupervisor.h"
42895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mldl.h"
43895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "dmpKey.h"
44895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "compass.h"
45895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
46895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
47895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_gyro is used to get the most recent gyroscope measurement.
48895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The argument array elements are ordered X,Y,Z.
49895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The values are scaled at 1 dps = 2^16 LSBs.
50895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
51895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
52895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
53895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
54895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
55895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
56895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long </b>.
57895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
58895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return Zero if the command is successful; an ML error code otherwise.
59895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
60895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
61895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall /* inv_get_gyro implemented in mlFIFO.c */
62895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
63895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
64895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_accel is used to get the most recent
65895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          accelerometer measurement.
66895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The argument array elements are ordered X,Y,Z.
67895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The values are scaled in units of g (gravity),
68895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          where 1 g = 2^16 LSBs.
69895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
70895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
71895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
72895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
73895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
74895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
75895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
76895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long </b>.
77895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
78895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return Zero if the command is successful; an ML error code otherwise.
79895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
80895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall /* inv_get_accel implemented in mlFIFO.c */
81895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
82895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
83895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_temperature is used to get the most recent
84895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          temperature measurement.
85895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The argument array should only have one element.
86895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The value is in units of deg C (degrees Celsius), where
87895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          2^16 LSBs = 1 deg C.
88895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
89895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
90895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
91895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
92895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
93895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
94895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to the data to be passed back to the user.
95895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
96895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return Zero if the command is successful; an ML error code otherwise.
97895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
98895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall /* inv_get_temperature implemented in mlFIFO.c */
99895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
100895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
101895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_rot_mat is used to get the rotation matrix
102895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          representation of the current sensor fusion solution.
103895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The array format will be R11, R12, R13, R21, R22, R23, R31, R32,
104895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          R33, representing the matrix:
105895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <center>R11 R12 R13</center>
106895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <center>R21 R22 R23</center>
107895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <center>R31 R32 R33</center>
108895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Values are scaled, where 1.0 = 2^30 LSBs.
109895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
110895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
111895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
112895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
113895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
114895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
115895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 9 cells long</b>.
116895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
117895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return Zero if the command is successful; an ML error code otherwise.
118895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
119895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_rot_mat(long *data)
120895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
121895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
122895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    long qdata[4];
123895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
124895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
125895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
126895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
127895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
128895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
129895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
130895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_get_quaternion(qdata);
131895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_quaternion_to_rotation(qdata, data);
132895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
133895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
134895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
135895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
136895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
137895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_quaternion is used to get the quaternion representation
138895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          of the current sensor fusion solution.
139895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The values are scaled where 1.0 = 2^30 LSBs.
140895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
141895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
142895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
143895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
144895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
145895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
146895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 4 cells long </b>.
147895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
148895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if the command is successful; an ML error code otherwise.
149895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
150895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall /* inv_get_quaternion implemented in mlFIFO.c */
151895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
152895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
153895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_linear_accel is used to get an estimate of linear
154895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          acceleration, based on the most recent accelerometer measurement
155895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          and sensor fusion solution.
156895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The values are scaled where 1 g (gravity) = 2^16 LSBs.
157895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
158895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
159895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
160895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
161895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
162895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
163895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
164895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long </b>.
165895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
166895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return Zero if the command is successful; an ML error code otherwise.
167895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
168895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall /* inv_get_linear_accel implemented in mlFIFO.c */
169895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
170895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
171895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_linear_accel_in_world is used to get an estimate of
172895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          linear acceleration, in the world frame,  based on the most
173895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          recent accelerometer measurement and sensor fusion solution.
174895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The values are scaled where 1 g (gravity) = 2^16 LSBs.
175895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
176895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
177895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
178895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
179895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
180895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
181895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long</b>.
182895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
183895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return Zero if the command is successful; an ML error code otherwise.
184895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
185895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall /* inv_get_linear_accel_in_world implemented in mlFIFO.c */
186895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
187895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
188895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_gravity is used to get an estimate of the body frame
189895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          gravity vector, based on the most recent sensor fusion solution.
190895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
191895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
192895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
193895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
194895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
195895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
196895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long</b>.
197895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
198895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return Zero if the command is successful; an ML error code otherwise.
199895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
200895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall /* inv_get_gravity implemented in mlFIFO.c */
201895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
202895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
203895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @internal
204895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_angular_velocity is used to get an estimate of the body
205895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          frame angular velocity, which is computed from the current and
206895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          previous sensor fusion solutions.
207895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
208895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
209895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
210895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
211895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
212895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
213895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long </b>.
214895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
215895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return Zero if the command is successful; an ML error code otherwise.
216895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
217895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_angular_velocity(long *data)
218895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
219895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
220895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
221895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /* not implemented. old (invalid) implementation:
222895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall       if ( inv_get_state() < INV_STATE_DMP_OPENED )
223895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall       return INV_ERROR_SM_IMPROPER_STATE;
224895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
225895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall       if (NULL == data) {
226895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall       return INV_ERROR_INVALID_PARAMETER;
227895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall       }
228895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall       data[0] = inv_obj.ang_v_body[0];
229895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall       data[1] = inv_obj.ang_v_body[1];
230895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall       data[2] = inv_obj.ang_v_body[2];
231895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
232895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall       return result;
233895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall     */
234895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
235895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
236895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
237895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_euler_angles is used to get the Euler angle representation
238895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          of the current sensor fusion solution.
239895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Euler angles may follow various conventions. This function is equivelant
240895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          to inv_get_euler_angles_x, refer to inv_get_euler_angles_x for more
241895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          information.
242895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
243895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
244895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
245895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
246895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
247895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
248895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
249895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long </b>.
250895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
251895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return Zero if the command is successful; an ML error code otherwise.
252895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
253895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_euler_angles(long *data)
254895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
255895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return inv_get_euler_angles_x(data);
256895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
257895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
258895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
259895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_euler_angles_x is used to get the Euler angle representation
260895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          of the current sensor fusion solution.
261895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Euler angles are returned according to the X convention.
262895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          This is typically the convention used for mobile devices where the X
263895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          axis is the width of the screen, Y axis is the height, and Z the
264895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          depth. In this case roll is defined as the rotation around the X
265895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          axis of the device.
266895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TABLE>
267895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD>Element </TD><TD><b>Euler angle</b></TD><TD><b>Rotation about </b></TD></TR>
268895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD> 0      </TD><TD>Roll              </TD><TD>X axis                </TD></TR>
269895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD> 1      </TD><TD>Pitch             </TD><TD>Y axis                </TD></TR>
270895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD> 2      </TD><TD>Yaw               </TD><TD>Z axis                </TD></TR>
271895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          </TABLE>
272895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
273895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Values are scaled where 1.0 = 2^16.
274895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
275895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
276895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
277895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
278895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
279895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
280895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long </b>.
281895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
282895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return Zero if the command is successful; an ML error code otherwise.
283895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
284895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_euler_angles_x(long *data)
285895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
286895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
287895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    float rotMatrix[9];
288895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    float tmp;
289895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
290895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
291895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
292895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
293895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
294895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
295895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
296895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_get_rot_mat_float(rotMatrix);
297895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    tmp = rotMatrix[6];
298895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (tmp > 1.0f) {
299895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        tmp = 1.0f;
300895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
301895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (tmp < -1.0f) {
302895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        tmp = -1.0f;
303895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
304895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] =
305895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        (long)((float)
306895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall               (atan2f(rotMatrix[7], rotMatrix[8]) * 57.29577951308) *
307895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall               65536L);
308895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[1] = (long)((float)((double)asin(tmp) * 57.29577951308) * 65536L);
309895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[2] =
310895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        (long)((float)
311895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall               (atan2f(rotMatrix[3], rotMatrix[0]) * 57.29577951308) *
312895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall               65536L);
313895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
314895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
315895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
316895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
317895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_euler_angles_y is used to get the Euler angle representation
318895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          of the current sensor fusion solution.
319895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Euler angles are returned according to the Y convention.
320895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          This convention is typically used in augmented reality applications,
321895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          where roll is defined as the rotation around the axis along the
322895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          height of the screen of a mobile device, namely the Y axis.
323895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TABLE>
324895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD>Element </TD><TD><b>Euler angle</b></TD><TD><b>Rotation about </b></TD></TR>
325895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD> 0      </TD><TD>Roll              </TD><TD>Y axis                </TD></TR>
326895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD> 1      </TD><TD>Pitch             </TD><TD>X axis                </TD></TR>
327895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD> 2      </TD><TD>Yaw               </TD><TD>Z axis                </TD></TR>
328895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          </TABLE>
329895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
330895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Values are scaled where 1.0 = 2^16.
331895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
332895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
333895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
334895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
335895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
336895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
337895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
338895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long</b>.
339895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
340895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return Zero if the command is successful; an ML error code otherwise.
341895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
342895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_euler_angles_y(long *data)
343895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
344895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
345895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    float rotMatrix[9];
346895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    float tmp;
347895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
348895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
349895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
350895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
351895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
352895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
353895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
354895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_get_rot_mat_float(rotMatrix);
355895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    tmp = rotMatrix[7];
356895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (tmp > 1.0f) {
357895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        tmp = 1.0f;
358895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
359895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (tmp < -1.0f) {
360895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        tmp = -1.0f;
361895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
362895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] =
363895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        (long)((float)
364895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall               (atan2f(rotMatrix[8], rotMatrix[6]) * 57.29577951308f) *
365895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall               65536L);
366895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[1] = (long)((float)((double)asin(tmp) * 57.29577951308) * 65536L);
367895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[2] =
368895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        (long)((float)
369895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall               (atan2f(rotMatrix[4], rotMatrix[1]) * 57.29577951308f) *
370895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall               65536L);
371895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
372895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
373895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
374895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**  @brief  inv_get_euler_angles_z is used to get the Euler angle representation
375895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          of the current sensor fusion solution.
376895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          This convention is mostly used in application involving the use
377895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          of a camera, typically placed on the back of a mobile device, that
378895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          is along the Z axis.  In this convention roll is defined as the
379895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          rotation around the Z axis.
380895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Euler angles are returned according to the Y convention.
381895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TABLE>
382895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD>Element </TD><TD><b>Euler angle</b></TD><TD><b>Rotation about </b></TD></TR>
383895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD> 0      </TD><TD>Roll              </TD><TD>Z axis                </TD></TR>
384895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD> 1      </TD><TD>Pitch             </TD><TD>X axis                </TD></TR>
385895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD> 2      </TD><TD>Yaw               </TD><TD>Y axis                </TD></TR>
386895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          </TABLE>
387895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
388895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Values are scaled where 1.0 = 2^16.
389895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
390895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
391895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
392895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
393895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
394895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
395895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long</b>.
396895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
397895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if the command is successful; an error code otherwise.
398895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
399895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
400895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_euler_angles_z(long *data)
401895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
402895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
403895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    float rotMatrix[9];
404895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    float tmp;
405895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
406895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
407895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
408895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
409895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
410895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
411895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
412895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_get_rot_mat_float(rotMatrix);
413895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    tmp = rotMatrix[8];
414895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (tmp > 1.0f) {
415895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        tmp = 1.0f;
416895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
417895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (tmp < -1.0f) {
418895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        tmp = -1.0f;
419895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
420895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] =
421895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        (long)((float)
422895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall               (atan2f(rotMatrix[6], rotMatrix[7]) * 57.29577951308) *
423895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall               65536L);
424895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[1] = (long)((float)((double)asin(tmp) * 57.29577951308) * 65536L);
425895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[2] =
426895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        (long)((float)
427895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall               (atan2f(rotMatrix[5], rotMatrix[2]) * 57.29577951308) *
428895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall               65536L);
429895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
430895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
431895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
432895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
433895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_gyro_temp_slope is used to get is used to get the temperature
434895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          compensation algorithm's estimate of the gyroscope bias temperature
435895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          coefficient.
436895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The argument array elements are ordered X,Y,Z.
437895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Values are in units of dps per deg C (degrees per second per degree
438895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Celcius). Values are scaled so that 1 dps per deg C = 2^16 LSBs.
439895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Please refer to the provided "9-Axis Sensor Fusion
440895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Application Note" document.
441895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
442895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
443895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
444895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
445895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
446895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
447895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long </b>.
448895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
449895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return Zero if the command is successful; an ML error code otherwise.
450895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
451895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_gyro_temp_slope(long *data)
452895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
453895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
454895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
455895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
456895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
457895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
458895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
459895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
460895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_params_obj.bias_mode & INV_LEARN_BIAS_FROM_TEMPERATURE) {
461895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[0] = (long)(inv_obj.x_gyro_coef[1] * 65536.0f);
462895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[1] = (long)(inv_obj.y_gyro_coef[1] * 65536.0f);
463895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[2] = (long)(inv_obj.z_gyro_coef[1] * 65536.0f);
464895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    } else {
465895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[0] = inv_obj.temp_slope[0];
466895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[1] = inv_obj.temp_slope[1];
467895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[2] = inv_obj.temp_slope[2];
468895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
469895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
470895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
471895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
472895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
473895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_gyro_bias is used to get the gyroscope biases.
474895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The argument array elements are ordered X,Y,Z.
475895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The values are scaled such that 1 dps = 2^16 LSBs.
476895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
477895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
478895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
479895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
480895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
481895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
482895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long</b>.
483895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
484895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return Zero if the command is successful; an ML error code otherwise.
485895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
486895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_gyro_bias(long *data)
487895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
488895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
489895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
490895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
491895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
492895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
493895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
494895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
495895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] = inv_obj.gyro_bias[0];
496895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[1] = inv_obj.gyro_bias[1];
497895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[2] = inv_obj.gyro_bias[2];
498895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
499895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
500895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
501895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
502895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
503895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_accel_bias is used to get the accelerometer baises.
504895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The argument array elements are ordered X,Y,Z.
505895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The values are scaled such that 1 g (gravity) = 2^16 LSBs.
506895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
507895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
508895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
509895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
510895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
511895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
512895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long </b>.
513895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
514895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return Zero if the command is successful; an ML error code otherwise.
515895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
516895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_accel_bias(long *data)
517895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
518895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
519895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
520895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
521895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
522895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
523895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
524895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
525895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] = inv_obj.accel_bias[0];
526895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[1] = inv_obj.accel_bias[1];
527895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[2] = inv_obj.accel_bias[2];
528895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
529895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
530895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
531895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
532895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
533895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @cond MPL
534895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_mag_bias is used to get Magnetometer Bias
535895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
536895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
537895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
538895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
539895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
540895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
541895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
542895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long </b>.
543895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
544895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return Zero if the command is successful; an ML error code otherwise.
545895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @endcond
546895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
547895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_mag_bias(long *data)
548895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
549895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
550895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
551895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
552895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
553895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
554895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
555895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
556895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] =
557895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        inv_obj.compass_bias[0] +
558895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        (long)((long long)inv_obj.init_compass_bias[0] * inv_obj.compass_sens /
559895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall               16384);
560895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[1] =
561895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        inv_obj.compass_bias[1] +
562895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        (long)((long long)inv_obj.init_compass_bias[1] * inv_obj.compass_sens /
563895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall               16384);
564895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[2] =
565895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        inv_obj.compass_bias[2] +
566895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        (long)((long long)inv_obj.init_compass_bias[2] * inv_obj.compass_sens /
567895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall               16384);
568895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
569895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
570895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
571895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
572895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
573895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_gyro_and_accel_sensor is used to get the most recent set of all sensor data.
574895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The argument array elements are ordered gyroscope X,Y, and Z,
575895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          accelerometer X, Y, and Z, and magnetometer X,Y, and Z.
576895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          \if UMPL The magnetometer elements are not populated in UMPL. \endif
577895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The gyroscope and accelerometer data is not scaled or offset, it is
578895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          copied directly from the sensor registers.
579895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          In the case of accelerometers with 8-bit output resolution, the data
580895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          is scaled up to match the 2^14 = 1 g typical represntation of +/- 2 g
581895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          full scale range
582895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
583895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
584895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
585895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
586895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
587895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
588895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 9 cells long</b>.
589895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
590895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return Zero if the command is successful; an ML error code otherwise.
591895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
592895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall /* inv_get_gyro_and_accel_sensor implemented in mlFIFO.c */
593895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
594895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
595895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @cond MPL
596895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_mag_raw_data is used to get Raw magnetometer data.
597895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
598895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
599895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
600895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
601895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
602895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
603895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
604895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long </b>.
605895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
606895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return Zero if the command is successful; an ML error code otherwise.
607895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @endcond
608895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
609895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_mag_raw_data(long *data)
610895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
611895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
612895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
613895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
614895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
615895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
616895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
617895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
618895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
619895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] = inv_obj.compass_sensor_data[0];
620895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[1] = inv_obj.compass_sensor_data[1];
621895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[2] = inv_obj.compass_sensor_data[2];
622895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
623895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
624895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
625895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
626895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
627895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @cond MPL
628895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_magnetometer is used to get magnetometer data.
629895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
630895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
631895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
632895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
633895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
634895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
635895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
636895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long</b>.
637895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
638895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return Zero if the command is successful; an ML error code otherwise.
639895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @endcond
640895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
641895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_magnetometer(long *data)
642895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
643895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
644895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
645895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
646895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
647895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
648895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
649895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
650895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
651895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] = inv_obj.compass_sensor_data[0] + inv_obj.init_compass_bias[0];
652895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[1] = inv_obj.compass_sensor_data[1] + inv_obj.init_compass_bias[1];
653895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[2] = inv_obj.compass_sensor_data[2] + inv_obj.init_compass_bias[2];
654895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
655895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
656895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
657895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
658895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
659895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @cond MPL
660895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_pressure is used to get Pressure data.
661895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
662895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
663895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
664895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
665895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
666895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
667895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to data to be passed back to the user.
668895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
669895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return Zero if the command is successful; an ML error code otherwise.
670895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @endcond
671895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
672895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_pressure(long *data)
673895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
674895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
675895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
676895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
677895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
678895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
679895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
680895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
681895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
682895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] = inv_obj.pressure;
683895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
684895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
685895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
686895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
687895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
688895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @cond MPL
689895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_heading is used to get heading from Rotation Matrix.
690895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
691895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
692895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
693895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
694895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
695895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
696895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to data to be passed back to the user.
697895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
698895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return Zero if the command is successful; an ML error code otherwise.
699895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @endcond
700895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
701895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
702895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_heading(long *data)
703895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
704895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
705895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    float rotMatrix[9];
706895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    float tmp;
707895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
708895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
709895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
710895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
711895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
712895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
713895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_get_rot_mat_float(rotMatrix);
714895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if ((rotMatrix[7] < 0.707) && (rotMatrix[7] > -0.707)) {
715895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        tmp =
716895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall            (float)(atan2f(rotMatrix[4], rotMatrix[1]) * 57.29577951308 -
717895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                    90.0f);
718895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    } else {
719895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        tmp =
720895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall            (float)(atan2f(rotMatrix[5], rotMatrix[2]) * 57.29577951308 +
721895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                    90.0f);
722895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
723895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (tmp < 0) {
724895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        tmp += 360.0f;
725895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
726895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] = (long)((360 - tmp) * 65536.0f);
727895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
728895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
729895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
730895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
731895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
732895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_gyro_cal_matrix is used to get the gyroscope
733895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          calibration matrix. The gyroscope calibration matrix defines the relationship
734895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          between the gyroscope sensor axes and the sensor fusion solution axes.
735895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Calibration matrix data members will have a value of 1, 0, or -1.
736895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The matrix has members
737895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <center>C11 C12 C13</center>
738895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <center>C21 C22 C23</center>
739895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <center>C31 C32 C33</center>
740895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The argument array elements are ordered C11, C12, C13, C21, C22, C23, C31, C32, C33.
741895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
742895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
743895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
744895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
745895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
746895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
747895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 9 cells long</b>.
748895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
749895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return Zero if the command is successful; an ML error code otherwise.
750895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
751895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_gyro_cal_matrix(long *data)
752895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
753895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
754895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
755895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
756895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
757895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
758895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
759895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
760895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
761895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] = inv_obj.gyro_cal[0];
762895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[1] = inv_obj.gyro_cal[1];
763895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[2] = inv_obj.gyro_cal[2];
764895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[3] = inv_obj.gyro_cal[3];
765895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[4] = inv_obj.gyro_cal[4];
766895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[5] = inv_obj.gyro_cal[5];
767895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[6] = inv_obj.gyro_cal[6];
768895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[7] = inv_obj.gyro_cal[7];
769895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[8] = inv_obj.gyro_cal[8];
770895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
771895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
772895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
773895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
774895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
775895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_accel_cal_matrix is used to get the accelerometer
776895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          calibration matrix.
777895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Calibration matrix data members will have a value of 1, 0, or -1.
778895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The matrix has members
779895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <center>C11 C12 C13</center>
780895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <center>C21 C22 C23</center>
781895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <center>C31 C32 C33</center>
782895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The argument array elements are ordered C11, C12, C13, C21, C22, C23, C31, C32, C33.
783895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
784895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
785895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
786895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
787895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
788895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
789895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
790895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
791895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
792895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 9 cells long</b>.
793895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
794895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return Zero if the command is successful; an ML error code otherwise.
795895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
796895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_accel_cal_matrix(long *data)
797895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
798895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
799895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
800895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
801895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
802895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
803895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
804895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
805895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
806895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] = inv_obj.accel_cal[0];
807895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[1] = inv_obj.accel_cal[1];
808895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[2] = inv_obj.accel_cal[2];
809895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[3] = inv_obj.accel_cal[3];
810895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[4] = inv_obj.accel_cal[4];
811895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[5] = inv_obj.accel_cal[5];
812895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[6] = inv_obj.accel_cal[6];
813895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[7] = inv_obj.accel_cal[7];
814895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[8] = inv_obj.accel_cal[8];
815895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
816895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
817895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
818895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
819895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
820895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @cond MPL
821895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_mag_cal_matrix is used to get magnetometer calibration matrix.
822895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
823895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
824895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
825895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
826895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
827895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
828895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
829895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 9 cells long at least</b>.
830895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
831895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return Zero if the command is successful; an ML error code otherwise.
832895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @endcond
833895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
834895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_mag_cal_matrix(long *data)
835895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
836895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
837895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
838895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
839895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
840895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
841895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
842895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
843895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
844895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] = inv_obj.compass_cal[0];
845895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[1] = inv_obj.compass_cal[1];
846895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[2] = inv_obj.compass_cal[2];
847895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[3] = inv_obj.compass_cal[3];
848895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[4] = inv_obj.compass_cal[4];
849895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[5] = inv_obj.compass_cal[5];
850895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[6] = inv_obj.compass_cal[6];
851895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[7] = inv_obj.compass_cal[7];
852895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[8] = inv_obj.compass_cal[8];
853895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
854895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
855895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
856895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
857895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
858895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @cond MPL
859895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_mag_bias_error is used to get magnetometer Bias error.
860895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
861895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
862895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
863895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
864895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
865895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
866895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
867895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long at least</b>.
868895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
869895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return Zero if the command is successful; an ML error code otherwise.
870895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @endcond
871895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
872895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_mag_bias_error(long *data)
873895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
874895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
875895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
876895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
877895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
878895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
879895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
880895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
881895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_obj.large_field == 0) {
882895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[0] = inv_obj.compass_bias_error[0];
883895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[1] = inv_obj.compass_bias_error[1];
884895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[2] = inv_obj.compass_bias_error[2];
885895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    } else {
886895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[0] = P_INIT;
887895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[1] = P_INIT;
888895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[2] = P_INIT;
889895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
890895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
891895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
892895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
893895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
894895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
895895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @cond MPL
896895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_mag_scale is used to get magnetometer scale.
897895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
898895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
899895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
900895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
901895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
902895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
903895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
904895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long at least</b>.
905895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
906895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return Zero if the command is successful; an ML error code otherwise.
907895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @endcond
908895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
909895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_mag_scale(long *data)
910895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
911895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
912895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
913895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
914895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
915895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
916895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
917895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
918895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
919895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] = inv_obj.compass_scale[0];
920895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[1] = inv_obj.compass_scale[1];
921895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[2] = inv_obj.compass_scale[2];
922895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
923895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
924895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
925895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
926895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
927895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @cond MPL
928895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_local_field is used to get local magnetic field data.
929895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
930895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
931895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
932895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
933895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
934895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
935895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
936895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long at least</b>.
937895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
938895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return Zero if the command is successful; an ML error code otherwise.
939895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @endcond
940895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
941895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_local_field(long *data)
942895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
943895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
944895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
945895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
946895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
947895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
948895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
949895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
950895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
951895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] = inv_obj.local_field[0];
952895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[1] = inv_obj.local_field[1];
953895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[2] = inv_obj.local_field[2];
954895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
955895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
956895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
957895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
958895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
959895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @cond MPL
960895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_relative_quaternion is used to get relative quaternion.
961895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
962895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
963895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
964895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
965895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
966895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
967895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
968895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 4 cells long at least</b>.
969895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
970895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return Zero if the command is successful; an ML error code otherwise.
971895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @endcond
972895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
973895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/* inv_get_relative_quaternion implemented in mlFIFO.c */
974895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
975895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
976895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_gyro_float is used to get the most recent gyroscope measurement.
977895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The argument array elements are ordered X,Y,Z.
978895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The values are in units of dps (degrees per second).
979895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
980895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
981895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
982895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
983895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
984895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
985895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long</b>.
986895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
987895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if the command is successful; an error code otherwise.
988895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
989895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_gyro_float(float *data)
990895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
991895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
992895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
993895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
994895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    long ldata[3];
995895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
996895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
997895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
998895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
999895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
1000895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
1001895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
1002895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_get_gyro(ldata);
1003895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] = (float)ldata[0] / 65536.0f;
1004895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[1] = (float)ldata[1] / 65536.0f;
1005895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[2] = (float)ldata[2] / 65536.0f;
1006895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1007895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
1008895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
1009895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1010895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
1011895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @internal
1012895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_angular_velocity_float is used to get an array of three data points representing the angular
1013895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          velocity as derived from <b>both</b> gyroscopes and accelerometers.
1014895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          This requires that ML_SENSOR_FUSION be enabled, to fuse data from
1015895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          the gyroscope and accelerometer device, appropriately scaled and
1016895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          oriented according to the respective mounting matrices.
1017895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1018895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
1019895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
1020895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
1021895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
1022895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long</b>.
1023895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1024895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if the command is successful; an error code otherwise.
1025895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
1026895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_angular_velocity_float(float *data)
1027895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
1028895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
1029895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /* not implemented. old (invalid) implementation:
1030895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall       return inv_get_gyro_float(data);
1031895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall     */
1032895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
1033895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1034895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
1035895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_accel_float is used to get the most recent accelerometer measurement.
1036895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The argument array elements are ordered X,Y,Z.
1037895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The values are in units of g (gravity).
1038895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1039895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
1040895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
1041895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1042895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
1043895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
1044895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long</b>.
1045895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1046895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if the command is successful; an error code otherwise.
1047895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
1048895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall /* inv_get_accel_float implemented in mlFIFO.c */
1049895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1050895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
1051895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_temperature_float is used to get the most recent
1052895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          temperature measurement.
1053895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The argument array should only have one element.
1054895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The value is in units of deg C (degrees Celsius).
1055895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1056895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
1057895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
1058895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1059895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
1060895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to data to be passed back to the user.
1061895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1062895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return Zero if the command is successful; an ML error code otherwise.
1063895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
1064895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_temperature_float(float *data)
1065895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
1066895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
1067895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1068895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
1069895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    long ldata[1];
1070895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1071895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
1072895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
1073895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1074895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
1075895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
1076895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
1077895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1078895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_get_temperature(ldata);
1079895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] = (float)ldata[0] / 65536.0f;
1080895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1081895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
1082895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
1083895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1084895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
1085895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_rot_mat_float is used to get an array of nine data points representing the rotation
1086895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          matrix generated from all available sensors.
1087895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The array format will be R11, R12, R13, R21, R22, R23, R31, R32,
1088895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          R33, representing the matrix:
1089895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <center>R11 R12 R13</center>
1090895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <center>R21 R22 R23</center>
1091895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <center>R31 R32 R33</center>
1092895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <b>Please refer to the "9-Axis Sensor Fusion Application Note" document,
1093895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          section 7 "Sensor Fusion Output", for details regarding rotation
1094895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          matrix output</b>.
1095895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1096895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
1097895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
1098895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1099895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
1100895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
1101895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 9 cells long at least</b>.
1102895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1103895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if the command is successful; an error code otherwise.
1104895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
1105895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_rot_mat_float(float *data)
1106895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
1107895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
1108895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1109895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
1110895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1111895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
1112895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
1113895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1114895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
1115895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
1116895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
1117895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    {
1118895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        long qdata[4], rdata[9];
1119895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        inv_get_quaternion(qdata);
1120895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        inv_quaternion_to_rotation(qdata, rdata);
1121895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[0] = (float)rdata[0] / 1073741824.0f;
1122895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[1] = (float)rdata[1] / 1073741824.0f;
1123895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[2] = (float)rdata[2] / 1073741824.0f;
1124895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[3] = (float)rdata[3] / 1073741824.0f;
1125895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[4] = (float)rdata[4] / 1073741824.0f;
1126895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[5] = (float)rdata[5] / 1073741824.0f;
1127895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[6] = (float)rdata[6] / 1073741824.0f;
1128895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[7] = (float)rdata[7] / 1073741824.0f;
1129895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[8] = (float)rdata[8] / 1073741824.0f;
1130895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
1131895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1132895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
1133895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
1134895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1135895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
1136895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_quaternion_float is used to get the quaternion representation
1137895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          of the current sensor fusion solution.
1138895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1139895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
1140895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
1141895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1142895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
1143895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
1144895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 4 cells long</b>.
1145895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1146895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if the command is successful; an ML error code otherwise.
1147895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
1148895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall /* inv_get_quaternion_float implemented in mlFIFO.c */
1149895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1150895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
1151895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_linear_accel_float is used to get an estimate of linear
1152895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          acceleration, based on the most recent accelerometer measurement
1153895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          and sensor fusion solution.
1154895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The values are in units of g (gravity).
1155895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1156895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
1157895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
1158895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1159895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
1160895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
1161895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long</b>.
1162895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1163895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if the command is successful; an error code otherwise.
1164895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
1165895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_linear_accel_float(float *data)
1166895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
1167895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
1168895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1169895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
1170895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    long ldata[3];
1171895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1172895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
1173895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
1174895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1175895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
1176895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
1177895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
1178895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1179895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_get_linear_accel(ldata);
1180895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] = (float)ldata[0] / 65536.0f;
1181895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[1] = (float)ldata[1] / 65536.0f;
1182895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[2] = (float)ldata[2] / 65536.0f;
1183895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1184895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
1185895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
1186895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1187895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
1188895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_linear_accel_in_world_float is used to get an estimate of
1189895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          linear acceleration, in the world frame,  based on the most
1190895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          recent accelerometer measurement and sensor fusion solution.
1191895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The values are in units of g (gravity).
1192895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1193895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
1194895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
1195895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1196895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
1197895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
1198895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long</b>.
1199895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1200895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if the command is successful; an error code otherwise.
1201895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
1202895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_linear_accel_in_world_float(float *data)
1203895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
1204895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
1205895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1206895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
1207895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    long ldata[3];
1208895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1209895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
1210895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
1211895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1212895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
1213895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
1214895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
1215895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1216895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_get_linear_accel_in_world(ldata);
1217895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] = (float)ldata[0] / 65536.0f;
1218895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[1] = (float)ldata[1] / 65536.0f;
1219895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[2] = (float)ldata[2] / 65536.0f;
1220895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1221895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
1222895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
1223895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1224895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
1225895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_gravity_float is used to get an estimate of the body frame
1226895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          gravity vector, based on the most recent sensor fusion solution.
1227895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1228895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
1229895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
1230895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1231895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
1232895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
1233895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long at least</b>.
1234895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1235895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if the command is successful; an error code otherwise.
1236895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
1237895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_gravity_float(float *data)
1238895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
1239895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
1240895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1241895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
1242895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    long ldata[3];
1243895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1244895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
1245895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
1246895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1247895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
1248895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
1249895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
1250895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_get_gravity(ldata);
1251895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] = (float)ldata[0] / 65536.0f;
1252895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[1] = (float)ldata[1] / 65536.0f;
1253895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[2] = (float)ldata[2] / 65536.0f;
1254895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1255895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
1256895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
1257895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1258895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
1259895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_gyro_cal_matrix_float is used to get the gyroscope
1260895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          calibration matrix. The gyroscope calibration matrix defines the relationship
1261895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          between the gyroscope sensor axes and the sensor fusion solution axes.
1262895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Calibration matrix data members will have a value of 1.0, 0, or -1.0.
1263895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The matrix has members
1264895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <center>C11 C12 C13</center>
1265895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <center>C21 C22 C23</center>
1266895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <center>C31 C32 C33</center>
1267895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The argument array elements are ordered C11, C12, C13, C21, C22, C23, C31, C32, C33.
1268895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1269895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
1270895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
1271895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1272895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
1273895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
1274895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 9 cells long</b>.
1275895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1276895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if the command is successful; an error code otherwise.
1277895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
1278895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_gyro_cal_matrix_float(float *data)
1279895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
1280895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
1281895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1282895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
1283895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1284895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
1285895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
1286895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1287895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
1288895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
1289895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
1290895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1291895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] = (float)inv_obj.gyro_cal[0] / 1073741824.0f;
1292895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[1] = (float)inv_obj.gyro_cal[1] / 1073741824.0f;
1293895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[2] = (float)inv_obj.gyro_cal[2] / 1073741824.0f;
1294895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[3] = (float)inv_obj.gyro_cal[3] / 1073741824.0f;
1295895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[4] = (float)inv_obj.gyro_cal[4] / 1073741824.0f;
1296895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[5] = (float)inv_obj.gyro_cal[5] / 1073741824.0f;
1297895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[6] = (float)inv_obj.gyro_cal[6] / 1073741824.0f;
1298895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[7] = (float)inv_obj.gyro_cal[7] / 1073741824.0f;
1299895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[8] = (float)inv_obj.gyro_cal[8] / 1073741824.0f;
1300895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1301895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
1302895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
1303895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1304895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
1305895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_accel_cal_matrix_float is used to get the accelerometer
1306895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          calibration matrix.
1307895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Calibration matrix data members will have a value of 1.0, 0, or -1.0.
1308895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The matrix has members
1309895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <center>C11 C12 C13</center>
1310895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <center>C21 C22 C23</center>
1311895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <center>C31 C32 C33</center>
1312895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The argument array elements are ordered C11, C12, C13, C21, C22, C23, C31, C32, C33.
1313895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1314895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
1315895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
1316895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1317895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
1318895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
1319895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 9 cells long</b>.
1320895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1321895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if the command is successful; an error code otherwise.
1322895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
1323895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1324895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_accel_cal_matrix_float(float *data)
1325895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
1326895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
1327895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1328895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
1329895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1330895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
1331895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
1332895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1333895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
1334895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
1335895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
1336895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1337895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] = (float)inv_obj.accel_cal[0] / 1073741824.0f;
1338895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[1] = (float)inv_obj.accel_cal[1] / 1073741824.0f;
1339895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[2] = (float)inv_obj.accel_cal[2] / 1073741824.0f;
1340895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[3] = (float)inv_obj.accel_cal[3] / 1073741824.0f;
1341895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[4] = (float)inv_obj.accel_cal[4] / 1073741824.0f;
1342895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[5] = (float)inv_obj.accel_cal[5] / 1073741824.0f;
1343895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[6] = (float)inv_obj.accel_cal[6] / 1073741824.0f;
1344895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[7] = (float)inv_obj.accel_cal[7] / 1073741824.0f;
1345895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[8] = (float)inv_obj.accel_cal[8] / 1073741824.0f;
1346895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1347895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
1348895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
1349895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1350895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
1351895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @cond MPL
1352895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_mag_cal_matrix_float is used to get an array of nine data points
1353895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *			representing the calibration matrix for the compass:
1354895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <center>C11 C12 C13</center>
1355895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <center>C21 C22 C23</center>
1356895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <center>C31 C32 C33</center>
1357895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1358895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
1359895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
1360895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1361895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
1362895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
1363895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 9 cells long at least</b>.
1364895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1365895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if the command is successful; an error code otherwise.
1366895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @endcond
1367895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
1368895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_mag_cal_matrix_float(float *data)
1369895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
1370895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
1371895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1372895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
1373895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1374895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
1375895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
1376895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1377895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
1378895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
1379895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
1380895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1381895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] = (float)inv_obj.compass_cal[0] / 1073741824.0f;
1382895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[1] = (float)inv_obj.compass_cal[1] / 1073741824.0f;
1383895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[2] = (float)inv_obj.compass_cal[2] / 1073741824.0f;
1384895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[3] = (float)inv_obj.compass_cal[3] / 1073741824.0f;
1385895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[4] = (float)inv_obj.compass_cal[4] / 1073741824.0f;
1386895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[5] = (float)inv_obj.compass_cal[5] / 1073741824.0f;
1387895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[6] = (float)inv_obj.compass_cal[6] / 1073741824.0f;
1388895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[7] = (float)inv_obj.compass_cal[7] / 1073741824.0f;
1389895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[8] = (float)inv_obj.compass_cal[8] / 1073741824.0f;
1390895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
1391895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
1392895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1393895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
1394895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_gyro_temp_slope_float is used to get the temperature
1395895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          compensation algorithm's estimate of the gyroscope bias temperature
1396895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          coefficient.
1397895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The argument array elements are ordered X,Y,Z.
1398895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Values are in units of dps per deg C (degrees per second per degree
1399895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Celcius)
1400895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Please refer to the provided "9-Axis Sensor Fusion
1401895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Application Note" document.
1402895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1403895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
1404895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
1405895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1406895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
1407895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
1408895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long </b>.
1409895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1410895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if the command is successful; an error code otherwise.
1411895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
1412895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_gyro_temp_slope_float(float *data)
1413895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
1414895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
1415895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1416895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
1417895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1418895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
1419895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
1420895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1421895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
1422895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
1423895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
1424895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1425895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_params_obj.bias_mode & INV_LEARN_BIAS_FROM_TEMPERATURE) {
1426895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[0] = inv_obj.x_gyro_coef[1];
1427895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[1] = inv_obj.y_gyro_coef[1];
1428895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[2] = inv_obj.z_gyro_coef[1];
1429895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    } else {
1430895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[0] = (float)inv_obj.temp_slope[0] / 65536.0f;
1431895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[1] = (float)inv_obj.temp_slope[1] / 65536.0f;
1432895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[2] = (float)inv_obj.temp_slope[2] / 65536.0f;
1433895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
1434895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1435895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
1436895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
1437895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1438895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
1439895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_gyro_bias_float is used to get the gyroscope biases.
1440895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The argument array elements are ordered X,Y,Z.
1441895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The values are in units of dps (degrees per second).
1442895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1443895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
1444895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
1445895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1446895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
1447895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
1448895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long</b>.
1449895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1450895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if the command is successful; an error code otherwise.
1451895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
1452895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_gyro_bias_float(float *data)
1453895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
1454895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
1455895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1456895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
1457895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1458895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
1459895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
1460895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1461895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
1462895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
1463895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
1464895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1465895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] = (float)inv_obj.gyro_bias[0] / 65536.0f;
1466895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[1] = (float)inv_obj.gyro_bias[1] / 65536.0f;
1467895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[2] = (float)inv_obj.gyro_bias[2] / 65536.0f;
1468895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1469895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
1470895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
1471895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1472895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
1473895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_accel_bias_float is used to get the accelerometer baises.
1474895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The argument array elements are ordered X,Y,Z.
1475895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The values are in units of g (gravity).
1476895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1477895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
1478895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
1479895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1480895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
1481895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
1482895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long</b>.
1483895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1484895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if the command is successful; an error code otherwise.
1485895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
1486895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_accel_bias_float(float *data)
1487895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
1488895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
1489895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1490895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
1491895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1492895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
1493895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
1494895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1495895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
1496895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
1497895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
1498895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1499895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] = (float)inv_obj.accel_bias[0] / 65536.0f;
1500895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[1] = (float)inv_obj.accel_bias[1] / 65536.0f;
1501895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[2] = (float)inv_obj.accel_bias[2] / 65536.0f;
1502895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1503895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
1504895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
1505895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1506895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
1507895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @cond MPL
1508895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_mag_bias_float is used to get an array of three data points representing
1509895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *			the compass biases.
1510895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
1511895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
1512895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1513895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
1514895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
1515895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long</b>.
1516895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1517895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if the command is successful; an error code otherwise.
1518895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @endcond
1519895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
1520895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_mag_bias_float(float *data)
1521895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
1522895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
1523895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1524895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
1525895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1526895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
1527895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
1528895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1529895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
1530895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
1531895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
1532895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1533895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] =
1534895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        ((float)
1535895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall         (inv_obj.compass_bias[0] +
1536895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall          (long)((long long)inv_obj.init_compass_bias[0] *
1537895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                 inv_obj.compass_sens / 16384))) / 65536.0f;
1538895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[1] =
1539895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        ((float)
1540895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall         (inv_obj.compass_bias[1] +
1541895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall          (long)((long long)inv_obj.init_compass_bias[1] *
1542895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                 inv_obj.compass_sens / 16384))) / 65536.0f;
1543895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[2] =
1544895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        ((float)
1545895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall         (inv_obj.compass_bias[2] +
1546895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall          (long)((long long)inv_obj.init_compass_bias[2] *
1547895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                 inv_obj.compass_sens / 16384))) / 65536.0f;
1548895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1549895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
1550895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
1551895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1552895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
1553895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_gyro_and_accel_sensor_float is used to get the most recent set of all sensor data.
1554895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The argument array elements are ordered gyroscope X,Y, and Z,
1555895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          accelerometer X, Y, and Z, and magnetometer X,Y, and Z.
1556895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          \if UMPL The magnetometer elements are not populated in UMPL. \endif
1557895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The gyroscope and accelerometer data is not scaled or offset, it is
1558895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          copied directly from the sensor registers, and cast as a float.
1559895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          In the case of accelerometers with 8-bit output resolution, the data
1560895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          is scaled up to match the 2^14 = 1 g typical represntation of +/- 2 g
1561895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          full scale range
1562895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1563895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
1564895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
1565895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1566895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
1567895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
1568895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 9 cells long</b>.
1569895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1570895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if the command is successful; an error code otherwise.
1571895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
1572895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_gyro_and_accel_sensor_float(float *data)
1573895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
1574895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
1575895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1576895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
1577895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    long ldata[6];
1578895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1579895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
1580895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
1581895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1582895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
1583895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
1584895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
1585895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1586895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_get_gyro_and_accel_sensor(ldata);
1587895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] = (float)ldata[0];
1588895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[1] = (float)ldata[1];
1589895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[2] = (float)ldata[2];
1590895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[3] = (float)ldata[3];
1591895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[4] = (float)ldata[4];
1592895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[5] = (float)ldata[5];
1593895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[6] = (float)inv_obj.compass_sensor_data[0];
1594895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[7] = (float)inv_obj.compass_sensor_data[1];
1595895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[8] = (float)inv_obj.compass_sensor_data[2];
1596895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1597895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
1598895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
1599895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1600895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
1601895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_euler_angles_x is used to get the Euler angle representation
1602895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          of the current sensor fusion solution.
1603895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Euler angles are returned according to the X convention.
1604895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          This is typically the convention used for mobile devices where the X
1605895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          axis is the width of the screen, Y axis is the height, and Z the
1606895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          depth. In this case roll is defined as the rotation around the X
1607895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          axis of the device.
1608895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TABLE>
1609895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD>Element </TD><TD><b>Euler angle</b></TD><TD><b>Rotation about </b></TD></TR>
1610895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD> 0      </TD><TD>Roll              </TD><TD>X axis                </TD></TR>
1611895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD> 1      </TD><TD>Pitch             </TD><TD>Y axis                </TD></TR>
1612895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD> 2      </TD><TD>Yaw               </TD><TD>Z axis                </TD></TR>
1613895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1614895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall           </TABLE>
1615895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1616895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
1617895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
1618895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1619895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
1620895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
1621895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long</b>.
1622895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1623895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if the command is successful; an error code otherwise.
1624895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
1625895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_euler_angles_x_float(float *data)
1626895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
1627895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
1628895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1629895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
1630895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    float rotMatrix[9];
1631895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    float tmp;
1632895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1633895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
1634895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
1635895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1636895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
1637895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
1638895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
1639895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1640895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_get_rot_mat_float(rotMatrix);
1641895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    tmp = rotMatrix[6];
1642895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (tmp > 1.0f) {
1643895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        tmp = 1.0f;
1644895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
1645895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (tmp < -1.0f) {
1646895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        tmp = -1.0f;
1647895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
1648895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] =
1649895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        (float)(atan2f(rotMatrix[7],
1650895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                       rotMatrix[8]) * 57.29577951308);
1651895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[1] = (float)((double)asin(tmp) * 57.29577951308);
1652895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[2] =
1653895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        (float)(atan2f(rotMatrix[3], rotMatrix[0]) * 57.29577951308);
1654895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1655895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
1656895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
1657895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1658895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
1659895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_euler_angles_float is used to get an array of three data points three data points
1660895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *			representing roll, pitch, and yaw corresponding to the INV_EULER_ANGLES_X output and it is
1661895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          therefore the default convention for Euler angles.
1662895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Please refer to the INV_EULER_ANGLES_X for a detailed description.
1663895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1664895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
1665895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
1666895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1667895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
1668895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
1669895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long</b>.
1670895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1671895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if the command is successful; an error code otherwise.
1672895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
1673895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_euler_angles_float(float *data)
1674895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
1675895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return inv_get_euler_angles_x_float(data);
1676895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
1677895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1678895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**  @brief  inv_get_euler_angles_y_float is used to get the Euler angle representation
1679895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          of the current sensor fusion solution.
1680895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Euler angles are returned according to the Y convention.
1681895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          This convention is typically used in augmented reality applications,
1682895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          where roll is defined as the rotation around the axis along the
1683895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          height of the screen of a mobile device, namely the Y axis.
1684895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TABLE>
1685895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD>Element </TD><TD><b>Euler angle</b></TD><TD><b>Rotation about </b></TD></TR>
1686895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD> 0      </TD><TD>Roll              </TD><TD>Y axis                </TD></TR>
1687895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD> 1      </TD><TD>Pitch             </TD><TD>X axis                </TD></TR>
1688895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD> 2      </TD><TD>Yaw               </TD><TD>Z axis                </TD></TR>
1689895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          </TABLE>
1690895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1691895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
1692895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
1693895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1694895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
1695895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
1696895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long</b>.
1697895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1698895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if the command is successful; an error code otherwise.
1699895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
1700895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_euler_angles_y_float(float *data)
1701895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
1702895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
1703895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1704895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
1705895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    float rotMatrix[9];
1706895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    float tmp;
1707895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1708895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
1709895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
1710895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1711895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
1712895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
1713895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
1714895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1715895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_get_rot_mat_float(rotMatrix);
1716895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    tmp = rotMatrix[7];
1717895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (tmp > 1.0f) {
1718895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        tmp = 1.0f;
1719895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
1720895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (tmp < -1.0f) {
1721895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        tmp = -1.0f;
1722895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
1723895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] =
1724895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        (float)(atan2f(rotMatrix[8], rotMatrix[6]) * 57.29577951308);
1725895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[1] = (float)((double)asin(tmp) * 57.29577951308);
1726895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[2] =
1727895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        (float)(atan2f(rotMatrix[4], rotMatrix[1]) * 57.29577951308);
1728895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1729895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
1730895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
1731895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1732895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**  @brief  inv_get_euler_angles_z_float is used to get the Euler angle representation
1733895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          of the current sensor fusion solution.
1734895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          This convention is mostly used in application involving the use
1735895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          of a camera, typically placed on the back of a mobile device, that
1736895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          is along the Z axis.  In this convention roll is defined as the
1737895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          rotation around the Z axis.
1738895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Euler angles are returned according to the Y convention.
1739895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TABLE>
1740895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD>Element </TD><TD><b>Euler angle</b></TD><TD><b>Rotation about </b></TD></TR>
1741895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD> 0      </TD><TD>Roll              </TD><TD>Z axis                </TD></TR>
1742895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD> 1      </TD><TD>Pitch             </TD><TD>X axis                </TD></TR>
1743895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD> 2      </TD><TD>Yaw               </TD><TD>Y axis                </TD></TR>
1744895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          </TABLE>
1745895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1746895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
1747895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
1748895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1749895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
1750895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
1751895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long</b>.
1752895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1753895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
1754895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
1755895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1756895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
1757895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
1758895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long</b>.
1759895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1760895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if the command is successful; an error code otherwise.
1761895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
1762895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_euler_angles_z_float(float *data)
1763895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
1764895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
1765895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1766895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
1767895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    float rotMatrix[9];
1768895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    float tmp;
1769895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1770895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
1771895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
1772895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1773895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
1774895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
1775895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
1776895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1777895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_get_rot_mat_float(rotMatrix);
1778895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    tmp = rotMatrix[8];
1779895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (tmp > 1.0f) {
1780895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        tmp = 1.0f;
1781895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
1782895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (tmp < -1.0f) {
1783895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        tmp = -1.0f;
1784895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
1785895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] =
1786895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        (float)(atan2f(rotMatrix[6], rotMatrix[7]) * 57.29577951308);
1787895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[1] = (float)((double)asin(tmp) * 57.29577951308);
1788895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[2] =
1789895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        (float)(atan2f(rotMatrix[5], rotMatrix[2]) * 57.29577951308);
1790895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1791895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
1792895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
1793895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1794895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
1795895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @cond MPL
1796895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_mag_raw_data_float is used to get Raw magnetometer data
1797895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1798895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
1799895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
1800895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1801895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
1802895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
1803895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long</b>.
1804895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1805895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if the command is successful; an error code otherwise.
1806895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @endcond
1807895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
1808895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_mag_raw_data_float(float *data)
1809895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
1810895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
1811895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1812895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
1813895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1814895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
1815895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
1816895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1817895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
1818895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
1819895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
1820895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1821895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] =
1822895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        (float)(inv_obj.compass_sensor_data[0] + inv_obj.init_compass_bias[0]);
1823895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[1] =
1824895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        (float)(inv_obj.compass_sensor_data[1] + inv_obj.init_compass_bias[1]);
1825895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[2] =
1826895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        (float)(inv_obj.compass_sensor_data[2] + inv_obj.init_compass_bias[2]);
1827895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1828895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
1829895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
1830895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1831895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
1832895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @cond MPL
1833895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_magnetometer_float is used to get magnetometer data
1834895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1835895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
1836895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
1837895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1838895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
1839895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
1840895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long</b>.
1841895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1842895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if the command is successful; an error code otherwise.
1843895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @endcond
1844895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
1845895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_magnetometer_float(float *data)
1846895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
1847895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
1848895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1849895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
1850895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1851895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
1852895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
1853895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1854895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
1855895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
1856895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
1857895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1858895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] = (float)inv_obj.compass_calibrated_data[0] / 65536.0f;
1859895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[1] = (float)inv_obj.compass_calibrated_data[1] / 65536.0f;
1860895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[2] = (float)inv_obj.compass_calibrated_data[2] / 65536.0f;
1861895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1862895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
1863895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
1864895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1865895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
1866895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @cond MPL
1867895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_pressure_float is used to get a single value representing the pressure in Pascal
1868895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1869895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
1870895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
1871895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1872895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
1873895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to the data to be passed back to the user.
1874895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1875895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if the command is successful; an error code otherwise.
1876895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @endcond
1877895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
1878895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_pressure_float(float *data)
1879895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
1880895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
1881895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1882895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
1883895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1884895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
1885895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
1886895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1887895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
1888895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
1889895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
1890895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1891895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] = (float)inv_obj.pressure;
1892895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1893895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
1894895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
1895895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1896895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
1897895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @cond MPL
1898895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_heading_float is used to get single number representing the heading of the device
1899895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          relative to the Earth, in which 0 represents North, 90 degrees
1900895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          represents East, and so on.
1901895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The heading is defined as the direction of the +Y axis if the Y
1902895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          axis is horizontal, and otherwise the direction of the -Z axis.
1903895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1904895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
1905895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
1906895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1907895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
1908895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to the data to be passed back to the user.
1909895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1910895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if the command is successful; an error code otherwise.
1911895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @endcond
1912895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
1913895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_heading_float(float *data)
1914895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
1915895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
1916895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1917895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
1918895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    float rotMatrix[9];
1919895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    float tmp;
1920895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1921895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
1922895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
1923895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1924895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
1925895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
1926895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
1927895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1928895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_get_rot_mat_float(rotMatrix);
1929895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if ((rotMatrix[7] < 0.707) && (rotMatrix[7] > -0.707)) {
1930895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        tmp =
1931895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall            (float)(atan2f(rotMatrix[4], rotMatrix[1]) * 57.29577951308 -
1932895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                    90.0f);
1933895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    } else {
1934895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        tmp =
1935895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall            (float)(atan2f(rotMatrix[5], rotMatrix[2]) * 57.29577951308 +
1936895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                    90.0f);
1937895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
1938895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (tmp < 0) {
1939895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        tmp += 360.0f;
1940895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
1941895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] = 360 - tmp;
1942895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1943895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
1944895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
1945895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1946895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
1947895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @cond MPL
1948895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_mag_bias_error_float is used to get an array of three numbers representing
1949895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *			the current estimated error in the compass biases. These numbers are unitless and serve
1950895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          as rough estimates in which numbers less than 100 typically represent
1951895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          reasonably well calibrated compass axes.
1952895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1953895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
1954895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
1955895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1956895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
1957895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
1958895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long</b>.
1959895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1960895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if the command is successful; an error code otherwise.
1961895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @endcond
1962895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
1963895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_mag_bias_error_float(float *data)
1964895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
1965895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
1966895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1967895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
1968895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1969895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
1970895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
1971895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1972895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
1973895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
1974895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
1975895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1976895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_obj.large_field == 0) {
1977895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[0] = (float)inv_obj.compass_bias_error[0];
1978895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[1] = (float)inv_obj.compass_bias_error[1];
1979895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[2] = (float)inv_obj.compass_bias_error[2];
1980895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    } else {
1981895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[0] = (float)P_INIT;
1982895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[1] = (float)P_INIT;
1983895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        data[2] = (float)P_INIT;
1984895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
1985895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1986895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
1987895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
1988895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
1989895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
1990895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @cond MPL
1991895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_mag_scale_float is used to get magnetometer scale.
1992895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1993895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
1994895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
1995895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
1996895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
1997895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
1998895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long</b>.
1999895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2000895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if the command is successful; an error code otherwise.
2001895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @endcond
2002895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
2003895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_mag_scale_float(float *data)
2004895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
2005895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
2006895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2007895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
2008895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2009895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
2010895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
2011895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2012895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
2013895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
2014895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
2015895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2016895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] = (float)inv_obj.compass_scale[0] / 65536.0f;
2017895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[1] = (float)inv_obj.compass_scale[1] / 65536.0f;
2018895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[2] = (float)inv_obj.compass_scale[2] / 65536.0f;
2019895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2020895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
2021895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
2022895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2023895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
2024895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @cond MPL
2025895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_local_field_float is used to get local magnetic field data.
2026895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2027895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
2028895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
2029895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2030895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
2031895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
2032895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 3 cells long</b>.
2033895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2034895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if the command is successful; an error code otherwise.
2035895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @endcond
2036895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
2037895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_local_field_float(float *data)
2038895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
2039895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
2040895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2041895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
2042895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2043895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
2044895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
2045895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2046895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
2047895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
2048895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
2049895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2050895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] = (float)inv_obj.local_field[0] / 65536.0f;
2051895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[1] = (float)inv_obj.local_field[1] / 65536.0f;
2052895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[2] = (float)inv_obj.local_field[2] / 65536.0f;
2053895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2054895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
2055895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
2056895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2057895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
2058895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @cond MPL
2059895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_relative_quaternion_float is used to get relative quaternion data.
2060895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2061895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
2062895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
2063895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2064895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
2065895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
2066895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 4 cells long at least</b>.
2067895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2068895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if the command is successful; an error code otherwise.
2069895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @endcond
2070895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
2071895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_relative_quaternion_float(float *data)
2072895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
2073895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
2074895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2075895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
2076895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2077895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() < INV_STATE_DMP_OPENED)
2078895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
2079895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2080895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (NULL == data) {
2081895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
2082895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
2083895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2084895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[0] = (float)inv_obj.relative_quat[0] / 1073741824.0f;
2085895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[1] = (float)inv_obj.relative_quat[1] / 1073741824.0f;
2086895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[2] = (float)inv_obj.relative_quat[2] / 1073741824.0f;
2087895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    data[3] = (float)inv_obj.relative_quat[3] / 1073741824.0f;
2088895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2089895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
2090895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
2091895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2092895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
2093895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * Returns the curren compass accuracy.
2094895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2095895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * - 0: Unknown: The accuracy is unreliable and compass data should not be used
2096895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * - 1: Low: The compass accuracy is low.
2097895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * - 2: Medium: The compass accuracy is medium.
2098895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * - 3: High: The compas acurracy is high and can be trusted
2099895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2100895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @param accuracy The accuracy level in the range 0-3
2101895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2102895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @return ML_SUCCESS or non-zero error code
2103895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
2104895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_compass_accuracy(int *accuracy)
2105895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
2106895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() != INV_STATE_DMP_STARTED)
2107895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_SM_IMPROPER_STATE;
2108895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2109895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    *accuracy = inv_obj.compass_accuracy;
2110895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return INV_SUCCESS;
2111895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
2112895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2113895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
2114895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_set_gyro_bias is used to set the gyroscope bias.
2115895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The argument array elements are ordered X,Y,Z.
2116895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The values are scaled at 1 dps = 2^16 LSBs.
2117895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2118895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Please refer to the provided "9-Axis Sensor Fusion
2119895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Application Note" document provided.
2120895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2121895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or
2122895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          MLDmpPedometerStandAloneOpen() \endif
2123895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2124895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data        A pointer to an array to be copied from the user.
2125895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2126895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if successful; a non-zero error code otherwise.
2127895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
2128895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_set_gyro_bias(long *data)
2129895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
2130895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
2131895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
2132895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    long biasTmp;
2133895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    long sf = 0;
2134895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    short offset[GYRO_NUM_AXES];
2135895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    int i;
2136895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
2137895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2138895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (mldl_cfg->gyro_sens_trim != 0) {
2139895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        sf = 2000 * 131 / mldl_cfg->gyro_sens_trim;
2140895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    } else {
2141895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        sf = 2000;
2142895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
2143895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    for (i = 0; i < GYRO_NUM_AXES; i++) {
2144895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        inv_obj.gyro_bias[i] = data[i];
2145895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        biasTmp = -inv_obj.gyro_bias[i] / sf;
2146895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        if (biasTmp < 0)
2147895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall            biasTmp += 65536L;
2148895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        offset[i] = (short)biasTmp;
2149895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
2150895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_set_offset(offset);
2151895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (result) {
2152895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LOG_RESULT_LOCATION(result);
2153895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return result;
2154895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
2155895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2156895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return INV_SUCCESS;
2157895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
2158895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2159895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
2160895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_set_accel_bias is used to set the accelerometer bias.
2161895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The argument array elements are ordered X,Y,Z.
2162895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The values are scaled in units of g (gravity),
2163895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          where 1 g = 2^16 LSBs.
2164895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2165895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Please refer to the provided "9-Axis Sensor Fusion
2166895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Application Note" document provided.
2167895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2168895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or
2169895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          MLDmpPedometerStandAloneOpen() \endif
2170895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2171895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data        A pointer to an array to be copied from the user.
2172895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2173895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if successful; a non-zero error code otherwise.
2174895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
2175895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_set_accel_bias(long *data)
2176895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
2177895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
2178895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
2179895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    long biasTmp;
2180895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    int i, j;
2181895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    unsigned char regs[6];
2182895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
2183895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2184895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    for (i = 0; i < ACCEL_NUM_AXES; i++) {
2185895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        inv_obj.accel_bias[i] = data[i];
2186895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        if (inv_obj.accel_sens != 0 && mldl_cfg && mldl_cfg->pdata) {
2187895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall            long long tmp64;
2188895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall            inv_obj.scaled_accel_bias[i] = 0;
2189895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall            for (j = 0; j < ACCEL_NUM_AXES; j++) {
2190895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                inv_obj.scaled_accel_bias[i] +=
2191895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                    data[j] *
2192895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                    (long)mldl_cfg->pdata->accel.orientation[i * 3 + j];
2193895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall            }
2194895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall            tmp64 = (long long)inv_obj.scaled_accel_bias[i] << 13;
2195895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall            biasTmp = (long)(tmp64 / inv_obj.accel_sens);
2196895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        } else {
2197895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall            biasTmp = 0;
2198895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        }
2199895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        if (biasTmp < 0)
2200895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall            biasTmp += 65536L;
2201895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        regs[2 * i + 0] = (unsigned char)(biasTmp / 256);
2202895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        regs[2 * i + 1] = (unsigned char)(biasTmp % 256);
2203895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
2204895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_set_mpu_memory(KEY_D_1_8, 2, &regs[0]);
2205895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (result) {
2206895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LOG_RESULT_LOCATION(result);
2207895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return result;
2208895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
2209895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_set_mpu_memory(KEY_D_1_10, 2, &regs[2]);
2210895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (result) {
2211895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LOG_RESULT_LOCATION(result);
2212895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return result;
2213895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
2214895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_set_mpu_memory(KEY_D_1_2, 2, &regs[4]);
2215895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (result) {
2216895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LOG_RESULT_LOCATION(result);
2217895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return result;
2218895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
2219895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2220895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return INV_SUCCESS;
2221895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
2222895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2223895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
2224895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @cond MPL
2225895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_set_mag_bias is used to set Compass Bias
2226895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2227895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Please refer to the provided "9-Axis Sensor Fusion
2228895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Application Note" document provided.
2229895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2230895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or
2231895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          MLDmpPedometerStandAloneOpen() \endif
2232895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpStart() must <b>NOT</b> have been called.
2233895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2234895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data        A pointer to an array to be copied from the user.
2235895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2236895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if successful; a non-zero error code otherwise.
2237895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @endcond
2238895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
2239895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_set_mag_bias(long *data)
2240895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
2241895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
2242895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
2243895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2244895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_set_compass_bias(data);
2245895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_obj.init_compass_bias[0] = 0;
2246895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_obj.init_compass_bias[1] = 0;
2247895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_obj.init_compass_bias[2] = 0;
2248895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_obj.got_compass_bias = 1;
2249895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_obj.got_init_compass_bias = 1;
2250895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_obj.compass_state = SF_STARTUP_SETTLE;
2251895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2252895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (result) {
2253895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LOG_RESULT_LOCATION(result);
2254895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return result;
2255895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
2256895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return INV_SUCCESS;
2257895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
2258895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2259895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
2260895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_set_gyro_temp_slope is used to set the temperature
2261895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          compensation algorithm's estimate of the gyroscope bias temperature
2262895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          coefficient.
2263895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The argument array elements are ordered X,Y,Z.
2264895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Values are in units of dps per deg C (degrees per second per degree
2265895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Celcius), and scaled such that 1 dps per deg C = 2^16 LSBs.
2266895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Please refer to the provided "9-Axis Sensor Fusion
2267895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Application Note" document.
2268895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2269895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_set_gyro_temp_slope is used to set Gyro temperature slope
2270895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2271895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2272895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or
2273895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          MLDmpPedometerStandAloneOpen() \endif
2274895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2275895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data        A pointer to an array to be copied from the user.
2276895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2277895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if successful; a non-zero error code otherwise.
2278895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
2279895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_set_gyro_temp_slope(long *data)
2280895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
2281895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
2282895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
2283895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    int i;
2284895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    long sf;
2285895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    unsigned char regs[3];
2286895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2287895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_obj.factory_temp_comp = 1;
2288895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_obj.temp_slope[0] = data[0];
2289895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_obj.temp_slope[1] = data[1];
2290895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_obj.temp_slope[2] = data[2];
2291895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    for (i = 0; i < GYRO_NUM_AXES; i++) {
2292895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        sf = -inv_obj.temp_slope[i] / 1118;
2293895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        if (sf > 127) {
2294895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall            sf -= 256;
2295895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        }
2296895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        regs[i] = (unsigned char)sf;
2297895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
2298895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_set_offsetTC(regs);
2299895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2300895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (result) {
2301895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LOG_RESULT_LOCATION(result);
2302895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return result;
2303895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
2304895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return INV_SUCCESS;
2305895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
2306895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2307895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
2308895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @cond MPL
2309895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_set_local_field is used to set local magnetic field
2310895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2311895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Please refer to the provided "9-Axis Sensor Fusion
2312895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Application Note" document provided.
2313895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2314895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or
2315895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          MLDmpPedometerStandAloneOpen() \endif
2316895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpStart() must <b>NOT</b> have been called.
2317895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2318895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data        A pointer to an array to be copied from the user.
2319895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2320895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if successful; a non-zero error code otherwise.
2321895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @endcond
2322895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
2323895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_set_local_field(long *data)
2324895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
2325895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
2326895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
2327895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2328895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_obj.local_field[0] = data[0];
2329895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_obj.local_field[1] = data[1];
2330895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_obj.local_field[2] = data[2];
2331895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_obj.new_local_field = 1;
2332895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2333895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (result) {
2334895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LOG_RESULT_LOCATION(result);
2335895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return result;
2336895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
2337895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return INV_SUCCESS;
2338895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
2339895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2340895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
2341895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @cond MPL
2342895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_set_mag_scale is used to set magnetometer scale
2343895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2344895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Please refer to the provided "9-Axis Sensor Fusion
2345895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Application Note" document provided.
2346895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2347895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or
2348895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          MLDmpPedometerStandAloneOpen() \endif
2349895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpStart() must <b>NOT</b> have been called.
2350895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2351895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data        A pointer to an array to be copied from the user.
2352895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2353895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if successful; a non-zero error code otherwise.
2354895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @endcond
2355895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
2356895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_set_mag_scale(long *data)
2357895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
2358895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
2359895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result = INV_SUCCESS;
2360895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2361895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_obj.compass_scale[0] = data[0];
2362895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_obj.compass_scale[1] = data[1];
2363895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_obj.compass_scale[2] = data[2];
2364895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2365895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (result) {
2366895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LOG_RESULT_LOCATION(result);
2367895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return result;
2368895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
2369895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return INV_SUCCESS;
2370895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
2371895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2372895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
2373895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_set_gyro_temp_slope_float is used to get the temperature
2374895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          compensation algorithm's estimate of the gyroscope bias temperature
2375895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          coefficient.
2376895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The argument array elements are ordered X,Y,Z.
2377895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Values are in units of dps per deg C (degrees per second per degree
2378895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Celcius)
2379895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2380895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Please refer to the provided "9-Axis Sensor Fusion
2381895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Application Note" document provided.
2382895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2383895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or
2384895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          MLDmpPedometerStandAloneOpen() \endif
2385895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2386895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data        A pointer to an array to be copied from the user.
2387895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2388895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if successful; a non-zero error code otherwise.
2389895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
2390895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_set_gyro_temp_slope_float(float *data)
2391895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
2392895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    long arrayTmp[3];
2393895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    arrayTmp[0] = (long)(data[0] * 65536.f);
2394895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    arrayTmp[1] = (long)(data[1] * 65536.f);
2395895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    arrayTmp[2] = (long)(data[2] * 65536.f);
2396895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return inv_set_gyro_temp_slope(arrayTmp);
2397895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
2398895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2399895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
2400895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_set_gyro_bias_float is used to set the gyroscope bias.
2401895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The argument array elements are ordered X,Y,Z.
2402895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The values are in units of dps (degrees per second).
2403895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2404895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Please refer to the provided "9-Axis Sensor Fusion
2405895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Application Note" document provided.
2406895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2407895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or
2408895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          MLDmpPedometerStandAloneOpen() \endif
2409895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpStart() must <b>NOT</b> have been called.
2410895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2411895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data        A pointer to an array to be copied from the user.
2412895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2413895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if successful; a non-zero error code otherwise.
2414895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
2415895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_set_gyro_bias_float(float *data)
2416895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
2417895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    long arrayTmp[3];
2418895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    arrayTmp[0] = (long)(data[0] * 65536.f);
2419895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    arrayTmp[1] = (long)(data[1] * 65536.f);
2420895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    arrayTmp[2] = (long)(data[2] * 65536.f);
2421895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return inv_set_gyro_bias(arrayTmp);
2422895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2423895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
2424895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2425895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
2426895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_set_accel_bias_float is used to set the accelerometer bias.
2427895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The argument array elements are ordered X,Y,Z.
2428895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The values are in units of g (gravity).
2429895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2430895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Please refer to the provided "9-Axis Sensor Fusion
2431895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Application Note" document provided.
2432895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2433895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or
2434895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          MLDmpPedometerStandAloneOpen() \endif
2435895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpStart() must <b>NOT</b> have been called.
2436895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2437895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data        A pointer to an array to be copied from the user.
2438895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2439895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if successful; a non-zero error code otherwise.
2440895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
2441895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_set_accel_bias_float(float *data)
2442895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
2443895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    long arrayTmp[3];
2444895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    arrayTmp[0] = (long)(data[0] * 65536.f);
2445895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    arrayTmp[1] = (long)(data[1] * 65536.f);
2446895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    arrayTmp[2] = (long)(data[2] * 65536.f);
2447895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return inv_set_accel_bias(arrayTmp);
2448895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2449895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
2450895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2451895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
2452895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @cond MPL
2453895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_set_mag_bias_float is used to set compass bias
2454895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2455895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Please refer to the provided "9-Axis Sensor Fusion
2456895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Application Note" document provided.
2457895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2458895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen()\ifnot UMPL or
2459895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          MLDmpPedometerStandAloneOpen() \endif
2460895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpStart() must <b>NOT</b> have been called.
2461895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2462895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data        A pointer to an array to be copied from the user.
2463895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2464895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if successful; a non-zero error code otherwise.
2465895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @endcond
2466895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
2467895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_set_mag_bias_float(float *data)
2468895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
2469895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    long arrayTmp[3];
2470895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    arrayTmp[0] = (long)(data[0] * 65536.f);
2471895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    arrayTmp[1] = (long)(data[1] * 65536.f);
2472895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    arrayTmp[2] = (long)(data[2] * 65536.f);
2473895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return inv_set_mag_bias(arrayTmp);
2474895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
2475895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2476895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
2477895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @cond MPL
2478895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_set_local_field_float is used to set local magnetic field
2479895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2480895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Please refer to the provided "9-Axis Sensor Fusion
2481895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Application Note" document provided.
2482895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2483895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or
2484895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          MLDmpPedometerStandAloneOpen() \endif
2485895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpStart() must <b>NOT</b> have been called.
2486895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2487895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data        A pointer to an array to be copied from the user.
2488895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2489895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if successful; a non-zero error code otherwise.
2490895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @endcond
2491895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
2492895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_set_local_field_float(float *data)
2493895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
2494895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    long arrayTmp[3];
2495895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    arrayTmp[0] = (long)(data[0] * 65536.f);
2496895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    arrayTmp[1] = (long)(data[1] * 65536.f);
2497895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    arrayTmp[2] = (long)(data[2] * 65536.f);
2498895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return inv_set_local_field(arrayTmp);
2499895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
2500895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
2501895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
2502895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @cond MPL
2503895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_set_mag_scale_float is used to set magnetometer scale
2504895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2505895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Please refer to the provided "9-Axis Sensor Fusion
2506895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Application Note" document provided.
2507895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2508895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() \ifnot UMPL or
2509895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          MLDmpPedometerStandAloneOpen() \endif
2510895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpStart() must <b>NOT</b> have been called.
2511895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2512895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data        A pointer to an array to be copied from the user.
2513895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
2514895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if successful; a non-zero error code otherwise.
2515895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @endcond
2516895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
2517895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_set_mag_scale_float(float *data)
2518895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
2519895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    long arrayTmp[3];
2520895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    arrayTmp[0] = (long)(data[0] * 65536.f);
2521895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    arrayTmp[1] = (long)(data[1] * 65536.f);
2522895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    arrayTmp[2] = (long)(data[2] * 65536.f);
2523895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return inv_set_mag_scale(arrayTmp);
2524895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
2525