summaryrefslogtreecommitdiffstats
path: root/libsensors/mlsdk/mllite/mlarray_legacy.c
diff options
context:
space:
mode:
Diffstat (limited to 'libsensors/mlsdk/mllite/mlarray_legacy.c')
-rw-r--r--libsensors/mlsdk/mllite/mlarray_legacy.c587
1 files changed, 587 insertions, 0 deletions
diff --git a/libsensors/mlsdk/mllite/mlarray_legacy.c b/libsensors/mlsdk/mllite/mlarray_legacy.c
new file mode 100644
index 0000000..20d9116
--- /dev/null
+++ b/libsensors/mlsdk/mllite/mlarray_legacy.c
@@ -0,0 +1,587 @@
+/*
+ $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;
+}