| /* |
| $License: |
| Copyright 2011 InvenSense, Inc. |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| $ |
| */ |
| /****************************************************************************** |
| * |
| * $Id: mlarray_legacy.c $ |
| * |
| *****************************************************************************/ |
| |
| /** |
| * @defgroup MLArray_Legacy |
| * @brief Legacy Motion Library Array APIs. |
| * The Motion Library Array APIs provide the user access to the |
| * Motion Library state. These Legacy APIs provide access to |
| * individual state arrays using a data set name as the first |
| * argument to the API. This format has been replaced by unique |
| * named APIs for each data set, found in the MLArray group. |
| * |
| * @{ |
| * @file mlarray_legacy.c |
| * @brief The Legacy Motion Library Array APIs. |
| */ |
| |
| #include "ml.h" |
| #include "mltypes.h" |
| #include "mlinclude.h" |
| #include "mlFIFO.h" |
| #include "mldl_cfg.h" |
| |
| /** |
| * @brief inv_get_array is used to get an array of processed motion sensor data. |
| * inv_get_array can be used to retrieve various data sets. Certain data |
| * sets require functions to be enabled using MLEnable in order to be |
| * valid. |
| * |
| * The available data sets are: |
| * |
| * - INV_ROTATION_MATRIX |
| * - INV_QUATERNION |
| * - INV_EULER_ANGLES_X |
| * - INV_EULER_ANGLES_Y |
| * - INV_EULER_ANGLES_Z |
| * - INV_EULER_ANGLES |
| * - INV_LINEAR_ACCELERATION |
| * - INV_LINEAR_ACCELERATION_WORLD |
| * - INV_GRAVITY |
| * - INV_ANGULAR_VELOCITY |
| * - INV_RAW_DATA |
| * - INV_GYROS |
| * - INV_ACCELS |
| * - INV_MAGNETOMETER |
| * - INV_GYRO_BIAS |
| * - INV_ACCEL_BIAS |
| * - INV_MAG_BIAS |
| * - INV_HEADING |
| * - INV_MAG_BIAS_ERROR |
| * - INV_PRESSURE |
| * |
| * Please refer to the documentation of inv_get_float_array() for a |
| * description of these data sets. |
| * |
| * @pre MLDmpOpen() or MLDmpPedometerStandAloneOpen() |
| * must have been called. |
| * |
| * @param dataSet |
| * A constant specifying an array of data processed by the |
| * motion processor. |
| * @param data |
| * A pointer to an array to be passed back to the user. |
| * <b>Must be 9 cells long at least</b>. |
| * |
| * @return Zero if the command is successful; an ML error code otherwise. |
| */ |
| inv_error_t inv_get_array(int dataSet, long *data) |
| { |
| inv_error_t result; |
| switch (dataSet) { |
| case INV_GYROS: |
| result = inv_get_gyro(data); |
| break; |
| case INV_ACCELS: |
| result = inv_get_accel(data); |
| break; |
| case INV_TEMPERATURE: |
| result = inv_get_temperature(data); |
| break; |
| case INV_ROTATION_MATRIX: |
| result = inv_get_rot_mat(data); |
| break; |
| case INV_QUATERNION: |
| result = inv_get_quaternion(data); |
| break; |
| case INV_LINEAR_ACCELERATION: |
| result = inv_get_linear_accel(data); |
| break; |
| case INV_LINEAR_ACCELERATION_WORLD: |
| result = inv_get_linear_accel_in_world(data); |
| break; |
| case INV_GRAVITY: |
| result = inv_get_gravity(data); |
| break; |
| case INV_ANGULAR_VELOCITY: |
| result = inv_get_angular_velocity(data); |
| break; |
| case INV_EULER_ANGLES: |
| result = inv_get_euler_angles(data); |
| break; |
| case INV_EULER_ANGLES_X: |
| result = inv_get_euler_angles_x(data); |
| break; |
| case INV_EULER_ANGLES_Y: |
| result = inv_get_euler_angles_y(data); |
| break; |
| case INV_EULER_ANGLES_Z: |
| result = inv_get_euler_angles_z(data); |
| break; |
| case INV_GYRO_TEMP_SLOPE: |
| result = inv_get_gyro_temp_slope(data); |
| break; |
| case INV_GYRO_BIAS: |
| result = inv_get_gyro_bias(data); |
| break; |
| case INV_ACCEL_BIAS: |
| result = inv_get_accel_bias(data); |
| break; |
| case INV_MAG_BIAS: |
| result = inv_get_mag_bias(data); |
| break; |
| case INV_RAW_DATA: |
| result = inv_get_gyro_and_accel_sensor(data); |
| break; |
| case INV_MAG_RAW_DATA: |
| result = inv_get_mag_raw_data(data); |
| break; |
| case INV_MAGNETOMETER: |
| result = inv_get_magnetometer(data); |
| break; |
| case INV_PRESSURE: |
| result = inv_get_pressure(data); |
| break; |
| case INV_HEADING: |
| result = inv_get_heading(data); |
| break; |
| case INV_GYRO_CALIBRATION_MATRIX: |
| result = inv_get_gyro_cal_matrix(data); |
| break; |
| case INV_ACCEL_CALIBRATION_MATRIX: |
| result = inv_get_accel_cal_matrix(data); |
| break; |
| case INV_MAG_CALIBRATION_MATRIX: |
| result = inv_get_mag_cal_matrix(data); |
| break; |
| case INV_MAG_BIAS_ERROR: |
| result = inv_get_mag_bias_error(data); |
| break; |
| case INV_MAG_SCALE: |
| result = inv_get_mag_scale(data); |
| break; |
| case INV_LOCAL_FIELD: |
| result = inv_get_local_field(data); |
| break; |
| case INV_RELATIVE_QUATERNION: |
| result = inv_get_relative_quaternion(data); |
| break; |
| default: |
| return INV_ERROR_INVALID_PARAMETER; |
| break; |
| } |
| return result; |
| } |
| |
| /** |
| * @brief inv_get_float_array is used to get an array of processed motion sensor |
| * data. inv_get_array can be used to retrieve various data sets. |
| * Certain data sets require functions to be enabled using MLEnable |
| * in order to be valid. |
| * |
| * The available data sets are: |
| * |
| * - INV_ROTATION_MATRIX : |
| * Returns an array of nine data points representing the rotation |
| * matrix generated from all available sensors. |
| * This requires that ML_SENSOR_FUSION be enabled. |
| * The array format will be R11, R12, R13, R21, R22, R23, R31, R32, |
| * R33, representing the matrix: |
| * <center>R11 R12 R13</center> |
| * <center>R21 R22 R23</center> |
| * <center>R31 R32 R33</center> |
| * <b>Please refer to the "9-Axis Sensor Fusion Application Note" document, |
| * section 7 "Sensor Fusion Output", for details regarding rotation |
| * matrix output</b>. |
| * |
| * - INV_QUATERNION : |
| * Returns an array of four data points representing the quaternion |
| * generated from all available sensors. |
| * This requires that ML_SENSOR_FUSION be enabled. |
| * |
| * - INV_EULER_ANGLES_X : |
| * Returns an array of three data points representing roll, pitch, and |
| * yaw using the X axis of the gyroscope, accelerometer, and compass as |
| * reference axis. |
| * This is typically the convention used for mobile devices where the X |
| * axis is the width of the screen, Y axis is the height, and Z the |
| * depth. In this case roll is defined as the rotation around the X |
| * axis of the device. |
| * The euler angles convention for this output is the following: |
| * <TABLE> |
| * <TR><TD><b>EULER ANGLE</b></TD><TD><b>ROTATION AROUND</b></TD></TR> |
| * <TR><TD>roll </TD><TD>X axis </TD></TR> |
| * <TR><TD>pitch </TD><TD>Y axis </TD></TR> |
| * <TR><TD>yaw </TD><TD>Z axis </TD></TR> |
| * </TABLE> |
| * INV_EULER_ANGLES_X corresponds to the INV_EULER_ANGLES output and is |
| * therefore the default convention. |
| * |
| * - INV_EULER_ANGLES_Y : |
| * Returns an array of three data points representing roll, pitch, and |
| * yaw using the Y axis of the gyroscope, accelerometer, and compass as |
| * reference axis. |
| * This convention is typically used in augmented reality applications, |
| * where roll is defined as the rotation around the axis along the |
| * height of the screen of a mobile device, namely the Y axis. |
| * The euler angles convention for this output is the following: |
| * <TABLE> |
| * <TR><TD><b>EULER ANGLE</b></TD><TD><b>ROTATION AROUND</b></TD></TR> |
| * <TR><TD>roll </TD><TD>Y axis </TD></TR> |
| * <TR><TD>pitch </TD><TD>X axis </TD></TR> |
| * <TR><TD>yaw </TD><TD>Z axis </TD></TR> |
| * </TABLE> |
| * |
| * - INV_EULER_ANGLES_Z : |
| * Returns an array of three data points representing roll, pitch, and |
| * yaw using the Z axis of the gyroscope, accelerometer, and compass as |
| * reference axis. |
| * This convention is mostly used in application involving the use |
| * of a camera, typically placed on the back of a mobile device, that |
| * is along the Z axis. In this convention roll is defined as the |
| * rotation around the Z axis. |
| * The euler angles convention for this output is the following: |
| * <TABLE> |
| * <TR><TD><b>EULER ANGLE</b></TD><TD><b>ROTATION AROUND</b></TD></TR> |
| * <TR><TD>roll </TD><TD>Z axis </TD></TR> |
| * <TR><TD>pitch </TD><TD>X axis </TD></TR> |
| * <TR><TD>yaw </TD><TD>Y axis </TD></TR> |
| * </TABLE> |
| * |
| * - INV_EULER_ANGLES : |
| * Returns an array of three data points representing roll, pitch, and |
| * yaw corresponding to the INV_EULER_ANGLES_X output and it is |
| * therefore the default convention for Euler angles. |
| * Please refer to the INV_EULER_ANGLES_X for a detailed description. |
| * |
| * - INV_LINEAR_ACCELERATION : |
| * Returns an array of three data points representing the linear |
| * acceleration as derived from both gyroscopes and accelerometers. |
| * This requires that ML_SENSOR_FUSION be enabled. |
| * |
| * - INV_LINEAR_ACCELERATION_WORLD : |
| * Returns an array of three data points representing the linear |
| * acceleration in world coordinates, as derived from both gyroscopes |
| * and accelerometers. |
| * This requires that ML_SENSOR_FUSION be enabled. |
| * |
| * - INV_GRAVITY : |
| * Returns an array of three data points representing the direction |
| * of gravity in body coordinates, as derived from both gyroscopes |
| * and accelerometers. |
| * This requires that ML_SENSOR_FUSION be enabled. |
| * |
| * - INV_ANGULAR_VELOCITY : |
| * Returns an array of three data points representing the angular |
| * velocity as derived from <b>both</b> gyroscopes and accelerometers. |
| * This requires that ML_SENSOR_FUSION be enabled, to fuse data from |
| * the gyroscope and accelerometer device, appropriately scaled and |
| * oriented according to the respective mounting matrices. |
| * |
| * - INV_RAW_DATA : |
| * Returns an array of nine data points representing raw sensor data |
| * of the gyroscope X, Y, Z, accelerometer X, Y, Z, and |
| * compass X, Y, Z values. |
| * These values are not scaled and come out directly from the devices' |
| * sensor data output. In case of accelerometers with lower output |
| * resolution, e.g 8-bit, the sensor data is scaled up to match the |
| * 2^14 = 1 gee typical representation for a +/- 2 gee full scale |
| * range. |
| * |
| * - INV_GYROS : |
| * Returns an array of three data points representing the X gyroscope, |
| * Y gyroscope, and Z gyroscope values. |
| * The values are not sensor fused with other sensor types data but |
| * reflect the orientation from the mounting matrices in use. |
| * The INV_GYROS values are scaled to ensure 1 dps corresponds to 2^16 |
| * codes. |
| * |
| * - INV_ACCELS : |
| * Returns an array of three data points representing the X |
| * accelerometer, Y accelerometer, and Z accelerometer values. |
| * The values are not sensor fused with other sensor types data but |
| * reflect the orientation from the mounting matrices in use. |
| * The INV_ACCELS values are scaled to ensure 1 gee corresponds to 2^16 |
| * codes. |
| * |
| * - INV_MAGNETOMETER : |
| * Returns an array of three data points representing the compass |
| * X, Y, and Z values. |
| * The values are not sensor fused with other sensor types data but |
| * reflect the orientation from the mounting matrices in use. |
| * The INV_MAGNETOMETER values are scaled to ensure 1 micro Tesla (uT) |
| * corresponds to 2^16 codes. |
| * |
| * - INV_GYRO_BIAS : |
| * Returns an array of three data points representing the gyroscope |
| * biases. |
| * |
| * - INV_ACCEL_BIAS : |
| * Returns an array of three data points representing the |
| * accelerometer biases. |
| * |
| * - INV_MAG_BIAS : |
| * Returns an array of three data points representing the compass |
| * biases. |
| * |
| * - INV_GYRO_CALIBRATION_MATRIX : |
| * Returns an array of nine data points representing the calibration |
| * matrix for the gyroscopes: |
| * <center>C11 C12 C13</center> |
| * <center>C21 C22 C23</center> |
| * <center>C31 C32 C33</center> |
| * |
| * - INV_ACCEL_CALIBRATION_MATRIX : |
| * Returns an array of nine data points representing the calibration |
| * matrix for the accelerometers: |
| * <center>C11 C12 C13</center> |
| * <center>C21 C22 C23</center> |
| * <center>C31 C32 C33</center> |
| * |
| * - INV_MAG_CALIBRATION_MATRIX : |
| * Returns an array of nine data points representing the calibration |
| * matrix for the compass: |
| * <center>C11 C12 C13</center> |
| * <center>C21 C22 C23</center> |
| * <center>C31 C32 C33</center> |
| * |
| * - INV_PRESSURE : |
| * Returns a single value representing the pressure in Pascal |
| * |
| * - INV_HEADING : |
| * Returns a single number representing the heading of the device |
| * relative to the Earth, in which 0 represents North, 90 degrees |
| * represents East, and so on. |
| * The heading is defined as the direction of the +Y axis if the Y |
| * axis is horizontal, and otherwise the direction of the -Z axis. |
| * |
| * - INV_MAG_BIAS_ERROR : |
| * Returns an array of three numbers representing the current estimated |
| * error in the compass biases. These numbers are unitless and serve |
| * as rough estimates in which numbers less than 100 typically represent |
| * reasonably well calibrated compass axes. |
| * |
| * @pre MLDmpOpen() or MLDmpPedometerStandAloneOpen() |
| * must have been called. |
| * |
| * @param dataSet |
| * A constant specifying an array of data processed by |
| * the motion processor. |
| * @param data |
| * A pointer to an array to be passed back to the user. |
| * <b>Must be 9 cells long at least</b>. |
| * |
| * @return INV_SUCCESS if the command is successful; an error code otherwise. |
| */ |
| inv_error_t inv_get_float_array(int dataSet, float *data) |
| { |
| inv_error_t result; |
| switch (dataSet) { |
| case INV_GYROS: |
| result = inv_get_gyro_float(data); |
| break; |
| case INV_ACCELS: |
| result = inv_get_accel_float(data); |
| break; |
| case INV_TEMPERATURE: |
| result = inv_get_temperature_float(data); |
| break; |
| case INV_ROTATION_MATRIX: |
| result = inv_get_rot_mat_float(data); |
| break; |
| case INV_QUATERNION: |
| result = inv_get_quaternion_float(data); |
| break; |
| case INV_LINEAR_ACCELERATION: |
| result = inv_get_linear_accel_float(data); |
| break; |
| case INV_LINEAR_ACCELERATION_WORLD: |
| result = inv_get_linear_accel_in_world_float(data); |
| break; |
| case INV_GRAVITY: |
| result = inv_get_gravity_float(data); |
| break; |
| case INV_ANGULAR_VELOCITY: |
| result = inv_get_angular_velocity_float(data); |
| break; |
| case INV_EULER_ANGLES: |
| result = inv_get_euler_angles_float(data); |
| break; |
| case INV_EULER_ANGLES_X: |
| result = inv_get_euler_angles_x_float(data); |
| break; |
| case INV_EULER_ANGLES_Y: |
| result = inv_get_euler_angles_y_float(data); |
| break; |
| case INV_EULER_ANGLES_Z: |
| result = inv_get_euler_angles_z_float(data); |
| break; |
| case INV_GYRO_TEMP_SLOPE: |
| result = inv_get_gyro_temp_slope_float(data); |
| break; |
| case INV_GYRO_BIAS: |
| result = inv_get_gyro_bias_float(data); |
| break; |
| case INV_ACCEL_BIAS: |
| result = inv_get_accel_bias_float(data); |
| break; |
| case INV_MAG_BIAS: |
| result = inv_get_mag_bias_float(data); |
| break; |
| case INV_RAW_DATA: |
| result = inv_get_gyro_and_accel_sensor_float(data); |
| break; |
| case INV_MAG_RAW_DATA: |
| result = inv_get_mag_raw_data_float(data); |
| break; |
| case INV_MAGNETOMETER: |
| result = inv_get_magnetometer_float(data); |
| break; |
| case INV_PRESSURE: |
| result = inv_get_pressure_float(data); |
| break; |
| case INV_HEADING: |
| result = inv_get_heading_float(data); |
| break; |
| case INV_GYRO_CALIBRATION_MATRIX: |
| result = inv_get_gyro_cal_matrix_float(data); |
| break; |
| case INV_ACCEL_CALIBRATION_MATRIX: |
| result = inv_get_accel_cal_matrix_float(data); |
| break; |
| case INV_MAG_CALIBRATION_MATRIX: |
| result = inv_get_mag_cal_matrix_float(data); |
| break; |
| case INV_MAG_BIAS_ERROR: |
| result = inv_get_mag_bias_error_float(data); |
| break; |
| case INV_MAG_SCALE: |
| result = inv_get_mag_scale_float(data); |
| break; |
| case INV_LOCAL_FIELD: |
| result = inv_get_local_field_float(data); |
| break; |
| case INV_RELATIVE_QUATERNION: |
| result = inv_get_relative_quaternion_float(data); |
| break; |
| default: |
| return INV_ERROR_INVALID_PARAMETER; |
| break; |
| } |
| return result; |
| } |
| |
| /** |
| * @brief used to set an array of motion sensor data. |
| * Handles the following data sets: |
| * - INV_GYRO_BIAS |
| * - INV_ACCEL_BIAS |
| * - INV_MAG_BIAS |
| * - INV_GYRO_TEMP_SLOPE |
| * |
| * For more details about the use of the data sets |
| * please refer to the documentation of inv_set_float_array(). |
| * |
| * Please also refer to the provided "9-Axis Sensor Fusion |
| * Application Note" document provided. |
| * |
| * @pre MLDmpOpen() or |
| * MLDmpPedometerStandAloneOpen() |
| * @pre MLDmpStart() must <b>NOT</b> have been called. |
| * |
| * @param dataSet A constant specifying an array of data. |
| * @param data A pointer to an array to be copied from the user. |
| * |
| * @return INV_SUCCESS if successful; a non-zero error code otherwise. |
| */ |
| inv_error_t inv_set_array(int dataSet, long *data) |
| { |
| INVENSENSE_FUNC_START; |
| inv_error_t result; |
| switch (dataSet) { |
| case INV_GYRO_BIAS: |
| result = inv_set_gyro_bias(data); |
| break; |
| case INV_ACCEL_BIAS: |
| result = inv_set_accel_bias(data); |
| break; |
| case INV_MAG_BIAS: |
| result = inv_set_mag_bias(data); |
| break; |
| case INV_GYRO_TEMP_SLOPE: |
| result = inv_set_gyro_temp_slope(data); |
| break; |
| case INV_LOCAL_FIELD: |
| result = inv_set_local_field(data); |
| break; |
| case INV_MAG_SCALE: |
| result = inv_set_mag_scale(data); |
| break; |
| default: |
| return INV_ERROR_INVALID_PARAMETER; |
| break; |
| } |
| return result; |
| } |
| |
| /** |
| * @brief used to set an array of motion sensor data. |
| * Handles various data sets: |
| * - INV_GYRO_BIAS |
| * - INV_ACCEL_BIAS |
| * - INV_MAG_BIAS |
| * - INV_GYRO_TEMP_SLOPE |
| * |
| * Please refer to the provided "9-Axis Sensor Fusion Application |
| * Note" document provided. |
| * |
| * @pre MLDmpOpen() or |
| * MLDmpPedometerStandAloneOpen() |
| * @pre MLDmpStart() must <b>NOT</b> have been called. |
| * |
| * @param dataSet A constant specifying an array of data. |
| * @param data A pointer to an array to be copied from the user. |
| * |
| * @return INV_SUCCESS if successful; a non-zero error code otherwise. |
| */ |
| inv_error_t inv_set_float_array(int dataSet, float *data) |
| { |
| INVENSENSE_FUNC_START; |
| inv_error_t result; |
| |
| switch (dataSet) { |
| case INV_GYRO_TEMP_SLOPE: // internal |
| result = inv_set_gyro_temp_slope_float(data); |
| break; |
| case INV_GYRO_BIAS: // internal |
| result = inv_set_gyro_bias_float(data); |
| break; |
| case INV_ACCEL_BIAS: // internal |
| result = inv_set_accel_bias_float(data); |
| break; |
| case INV_MAG_BIAS: // internal |
| result = inv_set_mag_bias_float(data); |
| break; |
| case INV_LOCAL_FIELD: // internal |
| result = inv_set_local_field_float(data); |
| break; |
| case INV_MAG_SCALE: // internal |
| result = inv_set_mag_scale_float(data); |
| break; |
| default: |
| result = INV_ERROR_INVALID_PARAMETER; |
| break; |
| } |
| |
| return result; |
| } |