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_legacy.c $
21895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
22895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *****************************************************************************/
23895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
24895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
25895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @defgroup MLArray_Legacy
26895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  Legacy Motion Library Array APIs.
27895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The Motion Library Array APIs provide the user access to the
28895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Motion Library state. These Legacy APIs provide access to
29895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          individual state arrays using a data set name as the first
30895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          argument to the API. This format has been replaced by unique
31895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          named APIs for each data set, found in the MLArray group.
32895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
33895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @{
34895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *      @file   mlarray_legacy.c
35895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *      @brief  The Legacy Motion Library Array APIs.
36895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
37895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
38895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "ml.h"
39895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mltypes.h"
40895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mlinclude.h"
41895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mlFIFO.h"
42895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mldl_cfg.h"
43895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
44895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
45895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_array is used to get an array of processed motion sensor data.
46895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          inv_get_array can be used to retrieve various data sets. Certain data
47895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          sets require functions to be enabled using MLEnable in order to be
48895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          valid.
49895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
50895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The available data sets are:
51895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
52895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_ROTATION_MATRIX
53895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_QUATERNION
54895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_EULER_ANGLES_X
55895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_EULER_ANGLES_Y
56895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_EULER_ANGLES_Z
57895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_EULER_ANGLES
58895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_LINEAR_ACCELERATION
59895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_LINEAR_ACCELERATION_WORLD
60895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_GRAVITY
61895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_ANGULAR_VELOCITY
62895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_RAW_DATA
63895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_GYROS
64895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_ACCELS
65895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_MAGNETOMETER
66895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_GYRO_BIAS
67895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_ACCEL_BIAS
68895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_MAG_BIAS
69895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_HEADING
70895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_MAG_BIAS_ERROR
71895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_PRESSURE
72895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
73895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Please refer to the documentation of inv_get_float_array() for a
74895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          description of these data sets.
75895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
76895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() or MLDmpPedometerStandAloneOpen()
77895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
78895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
79895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  dataSet
80895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A constant specifying an array of data processed by the
81895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              motion processor.
82895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
83895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
84895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 9 cells long at least</b>.
85895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
86895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return Zero if the command is successful; an ML error code otherwise.
87895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
88895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_array(int dataSet, long *data)
89895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
90895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result;
91895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    switch (dataSet) {
92895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_GYROS:
93895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_gyro(data);
94895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
95895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_ACCELS:
96895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_accel(data);
97895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
98895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_TEMPERATURE:
99895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_temperature(data);
100895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
101895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_ROTATION_MATRIX:
102895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_rot_mat(data);
103895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
104895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_QUATERNION:
105895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_quaternion(data);
106895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
107895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_LINEAR_ACCELERATION:
108895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_linear_accel(data);
109895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
110895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_LINEAR_ACCELERATION_WORLD:
111895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_linear_accel_in_world(data);
112895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
113895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_GRAVITY:
114895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_gravity(data);
115895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
116895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_ANGULAR_VELOCITY:
117895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_angular_velocity(data);
118895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
119895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_EULER_ANGLES:
120895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_euler_angles(data);
121895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
122895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_EULER_ANGLES_X:
123895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_euler_angles_x(data);
124895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
125895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_EULER_ANGLES_Y:
126895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_euler_angles_y(data);
127895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
128895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_EULER_ANGLES_Z:
129895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_euler_angles_z(data);
130895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
131895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_GYRO_TEMP_SLOPE:
132895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_gyro_temp_slope(data);
133895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
134895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_GYRO_BIAS:
135895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_gyro_bias(data);
136895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
137895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_ACCEL_BIAS:
138895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_accel_bias(data);
139895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
140895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_MAG_BIAS:
141895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_mag_bias(data);
142895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
143895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_RAW_DATA:
144895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_gyro_and_accel_sensor(data);
145895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
146895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_MAG_RAW_DATA:
147895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_mag_raw_data(data);
148895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
149895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_MAGNETOMETER:
150895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_magnetometer(data);
151895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
152895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_PRESSURE:
153895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_pressure(data);
154895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
155895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_HEADING:
156895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_heading(data);
157895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
158895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_GYRO_CALIBRATION_MATRIX:
159895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_gyro_cal_matrix(data);
160895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
161895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_ACCEL_CALIBRATION_MATRIX:
162895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_accel_cal_matrix(data);
163895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
164895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_MAG_CALIBRATION_MATRIX:
165895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_mag_cal_matrix(data);
166895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
167895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_MAG_BIAS_ERROR:
168895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_mag_bias_error(data);
169895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
170895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_MAG_SCALE:
171895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_mag_scale(data);
172895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
173895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_LOCAL_FIELD:
174895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_local_field(data);
175895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
176895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_RELATIVE_QUATERNION:
177895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_relative_quaternion(data);
178895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
179895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    default:
180895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
181895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
182895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
183895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
184895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
185895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
186895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
187895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  inv_get_float_array is used to get an array of processed motion sensor
188895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          data. inv_get_array can be used to retrieve various data sets.
189895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Certain data sets require functions to be enabled using MLEnable
190895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          in order to be valid.
191895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
192895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The available data sets are:
193895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
194895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_ROTATION_MATRIX :
195895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Returns an array of nine data points representing the rotation
196895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          matrix generated from all available sensors.
197895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          This requires that ML_SENSOR_FUSION be enabled.
198895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The array format will be R11, R12, R13, R21, R22, R23, R31, R32,
199895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          R33, representing the matrix:
200895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <center>R11 R12 R13</center>
201895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <center>R21 R22 R23</center>
202895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <center>R31 R32 R33</center>
203895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <b>Please refer to the "9-Axis Sensor Fusion Application Note" document,
204895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          section 7 "Sensor Fusion Output", for details regarding rotation
205895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          matrix output</b>.
206895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
207895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_QUATERNION :
208895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Returns an array of four data points representing the quaternion
209895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          generated from all available sensors.
210895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          This requires that ML_SENSOR_FUSION be enabled.
211895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
212895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_EULER_ANGLES_X :
213895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Returns an array of three data points representing roll, pitch, and
214895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          yaw using the X axis of the gyroscope, accelerometer, and compass as
215895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          reference axis.
216895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          This is typically the convention used for mobile devices where the X
217895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          axis is the width of the screen, Y axis is the height, and Z the
218895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          depth. In this case roll is defined as the rotation around the X
219895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          axis of the device.
220895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The euler angles convention for this output is the following:
221895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TABLE>
222895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD><b>EULER ANGLE</b></TD><TD><b>ROTATION AROUND</b></TD></TR>
223895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD>roll              </TD><TD>X axis                </TD></TR>
224895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD>pitch             </TD><TD>Y axis                </TD></TR>
225895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD>yaw               </TD><TD>Z axis                </TD></TR>
226895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          </TABLE>
227895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          INV_EULER_ANGLES_X corresponds to the INV_EULER_ANGLES output and is
228895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          therefore the default convention.
229895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
230895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_EULER_ANGLES_Y :
231895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Returns an array of three data points representing roll, pitch, and
232895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          yaw using the Y axis of the gyroscope, accelerometer, and compass as
233895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          reference axis.
234895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          This convention is typically used in augmented reality applications,
235895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          where roll is defined as the rotation around the axis along the
236895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          height of the screen of a mobile device, namely the Y axis.
237895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The euler angles convention for this output is the following:
238895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TABLE>
239895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD><b>EULER ANGLE</b></TD><TD><b>ROTATION AROUND</b></TD></TR>
240895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD>roll              </TD><TD>Y axis                </TD></TR>
241895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD>pitch             </TD><TD>X axis                </TD></TR>
242895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD>yaw               </TD><TD>Z axis                </TD></TR>
243895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          </TABLE>
244895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
245895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_EULER_ANGLES_Z :
246895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Returns an array of three data points representing roll, pitch, and
247895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          yaw using the Z axis of the gyroscope, accelerometer, and compass as
248895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          reference axis.
249895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          This convention is mostly used in application involving the use
250895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          of a camera, typically placed on the back of a mobile device, that
251895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          is along the Z axis.  In this convention roll is defined as the
252895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          rotation around the Z axis.
253895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The euler angles convention for this output is the following:
254895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TABLE>
255895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD><b>EULER ANGLE</b></TD><TD><b>ROTATION AROUND</b></TD></TR>
256895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD>roll              </TD><TD>Z axis                </TD></TR>
257895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD>pitch             </TD><TD>X axis                </TD></TR>
258895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <TR><TD>yaw               </TD><TD>Y axis                </TD></TR>
259895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          </TABLE>
260895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
261895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_EULER_ANGLES :
262895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Returns an array of three data points representing roll, pitch, and
263895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          yaw corresponding to the INV_EULER_ANGLES_X output and it is
264895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          therefore the default convention for Euler angles.
265895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Please refer to the INV_EULER_ANGLES_X for a detailed description.
266895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
267895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_LINEAR_ACCELERATION :
268895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Returns an array of three data points representing the linear
269895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          acceleration as derived from both gyroscopes and accelerometers.
270895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          This requires that ML_SENSOR_FUSION be enabled.
271895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
272895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_LINEAR_ACCELERATION_WORLD :
273895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Returns an array of three data points representing the linear
274895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          acceleration in world coordinates, as derived from both gyroscopes
275895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          and accelerometers.
276895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          This requires that ML_SENSOR_FUSION be enabled.
277895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
278895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_GRAVITY :
279895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Returns an array of three data points representing the direction
280895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          of gravity in body coordinates, as derived from both gyroscopes
281895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          and accelerometers.
282895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          This requires that ML_SENSOR_FUSION be enabled.
283895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
284895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_ANGULAR_VELOCITY :
285895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Returns an array of three data points representing the angular
286895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          velocity as derived from <b>both</b> gyroscopes and accelerometers.
287895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          This requires that ML_SENSOR_FUSION be enabled, to fuse data from
288895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          the gyroscope and accelerometer device, appropriately scaled and
289895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          oriented according to the respective mounting matrices.
290895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
291895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_RAW_DATA :
292895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Returns an array of nine data points representing raw sensor data
293895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          of the gyroscope X, Y, Z, accelerometer X, Y, Z, and
294895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          compass X, Y, Z values.
295895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          These values are not scaled and come out directly from the devices'
296895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          sensor data output. In case of accelerometers with lower output
297895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          resolution, e.g 8-bit, the sensor data is scaled up to match the
298895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          2^14 = 1 gee typical representation for a +/- 2 gee full scale
299895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          range.
300895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
301895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_GYROS :
302895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Returns an array of three data points representing the X gyroscope,
303895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Y gyroscope, and Z gyroscope values.
304895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The values are not sensor fused with other sensor types data but
305895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          reflect the orientation from the mounting matrices in use.
306895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The INV_GYROS values are scaled to ensure 1 dps corresponds to 2^16
307895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          codes.
308895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
309895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_ACCELS :
310895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Returns an array of three data points representing the X
311895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          accelerometer, Y accelerometer, and Z accelerometer values.
312895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The values are not sensor fused with other sensor types data but
313895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          reflect the orientation from the mounting matrices in use.
314895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The INV_ACCELS values are scaled to ensure 1 gee corresponds to 2^16
315895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          codes.
316895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
317895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_MAGNETOMETER :
318895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Returns an array of three data points representing the compass
319895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          X, Y, and Z values.
320895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The values are not sensor fused with other sensor types data but
321895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          reflect the orientation from the mounting matrices in use.
322895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The INV_MAGNETOMETER values are scaled to ensure 1 micro Tesla (uT)
323895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          corresponds to 2^16 codes.
324895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
325895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_GYRO_BIAS :
326895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Returns an array of three data points representing the gyroscope
327895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          biases.
328895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
329895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_ACCEL_BIAS :
330895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Returns an array of three data points representing the
331895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          accelerometer biases.
332895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
333895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_MAG_BIAS :
334895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Returns an array of three data points representing the compass
335895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          biases.
336895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
337895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_GYRO_CALIBRATION_MATRIX :
338895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Returns an array of nine data points representing the calibration
339895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          matrix for the gyroscopes:
340895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <center>C11 C12 C13</center>
341895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <center>C21 C22 C23</center>
342895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <center>C31 C32 C33</center>
343895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
344895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_ACCEL_CALIBRATION_MATRIX :
345895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Returns an array of nine data points representing the calibration
346895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          matrix for the accelerometers:
347895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <center>C11 C12 C13</center>
348895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <center>C21 C22 C23</center>
349895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <center>C31 C32 C33</center>
350895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
351895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_MAG_CALIBRATION_MATRIX :
352895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Returns an array of nine data points representing the calibration
353895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          matrix for the compass:
354895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <center>C11 C12 C13</center>
355895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <center>C21 C22 C23</center>
356895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          <center>C31 C32 C33</center>
357895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
358895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_PRESSURE :
359895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Returns a single value representing the pressure in Pascal
360895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
361895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_HEADING :
362895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Returns a single number representing the heading of the device
363895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          relative to the Earth, in which 0 represents North, 90 degrees
364895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          represents East, and so on.
365895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          The heading is defined as the direction of the +Y axis if the Y
366895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          axis is horizontal, and otherwise the direction of the -Z axis.
367895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
368895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_MAG_BIAS_ERROR :
369895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Returns an array of three numbers representing the current estimated
370895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          error in the compass biases. These numbers are unitless and serve
371895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          as rough estimates in which numbers less than 100 typically represent
372895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          reasonably well calibrated compass axes.
373895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
374895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() or MLDmpPedometerStandAloneOpen()
375895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          must have been called.
376895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
377895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  dataSet
378895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A constant specifying an array of data processed by
379895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              the motion processor.
380895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data
381895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              A pointer to an array to be passed back to the user.
382895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *              <b>Must be 9 cells long at least</b>.
383895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
384895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if the command is successful; an error code otherwise.
385895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
386895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_get_float_array(int dataSet, float *data)
387895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
388895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result;
389895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    switch (dataSet) {
390895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_GYROS:
391895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_gyro_float(data);
392895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
393895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_ACCELS:
394895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_accel_float(data);
395895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
396895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_TEMPERATURE:
397895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_temperature_float(data);
398895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
399895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_ROTATION_MATRIX:
400895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_rot_mat_float(data);
401895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
402895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_QUATERNION:
403895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_quaternion_float(data);
404895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
405895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_LINEAR_ACCELERATION:
406895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_linear_accel_float(data);
407895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
408895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_LINEAR_ACCELERATION_WORLD:
409895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_linear_accel_in_world_float(data);
410895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
411895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_GRAVITY:
412895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_gravity_float(data);
413895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
414895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_ANGULAR_VELOCITY:
415895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_angular_velocity_float(data);
416895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
417895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_EULER_ANGLES:
418895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_euler_angles_float(data);
419895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
420895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_EULER_ANGLES_X:
421895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_euler_angles_x_float(data);
422895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
423895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_EULER_ANGLES_Y:
424895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_euler_angles_y_float(data);
425895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
426895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_EULER_ANGLES_Z:
427895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_euler_angles_z_float(data);
428895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
429895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_GYRO_TEMP_SLOPE:
430895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_gyro_temp_slope_float(data);
431895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
432895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_GYRO_BIAS:
433895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_gyro_bias_float(data);
434895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
435895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_ACCEL_BIAS:
436895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_accel_bias_float(data);
437895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
438895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_MAG_BIAS:
439895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_mag_bias_float(data);
440895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
441895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_RAW_DATA:
442895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_gyro_and_accel_sensor_float(data);
443895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
444895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_MAG_RAW_DATA:
445895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_mag_raw_data_float(data);
446895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
447895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_MAGNETOMETER:
448895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_magnetometer_float(data);
449895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
450895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_PRESSURE:
451895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_pressure_float(data);
452895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
453895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_HEADING:
454895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_heading_float(data);
455895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
456895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_GYRO_CALIBRATION_MATRIX:
457895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_gyro_cal_matrix_float(data);
458895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
459895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_ACCEL_CALIBRATION_MATRIX:
460895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_accel_cal_matrix_float(data);
461895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
462895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_MAG_CALIBRATION_MATRIX:
463895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_mag_cal_matrix_float(data);
464895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
465895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_MAG_BIAS_ERROR:
466895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_mag_bias_error_float(data);
467895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
468895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_MAG_SCALE:
469895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_mag_scale_float(data);
470895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
471895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_LOCAL_FIELD:
472895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_local_field_float(data);
473895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
474895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_RELATIVE_QUATERNION:
475895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_get_relative_quaternion_float(data);
476895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
477895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    default:
478895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
479895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
480895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
481895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
482895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
483895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
484895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
485895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  used to set an array of motion sensor data.
486895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Handles the following data sets:
487895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_GYRO_BIAS
488895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_ACCEL_BIAS
489895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_MAG_BIAS
490895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_GYRO_TEMP_SLOPE
491895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
492895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          For more details about the use of the data sets
493895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          please refer to the documentation of inv_set_float_array().
494895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
495895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Please also refer to the provided "9-Axis Sensor Fusion
496895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Application Note" document provided.
497895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
498895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() or
499895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          MLDmpPedometerStandAloneOpen()
500895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpStart() must <b>NOT</b> have been called.
501895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
502895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  dataSet     A constant specifying an array of data.
503895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data        A pointer to an array to be copied from the user.
504895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
505895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if successful; a non-zero error code otherwise.
506895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
507895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_set_array(int dataSet, long *data)
508895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
509895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
510895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result;
511895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    switch (dataSet) {
512895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_GYRO_BIAS:
513895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_set_gyro_bias(data);
514895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
515895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_ACCEL_BIAS:
516895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_set_accel_bias(data);
517895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
518895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_MAG_BIAS:
519895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_set_mag_bias(data);
520895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
521895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_GYRO_TEMP_SLOPE:
522895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_set_gyro_temp_slope(data);
523895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
524895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_LOCAL_FIELD:
525895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_set_local_field(data);
526895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
527895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_MAG_SCALE:
528895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_set_mag_scale(data);
529895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
530895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    default:
531895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_ERROR_INVALID_PARAMETER;
532895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
533895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
534895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
535895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
536895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
537895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
538895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  used to set an array of motion sensor data.
539895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Handles various data sets:
540895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_GYRO_BIAS
541895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_ACCEL_BIAS
542895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_MAG_BIAS
543895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          - INV_GYRO_TEMP_SLOPE
544895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
545895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Please refer to the provided "9-Axis Sensor Fusion Application
546895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Note" document provided.
547895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
548895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpOpen() or
549895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          MLDmpPedometerStandAloneOpen()
550895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    MLDmpStart() must <b>NOT</b> have been called.
551895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
552895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  dataSet     A constant specifying an array of data.
553895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @param  data        A pointer to an array to be copied from the user.
554895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
555895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if successful; a non-zero error code otherwise.
556895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
557895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_set_float_array(int dataSet, float *data)
558895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
559895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
560895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result;
561895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
562895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    switch (dataSet) {
563895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_GYRO_TEMP_SLOPE:  // internal
564895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_set_gyro_temp_slope_float(data);
565895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
566895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_GYRO_BIAS:        // internal
567895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_set_gyro_bias_float(data);
568895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
569895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_ACCEL_BIAS:       // internal
570895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_set_accel_bias_float(data);
571895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
572895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_MAG_BIAS:         // internal
573895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_set_mag_bias_float(data);
574895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
575895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_LOCAL_FIELD:      // internal
576895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_set_local_field_float(data);
577895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
578895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    case INV_MAG_SCALE:        // internal
579895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = inv_set_mag_scale_float(data);
580895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
581895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    default:
582895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        result = INV_ERROR_INVALID_PARAMETER;
583895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        break;
584895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
585895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
586895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
587895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
588