From 901b63272e2eb758fe2f4a588e6e9f308fe50f6c Mon Sep 17 00:00:00 2001 From: Scott Warner Date: Sun, 11 Oct 2015 08:30:01 -0400 Subject: Revert "Remove files for unsupported devices." This reverts commit f5f584ee173faef40f226c6e0e8580a2ecbe079b. Change-Id: I4e1b41922b5ccaac2314dac7f43df5740e2e9361 --- 60xx/mlsdk/mllite/ml.h | 596 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 596 insertions(+) create mode 100644 60xx/mlsdk/mllite/ml.h (limited to '60xx/mlsdk/mllite/ml.h') diff --git a/60xx/mlsdk/mllite/ml.h b/60xx/mlsdk/mllite/ml.h new file mode 100644 index 0000000..838cd49 --- /dev/null +++ b/60xx/mlsdk/mllite/ml.h @@ -0,0 +1,596 @@ +/* + $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: ml.h 5653 2011-06-16 21:06:55Z nroyer $ + * + *****************************************************************************/ + +/** + * @defgroup ML + * @brief The Motion Library processes gyroscopes and accelerometers to + * provide a physical model of the movement of the sensors. + * The results of this processing may be used to control objects + * within a user interface environment, detect gestures, track 3D + * movement for gaming applications, and analyze the blur created + * due to hand movement while taking a picture. + * + * @{ + * @file ml.h + * @brief Header file for the Motion Library. +**/ + +#ifndef INV_H +#define INV_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mltypes.h" +#include "mldmp.h" +#include "mlsl.h" +#include "mpu.h" +#ifdef INV_INCLUDE_LEGACY_HEADERS +#include "ml_legacy.h" +#endif + +/* ------------ */ +/* - Defines. - */ +/* ------------ */ + +/* - Module defines. - */ + +/*************************************************************************/ +/* Motion Library Vesion */ +/*************************************************************************/ + +#define INV_VERSION_MAJOR 4 +#define INV_VERSION_MINOR 0 +#define INV_VERSION_SUB_MINOR 0 + +#define INV_VERSION_MAJOR_STR "4" +#define INV_VERSION_MINOR_STR "0" +#define INV_VERSION_SUB_MINOR_STR "0" + +#define INV_VERSION_NONE "" +#define INV_VERSION_PROTOTYPE "ProtoA " +#define INV_VERSION_ENGINEERING "EngA " +#define INV_VERSION_PRE_ALPHA "Pre-Alpha " +#define INV_VERSION_ALPHA "Alpha " +#define INV_VERSION_BETA "Beta " +#define INV_VERSION_PRODUCTION "Production " + +#ifndef INV_VERSION_TYPE +#define INV_VERSION_TYPE INV_VERSION_NONE +#endif + +#define INV_VERSION "InvenSense MPL" " " \ + "v" INV_VERSION_MAJOR_STR "." INV_VERSION_MINOR_STR "." INV_VERSION_SUB_MINOR_STR " " \ + INV_VERSION_TYPE \ + __DATE__ " " __TIME__ + +/*************************************************************************/ +/* Motion processing engines */ +/*************************************************************************/ +#define INV_MOTION_DETECT (0x0004) +#define INV_BIAS_UPDATE (0x0008) +#define INV_GESTURE (0x0020) +#define INV_CONTROL (0x0040) +#define INV_ORIENTATION (0x0100) +#define INV_PEDOMETER (0x0200) +#define INV_BASIC (INV_MOTION_DETECT | INV_BIAS_UPDATE) + +/*************************************************************************/ +/* Data Source - Obsolete */ +/*************************************************************************/ +#define INV_DATA_FIFO (0x1) +#define INV_DATA_POLL (0x2) + +/*************************************************************************/ +/* Interrupt Source */ +/*************************************************************************/ +#define INV_INT_MOTION (0x01) +#define INV_INT_FIFO (0x02) +#define INV_INT_TAP (0x04) +#define INV_INT_ORIENTATION (0x08) +#define INV_INT_SHAKE_PITCH (0x10) +#define INV_INT_SHAKE_ROLL (0x20) +#define INV_INT_SHAKE_YAW (0x40) + +/*************************************************************************/ +/* Bias update functions */ +/*************************************************************************/ +#define INV_BIAS_FROM_NO_MOTION 0x0001 +#define INV_BIAS_FROM_GRAVITY 0x0002 +#define INV_BIAS_FROM_TEMPERATURE 0x0004 +#define INV_BIAS_FROM_LPF 0x0008 +#define INV_MAG_BIAS_FROM_MOTION 0x0010 +#define INV_MAG_BIAS_FROM_GYRO 0x0020 +#define INV_LEARN_BIAS_FROM_TEMPERATURE 0x0040 +#define INV_AUTO_RESET_MAG_BIAS 0x0080 +#define INV_REJECT_MAG_DISTURBANCE 0x0100 +#define INV_PROGRESSIVE_NO_MOTION 0x0200 +#define INV_BIAS_FROM_FAST_NO_MOTION 0x0400 + +/*************************************************************************/ +/* Euler angles and axis names */ +/*************************************************************************/ +#define INV_X_AXIS (0x01) +#define INV_Y_AXIS (0x02) +#define INV_Z_AXIS (0x04) + +#define INV_PITCH (INV_X_AXIS) +#define INV_ROLL (INV_Y_AXIS) +#define INV_YAW (INV_Z_AXIS) + +/*************************************************************************/ +/* Sensor types */ +/*************************************************************************/ +#define INV_GYROS 0x0001 +#define INV_ACCELS 0x0002 + +/*************************************************************************/ +/* Motion arrays */ +/*************************************************************************/ +#define INV_ROTATION_MATRIX 0x0003 +#define INV_QUATERNION 0x0004 +#define INV_EULER_ANGLES 0x0005 +#define INV_LINEAR_ACCELERATION 0x0006 +#define INV_LINEAR_ACCELERATION_WORLD 0x0007 +#define INV_GRAVITY 0x0008 +#define INV_ANGULAR_VELOCITY 0x0009 + +#define INV_GYRO_CALIBRATION_MATRIX 0x000B +#define INV_ACCEL_CALIBRATION_MATRIX 0x000C +#define INV_GYRO_BIAS 0x000D +#define INV_ACCEL_BIAS 0x000E +#define INV_GYRO_TEMP_SLOPE 0x000F + +#define INV_RAW_DATA 0x0011 +#define INV_DMP_TAP 0x0012 +#define INV_DMP_TAP2 0x0021 + +#define INV_EULER_ANGLES_X 0x0013 +#define INV_EULER_ANGLES_Y 0x0014 +#define INV_EULER_ANGLES_Z 0x0015 + +#define INV_BIAS_UNCERTAINTY 0x0016 +#define INV_DMP_PACKET_NUMBER 0x0017 +#define INV_FOOTER 0x0018 + +#define INV_CONTROL_DATA 0x0019 + +#define INV_MAGNETOMETER 0x001A +#define INV_PEDLBS 0x001B +#define INV_MAG_RAW_DATA 0x001C +#define INV_MAG_CALIBRATION_MATRIX 0x001D +#define INV_MAG_BIAS 0x001E +#define INV_HEADING 0x001F + +#define INV_MAG_BIAS_ERROR 0x0020 + +#define INV_PRESSURE 0x0021 +#define INV_LOCAL_FIELD 0x0022 +#define INV_MAG_SCALE 0x0023 + +#define INV_RELATIVE_QUATERNION 0x0024 + +#define SET_QUATERNION 0x0001 +#define SET_GYROS 0x0002 +#define SET_LINEAR_ACCELERATION 0x0004 +#define SET_GRAVITY 0x0008 +#define SET_ACCELS 0x0010 +#define SET_TAP 0x0020 +#define SET_PEDLBS 0x0040 +#define SET_LINEAR_ACCELERATION_WORLD 0x0080 +#define SET_CONTROL 0x0100 +#define SET_PACKET_NUMBER 0x4000 +#define SET_FOOTER 0x8000 + +/*************************************************************************/ +/* Integral reset options */ +/*************************************************************************/ +#define INV_NO_RESET 0x0000 +#define INV_RESET 0x0001 + +/*************************************************************************/ +/* Motion states */ +/*************************************************************************/ +#define INV_MOTION 0x0001 +#define INV_NO_MOTION 0x0002 + +/*************************************************************************/ +/* Orientation and Gesture states */ +/*************************************************************************/ +#define INV_STATE_IDLE (0) +#define INV_STATE_RUNNING (1) + +/*************************************************************************/ +/* Gyroscope Temperature Compensation bins */ +/*************************************************************************/ +#define BINS (25) +#define PTS_PER_BIN (5) +#define MIN_TEMP (-40) +#define MAX_TEMP (+85) +#define TEMP_PER_BIN ((MAX_TEMP - MIN_TEMP) / BINS) + +/*************************************************************************/ +/* Flags */ +/*************************************************************************/ +#define INV_RAW_DATA_READY 0x0001 +#define INV_PROCESSED_DATA_READY 0x0002 + +#define INV_GOT_GESTURE 0x0004 + +#define INV_MOTION_STATE_CHANGE 0x0006 +#define INV_COMPASS_OFFSET_VALID 0x0007 + +/*************************************************************************/ +/* General */ +/*************************************************************************/ +#define INV_NONE (0x0000) +#define INV_INVALID_FIFO_RATE (0xFFFF) + +/*************************************************************************/ +/* ML Params Structure Default Values */ +/*************************************************************************/ +#define INV_BIAS_UPDATE_FUNC_DEFAULT (INV_BIAS_FROM_NO_MOTION | INV_BIAS_FROM_GRAVITY) +#define INV_ORIENTATION_MASK_DEFAULT 0x3f +#define INV_PROCESSED_DATA_CALLBACK_DEFAULT 0 +#define INV_ORIENTATION_CALLBACK_DEFAULT 0 +#define INV_MOTION_CALLBACK_DEFAULT 0 + +/* ------------ */ +/* - Defines. - */ +/* ------------ */ +/* Priority for various features */ +#define INV_PRIORITY_BUS_ACCEL 100 +#define INV_PRIORITY_EXTERNAL_SLAVE_MAG 110 +#define INV_PRIORITY_FAST_NO_MOTION 120 +#define INV_PRIORITY_BIAS_NO_MOTION 125 +#define INV_PRIORITY_SET_GYRO_BIASES 150 +#define INV_PRIORITY_TEMP_COMP 175 +#define INV_PRIORITY_CONTROL 200 +#define INV_PRIORITY_EIS 300 +#define INV_PRIORITY_ORIENTATION 400 +#define INV_PRIORITY_PEDOMETER_FULLPOWER 500 +#define INV_PRIORITY_NAVIGATION_PEDOMETER 600 +#define INV_PRIORITY_GESTURE 700 +#define INV_PRIORITY_GLYPH 800 + +#define MAX_INTERRUPT_PROCESSES 5 +/* Number of quantized accel samples */ +#define INV_MAX_NUM_ACCEL_SAMPLES (8) + +#define PRECISION 10000.f +#define RANGE_FLOAT_TO_FIXEDPOINT(range, x) { \ + range.mantissa = (long)x; \ + range.fraction = (long)((float)(x-(long)x)*PRECISION); \ +} +#define RANGE_FIXEDPOINT_TO_FLOAT(range, x) { \ + x = (float)(range.mantissa); \ + x += ((float)range.fraction/PRECISION); \ +} + + /* --------------- */ + /* - Structures. - */ + /* --------------- */ + +struct inv_obj_t { + //Calibration parameters + /* Raw sensor orientation */ + long gyro_bias[3]; + long accel_bias[3]; + long compass_bias[3]; + + /* Cached values after orietnation is applied */ + long scaled_gyro_bias[3]; + long scaled_accel_bias[3]; + long scaled_compass_bias[3]; + + long compass_scale[3]; + long compass_test_bias[3]; + long compass_test_scale[3]; + long compass_asa[3]; + long compass_offsets[3]; + + long compass_bias_error[3]; + + long got_no_motion_bias; + long got_compass_bias; + long compass_state; + long large_field; + long acc_state; + + long factory_temp_comp; + long got_coarse_heading; + long gyro_temp_bias[3]; + long prog_no_motion_bias[3]; + + long accel_cal[9]; + // Deprecated, used gyro_orient + long gyro_cal[GYRO_NUM_AXES * GYRO_NUM_AXES]; + long gyro_orient[GYRO_NUM_AXES * GYRO_NUM_AXES]; + long accel_sens; + long compass_cal[9]; + long gyro_sens; + long gyro_sf; + long temp_slope[GYRO_NUM_AXES]; + long compass_sens; + long temp_offset[GYRO_NUM_AXES]; + + int cal_loaded_flag; + + /* temperature compensation */ + float x_gyro_coef[3]; + float y_gyro_coef[3]; + float z_gyro_coef[3]; + float x_gyro_temp_data[BINS][PTS_PER_BIN]; + float y_gyro_temp_data[BINS][PTS_PER_BIN]; + float z_gyro_temp_data[BINS][PTS_PER_BIN]; + float temp_data[BINS][PTS_PER_BIN]; + int temp_ptrs[BINS]; + long temp_valid_data[BINS]; + + long compass_correction[4]; + long compass_correction_relative[4]; + long compass_disturb_correction[4]; + long compass_correction_offset[4]; + long relative_quat[4]; + long local_field[3]; + long new_local_field; + long sync_grav_body[3]; + int gyro_bias_err; + + double compass_bias_ptr[9]; + double compass_bias_v[3]; + double compass_prev_m[36]; + double compass_prev_xty[6]; + + int compass_peaks[18]; + int all_sensors_no_motion; + + long init_compass_bias[3]; + + int got_init_compass_bias; + int resetting_compass; + + long ang_v_body[GYRO_NUM_AXES]; + unsigned char compass_raw_data[24]; /* Sensor data plus status etc */ + long compass_sensor_data[3]; /* Raw sensor data only */ + long compass_calibrated_data[3]; + long compass_test_calibrated_data[3]; + long pressure; + inv_error_t (*external_slave_callback)(struct inv_obj_t *); + int compass_accuracy; + int compass_overunder; + + unsigned short flags[8]; + unsigned short suspend; + + long no_motion_threshold; + unsigned long motion_duration; + + unsigned short motion_state; + + unsigned short data_mode; + unsigned short interrupt_sources; + + unsigned short bias_update_time; + short last_motion; + unsigned short bias_calc_time; + + unsigned char internal_motion_state; + long start_time; + + long accel_lpf_gain; + long accel_lpf[3]; + unsigned long poll_no_motion; + long no_motion_accel_threshold; + unsigned long no_motion_accel_time; + inv_error_t(*mode_change_func) (unsigned long, unsigned long); + }; + + typedef inv_error_t(*inv_obj_func) (struct inv_obj_t *); + + extern struct inv_obj_t inv_obj; + + /* --------------------- */ + /* - Params Structure. - */ + /* --------------------- */ + + struct inv_params_obj { + + unsigned short bias_mode; // A function or bitwise OR of functions that determine how the gyroscope bias will be automatically updated. + // Functions include INV_BIAS_FROM_NO_MOTION, INV_BIAS_FROM_GRAVITY, and INV_BIAS_FROM_TEMPERATURE. + // The engine INV_BIAS_UPDATE must be enabled for these algorithms to run. + + unsigned short orientation_mask; // Allows a user to register which orientations will trigger the user defined callback function. + // The orientations are INV_X_UP, INV_X_DOWN, INV_Y_UP, INV_Y_DOWN, INV_Z_UP, and INV_Z_DOWN. + // INV_ORIENTATION_ALL is equivalent to INV_X_UP | INV_X_DOWN | INV_Y_UP | INV_Y_DOWN | INV_Z_UP | INV_Z_DOWN. + + void (*fifo_processed_func) (void); // Callback function that triggers when all the processing has been finished by the motion processing engines. + + void (*orientation_cb_func) (unsigned short orient); // Callback function that will run when a change of orientation is detected. + // The new orientation. May be one of INV_X_UP, INV_X_DOWN, INV_Y_UP, INV_Y_DOWN, INV_Z_UP, or INV_Z_DOWN. + + void (*motion_cb_func) (unsigned short motion_state); // Callback function that will run when a change of motion state is detected. + // The new motion state. May be one of INV_MOTION, or INV_NO_MOTION. + + unsigned char state; + + }; + + extern struct inv_params_obj inv_params_obj; + /* --------------------- */ + /* - Function p-types. - */ + /* --------------------- */ + + inv_error_t inv_serial_start(char const *port); + inv_error_t inv_serial_stop(void); + inv_error_t inv_set_mpu_sensors(unsigned long sensors); + void *inv_get_serial_handle(void); + + /*API for handling the buffer */ + inv_error_t inv_update_data(void); + + /*API for handling polling */ + int inv_check_flag(int flag); + + /*API for setting bias update function */ + inv_error_t inv_set_bias_update(unsigned short biasFunction); + +#if defined CONFIG_MPU_SENSORS_MPU6050A2 || \ + defined CONFIG_MPU_SENSORS_MPU6050B1 + inv_error_t inv_turn_on_bias_from_no_motion(void); + inv_error_t inv_turn_off_bias_from_no_motion(void); + inv_error_t inv_set_mpu_6050_config(void); +#endif + + /* Legacy functions for handling augmented data*/ + inv_error_t inv_get_array(int dataSet, long *data); + inv_error_t inv_get_float_array(int dataSet, float *data); + inv_error_t inv_set_array(int dataSet, long *data); + inv_error_t inv_set_float_array(int dataSet, float *data); + /* Individual functions for augmented data, per specific dataset */ + + + inv_error_t inv_get_gyro(long *data); + inv_error_t inv_get_accel(long *data); + inv_error_t inv_get_temperature(long *data); + inv_error_t inv_get_temperature_raw(short *data); + inv_error_t inv_get_rot_mat(long *data); + inv_error_t inv_get_quaternion(long *data); + inv_error_t inv_get_linear_accel(long *data); + inv_error_t inv_get_linear_accel_in_world(long *data); + inv_error_t inv_get_gravity(long *data); + inv_error_t inv_get_angular_velocity(long *data); + inv_error_t inv_get_euler_angles(long *data); + inv_error_t inv_get_euler_angles_x(long *data); + inv_error_t inv_get_euler_angles_y(long *data); + inv_error_t inv_get_euler_angles_z(long *data); + inv_error_t inv_get_gyro_temp_slope(long *data); + inv_error_t inv_get_gyro_bias(long *data); + inv_error_t inv_get_accel_bias(long *data); + inv_error_t inv_get_mag_bias(long *data); + inv_error_t inv_get_gyro_and_accel_sensor(long *data); + inv_error_t inv_get_mag_raw_data(long *data); + inv_error_t inv_get_magnetometer(long *data); + inv_error_t inv_get_pressure(long *data); + inv_error_t inv_get_heading(long *data); + inv_error_t inv_get_gyro_cal_matrix(long *data); + inv_error_t inv_get_accel_cal_matrix(long *data); + inv_error_t inv_get_mag_cal_matrix(long *data); + inv_error_t inv_get_mag_bias_error(long *data); + inv_error_t inv_get_mag_scale(long *data); + inv_error_t inv_get_local_field(long *data); + inv_error_t inv_get_relative_quaternion(long *data); + inv_error_t inv_get_gyro_float(float *data); + inv_error_t inv_get_accel_float(float *data); + inv_error_t inv_get_temperature_float(float *data); + inv_error_t inv_get_rot_mat_float(float *data); + inv_error_t inv_get_quaternion_float(float *data); + inv_error_t inv_get_linear_accel_float(float *data); + inv_error_t inv_get_linear_accel_in_world_float(float *data); + inv_error_t inv_get_gravity_float(float *data); + inv_error_t inv_get_angular_velocity_float(float *data); + inv_error_t inv_get_euler_angles_float(float *data); + inv_error_t inv_get_euler_angles_x_float(float *data); + inv_error_t inv_get_euler_angles_y_float(float *data); + inv_error_t inv_get_euler_angles_z_float(float *data); + inv_error_t inv_get_gyro_temp_slope_float(float *data); + inv_error_t inv_get_gyro_bias_float(float *data); + inv_error_t inv_get_accel_bias_float(float *data); + inv_error_t inv_get_mag_bias_float(float *data); + inv_error_t inv_get_gyro_and_accel_sensor_float(float *data); + inv_error_t inv_get_mag_raw_data_float(float *data); + inv_error_t inv_get_magnetometer_float(float *data); + inv_error_t inv_get_pressure_float(float *data); + inv_error_t inv_get_heading_float(float *data); + inv_error_t inv_get_gyro_cal_matrix_float(float *data); + inv_error_t inv_get_accel_cal_matrix_float(float *data); + inv_error_t inv_get_mag_cal_matrix_float(float *data); + inv_error_t inv_get_mag_bias_error_float(float *data); + inv_error_t inv_get_mag_scale_float(float *data); + inv_error_t inv_get_local_field_float(float *data); + inv_error_t inv_get_relative_quaternion_float(float *data); + inv_error_t inv_get_compass_accuracy(int *accuracy); + inv_error_t inv_set_gyro_bias(long *data); + inv_error_t inv_set_accel_bias(long *data); + inv_error_t inv_set_mag_bias(long *data); + inv_error_t inv_set_gyro_temp_slope(long *data); + inv_error_t inv_set_local_field(long *data); + inv_error_t inv_set_mag_scale(long *data); + inv_error_t inv_set_gyro_temp_slope_float(float *data); + inv_error_t inv_set_gyro_bias_float(float *data); + inv_error_t inv_set_accel_bias_float(float *data); + inv_error_t inv_set_mag_bias_float(float *data); + inv_error_t inv_set_local_field_float(float *data); + inv_error_t inv_set_mag_scale_float(float *data); + + inv_error_t inv_apply_endian_accel(void); + inv_error_t inv_apply_calibration(void); + inv_error_t inv_set_gyro_calibration(float range, signed char *orientation); + inv_error_t inv_set_accel_calibration(float range, + signed char *orientation); + inv_error_t inv_set_compass_calibration(float range, + signed char *orientation); + + /*API for detecting change of state */ + inv_error_t + inv_set_motion_callback(void (*func) (unsigned short motion_state)); + int inv_get_motion_state(void); + + /*API for getting ML version. */ + inv_error_t inv_get_version(unsigned char **version); + + inv_error_t inv_set_motion_interrupt(unsigned char on); + inv_error_t inv_set_fifo_interrupt(unsigned char on); + + int inv_get_interrupts(void); + + /* Simulated DMP */ + int inv_get_gyro_present(void); + + inv_error_t inv_set_no_motion_time(float time); + inv_error_t inv_set_no_motion_thresh(float thresh); + inv_error_t inv_set_no_motion_threshAccel(long thresh); + inv_error_t inv_reset_motion(void); + + inv_error_t inv_update_bias(void); + inv_error_t inv_set_dead_zone(void); + void inv_start_bias_calc(void); + void inv_stop_bias_calc(void); + + // Private functions shared accross modules + void inv_init_ml(void); + + inv_error_t inv_register_dmp_interupt_cb(inv_obj_func func); + inv_error_t inv_unregister_dmp_interupt_cb(inv_obj_func func); + void inv_run_dmp_interupt_cb(void); + void inv_set_mode_change(inv_error_t(*mode_change_func) + (unsigned long, unsigned long)); + +#ifdef __cplusplus +} +#endif +#endif // INV_H +/** + * @} + */ -- cgit v1.2.3