├── .gitignore ├── SerialVRController_v2 ├── freeram.h ├── mpu.h ├── inv_mpu_dmp_motion_driver.h ├── mpu.cpp ├── inv_mpu.h ├── dmpmap.h ├── SerialVRController_v2.ino ├── I2Cdev.h ├── SerialVRController_v2.ino.eightanaloginputs.hex ├── dmpKey.h ├── SerialVRController_v2.ino.with_bootloader.eightanaloginputs.hex └── inv_mpu_dmp_motion_driver.cpp ├── LICENSE └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | misc -------------------------------------------------------------------------------- /SerialVRController_v2/freeram.h: -------------------------------------------------------------------------------- 1 | 2 | int freeRam () { 3 | extern int __heap_start, *__brkval; 4 | int v; 5 | return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); 6 | } 7 | 8 | 9 | -------------------------------------------------------------------------------- /SerialVRController_v2/mpu.h: -------------------------------------------------------------------------------- 1 | #ifndef MPU_H 2 | #define MPU_H 3 | 4 | struct s_quat { float w, x, y, z; }; 5 | 6 | struct s_mympu { 7 | float ypr[3]; 8 | float gyro[3]; 9 | s_quat quat; 10 | }; 11 | 12 | extern struct s_mympu mympu; 13 | 14 | int mympu_open(unsigned int rate); 15 | int mympu_update(); 16 | 17 | #endif 18 | 19 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 peter10110 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Arduino-SteamVR-controller 2 | The arduino code for one of my other projects, where i try to emulate Vive controllers with Leap Motion, and an Arduino based custom built controller 3 | 4 | # What is this? 5 | This is the code of my custom built motion controller, used for my other project, where I try to emulat Vive controllers. The buttons and the orientation 6 | are from two of these controllers, and the positional data is from a Leap Motion. 7 | 8 | # Known issues 9 | - Currently the orientation data is the built-on DMP's (Digital Motion Processor) output, without any further processing. It's quite good and stable, 10 | but it uses only the gyroscope, and the accelerometer, not the magnetometer. With intense movements, it can drift quite easily. 11 | - As the communication is on USB only, you need two, quite long USB cables. This is far from comfortable, especially when using it with a VR headset 12 | (what is the intended use). 13 | 14 | # Future plans for improvements 15 | - Add Bluetooth, and a battery, to enable wireless operation. 16 | 17 | # Build process 18 | I've built two of these controllers, from an Arduino Nano, an MPU-9255 IMU, and a cheap one-handed controller from ebay. 19 | Some photos from the build process can be found here: http://imgur.com/gallery/ihOr1 20 | 21 | # Special thanks 22 | Thanks for github user rpicopter, for the DMP enabled motion processing library for the MPU9250. I used this, to get the DMP data from my MPU-9255. 23 | https://github.com/rpicopter/ArduinoMotionSensorExample 24 | -------------------------------------------------------------------------------- /SerialVRController_v2/inv_mpu_dmp_motion_driver.h: -------------------------------------------------------------------------------- 1 | /* 2 | $License: 3 | Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved. 4 | See included License.txt for License information. 5 | $ 6 | */ 7 | /** 8 | * @addtogroup DRIVERS Sensor Driver Layer 9 | * @brief Hardware drivers to communicate with sensors via I2C. 10 | * 11 | * @{ 12 | * @file inv_mpu_dmp_motion_driver.h 13 | * @brief DMP image and interface functions. 14 | * @details All functions are preceded by the dmp_ prefix to 15 | * differentiate among MPL and general driver function calls. 16 | */ 17 | #ifndef _INV_MPU_DMP_MOTION_DRIVER_H_ 18 | #define _INV_MPU_DMP_MOTION_DRIVER_H_ 19 | 20 | #define TAP_X (0x01) 21 | #define TAP_Y (0x02) 22 | #define TAP_Z (0x04) 23 | #define TAP_XYZ (0x07) 24 | 25 | #define TAP_X_UP (0x01) 26 | #define TAP_X_DOWN (0x02) 27 | #define TAP_Y_UP (0x03) 28 | #define TAP_Y_DOWN (0x04) 29 | #define TAP_Z_UP (0x05) 30 | #define TAP_Z_DOWN (0x06) 31 | 32 | #define ANDROID_ORIENT_PORTRAIT (0x00) 33 | #define ANDROID_ORIENT_LANDSCAPE (0x01) 34 | #define ANDROID_ORIENT_REVERSE_PORTRAIT (0x02) 35 | #define ANDROID_ORIENT_REVERSE_LANDSCAPE (0x03) 36 | 37 | #define DMP_INT_GESTURE (0x01) 38 | #define DMP_INT_CONTINUOUS (0x02) 39 | 40 | #define DMP_FEATURE_TAP (0x001) 41 | #define DMP_FEATURE_ANDROID_ORIENT (0x002) 42 | #define DMP_FEATURE_LP_QUAT (0x004) 43 | #define DMP_FEATURE_PEDOMETER (0x008) 44 | #define DMP_FEATURE_6X_LP_QUAT (0x010) 45 | #define DMP_FEATURE_GYRO_CAL (0x020) 46 | #define DMP_FEATURE_SEND_RAW_ACCEL (0x040) 47 | #define DMP_FEATURE_SEND_RAW_GYRO (0x080) 48 | #define DMP_FEATURE_SEND_CAL_GYRO (0x100) 49 | 50 | #define INV_WXYZ_QUAT (0x100) 51 | 52 | /* Set up functions. */ 53 | void dmp_init_structures(); 54 | int dmp_select_device(int device); 55 | int dmp_load_motion_driver_firmware(void); 56 | int dmp_set_fifo_rate(unsigned short rate); 57 | int dmp_get_fifo_rate(unsigned short *rate); 58 | int dmp_enable_feature(unsigned short mask); 59 | int dmp_get_enabled_features(unsigned short *mask); 60 | int dmp_set_interrupt_mode(unsigned char mode); 61 | int dmp_set_orientation(unsigned short orient); 62 | int dmp_set_gyro_bias(long *bias); 63 | int dmp_set_accel_bias(long *bias); 64 | 65 | #ifdef MPU_MAXIMAL 66 | /* Tap functions. */ 67 | int dmp_register_tap_cb(void (*func)(unsigned char, unsigned char)); 68 | int dmp_set_tap_thresh(unsigned char axis, unsigned short thresh); 69 | int dmp_set_tap_axes(unsigned char axis); 70 | int dmp_set_tap_count(unsigned char min_taps); 71 | int dmp_set_tap_time(unsigned short time); 72 | int dmp_set_tap_time_multi(unsigned short time); 73 | int dmp_set_shake_reject_thresh(long sf, unsigned short thresh); 74 | int dmp_set_shake_reject_time(unsigned short time); 75 | int dmp_set_shake_reject_timeout(unsigned short time); 76 | 77 | /* Android orientation functions. */ 78 | int dmp_register_android_orient_cb(void (*func)(unsigned char)); 79 | #endif // MPU_MAXIMAL 80 | 81 | /* LP quaternion functions. */ 82 | int dmp_enable_lp_quat(unsigned char enable); 83 | int dmp_enable_6x_lp_quat(unsigned char enable); 84 | 85 | #ifdef MPU_MAXIMAL 86 | /* Pedometer functions. */ 87 | int dmp_get_pedometer_step_count(unsigned long *count); 88 | int dmp_set_pedometer_step_count(unsigned long count); 89 | int dmp_get_pedometer_walk_time(unsigned long *time); 90 | int dmp_set_pedometer_walk_time(unsigned long time); 91 | #endif // MPU_MAXIMAL 92 | 93 | /* DMP gyro calibration functions. */ 94 | int dmp_enable_gyro_cal(unsigned char enable); 95 | 96 | /* Read function. This function should be called whenever the MPU interrupt is 97 | * detected. 98 | */ 99 | int dmp_read_fifo(short *gyro, short *accel, long *quat, 100 | unsigned long *timestamp, short *sensors, unsigned char *more); 101 | 102 | #endif /* #ifndef _INV_MPU_DMP_MOTION_DRIVER_H_ */ 103 | 104 | -------------------------------------------------------------------------------- /SerialVRController_v2/mpu.cpp: -------------------------------------------------------------------------------- 1 | #include "mpu.h" 2 | #include "inv_mpu.h" 3 | #include "inv_mpu_dmp_motion_driver.h" 4 | 5 | #define FSR 2000 6 | //#define GYRO_SENS ( 131.0f * 250.f / (float)FSR ) 7 | #define GYRO_SENS 16.375f 8 | #define QUAT_SENS 1073741824.f //2^30 9 | 10 | #define EPSILON 0.0001f 11 | #define PI_2 1.57079632679489661923f 12 | 13 | struct s_mympu mympu; 14 | 15 | union u_quat { 16 | struct s_quat _f; 17 | long _l[4]; 18 | } q; 19 | 20 | static int ret; 21 | static short gyro[3]; 22 | static short sensors; 23 | static unsigned char fifoCount; 24 | 25 | int mympu_open(unsigned int rate) { 26 | mpu_select_device(0); 27 | mpu_init_structures(); 28 | 29 | ret = mpu_init(NULL); 30 | #ifdef MPU_DEBUG 31 | if (ret) return 10+ret; 32 | #endif 33 | 34 | ret = mpu_set_sensors(INV_XYZ_GYRO|INV_XYZ_ACCEL); 35 | #ifdef MPU_DEBUG 36 | if (ret) return 20+ret; 37 | #endif 38 | 39 | ret = mpu_set_gyro_fsr(FSR); 40 | #ifdef MPU_DEBUG 41 | if (ret) return 30+ret; 42 | #endif 43 | 44 | ret = mpu_set_accel_fsr(2); 45 | #ifdef MPU_DEBUG 46 | if (ret) return 40+ret; 47 | #endif 48 | 49 | mpu_get_power_state((unsigned char *)&ret); 50 | #ifdef MPU_DEBUG 51 | if (!ret) return 50+ret; 52 | #endif 53 | 54 | ret = mpu_configure_fifo(INV_XYZ_GYRO|INV_XYZ_ACCEL); 55 | #ifdef MPU_DEBUG 56 | if (ret) return 60+ret; 57 | #endif 58 | 59 | dmp_select_device(0); 60 | dmp_init_structures(); 61 | 62 | ret = dmp_load_motion_driver_firmware(); 63 | #ifdef MPU_DEBUG 64 | if (ret) return 80+ret; 65 | #endif 66 | 67 | ret = dmp_set_fifo_rate(rate); 68 | #ifdef MPU_DEBUG 69 | if (ret) return 90+ret; 70 | #endif 71 | 72 | ret = mpu_set_dmp_state(1); 73 | #ifdef MPU_DEBUG 74 | if (ret) return 100+ret; 75 | #endif 76 | 77 | ret = dmp_enable_feature(DMP_FEATURE_6X_LP_QUAT|DMP_FEATURE_SEND_CAL_GYRO|DMP_FEATURE_GYRO_CAL); 78 | // ret = dmp_enable_feature(DMP_FEATURE_SEND_CAL_GYRO|DMP_FEATURE_GYRO_CAL); 79 | #ifdef MPU_DEBUG 80 | if (ret) return 110+ret; 81 | #endif 82 | 83 | return 0; 84 | } 85 | 86 | static inline float rad2deg( float rad ) 87 | { 88 | //return (180.f/PI) * rad; 89 | return 57.2957795131f * rad; 90 | } 91 | 92 | static float test, sqy,sqz,sqw; 93 | static void quaternionToEuler( const struct s_quat *q, float* x, float* y, float* z ) 94 | { 95 | sqy = q->y * q->y; 96 | sqz = q->z * q->z; 97 | sqw = q->w * q->w; 98 | 99 | test = q->x * q->z - q->w * q->y; 100 | 101 | if( test > 0.5f - EPSILON ) 102 | { 103 | *x = 2.f * atan2( q->y, q->w ); 104 | *y = PI_2; 105 | *z = 0; 106 | } 107 | else if( test < -0.5f + EPSILON ) 108 | { 109 | *x = -2.f * atan2( q->y, q->w ); 110 | *y = -PI_2; 111 | *z = 0; 112 | } 113 | else 114 | { 115 | *x = atan2( 2.f * ( q->x * q->w + q->y * q->z ), 1.f - 2.f * ( sqz + sqw ) ); 116 | *y = asin( 2.f * test ); 117 | *z = atan2( 2.f * ( q->x * q->y - q->z * q->w ), 1.f - 2.f * ( sqy + sqz ) ); 118 | } 119 | } 120 | 121 | static inline float wrap_180(float x) { 122 | return (x<-180.f?x+360.f:(x>180.f?x-180.f:x)); 123 | } 124 | 125 | int mympu_update() { 126 | 127 | do { 128 | ret = dmp_read_fifo(gyro,NULL,q._l,NULL,&sensors,&fifoCount); 129 | /* will return: 130 | 0 - if ok 131 | 1 - no packet available 132 | 2 - if BIT_FIFO_OVERFLOWN is set 133 | 3 - if frame corrupted 134 | <0 - if error 135 | */ 136 | 137 | if (ret!=0) return ret; 138 | } while (fifoCount>1); 139 | 140 | q._f.w = (float)q._l[0] / (float)QUAT_SENS; 141 | q._f.x = (float)q._l[1] / (float)QUAT_SENS; 142 | q._f.y = (float)q._l[2] / (float)QUAT_SENS; 143 | q._f.z = (float)q._l[3] / (float)QUAT_SENS; 144 | 145 | mympu.quat.w = q._f.w; 146 | mympu.quat.x = q._f.x; 147 | mympu.quat.y = q._f.y; 148 | mympu.quat.z = q._f.z; 149 | 150 | quaternionToEuler( &q._f, &mympu.ypr[2], &mympu.ypr[1], &mympu.ypr[0] ); 151 | 152 | /* need to adjust signs and do the wraps depending on the MPU mount orientation */ 153 | /* if axis is no centered around 0 but around i.e 90 degree due to mount orientation */ 154 | /* then do: mympu.ypr[x] = wrap_180(90.f+rad2deg(mympu.ypr[x])); */ 155 | mympu.ypr[0] = rad2deg(mympu.ypr[0]); 156 | mympu.ypr[1] = rad2deg(mympu.ypr[1]); 157 | mympu.ypr[2] = rad2deg(mympu.ypr[2]); 158 | 159 | /* need to adjust signs depending on the MPU mount orientation */ 160 | mympu.gyro[0] = -(float)gyro[2] / GYRO_SENS; 161 | mympu.gyro[1] = (float)gyro[1] / GYRO_SENS; 162 | mympu.gyro[2] = (float)gyro[0] / GYRO_SENS; 163 | 164 | return 0; 165 | } 166 | 167 | -------------------------------------------------------------------------------- /SerialVRController_v2/inv_mpu.h: -------------------------------------------------------------------------------- 1 | /* 2 | $License: 3 | Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved. 4 | See included License.txt for License information. 5 | $ 6 | */ 7 | /** 8 | * @addtogroup DRIVERS Sensor Driver Layer 9 | * @brief Hardware drivers to communicate with sensors via I2C. 10 | * 11 | * @{ 12 | * @file inv_mpu.h 13 | * @brief An I2C-based driver for Invensense gyroscopes. 14 | * @details This driver currently works for the following devices: 15 | * MPU6050 16 | * MPU6500 17 | * MPU9150 (or MPU6050 w/ AK8975 on the auxiliary bus) 18 | * MPU9250 (or MPU6500 w/ AK8963 on the auxiliary bus) 19 | */ 20 | 21 | #ifndef _INV_MPU_H_ 22 | #define _INV_MPU_H_ 23 | 24 | #include "I2Cdev.h" 25 | 26 | // Define this symbol to get debug messages 27 | 28 | //#define MPU_DEBUG 29 | 30 | // Define this symbol to enable rarely-used functions from library 31 | 32 | //#define MPU_MAXIMAL 33 | 34 | // This symbol defines how many devices are supported 35 | 36 | #define MPU_MAX_DEVICES 2 37 | 38 | // Call this function before using the MPU to select the correct device 39 | 40 | int mpu_select_device(int device); 41 | 42 | inline void get_ms(long unsigned int *timestamp) 43 | { 44 | *timestamp = millis(); 45 | } 46 | 47 | // IMU hardware device defines 48 | 49 | #define INV_X_GYRO (0x40) 50 | #define INV_Y_GYRO (0x20) 51 | #define INV_Z_GYRO (0x10) 52 | #define INV_XYZ_GYRO (INV_X_GYRO | INV_Y_GYRO | INV_Z_GYRO) 53 | #define INV_XYZ_ACCEL (0x08) 54 | #define INV_XYZ_COMPASS (0x01) 55 | 56 | struct int_param_s { 57 | void (*cb)(void); 58 | unsigned short pin; 59 | unsigned char lp_exit; 60 | unsigned char active_low; 61 | }; 62 | 63 | #define MPU_INT_STATUS_DATA_READY (0x0001) 64 | #define MPU_INT_STATUS_DMP (0x0002) 65 | #define MPU_INT_STATUS_PLL_READY (0x0004) 66 | #define MPU_INT_STATUS_I2C_MST (0x0008) 67 | #define MPU_INT_STATUS_FIFO_OVERFLOW (0x0010) 68 | #define MPU_INT_STATUS_ZMOT (0x0020) 69 | #define MPU_INT_STATUS_MOT (0x0040) 70 | #define MPU_INT_STATUS_FREE_FALL (0x0080) 71 | #define MPU_INT_STATUS_DMP_0 (0x0100) 72 | #define MPU_INT_STATUS_DMP_1 (0x0200) 73 | #define MPU_INT_STATUS_DMP_2 (0x0400) 74 | #define MPU_INT_STATUS_DMP_3 (0x0800) 75 | #define MPU_INT_STATUS_DMP_4 (0x1000) 76 | #define MPU_INT_STATUS_DMP_5 (0x2000) 77 | 78 | /* Set up APIs */ 79 | void mpu_init_structures(); 80 | 81 | int mpu_init(struct int_param_s *int_param); 82 | int mpu_init_slave(void); 83 | int mpu_set_bypass(unsigned char bypass_on); 84 | 85 | /* Configuration APIs */ 86 | int mpu_lp_accel_mode(unsigned char rate); 87 | int mpu_lp_motion_interrupt(unsigned short thresh, unsigned char time, 88 | unsigned char lpa_freq); 89 | int mpu_set_int_level(unsigned char active_low); 90 | int mpu_set_int_latched(unsigned char enable); 91 | 92 | int mpu_set_dmp_state(unsigned char enable); 93 | int mpu_get_dmp_state(unsigned char *enabled); 94 | 95 | int mpu_get_lpf(unsigned short *lpf); 96 | int mpu_set_lpf(unsigned short lpf); 97 | 98 | int mpu_get_gyro_fsr(unsigned short *fsr); 99 | int mpu_set_gyro_fsr(unsigned short fsr); 100 | 101 | int mpu_get_accel_fsr(unsigned char *fsr); 102 | int mpu_set_accel_fsr(unsigned char fsr); 103 | 104 | int mpu_get_compass_fsr(unsigned short *fsr); 105 | 106 | int mpu_get_gyro_sens(float *sens); 107 | int mpu_get_accel_sens(unsigned short *sens); 108 | 109 | int mpu_get_sample_rate(unsigned short *rate); 110 | int mpu_set_sample_rate(unsigned short rate); 111 | int mpu_get_compass_sample_rate(unsigned short *rate); 112 | int mpu_set_compass_sample_rate(unsigned short rate); 113 | 114 | int mpu_get_fifo_config(unsigned char *sensors); 115 | int mpu_configure_fifo(unsigned char sensors); 116 | 117 | int mpu_get_power_state(unsigned char *power_on); 118 | int mpu_set_sensors(unsigned char sensors); 119 | 120 | int mpu_set_accel_bias(const long *accel_bias); 121 | 122 | /* Data getter/setter APIs */ 123 | int mpu_get_gyro_reg(short *data, unsigned long *timestamp); 124 | int mpu_get_accel_reg(short *data, unsigned long *timestamp); 125 | int mpu_get_compass_reg(short *data, unsigned long *timestamp); 126 | int mpu_get_temperature(long *data, unsigned long *timestamp); 127 | 128 | int mpu_get_int_status(short *status); 129 | int mpu_read_fifo(short *gyro, short *accel, unsigned long *timestamp, 130 | unsigned char *sensors, unsigned char *more); 131 | int mpu_read_fifo_stream(unsigned short length, unsigned char *data, 132 | unsigned char *more); 133 | int mpu_reset_fifo(void); 134 | 135 | int mpu_write_mem(unsigned short mem_addr, unsigned short length, 136 | unsigned char *data); 137 | int mpu_read_mem(unsigned short mem_addr, unsigned short length, 138 | unsigned char *data); 139 | int mpu_load_firmware(unsigned short length, const unsigned char *firmware, 140 | unsigned short start_addr, unsigned short sample_rate); 141 | 142 | int mpu_reg_dump(void); 143 | int mpu_read_reg(unsigned char reg, unsigned char *data); 144 | 145 | #ifdef MPU_MAXIMAL 146 | int mpu_run_self_test(long *gyro, long *accel); 147 | int mpu_register_tap_cb(void (*func)(unsigned char, unsigned char)); 148 | #endif // MPU_MAXIMAL 149 | 150 | #endif /* #ifndef _INV_MPU_H_ */ 151 | 152 | -------------------------------------------------------------------------------- /SerialVRController_v2/dmpmap.h: -------------------------------------------------------------------------------- 1 | /* 2 | $License: 3 | Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. 4 | $ 5 | */ 6 | #ifndef DMPMAP_H 7 | #define DMPMAP_H 8 | 9 | #define DMP_PTAT 0 10 | #define DMP_XGYR 2 11 | #define DMP_YGYR 4 12 | #define DMP_ZGYR 6 13 | #define DMP_XACC 8 14 | #define DMP_YACC 10 15 | #define DMP_ZACC 12 16 | #define DMP_ADC1 14 17 | #define DMP_ADC2 16 18 | #define DMP_ADC3 18 19 | #define DMP_BIASUNC 20 20 | #define DMP_FIFORT 22 21 | #define DMP_INVGSFH 24 22 | #define DMP_INVGSFL 26 23 | #define DMP_1H 28 24 | #define DMP_1L 30 25 | #define DMP_BLPFSTCH 32 26 | #define DMP_BLPFSTCL 34 27 | #define DMP_BLPFSXH 36 28 | #define DMP_BLPFSXL 38 29 | #define DMP_BLPFSYH 40 30 | #define DMP_BLPFSYL 42 31 | #define DMP_BLPFSZH 44 32 | #define DMP_BLPFSZL 46 33 | #define DMP_BLPFMTC 48 34 | #define DMP_SMC 50 35 | #define DMP_BLPFMXH 52 36 | #define DMP_BLPFMXL 54 37 | #define DMP_BLPFMYH 56 38 | #define DMP_BLPFMYL 58 39 | #define DMP_BLPFMZH 60 40 | #define DMP_BLPFMZL 62 41 | #define DMP_BLPFC 64 42 | #define DMP_SMCTH 66 43 | #define DMP_0H2 68 44 | #define DMP_0L2 70 45 | #define DMP_BERR2H 72 46 | #define DMP_BERR2L 74 47 | #define DMP_BERR2NH 76 48 | #define DMP_SMCINC 78 49 | #define DMP_ANGVBXH 80 50 | #define DMP_ANGVBXL 82 51 | #define DMP_ANGVBYH 84 52 | #define DMP_ANGVBYL 86 53 | #define DMP_ANGVBZH 88 54 | #define DMP_ANGVBZL 90 55 | #define DMP_BERR1H 92 56 | #define DMP_BERR1L 94 57 | #define DMP_ATCH 96 58 | #define DMP_BIASUNCSF 98 59 | #define DMP_ACT2H 100 60 | #define DMP_ACT2L 102 61 | #define DMP_GSFH 104 62 | #define DMP_GSFL 106 63 | #define DMP_GH 108 64 | #define DMP_GL 110 65 | #define DMP_0_5H 112 66 | #define DMP_0_5L 114 67 | #define DMP_0_0H 116 68 | #define DMP_0_0L 118 69 | #define DMP_1_0H 120 70 | #define DMP_1_0L 122 71 | #define DMP_1_5H 124 72 | #define DMP_1_5L 126 73 | #define DMP_TMP1AH 128 74 | #define DMP_TMP1AL 130 75 | #define DMP_TMP2AH 132 76 | #define DMP_TMP2AL 134 77 | #define DMP_TMP3AH 136 78 | #define DMP_TMP3AL 138 79 | #define DMP_TMP4AH 140 80 | #define DMP_TMP4AL 142 81 | #define DMP_XACCW 144 82 | #define DMP_TMP5 146 83 | #define DMP_XACCB 148 84 | #define DMP_TMP8 150 85 | #define DMP_YACCB 152 86 | #define DMP_TMP9 154 87 | #define DMP_ZACCB 156 88 | #define DMP_TMP10 158 89 | #define DMP_DZH 160 90 | #define DMP_DZL 162 91 | #define DMP_XGCH 164 92 | #define DMP_XGCL 166 93 | #define DMP_YGCH 168 94 | #define DMP_YGCL 170 95 | #define DMP_ZGCH 172 96 | #define DMP_ZGCL 174 97 | #define DMP_YACCW 176 98 | #define DMP_TMP7 178 99 | #define DMP_AFB1H 180 100 | #define DMP_AFB1L 182 101 | #define DMP_AFB2H 184 102 | #define DMP_AFB2L 186 103 | #define DMP_MAGFBH 188 104 | #define DMP_MAGFBL 190 105 | #define DMP_QT1H 192 106 | #define DMP_QT1L 194 107 | #define DMP_QT2H 196 108 | #define DMP_QT2L 198 109 | #define DMP_QT3H 200 110 | #define DMP_QT3L 202 111 | #define DMP_QT4H 204 112 | #define DMP_QT4L 206 113 | #define DMP_CTRL1H 208 114 | #define DMP_CTRL1L 210 115 | #define DMP_CTRL2H 212 116 | #define DMP_CTRL2L 214 117 | #define DMP_CTRL3H 216 118 | #define DMP_CTRL3L 218 119 | #define DMP_CTRL4H 220 120 | #define DMP_CTRL4L 222 121 | #define DMP_CTRLS1 224 122 | #define DMP_CTRLSF1 226 123 | #define DMP_CTRLS2 228 124 | #define DMP_CTRLSF2 230 125 | #define DMP_CTRLS3 232 126 | #define DMP_CTRLSFNLL 234 127 | #define DMP_CTRLS4 236 128 | #define DMP_CTRLSFNL2 238 129 | #define DMP_CTRLSFNL 240 130 | #define DMP_TMP30 242 131 | #define DMP_CTRLSFJT 244 132 | #define DMP_TMP31 246 133 | #define DMP_TMP11 248 134 | #define DMP_CTRLSF2_2 250 135 | #define DMP_TMP12 252 136 | #define DMP_CTRLSF1_2 254 137 | #define DMP_PREVPTAT 256 138 | #define DMP_ACCZB 258 139 | #define DMP_ACCXB 264 140 | #define DMP_ACCYB 266 141 | #define DMP_1HB 272 142 | #define DMP_1LB 274 143 | #define DMP_0H 276 144 | #define DMP_0L 278 145 | #define DMP_ASR22H 280 146 | #define DMP_ASR22L 282 147 | #define DMP_ASR6H 284 148 | #define DMP_ASR6L 286 149 | #define DMP_TMP13 288 150 | #define DMP_TMP14 290 151 | #define DMP_FINTXH 292 152 | #define DMP_FINTXL 294 153 | #define DMP_FINTYH 296 154 | #define DMP_FINTYL 298 155 | #define DMP_FINTZH 300 156 | #define DMP_FINTZL 302 157 | #define DMP_TMP1BH 304 158 | #define DMP_TMP1BL 306 159 | #define DMP_TMP2BH 308 160 | #define DMP_TMP2BL 310 161 | #define DMP_TMP3BH 312 162 | #define DMP_TMP3BL 314 163 | #define DMP_TMP4BH 316 164 | #define DMP_TMP4BL 318 165 | #define DMP_STXG 320 166 | #define DMP_ZCTXG 322 167 | #define DMP_STYG 324 168 | #define DMP_ZCTYG 326 169 | #define DMP_STZG 328 170 | #define DMP_ZCTZG 330 171 | #define DMP_CTRLSFJT2 332 172 | #define DMP_CTRLSFJTCNT 334 173 | #define DMP_PVXG 336 174 | #define DMP_TMP15 338 175 | #define DMP_PVYG 340 176 | #define DMP_TMP16 342 177 | #define DMP_PVZG 344 178 | #define DMP_TMP17 346 179 | #define DMP_MNMFLAGH 352 180 | #define DMP_MNMFLAGL 354 181 | #define DMP_MNMTMH 356 182 | #define DMP_MNMTML 358 183 | #define DMP_MNMTMTHRH 360 184 | #define DMP_MNMTMTHRL 362 185 | #define DMP_MNMTHRH 364 186 | #define DMP_MNMTHRL 366 187 | #define DMP_ACCQD4H 368 188 | #define DMP_ACCQD4L 370 189 | #define DMP_ACCQD5H 372 190 | #define DMP_ACCQD5L 374 191 | #define DMP_ACCQD6H 376 192 | #define DMP_ACCQD6L 378 193 | #define DMP_ACCQD7H 380 194 | #define DMP_ACCQD7L 382 195 | #define DMP_ACCQD0H 384 196 | #define DMP_ACCQD0L 386 197 | #define DMP_ACCQD1H 388 198 | #define DMP_ACCQD1L 390 199 | #define DMP_ACCQD2H 392 200 | #define DMP_ACCQD2L 394 201 | #define DMP_ACCQD3H 396 202 | #define DMP_ACCQD3L 398 203 | #define DMP_XN2H 400 204 | #define DMP_XN2L 402 205 | #define DMP_XN1H 404 206 | #define DMP_XN1L 406 207 | #define DMP_YN2H 408 208 | #define DMP_YN2L 410 209 | #define DMP_YN1H 412 210 | #define DMP_YN1L 414 211 | #define DMP_YH 416 212 | #define DMP_YL 418 213 | #define DMP_B0H 420 214 | #define DMP_B0L 422 215 | #define DMP_A1H 424 216 | #define DMP_A1L 426 217 | #define DMP_A2H 428 218 | #define DMP_A2L 430 219 | #define DMP_SEM1 432 220 | #define DMP_FIFOCNT 434 221 | #define DMP_SH_TH_X 436 222 | #define DMP_PACKET 438 223 | #define DMP_SH_TH_Y 440 224 | #define DMP_FOOTER 442 225 | #define DMP_SH_TH_Z 444 226 | #define DMP_TEMP29 448 227 | #define DMP_TEMP30 450 228 | #define DMP_XACCB_PRE 452 229 | #define DMP_XACCB_PREL 454 230 | #define DMP_YACCB_PRE 456 231 | #define DMP_YACCB_PREL 458 232 | #define DMP_ZACCB_PRE 460 233 | #define DMP_ZACCB_PREL 462 234 | #define DMP_TMP22 464 235 | #define DMP_TAP_TIMER 466 236 | #define DMP_TAP_THX 468 237 | #define DMP_TAP_THY 472 238 | #define DMP_TAP_THZ 476 239 | #define DMP_TAPW_MIN 478 240 | #define DMP_TMP25 480 241 | #define DMP_TMP26 482 242 | #define DMP_TMP27 484 243 | #define DMP_TMP28 486 244 | #define DMP_ORIENT 488 245 | #define DMP_THRSH 490 246 | #define DMP_ENDIANH 492 247 | #define DMP_ENDIANL 494 248 | #define DMP_BLPFNMTCH 496 249 | #define DMP_BLPFNMTCL 498 250 | #define DMP_BLPFNMXH 500 251 | #define DMP_BLPFNMXL 502 252 | #define DMP_BLPFNMYH 504 253 | #define DMP_BLPFNMYL 506 254 | #define DMP_BLPFNMZH 508 255 | #define DMP_BLPFNMZL 510 256 | 257 | #endif // DMPMAP_H 258 | -------------------------------------------------------------------------------- /SerialVRController_v2/SerialVRController_v2.ino: -------------------------------------------------------------------------------- 1 | #define LEFT 2 | 3 | #include "freeram.h" 4 | 5 | #include "mpu.h" 6 | #include "I2Cdev.h" 7 | 8 | #include "quaternionFilters.h" 9 | #include "MPU9250.h" 10 | 11 | // Button pinout 12 | #define MENU_BUTTON_PIN 9 13 | #define SYSTEM_BUTTON_PIN 7 14 | #define GRIP_BUTTON_PIN 4 15 | #define TRIGGER_BUTTON_PIN 2 16 | #define TOUCHPAD_PRESS_PIN 3 17 | // Make the controller layouts mirrored 18 | #ifdef LEFT 19 | #define POWER_BUTTON_PIN 5 20 | #define AT_BUTTON_PIN 10 21 | #define B_BUTTON_PIN 6 22 | #else 23 | #define POWER_BUTTON_PIN 10 24 | #define AT_BUTTON_PIN 5 25 | #define B_BUTTON_PIN 8 26 | #endif 27 | 28 | #ifdef LEFT 29 | // The analog sticks are swapped on the left controller by mistake. 30 | #define ANALOG_X_PIN A7 31 | #define ANALOG_Y_PIN A6 32 | #else 33 | #define ANALOG_X_PIN A6 34 | #define ANALOG_Y_PIN A7 35 | #endif 36 | 37 | #ifdef LEFT 38 | // Analog correction values for L controller 39 | #define ANALOG_DEAD 10 40 | #define ANALOG_X_CENTER 522 41 | #define ANALOG_X_MIN 0 42 | #define ANALOG_X_MAX 960 43 | #define ANALOG_Y_CENTER 514 44 | #define ANALOG_Y_MIN 50 45 | #define ANALOG_Y_MAX 1000 46 | #else 47 | // Analog correction values for R controller 48 | #define ANALOG_DEAD 10 49 | #define ANALOG_X_CENTER 494 50 | #define ANALOG_X_MIN 0 51 | #define ANALOG_X_MAX 1023 52 | #define ANALOG_Y_CENTER 437 53 | #define ANALOG_Y_MIN 0 54 | #define ANALOG_Y_MAX 500 55 | #endif 56 | 57 | // Analog handling 58 | int x_pos_range = 0; 59 | int x_neg_range = 0; 60 | int y_pos_range = 0; 61 | int y_neg_range = 0; 62 | 63 | // Current button states 64 | bool menuButtonDown = false; 65 | bool systemButtonDown = false; 66 | bool gripButtonDown = false; 67 | bool triggerButtonDown = false; 68 | bool touchpadDown = false; 69 | bool atButtonDown = false; 70 | int buttonStates = 0; 71 | int lastButtonStates = 0; 72 | float touchpadX = 0; 73 | float touchpadY = 0; 74 | bool powerButtonDown = false; 75 | bool bButtonDown = false; 76 | 77 | #ifdef LEFT 78 | char handLetter = 'L'; 79 | #else 80 | char handLetter = 'R'; 81 | #endif 82 | 83 | #define ReadableSerial false 84 | 85 | int ret; 86 | void setup() { 87 | // initialize digital pin LED_BUILTIN as an output. 88 | pinMode(LED_BUILTIN, OUTPUT); 89 | 90 | pinMode(ANALOG_X_PIN, INPUT); 91 | pinMode(ANALOG_Y_PIN, INPUT); 92 | 93 | pinMode(MENU_BUTTON_PIN, INPUT); 94 | digitalWrite(MENU_BUTTON_PIN, HIGH); 95 | 96 | pinMode(SYSTEM_BUTTON_PIN, INPUT); 97 | digitalWrite(SYSTEM_BUTTON_PIN, HIGH); 98 | 99 | pinMode(GRIP_BUTTON_PIN, INPUT); 100 | digitalWrite(GRIP_BUTTON_PIN, HIGH); 101 | 102 | pinMode(TRIGGER_BUTTON_PIN, INPUT); 103 | digitalWrite(TRIGGER_BUTTON_PIN, HIGH); 104 | 105 | pinMode(TOUCHPAD_PRESS_PIN, INPUT); 106 | digitalWrite(TOUCHPAD_PRESS_PIN, HIGH); 107 | 108 | pinMode(POWER_BUTTON_PIN, INPUT); 109 | digitalWrite(POWER_BUTTON_PIN, HIGH); 110 | 111 | pinMode(AT_BUTTON_PIN, INPUT); 112 | digitalWrite(AT_BUTTON_PIN, HIGH); 113 | 114 | pinMode(B_BUTTON_PIN, INPUT); 115 | digitalWrite(B_BUTTON_PIN, HIGH); 116 | 117 | // Calculate initial analog values 118 | x_pos_range = ANALOG_X_MAX - ANALOG_X_CENTER; 119 | x_neg_range = ANALOG_X_MIN - ANALOG_X_CENTER; 120 | y_pos_range = ANALOG_Y_MAX - ANALOG_Y_CENTER; 121 | y_neg_range = ANALOG_Y_MIN - ANALOG_Y_CENTER; 122 | 123 | Fastwire::setup(400,0); 124 | Serial.begin(115200); 125 | ret = mympu_open(200); 126 | Serial.print("MPU init: "); Serial.println(ret); 127 | Serial.print("Free mem: "); Serial.println(freeRam()); 128 | 129 | } 130 | 131 | unsigned int c = 0; //cumulative number of successful MPU/DMP reads 132 | unsigned int np = 0; //cumulative number of MPU/DMP reads that brought no packet back 133 | unsigned int err_c = 0; //cumulative number of MPU/DMP reads that brought corrupted packet 134 | unsigned int err_o = 0; //cumulative number of MPU/DMP reads that had overflow bit set 135 | 136 | float lastTime = 0; 137 | float currentTime = 0; 138 | void loop() { 139 | ret = mympu_update(); 140 | 141 | switch (ret) { 142 | case 0: c++; break; 143 | case 1: np++; return; 144 | case 2: err_o++; return; 145 | case 3: err_c++; return; 146 | default: 147 | Serial.print("READ ERROR! "); 148 | Serial.println(ret); 149 | return; 150 | } 151 | 152 | ReadControllerData(); 153 | SendDataOnSerial(); 154 | //PrintAnalogValues(); 155 | } 156 | 157 | void SendSensorDataProcessing() { 158 | Serial.print("&,"); 159 | Serial.print(mympu.quat.w, 8); 160 | Serial.print(","); 161 | Serial.print(mympu.quat.x, 8); 162 | Serial.print(","); 163 | Serial.print(mympu.quat.y, 8); 164 | Serial.print(","); 165 | Serial.print(mympu.quat.z, 8); 166 | 167 | Serial.print(","); 168 | Serial.print(mympu.gyro[0],8); 169 | Serial.print(","); 170 | Serial.print(mympu.gyro[1],8); 171 | Serial.print(","); 172 | Serial.print(mympu.gyro[2],8); 173 | 174 | Serial.print(","); 175 | Serial.print(mympu.ypr[0],8); 176 | Serial.print(","); 177 | Serial.print(mympu.ypr[1],8); 178 | Serial.print(","); 179 | Serial.print(mympu.ypr[2],8); 180 | 181 | 182 | Serial.print('|'); 183 | } 184 | 185 | void PrintAnalogValues() 186 | { 187 | float an_x = analogRead(ANALOG_X_PIN); 188 | float an_y = analogRead(ANALOG_Y_PIN); 189 | Serial.print("X: "); 190 | Serial.print(an_x); 191 | Serial.print(" Y: "); 192 | Serial.println(an_y); 193 | } 194 | 195 | void SendDataOnSerial() 196 | { 197 | Serial.print(handLetter); 198 | Serial.print(";"); 199 | Serial.print(buttonStates); 200 | Serial.print(";"); 201 | Serial.print(touchpadX); 202 | Serial.print(";"); 203 | Serial.print(touchpadY); 204 | Serial.print(";"); 205 | Serial.print(mympu.quat.w, 4); 206 | Serial.print(";"); 207 | Serial.print(mympu.quat.x, 4); 208 | Serial.print(";"); 209 | Serial.print(mympu.quat.y, 4); 210 | Serial.print(";"); 211 | Serial.print(mympu.quat.z, 4); 212 | 213 | Serial.print('|'); 214 | } 215 | 216 | void ReadControllerData() 217 | { 218 | // Menu button 219 | if (!menuButtonDown && digitalRead(MENU_BUTTON_PIN) == LOW) 220 | { 221 | // Menu button pressed 222 | menuButtonDown = true; 223 | digitalWrite(LED_BUILTIN, HIGH); 224 | //Serial.print("Menu button down"); 225 | buttonStates |= 4; 226 | } 227 | else if (menuButtonDown && digitalRead(MENU_BUTTON_PIN) == HIGH) 228 | { 229 | // Menu button released 230 | digitalWrite(LED_BUILTIN, LOW); 231 | menuButtonDown = false; 232 | buttonStates &= B11011; 233 | } 234 | 235 | // System button 236 | if (!systemButtonDown && digitalRead(SYSTEM_BUTTON_PIN) == LOW) 237 | { 238 | // System button pressed 239 | systemButtonDown = true; 240 | digitalWrite(LED_BUILTIN, HIGH); 241 | //Serial.print("System button down"); 242 | buttonStates |= 2; 243 | } 244 | else if (systemButtonDown && digitalRead(SYSTEM_BUTTON_PIN) == HIGH) 245 | { 246 | // System button released 247 | digitalWrite(LED_BUILTIN, LOW); 248 | systemButtonDown = false; 249 | buttonStates &= B11101; 250 | } 251 | 252 | // Grip button 253 | if (!gripButtonDown && digitalRead(GRIP_BUTTON_PIN) == LOW) 254 | { 255 | // Grip button pressed 256 | gripButtonDown = true; 257 | digitalWrite(LED_BUILTIN, HIGH); 258 | //Serial.print("Grip button down"); 259 | buttonStates |= 1; 260 | } 261 | else if (gripButtonDown && digitalRead(GRIP_BUTTON_PIN) == HIGH) 262 | { 263 | // Grip button released 264 | digitalWrite(LED_BUILTIN, LOW); 265 | gripButtonDown = false; 266 | buttonStates &= B11110; 267 | } 268 | 269 | // Trigger button 270 | if (!triggerButtonDown && digitalRead(TRIGGER_BUTTON_PIN) == LOW) 271 | { 272 | // Trigger button pressed 273 | triggerButtonDown = true; 274 | digitalWrite(LED_BUILTIN, HIGH); 275 | //Serial.print("Trigger button down"); 276 | buttonStates |= 16; 277 | } 278 | else if (triggerButtonDown && digitalRead(TRIGGER_BUTTON_PIN) == HIGH) 279 | { 280 | // Trigger button released 281 | digitalWrite(LED_BUILTIN, LOW); 282 | triggerButtonDown = false; 283 | buttonStates &= B01111; 284 | } 285 | 286 | // Touchpad press 287 | if (!touchpadDown && digitalRead(TOUCHPAD_PRESS_PIN) == LOW) 288 | { 289 | // Touchpad pressed 290 | touchpadDown = true; 291 | digitalWrite(LED_BUILTIN, HIGH); 292 | //Serial.print("Touchpad press down"); 293 | buttonStates |= 8; 294 | } 295 | else if (touchpadDown && digitalRead(TOUCHPAD_PRESS_PIN) == HIGH) 296 | { 297 | // Touchpad released 298 | digitalWrite(LED_BUILTIN, LOW); 299 | touchpadDown = false; 300 | buttonStates &= B10111; 301 | } 302 | 303 | // Power button press 304 | if (!powerButtonDown && digitalRead(POWER_BUTTON_PIN) == LOW) 305 | { 306 | // Power button pressed 307 | powerButtonDown = true; 308 | digitalWrite(LED_BUILTIN, HIGH); 309 | buttonStates |= 32; 310 | } 311 | else if (powerButtonDown && digitalRead(POWER_BUTTON_PIN) == HIGH) 312 | { 313 | // Power button released 314 | digitalWrite(LED_BUILTIN, LOW); 315 | powerButtonDown = false; 316 | buttonStates &= B011111; 317 | } 318 | 319 | // At (@) button press 320 | if (!atButtonDown && digitalRead(AT_BUTTON_PIN) == LOW) 321 | { 322 | // At button pressed 323 | atButtonDown = true; 324 | digitalWrite(LED_BUILTIN, HIGH); 325 | buttonStates |= 64; 326 | } 327 | else if (atButtonDown && digitalRead(AT_BUTTON_PIN) == HIGH) 328 | { 329 | // At button released 330 | digitalWrite(LED_BUILTIN, LOW); 331 | atButtonDown = false; 332 | buttonStates &= B0111111; 333 | } 334 | 335 | // B button press 336 | if (!bButtonDown && digitalRead(B_BUTTON_PIN) == LOW) 337 | { 338 | // B button pressed 339 | bButtonDown = true; 340 | digitalWrite(LED_BUILTIN, HIGH); 341 | buttonStates |= 128; 342 | } 343 | else if (bButtonDown && digitalRead(B_BUTTON_PIN) == HIGH) 344 | { 345 | // B button released 346 | digitalWrite(LED_BUILTIN, LOW); 347 | bButtonDown = false; 348 | buttonStates &= B01111111; 349 | } 350 | 351 | // Touchpad 352 | touchpadX = analogRead(ANALOG_X_PIN); 353 | touchpadY = analogRead(ANALOG_Y_PIN); 354 | touchpadX -= ANALOG_X_CENTER; 355 | touchpadY -= ANALOG_Y_CENTER; 356 | 357 | // X axis 358 | if ((touchpadX < ANALOG_DEAD && touchpadX > 0) || (touchpadX > -ANALOG_DEAD && touchpadX < 0)) 359 | { 360 | // Dead zone 361 | touchpadX = 0; 362 | } 363 | else if (touchpadX >= x_pos_range) 364 | { 365 | touchpadX = -1; 366 | } 367 | else if (touchpadX <= x_neg_range) 368 | { 369 | touchpadX = 1; 370 | } 371 | else 372 | { 373 | if (touchpadX >= 0) 374 | { 375 | // Positive range 376 | touchpadX /= (float) -x_pos_range; 377 | } 378 | else 379 | { 380 | // Negative range 381 | touchpadX /= (float) x_neg_range; 382 | } 383 | } 384 | 385 | //Y axis 386 | if ((touchpadY < ANALOG_DEAD && touchpadY > 0) || (touchpadY > -ANALOG_DEAD && touchpadY < 0)) 387 | { 388 | // Dead zone 389 | touchpadY = 0; 390 | } 391 | else if (touchpadY >= y_pos_range) 392 | { 393 | touchpadY = 1; 394 | } 395 | else if (touchpadY <= y_neg_range) 396 | { 397 | touchpadY = -1; 398 | } 399 | else 400 | { 401 | if (touchpadY >= 0) 402 | { 403 | // Positive range 404 | touchpadY /= (float) y_pos_range; 405 | } 406 | else 407 | { 408 | // Negative range 409 | touchpadY /= (float) -y_neg_range; 410 | } 411 | } 412 | } 413 | 414 | 415 | -------------------------------------------------------------------------------- /SerialVRController_v2/I2Cdev.h: -------------------------------------------------------------------------------- 1 | // I2Cdev library collection - Main I2C device class header file 2 | // Abstracts bit and byte I2C R/W functions into a convenient class 3 | // 6/9/2012 by Jeff Rowberg 4 | // 5 | // Changelog: 6 | // 2013-05-06 - add Francesco Ferrara's Fastwire v0.24 implementation with small modifications 7 | // 2013-05-05 - fix issue with writing bit values to words (Sasquatch/Farzanegan) 8 | // 2012-06-09 - fix major issue with reading > 32 bytes at a time with Arduino Wire 9 | // - add compiler warnings when using outdated or IDE or limited I2Cdev implementation 10 | // 2011-11-01 - fix write*Bits mask calculation (thanks sasquatch @ Arduino forums) 11 | // 2011-10-03 - added automatic Arduino version detection for ease of use 12 | // 2011-10-02 - added Gene Knight's NBWire TwoWire class implementation with small modifications 13 | // 2011-08-31 - added support for Arduino 1.0 Wire library (methods are different from 0.x) 14 | // 2011-08-03 - added optional timeout parameter to read* methods to easily change from default 15 | // 2011-08-02 - added support for 16-bit registers 16 | // - fixed incorrect Doxygen comments on some methods 17 | // - added timeout value for read operations (thanks mem @ Arduino forums) 18 | // 2011-07-30 - changed read/write function structures to return success or byte counts 19 | // - made all methods static for multi-device memory savings 20 | // 2011-07-28 - initial release 21 | 22 | /* ============================================ 23 | I2Cdev device library code is placed under the MIT license 24 | Copyright (c) 2013 Jeff Rowberg 25 | 26 | Permission is hereby granted, free of charge, to any person obtaining a copy 27 | of this software and associated documentation files (the "Software"), to deal 28 | in the Software without restriction, including without limitation the rights 29 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 30 | copies of the Software, and to permit persons to whom the Software is 31 | furnished to do so, subject to the following conditions: 32 | 33 | The above copyright notice and this permission notice shall be included in 34 | all copies or substantial portions of the Software. 35 | 36 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 37 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 38 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 39 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 40 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 41 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 42 | THE SOFTWARE. 43 | =============================================== 44 | */ 45 | 46 | #ifndef _I2CDEV_H_ 47 | #define _I2CDEV_H_ 48 | 49 | // ----------------------------------------------------------------------------- 50 | // I2C interface implementation setting 51 | // ----------------------------------------------------------------------------- 52 | //#define I2CDEV_IMPLEMENTATION I2CDEV_ARDUINO_WIRE 53 | #define I2CDEV_IMPLEMENTATION I2CDEV_BUILTIN_FASTWIRE 54 | 55 | // comment this out if you are using a non-optimal IDE/implementation setting 56 | // but want the compiler to shut up about it 57 | #define I2CDEV_IMPLEMENTATION_WARNINGS 58 | 59 | // ----------------------------------------------------------------------------- 60 | // I2C interface implementation options 61 | // ----------------------------------------------------------------------------- 62 | #define I2CDEV_ARDUINO_WIRE 1 // Wire object from Arduino 63 | #define I2CDEV_BUILTIN_NBWIRE 2 // Tweaked Wire object from Gene Knight's NBWire project 64 | // ^^^ NBWire implementation is still buggy w/some interrupts! 65 | #define I2CDEV_BUILTIN_FASTWIRE 3 // FastWire object from Francesco Ferrara's project 66 | #define I2CDEV_I2CMASTER_LIBRARY 4 // I2C object from DSSCircuits I2C-Master Library at https://github.com/DSSCircuits/I2C-Master-Library 67 | 68 | // ----------------------------------------------------------------------------- 69 | // Arduino-style "Serial.print" debug constant (uncomment to enable) 70 | // ----------------------------------------------------------------------------- 71 | //#define I2CDEV_SERIAL_DEBUG 72 | 73 | #ifdef ARDUINO 74 | #if ARDUINO < 100 75 | #include "WProgram.h" 76 | #else 77 | #include "Arduino.h" 78 | #endif 79 | #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE 80 | #include 81 | #endif 82 | #if I2CDEV_IMPLEMENTATION == I2CDEV_I2CMASTER_LIBRARY 83 | #include 84 | #endif 85 | #endif 86 | 87 | // 1000ms default read timeout (modify with "I2Cdev::readTimeout = [ms];") 88 | #define I2CDEV_DEFAULT_READ_TIMEOUT 1000 89 | 90 | class I2Cdev { 91 | public: 92 | I2Cdev(); 93 | 94 | static int8_t readBit(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint8_t *data, uint16_t timeout=I2Cdev::readTimeout); 95 | static int8_t readBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint16_t *data, uint16_t timeout=I2Cdev::readTimeout); 96 | static int8_t readBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t *data, uint16_t timeout=I2Cdev::readTimeout); 97 | static int8_t readBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint16_t *data, uint16_t timeout=I2Cdev::readTimeout); 98 | static int8_t readByte(uint8_t devAddr, uint8_t regAddr, uint8_t *data, uint16_t timeout=I2Cdev::readTimeout); 99 | static int8_t readWord(uint8_t devAddr, uint8_t regAddr, uint16_t *data, uint16_t timeout=I2Cdev::readTimeout); 100 | static int8_t readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t *data, uint16_t timeout=I2Cdev::readTimeout); 101 | static int8_t readWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t *data, uint16_t timeout=I2Cdev::readTimeout); 102 | 103 | static bool writeBit(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint8_t data); 104 | static bool writeBitW(uint8_t devAddr, uint8_t regAddr, uint8_t bitNum, uint16_t data); 105 | static bool writeBits(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t data); 106 | static bool writeBitsW(uint8_t devAddr, uint8_t regAddr, uint8_t bitStart, uint8_t length, uint16_t data); 107 | static bool writeByte(uint8_t devAddr, uint8_t regAddr, uint8_t data); 108 | static bool writeWord(uint8_t devAddr, uint8_t regAddr, uint16_t data); 109 | static bool writeBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t *data); 110 | static bool writeWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t *data); 111 | 112 | static uint16_t readTimeout; 113 | }; 114 | 115 | #if I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE 116 | ////////////////////// 117 | // FastWire 0.24 118 | // This is a library to help faster programs to read I2C devices. 119 | // Copyright(C) 2012 120 | // Francesco Ferrara 121 | ////////////////////// 122 | 123 | /* Master */ 124 | #define TW_START 0x08 125 | #define TW_REP_START 0x10 126 | 127 | /* Master Transmitter */ 128 | #define TW_MT_SLA_ACK 0x18 129 | #define TW_MT_SLA_NACK 0x20 130 | #define TW_MT_DATA_ACK 0x28 131 | #define TW_MT_DATA_NACK 0x30 132 | #define TW_MT_ARB_LOST 0x38 133 | 134 | /* Master Receiver */ 135 | #define TW_MR_ARB_LOST 0x38 136 | #define TW_MR_SLA_ACK 0x40 137 | #define TW_MR_SLA_NACK 0x48 138 | #define TW_MR_DATA_ACK 0x50 139 | #define TW_MR_DATA_NACK 0x58 140 | 141 | #define TW_OK 0 142 | #define TW_ERROR 1 143 | 144 | class Fastwire { 145 | private: 146 | static boolean waitInt(); 147 | 148 | public: 149 | static void setup(int khz, boolean pullup); 150 | static byte beginTransmission(byte device); 151 | static byte write(byte value); 152 | static byte writeBuf(byte device, byte address, byte *data, byte num); 153 | static byte readBuf(byte device, byte address, byte *data, byte num); 154 | static void reset(); 155 | static byte stop(); 156 | }; 157 | #endif 158 | 159 | #if I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE 160 | // NBWire implementation based heavily on code by Gene Knight 161 | // Originally posted on the Arduino forum at http://arduino.cc/forum/index.php/topic,70705.0.html 162 | // Originally offered to the i2cdevlib project at http://arduino.cc/forum/index.php/topic,68210.30.html 163 | 164 | #define NBWIRE_BUFFER_LENGTH 32 165 | 166 | class TwoWire { 167 | private: 168 | static uint8_t rxBuffer[]; 169 | static uint8_t rxBufferIndex; 170 | static uint8_t rxBufferLength; 171 | 172 | static uint8_t txAddress; 173 | static uint8_t txBuffer[]; 174 | static uint8_t txBufferIndex; 175 | static uint8_t txBufferLength; 176 | 177 | // static uint8_t transmitting; 178 | static void (*user_onRequest)(void); 179 | static void (*user_onReceive)(int); 180 | static void onRequestService(void); 181 | static void onReceiveService(uint8_t*, int); 182 | 183 | public: 184 | TwoWire(); 185 | void begin(); 186 | void begin(uint8_t); 187 | void begin(int); 188 | void beginTransmission(uint8_t); 189 | //void beginTransmission(int); 190 | uint8_t endTransmission(uint16_t timeout=0); 191 | void nbendTransmission(void (*function)(int)) ; 192 | uint8_t requestFrom(uint8_t, int, uint16_t timeout=0); 193 | //uint8_t requestFrom(int, int); 194 | void nbrequestFrom(uint8_t, int, void (*function)(int)); 195 | void send(uint8_t); 196 | void send(uint8_t*, uint8_t); 197 | //void send(int); 198 | void send(char*); 199 | uint8_t available(void); 200 | uint8_t receive(void); 201 | void onReceive(void (*)(int)); 202 | void onRequest(void (*)(void)); 203 | }; 204 | 205 | #define TWI_READY 0 206 | #define TWI_MRX 1 207 | #define TWI_MTX 2 208 | #define TWI_SRX 3 209 | #define TWI_STX 4 210 | 211 | #define TW_WRITE 0 212 | #define TW_READ 1 213 | 214 | #define TW_MT_SLA_NACK 0x20 215 | #define TW_MT_DATA_NACK 0x30 216 | 217 | #define CPU_FREQ 16000000L 218 | #define TWI_FREQ 100000L 219 | #define TWI_BUFFER_LENGTH 32 220 | 221 | /* TWI Status is in TWSR, in the top 5 bits: TWS7 - TWS3 */ 222 | 223 | #define TW_STATUS_MASK (_BV(TWS7)|_BV(TWS6)|_BV(TWS5)|_BV(TWS4)|_BV(TWS3)) 224 | #define TW_STATUS (TWSR & TW_STATUS_MASK) 225 | #define TW_START 0x08 226 | #define TW_REP_START 0x10 227 | #define TW_MT_SLA_ACK 0x18 228 | #define TW_MT_SLA_NACK 0x20 229 | #define TW_MT_DATA_ACK 0x28 230 | #define TW_MT_DATA_NACK 0x30 231 | #define TW_MT_ARB_LOST 0x38 232 | #define TW_MR_ARB_LOST 0x38 233 | #define TW_MR_SLA_ACK 0x40 234 | #define TW_MR_SLA_NACK 0x48 235 | #define TW_MR_DATA_ACK 0x50 236 | #define TW_MR_DATA_NACK 0x58 237 | #define TW_ST_SLA_ACK 0xA8 238 | #define TW_ST_ARB_LOST_SLA_ACK 0xB0 239 | #define TW_ST_DATA_ACK 0xB8 240 | #define TW_ST_DATA_NACK 0xC0 241 | #define TW_ST_LAST_DATA 0xC8 242 | #define TW_SR_SLA_ACK 0x60 243 | #define TW_SR_ARB_LOST_SLA_ACK 0x68 244 | #define TW_SR_GCALL_ACK 0x70 245 | #define TW_SR_ARB_LOST_GCALL_ACK 0x78 246 | #define TW_SR_DATA_ACK 0x80 247 | #define TW_SR_DATA_NACK 0x88 248 | #define TW_SR_GCALL_DATA_ACK 0x90 249 | #define TW_SR_GCALL_DATA_NACK 0x98 250 | #define TW_SR_STOP 0xA0 251 | #define TW_NO_INFO 0xF8 252 | #define TW_BUS_ERROR 0x00 253 | 254 | //#define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr)) 255 | //#define _SFR_BYTE(sfr) _MMIO_BYTE(_SFR_ADDR(sfr)) 256 | 257 | #ifndef sbi // set bit 258 | #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) 259 | #endif // sbi 260 | 261 | #ifndef cbi // clear bit 262 | #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) 263 | #endif // cbi 264 | 265 | extern TwoWire Wire; 266 | 267 | #endif // I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_NBWIRE 268 | 269 | #endif /* _I2CDEV_H_ */ 270 | -------------------------------------------------------------------------------- /SerialVRController_v2/SerialVRController_v2.ino.eightanaloginputs.hex: -------------------------------------------------------------------------------- 1 | :100000000C945D000C9485000C9485000C94850084 2 | :100010000C9485000C9485000C9485000C9485004C 3 | :100020000C9485000C9485000C9485000C9485003C 4 | :100030000C9485000C9485000C9485000C9485002C 5 | :100040000C945E040C9485000C942C040C9406040F 6 | :100050000C9485000C9485000C9485000C9485000C 7 | :100060000C94A8040C9485000000000023002600D6 8 | :10007000290000000000250028002B0004040404CF 9 | :100080000404040402020202020203030303030342 10 | :10009000010204081020408001020408102001021F 11 | :1000A00004081020000000080002010000030407FB 12 | :1000B0000000000000000000D60511241FBECFEF95 13 | :1000C000D8E0DEBFCDBF11E0A0E0B1E0ECE2F7E1A7 14 | :1000D00002C005900D92A035B107D9F722E0A0E546 15 | :1000E000B1E001C01D92AF38B207E1F710E0CDE5F5 16 | :1000F000D0E004C02197FE010E944D09CC35D10704 17 | :10010000C9F70E9423060C94940B0C940000E09114 18 | :10011000DA01F091DB010190F081E02D682F8AED8A 19 | :1001200091E00994CF92DF92EF92FF920F931F9389 20 | :10013000CF93DF936C017A018B01C0E0D0E0CE1544 21 | :10014000DF0589F0D8016D918D01D601ED91FC910B 22 | :100150000190F081E02DC6010995892B11F47E01F3 23 | :1001600002C02196ECCFC701DF91CF911F910F9173 24 | :10017000FF90EF90DF90CF900895FC01918D828DDC 25 | :10018000981761F0828DDF01A80FB11D5D968C91EB 26 | :10019000928D9F5F9F73928F90E008958FEF9FEFF6 27 | :1001A0000895FC01918D828D981731F0828DE80FB2 28 | :1001B000F11D858D90E008958FEF9FEF0895FC016C 29 | :1001C000918D228D892F90E0805C9F4F821B910939 30 | :1001D0008F73992708958AED91E00E94DF0021E056 31 | :1001E000892B09F420E0822F0895FC01848DDF0122 32 | :1001F000A80FB11DA35ABF4F2C91848D90E001969A 33 | :100200008F739927848FA689B7892C93A089B18988 34 | :100210008C9180648C93938D848D981306C0028892 35 | :10022000F389E02D80818F7D80830895EF92FF9286 36 | :100230000F931F93CF93DF93EC0181E0888F9B8D09 37 | :100240008C8D981305C0E889F989808185FD24C0CB 38 | :10025000F62E0B8D10E00F5F1F4F0F731127E02E4E 39 | :100260008C8DE8120CC00FB607FCFACFE889F9892B 40 | :10027000808185FFF5CFCE010E94F500F1CF8B8DF7 41 | :10028000FE01E80FF11DE35AFF4FF0820B8FEA8960 42 | :10029000FB898081806207C0EE89FF896083E889DD 43 | :1002A000F98980818064808381E090E0DF91CF9143 44 | :1002B0001F910F91FF90EF900895CF93DF93EC0182 45 | :1002C000888D8823C9F0EA89FB89808185FD05C076 46 | :1002D000A889B9898C9186FD0FC00FB607FCF5CFB0 47 | :1002E000808185FFF2CFA889B9898C9185FFEDCFF8 48 | :1002F000CE010E94F500E7CFDF91CF91089580E015 49 | :1003000090E0892B29F00E94EB0081110C940000F1 50 | :100310000895833081F028F4813099F08230A1F083 51 | :1003200008958730A9F08830B9F08430D1F48091F5 52 | :1003300080008F7D03C0809180008F778093800044 53 | :10034000089584B58F7702C084B58F7D84BD0895EC 54 | :100350008091B0008F7703C08091B0008F7D809333 55 | :10036000B00008951F93CF93DF93E1EBF0E09491F9 56 | :10037000EDE9F0E0D491E9E8F0E0C491CC23D9F0C4 57 | :10038000182F992319F0892F0E948901EC2FF0E092 58 | :10039000EE0FFF1FEE58FF4FA591B4918FB7F89461 59 | :1003A000111105C09C91ED2FE095E92302C0EC915D 60 | :1003B000ED2BEC938FBFDF91CF911F910895CF93D9 61 | :1003C000DF93282F30E0F901EC55FF4F8491F901BC 62 | :1003D000E057FF4FD491F901E458FF4FC491CC236B 63 | :1003E00091F081110E948901EC2FF0E0EE0FFF1FC8 64 | :1003F000E859FF4FA591B491EC91ED2381E090E095 65 | :1004000021F480E002C080E090E0DF91CF91089578 66 | :100410008E3008F08E508770806480937C008091CD 67 | :100420007A00806480937A0080917A0086FDFCCF08 68 | :10043000809178002091790090E0922B08953FB749 69 | :10044000F8948091C4019091C501A091C601B0912A 70 | :10045000C70126B5A89B05C02F3F19F00196A11D25 71 | :10046000B11D3FBFBA2FA92F982F8827820F911D4A 72 | :10047000A11DB11DBC01CD0142E0660F771F881F91 73 | :10048000991F4A95D1F7089585ED8093BC0080911E 74 | :10049000BC0084FDFCCF1092990108954091730136 75 | :1004A000262F30E0240F311D21323105DCF420915C 76 | :1004B00099012430C9F4FC0180E090E0861758F4DB 77 | :1004C000309173012191DC01AF5ABE4FA30FB11DD2 78 | :1004D0002C930196F3CF80917301680F60937301A1 79 | :1004E00080E0089581E0089582E0089508958FEFF7 80 | :1004F0009FEF08958FEF9FEF08958091500190E056 81 | :100500009195819591090895CF93DF9300D0CDB750 82 | :10051000DEB7CB01642F49835A830E944E02498182 83 | :10052000842F5A81952F0F900F90DF91CF910895CE 84 | :10053000CF93DF931F92CDB7DEB7698361E0CE0121 85 | :1005400001960E944E0281E090E00F90DF91CF91E2 86 | :100550000895009769F0FC0101900020E9F73197B8 87 | :10056000AF01481B590BBC018AED91E00C9492003D 88 | :1005700080E090E008950C94A9028F929F92AF9230 89 | :10058000BF920F931F93CF93DF93CDB7DEB7A197A1 90 | :100590000FB6F894DEBF0FBECDBF19A2423008F4EB 91 | :1005A0004AE08E010F5D1F4F842E912CA12CB12C9F 92 | :1005B000A50194010E942B09E62FB901CA0101503F 93 | :1005C0001109EA3014F4E05D01C0E95CD801EC9354 94 | :1005D000232B242B252B61F7C8010E94A902A19689 95 | :1005E0000FB6F894DEBF0FBECDBFDF91CF911F9144 96 | :1005F0000F91BF90AF909F908F900895CF92DF9210 97 | :10060000EF92FF92CF93DF936C01990FEE08FF08F2 98 | :10061000F7FE12C08DE20E948700EC016627772763 99 | :10062000CB016C197D098E099F094AE00E94BD0229 100 | :100630007C01EC0EFD1E06C04AE0C701B6010E9417 101 | :10064000BD027C0186E291E00E94A9028E0D9F1DF1 102 | :10065000DF91CF91FF90EF90DF90CF9008954F9270 103 | :100660005F926F927F928F929F92AF92BF92CF9242 104 | :10067000DF92EF92FF926B017C01B42E9B01AC01E3 105 | :100680000E948A0B882319F089E291E027C0260195 106 | :100690003701E89477F82FEF3FEF4FE75FE7C301AB 107 | :1006A000B2010E948A0B81110DC02FEF3FEF4FE77F 108 | :1006B0005FE7C301B2010E94C00918161CF48DE265 109 | :1006C00091E00CC02FEF3FEF4FE75FE4C701B601A9 110 | :1006D0000E94180B181684F481E391E0FF90EF90CC 111 | :1006E000DF90CF90BF90AF909F908F907F906F9052 112 | :1006F0005F904F900C94A9022FEF3FEF4FE75FEC14 113 | :10070000C701B6010E94C00987FDE6CF20E030E0B6 114 | :10071000A901C701B6010E94C00987FF09C08DE287 115 | :100720000E9487004C01F7FAF094F7F8F09402C0A9 116 | :10073000812C912CA12C60E070E080E09FE3AB1451 117 | :1007400041F020E030E040E251E40E94C509A3946A 118 | :10075000F6CF9B01AC01C701B6010E9454092B01E1 119 | :100760003C010E94370A6B017C010E94660A9B01D2 120 | :10077000AC01C301B2010E9453092B013C014AE0C4 121 | :10078000C701B6010E94BD027C01E80CF91CBB2028 122 | :1007900031F085E391E00E94A902E80EF91EDB2CFE 123 | :1007A000DD2021F120E030E040E251E4C301B2015C 124 | :1007B0000E941D0B2B013C010E94370A4B01A12C0A 125 | :1007C000B12C4AE0C501B4010E94BD02E80EF91E39 126 | :1007D000C501B4010E94660A9B01AC01C301B201CC 127 | :1007E0000E9453092B013C01DA94DACFC701FF9034 128 | :1007F000EF90DF90CF90BF90AF909F908F907F90C1 129 | :100800006F905F904F9008950E948F0B1F920F92F0 130 | :100810000FB60F9211242F933F934F935F936F93D3 131 | :100820007F938F939F93AF93BF93EF93FF938AED43 132 | :1008300091E00E94F500FF91EF91BF91AF919F91E0 133 | :100840008F917F916F915F914F913F912F910F9079 134 | :100850000FBE0F901F9018951F920F920FB60F9218 135 | :1008600011242F938F939F93EF93FF93E091EA01CD 136 | :10087000F091EB018081E091F001F091F10182FDB6 137 | :1008800012C090818091F3018F5F8F732091F401EA 138 | :10089000821751F0E091F301F0E0E652FE4F958FA0 139 | :1008A0008093F30101C08081FF91EF919F918F911F 140 | :1008B0002F910F900FBE0F901F9018951F920F92BF 141 | :1008C0000FB60F9211242F933F938F939F93AF9363 142 | :1008D000BF938091C0019091C101A091C201B091DC 143 | :1008E000C3013091BF0123E0230F2D3720F401967F 144 | :1008F000A11DB11D05C026E8230F0296A11DB11D43 145 | :100900002093BF018093C0019093C101A093C201C5 146 | :10091000B093C3018091C4019091C501A091C6011B 147 | :10092000B091C7010196A11DB11D8093C4019093A0 148 | :10093000C501A093C601B093C701BF91AF919F912C 149 | :100940008F913F912F910F900FBE0F901F90189590 150 | :100950001F920F920FB60F9211242F933F934F9334 151 | :100960005F936F937F938F939F93AF93BF93EF9317 152 | :10097000FF938091B900887F803609F49CC068F5A8 153 | :10098000883209F45BC090F4803109F454C038F423 154 | :10099000882309F4F6C0883009F44DC0F6C08831C8 155 | :1009A00009F44CC0803209F45DC0EFC0803409F412 156 | :1009B00068C048F4803309F455C0883309F0E5C0B5 157 | :1009C00080939801D8C0803509F44FC0883509F468 158 | :1009D0005DC0883409F0D9C0D6C0883909F4C7C0D1 159 | :1009E000A8F4883709F467C038F4883609F463C07E 160 | :1009F000803709F460C0C9C0883809F4B8C08039AC 161 | :100A000009F45FC0803809F0C0C05BC0803B09F4C6 162 | :100A100086C038F4803A09F466C0883A09F47FC089 163 | :100A2000B4C0803C09F4A7C0883C09F4A4C0883B4A 164 | :100A300009F48AC0AAC08091BE0110C09091BD0186 165 | :100A40008091BC01981770F5E091BD0181E08E0F97 166 | :100A50008093BD01F0E0E456FE4F80818093BB009F 167 | :100A600085EC86C0809398018EC0E091BD0181E045 168 | :100A70008E0F8093BD018091BB00F0E0E456FE4FE5 169 | :100A800080839091BD018091BC016EC0E091BD0159 170 | :100A900081E08E0F8093BD018091BB00F0E0E456B1 171 | :100AA000FE4F808380919B0181116DC081E0809316 172 | :100AB0009A0184EA61C083E08093990110929701C2 173 | :100AC000CFCF80919701803208F051C0E09197011B 174 | :100AD00081E08E0F809397018091BB00F0E0E95890 175 | :100AE000FE4F8083BDCF85EC8093BC0010929901AE 176 | :100AF00080919701803230F4E0919701F0E0E9585D 177 | :100B0000FE4F10826091970170E0E0917501F091C5 178 | :100B1000760187E791E009951092970136C084E04D 179 | :100B2000809399011092740110927301E091710108 180 | :100B3000F0917201099580917301811105C081E0E6 181 | :100B40008093730110925101E091740181E08E0F46 182 | :100B500080937401F0E0EF5AFE4F80818093BB00D8 183 | :100B60009091740180917301981708F479CF85E80A 184 | :100B70008093BC000AC085EC8093BC001092990160 185 | :100B800004C0109298010E944402FF91EF91BF911E 186 | :100B9000AF919F918F917F916F915F914F913F9115 187 | :100BA0002F910F900FBE0F901F901895EAEDF1E076 188 | :100BB0001382128288EE93E0A0E0B0E084839583F4 189 | :100BC000A683B7832AE031E03183208325EC30E02F 190 | :100BD0003587248724EC30E03787268720EC30E007 191 | :100BE000318B208B21EC30E0338B228B22EC30E0F8 192 | :100BF000358B248B26EC30E0378B268B118E128EB2 193 | :100C0000138E148EE7E7F2E01382128284839583B9 194 | :100C1000A683B7838AE191E0918380838EE097EC8D 195 | :100C2000AAE1BFE38093870290938802A093890290 196 | :100C3000B0938A021092830210928402109285026D 197 | :100C4000109286020895CF93DF9300D0CDB7DEB720 198 | :100C5000789484B5826084BD84B5816084BD85B597 199 | :100C6000826085BD85B5816085BD80916E008160A3 200 | :100C700080936E0010928100809181008260809349 201 | :100C8000810080918100816080938100809180004B 202 | :100C90008160809380008091B10084608093B10076 203 | :100CA0008091B00081608093B00080917A00846070 204 | :100CB00080937A0080917A00826080937A0080919C 205 | :100CC0007A00816080937A0080917A0080688093B6 206 | :100CD0007A001092C100E091EA01F091EB0182E00C 207 | :100CE0008083E091E601F091E7011082E091E80154 208 | :100CF000F091E90180E180831092F201E091EE0130 209 | :100D0000F091EF0186E08083E091EC01F091ED013C 210 | :100D1000808180618083E091EC01F091ED01808120 211 | :100D200088608083E091EC01F091ED018081806822 212 | :100D30008083E091EC01F091ED0180818F7D8083D3 213 | :100D400087E391E00E94BB0280E090E00E94FE02F7 214 | :100D500082E491E00E94BB0220918B0230918C02D0 215 | :100D60002115310511F42FE832E0CE010196821BE6 216 | :100D7000930B0E94FE0211E0412C512C90E8692E49 217 | :100D80009FE3792E8091D8019091D901019690939B 218 | :100D9000D9018093D8018091CD018111A1C189E051 219 | :100DA0000E94DF01892B09F490C18091CC0181114F 220 | :100DB000B8C187E00E94DF01892B09F4A7C18091A7 221 | :100DC000CB018111CFC184E00E94DF01892B09F49E 222 | :100DD000BEC18091CA018111E6C182E00E94DF019B 223 | :100DE000892B09F4D5C18091C9018111FDC183E02E 224 | :100DF0000E94DF01892B09F4ECC18091C8018111A7 225 | :100E000014C28AE00E94DF01892B09F403C284E145 226 | :100E10000E9408026C0185E10E9408027C01B60173 227 | :100E2000DD0C880B990B0E94680A20E030E047EF48 228 | :100E300053E40E9453094B015C01B701FF0C880B7E 229 | :100E4000990B0E94680A20E030E84AED53E40E94C2 230 | :100E500053096B017C0120E030E040E251E4C50120 231 | :100E6000B4010E94C00987FF09C020E030E0A90159 232 | :100E7000C501B4010E94180B18169CF020E030E068 233 | :100E800040E251ECC501B4010E94180B181694F40D 234 | :100E900020E030E0A901C501B4010E94C00987FF2C 235 | :100EA00009C01092D2011092D3011092D401109275 236 | :100EB000D50122C020E030E444E054E4C501B4018F 237 | :100EC0000E94180B87FD09C04092D2015092D301B5 238 | :100ED0006092D4017092D5010FC020E030E0A901EA 239 | :100EE000C501B4010E94C5096093D2017093D3017A 240 | :100EF0008093D4019093D50120E030E040E251E4AA 241 | :100F0000C701B6010E94C00987FF09C020E030E098 242 | :100F1000A901C701B6010E94180B18169CF020E029 243 | :100F200030E040E251ECC701B6010E94180B1816E0 244 | :100F300094F420E030E0A901C701B6010E94C00985 245 | :100F400087FF09C01092CE011092CF011092D001FC 246 | :100F50001092D10122C020E030E04CE752E4C701FA 247 | :100F6000B6010E94180B87FD09C04092CE01509235 248 | :100F7000CF016092D0017092D1010FC020E030E02B 249 | :100F8000A901C701B6010E94C5096093CE01709303 250 | :100F9000CF018093D0019093D10182E50E94870018 251 | :100FA0008DE491E00E94BB02C090D601D090D701A1 252 | :100FB0000D2C000CEE08FF08F7FE0CC08DE20E941D 253 | :100FC000870066277727CB016C197D098E099F0959 254 | :100FD0004AE003C04AE0C701B6010E94BD028DE4A9 255 | :100FE00091E00E94BB026091D2017091D301809187 256 | :100FF000D4019091D50142E00E942F038DE491E04D 257 | :101000000E94BB026091CE017091CF018091D0010E 258 | :101010009091D10142E00E942F038DE491E00E9463 259 | :10102000BB0244E060E070E0CB010E942F038DE43E 260 | :1010300091E00E94BB0244E060E070E0CB010E94BE 261 | :101040002F038DE491E00E94BB0244E060E070E079 262 | :10105000CB010E942F038DE491E00E94BB0244E08B 263 | :1010600060E070E0CB010E942F038CE70E948700B4 264 | :1010700086E291E00E94A9020E941F024B015C01DE 265 | :101080008AE0C82ED12CE12CF12C0E941F02DC0139 266 | :10109000CB0188199909AA09BB09883E9340A1058B 267 | :1010A000B10558F021E0C21AD108E108F10888EE34 268 | :1010B000880E83E0981EA11CB11CC114D104E10468 269 | :1010C000F10419F70E947F015DCE1093CD0181E0FC 270 | :1010D0000E94B2018091D6019091D701846011C025 271 | :1010E00089E00E94DF01019709F05FCE80E00E9455 272 | :1010F000B2011092CD018091D6019091D7018B71F0 273 | :1011000099279093D7018093D6014FCE1093CC01AD 274 | :1011100081E00E94B2018091D6019091D701826056 275 | :1011200011C087E00E94DF01019709F048CE80E0FE 276 | :101130000E94B2011092CC018091D6019091D7010A 277 | :101140008D7199279093D7018093D60138CE109353 278 | :10115000CB0181E00E94B2018091D6019091D7012C 279 | :10116000816011C084E00E94DF01019709F031CE57 280 | :1011700080E00E94B2011092CB018091D601909143 281 | :10118000D7018E7199279093D7018093D60121CEF4 282 | :101190001093CA0181E00E94B2018091D601909122 283 | :1011A000D701806111C082E00E94DF01019709F040 284 | :1011B0001ACE80E00E94B2011092CA018091D6013D 285 | :1011C0009091D7018F7099279093D7018093D60182 286 | :1011D0000ACE1093C90181E00E94B2018091D6012C 287 | :1011E0009091D701886011C083E00E94DF010197D0 288 | :1011F00009F003CE80E00E94B2011092C9018091F3 289 | :10120000D6019091D701877199279093D701809348 290 | :10121000D601F3CD1093C80181E00E94B201809104 291 | :10122000D6019091D701806211C08AE00E94DF014F 292 | :10123000019709F0ECCD80E00E94B2011092C80144 293 | :101240008091D6019091D7018F7199279093D70102 294 | :101250008093D601DCCDA1E21A2EAA1BBB1BFD0197 295 | :101260000DC0AA1FBB1FEE1FFF1FA217B307E40785 296 | :10127000F50720F0A21BB30BE40BF50B661F771FDD 297 | :10128000881F991F1A9469F76095709580959095BD 298 | :101290009B01AC01BD01CF010895EE0FFF1F05902A 299 | :1012A000F491E02D09945058BB27AA270E946B099E 300 | :1012B0000C94DE0A0E94D00A38F00E94D70A20F06F 301 | :1012C00039F49F3F19F426F40C94CD0A0EF4E095FE 302 | :1012D000E7FB0C94C70AE92F0E94EF0A58F3BA17EC 303 | :1012E000620773078407950720F079F4A6F50C943C 304 | :1012F000110B0EF4E0950B2EBA2FA02D0B01B901A6 305 | :1013000090010C01CA01A0011124FF27591B99F07B 306 | :10131000593F50F4503E68F11A16F040A22F232F87 307 | :10132000342F4427585FF3CF469537952795A795D7 308 | :10133000F0405395C9F77EF41F16BA0B620B730B7E 309 | :10134000840BBAF09150A1F0FF0FBB1F661F771FEF 310 | :10135000881FC2F70EC0BA0F621F731F841F48F4A4 311 | :10136000879577956795B795F7959E3F08F0B0CF2D 312 | :101370009395880F08F09927EE0F97958795089514 313 | :101380000E94A30A08F481E008950E94D9090C94F0 314 | :10139000DE0A0E94D70A58F00E94D00A40F029F4D1 315 | :1013A0005F3F29F00C94C70A51110C94120B0C9456 316 | :1013B000CD0A0E94EF0A68F39923B1F3552391F304 317 | :1013C000951B550BBB27AA2762177307840738F0B4 318 | :1013D0009F5F5F4F220F331F441FAA1FA9F335D011 319 | :1013E0000E2E3AF0E0E832D091505040E695001CC5 320 | :1013F000CAF72BD0FE2F29D0660F771F881FBB1F7F 321 | :10140000261737074807AB07B0E809F0BB0B802D5C 322 | :10141000BF01FF2793585F4F3AF09E3F510578F088 323 | :101420000C94C70A0C94120B5F3FE4F3983ED4F37C 324 | :10143000869577956795B795F7959F5FC9F7880F5C 325 | :10144000911D9695879597F90895E1E0660F771FAE 326 | :10145000881FBB1F621773078407BA0720F0621B3F 327 | :10146000730B840BBA0BEE1F88F7E09508950E946A 328 | :10147000F70A88F09F5798F0B92F9927B751B0F025 329 | :10148000E1F0660F771F881F991F1AF0BA95C9F708 330 | :1014900014C0B13091F00E94110BB1E008950C948A 331 | :1014A000110B672F782F8827B85F39F0B93FCCF33D 332 | :1014B000869577956795B395D9F73EF49095809585 333 | :1014C000709561957F4F8F4F9F4F0895E89409C0A5 334 | :1014D00097FB3EF490958095709561957F4F8F4F67 335 | :1014E0009F4F9923A9F0F92F96E9BB279395F6957D 336 | :1014F000879577956795B795F111F8CFFAF4BB0FFB 337 | :1015000011F460FF1BC06F5F7F4F8F4F9F4F16C05E 338 | :10151000882311F096E911C0772321F09EE8872FE8 339 | :10152000762F05C0662371F096E8862F70E060E0A4 340 | :101530002AF09A95660F771F881FDAF7880F96951D 341 | :10154000879597F90895990F0008550FAA0BE0E8C1 342 | :10155000FEEF16161706E807F907C0F01216130675 343 | :10156000E407F50798F0621B730B840B950B39F4B5 344 | :101570000A2661F0232B242B252B21F408950A261B 345 | :1015800009F4A140A6958FEF811D811D089597F95B 346 | :101590009F6780E870E060E008959FEF80EC089519 347 | :1015A00000240A9416161706180609060895002442 348 | :1015B0000A9412161306140605060895092E0394BC 349 | :1015C000000C11F4882352F0BB0F40F4BF2B11F430 350 | :1015D00060FF04C06F5F7F4F8F4F9F4F089557FD8F 351 | :1015E0009058440F551F59F05F3F71F04795880F91 352 | :1015F00097FB991F61F09F3F79F087950895121628 353 | :1016000013061406551FF2CF4695F1DF08C01616D3 354 | :1016100017061806991FF1CF869571056105089484 355 | :101620000895E894BB2766277727CB0197F908959B 356 | :101630000E94A30A08F48FEF08950E94300B0C94C7 357 | :10164000DE0A0E94D00A38F00E94D70A20F09523C3 358 | :1016500011F00C94C70A0C94CD0A11240C94120BAF 359 | :101660000E94EF0A70F3959FC1F3950F50E0551F4C 360 | :10167000629FF001729FBB27F00DB11D639FAA27E7 361 | :10168000F00DB11DAA1F649F6627B00DA11D661F36 362 | :10169000829F2227B00DA11D621F739FB00DA11D57 363 | :1016A000621F839FA00D611D221F749F3327A00D11 364 | :1016B000611D231F849F600D211D822F762F6A2FAD 365 | :1016C00011249F5750409AF0F1F088234AF0EE0F12 366 | :1016D000FF1FBB1F661F771F881F91505040A9F73F 367 | :1016E0009E3F510580F00C94C70A0C94120B5F3F8B 368 | :1016F000E4F3983ED4F3869577956795B795F7957B 369 | :10170000E7959F5FC1F7FE2B880F911D96958795F2 370 | :1017100097F908950E94A30A880B990B089581E018 371 | :0C17200090E0F8940C94940BF894FFCF28 372 | :10172C0000008F0280000000000016019200DF0014 373 | :10173C00BD00D1005D0100000000980284027D0212 374 | :10174C007A02770276020D0A006E616E00696E668F 375 | :10175C00006F7666002E004D505520696E69743A04 376 | :10176C00200046726565206D656D3A20003B0000D7 377 | :00000001FF 378 | -------------------------------------------------------------------------------- /SerialVRController_v2/dmpKey.h: -------------------------------------------------------------------------------- 1 | /* 2 | $License: 3 | Copyright (C) 2011 InvenSense Corporation, All Rights Reserved. 4 | $ 5 | */ 6 | #ifndef DMPKEY_H__ 7 | #define DMPKEY_H__ 8 | 9 | #define KEY_CFG_25 (0) 10 | #define KEY_CFG_24 (KEY_CFG_25 + 1) 11 | #define KEY_CFG_26 (KEY_CFG_24 + 1) 12 | #define KEY_CFG_27 (KEY_CFG_26 + 1) 13 | #define KEY_CFG_21 (KEY_CFG_27 + 1) 14 | #define KEY_CFG_20 (KEY_CFG_21 + 1) 15 | #define KEY_CFG_TAP4 (KEY_CFG_20 + 1) 16 | #define KEY_CFG_TAP5 (KEY_CFG_TAP4 + 1) 17 | #define KEY_CFG_TAP6 (KEY_CFG_TAP5 + 1) 18 | #define KEY_CFG_TAP7 (KEY_CFG_TAP6 + 1) 19 | #define KEY_CFG_TAP0 (KEY_CFG_TAP7 + 1) 20 | #define KEY_CFG_TAP1 (KEY_CFG_TAP0 + 1) 21 | #define KEY_CFG_TAP2 (KEY_CFG_TAP1 + 1) 22 | #define KEY_CFG_TAP3 (KEY_CFG_TAP2 + 1) 23 | #define KEY_CFG_TAP_QUANTIZE (KEY_CFG_TAP3 + 1) 24 | #define KEY_CFG_TAP_JERK (KEY_CFG_TAP_QUANTIZE + 1) 25 | #define KEY_CFG_DR_INT (KEY_CFG_TAP_JERK + 1) 26 | #define KEY_CFG_AUTH (KEY_CFG_DR_INT + 1) 27 | #define KEY_CFG_TAP_SAVE_ACCB (KEY_CFG_AUTH + 1) 28 | #define KEY_CFG_TAP_CLEAR_STICKY (KEY_CFG_TAP_SAVE_ACCB + 1) 29 | #define KEY_CFG_FIFO_ON_EVENT (KEY_CFG_TAP_CLEAR_STICKY + 1) 30 | #define KEY_FCFG_ACCEL_INPUT (KEY_CFG_FIFO_ON_EVENT + 1) 31 | #define KEY_FCFG_ACCEL_INIT (KEY_FCFG_ACCEL_INPUT + 1) 32 | #define KEY_CFG_23 (KEY_FCFG_ACCEL_INIT + 1) 33 | #define KEY_FCFG_1 (KEY_CFG_23 + 1) 34 | #define KEY_FCFG_3 (KEY_FCFG_1 + 1) 35 | #define KEY_FCFG_2 (KEY_FCFG_3 + 1) 36 | #define KEY_CFG_3D (KEY_FCFG_2 + 1) 37 | #define KEY_CFG_3B (KEY_CFG_3D + 1) 38 | #define KEY_CFG_3C (KEY_CFG_3B + 1) 39 | #define KEY_FCFG_5 (KEY_CFG_3C + 1) 40 | #define KEY_FCFG_4 (KEY_FCFG_5 + 1) 41 | #define KEY_FCFG_7 (KEY_FCFG_4 + 1) 42 | #define KEY_FCFG_FSCALE (KEY_FCFG_7 + 1) 43 | #define KEY_FCFG_AZ (KEY_FCFG_FSCALE + 1) 44 | #define KEY_FCFG_6 (KEY_FCFG_AZ + 1) 45 | #define KEY_FCFG_LSB4 (KEY_FCFG_6 + 1) 46 | #define KEY_CFG_12 (KEY_FCFG_LSB4 + 1) 47 | #define KEY_CFG_14 (KEY_CFG_12 + 1) 48 | #define KEY_CFG_15 (KEY_CFG_14 + 1) 49 | #define KEY_CFG_16 (KEY_CFG_15 + 1) 50 | #define KEY_CFG_18 (KEY_CFG_16 + 1) 51 | #define KEY_CFG_6 (KEY_CFG_18 + 1) 52 | #define KEY_CFG_7 (KEY_CFG_6 + 1) 53 | #define KEY_CFG_4 (KEY_CFG_7 + 1) 54 | #define KEY_CFG_5 (KEY_CFG_4 + 1) 55 | #define KEY_CFG_2 (KEY_CFG_5 + 1) 56 | #define KEY_CFG_3 (KEY_CFG_2 + 1) 57 | #define KEY_CFG_1 (KEY_CFG_3 + 1) 58 | #define KEY_CFG_EXTERNAL (KEY_CFG_1 + 1) 59 | #define KEY_CFG_8 (KEY_CFG_EXTERNAL + 1) 60 | #define KEY_CFG_9 (KEY_CFG_8 + 1) 61 | #define KEY_CFG_ORIENT_3 (KEY_CFG_9 + 1) 62 | #define KEY_CFG_ORIENT_2 (KEY_CFG_ORIENT_3 + 1) 63 | #define KEY_CFG_ORIENT_1 (KEY_CFG_ORIENT_2 + 1) 64 | #define KEY_CFG_GYRO_SOURCE (KEY_CFG_ORIENT_1 + 1) 65 | #define KEY_CFG_ORIENT_IRQ_1 (KEY_CFG_GYRO_SOURCE + 1) 66 | #define KEY_CFG_ORIENT_IRQ_2 (KEY_CFG_ORIENT_IRQ_1 + 1) 67 | #define KEY_CFG_ORIENT_IRQ_3 (KEY_CFG_ORIENT_IRQ_2 + 1) 68 | #define KEY_FCFG_MAG_VAL (KEY_CFG_ORIENT_IRQ_3 + 1) 69 | #define KEY_FCFG_MAG_MOV (KEY_FCFG_MAG_VAL + 1) 70 | #define KEY_CFG_LP_QUAT (KEY_FCFG_MAG_MOV + 1) 71 | 72 | /* MPU6050 keys */ 73 | #define KEY_CFG_ACCEL_FILTER (KEY_CFG_LP_QUAT + 1) 74 | #define KEY_CFG_MOTION_BIAS (KEY_CFG_ACCEL_FILTER + 1) 75 | #define KEY_TEMPLABEL (KEY_CFG_MOTION_BIAS + 1) 76 | 77 | #define KEY_D_0_22 (KEY_TEMPLABEL + 1) 78 | #define KEY_D_0_24 (KEY_D_0_22 + 1) 79 | #define KEY_D_0_36 (KEY_D_0_24 + 1) 80 | #define KEY_D_0_52 (KEY_D_0_36 + 1) 81 | #define KEY_D_0_96 (KEY_D_0_52 + 1) 82 | #define KEY_D_0_104 (KEY_D_0_96 + 1) 83 | #define KEY_D_0_108 (KEY_D_0_104 + 1) 84 | #define KEY_D_0_163 (KEY_D_0_108 + 1) 85 | #define KEY_D_0_188 (KEY_D_0_163 + 1) 86 | #define KEY_D_0_192 (KEY_D_0_188 + 1) 87 | #define KEY_D_0_224 (KEY_D_0_192 + 1) 88 | #define KEY_D_0_228 (KEY_D_0_224 + 1) 89 | #define KEY_D_0_232 (KEY_D_0_228 + 1) 90 | #define KEY_D_0_236 (KEY_D_0_232 + 1) 91 | 92 | #define KEY_DMP_PREVPTAT (KEY_D_0_236 + 1) 93 | #define KEY_D_1_2 (KEY_DMP_PREVPTAT + 1) 94 | #define KEY_D_1_4 (KEY_D_1_2 + 1) 95 | #define KEY_D_1_8 (KEY_D_1_4 + 1) 96 | #define KEY_D_1_10 (KEY_D_1_8 + 1) 97 | #define KEY_D_1_24 (KEY_D_1_10 + 1) 98 | #define KEY_D_1_28 (KEY_D_1_24 + 1) 99 | #define KEY_D_1_36 (KEY_D_1_28 + 1) 100 | #define KEY_D_1_40 (KEY_D_1_36 + 1) 101 | #define KEY_D_1_44 (KEY_D_1_40 + 1) 102 | #define KEY_D_1_72 (KEY_D_1_44 + 1) 103 | #define KEY_D_1_74 (KEY_D_1_72 + 1) 104 | #define KEY_D_1_79 (KEY_D_1_74 + 1) 105 | #define KEY_D_1_88 (KEY_D_1_79 + 1) 106 | #define KEY_D_1_90 (KEY_D_1_88 + 1) 107 | #define KEY_D_1_92 (KEY_D_1_90 + 1) 108 | #define KEY_D_1_96 (KEY_D_1_92 + 1) 109 | #define KEY_D_1_98 (KEY_D_1_96 + 1) 110 | #define KEY_D_1_100 (KEY_D_1_98 + 1) 111 | #define KEY_D_1_106 (KEY_D_1_100 + 1) 112 | #define KEY_D_1_108 (KEY_D_1_106 + 1) 113 | #define KEY_D_1_112 (KEY_D_1_108 + 1) 114 | #define KEY_D_1_128 (KEY_D_1_112 + 1) 115 | #define KEY_D_1_152 (KEY_D_1_128 + 1) 116 | #define KEY_D_1_160 (KEY_D_1_152 + 1) 117 | #define KEY_D_1_168 (KEY_D_1_160 + 1) 118 | #define KEY_D_1_175 (KEY_D_1_168 + 1) 119 | #define KEY_D_1_176 (KEY_D_1_175 + 1) 120 | #define KEY_D_1_178 (KEY_D_1_176 + 1) 121 | #define KEY_D_1_179 (KEY_D_1_178 + 1) 122 | #define KEY_D_1_218 (KEY_D_1_179 + 1) 123 | #define KEY_D_1_232 (KEY_D_1_218 + 1) 124 | #define KEY_D_1_236 (KEY_D_1_232 + 1) 125 | #define KEY_D_1_240 (KEY_D_1_236 + 1) 126 | #define KEY_D_1_244 (KEY_D_1_240 + 1) 127 | #define KEY_D_1_250 (KEY_D_1_244 + 1) 128 | #define KEY_D_1_252 (KEY_D_1_250 + 1) 129 | #define KEY_D_2_12 (KEY_D_1_252 + 1) 130 | #define KEY_D_2_96 (KEY_D_2_12 + 1) 131 | #define KEY_D_2_108 (KEY_D_2_96 + 1) 132 | #define KEY_D_2_208 (KEY_D_2_108 + 1) 133 | #define KEY_FLICK_MSG (KEY_D_2_208 + 1) 134 | #define KEY_FLICK_COUNTER (KEY_FLICK_MSG + 1) 135 | #define KEY_FLICK_LOWER (KEY_FLICK_COUNTER + 1) 136 | #define KEY_CFG_FLICK_IN (KEY_FLICK_LOWER + 1) 137 | #define KEY_FLICK_UPPER (KEY_CFG_FLICK_IN + 1) 138 | #define KEY_CGNOTICE_INTR (KEY_FLICK_UPPER + 1) 139 | #define KEY_D_2_224 (KEY_CGNOTICE_INTR + 1) 140 | #define KEY_D_2_244 (KEY_D_2_224 + 1) 141 | #define KEY_D_2_248 (KEY_D_2_244 + 1) 142 | #define KEY_D_2_252 (KEY_D_2_248 + 1) 143 | 144 | #define KEY_D_GYRO_BIAS_X (KEY_D_2_252 + 1) 145 | #define KEY_D_GYRO_BIAS_Y (KEY_D_GYRO_BIAS_X + 1) 146 | #define KEY_D_GYRO_BIAS_Z (KEY_D_GYRO_BIAS_Y + 1) 147 | #define KEY_D_ACC_BIAS_X (KEY_D_GYRO_BIAS_Z + 1) 148 | #define KEY_D_ACC_BIAS_Y (KEY_D_ACC_BIAS_X + 1) 149 | #define KEY_D_ACC_BIAS_Z (KEY_D_ACC_BIAS_Y + 1) 150 | #define KEY_D_GYRO_ENABLE (KEY_D_ACC_BIAS_Z + 1) 151 | #define KEY_D_ACCEL_ENABLE (KEY_D_GYRO_ENABLE + 1) 152 | #define KEY_D_QUAT_ENABLE (KEY_D_ACCEL_ENABLE +1) 153 | #define KEY_D_OUTPUT_ENABLE (KEY_D_QUAT_ENABLE + 1) 154 | #define KEY_D_CR_TIME_G (KEY_D_OUTPUT_ENABLE + 1) 155 | #define KEY_D_CR_TIME_A (KEY_D_CR_TIME_G + 1) 156 | #define KEY_D_CR_TIME_Q (KEY_D_CR_TIME_A + 1) 157 | #define KEY_D_CS_TAX (KEY_D_CR_TIME_Q + 1) 158 | #define KEY_D_CS_TAY (KEY_D_CS_TAX + 1) 159 | #define KEY_D_CS_TAZ (KEY_D_CS_TAY + 1) 160 | #define KEY_D_CS_TGX (KEY_D_CS_TAZ + 1) 161 | #define KEY_D_CS_TGY (KEY_D_CS_TGX + 1) 162 | #define KEY_D_CS_TGZ (KEY_D_CS_TGY + 1) 163 | #define KEY_D_CS_TQ0 (KEY_D_CS_TGZ + 1) 164 | #define KEY_D_CS_TQ1 (KEY_D_CS_TQ0 + 1) 165 | #define KEY_D_CS_TQ2 (KEY_D_CS_TQ1 + 1) 166 | #define KEY_D_CS_TQ3 (KEY_D_CS_TQ2 + 1) 167 | 168 | /* Compass keys */ 169 | #define KEY_CPASS_BIAS_X (KEY_D_CS_TQ3 + 1) 170 | #define KEY_CPASS_BIAS_Y (KEY_CPASS_BIAS_X + 1) 171 | #define KEY_CPASS_BIAS_Z (KEY_CPASS_BIAS_Y + 1) 172 | #define KEY_CPASS_MTX_00 (KEY_CPASS_BIAS_Z + 1) 173 | #define KEY_CPASS_MTX_01 (KEY_CPASS_MTX_00 + 1) 174 | #define KEY_CPASS_MTX_02 (KEY_CPASS_MTX_01 + 1) 175 | #define KEY_CPASS_MTX_10 (KEY_CPASS_MTX_02 + 1) 176 | #define KEY_CPASS_MTX_11 (KEY_CPASS_MTX_10 + 1) 177 | #define KEY_CPASS_MTX_12 (KEY_CPASS_MTX_11 + 1) 178 | #define KEY_CPASS_MTX_20 (KEY_CPASS_MTX_12 + 1) 179 | #define KEY_CPASS_MTX_21 (KEY_CPASS_MTX_20 + 1) 180 | #define KEY_CPASS_MTX_22 (KEY_CPASS_MTX_21 + 1) 181 | 182 | /* Gesture Keys */ 183 | #define KEY_DMP_TAPW_MIN (KEY_CPASS_MTX_22 + 1) 184 | #define KEY_DMP_TAP_THR_X (KEY_DMP_TAPW_MIN + 1) 185 | #define KEY_DMP_TAP_THR_Y (KEY_DMP_TAP_THR_X + 1) 186 | #define KEY_DMP_TAP_THR_Z (KEY_DMP_TAP_THR_Y + 1) 187 | #define KEY_DMP_SH_TH_Y (KEY_DMP_TAP_THR_Z + 1) 188 | #define KEY_DMP_SH_TH_X (KEY_DMP_SH_TH_Y + 1) 189 | #define KEY_DMP_SH_TH_Z (KEY_DMP_SH_TH_X + 1) 190 | #define KEY_DMP_ORIENT (KEY_DMP_SH_TH_Z + 1) 191 | #define KEY_D_ACT0 (KEY_DMP_ORIENT + 1) 192 | #define KEY_D_ACSX (KEY_D_ACT0 + 1) 193 | #define KEY_D_ACSY (KEY_D_ACSX + 1) 194 | #define KEY_D_ACSZ (KEY_D_ACSY + 1) 195 | 196 | #define KEY_X_GRT_Y_TMP (KEY_D_ACSZ + 1) 197 | #define KEY_SKIP_X_GRT_Y_TMP (KEY_X_GRT_Y_TMP + 1) 198 | #define KEY_SKIP_END_COMPARE (KEY_SKIP_X_GRT_Y_TMP + 1) 199 | #define KEY_END_COMPARE_Y_X_TMP2 (KEY_SKIP_END_COMPARE + 1) 200 | #define KEY_CFG_ANDROID_ORIENT_INT (KEY_END_COMPARE_Y_X_TMP2 + 1) 201 | #define KEY_NO_ORIENT_INTERRUPT (KEY_CFG_ANDROID_ORIENT_INT + 1) 202 | #define KEY_END_COMPARE_Y_X_TMP (KEY_NO_ORIENT_INTERRUPT + 1) 203 | #define KEY_END_ORIENT_1 (KEY_END_COMPARE_Y_X_TMP + 1) 204 | #define KEY_END_COMPARE_Y_X (KEY_END_ORIENT_1 + 1) 205 | #define KEY_END_ORIENT (KEY_END_COMPARE_Y_X + 1) 206 | #define KEY_X_GRT_Y (KEY_END_ORIENT + 1) 207 | #define KEY_NOT_TIME_MINUS_1 (KEY_X_GRT_Y + 1) 208 | #define KEY_END_COMPARE_Y_X_TMP3 (KEY_NOT_TIME_MINUS_1 + 1) 209 | #define KEY_X_GRT_Y_TMP2 (KEY_END_COMPARE_Y_X_TMP3 + 1) 210 | 211 | /* Authenticate Keys */ 212 | #define KEY_D_AUTH_OUT (KEY_X_GRT_Y_TMP2 + 1) 213 | #define KEY_D_AUTH_IN (KEY_D_AUTH_OUT + 1) 214 | #define KEY_D_AUTH_A (KEY_D_AUTH_IN + 1) 215 | #define KEY_D_AUTH_B (KEY_D_AUTH_A + 1) 216 | 217 | /* Pedometer standalone only keys */ 218 | #define KEY_D_PEDSTD_BP_B (KEY_D_AUTH_B + 1) 219 | #define KEY_D_PEDSTD_HP_A (KEY_D_PEDSTD_BP_B + 1) 220 | #define KEY_D_PEDSTD_HP_B (KEY_D_PEDSTD_HP_A + 1) 221 | #define KEY_D_PEDSTD_BP_A4 (KEY_D_PEDSTD_HP_B + 1) 222 | #define KEY_D_PEDSTD_BP_A3 (KEY_D_PEDSTD_BP_A4 + 1) 223 | #define KEY_D_PEDSTD_BP_A2 (KEY_D_PEDSTD_BP_A3 + 1) 224 | #define KEY_D_PEDSTD_BP_A1 (KEY_D_PEDSTD_BP_A2 + 1) 225 | #define KEY_D_PEDSTD_INT_THRSH (KEY_D_PEDSTD_BP_A1 + 1) 226 | #define KEY_D_PEDSTD_CLIP (KEY_D_PEDSTD_INT_THRSH + 1) 227 | #define KEY_D_PEDSTD_SB (KEY_D_PEDSTD_CLIP + 1) 228 | #define KEY_D_PEDSTD_SB_TIME (KEY_D_PEDSTD_SB + 1) 229 | #define KEY_D_PEDSTD_PEAKTHRSH (KEY_D_PEDSTD_SB_TIME + 1) 230 | #define KEY_D_PEDSTD_TIML (KEY_D_PEDSTD_PEAKTHRSH + 1) 231 | #define KEY_D_PEDSTD_TIMH (KEY_D_PEDSTD_TIML + 1) 232 | #define KEY_D_PEDSTD_PEAK (KEY_D_PEDSTD_TIMH + 1) 233 | #define KEY_D_PEDSTD_TIMECTR (KEY_D_PEDSTD_PEAK + 1) 234 | #define KEY_D_PEDSTD_STEPCTR (KEY_D_PEDSTD_TIMECTR + 1) 235 | #define KEY_D_PEDSTD_WALKTIME (KEY_D_PEDSTD_STEPCTR + 1) 236 | #define KEY_D_PEDSTD_DECI (KEY_D_PEDSTD_WALKTIME + 1) 237 | 238 | /*Host Based No Motion*/ 239 | #define KEY_D_HOST_NO_MOT (KEY_D_PEDSTD_DECI + 1) 240 | 241 | /* EIS keys */ 242 | #define KEY_P_EIS_FIFO_FOOTER (KEY_D_HOST_NO_MOT + 1) 243 | #define KEY_P_EIS_FIFO_YSHIFT (KEY_P_EIS_FIFO_FOOTER + 1) 244 | #define KEY_P_EIS_DATA_RATE (KEY_P_EIS_FIFO_YSHIFT + 1) 245 | #define KEY_P_EIS_FIFO_XSHIFT (KEY_P_EIS_DATA_RATE + 1) 246 | #define KEY_P_EIS_FIFO_SYNC (KEY_P_EIS_FIFO_XSHIFT + 1) 247 | #define KEY_P_EIS_FIFO_ZSHIFT (KEY_P_EIS_FIFO_SYNC + 1) 248 | #define KEY_P_EIS_FIFO_READY (KEY_P_EIS_FIFO_ZSHIFT + 1) 249 | #define KEY_DMP_FOOTER (KEY_P_EIS_FIFO_READY + 1) 250 | #define KEY_DMP_INTX_HC (KEY_DMP_FOOTER + 1) 251 | #define KEY_DMP_INTX_PH (KEY_DMP_INTX_HC + 1) 252 | #define KEY_DMP_INTX_SH (KEY_DMP_INTX_PH + 1) 253 | #define KEY_DMP_AINV_SH (KEY_DMP_INTX_SH + 1) 254 | #define KEY_DMP_A_INV_XH (KEY_DMP_AINV_SH + 1) 255 | #define KEY_DMP_AINV_PH (KEY_DMP_A_INV_XH + 1) 256 | #define KEY_DMP_CTHX_H (KEY_DMP_AINV_PH + 1) 257 | #define KEY_DMP_CTHY_H (KEY_DMP_CTHX_H + 1) 258 | #define KEY_DMP_CTHZ_H (KEY_DMP_CTHY_H + 1) 259 | #define KEY_DMP_NCTHX_H (KEY_DMP_CTHZ_H + 1) 260 | #define KEY_DMP_NCTHY_H (KEY_DMP_NCTHX_H + 1) 261 | #define KEY_DMP_NCTHZ_H (KEY_DMP_NCTHY_H + 1) 262 | #define KEY_DMP_CTSQ_XH (KEY_DMP_NCTHZ_H + 1) 263 | #define KEY_DMP_CTSQ_YH (KEY_DMP_CTSQ_XH + 1) 264 | #define KEY_DMP_CTSQ_ZH (KEY_DMP_CTSQ_YH + 1) 265 | #define KEY_DMP_INTX_H (KEY_DMP_CTSQ_ZH + 1) 266 | #define KEY_DMP_INTY_H (KEY_DMP_INTX_H + 1) 267 | #define KEY_DMP_INTZ_H (KEY_DMP_INTY_H + 1) 268 | //#define KEY_DMP_HPX_H (KEY_DMP_INTZ_H + 1) 269 | //#define KEY_DMP_HPY_H (KEY_DMP_HPX_H + 1) 270 | //#define KEY_DMP_HPZ_H (KEY_DMP_HPY_H + 1) 271 | 272 | /* Stream keys */ 273 | #define KEY_STREAM_P_GYRO_Z (KEY_DMP_INTZ_H + 1) 274 | #define KEY_STREAM_P_GYRO_Y (KEY_STREAM_P_GYRO_Z + 1) 275 | #define KEY_STREAM_P_GYRO_X (KEY_STREAM_P_GYRO_Y + 1) 276 | #define KEY_STREAM_P_TEMP (KEY_STREAM_P_GYRO_X + 1) 277 | #define KEY_STREAM_P_AUX_Y (KEY_STREAM_P_TEMP + 1) 278 | #define KEY_STREAM_P_AUX_X (KEY_STREAM_P_AUX_Y + 1) 279 | #define KEY_STREAM_P_AUX_Z (KEY_STREAM_P_AUX_X + 1) 280 | #define KEY_STREAM_P_ACCEL_Y (KEY_STREAM_P_AUX_Z + 1) 281 | #define KEY_STREAM_P_ACCEL_X (KEY_STREAM_P_ACCEL_Y + 1) 282 | #define KEY_STREAM_P_FOOTER (KEY_STREAM_P_ACCEL_X + 1) 283 | #define KEY_STREAM_P_ACCEL_Z (KEY_STREAM_P_FOOTER + 1) 284 | 285 | #define NUM_KEYS (KEY_STREAM_P_ACCEL_Z + 1) 286 | 287 | typedef struct 288 | { 289 | unsigned short key; 290 | unsigned short addr; 291 | } tKeyLabel; 292 | 293 | #define DINA0A 0x0a 294 | #define DINA22 0x22 295 | #define DINA42 0x42 296 | #define DINA5A 0x5a 297 | 298 | #define DINA06 0x06 299 | #define DINA0E 0x0e 300 | #define DINA16 0x16 301 | #define DINA1E 0x1e 302 | #define DINA26 0x26 303 | #define DINA2E 0x2e 304 | #define DINA36 0x36 305 | #define DINA3E 0x3e 306 | #define DINA46 0x46 307 | #define DINA4E 0x4e 308 | #define DINA56 0x56 309 | #define DINA5E 0x5e 310 | #define DINA66 0x66 311 | #define DINA6E 0x6e 312 | #define DINA76 0x76 313 | #define DINA7E 0x7e 314 | 315 | #define DINA00 0x00 316 | #define DINA08 0x08 317 | #define DINA10 0x10 318 | #define DINA18 0x18 319 | #define DINA20 0x20 320 | #define DINA28 0x28 321 | #define DINA30 0x30 322 | #define DINA38 0x38 323 | #define DINA40 0x40 324 | #define DINA48 0x48 325 | #define DINA50 0x50 326 | #define DINA58 0x58 327 | #define DINA60 0x60 328 | #define DINA68 0x68 329 | #define DINA70 0x70 330 | #define DINA78 0x78 331 | 332 | #define DINA04 0x04 333 | #define DINA0C 0x0c 334 | #define DINA14 0x14 335 | #define DINA1C 0x1C 336 | #define DINA24 0x24 337 | #define DINA2C 0x2c 338 | #define DINA34 0x34 339 | #define DINA3C 0x3c 340 | #define DINA44 0x44 341 | #define DINA4C 0x4c 342 | #define DINA54 0x54 343 | #define DINA5C 0x5c 344 | #define DINA64 0x64 345 | #define DINA6C 0x6c 346 | #define DINA74 0x74 347 | #define DINA7C 0x7c 348 | 349 | #define DINA01 0x01 350 | #define DINA09 0x09 351 | #define DINA11 0x11 352 | #define DINA19 0x19 353 | #define DINA21 0x21 354 | #define DINA29 0x29 355 | #define DINA31 0x31 356 | #define DINA39 0x39 357 | #define DINA41 0x41 358 | #define DINA49 0x49 359 | #define DINA51 0x51 360 | #define DINA59 0x59 361 | #define DINA61 0x61 362 | #define DINA69 0x69 363 | #define DINA71 0x71 364 | #define DINA79 0x79 365 | 366 | #define DINA25 0x25 367 | #define DINA2D 0x2d 368 | #define DINA35 0x35 369 | #define DINA3D 0x3d 370 | #define DINA4D 0x4d 371 | #define DINA55 0x55 372 | #define DINA5D 0x5D 373 | #define DINA6D 0x6d 374 | #define DINA75 0x75 375 | #define DINA7D 0x7d 376 | 377 | #define DINADC 0xdc 378 | #define DINAF2 0xf2 379 | #define DINAAB 0xab 380 | #define DINAAA 0xaa 381 | #define DINAF1 0xf1 382 | #define DINADF 0xdf 383 | #define DINADA 0xda 384 | #define DINAB1 0xb1 385 | #define DINAB9 0xb9 386 | #define DINAF3 0xf3 387 | #define DINA8B 0x8b 388 | #define DINAA3 0xa3 389 | #define DINA91 0x91 390 | #define DINAB6 0xb6 391 | #define DINAB4 0xb4 392 | 393 | 394 | #define DINC00 0x00 395 | #define DINC01 0x01 396 | #define DINC02 0x02 397 | #define DINC03 0x03 398 | #define DINC08 0x08 399 | #define DINC09 0x09 400 | #define DINC0A 0x0a 401 | #define DINC0B 0x0b 402 | #define DINC10 0x10 403 | #define DINC11 0x11 404 | #define DINC12 0x12 405 | #define DINC13 0x13 406 | #define DINC18 0x18 407 | #define DINC19 0x19 408 | #define DINC1A 0x1a 409 | #define DINC1B 0x1b 410 | 411 | #define DINC20 0x20 412 | #define DINC21 0x21 413 | #define DINC22 0x22 414 | #define DINC23 0x23 415 | #define DINC28 0x28 416 | #define DINC29 0x29 417 | #define DINC2A 0x2a 418 | #define DINC2B 0x2b 419 | #define DINC30 0x30 420 | #define DINC31 0x31 421 | #define DINC32 0x32 422 | #define DINC33 0x33 423 | #define DINC38 0x38 424 | #define DINC39 0x39 425 | #define DINC3A 0x3a 426 | #define DINC3B 0x3b 427 | 428 | #define DINC40 0x40 429 | #define DINC41 0x41 430 | #define DINC42 0x42 431 | #define DINC43 0x43 432 | #define DINC48 0x48 433 | #define DINC49 0x49 434 | #define DINC4A 0x4a 435 | #define DINC4B 0x4b 436 | #define DINC50 0x50 437 | #define DINC51 0x51 438 | #define DINC52 0x52 439 | #define DINC53 0x53 440 | #define DINC58 0x58 441 | #define DINC59 0x59 442 | #define DINC5A 0x5a 443 | #define DINC5B 0x5b 444 | 445 | #define DINC60 0x60 446 | #define DINC61 0x61 447 | #define DINC62 0x62 448 | #define DINC63 0x63 449 | #define DINC68 0x68 450 | #define DINC69 0x69 451 | #define DINC6A 0x6a 452 | #define DINC6B 0x6b 453 | #define DINC70 0x70 454 | #define DINC71 0x71 455 | #define DINC72 0x72 456 | #define DINC73 0x73 457 | #define DINC78 0x78 458 | #define DINC79 0x79 459 | #define DINC7A 0x7a 460 | #define DINC7B 0x7b 461 | 462 | #define DIND40 0x40 463 | 464 | 465 | #define DINA80 0x80 466 | #define DINA90 0x90 467 | #define DINAA0 0xa0 468 | #define DINAC9 0xc9 469 | #define DINACB 0xcb 470 | #define DINACD 0xcd 471 | #define DINACF 0xcf 472 | #define DINAC8 0xc8 473 | #define DINACA 0xca 474 | #define DINACC 0xcc 475 | #define DINACE 0xce 476 | #define DINAD8 0xd8 477 | #define DINADD 0xdd 478 | #define DINAF8 0xf0 479 | #define DINAFE 0xfe 480 | 481 | #define DINBF8 0xf8 482 | #define DINAC0 0xb0 483 | #define DINAC1 0xb1 484 | #define DINAC2 0xb4 485 | #define DINAC3 0xb5 486 | #define DINAC4 0xb8 487 | #define DINAC5 0xb9 488 | #define DINBC0 0xc0 489 | #define DINBC2 0xc2 490 | #define DINBC4 0xc4 491 | #define DINBC6 0xc6 492 | 493 | 494 | 495 | #endif // DMPKEY_H__ 496 | -------------------------------------------------------------------------------- /SerialVRController_v2/SerialVRController_v2.ino.with_bootloader.eightanaloginputs.hex: -------------------------------------------------------------------------------- 1 | :100000000C945D000C9485000C9485000C94850084 2 | :100010000C9485000C9485000C9485000C9485004C 3 | :100020000C9485000C9485000C9485000C9485003C 4 | :100030000C9485000C9485000C9485000C9485002C 5 | :100040000C945E040C9485000C942C040C9406040F 6 | :100050000C9485000C9485000C9485000C9485000C 7 | :100060000C94A8040C9485000000000023002600D6 8 | :10007000290000000000250028002B0004040404CF 9 | :100080000404040402020202020203030303030342 10 | :10009000010204081020408001020408102001021F 11 | :1000A00004081020000000080002010000030407FB 12 | :1000B0000000000000000000D60511241FBECFEF95 13 | :1000C000D8E0DEBFCDBF11E0A0E0B1E0ECE2F7E1A7 14 | :1000D00002C005900D92A035B107D9F722E0A0E546 15 | :1000E000B1E001C01D92AF38B207E1F710E0CDE5F5 16 | :1000F000D0E004C02197FE010E944D09CC35D10704 17 | :10010000C9F70E9423060C94940B0C940000E09114 18 | :10011000DA01F091DB010190F081E02D682F8AED8A 19 | :1001200091E00994CF92DF92EF92FF920F931F9389 20 | :10013000CF93DF936C017A018B01C0E0D0E0CE1544 21 | :10014000DF0589F0D8016D918D01D601ED91FC910B 22 | :100150000190F081E02DC6010995892B11F47E01F3 23 | :1001600002C02196ECCFC701DF91CF911F910F9173 24 | :10017000FF90EF90DF90CF900895FC01918D828DDC 25 | :10018000981761F0828DDF01A80FB11D5D968C91EB 26 | :10019000928D9F5F9F73928F90E008958FEF9FEFF6 27 | :1001A0000895FC01918D828D981731F0828DE80FB2 28 | :1001B000F11D858D90E008958FEF9FEF0895FC016C 29 | :1001C000918D228D892F90E0805C9F4F821B910939 30 | :1001D0008F73992708958AED91E00E94DF0021E056 31 | :1001E000892B09F420E0822F0895FC01848DDF0122 32 | :1001F000A80FB11DA35ABF4F2C91848D90E001969A 33 | :100200008F739927848FA689B7892C93A089B18988 34 | :100210008C9180648C93938D848D981306C0028892 35 | :10022000F389E02D80818F7D80830895EF92FF9286 36 | :100230000F931F93CF93DF93EC0181E0888F9B8D09 37 | :100240008C8D981305C0E889F989808185FD24C0CB 38 | :10025000F62E0B8D10E00F5F1F4F0F731127E02E4E 39 | :100260008C8DE8120CC00FB607FCFACFE889F9892B 40 | :10027000808185FFF5CFCE010E94F500F1CF8B8DF7 41 | :10028000FE01E80FF11DE35AFF4FF0820B8FEA8960 42 | :10029000FB898081806207C0EE89FF896083E889DD 43 | :1002A000F98980818064808381E090E0DF91CF9143 44 | :1002B0001F910F91FF90EF900895CF93DF93EC0182 45 | :1002C000888D8823C9F0EA89FB89808185FD05C076 46 | :1002D000A889B9898C9186FD0FC00FB607FCF5CFB0 47 | :1002E000808185FFF2CFA889B9898C9185FFEDCFF8 48 | :1002F000CE010E94F500E7CFDF91CF91089580E015 49 | :1003000090E0892B29F00E94EB0081110C940000F1 50 | :100310000895833081F028F4813099F08230A1F083 51 | :1003200008958730A9F08830B9F08430D1F48091F5 52 | :1003300080008F7D03C0809180008F778093800044 53 | :10034000089584B58F7702C084B58F7D84BD0895EC 54 | :100350008091B0008F7703C08091B0008F7D809333 55 | :10036000B00008951F93CF93DF93E1EBF0E09491F9 56 | :10037000EDE9F0E0D491E9E8F0E0C491CC23D9F0C4 57 | :10038000182F992319F0892F0E948901EC2FF0E092 58 | :10039000EE0FFF1FEE58FF4FA591B4918FB7F89461 59 | :1003A000111105C09C91ED2FE095E92302C0EC915D 60 | :1003B000ED2BEC938FBFDF91CF911F910895CF93D9 61 | :1003C000DF93282F30E0F901EC55FF4F8491F901BC 62 | :1003D000E057FF4FD491F901E458FF4FC491CC236B 63 | :1003E00091F081110E948901EC2FF0E0EE0FFF1FC8 64 | :1003F000E859FF4FA591B491EC91ED2381E090E095 65 | :1004000021F480E002C080E090E0DF91CF91089578 66 | :100410008E3008F08E508770806480937C008091CD 67 | :100420007A00806480937A0080917A0086FDFCCF08 68 | :10043000809178002091790090E0922B08953FB749 69 | :10044000F8948091C4019091C501A091C601B0912A 70 | :10045000C70126B5A89B05C02F3F19F00196A11D25 71 | :10046000B11D3FBFBA2FA92F982F8827820F911D4A 72 | :10047000A11DB11DBC01CD0142E0660F771F881F91 73 | :10048000991F4A95D1F7089585ED8093BC0080911E 74 | :10049000BC0084FDFCCF1092990108954091730136 75 | :1004A000262F30E0240F311D21323105DCF420915C 76 | :1004B00099012430C9F4FC0180E090E0861758F4DB 77 | :1004C000309173012191DC01AF5ABE4FA30FB11DD2 78 | :1004D0002C930196F3CF80917301680F60937301A1 79 | :1004E00080E0089581E0089582E0089508958FEFF7 80 | :1004F0009FEF08958FEF9FEF08958091500190E056 81 | :100500009195819591090895CF93DF9300D0CDB750 82 | :10051000DEB7CB01642F49835A830E944E02498182 83 | :10052000842F5A81952F0F900F90DF91CF910895CE 84 | :10053000CF93DF931F92CDB7DEB7698361E0CE0121 85 | :1005400001960E944E0281E090E00F90DF91CF91E2 86 | :100550000895009769F0FC0101900020E9F73197B8 87 | :10056000AF01481B590BBC018AED91E00C9492003D 88 | :1005700080E090E008950C94A9028F929F92AF9230 89 | :10058000BF920F931F93CF93DF93CDB7DEB7A197A1 90 | :100590000FB6F894DEBF0FBECDBF19A2423008F4EB 91 | :1005A0004AE08E010F5D1F4F842E912CA12CB12C9F 92 | :1005B000A50194010E942B09E62FB901CA0101503F 93 | :1005C0001109EA3014F4E05D01C0E95CD801EC9354 94 | :1005D000232B242B252B61F7C8010E94A902A19689 95 | :1005E0000FB6F894DEBF0FBECDBFDF91CF911F9144 96 | :1005F0000F91BF90AF909F908F900895CF92DF9210 97 | :10060000EF92FF92CF93DF936C01990FEE08FF08F2 98 | :10061000F7FE12C08DE20E948700EC016627772763 99 | :10062000CB016C197D098E099F094AE00E94BD0229 100 | :100630007C01EC0EFD1E06C04AE0C701B6010E9417 101 | :10064000BD027C0186E291E00E94A9028E0D9F1DF1 102 | :10065000DF91CF91FF90EF90DF90CF9008954F9270 103 | :100660005F926F927F928F929F92AF92BF92CF9242 104 | :10067000DF92EF92FF926B017C01B42E9B01AC01E3 105 | :100680000E948A0B882319F089E291E027C0260195 106 | :100690003701E89477F82FEF3FEF4FE75FE7C301AB 107 | :1006A000B2010E948A0B81110DC02FEF3FEF4FE77F 108 | :1006B0005FE7C301B2010E94C00918161CF48DE265 109 | :1006C00091E00CC02FEF3FEF4FE75FE4C701B601A9 110 | :1006D0000E94180B181684F481E391E0FF90EF90CC 111 | :1006E000DF90CF90BF90AF909F908F907F906F9052 112 | :1006F0005F904F900C94A9022FEF3FEF4FE75FEC14 113 | :10070000C701B6010E94C00987FDE6CF20E030E0B6 114 | :10071000A901C701B6010E94C00987FF09C08DE287 115 | :100720000E9487004C01F7FAF094F7F8F09402C0A9 116 | :10073000812C912CA12C60E070E080E09FE3AB1451 117 | :1007400041F020E030E040E251E40E94C509A3946A 118 | :10075000F6CF9B01AC01C701B6010E9454092B01E1 119 | :100760003C010E94370A6B017C010E94660A9B01D2 120 | :10077000AC01C301B2010E9453092B013C014AE0C4 121 | :10078000C701B6010E94BD027C01E80CF91CBB2028 122 | :1007900031F085E391E00E94A902E80EF91EDB2CFE 123 | :1007A000DD2021F120E030E040E251E4C301B2015C 124 | :1007B0000E941D0B2B013C010E94370A4B01A12C0A 125 | :1007C000B12C4AE0C501B4010E94BD02E80EF91E39 126 | :1007D000C501B4010E94660A9B01AC01C301B201CC 127 | :1007E0000E9453092B013C01DA94DACFC701FF9034 128 | :1007F000EF90DF90CF90BF90AF909F908F907F90C1 129 | :100800006F905F904F9008950E948F0B1F920F92F0 130 | :100810000FB60F9211242F933F934F935F936F93D3 131 | :100820007F938F939F93AF93BF93EF93FF938AED43 132 | :1008300091E00E94F500FF91EF91BF91AF919F91E0 133 | :100840008F917F916F915F914F913F912F910F9079 134 | :100850000FBE0F901F9018951F920F920FB60F9218 135 | :1008600011242F938F939F93EF93FF93E091EA01CD 136 | :10087000F091EB018081E091F001F091F10182FDB6 137 | :1008800012C090818091F3018F5F8F732091F401EA 138 | :10089000821751F0E091F301F0E0E652FE4F958FA0 139 | :1008A0008093F30101C08081FF91EF919F918F911F 140 | :1008B0002F910F900FBE0F901F9018951F920F92BF 141 | :1008C0000FB60F9211242F933F938F939F93AF9363 142 | :1008D000BF938091C0019091C101A091C201B091DC 143 | :1008E000C3013091BF0123E0230F2D3720F401967F 144 | :1008F000A11DB11D05C026E8230F0296A11DB11D43 145 | :100900002093BF018093C0019093C101A093C201C5 146 | :10091000B093C3018091C4019091C501A091C6011B 147 | :10092000B091C7010196A11DB11D8093C4019093A0 148 | :10093000C501A093C601B093C701BF91AF919F912C 149 | :100940008F913F912F910F900FBE0F901F90189590 150 | :100950001F920F920FB60F9211242F933F934F9334 151 | :100960005F936F937F938F939F93AF93BF93EF9317 152 | :10097000FF938091B900887F803609F49CC068F5A8 153 | :10098000883209F45BC090F4803109F454C038F423 154 | :10099000882309F4F6C0883009F44DC0F6C08831C8 155 | :1009A00009F44CC0803209F45DC0EFC0803409F412 156 | :1009B00068C048F4803309F455C0883309F0E5C0B5 157 | :1009C00080939801D8C0803509F44FC0883509F468 158 | :1009D0005DC0883409F0D9C0D6C0883909F4C7C0D1 159 | :1009E000A8F4883709F467C038F4883609F463C07E 160 | :1009F000803709F460C0C9C0883809F4B8C08039AC 161 | :100A000009F45FC0803809F0C0C05BC0803B09F4C6 162 | :100A100086C038F4803A09F466C0883A09F47FC089 163 | :100A2000B4C0803C09F4A7C0883C09F4A4C0883B4A 164 | :100A300009F48AC0AAC08091BE0110C09091BD0186 165 | :100A40008091BC01981770F5E091BD0181E08E0F97 166 | :100A50008093BD01F0E0E456FE4F80818093BB009F 167 | :100A600085EC86C0809398018EC0E091BD0181E045 168 | :100A70008E0F8093BD018091BB00F0E0E456FE4FE5 169 | :100A800080839091BD018091BC016EC0E091BD0159 170 | :100A900081E08E0F8093BD018091BB00F0E0E456B1 171 | :100AA000FE4F808380919B0181116DC081E0809316 172 | :100AB0009A0184EA61C083E08093990110929701C2 173 | :100AC000CFCF80919701803208F051C0E09197011B 174 | :100AD00081E08E0F809397018091BB00F0E0E95890 175 | :100AE000FE4F8083BDCF85EC8093BC0010929901AE 176 | :100AF00080919701803230F4E0919701F0E0E9585D 177 | :100B0000FE4F10826091970170E0E0917501F091C5 178 | :100B1000760187E791E009951092970136C084E04D 179 | :100B2000809399011092740110927301E091710108 180 | :100B3000F0917201099580917301811105C081E0E6 181 | :100B40008093730110925101E091740181E08E0F46 182 | :100B500080937401F0E0EF5AFE4F80818093BB00D8 183 | :100B60009091740180917301981708F479CF85E80A 184 | :100B70008093BC000AC085EC8093BC001092990160 185 | :100B800004C0109298010E944402FF91EF91BF911E 186 | :100B9000AF919F918F917F916F915F914F913F9115 187 | :100BA0002F910F900FBE0F901F901895EAEDF1E076 188 | :100BB0001382128288EE93E0A0E0B0E084839583F4 189 | :100BC000A683B7832AE031E03183208325EC30E02F 190 | :100BD0003587248724EC30E03787268720EC30E007 191 | :100BE000318B208B21EC30E0338B228B22EC30E0F8 192 | :100BF000358B248B26EC30E0378B268B118E128EB2 193 | :100C0000138E148EE7E7F2E01382128284839583B9 194 | :100C1000A683B7838AE191E0918380838EE097EC8D 195 | :100C2000AAE1BFE38093870290938802A093890290 196 | :100C3000B0938A021092830210928402109285026D 197 | :100C4000109286020895CF93DF9300D0CDB7DEB720 198 | :100C5000789484B5826084BD84B5816084BD85B597 199 | :100C6000826085BD85B5816085BD80916E008160A3 200 | :100C700080936E0010928100809181008260809349 201 | :100C8000810080918100816080938100809180004B 202 | :100C90008160809380008091B10084608093B10076 203 | :100CA0008091B00081608093B00080917A00846070 204 | :100CB00080937A0080917A00826080937A0080919C 205 | :100CC0007A00816080937A0080917A0080688093B6 206 | :100CD0007A001092C100E091EA01F091EB0182E00C 207 | :100CE0008083E091E601F091E7011082E091E80154 208 | :100CF000F091E90180E180831092F201E091EE0130 209 | :100D0000F091EF0186E08083E091EC01F091ED013C 210 | :100D1000808180618083E091EC01F091ED01808120 211 | :100D200088608083E091EC01F091ED018081806822 212 | :100D30008083E091EC01F091ED0180818F7D8083D3 213 | :100D400087E391E00E94BB0280E090E00E94FE02F7 214 | :100D500082E491E00E94BB0220918B0230918C02D0 215 | :100D60002115310511F42FE832E0CE010196821BE6 216 | :100D7000930B0E94FE0211E0412C512C90E8692E49 217 | :100D80009FE3792E8091D8019091D901019690939B 218 | :100D9000D9018093D8018091CD018111A1C189E051 219 | :100DA0000E94DF01892B09F490C18091CC0181114F 220 | :100DB000B8C187E00E94DF01892B09F4A7C18091A7 221 | :100DC000CB018111CFC184E00E94DF01892B09F49E 222 | :100DD000BEC18091CA018111E6C182E00E94DF019B 223 | :100DE000892B09F4D5C18091C9018111FDC183E02E 224 | :100DF0000E94DF01892B09F4ECC18091C8018111A7 225 | :100E000014C28AE00E94DF01892B09F403C284E145 226 | :100E10000E9408026C0185E10E9408027C01B60173 227 | :100E2000DD0C880B990B0E94680A20E030E047EF48 228 | :100E300053E40E9453094B015C01B701FF0C880B7E 229 | :100E4000990B0E94680A20E030E84AED53E40E94C2 230 | :100E500053096B017C0120E030E040E251E4C50120 231 | :100E6000B4010E94C00987FF09C020E030E0A90159 232 | :100E7000C501B4010E94180B18169CF020E030E068 233 | :100E800040E251ECC501B4010E94180B181694F40D 234 | :100E900020E030E0A901C501B4010E94C00987FF2C 235 | :100EA00009C01092D2011092D3011092D401109275 236 | :100EB000D50122C020E030E444E054E4C501B4018F 237 | :100EC0000E94180B87FD09C04092D2015092D301B5 238 | :100ED0006092D4017092D5010FC020E030E0A901EA 239 | :100EE000C501B4010E94C5096093D2017093D3017A 240 | :100EF0008093D4019093D50120E030E040E251E4AA 241 | :100F0000C701B6010E94C00987FF09C020E030E098 242 | :100F1000A901C701B6010E94180B18169CF020E029 243 | :100F200030E040E251ECC701B6010E94180B1816E0 244 | :100F300094F420E030E0A901C701B6010E94C00985 245 | :100F400087FF09C01092CE011092CF011092D001FC 246 | :100F50001092D10122C020E030E04CE752E4C701FA 247 | :100F6000B6010E94180B87FD09C04092CE01509235 248 | :100F7000CF016092D0017092D1010FC020E030E02B 249 | :100F8000A901C701B6010E94C5096093CE01709303 250 | :100F9000CF018093D0019093D10182E50E94870018 251 | :100FA0008DE491E00E94BB02C090D601D090D701A1 252 | :100FB0000D2C000CEE08FF08F7FE0CC08DE20E941D 253 | :100FC000870066277727CB016C197D098E099F0959 254 | :100FD0004AE003C04AE0C701B6010E94BD028DE4A9 255 | :100FE00091E00E94BB026091D2017091D301809187 256 | :100FF000D4019091D50142E00E942F038DE491E04D 257 | :101000000E94BB026091CE017091CF018091D0010E 258 | :101010009091D10142E00E942F038DE491E00E9463 259 | :10102000BB0244E060E070E0CB010E942F038DE43E 260 | :1010300091E00E94BB0244E060E070E0CB010E94BE 261 | :101040002F038DE491E00E94BB0244E060E070E079 262 | :10105000CB010E942F038DE491E00E94BB0244E08B 263 | :1010600060E070E0CB010E942F038CE70E948700B4 264 | :1010700086E291E00E94A9020E941F024B015C01DE 265 | :101080008AE0C82ED12CE12CF12C0E941F02DC0139 266 | :10109000CB0188199909AA09BB09883E9340A1058B 267 | :1010A000B10558F021E0C21AD108E108F10888EE34 268 | :1010B000880E83E0981EA11CB11CC114D104E10468 269 | :1010C000F10419F70E947F015DCE1093CD0181E0FC 270 | :1010D0000E94B2018091D6019091D701846011C025 271 | :1010E00089E00E94DF01019709F05FCE80E00E9455 272 | :1010F000B2011092CD018091D6019091D7018B71F0 273 | :1011000099279093D7018093D6014FCE1093CC01AD 274 | :1011100081E00E94B2018091D6019091D701826056 275 | :1011200011C087E00E94DF01019709F048CE80E0FE 276 | :101130000E94B2011092CC018091D6019091D7010A 277 | :101140008D7199279093D7018093D60138CE109353 278 | :10115000CB0181E00E94B2018091D6019091D7012C 279 | :10116000816011C084E00E94DF01019709F031CE57 280 | :1011700080E00E94B2011092CB018091D601909143 281 | :10118000D7018E7199279093D7018093D60121CEF4 282 | :101190001093CA0181E00E94B2018091D601909122 283 | :1011A000D701806111C082E00E94DF01019709F040 284 | :1011B0001ACE80E00E94B2011092CA018091D6013D 285 | :1011C0009091D7018F7099279093D7018093D60182 286 | :1011D0000ACE1093C90181E00E94B2018091D6012C 287 | :1011E0009091D701886011C083E00E94DF010197D0 288 | :1011F00009F003CE80E00E94B2011092C9018091F3 289 | :10120000D6019091D701877199279093D701809348 290 | :10121000D601F3CD1093C80181E00E94B201809104 291 | :10122000D6019091D701806211C08AE00E94DF014F 292 | :10123000019709F0ECCD80E00E94B2011092C80144 293 | :101240008091D6019091D7018F7199279093D70102 294 | :101250008093D601DCCDA1E21A2EAA1BBB1BFD0197 295 | :101260000DC0AA1FBB1FEE1FFF1FA217B307E40785 296 | :10127000F50720F0A21BB30BE40BF50B661F771FDD 297 | :10128000881F991F1A9469F76095709580959095BD 298 | :101290009B01AC01BD01CF010895EE0FFF1F05902A 299 | :1012A000F491E02D09945058BB27AA270E946B099E 300 | :1012B0000C94DE0A0E94D00A38F00E94D70A20F06F 301 | :1012C00039F49F3F19F426F40C94CD0A0EF4E095FE 302 | :1012D000E7FB0C94C70AE92F0E94EF0A58F3BA17EC 303 | :1012E000620773078407950720F079F4A6F50C943C 304 | :1012F000110B0EF4E0950B2EBA2FA02D0B01B901A6 305 | :1013000090010C01CA01A0011124FF27591B99F07B 306 | :10131000593F50F4503E68F11A16F040A22F232F87 307 | :10132000342F4427585FF3CF469537952795A795D7 308 | :10133000F0405395C9F77EF41F16BA0B620B730B7E 309 | :10134000840BBAF09150A1F0FF0FBB1F661F771FEF 310 | :10135000881FC2F70EC0BA0F621F731F841F48F4A4 311 | :10136000879577956795B795F7959E3F08F0B0CF2D 312 | :101370009395880F08F09927EE0F97958795089514 313 | :101380000E94A30A08F481E008950E94D9090C94F0 314 | :10139000DE0A0E94D70A58F00E94D00A40F029F4D1 315 | :1013A0005F3F29F00C94C70A51110C94120B0C9456 316 | :1013B000CD0A0E94EF0A68F39923B1F3552391F304 317 | :1013C000951B550BBB27AA2762177307840738F0B4 318 | :1013D0009F5F5F4F220F331F441FAA1FA9F335D011 319 | :1013E0000E2E3AF0E0E832D091505040E695001CC5 320 | :1013F000CAF72BD0FE2F29D0660F771F881FBB1F7F 321 | :10140000261737074807AB07B0E809F0BB0B802D5C 322 | :10141000BF01FF2793585F4F3AF09E3F510578F088 323 | :101420000C94C70A0C94120B5F3FE4F3983ED4F37C 324 | :10143000869577956795B795F7959F5FC9F7880F5C 325 | :10144000911D9695879597F90895E1E0660F771FAE 326 | :10145000881FBB1F621773078407BA0720F0621B3F 327 | :10146000730B840BBA0BEE1F88F7E09508950E946A 328 | :10147000F70A88F09F5798F0B92F9927B751B0F025 329 | :10148000E1F0660F771F881F991F1AF0BA95C9F708 330 | :1014900014C0B13091F00E94110BB1E008950C948A 331 | :1014A000110B672F782F8827B85F39F0B93FCCF33D 332 | :1014B000869577956795B395D9F73EF49095809585 333 | :1014C000709561957F4F8F4F9F4F0895E89409C0A5 334 | :1014D00097FB3EF490958095709561957F4F8F4F67 335 | :1014E0009F4F9923A9F0F92F96E9BB279395F6957D 336 | :1014F000879577956795B795F111F8CFFAF4BB0FFB 337 | :1015000011F460FF1BC06F5F7F4F8F4F9F4F16C05E 338 | :10151000882311F096E911C0772321F09EE8872FE8 339 | :10152000762F05C0662371F096E8862F70E060E0A4 340 | :101530002AF09A95660F771F881FDAF7880F96951D 341 | :10154000879597F90895990F0008550FAA0BE0E8C1 342 | :10155000FEEF16161706E807F907C0F01216130675 343 | :10156000E407F50798F0621B730B840B950B39F4B5 344 | :101570000A2661F0232B242B252B21F408950A261B 345 | :1015800009F4A140A6958FEF811D811D089597F95B 346 | :101590009F6780E870E060E008959FEF80EC089519 347 | :1015A00000240A9416161706180609060895002442 348 | :1015B0000A9412161306140605060895092E0394BC 349 | :1015C000000C11F4882352F0BB0F40F4BF2B11F430 350 | :1015D00060FF04C06F5F7F4F8F4F9F4F089557FD8F 351 | :1015E0009058440F551F59F05F3F71F04795880F91 352 | :1015F00097FB991F61F09F3F79F087950895121628 353 | :1016000013061406551FF2CF4695F1DF08C01616D3 354 | :1016100017061806991FF1CF869571056105089484 355 | :101620000895E894BB2766277727CB0197F908959B 356 | :101630000E94A30A08F48FEF08950E94300B0C94C7 357 | :10164000DE0A0E94D00A38F00E94D70A20F09523C3 358 | :1016500011F00C94C70A0C94CD0A11240C94120BAF 359 | :101660000E94EF0A70F3959FC1F3950F50E0551F4C 360 | :10167000629FF001729FBB27F00DB11D639FAA27E7 361 | :10168000F00DB11DAA1F649F6627B00DA11D661F36 362 | :10169000829F2227B00DA11D621F739FB00DA11D57 363 | :1016A000621F839FA00D611D221F749F3327A00D11 364 | :1016B000611D231F849F600D211D822F762F6A2FAD 365 | :1016C00011249F5750409AF0F1F088234AF0EE0F12 366 | :1016D000FF1FBB1F661F771F881F91505040A9F73F 367 | :1016E0009E3F510580F00C94C70A0C94120B5F3F8B 368 | :1016F000E4F3983ED4F3869577956795B795F7957B 369 | :10170000E7959F5FC1F7FE2B880F911D96958795F2 370 | :1017100097F908950E94A30A880B990B089581E018 371 | :0C17200090E0F8940C94940BF894FFCF28 372 | :10172C0000008F0280000000000016019200DF0014 373 | :10173C00BD00D1005D0100000000980284027D0212 374 | :10174C007A02770276020D0A006E616E00696E668F 375 | :10175C00006F7666002E004D505520696E69743A04 376 | :10176C00200046726565206D656D3A20003B0000D7 377 | :107800000C94343C0C94513C0C94513C0C94513CE1 378 | :107810000C94513C0C94513C0C94513C0C94513CB4 379 | :107820000C94513C0C94513C0C94513C0C94513CA4 380 | :107830000C94513C0C94513C0C94513C0C94513C94 381 | :107840000C94513C0C94513C0C94513C0C94513C84 382 | :107850000C94513C0C94513C0C94513C0C94513C74 383 | :107860000C94513C0C94513C11241FBECFEFD8E036 384 | :10787000DEBFCDBF11E0A0E0B1E0ECE9FFE702C060 385 | :1078800005900D92A230B107D9F712E0A2E0B1E065 386 | :1078900001C01D92AD30B107E1F70E942D3D0C945F 387 | :1078A000CC3F0C94003C982F959595959595959582 388 | :1078B000905D8F708A307CF0282F295A8091C0000B 389 | :1078C00085FFFCCF9093C6008091C00085FFFCCF60 390 | :1078D0002093C6000895282F205DF0CF982F809127 391 | :1078E000C00085FFFCCF9093C6000895EF92FF92F1 392 | :1078F0000F931F93EE24FF2487018091C00087FD22 393 | :1079000017C00894E11CF11C011D111D81E4E8164B 394 | :1079100082E4F8068FE0080780E0180770F3E09132 395 | :107920000401F091050109958091C00087FFE9CF1E 396 | :107930008091C6001F910F91FF90EF9008950E94D3 397 | :10794000763C982F8091C00085FFFCCF9093C600B5 398 | :1079500091362CF490330CF09053892F089597555D 399 | :10796000892F08951F930E949F3C182F0E949F3CCF 400 | :107970001295107F810F1F9108951F93182F882350 401 | :1079800021F00E94763C1150E1F71F9108951F935A 402 | :10799000182F0E94763C803249F0809103018F5F5E 403 | :1079A000809303018530C1F01F9108958091C0003C 404 | :1079B00085FFFCCF84E18093C6008091C00085FFE5 405 | :1079C000FCCF1093C6008091C00085FFFCCF80E102 406 | :1079D0008093C6001F910895E0910401F091050184 407 | :1079E00009951F9108950E94763C803241F0809164 408 | :1079F00003018F5F80930301853081F008958091AA 409 | :107A0000C00085FFFCCF84E18093C6008091C00058 410 | :107A100085FFFCCF80E18093C6000895E0910401CA 411 | :107A2000F09105010995089540E951E08823A1F0FE 412 | :107A30002D9A28EE33E0FA013197F1F721503040CA 413 | :107A4000D1F72D9828EE33E0FA013197F1F7215064 414 | :107A50003040D1F7815061F708953F924F925F9285 415 | :107A60006F927F928F929F92AF92BF92CF92DF924E 416 | :107A7000EF92FF920F931F93CF93DF93000080E16B 417 | :107A80008093C4001092C50088E18093C10086E015 418 | :107A90008093C2005098589A259A81E00E94143D24 419 | :107AA00024E1F22E9EE1E92E85E9D82E0FE0C02ECA 420 | :107AB00010E1B12EAA24A394B1E49B2EA6E58A2E50 421 | :107AC000F2E57F2EE0E26E2E79E4572E63E5462E36 422 | :107AD00050E5352E0E94763C8033B1F18133B9F107 423 | :107AE000803409F46FC0813409F476C0823409F41B 424 | :107AF00085C0853409F488C0803531F1823521F1A3 425 | :107B0000813511F1853509F485C0863509F48DC0BC 426 | :107B1000843609F496C0843709F403C1853709F423 427 | :107B200072C1863709F466C0809103018F5F80932C 428 | :107B30000301853079F6E0910401F0910501099582 429 | :107B40000E94763C803351F60E94F33CC3CF0E94E2 430 | :107B5000763C803249F78091C00085FFFCCFF092DF 431 | :107B6000C6008091C00085FFFCCF9092C600809136 432 | :107B7000C00085FFFCCF8092C6008091C00085FFC9 433 | :107B8000FCCF7092C6008091C00085FFFCCF609250 434 | :107B9000C6008091C00085FFFCCF5092C600809146 435 | :107BA000C00085FFFCCF4092C6008091C00085FFD9 436 | :107BB000FCCF3092C6008091C00085FFFCCFB09210 437 | :107BC000C60088CF0E94763C863808F4BDCF0E945C 438 | :107BD000763C0E94F33C7ECF0E94763C803809F4CC 439 | :107BE0009CC0813809F40BC1823809F43CC1883942 440 | :107BF00009F48FC080E00E94C73C6CCF84E10E94F2 441 | :107C0000BD3C0E94F33C66CF85E00E94BD3C0E94D3 442 | :107C1000F33C60CF0E94763C809306010E94763C44 443 | :107C2000809307010E94F33C55CF0E94763C80333D 444 | :107C300009F41DC183E00E94BD3C80E00E94C73C66 445 | :107C400049CF0E94763C809309020E94763C809343 446 | :107C5000080280910C028E7F80930C020E94763C79 447 | :107C6000853409F415C18091080290910902892B8D 448 | :107C700089F000E010E00E94763CF801E85FFE4FDA 449 | :107C800080830F5F1F4F80910802909109020817AF 450 | :107C9000190788F30E94763C803209F045CF809125 451 | :107CA0000C0280FF01C16091060170910701660F0F 452 | :107CB000771F7093070160930601A0910802B091AD 453 | :107CC00009021097C9F0E8E0F1E09B01AD014E0F09 454 | :107CD0005F1FF999FECF32BD21BD819180BDFA9A17 455 | :107CE000F99A2F5F3F4FE417F50799F76A0F7B1F4B 456 | :107CF00070930701609306018091C00085FFFCCF5F 457 | :107D0000F092C6008091C00085FFFCCFB092C60003 458 | :107D1000E1CE83E00E94C73CDDCE82E00E94C73CFA 459 | :107D2000D9CE0E94763C809309020E94763C8093D3 460 | :107D300008028091060190910701880F991F909386 461 | :107D40000701809306010E94763C853409F4A6C0A1 462 | :107D500080910C028E7F80930C020E94763C8032D0 463 | :107D600009F0B8CE8091C00085FFFCCFF092C6002C 464 | :107D7000609108027091090261157105B9F140E046 465 | :107D800050E080910C02A82FA170B82FB27011C0E2 466 | :107D9000BB2309F45CC0E0910601F0910701319624 467 | :107DA000F0930701E09306014F5F5F4F46175707B7 468 | :107DB000E8F4AA2369F3F999FECF209106013091E6 469 | :107DC000070132BD21BDF89A90B58091C00085FFB2 470 | :107DD000FCCF9093C6002F5F3F4F30930701209355 471 | :107DE00006014F5F5F4F4617570718F38091C00099 472 | :107DF00085FDE5CE8091C00085FFF8CFE0CE81E023 473 | :107E00000E94C73C67CE0E94763C803209F08CCE3F 474 | :107E10008091C00085FFFCCFF092C6008091C00029 475 | :107E200085FFFCCFE092C6008091C00085FFFCCFAB 476 | :107E3000D092C6008091C00085FFFCCFC092C600E2 477 | :107E40008091C00085FFFCCFB092C60043CEE09188 478 | :107E50000601F091070194918091C00085FFFCCF4D 479 | :107E60009093C6009CCF80E10E94C73C33CE0E9415 480 | :107E7000763C0E94763C182F0E94763C112309F430 481 | :107E800083C0113009F484C08FE00E94C73C22CE29 482 | :107E900080910C02816080930C02E5CE80910C02EF 483 | :107EA000816080930C0259CF809107018823880F4D 484 | :107EB000880B8A2180930B02809106019091070123 485 | :107EC000880F991F90930701809306018091080203 486 | :107ED00080FF09C080910802909109020196909359 487 | :107EE000090280930802F894F999FECF1127E091D6 488 | :107EF0000601F0910701C8E0D1E08091080290915D 489 | :107F00000902103091F40091570001700130D9F34B 490 | :107F100003E000935700E89500915700017001308D 491 | :107F2000D9F301E100935700E89509901990009169 492 | :107F3000570001700130D9F301E000935700E89534 493 | :107F40001395103498F011270091570001700130FB 494 | :107F5000D9F305E000935700E895009157000170B0 495 | :107F60000130D9F301E100935700E895329602976A 496 | :107F700009F0C7CF103011F00296E5CF112480919F 497 | :107F8000C00085FFB9CEBCCE8EE10E94C73CA2CD19 498 | :0C7F900085E90E94C73C9ECDF894FFCF0D 499 | :027F9C00800063 500 | :040000030000780081 501 | :00000001FF 502 | -------------------------------------------------------------------------------- /SerialVRController_v2/inv_mpu_dmp_motion_driver.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | $License: 3 | Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved. 4 | See included License.txt for License information. 5 | $ 6 | */ 7 | /** 8 | * @addtogroup DRIVERS Sensor Driver Layer 9 | * @brief Hardware drivers to communicate with sensors via I2C. 10 | * 11 | * @{ 12 | * @file inv_mpu_dmp_motion_driver.c 13 | * @brief DMP image and interface functions. 14 | * @details All functions are preceded by the dmp_ prefix to 15 | * differentiate among MPL and general driver function calls. 16 | */ 17 | #include 18 | #include 19 | #include 20 | #include 21 | #include 22 | #include "inv_mpu.h" 23 | #include "inv_mpu_dmp_motion_driver.h" 24 | #include "dmpKey.h" 25 | #include "dmpmap.h" 26 | 27 | /* The following functions must be defined for this platform: 28 | * i2c_write(unsigned char slave_addr, unsigned char reg_addr, 29 | * unsigned char length, unsigned char const *data) 30 | * i2c_read(unsigned char slave_addr, unsigned char reg_addr, 31 | * unsigned char length, unsigned char *data) 32 | * delay_ms(unsigned long num_ms) 33 | * get_ms(unsigned long *count) 34 | */ 35 | 36 | #define delay_ms delay 37 | 38 | #define log_i(...) do {} while (0) 39 | #define log_e(...) do {} while (0) 40 | 41 | 42 | /* These defines are copied from dmpDefaultMPU6050.c in the general MPL 43 | * releases. These defines may change for each DMP image, so be sure to modify 44 | * these values when switching to a new image. 45 | */ 46 | #define CFG_LP_QUAT (2712) 47 | #define END_ORIENT_TEMP (1866) 48 | #define CFG_27 (2742) 49 | #define CFG_20 (2224) 50 | #define CFG_23 (2745) 51 | #define CFG_FIFO_ON_EVENT (2690) 52 | #define END_PREDICTION_UPDATE (1761) 53 | #define CGNOTICE_INTR (2620) 54 | #define X_GRT_Y_TMP (1358) 55 | #define CFG_DR_INT (1029) 56 | #define CFG_AUTH (1035) 57 | #define UPDATE_PROP_ROT (1835) 58 | #define END_COMPARE_Y_X_TMP2 (1455) 59 | #define SKIP_X_GRT_Y_TMP (1359) 60 | #define SKIP_END_COMPARE (1435) 61 | #define FCFG_3 (1088) 62 | #define FCFG_2 (1066) 63 | #define FCFG_1 (1062) 64 | #define END_COMPARE_Y_X_TMP3 (1434) 65 | #define FCFG_7 (1073) 66 | #define FCFG_6 (1106) 67 | #define FLAT_STATE_END (1713) 68 | #define SWING_END_4 (1616) 69 | #define SWING_END_2 (1565) 70 | #define SWING_END_3 (1587) 71 | #define SWING_END_1 (1550) 72 | #define CFG_8 (2718) 73 | #define CFG_15 (2727) 74 | #define CFG_16 (2746) 75 | #define CFG_EXT_GYRO_BIAS (1189) 76 | #define END_COMPARE_Y_X_TMP (1407) 77 | #define DO_NOT_UPDATE_PROP_ROT (1839) 78 | #define CFG_7 (1205) 79 | #define FLAT_STATE_END_TEMP (1683) 80 | #define END_COMPARE_Y_X (1484) 81 | #define SKIP_SWING_END_1 (1551) 82 | #define SKIP_SWING_END_3 (1588) 83 | #define SKIP_SWING_END_2 (1566) 84 | #define TILTG75_START (1672) 85 | #define CFG_6 (2753) 86 | #define TILTL75_END (1669) 87 | #define END_ORIENT (1884) 88 | #define CFG_FLICK_IN (2573) 89 | #define TILTL75_START (1643) 90 | #define CFG_MOTION_BIAS (1208) 91 | #define X_GRT_Y (1408) 92 | #define TEMPLABEL (2324) 93 | #define CFG_ANDROID_ORIENT_INT (1853) 94 | #define CFG_GYRO_RAW_DATA (2722) 95 | #define X_GRT_Y_TMP2 (1379) 96 | 97 | #define D_0_22 (22+512) 98 | #define D_0_24 (24+512) 99 | 100 | #define D_0_36 (36) 101 | #define D_0_52 (52) 102 | #define D_0_96 (96) 103 | #define D_0_104 (104) 104 | #define D_0_108 (108) 105 | #define D_0_163 (163) 106 | #define D_0_188 (188) 107 | #define D_0_192 (192) 108 | #define D_0_224 (224) 109 | #define D_0_228 (228) 110 | #define D_0_232 (232) 111 | #define D_0_236 (236) 112 | 113 | #define D_1_2 (256 + 2) 114 | #define D_1_4 (256 + 4) 115 | #define D_1_8 (256 + 8) 116 | #define D_1_10 (256 + 10) 117 | #define D_1_24 (256 + 24) 118 | #define D_1_28 (256 + 28) 119 | #define D_1_36 (256 + 36) 120 | #define D_1_40 (256 + 40) 121 | #define D_1_44 (256 + 44) 122 | #define D_1_72 (256 + 72) 123 | #define D_1_74 (256 + 74) 124 | #define D_1_79 (256 + 79) 125 | #define D_1_88 (256 + 88) 126 | #define D_1_90 (256 + 90) 127 | #define D_1_92 (256 + 92) 128 | #define D_1_96 (256 + 96) 129 | #define D_1_98 (256 + 98) 130 | #define D_1_106 (256 + 106) 131 | #define D_1_108 (256 + 108) 132 | #define D_1_112 (256 + 112) 133 | #define D_1_128 (256 + 144) 134 | #define D_1_152 (256 + 12) 135 | #define D_1_160 (256 + 160) 136 | #define D_1_176 (256 + 176) 137 | #define D_1_178 (256 + 178) 138 | #define D_1_218 (256 + 218) 139 | #define D_1_232 (256 + 232) 140 | #define D_1_236 (256 + 236) 141 | #define D_1_240 (256 + 240) 142 | #define D_1_244 (256 + 244) 143 | #define D_1_250 (256 + 250) 144 | #define D_1_252 (256 + 252) 145 | #define D_2_12 (512 + 12) 146 | #define D_2_96 (512 + 96) 147 | #define D_2_108 (512 + 108) 148 | #define D_2_208 (512 + 208) 149 | #define D_2_224 (512 + 224) 150 | #define D_2_236 (512 + 236) 151 | #define D_2_244 (512 + 244) 152 | #define D_2_248 (512 + 248) 153 | #define D_2_252 (512 + 252) 154 | 155 | #define CPASS_BIAS_X (35 * 16 + 4) 156 | #define CPASS_BIAS_Y (35 * 16 + 8) 157 | #define CPASS_BIAS_Z (35 * 16 + 12) 158 | #define CPASS_MTX_00 (36 * 16) 159 | #define CPASS_MTX_01 (36 * 16 + 4) 160 | #define CPASS_MTX_02 (36 * 16 + 8) 161 | #define CPASS_MTX_10 (36 * 16 + 12) 162 | #define CPASS_MTX_11 (37 * 16) 163 | #define CPASS_MTX_12 (37 * 16 + 4) 164 | #define CPASS_MTX_20 (37 * 16 + 8) 165 | #define CPASS_MTX_21 (37 * 16 + 12) 166 | #define CPASS_MTX_22 (43 * 16 + 12) 167 | #define D_EXT_GYRO_BIAS_X (61 * 16) 168 | #define D_EXT_GYRO_BIAS_Y (61 * 16) + 4 169 | #define D_EXT_GYRO_BIAS_Z (61 * 16) + 8 170 | #define D_ACT0 (40 * 16) 171 | #define D_ACSX (40 * 16 + 4) 172 | #define D_ACSY (40 * 16 + 8) 173 | #define D_ACSZ (40 * 16 + 12) 174 | 175 | #define FLICK_MSG (45 * 16 + 4) 176 | #define FLICK_COUNTER (45 * 16 + 8) 177 | #define FLICK_LOWER (45 * 16 + 12) 178 | #define FLICK_UPPER (46 * 16 + 12) 179 | 180 | #define D_AUTH_OUT (992) 181 | #define D_AUTH_IN (996) 182 | #define D_AUTH_A (1000) 183 | #define D_AUTH_B (1004) 184 | 185 | #define D_PEDSTD_BP_B (768 + 0x1C) 186 | #define D_PEDSTD_HP_A (768 + 0x78) 187 | #define D_PEDSTD_HP_B (768 + 0x7C) 188 | #define D_PEDSTD_BP_A4 (768 + 0x40) 189 | #define D_PEDSTD_BP_A3 (768 + 0x44) 190 | #define D_PEDSTD_BP_A2 (768 + 0x48) 191 | #define D_PEDSTD_BP_A1 (768 + 0x4C) 192 | #define D_PEDSTD_INT_THRSH (768 + 0x68) 193 | #define D_PEDSTD_CLIP (768 + 0x6C) 194 | #define D_PEDSTD_SB (768 + 0x28) 195 | #define D_PEDSTD_SB_TIME (768 + 0x2C) 196 | #define D_PEDSTD_PEAKTHRSH (768 + 0x98) 197 | #define D_PEDSTD_TIML (768 + 0x2A) 198 | #define D_PEDSTD_TIMH (768 + 0x2E) 199 | #define D_PEDSTD_PEAK (768 + 0X94) 200 | #define D_PEDSTD_STEPCTR (768 + 0x60) 201 | #define D_PEDSTD_TIMECTR (964) 202 | #define D_PEDSTD_DECI (768 + 0xA0) 203 | 204 | #define D_HOST_NO_MOT (976) 205 | #define D_ACCEL_BIAS (660) 206 | 207 | #define D_ORIENT_GAP (76) 208 | 209 | #define D_TILT0_H (48) 210 | #define D_TILT0_L (50) 211 | #define D_TILT1_H (52) 212 | #define D_TILT1_L (54) 213 | #define D_TILT2_H (56) 214 | #define D_TILT2_L (58) 215 | #define D_TILT3_H (60) 216 | #define D_TILT3_L (62) 217 | 218 | #define DMP_CODE_SIZE (3062) 219 | 220 | #ifdef __SAM3X8E__ 221 | const uint8_t dmp_memory[DMP_CODE_SIZE] = { 222 | #else 223 | const unsigned char dmp_memory[DMP_CODE_SIZE] PROGMEM = { 224 | #endif 225 | /* bank # 0 */ 226 | 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 227 | 0x00, 0x65, 0x00, 0x54, 0xff, 0xef, 0x00, 0x00, 0xfa, 0x80, 0x00, 0x0b, 0x12, 0x82, 0x00, 0x01, 228 | 0x03, 0x0c, 0x30, 0xc3, 0x0e, 0x8c, 0x8c, 0xe9, 0x14, 0xd5, 0x40, 0x02, 0x13, 0x71, 0x0f, 0x8e, 229 | 0x38, 0x83, 0xf8, 0x83, 0x30, 0x00, 0xf8, 0x83, 0x25, 0x8e, 0xf8, 0x83, 0x30, 0x00, 0xf8, 0x83, 230 | 0xff, 0xff, 0xff, 0xff, 0x0f, 0xfe, 0xa9, 0xd6, 0x24, 0x00, 0x04, 0x00, 0x1a, 0x82, 0x79, 0xa1, 231 | 0x00, 0x00, 0x00, 0x3c, 0xff, 0xff, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x38, 0x83, 0x6f, 0xa2, 232 | 0x00, 0x3e, 0x03, 0x30, 0x40, 0x00, 0x00, 0x00, 0x02, 0xca, 0xe3, 0x09, 0x3e, 0x80, 0x00, 0x00, 233 | 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 234 | 0x00, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x6e, 0x00, 0x00, 0x06, 0x92, 0x0a, 0x16, 0xc0, 0xdf, 235 | 0xff, 0xff, 0x02, 0x56, 0xfd, 0x8c, 0xd3, 0x77, 0xff, 0xe1, 0xc4, 0x96, 0xe0, 0xc5, 0xbe, 0xaa, 236 | 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x0b, 0x2b, 0x00, 0x00, 0x16, 0x57, 0x00, 0x00, 0x03, 0x59, 237 | 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xfa, 0x00, 0x02, 0x6c, 0x1d, 0x00, 0x00, 0x00, 0x00, 238 | 0x3f, 0xff, 0xdf, 0xeb, 0x00, 0x3e, 0xb3, 0xb6, 0x00, 0x0d, 0x22, 0x78, 0x00, 0x00, 0x2f, 0x3c, 239 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x42, 0xb5, 0x00, 0x00, 0x39, 0xa2, 0x00, 0x00, 0xb3, 0x65, 240 | 0xd9, 0x0e, 0x9f, 0xc9, 0x1d, 0xcf, 0x4c, 0x34, 0x30, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 241 | 0x3b, 0xb6, 0x7a, 0xe8, 0x00, 0x64, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 242 | /* bank # 1 */ 243 | 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0xfa, 0x92, 0x10, 0x00, 0x22, 0x5e, 0x00, 0x0d, 0x22, 0x9f, 244 | 0x00, 0x01, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0x63, 0xd4, 0x00, 0x00, 245 | 0x10, 0x00, 0x00, 0x00, 0x04, 0xd6, 0x00, 0x00, 0x04, 0xcc, 0x00, 0x00, 0x04, 0xcc, 0x00, 0x00, 246 | 0x00, 0x00, 0x10, 0x72, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 247 | 0x00, 0x06, 0x00, 0x02, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 248 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x64, 0x00, 0x20, 0x00, 0x00, 249 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x03, 0x00, 250 | 0x00, 0x00, 0x00, 0x32, 0xf8, 0x98, 0x00, 0x00, 0xff, 0x65, 0x00, 0x00, 0x83, 0x0f, 0x00, 0x00, 251 | 0xff, 0x9b, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 252 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 253 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 254 | 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0xb2, 0x6a, 0x00, 0x02, 0x00, 0x00, 255 | 0x00, 0x01, 0xfb, 0x83, 0x00, 0x68, 0x00, 0x00, 0x00, 0xd9, 0xfc, 0x00, 0x7c, 0xf1, 0xff, 0x83, 256 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x64, 0x03, 0xe8, 0x00, 0x64, 0x00, 0x28, 257 | 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x00, 0x16, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 258 | 0x00, 0x00, 0x10, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf4, 0x00, 0x00, 0x10, 0x00, 259 | /* bank # 2 */ 260 | 0x00, 0x28, 0x00, 0x00, 0xff, 0xff, 0x45, 0x81, 0xff, 0xff, 0xfa, 0x72, 0x00, 0x00, 0x00, 0x00, 261 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x05, 0x00, 0x05, 0xba, 0xc6, 0x00, 0x47, 0x78, 0xa2, 262 | 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x14, 263 | 0x00, 0x00, 0x25, 0x4d, 0x00, 0x2f, 0x70, 0x6d, 0x00, 0x00, 0x05, 0xae, 0x00, 0x0c, 0x02, 0xd0, 264 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 265 | 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 266 | 0x00, 0x64, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 267 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 268 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 269 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 270 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 271 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 272 | 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x0e, 273 | 0x00, 0x00, 0x0a, 0xc7, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0xff, 0xff, 0xff, 0x9c, 274 | 0x00, 0x00, 0x0b, 0x2b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x64, 275 | 0xff, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 276 | /* bank # 3 */ 277 | 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 278 | 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x24, 0x26, 0xd3, 279 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x10, 0x00, 0x96, 0x00, 0x3c, 280 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 281 | 0x0c, 0x0a, 0x4e, 0x68, 0xcd, 0xcf, 0x77, 0x09, 0x50, 0x16, 0x67, 0x59, 0xc6, 0x19, 0xce, 0x82, 282 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 283 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0xd7, 0x84, 0x00, 0x03, 0x00, 0x00, 0x00, 284 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc7, 0x93, 0x8f, 0x9d, 0x1e, 0x1b, 0x1c, 0x19, 285 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 286 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x18, 0x85, 0x00, 0x00, 0x40, 0x00, 287 | 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 288 | 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 289 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 290 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 291 | 0x00, 0x00, 0x00, 0x00, 0x67, 0x7d, 0xdf, 0x7e, 0x72, 0x90, 0x2e, 0x55, 0x4c, 0xf6, 0xe6, 0x88, 292 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 293 | 294 | /* bank # 4 */ 295 | 0xd8, 0xdc, 0xb4, 0xb8, 0xb0, 0xd8, 0xb9, 0xab, 0xf3, 0xf8, 0xfa, 0xb3, 0xb7, 0xbb, 0x8e, 0x9e, 296 | 0xae, 0xf1, 0x32, 0xf5, 0x1b, 0xf1, 0xb4, 0xb8, 0xb0, 0x80, 0x97, 0xf1, 0xa9, 0xdf, 0xdf, 0xdf, 297 | 0xaa, 0xdf, 0xdf, 0xdf, 0xf2, 0xaa, 0xc5, 0xcd, 0xc7, 0xa9, 0x0c, 0xc9, 0x2c, 0x97, 0xf1, 0xa9, 298 | 0x89, 0x26, 0x46, 0x66, 0xb2, 0x89, 0x99, 0xa9, 0x2d, 0x55, 0x7d, 0xb0, 0xb0, 0x8a, 0xa8, 0x96, 299 | 0x36, 0x56, 0x76, 0xf1, 0xba, 0xa3, 0xb4, 0xb2, 0x80, 0xc0, 0xb8, 0xa8, 0x97, 0x11, 0xb2, 0x83, 300 | 0x98, 0xba, 0xa3, 0xf0, 0x24, 0x08, 0x44, 0x10, 0x64, 0x18, 0xb2, 0xb9, 0xb4, 0x98, 0x83, 0xf1, 301 | 0xa3, 0x29, 0x55, 0x7d, 0xba, 0xb5, 0xb1, 0xa3, 0x83, 0x93, 0xf0, 0x00, 0x28, 0x50, 0xf5, 0xb2, 302 | 0xb6, 0xaa, 0x83, 0x93, 0x28, 0x54, 0x7c, 0xf1, 0xb9, 0xa3, 0x82, 0x93, 0x61, 0xba, 0xa2, 0xda, 303 | 0xde, 0xdf, 0xdb, 0x81, 0x9a, 0xb9, 0xae, 0xf5, 0x60, 0x68, 0x70, 0xf1, 0xda, 0xba, 0xa2, 0xdf, 304 | 0xd9, 0xba, 0xa2, 0xfa, 0xb9, 0xa3, 0x82, 0x92, 0xdb, 0x31, 0xba, 0xa2, 0xd9, 0xba, 0xa2, 0xf8, 305 | 0xdf, 0x85, 0xa4, 0xd0, 0xc1, 0xbb, 0xad, 0x83, 0xc2, 0xc5, 0xc7, 0xb8, 0xa2, 0xdf, 0xdf, 0xdf, 306 | 0xba, 0xa0, 0xdf, 0xdf, 0xdf, 0xd8, 0xd8, 0xf1, 0xb8, 0xaa, 0xb3, 0x8d, 0xb4, 0x98, 0x0d, 0x35, 307 | 0x5d, 0xb2, 0xb6, 0xba, 0xaf, 0x8c, 0x96, 0x19, 0x8f, 0x9f, 0xa7, 0x0e, 0x16, 0x1e, 0xb4, 0x9a, 308 | 0xb8, 0xaa, 0x87, 0x2c, 0x54, 0x7c, 0xba, 0xa4, 0xb0, 0x8a, 0xb6, 0x91, 0x32, 0x56, 0x76, 0xb2, 309 | 0x84, 0x94, 0xa4, 0xc8, 0x08, 0xcd, 0xd8, 0xb8, 0xb4, 0xb0, 0xf1, 0x99, 0x82, 0xa8, 0x2d, 0x55, 310 | 0x7d, 0x98, 0xa8, 0x0e, 0x16, 0x1e, 0xa2, 0x2c, 0x54, 0x7c, 0x92, 0xa4, 0xf0, 0x2c, 0x50, 0x78, 311 | /* bank # 5 */ 312 | 0xf1, 0x84, 0xa8, 0x98, 0xc4, 0xcd, 0xfc, 0xd8, 0x0d, 0xdb, 0xa8, 0xfc, 0x2d, 0xf3, 0xd9, 0xba, 313 | 0xa6, 0xf8, 0xda, 0xba, 0xa6, 0xde, 0xd8, 0xba, 0xb2, 0xb6, 0x86, 0x96, 0xa6, 0xd0, 0xf3, 0xc8, 314 | 0x41, 0xda, 0xa6, 0xc8, 0xf8, 0xd8, 0xb0, 0xb4, 0xb8, 0x82, 0xa8, 0x92, 0xf5, 0x2c, 0x54, 0x88, 315 | 0x98, 0xf1, 0x35, 0xd9, 0xf4, 0x18, 0xd8, 0xf1, 0xa2, 0xd0, 0xf8, 0xf9, 0xa8, 0x84, 0xd9, 0xc7, 316 | 0xdf, 0xf8, 0xf8, 0x83, 0xc5, 0xda, 0xdf, 0x69, 0xdf, 0x83, 0xc1, 0xd8, 0xf4, 0x01, 0x14, 0xf1, 317 | 0xa8, 0x82, 0x4e, 0xa8, 0x84, 0xf3, 0x11, 0xd1, 0x82, 0xf5, 0xd9, 0x92, 0x28, 0x97, 0x88, 0xf1, 318 | 0x09, 0xf4, 0x1c, 0x1c, 0xd8, 0x84, 0xa8, 0xf3, 0xc0, 0xf9, 0xd1, 0xd9, 0x97, 0x82, 0xf1, 0x29, 319 | 0xf4, 0x0d, 0xd8, 0xf3, 0xf9, 0xf9, 0xd1, 0xd9, 0x82, 0xf4, 0xc2, 0x03, 0xd8, 0xde, 0xdf, 0x1a, 320 | 0xd8, 0xf1, 0xa2, 0xfa, 0xf9, 0xa8, 0x84, 0x98, 0xd9, 0xc7, 0xdf, 0xf8, 0xf8, 0xf8, 0x83, 0xc7, 321 | 0xda, 0xdf, 0x69, 0xdf, 0xf8, 0x83, 0xc3, 0xd8, 0xf4, 0x01, 0x14, 0xf1, 0x98, 0xa8, 0x82, 0x2e, 322 | 0xa8, 0x84, 0xf3, 0x11, 0xd1, 0x82, 0xf5, 0xd9, 0x92, 0x50, 0x97, 0x88, 0xf1, 0x09, 0xf4, 0x1c, 323 | 0xd8, 0x84, 0xa8, 0xf3, 0xc0, 0xf8, 0xf9, 0xd1, 0xd9, 0x97, 0x82, 0xf1, 0x49, 0xf4, 0x0d, 0xd8, 324 | 0xf3, 0xf9, 0xf9, 0xd1, 0xd9, 0x82, 0xf4, 0xc4, 0x03, 0xd8, 0xde, 0xdf, 0xd8, 0xf1, 0xad, 0x88, 325 | 0x98, 0xcc, 0xa8, 0x09, 0xf9, 0xd9, 0x82, 0x92, 0xa8, 0xf5, 0x7c, 0xf1, 0x88, 0x3a, 0xcf, 0x94, 326 | 0x4a, 0x6e, 0x98, 0xdb, 0x69, 0x31, 0xda, 0xad, 0xf2, 0xde, 0xf9, 0xd8, 0x87, 0x95, 0xa8, 0xf2, 327 | 0x21, 0xd1, 0xda, 0xa5, 0xf9, 0xf4, 0x17, 0xd9, 0xf1, 0xae, 0x8e, 0xd0, 0xc0, 0xc3, 0xae, 0x82, 328 | /* bank # 6 */ 329 | 0xc6, 0x84, 0xc3, 0xa8, 0x85, 0x95, 0xc8, 0xa5, 0x88, 0xf2, 0xc0, 0xf1, 0xf4, 0x01, 0x0e, 0xf1, 330 | 0x8e, 0x9e, 0xa8, 0xc6, 0x3e, 0x56, 0xf5, 0x54, 0xf1, 0x88, 0x72, 0xf4, 0x01, 0x15, 0xf1, 0x98, 331 | 0x45, 0x85, 0x6e, 0xf5, 0x8e, 0x9e, 0x04, 0x88, 0xf1, 0x42, 0x98, 0x5a, 0x8e, 0x9e, 0x06, 0x88, 332 | 0x69, 0xf4, 0x01, 0x1c, 0xf1, 0x98, 0x1e, 0x11, 0x08, 0xd0, 0xf5, 0x04, 0xf1, 0x1e, 0x97, 0x02, 333 | 0x02, 0x98, 0x36, 0x25, 0xdb, 0xf9, 0xd9, 0x85, 0xa5, 0xf3, 0xc1, 0xda, 0x85, 0xa5, 0xf3, 0xdf, 334 | 0xd8, 0x85, 0x95, 0xa8, 0xf3, 0x09, 0xda, 0xa5, 0xfa, 0xd8, 0x82, 0x92, 0xa8, 0xf5, 0x78, 0xf1, 335 | 0x88, 0x1a, 0x84, 0x9f, 0x26, 0x88, 0x98, 0x21, 0xda, 0xf4, 0x1d, 0xf3, 0xd8, 0x87, 0x9f, 0x39, 336 | 0xd1, 0xaf, 0xd9, 0xdf, 0xdf, 0xfb, 0xf9, 0xf4, 0x0c, 0xf3, 0xd8, 0xfa, 0xd0, 0xf8, 0xda, 0xf9, 337 | 0xf9, 0xd0, 0xdf, 0xd9, 0xf9, 0xd8, 0xf4, 0x0b, 0xd8, 0xf3, 0x87, 0x9f, 0x39, 0xd1, 0xaf, 0xd9, 338 | 0xdf, 0xdf, 0xf4, 0x1d, 0xf3, 0xd8, 0xfa, 0xfc, 0xa8, 0x69, 0xf9, 0xf9, 0xaf, 0xd0, 0xda, 0xde, 339 | 0xfa, 0xd9, 0xf8, 0x8f, 0x9f, 0xa8, 0xf1, 0xcc, 0xf3, 0x98, 0xdb, 0x45, 0xd9, 0xaf, 0xdf, 0xd0, 340 | 0xf8, 0xd8, 0xf1, 0x8f, 0x9f, 0xa8, 0xca, 0xf3, 0x88, 0x09, 0xda, 0xaf, 0x8f, 0xcb, 0xf8, 0xd8, 341 | 0xf2, 0xad, 0x97, 0x8d, 0x0c, 0xd9, 0xa5, 0xdf, 0xf9, 0xba, 0xa6, 0xf3, 0xfa, 0xf4, 0x12, 0xf2, 342 | 0xd8, 0x95, 0x0d, 0xd1, 0xd9, 0xba, 0xa6, 0xf3, 0xfa, 0xda, 0xa5, 0xf2, 0xc1, 0xba, 0xa6, 0xf3, 343 | 0xdf, 0xd8, 0xf1, 0xba, 0xb2, 0xb6, 0x86, 0x96, 0xa6, 0xd0, 0xca, 0xf3, 0x49, 0xda, 0xa6, 0xcb, 344 | 0xf8, 0xd8, 0xb0, 0xb4, 0xb8, 0xd8, 0xad, 0x84, 0xf2, 0xc0, 0xdf, 0xf1, 0x8f, 0xcb, 0xc3, 0xa8, 345 | /* bank # 7 */ 346 | 0xb2, 0xb6, 0x86, 0x96, 0xc8, 0xc1, 0xcb, 0xc3, 0xf3, 0xb0, 0xb4, 0x88, 0x98, 0xa8, 0x21, 0xdb, 347 | 0x71, 0x8d, 0x9d, 0x71, 0x85, 0x95, 0x21, 0xd9, 0xad, 0xf2, 0xfa, 0xd8, 0x85, 0x97, 0xa8, 0x28, 348 | 0xd9, 0xf4, 0x08, 0xd8, 0xf2, 0x8d, 0x29, 0xda, 0xf4, 0x05, 0xd9, 0xf2, 0x85, 0xa4, 0xc2, 0xf2, 349 | 0xd8, 0xa8, 0x8d, 0x94, 0x01, 0xd1, 0xd9, 0xf4, 0x11, 0xf2, 0xd8, 0x87, 0x21, 0xd8, 0xf4, 0x0a, 350 | 0xd8, 0xf2, 0x84, 0x98, 0xa8, 0xc8, 0x01, 0xd1, 0xd9, 0xf4, 0x11, 0xd8, 0xf3, 0xa4, 0xc8, 0xbb, 351 | 0xaf, 0xd0, 0xf2, 0xde, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xd8, 0xf1, 0xb8, 0xf6, 352 | 0xb5, 0xb9, 0xb0, 0x8a, 0x95, 0xa3, 0xde, 0x3c, 0xa3, 0xd9, 0xf8, 0xd8, 0x5c, 0xa3, 0xd9, 0xf8, 353 | 0xd8, 0x7c, 0xa3, 0xd9, 0xf8, 0xd8, 0xf8, 0xf9, 0xd1, 0xa5, 0xd9, 0xdf, 0xda, 0xfa, 0xd8, 0xb1, 354 | 0x85, 0x30, 0xf7, 0xd9, 0xde, 0xd8, 0xf8, 0x30, 0xad, 0xda, 0xde, 0xd8, 0xf2, 0xb4, 0x8c, 0x99, 355 | 0xa3, 0x2d, 0x55, 0x7d, 0xa0, 0x83, 0xdf, 0xdf, 0xdf, 0xb5, 0x91, 0xa0, 0xf6, 0x29, 0xd9, 0xfb, 356 | 0xd8, 0xa0, 0xfc, 0x29, 0xd9, 0xfa, 0xd8, 0xa0, 0xd0, 0x51, 0xd9, 0xf8, 0xd8, 0xfc, 0x51, 0xd9, 357 | 0xf9, 0xd8, 0x79, 0xd9, 0xfb, 0xd8, 0xa0, 0xd0, 0xfc, 0x79, 0xd9, 0xfa, 0xd8, 0xa1, 0xf9, 0xf9, 358 | 0xf9, 0xf9, 0xf9, 0xa0, 0xda, 0xdf, 0xdf, 0xdf, 0xd8, 0xa1, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xac, 359 | 0xde, 0xf8, 0xad, 0xde, 0x83, 0x93, 0xac, 0x2c, 0x54, 0x7c, 0xf1, 0xa8, 0xdf, 0xdf, 0xdf, 0xf6, 360 | 0x9d, 0x2c, 0xda, 0xa0, 0xdf, 0xd9, 0xfa, 0xdb, 0x2d, 0xf8, 0xd8, 0xa8, 0x50, 0xda, 0xa0, 0xd0, 361 | 0xde, 0xd9, 0xd0, 0xf8, 0xf8, 0xf8, 0xdb, 0x55, 0xf8, 0xd8, 0xa8, 0x78, 0xda, 0xa0, 0xd0, 0xdf, 362 | /* bank # 8 */ 363 | 0xd9, 0xd0, 0xfa, 0xf8, 0xf8, 0xf8, 0xf8, 0xdb, 0x7d, 0xf8, 0xd8, 0x9c, 0xa8, 0x8c, 0xf5, 0x30, 364 | 0xdb, 0x38, 0xd9, 0xd0, 0xde, 0xdf, 0xa0, 0xd0, 0xde, 0xdf, 0xd8, 0xa8, 0x48, 0xdb, 0x58, 0xd9, 365 | 0xdf, 0xd0, 0xde, 0xa0, 0xdf, 0xd0, 0xde, 0xd8, 0xa8, 0x68, 0xdb, 0x70, 0xd9, 0xdf, 0xdf, 0xa0, 366 | 0xdf, 0xdf, 0xd8, 0xf1, 0xa8, 0x88, 0x90, 0x2c, 0x54, 0x7c, 0x98, 0xa8, 0xd0, 0x5c, 0x38, 0xd1, 367 | 0xda, 0xf2, 0xae, 0x8c, 0xdf, 0xf9, 0xd8, 0xb0, 0x87, 0xa8, 0xc1, 0xc1, 0xb1, 0x88, 0xa8, 0xc6, 368 | 0xf9, 0xf9, 0xda, 0x36, 0xd8, 0xa8, 0xf9, 0xda, 0x36, 0xd8, 0xa8, 0xf9, 0xda, 0x36, 0xd8, 0xa8, 369 | 0xf9, 0xda, 0x36, 0xd8, 0xa8, 0xf9, 0xda, 0x36, 0xd8, 0xf7, 0x8d, 0x9d, 0xad, 0xf8, 0x18, 0xda, 370 | 0xf2, 0xae, 0xdf, 0xd8, 0xf7, 0xad, 0xfa, 0x30, 0xd9, 0xa4, 0xde, 0xf9, 0xd8, 0xf2, 0xae, 0xde, 371 | 0xfa, 0xf9, 0x83, 0xa7, 0xd9, 0xc3, 0xc5, 0xc7, 0xf1, 0x88, 0x9b, 0xa7, 0x7a, 0xad, 0xf7, 0xde, 372 | 0xdf, 0xa4, 0xf8, 0x84, 0x94, 0x08, 0xa7, 0x97, 0xf3, 0x00, 0xae, 0xf2, 0x98, 0x19, 0xa4, 0x88, 373 | 0xc6, 0xa3, 0x94, 0x88, 0xf6, 0x32, 0xdf, 0xf2, 0x83, 0x93, 0xdb, 0x09, 0xd9, 0xf2, 0xaa, 0xdf, 374 | 0xd8, 0xd8, 0xae, 0xf8, 0xf9, 0xd1, 0xda, 0xf3, 0xa4, 0xde, 0xa7, 0xf1, 0x88, 0x9b, 0x7a, 0xd8, 375 | 0xf3, 0x84, 0x94, 0xae, 0x19, 0xf9, 0xda, 0xaa, 0xf1, 0xdf, 0xd8, 0xa8, 0x81, 0xc0, 0xc3, 0xc5, 376 | 0xc7, 0xa3, 0x92, 0x83, 0xf6, 0x28, 0xad, 0xde, 0xd9, 0xf8, 0xd8, 0xa3, 0x50, 0xad, 0xd9, 0xf8, 377 | 0xd8, 0xa3, 0x78, 0xad, 0xd9, 0xf8, 0xd8, 0xf8, 0xf9, 0xd1, 0xa1, 0xda, 0xde, 0xc3, 0xc5, 0xc7, 378 | 0xd8, 0xa1, 0x81, 0x94, 0xf8, 0x18, 0xf2, 0xb0, 0x89, 0xac, 0xc3, 0xc5, 0xc7, 0xf1, 0xd8, 0xb8, 379 | /* bank # 9 */ 380 | 0xb4, 0xb0, 0x97, 0x86, 0xa8, 0x31, 0x9b, 0x06, 0x99, 0x07, 0xab, 0x97, 0x28, 0x88, 0x9b, 0xf0, 381 | 0x0c, 0x20, 0x14, 0x40, 0xb0, 0xb4, 0xb8, 0xf0, 0xa8, 0x8a, 0x9a, 0x28, 0x50, 0x78, 0xb7, 0x9b, 382 | 0xa8, 0x29, 0x51, 0x79, 0x24, 0x70, 0x59, 0x44, 0x69, 0x38, 0x64, 0x48, 0x31, 0xf1, 0xbb, 0xab, 383 | 0x88, 0x00, 0x2c, 0x54, 0x7c, 0xf0, 0xb3, 0x8b, 0xb8, 0xa8, 0x04, 0x28, 0x50, 0x78, 0xf1, 0xb0, 384 | 0x88, 0xb4, 0x97, 0x26, 0xa8, 0x59, 0x98, 0xbb, 0xab, 0xb3, 0x8b, 0x02, 0x26, 0x46, 0x66, 0xb0, 385 | 0xb8, 0xf0, 0x8a, 0x9c, 0xa8, 0x29, 0x51, 0x79, 0x8b, 0x29, 0x51, 0x79, 0x8a, 0x24, 0x70, 0x59, 386 | 0x8b, 0x20, 0x58, 0x71, 0x8a, 0x44, 0x69, 0x38, 0x8b, 0x39, 0x40, 0x68, 0x8a, 0x64, 0x48, 0x31, 387 | 0x8b, 0x30, 0x49, 0x60, 0x88, 0xf1, 0xac, 0x00, 0x2c, 0x54, 0x7c, 0xf0, 0x8c, 0xa8, 0x04, 0x28, 388 | 0x50, 0x78, 0xf1, 0x88, 0x97, 0x26, 0xa8, 0x59, 0x98, 0xac, 0x8c, 0x02, 0x26, 0x46, 0x66, 0xf0, 389 | 0x89, 0x9c, 0xa8, 0x29, 0x51, 0x79, 0x24, 0x70, 0x59, 0x44, 0x69, 0x38, 0x64, 0x48, 0x31, 0xa9, 390 | 0x88, 0x09, 0x20, 0x59, 0x70, 0xab, 0x11, 0x38, 0x40, 0x69, 0xa8, 0x19, 0x31, 0x48, 0x60, 0x8c, 391 | 0xa8, 0x3c, 0x41, 0x5c, 0x20, 0x7c, 0x00, 0xf1, 0x87, 0x98, 0x19, 0x86, 0xa8, 0x6e, 0x76, 0x7e, 392 | 0xa9, 0x99, 0x88, 0x2d, 0x55, 0x7d, 0xd8, 0xb1, 0xb5, 0xb9, 0xa3, 0xdf, 0xdf, 0xdf, 0xae, 0xd0, 393 | 0xdf, 0xaa, 0xd0, 0xde, 0xf2, 0xab, 0xf8, 0xf9, 0xd9, 0xb0, 0x87, 0xc4, 0xaa, 0xf1, 0xdf, 0xdf, 394 | 0xbb, 0xaf, 0xdf, 0xdf, 0xb9, 0xd8, 0xb1, 0xf1, 0xa3, 0x97, 0x8e, 0x60, 0xdf, 0xb0, 0x84, 0xf2, 395 | 0xc8, 0xf8, 0xf9, 0xd9, 0xde, 0xd8, 0x93, 0x85, 0xf1, 0x4a, 0xb1, 0x83, 0xa3, 0x08, 0xb5, 0x83, 396 | /* bank # 10 */ 397 | 0x9a, 0x08, 0x10, 0xb7, 0x9f, 0x10, 0xd8, 0xf1, 0xb0, 0xba, 0xae, 0xb0, 0x8a, 0xc2, 0xb2, 0xb6, 398 | 0x8e, 0x9e, 0xf1, 0xfb, 0xd9, 0xf4, 0x1d, 0xd8, 0xf9, 0xd9, 0x0c, 0xf1, 0xd8, 0xf8, 0xf8, 0xad, 399 | 0x61, 0xd9, 0xae, 0xfb, 0xd8, 0xf4, 0x0c, 0xf1, 0xd8, 0xf8, 0xf8, 0xad, 0x19, 0xd9, 0xae, 0xfb, 400 | 0xdf, 0xd8, 0xf4, 0x16, 0xf1, 0xd8, 0xf8, 0xad, 0x8d, 0x61, 0xd9, 0xf4, 0xf4, 0xac, 0xf5, 0x9c, 401 | 0x9c, 0x8d, 0xdf, 0x2b, 0xba, 0xb6, 0xae, 0xfa, 0xf8, 0xf4, 0x0b, 0xd8, 0xf1, 0xae, 0xd0, 0xf8, 402 | 0xad, 0x51, 0xda, 0xae, 0xfa, 0xf8, 0xf1, 0xd8, 0xb9, 0xb1, 0xb6, 0xa3, 0x83, 0x9c, 0x08, 0xb9, 403 | 0xb1, 0x83, 0x9a, 0xb5, 0xaa, 0xc0, 0xfd, 0x30, 0x83, 0xb7, 0x9f, 0x10, 0xb5, 0x8b, 0x93, 0xf2, 404 | 0x02, 0x02, 0xd1, 0xab, 0xda, 0xde, 0xd8, 0xf1, 0xb0, 0x80, 0xba, 0xab, 0xc0, 0xc3, 0xb2, 0x84, 405 | 0xc1, 0xc3, 0xd8, 0xb1, 0xb9, 0xf3, 0x8b, 0xa3, 0x91, 0xb6, 0x09, 0xb4, 0xd9, 0xab, 0xde, 0xb0, 406 | 0x87, 0x9c, 0xb9, 0xa3, 0xdd, 0xf1, 0xb3, 0x8b, 0x8b, 0x8b, 0x8b, 0x8b, 0xb0, 0x87, 0xa3, 0xa3, 407 | 0xa3, 0xa3, 0xb2, 0x8b, 0xb6, 0x9b, 0xf2, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 408 | 0xa3, 0xf1, 0xb0, 0x87, 0xb5, 0x9a, 0xa3, 0xf3, 0x9b, 0xa3, 0xa3, 0xdc, 0xba, 0xac, 0xdf, 0xb9, 409 | 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 410 | 0xd8, 0xd8, 0xd8, 0xbb, 0xb3, 0xb7, 0xf1, 0xaa, 0xf9, 0xda, 0xff, 0xd9, 0x80, 0x9a, 0xaa, 0x28, 411 | 0xb4, 0x80, 0x98, 0xa7, 0x20, 0xb7, 0x97, 0x87, 0xa8, 0x66, 0x88, 0xf0, 0x79, 0x51, 0xf1, 0x90, 412 | 0x2c, 0x87, 0x0c, 0xa7, 0x81, 0x97, 0x62, 0x93, 0xf0, 0x71, 0x71, 0x60, 0x85, 0x94, 0x01, 0x29, 413 | /* bank # 11 */ 414 | 0x51, 0x79, 0x90, 0xa5, 0xf1, 0x28, 0x4c, 0x6c, 0x87, 0x0c, 0x95, 0x18, 0x85, 0x78, 0xa3, 0x83, 415 | 0x90, 0x28, 0x4c, 0x6c, 0x88, 0x6c, 0xd8, 0xf3, 0xa2, 0x82, 0x00, 0xf2, 0x10, 0xa8, 0x92, 0x19, 416 | 0x80, 0xa2, 0xf2, 0xd9, 0x26, 0xd8, 0xf1, 0x88, 0xa8, 0x4d, 0xd9, 0x48, 0xd8, 0x96, 0xa8, 0x39, 417 | 0x80, 0xd9, 0x3c, 0xd8, 0x95, 0x80, 0xa8, 0x39, 0xa6, 0x86, 0x98, 0xd9, 0x2c, 0xda, 0x87, 0xa7, 418 | 0x2c, 0xd8, 0xa8, 0x89, 0x95, 0x19, 0xa9, 0x80, 0xd9, 0x38, 0xd8, 0xa8, 0x89, 0x39, 0xa9, 0x80, 419 | 0xda, 0x3c, 0xd8, 0xa8, 0x2e, 0xa8, 0x39, 0x90, 0xd9, 0x0c, 0xd8, 0xa8, 0x95, 0x31, 0x98, 0xd9, 420 | 0x0c, 0xd8, 0xa8, 0x09, 0xd9, 0xff, 0xd8, 0x01, 0xda, 0xff, 0xd8, 0x95, 0x39, 0xa9, 0xda, 0x26, 421 | 0xff, 0xd8, 0x90, 0xa8, 0x0d, 0x89, 0x99, 0xa8, 0x10, 0x80, 0x98, 0x21, 0xda, 0x2e, 0xd8, 0x89, 422 | 0x99, 0xa8, 0x31, 0x80, 0xda, 0x2e, 0xd8, 0xa8, 0x86, 0x96, 0x31, 0x80, 0xda, 0x2e, 0xd8, 0xa8, 423 | 0x87, 0x31, 0x80, 0xda, 0x2e, 0xd8, 0xa8, 0x82, 0x92, 0xf3, 0x41, 0x80, 0xf1, 0xd9, 0x2e, 0xd8, 424 | 0xa8, 0x82, 0xf3, 0x19, 0x80, 0xf1, 0xd9, 0x2e, 0xd8, 0x82, 0xac, 0xf3, 0xc0, 0xa2, 0x80, 0x22, 425 | 0xf1, 0xa6, 0x2e, 0xa7, 0x2e, 0xa9, 0x22, 0x98, 0xa8, 0x29, 0xda, 0xac, 0xde, 0xff, 0xd8, 0xa2, 426 | 0xf2, 0x2a, 0xf1, 0xa9, 0x2e, 0x82, 0x92, 0xa8, 0xf2, 0x31, 0x80, 0xa6, 0x96, 0xf1, 0xd9, 0x00, 427 | 0xac, 0x8c, 0x9c, 0x0c, 0x30, 0xac, 0xde, 0xd0, 0xde, 0xff, 0xd8, 0x8c, 0x9c, 0xac, 0xd0, 0x10, 428 | 0xac, 0xde, 0x80, 0x92, 0xa2, 0xf2, 0x4c, 0x82, 0xa8, 0xf1, 0xca, 0xf2, 0x35, 0xf1, 0x96, 0x88, 429 | 0xa6, 0xd9, 0x00, 0xd8, 0xf1, 0xff 430 | }; 431 | 432 | static const unsigned short sStartAddress = 0x0400; 433 | 434 | /* END OF SECTION COPIED FROM dmpDefaultMPU6050.c */ 435 | 436 | #define INT_SRC_TAP (0x01) 437 | #define INT_SRC_ANDROID_ORIENT (0x08) 438 | 439 | #define DMP_FEATURE_SEND_ANY_GYRO (DMP_FEATURE_SEND_RAW_GYRO | \ 440 | DMP_FEATURE_SEND_CAL_GYRO) 441 | 442 | #define MAX_PACKET_LENGTH (32) 443 | 444 | #define DMP_SAMPLE_RATE (200) 445 | #define GYRO_SF (46850825LL * 200 / DMP_SAMPLE_RATE) 446 | 447 | #define FIFO_CORRUPTION_CHECK 448 | #ifdef FIFO_CORRUPTION_CHECK 449 | #define QUAT_ERROR_THRESH (1L<<24) 450 | #define QUAT_MAG_SQ_NORMALIZED (1L<<28) 451 | #define QUAT_MAG_SQ_MIN (QUAT_MAG_SQ_NORMALIZED - QUAT_ERROR_THRESH) 452 | #define QUAT_MAG_SQ_MAX (QUAT_MAG_SQ_NORMALIZED + QUAT_ERROR_THRESH) 453 | #endif 454 | 455 | struct dmp_s { 456 | void (*tap_cb)(unsigned char count, unsigned char direction); 457 | void (*android_orient_cb)(unsigned char orientation); 458 | unsigned short orient; 459 | unsigned short feature_mask; 460 | unsigned short fifo_rate; 461 | unsigned char packet_length; 462 | }; 463 | 464 | struct dmp_s dmpArray[MPU_MAX_DEVICES]; 465 | 466 | struct dmp_s *dmp; 467 | static int deviceIndex = 0; 468 | 469 | int dmp_select_device(int device) 470 | { 471 | if ((device < 0) || (device >= MPU_MAX_DEVICES)) 472 | return -1; 473 | 474 | deviceIndex = device; 475 | dmp = dmpArray + device; 476 | return 0; 477 | } 478 | 479 | void dmp_init_structures() 480 | { 481 | dmp->tap_cb = NULL; 482 | dmp->android_orient_cb = NULL; 483 | dmp->orient = 0; 484 | dmp->feature_mask = 0; 485 | dmp->fifo_rate = 0; 486 | dmp->packet_length = 0; 487 | } 488 | 489 | /** 490 | * @brief Load the DMP with this image. 491 | * @return 0 if successful. 492 | */ 493 | int dmp_load_motion_driver_firmware(void) 494 | { 495 | return mpu_load_firmware(DMP_CODE_SIZE, dmp_memory, sStartAddress, 496 | DMP_SAMPLE_RATE); 497 | } 498 | 499 | /** 500 | * @brief Push gyro and accel orientation to the dmp-> 501 | * The orientation is represented here as the output of 502 | * @e inv_orientation_matrix_to_scalar. 503 | * @param[in] orient Gyro and accel orientation in body frame. 504 | * @return 0 if successful. 505 | */ 506 | int dmp_set_orientation(unsigned short orient) 507 | { 508 | unsigned char gyro_regs[3], accel_regs[3]; 509 | const unsigned char gyro_axes[3] = {DINA4C, DINACD, DINA6C}; 510 | const unsigned char accel_axes[3] = {DINA0C, DINAC9, DINA2C}; 511 | const unsigned char gyro_sign[3] = {DINA36, DINA56, DINA76}; 512 | const unsigned char accel_sign[3] = {DINA26, DINA46, DINA66}; 513 | 514 | gyro_regs[0] = gyro_axes[orient & 3]; 515 | gyro_regs[1] = gyro_axes[(orient >> 3) & 3]; 516 | gyro_regs[2] = gyro_axes[(orient >> 6) & 3]; 517 | accel_regs[0] = accel_axes[orient & 3]; 518 | accel_regs[1] = accel_axes[(orient >> 3) & 3]; 519 | accel_regs[2] = accel_axes[(orient >> 6) & 3]; 520 | 521 | /* Chip-to-body, axes only. */ 522 | if (mpu_write_mem(FCFG_1, 3, gyro_regs)) 523 | return -1; 524 | if (mpu_write_mem(FCFG_2, 3, accel_regs)) 525 | return -1; 526 | 527 | memcpy(gyro_regs, gyro_sign, 3); 528 | memcpy(accel_regs, accel_sign, 3); 529 | if (orient & 4) { 530 | gyro_regs[0] |= 1; 531 | accel_regs[0] |= 1; 532 | } 533 | if (orient & 0x20) { 534 | gyro_regs[1] |= 1; 535 | accel_regs[1] |= 1; 536 | } 537 | if (orient & 0x100) { 538 | gyro_regs[2] |= 1; 539 | accel_regs[2] |= 1; 540 | } 541 | 542 | /* Chip-to-body, sign only. */ 543 | if (mpu_write_mem(FCFG_3, 3, gyro_regs)) 544 | return -1; 545 | if (mpu_write_mem(FCFG_7, 3, accel_regs)) 546 | return -1; 547 | dmp->orient = orient; 548 | return 0; 549 | } 550 | 551 | /** 552 | * @brief Push gyro biases to the dmp-> 553 | * Because the gyro integration is handled in the DMP, any gyro biases 554 | * calculated by the MPL should be pushed down to DMP memory to remove 555 | * 3-axis quaternion drift. 556 | * \n NOTE: If the DMP-based gyro calibration is enabled, the DMP will 557 | * overwrite the biases written to this location once a new one is computed. 558 | * @param[in] bias Gyro biases in q16. 559 | * @return 0 if successful. 560 | */ 561 | int dmp_set_gyro_bias(long *bias) 562 | { 563 | long gyro_bias_body[3]; 564 | unsigned char regs[4]; 565 | 566 | gyro_bias_body[0] = bias[dmp->orient & 3]; 567 | if (dmp->orient & 4) 568 | gyro_bias_body[0] *= -1; 569 | gyro_bias_body[1] = bias[(dmp->orient >> 3) & 3]; 570 | if (dmp->orient & 0x20) 571 | gyro_bias_body[1] *= -1; 572 | gyro_bias_body[2] = bias[(dmp->orient >> 6) & 3]; 573 | if (dmp->orient & 0x100) 574 | gyro_bias_body[2] *= -1; 575 | 576 | #ifdef EMPL_NO_64BIT 577 | gyro_bias_body[0] = (long)(((float)gyro_bias_body[0] * GYRO_SF) / 1073741824.f); 578 | gyro_bias_body[1] = (long)(((float)gyro_bias_body[1] * GYRO_SF) / 1073741824.f); 579 | gyro_bias_body[2] = (long)(((float)gyro_bias_body[2] * GYRO_SF) / 1073741824.f); 580 | #else 581 | gyro_bias_body[0] = (long)(((long long)gyro_bias_body[0] * GYRO_SF) >> 30); 582 | gyro_bias_body[1] = (long)(((long long)gyro_bias_body[1] * GYRO_SF) >> 30); 583 | gyro_bias_body[2] = (long)(((long long)gyro_bias_body[2] * GYRO_SF) >> 30); 584 | #endif 585 | 586 | regs[0] = (unsigned char)((gyro_bias_body[0] >> 24) & 0xFF); 587 | regs[1] = (unsigned char)((gyro_bias_body[0] >> 16) & 0xFF); 588 | regs[2] = (unsigned char)((gyro_bias_body[0] >> 8) & 0xFF); 589 | regs[3] = (unsigned char)(gyro_bias_body[0] & 0xFF); 590 | if (mpu_write_mem(D_EXT_GYRO_BIAS_X, 4, regs)) 591 | return -1; 592 | 593 | regs[0] = (unsigned char)((gyro_bias_body[1] >> 24) & 0xFF); 594 | regs[1] = (unsigned char)((gyro_bias_body[1] >> 16) & 0xFF); 595 | regs[2] = (unsigned char)((gyro_bias_body[1] >> 8) & 0xFF); 596 | regs[3] = (unsigned char)(gyro_bias_body[1] & 0xFF); 597 | if (mpu_write_mem(D_EXT_GYRO_BIAS_Y, 4, regs)) 598 | return -1; 599 | 600 | regs[0] = (unsigned char)((gyro_bias_body[2] >> 24) & 0xFF); 601 | regs[1] = (unsigned char)((gyro_bias_body[2] >> 16) & 0xFF); 602 | regs[2] = (unsigned char)((gyro_bias_body[2] >> 8) & 0xFF); 603 | regs[3] = (unsigned char)(gyro_bias_body[2] & 0xFF); 604 | return mpu_write_mem(D_EXT_GYRO_BIAS_Z, 4, regs); 605 | } 606 | 607 | /** 608 | * @brief Push accel biases to the dmp-> 609 | * These biases will be removed from the DMP 6-axis quaternion. 610 | * @param[in] bias Accel biases in q16. 611 | * @return 0 if successful. 612 | */ 613 | int dmp_set_accel_bias(long *bias) 614 | { 615 | long accel_bias_body[3]; 616 | unsigned char regs[12]; 617 | long long accel_sf; 618 | unsigned short accel_sens; 619 | 620 | mpu_get_accel_sens(&accel_sens); 621 | accel_sf = (long long)accel_sens << 15; 622 | delay(1); 623 | 624 | accel_bias_body[0] = bias[dmp->orient & 3]; 625 | if (dmp->orient & 4) 626 | accel_bias_body[0] *= -1; 627 | accel_bias_body[1] = bias[(dmp->orient >> 3) & 3]; 628 | if (dmp->orient & 0x20) 629 | accel_bias_body[1] *= -1; 630 | accel_bias_body[2] = bias[(dmp->orient >> 6) & 3]; 631 | if (dmp->orient & 0x100) 632 | accel_bias_body[2] *= -1; 633 | 634 | #ifdef EMPL_NO_64BIT 635 | accel_bias_body[0] = (long)(((float)accel_bias_body[0] * accel_sf) / 1073741824.f); 636 | accel_bias_body[1] = (long)(((float)accel_bias_body[1] * accel_sf) / 1073741824.f); 637 | accel_bias_body[2] = (long)(((float)accel_bias_body[2] * accel_sf) / 1073741824.f); 638 | #else 639 | accel_bias_body[0] = (long)(((long long)accel_bias_body[0] * accel_sf) >> 30); 640 | accel_bias_body[1] = (long)(((long long)accel_bias_body[1] * accel_sf) >> 30); 641 | accel_bias_body[2] = (long)(((long long)accel_bias_body[2] * accel_sf) >> 30); 642 | #endif 643 | 644 | regs[0] = (unsigned char)((accel_bias_body[0] >> 24) & 0xFF); 645 | regs[1] = (unsigned char)((accel_bias_body[0] >> 16) & 0xFF); 646 | regs[2] = (unsigned char)((accel_bias_body[0] >> 8) & 0xFF); 647 | regs[3] = (unsigned char)(accel_bias_body[0] & 0xFF); 648 | regs[4] = (unsigned char)((accel_bias_body[1] >> 24) & 0xFF); 649 | regs[5] = (unsigned char)((accel_bias_body[1] >> 16) & 0xFF); 650 | regs[6] = (unsigned char)((accel_bias_body[1] >> 8) & 0xFF); 651 | regs[7] = (unsigned char)(accel_bias_body[1] & 0xFF); 652 | regs[8] = (unsigned char)((accel_bias_body[2] >> 24) & 0xFF); 653 | regs[9] = (unsigned char)((accel_bias_body[2] >> 16) & 0xFF); 654 | regs[10] = (unsigned char)((accel_bias_body[2] >> 8) & 0xFF); 655 | regs[11] = (unsigned char)(accel_bias_body[2] & 0xFF); 656 | return mpu_write_mem(D_ACCEL_BIAS, 12, regs); 657 | } 658 | 659 | /** 660 | * @brief Set DMP output rate. 661 | * Only used when DMP is on. 662 | * @param[in] rate Desired fifo rate (Hz). 663 | * @return 0 if successful. 664 | */ 665 | int dmp_set_fifo_rate(unsigned short rate) 666 | { 667 | const unsigned char regs_end[12] = {DINAFE, DINAF2, DINAAB, 668 | 0xc4, DINAAA, DINAF1, DINADF, DINADF, 0xBB, 0xAF, DINADF, DINADF}; 669 | unsigned short div; 670 | unsigned char tmp[8]; 671 | 672 | if (rate > DMP_SAMPLE_RATE) 673 | return -1; 674 | div = DMP_SAMPLE_RATE / rate - 1; 675 | tmp[0] = (unsigned char)((div >> 8) & 0xFF); 676 | tmp[1] = (unsigned char)(div & 0xFF); 677 | if (mpu_write_mem(D_0_22, 2, tmp)) 678 | return -1; 679 | if (mpu_write_mem(CFG_6, 12, (unsigned char*)regs_end)) 680 | return -1; 681 | 682 | dmp->fifo_rate = rate; 683 | return 0; 684 | } 685 | 686 | /** 687 | * @brief Get DMP output rate. 688 | * @param[out] rate Current fifo rate (Hz). 689 | * @return 0 if successful. 690 | */ 691 | int dmp_get_fifo_rate(unsigned short *rate) 692 | { 693 | rate[0] = dmp->fifo_rate; 694 | return 0; 695 | } 696 | 697 | #ifdef MPU_MAXIMAL 698 | 699 | /** 700 | * @brief Set tap threshold for a specific axis. 701 | * @param[in] axis 1, 2, and 4 for XYZ accel, respectively. 702 | * @param[in] thresh Tap threshold, in mg/ms. 703 | * @return 0 if successful. 704 | */ 705 | int dmp_set_tap_thresh(unsigned char axis, unsigned short thresh) 706 | { 707 | unsigned char tmp[4], accel_fsr; 708 | float scaled_thresh; 709 | unsigned short dmp_thresh, dmp_thresh_2; 710 | if (!(axis & TAP_XYZ) || thresh > 1600) 711 | return -1; 712 | 713 | scaled_thresh = (float)thresh / DMP_SAMPLE_RATE; 714 | 715 | mpu_get_accel_fsr(&accel_fsr); 716 | switch (accel_fsr) { 717 | case 2: 718 | dmp_thresh = (unsigned short)(scaled_thresh * 16384); 719 | /* dmp_thresh * 0.75 */ 720 | dmp_thresh_2 = (unsigned short)(scaled_thresh * 12288); 721 | break; 722 | case 4: 723 | dmp_thresh = (unsigned short)(scaled_thresh * 8192); 724 | /* dmp_thresh * 0.75 */ 725 | dmp_thresh_2 = (unsigned short)(scaled_thresh * 6144); 726 | break; 727 | case 8: 728 | dmp_thresh = (unsigned short)(scaled_thresh * 4096); 729 | /* dmp_thresh * 0.75 */ 730 | dmp_thresh_2 = (unsigned short)(scaled_thresh * 3072); 731 | break; 732 | case 16: 733 | dmp_thresh = (unsigned short)(scaled_thresh * 2048); 734 | /* dmp_thresh * 0.75 */ 735 | dmp_thresh_2 = (unsigned short)(scaled_thresh * 1536); 736 | break; 737 | default: 738 | return -1; 739 | } 740 | tmp[0] = (unsigned char)(dmp_thresh >> 8); 741 | tmp[1] = (unsigned char)(dmp_thresh & 0xFF); 742 | tmp[2] = (unsigned char)(dmp_thresh_2 >> 8); 743 | tmp[3] = (unsigned char)(dmp_thresh_2 & 0xFF); 744 | 745 | if (axis & TAP_X) { 746 | if (mpu_write_mem(DMP_TAP_THX, 2, tmp)) 747 | return -1; 748 | if (mpu_write_mem(D_1_36, 2, tmp+2)) 749 | return -1; 750 | } 751 | if (axis & TAP_Y) { 752 | if (mpu_write_mem(DMP_TAP_THY, 2, tmp)) 753 | return -1; 754 | if (mpu_write_mem(D_1_40, 2, tmp+2)) 755 | return -1; 756 | } 757 | if (axis & TAP_Z) { 758 | if (mpu_write_mem(DMP_TAP_THZ, 2, tmp)) 759 | return -1; 760 | if (mpu_write_mem(D_1_44, 2, tmp+2)) 761 | return -1; 762 | } 763 | return 0; 764 | } 765 | 766 | /** 767 | * @brief Set which axes will register a tap. 768 | * @param[in] axis 1, 2, and 4 for XYZ, respectively. 769 | * @return 0 if successful. 770 | */ 771 | int dmp_set_tap_axes(unsigned char axis) 772 | { 773 | unsigned char tmp = 0; 774 | 775 | if (axis & TAP_X) 776 | tmp |= 0x30; 777 | if (axis & TAP_Y) 778 | tmp |= 0x0C; 779 | if (axis & TAP_Z) 780 | tmp |= 0x03; 781 | return mpu_write_mem(D_1_72, 1, &tmp); 782 | } 783 | 784 | /** 785 | * @brief Set minimum number of taps needed for an interrupt. 786 | * @param[in] min_taps Minimum consecutive taps (1-4). 787 | * @return 0 if successful. 788 | */ 789 | int dmp_set_tap_count(unsigned char min_taps) 790 | { 791 | unsigned char tmp; 792 | 793 | if (min_taps < 1) 794 | min_taps = 1; 795 | else if (min_taps > 4) 796 | min_taps = 4; 797 | 798 | tmp = min_taps - 1; 799 | return mpu_write_mem(D_1_79, 1, &tmp); 800 | } 801 | 802 | /** 803 | * @brief Set length between valid taps. 804 | * @param[in] time Milliseconds between taps. 805 | * @return 0 if successful. 806 | */ 807 | int dmp_set_tap_time(unsigned short time) 808 | { 809 | unsigned short dmp_time; 810 | unsigned char tmp[2]; 811 | 812 | dmp_time = time / (1000 / DMP_SAMPLE_RATE); 813 | tmp[0] = (unsigned char)(dmp_time >> 8); 814 | tmp[1] = (unsigned char)(dmp_time & 0xFF); 815 | return mpu_write_mem(DMP_TAPW_MIN, 2, tmp); 816 | } 817 | 818 | /** 819 | * @brief Set max time between taps to register as a multi-tap. 820 | * @param[in] time Max milliseconds between taps. 821 | * @return 0 if successful. 822 | */ 823 | int dmp_set_tap_time_multi(unsigned short time) 824 | { 825 | unsigned short dmp_time; 826 | unsigned char tmp[2]; 827 | 828 | dmp_time = time / (1000 / DMP_SAMPLE_RATE); 829 | tmp[0] = (unsigned char)(dmp_time >> 8); 830 | tmp[1] = (unsigned char)(dmp_time & 0xFF); 831 | return mpu_write_mem(D_1_218, 2, tmp); 832 | } 833 | 834 | /** 835 | * @brief Set shake rejection threshold. 836 | * If the DMP detects a gyro sample larger than @e thresh, taps are rejected. 837 | * @param[in] sf Gyro scale factor. 838 | * @param[in] thresh Gyro threshold in dps. 839 | * @return 0 if successful. 840 | */ 841 | int dmp_set_shake_reject_thresh(long sf, unsigned short thresh) 842 | { 843 | unsigned char tmp[4]; 844 | long thresh_scaled = sf / 1000 * thresh; 845 | tmp[0] = (unsigned char)(((long)thresh_scaled >> 24) & 0xFF); 846 | tmp[1] = (unsigned char)(((long)thresh_scaled >> 16) & 0xFF); 847 | tmp[2] = (unsigned char)(((long)thresh_scaled >> 8) & 0xFF); 848 | tmp[3] = (unsigned char)((long)thresh_scaled & 0xFF); 849 | return mpu_write_mem(D_1_92, 4, tmp); 850 | } 851 | 852 | /** 853 | * @brief Set shake rejection time. 854 | * Sets the length of time that the gyro must be outside of the threshold set 855 | * by @e gyro_set_shake_reject_thresh before taps are rejected. A mandatory 856 | * 60 ms is added to this parameter. 857 | * @param[in] time Time in milliseconds. 858 | * @return 0 if successful. 859 | */ 860 | int dmp_set_shake_reject_time(unsigned short time) 861 | { 862 | unsigned char tmp[2]; 863 | 864 | time /= (1000 / DMP_SAMPLE_RATE); 865 | tmp[0] = time >> 8; 866 | tmp[1] = time & 0xFF; 867 | return mpu_write_mem(D_1_90,2,tmp); 868 | } 869 | 870 | /** 871 | * @brief Set shake rejection timeout. 872 | * Sets the length of time after a shake rejection that the gyro must stay 873 | * inside of the threshold before taps can be detected again. A mandatory 874 | * 60 ms is added to this parameter. 875 | * @param[in] time Time in milliseconds. 876 | * @return 0 if successful. 877 | */ 878 | int dmp_set_shake_reject_timeout(unsigned short time) 879 | { 880 | unsigned char tmp[2]; 881 | 882 | time /= (1000 / DMP_SAMPLE_RATE); 883 | tmp[0] = time >> 8; 884 | tmp[1] = time & 0xFF; 885 | return mpu_write_mem(D_1_88,2,tmp); 886 | } 887 | 888 | /** 889 | * @brief Get current step count. 890 | * @param[out] count Number of steps detected. 891 | * @return 0 if successful. 892 | */ 893 | int dmp_get_pedometer_step_count(unsigned long *count) 894 | { 895 | unsigned char tmp[4]; 896 | if (!count) 897 | return -1; 898 | 899 | if (mpu_read_mem(D_PEDSTD_STEPCTR, 4, tmp)) 900 | return -1; 901 | 902 | count[0] = ((unsigned long)tmp[0] << 24) | ((unsigned long)tmp[1] << 16) | 903 | ((unsigned long)tmp[2] << 8) | tmp[3]; 904 | return 0; 905 | } 906 | 907 | /** 908 | * @brief Overwrite current step count. 909 | * WARNING: This function writes to DMP memory and could potentially encounter 910 | * a race condition if called while the pedometer is enabled. 911 | * @param[in] count New step count. 912 | * @return 0 if successful. 913 | */ 914 | int dmp_set_pedometer_step_count(unsigned long count) 915 | { 916 | unsigned char tmp[4]; 917 | 918 | tmp[0] = (unsigned char)((count >> 24) & 0xFF); 919 | tmp[1] = (unsigned char)((count >> 16) & 0xFF); 920 | tmp[2] = (unsigned char)((count >> 8) & 0xFF); 921 | tmp[3] = (unsigned char)(count & 0xFF); 922 | return mpu_write_mem(D_PEDSTD_STEPCTR, 4, tmp); 923 | } 924 | 925 | /** 926 | * @brief Get duration of walking time. 927 | * @param[in] time Walk time in milliseconds. 928 | * @return 0 if successful. 929 | */ 930 | int dmp_get_pedometer_walk_time(unsigned long *time) 931 | { 932 | unsigned char tmp[4]; 933 | if (!time) 934 | return -1; 935 | 936 | if (mpu_read_mem(D_PEDSTD_TIMECTR, 4, tmp)) 937 | return -1; 938 | 939 | time[0] = (((unsigned long)tmp[0] << 24) | ((unsigned long)tmp[1] << 16) | 940 | ((unsigned long)tmp[2] << 8) | tmp[3]) * 20; 941 | return 0; 942 | } 943 | 944 | /** 945 | * @brief Overwrite current walk time. 946 | * WARNING: This function writes to DMP memory and could potentially encounter 947 | * a race condition if called while the pedometer is enabled. 948 | * @param[in] time New walk time in milliseconds. 949 | */ 950 | int dmp_set_pedometer_walk_time(unsigned long time) 951 | { 952 | unsigned char tmp[4]; 953 | 954 | time /= 20; 955 | 956 | tmp[0] = (unsigned char)((time >> 24) & 0xFF); 957 | tmp[1] = (unsigned char)((time >> 16) & 0xFF); 958 | tmp[2] = (unsigned char)((time >> 8) & 0xFF); 959 | tmp[3] = (unsigned char)(time & 0xFF); 960 | return mpu_write_mem(D_PEDSTD_TIMECTR, 4, tmp); 961 | } 962 | #endif // MPU_MAXIMAL 963 | 964 | /** 965 | * @brief Enable DMP features. 966 | * The following \#define's are used in the input mask: 967 | * \n DMP_FEATURE_TAP 968 | * \n DMP_FEATURE_ANDROID_ORIENT 969 | * \n DMP_FEATURE_LP_QUAT 970 | * \n DMP_FEATURE_6X_LP_QUAT 971 | * \n DMP_FEATURE_GYRO_CAL 972 | * \n DMP_FEATURE_SEND_RAW_ACCEL 973 | * \n DMP_FEATURE_SEND_RAW_GYRO 974 | * \n NOTE: DMP_FEATURE_LP_QUAT and DMP_FEATURE_6X_LP_QUAT are mutually 975 | * exclusive. 976 | * \n NOTE: DMP_FEATURE_SEND_RAW_GYRO and DMP_FEATURE_SEND_CAL_GYRO are also 977 | * mutually exclusive. 978 | * @param[in] mask Mask of features to enable. 979 | * @return 0 if successful. 980 | */ 981 | int dmp_enable_feature(unsigned short mask) 982 | { 983 | unsigned char tmp[10]; 984 | 985 | /* TODO: All of these settings can probably be integrated into the default 986 | * DMP image. 987 | */ 988 | /* Set integration scale factor. */ 989 | tmp[0] = (unsigned char)((GYRO_SF >> 24) & 0xFF); 990 | tmp[1] = (unsigned char)((GYRO_SF >> 16) & 0xFF); 991 | tmp[2] = (unsigned char)((GYRO_SF >> 8) & 0xFF); 992 | tmp[3] = (unsigned char)(GYRO_SF & 0xFF); 993 | mpu_write_mem(D_0_104, 4, tmp); 994 | 995 | /* Send sensor data to the FIFO. */ 996 | tmp[0] = 0xA3; 997 | if (mask & DMP_FEATURE_SEND_RAW_ACCEL) { 998 | tmp[1] = 0xC0; 999 | tmp[2] = 0xC8; 1000 | tmp[3] = 0xC2; 1001 | } else { 1002 | tmp[1] = 0xA3; 1003 | tmp[2] = 0xA3; 1004 | tmp[3] = 0xA3; 1005 | } 1006 | if (mask & DMP_FEATURE_SEND_ANY_GYRO) { 1007 | tmp[4] = 0xC4; 1008 | tmp[5] = 0xCC; 1009 | tmp[6] = 0xC6; 1010 | } else { 1011 | tmp[4] = 0xA3; 1012 | tmp[5] = 0xA3; 1013 | tmp[6] = 0xA3; 1014 | } 1015 | tmp[7] = 0xA3; 1016 | tmp[8] = 0xA3; 1017 | tmp[9] = 0xA3; 1018 | mpu_write_mem(CFG_15,10,tmp); 1019 | 1020 | /* Send gesture data to the FIFO. */ 1021 | if (mask & (DMP_FEATURE_TAP | DMP_FEATURE_ANDROID_ORIENT)) 1022 | tmp[0] = DINA20; 1023 | else 1024 | tmp[0] = 0xD8; 1025 | mpu_write_mem(CFG_27,1,tmp); 1026 | 1027 | if (mask & DMP_FEATURE_GYRO_CAL) 1028 | dmp_enable_gyro_cal(1); 1029 | else 1030 | dmp_enable_gyro_cal(0); 1031 | 1032 | if (mask & DMP_FEATURE_SEND_ANY_GYRO) { 1033 | if (mask & DMP_FEATURE_SEND_CAL_GYRO) { 1034 | tmp[0] = 0xB2; 1035 | tmp[1] = 0x8B; 1036 | tmp[2] = 0xB6; 1037 | tmp[3] = 0x9B; 1038 | } else { 1039 | tmp[0] = DINAC0; 1040 | tmp[1] = DINA80; 1041 | tmp[2] = DINAC2; 1042 | tmp[3] = DINA90; 1043 | } 1044 | mpu_write_mem(CFG_GYRO_RAW_DATA, 4, tmp); 1045 | } 1046 | 1047 | #ifdef MPU_MAXIMAL 1048 | if (mask & DMP_FEATURE_TAP) { 1049 | /* Enable tap. */ 1050 | tmp[0] = 0xF8; 1051 | mpu_write_mem(CFG_20, 1, tmp); 1052 | dmp_set_tap_thresh(TAP_XYZ, 250); 1053 | dmp_set_tap_axes(TAP_XYZ); 1054 | dmp_set_tap_count(1); 1055 | dmp_set_tap_time(100); 1056 | dmp_set_tap_time_multi(500); 1057 | 1058 | dmp_set_shake_reject_thresh(GYRO_SF, 200); 1059 | dmp_set_shake_reject_time(40); 1060 | dmp_set_shake_reject_timeout(10); 1061 | } else { 1062 | tmp[0] = 0xD8; 1063 | mpu_write_mem(CFG_20, 1, tmp); 1064 | } 1065 | 1066 | if (mask & DMP_FEATURE_ANDROID_ORIENT) { 1067 | tmp[0] = 0xD9; 1068 | } else 1069 | tmp[0] = 0xD8; 1070 | mpu_write_mem(CFG_ANDROID_ORIENT_INT, 1, tmp); 1071 | #endif // MPU_MAXIMAL 1072 | 1073 | if (mask & DMP_FEATURE_LP_QUAT) 1074 | dmp_enable_lp_quat(1); 1075 | else 1076 | dmp_enable_lp_quat(0); 1077 | 1078 | if (mask & DMP_FEATURE_6X_LP_QUAT) 1079 | dmp_enable_6x_lp_quat(1); 1080 | else 1081 | dmp_enable_6x_lp_quat(0); 1082 | 1083 | /* Pedometer is always enabled. */ 1084 | dmp->feature_mask = mask | DMP_FEATURE_PEDOMETER; 1085 | mpu_reset_fifo(); 1086 | 1087 | dmp->packet_length = 0; 1088 | if (mask & DMP_FEATURE_SEND_RAW_ACCEL) 1089 | dmp->packet_length += 6; 1090 | if (mask & DMP_FEATURE_SEND_ANY_GYRO) 1091 | dmp->packet_length += 6; 1092 | if (mask & (DMP_FEATURE_LP_QUAT | DMP_FEATURE_6X_LP_QUAT)) 1093 | dmp->packet_length += 16; 1094 | if (mask & (DMP_FEATURE_TAP | DMP_FEATURE_ANDROID_ORIENT)) 1095 | dmp->packet_length += 4; 1096 | 1097 | return 0; 1098 | } 1099 | 1100 | /** 1101 | * @brief Get list of currently enabled DMP features. 1102 | * @param[out] Mask of enabled features. 1103 | * @return 0 if successful. 1104 | */ 1105 | int dmp_get_enabled_features(unsigned short *mask) 1106 | { 1107 | mask[0] = dmp->feature_mask; 1108 | return 0; 1109 | } 1110 | 1111 | /** 1112 | * @brief Calibrate the gyro data in the dmp-> 1113 | * After eight seconds of no motion, the DMP will compute gyro biases and 1114 | * subtract them from the quaternion output. If @e dmp_enable_feature is 1115 | * called with @e DMP_FEATURE_SEND_CAL_GYRO, the biases will also be 1116 | * subtracted from the gyro output. 1117 | * @param[in] enable 1 to enable gyro calibration. 1118 | * @return 0 if successful. 1119 | */ 1120 | int dmp_enable_gyro_cal(unsigned char enable) 1121 | { 1122 | if (enable) { 1123 | unsigned char regs[9] = {0xb8, 0xaa, 0xb3, 0x8d, 0xb4, 0x98, 0x0d, 0x35, 0x5d}; 1124 | return mpu_write_mem(CFG_MOTION_BIAS, 9, regs); 1125 | } else { 1126 | unsigned char regs[9] = {0xb8, 0xaa, 0xaa, 0xaa, 0xb0, 0x88, 0xc3, 0xc5, 0xc7}; 1127 | return mpu_write_mem(CFG_MOTION_BIAS, 9, regs); 1128 | } 1129 | } 1130 | 1131 | /** 1132 | * @brief Generate 3-axis quaternions from the dmp-> 1133 | * In this driver, the 3-axis and 6-axis DMP quaternion features are mutually 1134 | * exclusive. 1135 | * @param[in] enable 1 to enable 3-axis quaternion. 1136 | * @return 0 if successful. 1137 | */ 1138 | int dmp_enable_lp_quat(unsigned char enable) 1139 | { 1140 | unsigned char regs[4]; 1141 | if (enable) { 1142 | regs[0] = DINBC0; 1143 | regs[1] = DINBC2; 1144 | regs[2] = DINBC4; 1145 | regs[3] = DINBC6; 1146 | } 1147 | else 1148 | memset(regs, 0x8B, 4); 1149 | 1150 | mpu_write_mem(CFG_LP_QUAT, 4, regs); 1151 | 1152 | return mpu_reset_fifo(); 1153 | } 1154 | 1155 | /** 1156 | * @brief Generate 6-axis quaternions from the dmp-> 1157 | * In this driver, the 3-axis and 6-axis DMP quaternion features are mutually 1158 | * exclusive. 1159 | * @param[in] enable 1 to enable 6-axis quaternion. 1160 | * @return 0 if successful. 1161 | */ 1162 | int dmp_enable_6x_lp_quat(unsigned char enable) 1163 | { 1164 | unsigned char regs[4]; 1165 | if (enable) { 1166 | regs[0] = DINA20; 1167 | regs[1] = DINA28; 1168 | regs[2] = DINA30; 1169 | regs[3] = DINA38; 1170 | } else 1171 | memset(regs, 0xA3, 4); 1172 | 1173 | mpu_write_mem(CFG_8, 4, regs); 1174 | 1175 | return mpu_reset_fifo(); 1176 | } 1177 | 1178 | #ifdef MPU_MAXIMAL 1179 | /** 1180 | * @brief Decode the four-byte gesture data and execute any callbacks. 1181 | * @param[in] gesture Gesture data from DMP packet. 1182 | * @return 0 if successful. 1183 | */ 1184 | static int decode_gesture(unsigned char *gesture) 1185 | { 1186 | unsigned char tap, android_orient; 1187 | 1188 | android_orient = gesture[3] & 0xC0; 1189 | tap = 0x3F & gesture[3]; 1190 | 1191 | if (gesture[1] & INT_SRC_TAP) { 1192 | unsigned char direction, count; 1193 | direction = tap >> 3; 1194 | count = (tap % 8) + 1; 1195 | if (dmp->tap_cb) 1196 | dmp->tap_cb(direction, count); 1197 | } 1198 | 1199 | if (gesture[1] & INT_SRC_ANDROID_ORIENT) { 1200 | if (dmp->android_orient_cb) 1201 | dmp->android_orient_cb(android_orient >> 6); 1202 | } 1203 | 1204 | return 0; 1205 | } 1206 | #endif // MPU_MAXIMAL 1207 | 1208 | /** 1209 | * @brief Specify when a DMP interrupt should occur. 1210 | * A DMP interrupt can be configured to trigger on either of the two 1211 | * conditions below: 1212 | * \n a. One FIFO period has elapsed (set by @e mpu_set_sample_rate). 1213 | * \n b. A tap event has been detected. 1214 | * @param[in] mode DMP_INT_GESTURE or DMP_INT_CONTINUOUS. 1215 | * @return 0 if successful. 1216 | */ 1217 | int dmp_set_interrupt_mode(unsigned char mode) 1218 | { 1219 | const unsigned char regs_continuous[11] = 1220 | {0xd8, 0xb1, 0xb9, 0xf3, 0x8b, 0xa3, 0x91, 0xb6, 0x09, 0xb4, 0xd9}; 1221 | const unsigned char regs_gesture[11] = 1222 | {0xda, 0xb1, 0xb9, 0xf3, 0x8b, 0xa3, 0x91, 0xb6, 0xda, 0xb4, 0xda}; 1223 | 1224 | switch (mode) { 1225 | case DMP_INT_CONTINUOUS: 1226 | return mpu_write_mem(CFG_FIFO_ON_EVENT, 11, 1227 | (unsigned char*)regs_continuous); 1228 | case DMP_INT_GESTURE: 1229 | return mpu_write_mem(CFG_FIFO_ON_EVENT, 11, 1230 | (unsigned char*)regs_gesture); 1231 | default: 1232 | return -1; 1233 | } 1234 | } 1235 | 1236 | /** 1237 | * @brief Get one packet from the FIFO. 1238 | * If @e sensors does not contain a particular sensor, disregard the data 1239 | * returned to that pointer. 1240 | * \n @e sensors can contain a combination of the following flags: 1241 | * \n INV_X_GYRO, INV_Y_GYRO, INV_Z_GYRO 1242 | * \n INV_XYZ_GYRO 1243 | * \n INV_XYZ_ACCEL 1244 | * \n INV_WXYZ_QUAT 1245 | * \n If the FIFO has no new data, @e sensors will be zero. 1246 | * \n If the FIFO is disabled, @e sensors will be zero and this function will 1247 | * return a non-zero error code. 1248 | * @param[out] gyro Gyro data in hardware units. 1249 | * @param[out] accel Accel data in hardware units. 1250 | * @param[out] quat 3-axis quaternion data in hardware units. 1251 | * @param[out] timestamp Timestamp in milliseconds. 1252 | * @param[out] sensors Mask of sensors read from FIFO. 1253 | * @param[out] more Number of remaining packets. 1254 | * @return 0 if successful. 1255 | */ 1256 | int dmp_read_fifo(short *gyro, short *accel, long *quat, 1257 | unsigned long *timestamp, short *sensors, unsigned char *more) 1258 | { 1259 | unsigned char fifo_data[MAX_PACKET_LENGTH]; 1260 | unsigned char ii = 0; 1261 | int errCode; 1262 | 1263 | /* TODO: sensors[0] only changes when dmp_enable_feature is called. We can 1264 | * cache this value and save some cycles. 1265 | */ 1266 | sensors[0] = 0; 1267 | 1268 | /* Get a packet. */ 1269 | if ((errCode = mpu_read_fifo_stream(dmp->packet_length, fifo_data, more))) 1270 | return errCode; 1271 | 1272 | /* Parse DMP packet. */ 1273 | if (dmp->feature_mask & (DMP_FEATURE_LP_QUAT | DMP_FEATURE_6X_LP_QUAT)) { 1274 | #ifdef FIFO_CORRUPTION_CHECK 1275 | long quat_q14[4], quat_mag_sq; 1276 | #endif 1277 | quat[0] = ((long)fifo_data[0] << 24) | ((long)fifo_data[1] << 16) | 1278 | ((long)fifo_data[2] << 8) | fifo_data[3]; 1279 | quat[1] = ((long)fifo_data[4] << 24) | ((long)fifo_data[5] << 16) | 1280 | ((long)fifo_data[6] << 8) | fifo_data[7]; 1281 | quat[2] = ((long)fifo_data[8] << 24) | ((long)fifo_data[9] << 16) | 1282 | ((long)fifo_data[10] << 8) | fifo_data[11]; 1283 | quat[3] = ((long)fifo_data[12] << 24) | ((long)fifo_data[13] << 16) | 1284 | ((long)fifo_data[14] << 8) | fifo_data[15]; 1285 | ii += 16; 1286 | #ifdef FIFO_CORRUPTION_CHECK 1287 | /* We can detect a corrupted FIFO by monitoring the quaternion data and 1288 | * ensuring that the magnitude is always normalized to one. This 1289 | * shouldn't happen in normal operation, but if an I2C error occurs, 1290 | * the FIFO reads might become misaligned. 1291 | * 1292 | * Let's start by scaling down the quaternion data to avoid long long 1293 | * math. 1294 | */ 1295 | quat_q14[0] = quat[0] >> 16; 1296 | quat_q14[1] = quat[1] >> 16; 1297 | quat_q14[2] = quat[2] >> 16; 1298 | quat_q14[3] = quat[3] >> 16; 1299 | quat_mag_sq = quat_q14[0] * quat_q14[0] + quat_q14[1] * quat_q14[1] + 1300 | quat_q14[2] * quat_q14[2] + quat_q14[3] * quat_q14[3]; 1301 | if ((quat_mag_sq < QUAT_MAG_SQ_MIN) || 1302 | (quat_mag_sq > QUAT_MAG_SQ_MAX)) { 1303 | /* Quaternion is outside of the acceptable threshold. */ 1304 | mpu_reset_fifo(); 1305 | sensors[0] = 0; 1306 | return 3; 1307 | }; 1308 | sensors[0] |= INV_WXYZ_QUAT; 1309 | #endif 1310 | } 1311 | 1312 | if (dmp->feature_mask & DMP_FEATURE_SEND_RAW_ACCEL) { 1313 | accel[0] = ((short)fifo_data[ii+0] << 8) | fifo_data[ii+1]; 1314 | accel[1] = ((short)fifo_data[ii+2] << 8) | fifo_data[ii+3]; 1315 | accel[2] = ((short)fifo_data[ii+4] << 8) | fifo_data[ii+5]; 1316 | ii += 6; 1317 | sensors[0] |= INV_XYZ_ACCEL; 1318 | } 1319 | 1320 | if (dmp->feature_mask & DMP_FEATURE_SEND_ANY_GYRO) { 1321 | gyro[0] = ((short)fifo_data[ii+0] << 8) | fifo_data[ii+1]; 1322 | gyro[1] = ((short)fifo_data[ii+2] << 8) | fifo_data[ii+3]; 1323 | gyro[2] = ((short)fifo_data[ii+4] << 8) | fifo_data[ii+5]; 1324 | ii += 6; 1325 | sensors[0] |= INV_XYZ_GYRO; 1326 | } 1327 | #ifdef MPU_MAXIMAL 1328 | /* Gesture data is at the end of the DMP packet. Parse it and call 1329 | * the gesture callbacks (if registered). 1330 | */ 1331 | if (dmp->feature_mask & (DMP_FEATURE_TAP | DMP_FEATURE_ANDROID_ORIENT)) 1332 | decode_gesture(fifo_data + ii); 1333 | #endif // MPU_MAXIMAL 1334 | if (timestamp) 1335 | get_ms(timestamp); 1336 | return 0; 1337 | } 1338 | 1339 | #ifdef MPU_MAXIMAL 1340 | /** 1341 | * @brief Register a function to be executed on a tap event. 1342 | * The tap direction is represented by one of the following: 1343 | * \n TAP_X_UP 1344 | * \n TAP_X_DOWN 1345 | * \n TAP_Y_UP 1346 | * \n TAP_Y_DOWN 1347 | * \n TAP_Z_UP 1348 | * \n TAP_Z_DOWN 1349 | * @param[in] func Callback function. 1350 | * @return 0 if successful. 1351 | */ 1352 | int dmp_register_tap_cb(void (*func)(unsigned char, unsigned char)) 1353 | { 1354 | dmp->tap_cb = func; 1355 | return 0; 1356 | } 1357 | 1358 | /** 1359 | * @brief Register a function to be executed on a android orientation event. 1360 | * @param[in] func Callback function. 1361 | * @return 0 if successful. 1362 | */ 1363 | int dmp_register_android_orient_cb(void (*func)(unsigned char)) 1364 | { 1365 | dmp->android_orient_cb = func; 1366 | return 0; 1367 | } 1368 | #endif // MPU_MAXIMAL 1369 | 1370 | /** 1371 | * @} 1372 | */ 1373 | 1374 | --------------------------------------------------------------------------------