MPU9250

Dependents:   FreeIMU

Fork of MPU6050 by Yifei Teng

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers MPU6050.h Source File

MPU6050.h

00001 //ported from arduino library: https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050
00002 //written by szymon gaertig (email: szymon@gaertig.com.pl)
00003 //
00004 //Changelog: 
00005 //2013-01-08 - first beta release
00006 
00007 // I2Cdev library collection - MPU6050 I2C device class
00008 // Based on InvenSense MPU-6050 register map document rev. 2.0, 5/19/2011 (RM-MPU-6000A-00)
00009 // 10/3/2011 by Jeff Rowberg <jeff@rowberg.net>
00010 // Updates should (hopefully) always be available at https://github.com/jrowberg/i2cdevlib
00011 //
00012 // Changelog:
00013 //     ... - ongoing debug release
00014 
00015 // NOTE: THIS IS ONLY A PARIAL RELEASE. THIS DEVICE CLASS IS CURRENTLY UNDERGOING ACTIVE
00016 // DEVELOPMENT AND IS STILL MISSING SOME IMPORTANT FEATURES. PLEASE KEEP THIS IN MIND IF
00017 // YOU DECIDE TO USE THIS PARTICULAR CODE FOR ANYTHING.
00018 
00019 /* ============================================
00020 I2Cdev device library code is placed under the MIT license
00021 Copyright (c) 2012 Jeff Rowberg
00022 
00023 Permission is hereby granted, free of charge, to any person obtaining a copy
00024 of this software and associated documentation files (the "Software"), to deal
00025 in the Software without restriction, including without limitation the rights
00026 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
00027 copies of the Software, and to permit persons to whom the Software is
00028 furnished to do so, subject to the following conditions:
00029 
00030 The above copyright notice and this permission notice shall be included in
00031 all copies or substantial portions of the Software.
00032 
00033 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
00034 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00035 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
00036 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00037 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00038 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
00039 THE SOFTWARE.
00040 ===============================================
00041 */
00042 
00043 #ifndef _MPU6050_H_
00044 #define _MPU6050_H_
00045 
00046 #include "mbed.h"
00047 #include "I2Cdev.h"
00048 #include "helper_3dmath.h"
00049 
00050 
00051 // select MPU9250 or MPU6050
00052 #define MPU9250
00053 //#define MPU6050
00054 
00055 
00056 #ifdef MPU9250
00057 #include "AK8963.h"
00058 #endif
00059 
00060 #define MPU6050_ADDRESS_AD0_LOW     0x68 // address pin low (GND), default for InvenSense evaluation board
00061 #define MPU6050_ADDRESS_AD0_HIGH    0x69 // address pin high (VCC)
00062 #define MPU6050_DEFAULT_ADDRESS     MPU6050_ADDRESS_AD0_LOW
00063 
00064 #define MPU6050_RA_XG_OFFS_TC       0x00 //[7] PWR_MODE, [6:1] XG_OFFS_TC, [0] OTP_BNK_VLD
00065 #define MPU6050_RA_YG_OFFS_TC       0x01 //[7] PWR_MODE, [6:1] YG_OFFS_TC, [0] OTP_BNK_VLD
00066 #define MPU6050_RA_ZG_OFFS_TC       0x02 //[7] PWR_MODE, [6:1] ZG_OFFS_TC, [0] OTP_BNK_VLD
00067 #define MPU6050_RA_X_FINE_GAIN      0x03 //[7:0] X_FINE_GAIN
00068 #define MPU6050_RA_Y_FINE_GAIN      0x04 //[7:0] Y_FINE_GAIN
00069 #define MPU6050_RA_Z_FINE_GAIN      0x05 //[7:0] Z_FINE_GAIN
00070 #define MPU6050_RA_XA_OFFS_H        0x06 //[15:0] XA_OFFS
00071 #define MPU6050_RA_XA_OFFS_L_TC     0x07
00072 #define MPU6050_RA_YA_OFFS_H        0x08 //[15:0] YA_OFFS
00073 #define MPU6050_RA_YA_OFFS_L_TC     0x09
00074 #define MPU6050_RA_ZA_OFFS_H        0x0A //[15:0] ZA_OFFS
00075 #define MPU6050_RA_ZA_OFFS_L_TC     0x0B
00076 #define MPU6050_RA_XG_OFFS_USRH     0x13 //[15:0] XG_OFFS_USR
00077 #define MPU6050_RA_XG_OFFS_USRL     0x14
00078 #define MPU6050_RA_YG_OFFS_USRH     0x15 //[15:0] YG_OFFS_USR
00079 #define MPU6050_RA_YG_OFFS_USRL     0x16
00080 #define MPU6050_RA_ZG_OFFS_USRH     0x17 //[15:0] ZG_OFFS_USR
00081 #define MPU6050_RA_ZG_OFFS_USRL     0x18
00082 #define MPU6050_RA_SMPLRT_DIV       0x19
00083 #define MPU6050_RA_CONFIG           0x1A
00084 #define MPU6050_RA_GYRO_CONFIG      0x1B
00085 #define MPU6050_RA_ACCEL_CONFIG     0x1C
00086 #define MPU6050_RA_FF_THR           0x1D
00087 #define MPU6050_RA_FF_DUR           0x1E
00088 #define MPU6050_RA_MOT_THR          0x1F
00089 #define MPU6050_RA_MOT_DUR          0x20
00090 #define MPU6050_RA_ZRMOT_THR        0x21
00091 #define MPU6050_RA_ZRMOT_DUR        0x22
00092 #define MPU6050_RA_FIFO_EN          0x23
00093 #define MPU6050_RA_I2C_MST_CTRL     0x24
00094 #define MPU6050_RA_I2C_SLV0_ADDR    0x25
00095 #define MPU6050_RA_I2C_SLV0_REG     0x26
00096 #define MPU6050_RA_I2C_SLV0_CTRL    0x27
00097 #define MPU6050_RA_I2C_SLV1_ADDR    0x28
00098 #define MPU6050_RA_I2C_SLV1_REG     0x29
00099 #define MPU6050_RA_I2C_SLV1_CTRL    0x2A
00100 #define MPU6050_RA_I2C_SLV2_ADDR    0x2B
00101 #define MPU6050_RA_I2C_SLV2_REG     0x2C
00102 #define MPU6050_RA_I2C_SLV2_CTRL    0x2D
00103 #define MPU6050_RA_I2C_SLV3_ADDR    0x2E
00104 #define MPU6050_RA_I2C_SLV3_REG     0x2F
00105 #define MPU6050_RA_I2C_SLV3_CTRL    0x30
00106 #define MPU6050_RA_I2C_SLV4_ADDR    0x31
00107 #define MPU6050_RA_I2C_SLV4_REG     0x32
00108 #define MPU6050_RA_I2C_SLV4_DO      0x33
00109 #define MPU6050_RA_I2C_SLV4_CTRL    0x34
00110 #define MPU6050_RA_I2C_SLV4_DI      0x35
00111 #define MPU6050_RA_I2C_MST_STATUS   0x36
00112 #define MPU6050_RA_INT_PIN_CFG      0x37
00113 #define MPU6050_RA_INT_ENABLE       0x38
00114 #define MPU6050_RA_DMP_INT_STATUS   0x39
00115 #define MPU6050_RA_INT_STATUS       0x3A
00116 #define MPU6050_RA_ACCEL_XOUT_H     0x3B
00117 #define MPU6050_RA_ACCEL_XOUT_L     0x3C
00118 #define MPU6050_RA_ACCEL_YOUT_H     0x3D
00119 #define MPU6050_RA_ACCEL_YOUT_L     0x3E
00120 #define MPU6050_RA_ACCEL_ZOUT_H     0x3F
00121 #define MPU6050_RA_ACCEL_ZOUT_L     0x40
00122 #define MPU6050_RA_TEMP_OUT_H       0x41
00123 #define MPU6050_RA_TEMP_OUT_L       0x42
00124 #define MPU6050_RA_GYRO_XOUT_H      0x43
00125 #define MPU6050_RA_GYRO_XOUT_L      0x44
00126 #define MPU6050_RA_GYRO_YOUT_H      0x45
00127 #define MPU6050_RA_GYRO_YOUT_L      0x46
00128 #define MPU6050_RA_GYRO_ZOUT_H      0x47
00129 #define MPU6050_RA_GYRO_ZOUT_L      0x48
00130 #define MPU6050_RA_EXT_SENS_DATA_00 0x49
00131 #define MPU6050_RA_EXT_SENS_DATA_01 0x4A
00132 #define MPU6050_RA_EXT_SENS_DATA_02 0x4B
00133 #define MPU6050_RA_EXT_SENS_DATA_03 0x4C
00134 #define MPU6050_RA_EXT_SENS_DATA_04 0x4D
00135 #define MPU6050_RA_EXT_SENS_DATA_05 0x4E
00136 #define MPU6050_RA_EXT_SENS_DATA_06 0x4F
00137 #define MPU6050_RA_EXT_SENS_DATA_07 0x50
00138 #define MPU6050_RA_EXT_SENS_DATA_08 0x51
00139 #define MPU6050_RA_EXT_SENS_DATA_09 0x52
00140 #define MPU6050_RA_EXT_SENS_DATA_10 0x53
00141 #define MPU6050_RA_EXT_SENS_DATA_11 0x54
00142 #define MPU6050_RA_EXT_SENS_DATA_12 0x55
00143 #define MPU6050_RA_EXT_SENS_DATA_13 0x56
00144 #define MPU6050_RA_EXT_SENS_DATA_14 0x57
00145 #define MPU6050_RA_EXT_SENS_DATA_15 0x58
00146 #define MPU6050_RA_EXT_SENS_DATA_16 0x59
00147 #define MPU6050_RA_EXT_SENS_DATA_17 0x5A
00148 #define MPU6050_RA_EXT_SENS_DATA_18 0x5B
00149 #define MPU6050_RA_EXT_SENS_DATA_19 0x5C
00150 #define MPU6050_RA_EXT_SENS_DATA_20 0x5D
00151 #define MPU6050_RA_EXT_SENS_DATA_21 0x5E
00152 #define MPU6050_RA_EXT_SENS_DATA_22 0x5F
00153 #define MPU6050_RA_EXT_SENS_DATA_23 0x60
00154 #define MPU6050_RA_MOT_DETECT_STATUS    0x61
00155 #define MPU6050_RA_I2C_SLV0_DO      0x63
00156 #define MPU6050_RA_I2C_SLV1_DO      0x64
00157 #define MPU6050_RA_I2C_SLV2_DO      0x65
00158 #define MPU6050_RA_I2C_SLV3_DO      0x66
00159 #define MPU6050_RA_I2C_MST_DELAY_CTRL   0x67
00160 #define MPU6050_RA_SIGNAL_PATH_RESET    0x68
00161 #define MPU6050_RA_MOT_DETECT_CTRL      0x69
00162 #define MPU6050_RA_USER_CTRL        0x6A
00163 #define MPU6050_RA_PWR_MGMT_1       0x6B
00164 #define MPU6050_RA_PWR_MGMT_2       0x6C
00165 #define MPU6050_RA_BANK_SEL         0x6D
00166 #define MPU6050_RA_MEM_START_ADDR   0x6E
00167 #define MPU6050_RA_MEM_R_W          0x6F
00168 #define MPU6050_RA_DMP_CFG_1        0x70
00169 #define MPU6050_RA_DMP_CFG_2        0x71
00170 #define MPU6050_RA_FIFO_COUNTH      0x72
00171 #define MPU6050_RA_FIFO_COUNTL      0x73
00172 #define MPU6050_RA_FIFO_R_W         0x74
00173 #define MPU6050_RA_WHO_AM_I         0x75
00174 
00175 #define MPU6050_TC_PWR_MODE_BIT     7
00176 #define MPU6050_TC_OFFSET_BIT       6
00177 #define MPU6050_TC_OFFSET_LENGTH    6
00178 #define MPU6050_TC_OTP_BNK_VLD_BIT  0
00179 
00180 #define MPU6050_VDDIO_LEVEL_VLOGIC  0
00181 #define MPU6050_VDDIO_LEVEL_VDD     1
00182 
00183 #define MPU6050_CFG_EXT_SYNC_SET_BIT    5
00184 #define MPU6050_CFG_EXT_SYNC_SET_LENGTH 3
00185 #define MPU6050_CFG_DLPF_CFG_BIT    2
00186 #define MPU6050_CFG_DLPF_CFG_LENGTH 3
00187 
00188 #define MPU6050_EXT_SYNC_DISABLED       0x0
00189 #define MPU6050_EXT_SYNC_TEMP_OUT_L     0x1
00190 #define MPU6050_EXT_SYNC_GYRO_XOUT_L    0x2
00191 #define MPU6050_EXT_SYNC_GYRO_YOUT_L    0x3
00192 #define MPU6050_EXT_SYNC_GYRO_ZOUT_L    0x4
00193 #define MPU6050_EXT_SYNC_ACCEL_XOUT_L   0x5
00194 #define MPU6050_EXT_SYNC_ACCEL_YOUT_L   0x6
00195 #define MPU6050_EXT_SYNC_ACCEL_ZOUT_L   0x7
00196 
00197 #define MPU6050_DLPF_BW_256         0x00
00198 #define MPU6050_DLPF_BW_188         0x01
00199 #define MPU6050_DLPF_BW_98          0x02
00200 #define MPU6050_DLPF_BW_42          0x03
00201 #define MPU6050_DLPF_BW_20          0x04
00202 #define MPU6050_DLPF_BW_10          0x05
00203 #define MPU6050_DLPF_BW_5           0x06
00204 
00205 #define MPU6050_GCONFIG_FS_SEL_BIT      4
00206 #define MPU6050_GCONFIG_FS_SEL_LENGTH   2
00207 
00208 #define MPU6050_GYRO_FS_250         0x00
00209 #define MPU6050_GYRO_FS_500         0x01
00210 #define MPU6050_GYRO_FS_1000        0x02
00211 #define MPU6050_GYRO_FS_2000        0x03
00212 
00213 #define MPU6050_ACONFIG_XA_ST_BIT           7
00214 #define MPU6050_ACONFIG_YA_ST_BIT           6
00215 #define MPU6050_ACONFIG_ZA_ST_BIT           5
00216 #define MPU6050_ACONFIG_AFS_SEL_BIT         4
00217 #define MPU6050_ACONFIG_AFS_SEL_LENGTH      2
00218 #define MPU6050_ACONFIG_ACCEL_HPF_BIT       2
00219 #define MPU6050_ACONFIG_ACCEL_HPF_LENGTH    3
00220 
00221 #define MPU6050_ACCEL_FS_2          0x00
00222 #define MPU6050_ACCEL_FS_4          0x01
00223 #define MPU6050_ACCEL_FS_8          0x02
00224 #define MPU6050_ACCEL_FS_16         0x03
00225 
00226 #define MPU6050_DHPF_RESET          0x00
00227 #define MPU6050_DHPF_5              0x01
00228 #define MPU6050_DHPF_2P5            0x02
00229 #define MPU6050_DHPF_1P25           0x03
00230 #define MPU6050_DHPF_0P63           0x04
00231 #define MPU6050_DHPF_HOLD           0x07
00232 
00233 #define MPU6050_TEMP_FIFO_EN_BIT    7
00234 #define MPU6050_XG_FIFO_EN_BIT      6
00235 #define MPU6050_YG_FIFO_EN_BIT      5
00236 #define MPU6050_ZG_FIFO_EN_BIT      4
00237 #define MPU6050_ACCEL_FIFO_EN_BIT   3
00238 #define MPU6050_SLV2_FIFO_EN_BIT    2
00239 #define MPU6050_SLV1_FIFO_EN_BIT    1
00240 #define MPU6050_SLV0_FIFO_EN_BIT    0
00241 
00242 #define MPU6050_MULT_MST_EN_BIT     7
00243 #define MPU6050_WAIT_FOR_ES_BIT     6
00244 #define MPU6050_SLV_3_FIFO_EN_BIT   5
00245 #define MPU6050_I2C_MST_P_NSR_BIT   4
00246 #define MPU6050_I2C_MST_CLK_BIT     3
00247 #define MPU6050_I2C_MST_CLK_LENGTH  4
00248 
00249 #define MPU6050_CLOCK_DIV_348       0x0
00250 #define MPU6050_CLOCK_DIV_333       0x1
00251 #define MPU6050_CLOCK_DIV_320       0x2
00252 #define MPU6050_CLOCK_DIV_308       0x3
00253 #define MPU6050_CLOCK_DIV_296       0x4
00254 #define MPU6050_CLOCK_DIV_286       0x5
00255 #define MPU6050_CLOCK_DIV_276       0x6
00256 #define MPU6050_CLOCK_DIV_267       0x7
00257 #define MPU6050_CLOCK_DIV_258       0x8
00258 #define MPU6050_CLOCK_DIV_500       0x9
00259 #define MPU6050_CLOCK_DIV_471       0xA
00260 #define MPU6050_CLOCK_DIV_444       0xB
00261 #define MPU6050_CLOCK_DIV_421       0xC
00262 #define MPU6050_CLOCK_DIV_400       0xD
00263 #define MPU6050_CLOCK_DIV_381       0xE
00264 #define MPU6050_CLOCK_DIV_364       0xF
00265 
00266 #define MPU6050_I2C_SLV_RW_BIT      7
00267 #define MPU6050_I2C_SLV_ADDR_BIT    6
00268 #define MPU6050_I2C_SLV_ADDR_LENGTH 7
00269 #define MPU6050_I2C_SLV_EN_BIT      7
00270 #define MPU6050_I2C_SLV_BYTE_SW_BIT 6
00271 #define MPU6050_I2C_SLV_REG_DIS_BIT 5
00272 #define MPU6050_I2C_SLV_GRP_BIT     4
00273 #define MPU6050_I2C_SLV_LEN_BIT     3
00274 #define MPU6050_I2C_SLV_LEN_LENGTH  4
00275 
00276 #define MPU6050_I2C_SLV4_RW_BIT         7
00277 #define MPU6050_I2C_SLV4_ADDR_BIT       6
00278 #define MPU6050_I2C_SLV4_ADDR_LENGTH    7
00279 #define MPU6050_I2C_SLV4_EN_BIT         7
00280 #define MPU6050_I2C_SLV4_INT_EN_BIT     6
00281 #define MPU6050_I2C_SLV4_REG_DIS_BIT    5
00282 #define MPU6050_I2C_SLV4_MST_DLY_BIT    4
00283 #define MPU6050_I2C_SLV4_MST_DLY_LENGTH 5
00284 
00285 #define MPU6050_MST_PASS_THROUGH_BIT    7
00286 #define MPU6050_MST_I2C_SLV4_DONE_BIT   6
00287 #define MPU6050_MST_I2C_LOST_ARB_BIT    5
00288 #define MPU6050_MST_I2C_SLV4_NACK_BIT   4
00289 #define MPU6050_MST_I2C_SLV3_NACK_BIT   3
00290 #define MPU6050_MST_I2C_SLV2_NACK_BIT   2
00291 #define MPU6050_MST_I2C_SLV1_NACK_BIT   1
00292 #define MPU6050_MST_I2C_SLV0_NACK_BIT   0
00293 
00294 #define MPU6050_INTCFG_INT_LEVEL_BIT        7
00295 #define MPU6050_INTCFG_INT_OPEN_BIT         6
00296 #define MPU6050_INTCFG_LATCH_INT_EN_BIT     5
00297 #define MPU6050_INTCFG_INT_RD_CLEAR_BIT     4
00298 #define MPU6050_INTCFG_FSYNC_INT_LEVEL_BIT  3
00299 #define MPU6050_INTCFG_FSYNC_INT_EN_BIT     2
00300 #define MPU6050_INTCFG_I2C_BYPASS_EN_BIT    1
00301 #define MPU6050_INTCFG_CLKOUT_EN_BIT        0
00302 
00303 #define MPU6050_INTMODE_ACTIVEHIGH  0x00
00304 #define MPU6050_INTMODE_ACTIVELOW   0x01
00305 
00306 #define MPU6050_INTDRV_PUSHPULL     0x00
00307 #define MPU6050_INTDRV_OPENDRAIN    0x01
00308 
00309 #define MPU6050_INTLATCH_50USPULSE  0x00
00310 #define MPU6050_INTLATCH_WAITCLEAR  0x01
00311 
00312 #define MPU6050_INTCLEAR_STATUSREAD 0x00
00313 #define MPU6050_INTCLEAR_ANYREAD    0x01
00314 
00315 #define MPU6050_INTERRUPT_FF_BIT            7
00316 #define MPU6050_INTERRUPT_MOT_BIT           6
00317 #define MPU6050_INTERRUPT_ZMOT_BIT          5
00318 #define MPU6050_INTERRUPT_FIFO_OFLOW_BIT    4
00319 #define MPU6050_INTERRUPT_I2C_MST_INT_BIT   3
00320 #define MPU6050_INTERRUPT_PLL_RDY_INT_BIT   2
00321 #define MPU6050_INTERRUPT_DMP_INT_BIT       1
00322 #define MPU6050_INTERRUPT_DATA_RDY_BIT      0
00323 
00324 // TODO: figure out what these actually do
00325 // UMPL source code is not very obivous
00326 #define MPU6050_DMPINT_5_BIT            5
00327 #define MPU6050_DMPINT_4_BIT            4
00328 #define MPU6050_DMPINT_3_BIT            3
00329 #define MPU6050_DMPINT_2_BIT            2
00330 #define MPU6050_DMPINT_1_BIT            1
00331 #define MPU6050_DMPINT_0_BIT            0
00332 
00333 #define MPU6050_MOTION_MOT_XNEG_BIT     7
00334 #define MPU6050_MOTION_MOT_XPOS_BIT     6
00335 #define MPU6050_MOTION_MOT_YNEG_BIT     5
00336 #define MPU6050_MOTION_MOT_YPOS_BIT     4
00337 #define MPU6050_MOTION_MOT_ZNEG_BIT     3
00338 #define MPU6050_MOTION_MOT_ZPOS_BIT     2
00339 #define MPU6050_MOTION_MOT_ZRMOT_BIT    0
00340 
00341 #define MPU6050_DELAYCTRL_DELAY_ES_SHADOW_BIT   7
00342 #define MPU6050_DELAYCTRL_I2C_SLV4_DLY_EN_BIT   4
00343 #define MPU6050_DELAYCTRL_I2C_SLV3_DLY_EN_BIT   3
00344 #define MPU6050_DELAYCTRL_I2C_SLV2_DLY_EN_BIT   2
00345 #define MPU6050_DELAYCTRL_I2C_SLV1_DLY_EN_BIT   1
00346 #define MPU6050_DELAYCTRL_I2C_SLV0_DLY_EN_BIT   0
00347 
00348 #define MPU6050_PATHRESET_GYRO_RESET_BIT    2
00349 #define MPU6050_PATHRESET_ACCEL_RESET_BIT   1
00350 #define MPU6050_PATHRESET_TEMP_RESET_BIT    0
00351 
00352 #define MPU6050_DETECT_ACCEL_ON_DELAY_BIT       5
00353 #define MPU6050_DETECT_ACCEL_ON_DELAY_LENGTH    2
00354 #define MPU6050_DETECT_FF_COUNT_BIT             3
00355 #define MPU6050_DETECT_FF_COUNT_LENGTH          2
00356 #define MPU6050_DETECT_MOT_COUNT_BIT            1
00357 #define MPU6050_DETECT_MOT_COUNT_LENGTH         2
00358 
00359 #define MPU6050_DETECT_DECREMENT_RESET  0x0
00360 #define MPU6050_DETECT_DECREMENT_1      0x1
00361 #define MPU6050_DETECT_DECREMENT_2      0x2
00362 #define MPU6050_DETECT_DECREMENT_4      0x3
00363 
00364 #define MPU6050_USERCTRL_DMP_EN_BIT             7
00365 #define MPU6050_USERCTRL_FIFO_EN_BIT            6
00366 #define MPU6050_USERCTRL_I2C_MST_EN_BIT         5
00367 #define MPU6050_USERCTRL_I2C_IF_DIS_BIT         4
00368 #define MPU6050_USERCTRL_DMP_RESET_BIT          3
00369 #define MPU6050_USERCTRL_FIFO_RESET_BIT         2
00370 #define MPU6050_USERCTRL_I2C_MST_RESET_BIT      1
00371 #define MPU6050_USERCTRL_SIG_COND_RESET_BIT     0
00372 
00373 #define MPU6050_PWR1_DEVICE_RESET_BIT   7
00374 #define MPU6050_PWR1_SLEEP_BIT          6
00375 #define MPU6050_PWR1_CYCLE_BIT          5
00376 #define MPU6050_PWR1_TEMP_DIS_BIT       3
00377 #define MPU6050_PWR1_CLKSEL_BIT         2
00378 #define MPU6050_PWR1_CLKSEL_LENGTH      3
00379 
00380 #define MPU6050_CLOCK_INTERNAL          0x00
00381 #define MPU6050_CLOCK_PLL_XGYRO         0x01
00382 #define MPU6050_CLOCK_PLL_YGYRO         0x02
00383 #define MPU6050_CLOCK_PLL_ZGYRO         0x03
00384 #define MPU6050_CLOCK_PLL_EXT32K        0x04
00385 #define MPU6050_CLOCK_PLL_EXT19M        0x05
00386 #define MPU6050_CLOCK_KEEP_RESET        0x07
00387 
00388 #define MPU6050_PWR2_LP_WAKE_CTRL_BIT       7
00389 #define MPU6050_PWR2_LP_WAKE_CTRL_LENGTH    2
00390 #define MPU6050_PWR2_STBY_XA_BIT            5
00391 #define MPU6050_PWR2_STBY_YA_BIT            4
00392 #define MPU6050_PWR2_STBY_ZA_BIT            3
00393 #define MPU6050_PWR2_STBY_XG_BIT            2
00394 #define MPU6050_PWR2_STBY_YG_BIT            1
00395 #define MPU6050_PWR2_STBY_ZG_BIT            0
00396 
00397 #define MPU6050_WAKE_FREQ_1P25      0x0
00398 #define MPU6050_WAKE_FREQ_2P5       0x1
00399 #define MPU6050_WAKE_FREQ_5         0x2
00400 #define MPU6050_WAKE_FREQ_10        0x3
00401 
00402 #define MPU6050_BANKSEL_PRFTCH_EN_BIT       6
00403 #define MPU6050_BANKSEL_CFG_USER_BANK_BIT   5
00404 #define MPU6050_BANKSEL_MEM_SEL_BIT         4
00405 #define MPU6050_BANKSEL_MEM_SEL_LENGTH      5
00406 
00407 #define MPU6050_WHO_AM_I_BIT        6
00408 #define MPU6050_WHO_AM_I_LENGTH     6
00409 
00410 #define MPU6050_DMP_MEMORY_BANKS        8
00411 #define MPU6050_DMP_MEMORY_BANK_SIZE    256
00412 #define MPU6050_DMP_MEMORY_CHUNK_SIZE   16
00413 
00414 
00415 
00416 #define MPU60X0_ADDRESS_AD0_LOW     0x68 // address pin low (GND), default for InvenSense evaluation board
00417 #define MPU60X0_ADDRESS_AD0_HIGH    0x69 // address pin high (VCC)
00418 #define MPU60X0_DEFAULT_ADDRESS     MPU60X0_ADDRESS_AD0_LOW
00419 #define MPU60X0_DEFAULT_SS_PIN      4
00420 
00421 #define MPU60X0_RA_XG_OFFS_TC       0x00 //[7] PWR_MODE, [6:1] XG_OFFS_TC, [0] OTP_BNK_VLD
00422 #define MPU60X0_RA_YG_OFFS_TC       0x01 //[7] PWR_MODE, [6:1] YG_OFFS_TC, [0] OTP_BNK_VLD
00423 #define MPU60X0_RA_ZG_OFFS_TC       0x02 //[7] PWR_MODE, [6:1] ZG_OFFS_TC, [0] OTP_BNK_VLD
00424 #define MPU60X0_RA_X_FINE_GAIN      0x03 //[7:0] X_FINE_GAIN
00425 #define MPU60X0_RA_Y_FINE_GAIN      0x04 //[7:0] Y_FINE_GAIN
00426 #define MPU60X0_RA_Z_FINE_GAIN      0x05 //[7:0] Z_FINE_GAIN
00427 #define MPU60X0_RA_XA_OFFS_H        0x06 //[15:0] XA_OFFS
00428 #define MPU60X0_RA_XA_OFFS_L_TC     0x07
00429 #define MPU60X0_RA_YA_OFFS_H        0x08 //[15:0] YA_OFFS
00430 #define MPU60X0_RA_YA_OFFS_L_TC     0x09
00431 #define MPU60X0_RA_ZA_OFFS_H        0x0A //[15:0] ZA_OFFS
00432 #define MPU60X0_RA_ZA_OFFS_L_TC     0x0B
00433 #define MPU60X0_RA_XG_OFFS_USRH     0x13 //[15:0] XG_OFFS_USR
00434 #define MPU60X0_RA_XG_OFFS_USRL     0x14
00435 #define MPU60X0_RA_YG_OFFS_USRH     0x15 //[15:0] YG_OFFS_USR
00436 #define MPU60X0_RA_YG_OFFS_USRL     0x16
00437 #define MPU60X0_RA_ZG_OFFS_USRH     0x17 //[15:0] ZG_OFFS_USR
00438 #define MPU60X0_RA_ZG_OFFS_USRL     0x18
00439 #define MPU60X0_RA_SMPLRT_DIV       0x19
00440 #define MPU60X0_RA_CONFIG           0x1A
00441 #define MPU60X0_RA_GYRO_CONFIG      0x1B
00442 #define MPU60X0_RA_ACCEL_CONFIG     0x1C
00443 #define MPU9250_RA_ACCEL_CONFIG2    0x1D
00444 #define MPU60X0_RA_FF_THR           0x1D
00445 #define MPU60X0_RA_FF_DUR           0x1E
00446 #define MPU60X0_RA_MOT_THR          0x1F
00447 #define MPU60X0_RA_MOT_DUR          0x20
00448 #define MPU60X0_RA_ZRMOT_THR        0x21
00449 #define MPU60X0_RA_ZRMOT_DUR        0x22
00450 #define MPU60X0_RA_FIFO_EN          0x23
00451 #define MPU60X0_RA_I2C_MST_CTRL     0x24
00452 #define MPU60X0_RA_I2C_SLV0_ADDR    0x25
00453 #define MPU60X0_RA_I2C_SLV0_REG     0x26
00454 #define MPU60X0_RA_I2C_SLV0_CTRL    0x27
00455 #define MPU60X0_RA_I2C_SLV1_ADDR    0x28
00456 #define MPU60X0_RA_I2C_SLV1_REG     0x29
00457 #define MPU60X0_RA_I2C_SLV1_CTRL    0x2A
00458 #define MPU60X0_RA_I2C_SLV2_ADDR    0x2B
00459 #define MPU60X0_RA_I2C_SLV2_REG     0x2C
00460 #define MPU60X0_RA_I2C_SLV2_CTRL    0x2D
00461 #define MPU60X0_RA_I2C_SLV3_ADDR    0x2E
00462 #define MPU60X0_RA_I2C_SLV3_REG     0x2F
00463 #define MPU60X0_RA_I2C_SLV3_CTRL    0x30
00464 #define MPU60X0_RA_I2C_SLV4_ADDR    0x31
00465 #define MPU60X0_RA_I2C_SLV4_REG     0x32
00466 #define MPU60X0_RA_I2C_SLV4_DO      0x33
00467 #define MPU60X0_RA_I2C_SLV4_CTRL    0x34
00468 #define MPU60X0_RA_I2C_SLV4_DI      0x35
00469 #define MPU60X0_RA_I2C_MST_STATUS   0x36
00470 #define MPU60X0_RA_INT_PIN_CFG      0x37
00471 #define MPU60X0_RA_INT_ENABLE       0x38
00472 #define MPU60X0_RA_DMP_INT_STATUS   0x39
00473 #define MPU60X0_RA_INT_STATUS       0x3A
00474 #define MPU60X0_RA_ACCEL_XOUT_H     0x3B
00475 #define MPU60X0_RA_ACCEL_XOUT_L     0x3C
00476 #define MPU60X0_RA_ACCEL_YOUT_H     0x3D
00477 #define MPU60X0_RA_ACCEL_YOUT_L     0x3E
00478 #define MPU60X0_RA_ACCEL_ZOUT_H     0x3F
00479 #define MPU60X0_RA_ACCEL_ZOUT_L     0x40
00480 #define MPU60X0_RA_TEMP_OUT_H       0x41
00481 #define MPU60X0_RA_TEMP_OUT_L       0x42
00482 #define MPU60X0_RA_GYRO_XOUT_H      0x43
00483 #define MPU60X0_RA_GYRO_XOUT_L      0x44
00484 #define MPU60X0_RA_GYRO_YOUT_H      0x45
00485 #define MPU60X0_RA_GYRO_YOUT_L      0x46
00486 #define MPU60X0_RA_GYRO_ZOUT_H      0x47
00487 #define MPU60X0_RA_GYRO_ZOUT_L      0x48
00488 #define MPU60X0_RA_EXT_SENS_DATA_00 0x49
00489 #define MPU60X0_RA_EXT_SENS_DATA_01 0x4A
00490 #define MPU60X0_RA_EXT_SENS_DATA_02 0x4B
00491 #define MPU60X0_RA_EXT_SENS_DATA_03 0x4C
00492 #define MPU60X0_RA_EXT_SENS_DATA_04 0x4D
00493 #define MPU60X0_RA_EXT_SENS_DATA_05 0x4E
00494 #define MPU60X0_RA_EXT_SENS_DATA_06 0x4F
00495 #define MPU60X0_RA_EXT_SENS_DATA_07 0x50
00496 #define MPU60X0_RA_EXT_SENS_DATA_08 0x51
00497 #define MPU60X0_RA_EXT_SENS_DATA_09 0x52
00498 #define MPU60X0_RA_EXT_SENS_DATA_10 0x53
00499 #define MPU60X0_RA_EXT_SENS_DATA_11 0x54
00500 #define MPU60X0_RA_EXT_SENS_DATA_12 0x55
00501 #define MPU60X0_RA_EXT_SENS_DATA_13 0x56
00502 #define MPU60X0_RA_EXT_SENS_DATA_14 0x57
00503 #define MPU60X0_RA_EXT_SENS_DATA_15 0x58
00504 #define MPU60X0_RA_EXT_SENS_DATA_16 0x59
00505 #define MPU60X0_RA_EXT_SENS_DATA_17 0x5A
00506 #define MPU60X0_RA_EXT_SENS_DATA_18 0x5B
00507 #define MPU60X0_RA_EXT_SENS_DATA_19 0x5C
00508 #define MPU60X0_RA_EXT_SENS_DATA_20 0x5D
00509 #define MPU60X0_RA_EXT_SENS_DATA_21 0x5E
00510 #define MPU60X0_RA_EXT_SENS_DATA_22 0x5F
00511 #define MPU60X0_RA_EXT_SENS_DATA_23 0x60
00512 #define MPU60X0_RA_MOT_DETECT_STATUS    0x61
00513 #define MPU60X0_RA_I2C_SLV0_DO      0x63
00514 #define MPU60X0_RA_I2C_SLV1_DO      0x64
00515 #define MPU60X0_RA_I2C_SLV2_DO      0x65
00516 #define MPU60X0_RA_I2C_SLV3_DO      0x66
00517 #define MPU60X0_RA_I2C_MST_DELAY_CTRL   0x67
00518 #define MPU60X0_RA_SIGNAL_PATH_RESET    0x68
00519 #define MPU60X0_RA_MOT_DETECT_CTRL      0x69
00520 #define MPU60X0_RA_USER_CTRL        0x6A
00521 #define MPU60X0_RA_PWR_MGMT_1       0x6B
00522 #define MPU60X0_RA_PWR_MGMT_2       0x6C
00523 #define MPU60X0_RA_BANK_SEL         0x6D
00524 #define MPU60X0_RA_MEM_START_ADDR   0x6E
00525 #define MPU60X0_RA_MEM_R_W          0x6F
00526 #define MPU60X0_RA_DMP_CFG_1        0x70
00527 #define MPU60X0_RA_DMP_CFG_2        0x71
00528 #define MPU60X0_RA_FIFO_COUNTH      0x72
00529 #define MPU60X0_RA_FIFO_COUNTL      0x73
00530 #define MPU60X0_RA_FIFO_R_W         0x74
00531 #define MPU60X0_RA_WHO_AM_I         0x75
00532 
00533 #define MPU60X0_TC_PWR_MODE_BIT     7
00534 #define MPU60X0_TC_OFFSET_BIT       6
00535 #define MPU60X0_TC_OFFSET_LENGTH    6
00536 #define MPU60X0_TC_OTP_BNK_VLD_BIT  0
00537 
00538 #define MPU60X0_VDDIO_LEVEL_VLOGIC  0
00539 #define MPU60X0_VDDIO_LEVEL_VDD     1
00540 
00541 #define MPU60X0_CFG_EXT_SYNC_SET_BIT    5
00542 #define MPU60X0_CFG_EXT_SYNC_SET_LENGTH 3
00543 #define MPU60X0_CFG_DLPF_CFG_BIT    2
00544 #define MPU60X0_CFG_DLPF_CFG_LENGTH 3
00545 
00546 #define MPU60X0_EXT_SYNC_DISABLED       0x0
00547 #define MPU60X0_EXT_SYNC_TEMP_OUT_L     0x1
00548 #define MPU60X0_EXT_SYNC_GYRO_XOUT_L    0x2
00549 #define MPU60X0_EXT_SYNC_GYRO_YOUT_L    0x3
00550 #define MPU60X0_EXT_SYNC_GYRO_ZOUT_L    0x4
00551 #define MPU60X0_EXT_SYNC_ACCEL_XOUT_L   0x5
00552 #define MPU60X0_EXT_SYNC_ACCEL_YOUT_L   0x6
00553 #define MPU60X0_EXT_SYNC_ACCEL_ZOUT_L   0x7
00554 
00555 #define MPU60X0_DLPF_BW_256         0x00
00556 #define MPU60X0_DLPF_BW_184         0x01
00557 #define MPU60X0_DLPF_BW_98          0x02
00558 #define MPU60X0_DLPF_BW_42          0x03
00559 #define MPU60X0_DLPF_BW_20          0x04
00560 #define MPU60X0_DLPF_BW_10          0x05
00561 #define MPU60X0_DLPF_BW_5           0x06
00562 
00563 #define MPU60X0_GCONFIG_FS_SEL_BIT      4
00564 #define MPU60X0_GCONFIG_FS_SEL_LENGTH   2
00565 
00566 #define MPU60X0_GYRO_FS_250         0x00
00567 #define MPU60X0_GYRO_FS_500         0x01
00568 #define MPU60X0_GYRO_FS_1000        0x02
00569 #define MPU60X0_GYRO_FS_2000        0x03
00570 
00571 #define MPU60X0_ACONFIG_XA_ST_BIT           7
00572 #define MPU60X0_ACONFIG_YA_ST_BIT           6
00573 #define MPU60X0_ACONFIG_ZA_ST_BIT           5
00574 #define MPU60X0_ACONFIG_AFS_SEL_BIT         4
00575 #define MPU60X0_ACONFIG_AFS_SEL_LENGTH      2
00576 #define MPU60X0_ACONFIG_ACCEL_HPF_BIT       2
00577 #define MPU60X0_ACONFIG_ACCEL_HPF_LENGTH    3
00578 
00579 #define MPU60X0_ACCEL_FS_2          0x00
00580 #define MPU60X0_ACCEL_FS_4          0x01
00581 #define MPU60X0_ACCEL_FS_8          0x02
00582 #define MPU60X0_ACCEL_FS_16         0x03
00583 
00584 #define MPU60X0_DHPF_RESET          0x00
00585 #define MPU60X0_DHPF_5              0x01
00586 #define MPU60X0_DHPF_2P5            0x02
00587 #define MPU60X0_DHPF_1P25           0x03
00588 #define MPU60X0_DHPF_0P63           0x04
00589 #define MPU60X0_DHPF_HOLD           0x07
00590 
00591 #define MPU60X0_TEMP_FIFO_EN_BIT    7
00592 #define MPU60X0_XG_FIFO_EN_BIT      6
00593 #define MPU60X0_YG_FIFO_EN_BIT      5
00594 #define MPU60X0_ZG_FIFO_EN_BIT      4
00595 #define MPU60X0_ACCEL_FIFO_EN_BIT   3
00596 #define MPU60X0_SLV2_FIFO_EN_BIT    2
00597 #define MPU60X0_SLV1_FIFO_EN_BIT    1
00598 #define MPU60X0_SLV0_FIFO_EN_BIT    0
00599 
00600 #define MPU60X0_MULT_MST_EN_BIT     7
00601 #define MPU60X0_WAIT_FOR_ES_BIT     6
00602 #define MPU60X0_SLV_3_FIFO_EN_BIT   5
00603 #define MPU60X0_I2C_MST_P_NSR_BIT   4
00604 #define MPU60X0_I2C_MST_CLK_BIT     3
00605 #define MPU60X0_I2C_MST_CLK_LENGTH  4
00606 
00607 #define MPU60X0_CLOCK_DIV_348       0x0
00608 #define MPU60X0_CLOCK_DIV_333       0x1
00609 #define MPU60X0_CLOCK_DIV_320       0x2
00610 #define MPU60X0_CLOCK_DIV_308       0x3
00611 #define MPU60X0_CLOCK_DIV_296       0x4
00612 #define MPU60X0_CLOCK_DIV_286       0x5
00613 #define MPU60X0_CLOCK_DIV_276       0x6
00614 #define MPU60X0_CLOCK_DIV_267       0x7
00615 #define MPU60X0_CLOCK_DIV_258       0x8
00616 #define MPU60X0_CLOCK_DIV_500       0x9
00617 #define MPU60X0_CLOCK_DIV_471       0xA
00618 #define MPU60X0_CLOCK_DIV_444       0xB
00619 #define MPU60X0_CLOCK_DIV_421       0xC
00620 #define MPU60X0_CLOCK_DIV_400       0xD
00621 #define MPU60X0_CLOCK_DIV_381       0xE
00622 #define MPU60X0_CLOCK_DIV_364       0xF
00623 
00624 #define MPU60X0_I2C_SLV_RW_BIT      7
00625 #define MPU60X0_I2C_SLV_ADDR_BIT    6
00626 #define MPU60X0_I2C_SLV_ADDR_LENGTH 7
00627 #define MPU60X0_I2C_SLV_EN_BIT      7
00628 #define MPU60X0_I2C_SLV_BYTE_SW_BIT 6
00629 #define MPU60X0_I2C_SLV_REG_DIS_BIT 5
00630 #define MPU60X0_I2C_SLV_GRP_BIT     4
00631 #define MPU60X0_I2C_SLV_LEN_BIT     3
00632 #define MPU60X0_I2C_SLV_LEN_LENGTH  4
00633 
00634 #define MPU60X0_I2C_SLV4_RW_BIT         7
00635 #define MPU60X0_I2C_SLV4_ADDR_BIT       6
00636 #define MPU60X0_I2C_SLV4_ADDR_LENGTH    7
00637 #define MPU60X0_I2C_SLV4_EN_BIT         7
00638 #define MPU60X0_I2C_SLV4_INT_EN_BIT     6
00639 #define MPU60X0_I2C_SLV4_REG_DIS_BIT    5
00640 #define MPU60X0_I2C_SLV4_MST_DLY_BIT    4
00641 #define MPU60X0_I2C_SLV4_MST_DLY_LENGTH 5
00642 
00643 #define MPU60X0_MST_PASS_THROUGH_BIT    7
00644 #define MPU60X0_MST_I2C_SLV4_DONE_BIT   6
00645 #define MPU60X0_MST_I2C_LOST_ARB_BIT    5
00646 #define MPU60X0_MST_I2C_SLV4_NACK_BIT   4
00647 #define MPU60X0_MST_I2C_SLV3_NACK_BIT   3
00648 #define MPU60X0_MST_I2C_SLV2_NACK_BIT   2
00649 #define MPU60X0_MST_I2C_SLV1_NACK_BIT   1
00650 #define MPU60X0_MST_I2C_SLV0_NACK_BIT   0
00651 
00652 #define MPU60X0_INTCFG_INT_LEVEL_BIT        7
00653 #define MPU60X0_INTCFG_INT_OPEN_BIT         6
00654 #define MPU60X0_INTCFG_LATCH_INT_EN_BIT     5
00655 #define MPU60X0_INTCFG_INT_RD_CLEAR_BIT     4
00656 #define MPU60X0_INTCFG_FSYNC_INT_LEVEL_BIT  3
00657 #define MPU60X0_INTCFG_FSYNC_INT_EN_BIT     2
00658 #define MPU60X0_INTCFG_I2C_BYPASS_EN_BIT    1
00659 #define MPU60X0_INTCFG_CLKOUT_EN_BIT        0
00660 
00661 #define MPU60X0_INTMODE_ACTIVEHIGH  0x00
00662 #define MPU60X0_INTMODE_ACTIVELOW   0x01
00663 
00664 #define MPU60X0_INTDRV_PUSHPULL     0x00
00665 #define MPU60X0_INTDRV_OPENDRAIN    0x01
00666 
00667 #define MPU60X0_INTLATCH_50USPULSE  0x00
00668 #define MPU60X0_INTLATCH_WAITCLEAR  0x01
00669 
00670 #define MPU60X0_INTCLEAR_STATUSREAD 0x00
00671 #define MPU60X0_INTCLEAR_ANYREAD    0x01
00672 
00673 #define MPU60X0_INTERRUPT_FF_BIT            7
00674 #define MPU60X0_INTERRUPT_MOT_BIT           6
00675 #define MPU60X0_INTERRUPT_ZMOT_BIT          5
00676 #define MPU60X0_INTERRUPT_FIFO_OFLOW_BIT    4
00677 #define MPU60X0_INTERRUPT_I2C_MST_INT_BIT   3
00678 #define MPU60X0_INTERRUPT_PLL_RDY_INT_BIT   2
00679 #define MPU60X0_INTERRUPT_DMP_INT_BIT       1
00680 #define MPU60X0_INTERRUPT_DATA_RDY_BIT      0
00681 
00682 #define MPU60X0_INTERRUPT_FF                0x80
00683 #define MPU60X0_INTERRUPT_MOT               0x40
00684 #define MPU60X0_INTERRUPT_ZMOT              0x20
00685 #define MPU60X0_INTERRUPT_FIFO_OFLOW        0x10
00686 #define MPU60X0_INTERRUPT_I2C_MST_INT       0x08
00687 #define MPU60X0_INTERRUPT_PLL_RDY_INT       0x04
00688 #define MPU60X0_INTERRUPT_DMP_INT           0x02
00689 #define MPU60X0_INTERRUPT_DATA_RDY          0x01
00690 
00691 // TODO: figure out what these actually do
00692 // UMPL source code is not very obivous
00693 #define MPU60X0_DMPINT_5_BIT            5
00694 #define MPU60X0_DMPINT_4_BIT            4
00695 #define MPU60X0_DMPINT_3_BIT            3
00696 #define MPU60X0_DMPINT_2_BIT            2
00697 #define MPU60X0_DMPINT_1_BIT            1
00698 #define MPU60X0_DMPINT_0_BIT            0
00699 
00700 #define MPU60X0_MOTION_MOT_XNEG_BIT     7
00701 #define MPU60X0_MOTION_MOT_XPOS_BIT     6
00702 #define MPU60X0_MOTION_MOT_YNEG_BIT     5
00703 #define MPU60X0_MOTION_MOT_YPOS_BIT     4
00704 #define MPU60X0_MOTION_MOT_ZNEG_BIT     3
00705 #define MPU60X0_MOTION_MOT_ZPOS_BIT     2
00706 #define MPU60X0_MOTION_MOT_ZRMOT_BIT    0
00707 
00708 #define MPU60X0_DELAYCTRL_DELAY_ES_SHADOW_BIT   7
00709 #define MPU60X0_DELAYCTRL_I2C_SLV4_DLY_EN_BIT   4
00710 #define MPU60X0_DELAYCTRL_I2C_SLV3_DLY_EN_BIT   3
00711 #define MPU60X0_DELAYCTRL_I2C_SLV2_DLY_EN_BIT   2
00712 #define MPU60X0_DELAYCTRL_I2C_SLV1_DLY_EN_BIT   1
00713 #define MPU60X0_DELAYCTRL_I2C_SLV0_DLY_EN_BIT   0
00714 
00715 #define MPU60X0_PATHRESET_GYRO_RESET_BIT    2
00716 #define MPU60X0_PATHRESET_ACCEL_RESET_BIT   1
00717 #define MPU60X0_PATHRESET_TEMP_RESET_BIT    0
00718 
00719 #define MPU60X0_DETECT_ACCEL_ON_DELAY_BIT       5
00720 #define MPU60X0_DETECT_ACCEL_ON_DELAY_LENGTH    2
00721 #define MPU60X0_DETECT_FF_COUNT_BIT             3
00722 #define MPU60X0_DETECT_FF_COUNT_LENGTH          2
00723 #define MPU60X0_DETECT_MOT_COUNT_BIT            1
00724 #define MPU60X0_DETECT_MOT_COUNT_LENGTH         2
00725 
00726 #define MPU60X0_DETECT_DECREMENT_RESET  0x0
00727 #define MPU60X0_DETECT_DECREMENT_1      0x1
00728 #define MPU60X0_DETECT_DECREMENT_2      0x2
00729 #define MPU60X0_DETECT_DECREMENT_4      0x3
00730 
00731 #define MPU60X0_USERCTRL_DMP_EN_BIT             7
00732 #define MPU60X0_USERCTRL_FIFO_EN_BIT            6
00733 #define MPU60X0_USERCTRL_I2C_MST_EN_BIT         5
00734 #define MPU60X0_USERCTRL_I2C_IF_DIS_BIT         4
00735 #define MPU60X0_USERCTRL_DMP_RESET_BIT          3
00736 #define MPU60X0_USERCTRL_FIFO_RESET_BIT         2
00737 #define MPU60X0_USERCTRL_I2C_MST_RESET_BIT      1
00738 #define MPU60X0_USERCTRL_SIG_COND_RESET_BIT     0
00739 
00740 #define MPU60X0_PWR1_DEVICE_RESET_BIT   7
00741 #define MPU60X0_PWR1_SLEEP_BIT          6
00742 #define MPU60X0_PWR1_CYCLE_BIT          5
00743 #define MPU60X0_PWR1_TEMP_DIS_BIT       3
00744 #define MPU60X0_PWR1_CLKSEL_BIT         2
00745 #define MPU60X0_PWR1_CLKSEL_LENGTH      3
00746 
00747 #define MPU60X0_CLOCK_INTERNAL          0x00
00748 #define MPU60X0_CLOCK_PLL_XGYRO         0x01
00749 #define MPU60X0_CLOCK_PLL_YGYRO         0x02
00750 #define MPU60X0_CLOCK_PLL_ZGYRO         0x03
00751 #define MPU60X0_CLOCK_PLL_EXT32K        0x04
00752 #define MPU60X0_CLOCK_PLL_EXT19M        0x05
00753 #define MPU60X0_CLOCK_KEEP_RESET        0x07
00754 
00755 #define MPU60X0_PWR2_LP_WAKE_CTRL_BIT       7
00756 #define MPU60X0_PWR2_LP_WAKE_CTRL_LENGTH    2
00757 #define MPU60X0_PWR2_STBY_XA_BIT            5
00758 #define MPU60X0_PWR2_STBY_YA_BIT            4
00759 #define MPU60X0_PWR2_STBY_ZA_BIT            3
00760 #define MPU60X0_PWR2_STBY_XG_BIT            2
00761 #define MPU60X0_PWR2_STBY_YG_BIT            1
00762 #define MPU60X0_PWR2_STBY_ZG_BIT            0
00763 
00764 #define MPU60X0_WAKE_FREQ_1P25      0x0
00765 #define MPU60X0_WAKE_FREQ_2P5       0x1
00766 #define MPU60X0_WAKE_FREQ_5         0x2
00767 #define MPU60X0_WAKE_FREQ_10        0x3
00768 
00769 #define MPU60X0_BANKSEL_PRFTCH_EN_BIT       6
00770 #define MPU60X0_BANKSEL_CFG_USER_BANK_BIT   5
00771 #define MPU60X0_BANKSEL_MEM_SEL_BIT         4
00772 #define MPU60X0_BANKSEL_MEM_SEL_LENGTH      5
00773 
00774 #define MPU60X0_WHO_AM_I_BIT        6
00775 #define MPU60X0_WHO_AM_I_LENGTH     6
00776 
00777 #define MPU60X0_DMP_MEMORY_BANKS        8
00778 #define MPU60X0_DMP_MEMORY_BANK_SIZE    256
00779 #define MPU60X0_DMP_MEMORY_CHUNK_SIZE   16
00780 
00781 
00782 #define I2C_SLV0_EN     0x80
00783 #define I2C_SLV4_EN     0x80
00784 #define I2C_READ_FLAG   0x80
00785 #define SEN_ENABLE      0x00
00786 #define I2C_MST_EN      0x20
00787 #define I2C_MST_CLK     0x0D
00788 #define PWR_RESET       0x80
00789         
00790 #define INT_DISABLE     0x00
00791 #define INT_PULSE_50US  0x00
00792 #define INT_RAW_RDY_EN  0x01
00793 
00794 enum mpu9250_dlpf_bandwidth
00795 {
00796     DLPF_BANDWIDTH_184HZ,
00797     DLPF_BANDWIDTH_92HZ,
00798     DLPF_BANDWIDTH_41HZ,
00799     DLPF_BANDWIDTH_20HZ,
00800     DLPF_BANDWIDTH_10HZ,
00801     DLPF_BANDWIDTH_5HZ
00802 };
00803 
00804 // note: DMP code memory blocks defined at end of header file
00805 
00806 class MPU6050 {
00807     private:
00808         I2Cdev i2Cdev;
00809         Serial debugSerial;
00810         bool sampling;  // flag to indicate whether sampling ticker is running
00811         
00812     public:
00813         MPU6050();
00814         MPU6050(MODI2C i2c);
00815         MPU6050(uint8_t address);
00816         
00817         void mpu_sample_func();
00818         volatile int16_t ax_cache, ay_cache, az_cache, gx_cache, gy_cache, gz_cache;
00819 #ifdef MPU9250
00820         volatile int16_t hx_cache, hy_cache, hz_cache;
00821 #endif
00822         Ticker mpu_sampling;
00823         char mpu_cmd;
00824 #ifdef MPU9250
00825         uint8_t mpu_buffer[21];
00826 #else
00827         uint8_t mpu_buffer[14];
00828 #endif
00829         
00830         void start_sampling();
00831 
00832         bool testConnection();
00833 
00834         // AUX_VDDIO register
00835         uint8_t getAuxVDDIOLevel();
00836         void setAuxVDDIOLevel(uint8_t level);
00837 
00838         // SMPLRT_DIV register
00839         uint8_t getRate();
00840         void setRate(uint8_t rate);
00841 
00842         // turn sampling on or off
00843         void sample(bool sampling);
00844 
00845         // CONFIG register
00846         uint8_t getExternalFrameSync();
00847         void setExternalFrameSync(uint8_t sync);
00848         uint8_t getDLPFMode();
00849         void setDLPFMode(uint8_t bandwidth);
00850 
00851         // GYRO_CONFIG register
00852         uint8_t getFullScaleGyroRange();
00853         void setFullScaleGyroRange(uint8_t range);
00854 
00855         // ACCEL_CONFIG register
00856         bool getAccelXSelfTest();
00857         void setAccelXSelfTest(bool enabled);
00858         bool getAccelYSelfTest();
00859         void setAccelYSelfTest(bool enabled);
00860         bool getAccelZSelfTest();
00861         void setAccelZSelfTest(bool enabled);
00862         uint8_t getFullScaleAccelRange();
00863         void setFullScaleAccelRange(uint8_t range);
00864         uint8_t getDHPFMode();
00865         void setDHPFMode(uint8_t mode);
00866 
00867         // FF_THR register
00868         uint8_t getFreefallDetectionThreshold();
00869         void setFreefallDetectionThreshold(uint8_t threshold);
00870 
00871         // FF_DUR register
00872         uint8_t getFreefallDetectionDuration();
00873         void setFreefallDetectionDuration(uint8_t duration);
00874 
00875         // MOT_THR register
00876         uint8_t getMotionDetectionThreshold();
00877         void setMotionDetectionThreshold(uint8_t threshold);
00878 
00879         // MOT_DUR register
00880         uint8_t getMotionDetectionDuration();
00881         void setMotionDetectionDuration(uint8_t duration);
00882 
00883         // ZRMOT_THR register
00884         uint8_t getZeroMotionDetectionThreshold();
00885         void setZeroMotionDetectionThreshold(uint8_t threshold);
00886 
00887         // ZRMOT_DUR register
00888         uint8_t getZeroMotionDetectionDuration();
00889         void setZeroMotionDetectionDuration(uint8_t duration);
00890 
00891         // FIFO_EN register
00892         bool getTempFIFOEnabled();
00893         void setTempFIFOEnabled(bool enabled);
00894         bool getXGyroFIFOEnabled();
00895         void setXGyroFIFOEnabled(bool enabled);
00896         bool getYGyroFIFOEnabled();
00897         void setYGyroFIFOEnabled(bool enabled);
00898         bool getZGyroFIFOEnabled();
00899         void setZGyroFIFOEnabled(bool enabled);
00900         bool getAccelFIFOEnabled();
00901         void setAccelFIFOEnabled(bool enabled);
00902         bool getSlave2FIFOEnabled();
00903         void setSlave2FIFOEnabled(bool enabled);
00904         bool getSlave1FIFOEnabled();
00905         void setSlave1FIFOEnabled(bool enabled);
00906         bool getSlave0FIFOEnabled();
00907         void setSlave0FIFOEnabled(bool enabled);
00908 
00909         // I2C_MST_CTRL register
00910         bool getMultiMasterEnabled();
00911         void setMultiMasterEnabled(bool enabled);
00912         bool getWaitForExternalSensorEnabled();
00913         void setWaitForExternalSensorEnabled(bool enabled);
00914         bool getSlave3FIFOEnabled();
00915         void setSlave3FIFOEnabled(bool enabled);
00916         bool getSlaveReadWriteTransitionEnabled();
00917         void setSlaveReadWriteTransitionEnabled(bool enabled);
00918         uint8_t getMasterClockSpeed();
00919         void setMasterClockSpeed(uint8_t speed);
00920 
00921         // I2C_SLV* registers (Slave 0-3)
00922         uint8_t getSlaveAddress(uint8_t num);
00923         void setSlaveAddress(uint8_t num, uint8_t address);
00924         uint8_t getSlaveRegister(uint8_t num);
00925         void setSlaveRegister(uint8_t num, uint8_t reg);
00926         bool getSlaveEnabled(uint8_t num);
00927         void setSlaveEnabled(uint8_t num, bool enabled);
00928         bool getSlaveWordByteSwap(uint8_t num);
00929         void setSlaveWordByteSwap(uint8_t num, bool enabled);
00930         bool getSlaveWriteMode(uint8_t num);
00931         void setSlaveWriteMode(uint8_t num, bool mode);
00932         bool getSlaveWordGroupOffset(uint8_t num);
00933         void setSlaveWordGroupOffset(uint8_t num, bool enabled);
00934         uint8_t getSlaveDataLength(uint8_t num);
00935         void setSlaveDataLength(uint8_t num, uint8_t length);
00936 
00937         // I2C_SLV* registers (Slave 4)
00938         uint8_t getSlave4Address();
00939         void setSlave4Address(uint8_t address);
00940         uint8_t getSlave4Register();
00941         void setSlave4Register(uint8_t reg);
00942         void setSlave4OutputByte(uint8_t data);
00943         bool getSlave4Enabled();
00944         void setSlave4Enabled(bool enabled);
00945         bool getSlave4InterruptEnabled();
00946         void setSlave4InterruptEnabled(bool enabled);
00947         bool getSlave4WriteMode();
00948         void setSlave4WriteMode(bool mode);
00949         uint8_t getSlave4MasterDelay();
00950         void setSlave4MasterDelay(uint8_t delay);
00951         uint8_t getSlate4InputByte();
00952 
00953         // I2C_MST_STATUS register
00954         bool getPassthroughStatus();
00955         bool getSlave4IsDone();
00956         bool getLostArbitration();
00957         bool getSlave4Nack();
00958         bool getSlave3Nack();
00959         bool getSlave2Nack();
00960         bool getSlave1Nack();
00961         bool getSlave0Nack();
00962 
00963         // INT_PIN_CFG register
00964         bool getInterruptMode();
00965         void setInterruptMode(bool mode);
00966         bool getInterruptDrive();
00967         void setInterruptDrive(bool drive);
00968         bool getInterruptLatch();
00969         void setInterruptLatch(bool latch);
00970         bool getInterruptLatchClear();
00971         void setInterruptLatchClear(bool clear);
00972         bool getFSyncInterruptLevel();
00973         void setFSyncInterruptLevel(bool level);
00974         bool getFSyncInterruptEnabled();
00975         void setFSyncInterruptEnabled(bool enabled);
00976         bool getI2CBypassEnabled();
00977         void setI2CBypassEnabled(bool enabled);
00978         bool getClockOutputEnabled();
00979         void setClockOutputEnabled(bool enabled);
00980 
00981         // INT_ENABLE register
00982         uint8_t getIntEnabled();
00983         void setIntEnabled(uint8_t enabled);
00984         bool getIntFreefallEnabled();
00985         void setIntFreefallEnabled(bool enabled);
00986         bool getIntMotionEnabled();
00987         void setIntMotionEnabled(bool enabled);
00988         bool getIntZeroMotionEnabled();
00989         void setIntZeroMotionEnabled(bool enabled);
00990         bool getIntFIFOBufferOverflowEnabled();
00991         void setIntFIFOBufferOverflowEnabled(bool enabled);
00992         bool getIntI2CMasterEnabled();
00993         void setIntI2CMasterEnabled(bool enabled);
00994         bool getIntDataReadyEnabled();
00995         void setIntDataReadyEnabled(bool enabled);
00996 
00997         // INT_STATUS register
00998         uint8_t getIntStatus();
00999         bool getIntFreefallStatus();
01000         bool getIntMotionStatus();
01001         bool getIntZeroMotionStatus();
01002         bool getIntFIFOBufferOverflowStatus();
01003         bool getIntI2CMasterStatus();
01004         bool getIntDataReadyStatus();
01005 
01006         // ACCEL_*OUT_* registers
01007         void getMotion9(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz, int16_t* mx, int16_t* my, int16_t* mz);
01008         void getMotion6(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz);
01009         void getAcceleration(int16_t* x, int16_t* y, int16_t* z);
01010         int16_t getAccelerationX();
01011         int16_t getAccelerationY();
01012         int16_t getAccelerationZ();
01013 
01014         // TEMP_OUT_* registers
01015         int16_t getTemperature();
01016 
01017         // GYRO_*OUT_* registers
01018         void getRotation(int16_t* x, int16_t* y, int16_t* z);
01019         int16_t getRotationX();
01020         int16_t getRotationY();
01021         int16_t getRotationZ();
01022 
01023         // EXT_SENS_DATA_* registers
01024         uint8_t getExternalSensorByte(int position);
01025         uint16_t getExternalSensorWord(int position);
01026         uint32_t getExternalSensorDWord(int position);
01027 
01028         // MOT_DETECT_STATUS register
01029         bool getXNegMotionDetected();
01030         bool getXPosMotionDetected();
01031         bool getYNegMotionDetected();
01032         bool getYPosMotionDetected();
01033         bool getZNegMotionDetected();
01034         bool getZPosMotionDetected();
01035         bool getZeroMotionDetected();
01036 
01037         // I2C_SLV*_DO register
01038         void setSlaveOutputByte(uint8_t num, uint8_t data);
01039 
01040         // I2C_MST_DELAY_CTRL register
01041         bool getExternalShadowDelayEnabled();
01042         void setExternalShadowDelayEnabled(bool enabled);
01043         bool getSlaveDelayEnabled(uint8_t num);
01044         void setSlaveDelayEnabled(uint8_t num, bool enabled);
01045 
01046         // SIGNAL_PATH_RESET register
01047         void resetGyroscopePath();
01048         void resetAccelerometerPath();
01049         void resetTemperaturePath();
01050 
01051         // MOT_DETECT_CTRL register
01052         uint8_t getAccelerometerPowerOnDelay();
01053         void setAccelerometerPowerOnDelay(uint8_t delay);
01054         uint8_t getFreefallDetectionCounterDecrement();
01055         void setFreefallDetectionCounterDecrement(uint8_t decrement);
01056         uint8_t getMotionDetectionCounterDecrement();
01057         void setMotionDetectionCounterDecrement(uint8_t decrement);
01058 
01059         // USER_CTRL register
01060         bool getFIFOEnabled();
01061         void setFIFOEnabled(bool enabled);
01062         bool getI2CMasterModeEnabled();
01063         void setI2CMasterModeEnabled(bool enabled);
01064         void switchSPIEnabled(bool enabled);
01065         void resetFIFO();
01066         void resetI2CMaster();
01067         void resetSensors();
01068 
01069         // PWR_MGMT_1 register
01070         void reset();
01071         bool getSleepEnabled();
01072         void setSleepEnabled(bool enabled);
01073         bool getWakeCycleEnabled();
01074         void setWakeCycleEnabled(bool enabled);
01075         bool getTempSensorEnabled();
01076         void setTempSensorEnabled(bool enabled);
01077         uint8_t getClockSource();
01078         void setClockSource(uint8_t source);
01079 
01080         // PWR_MGMT_2 register
01081         uint8_t getWakeFrequency();
01082         void setWakeFrequency(uint8_t frequency);
01083         bool getStandbyXAccelEnabled();
01084         void setStandbyXAccelEnabled(bool enabled);
01085         bool getStandbyYAccelEnabled();
01086         void setStandbyYAccelEnabled(bool enabled);
01087         bool getStandbyZAccelEnabled();
01088         void setStandbyZAccelEnabled(bool enabled);
01089         bool getStandbyXGyroEnabled();
01090         void setStandbyXGyroEnabled(bool enabled);
01091         bool getStandbyYGyroEnabled();
01092         void setStandbyYGyroEnabled(bool enabled);
01093         bool getStandbyZGyroEnabled();
01094         void setStandbyZGyroEnabled(bool enabled);
01095 
01096         // FIFO_COUNT_* registers
01097         uint16_t getFIFOCount();
01098 
01099         // FIFO_R_W register
01100         uint8_t getFIFOByte();
01101         void setFIFOByte(uint8_t data);
01102         void getFIFOBytes(uint8_t *data, uint8_t length);
01103 
01104         // WHO_AM_I register
01105         uint8_t getDeviceID();
01106         void setDeviceID(uint8_t id);
01107         
01108         // ======== UNDOCUMENTED/DMP REGISTERS/METHODS ========
01109         
01110         // XG_OFFS_TC register
01111         uint8_t getOTPBankValid();
01112         void setOTPBankValid(bool enabled);
01113         int8_t getXGyroOffset();
01114         void setXGyroOffset(int8_t offset);
01115 
01116         // YG_OFFS_TC register
01117         int8_t getYGyroOffset();
01118         void setYGyroOffset(int8_t offset);
01119 
01120         // ZG_OFFS_TC register
01121         int8_t getZGyroOffset();
01122         void setZGyroOffset(int8_t offset);
01123 
01124         // X_FINE_GAIN register
01125         int8_t getXFineGain();
01126         void setXFineGain(int8_t gain);
01127 
01128         // Y_FINE_GAIN register
01129         int8_t getYFineGain();
01130         void setYFineGain(int8_t gain);
01131 
01132         // Z_FINE_GAIN register
01133         int8_t getZFineGain();
01134         void setZFineGain(int8_t gain);
01135 
01136         // XA_OFFS_* registers
01137         int16_t getXAccelOffset();
01138         void setXAccelOffset(int16_t offset);
01139 
01140         // YA_OFFS_* register
01141         int16_t getYAccelOffset();
01142         void setYAccelOffset(int16_t offset);
01143 
01144         // ZA_OFFS_* register
01145         int16_t getZAccelOffset();
01146         void setZAccelOffset(int16_t offset);
01147 
01148         // XG_OFFS_USR* registers
01149         int16_t getXGyroOffsetUser();
01150         void setXGyroOffsetUser(int16_t offset);
01151 
01152         // YG_OFFS_USR* register
01153         int16_t getYGyroOffsetUser();
01154         void setYGyroOffsetUser(int16_t offset);
01155 
01156         // ZG_OFFS_USR* register
01157         int16_t getZGyroOffsetUser();
01158         void setZGyroOffsetUser(int16_t offset);
01159         
01160         // INT_ENABLE register (DMP functions)
01161         bool getIntPLLReadyEnabled();
01162         void setIntPLLReadyEnabled(bool enabled);
01163         bool getIntDMPEnabled();
01164         void setIntDMPEnabled(bool enabled);
01165         
01166         // DMP_INT_STATUS
01167         bool getDMPInt5Status();
01168         bool getDMPInt4Status();
01169         bool getDMPInt3Status();
01170         bool getDMPInt2Status();
01171         bool getDMPInt1Status();
01172         bool getDMPInt0Status();
01173 
01174         // INT_STATUS register (DMP functions)
01175         bool getIntPLLReadyStatus();
01176         bool getIntDMPStatus();
01177         
01178         // USER_CTRL register (DMP functions)
01179         bool getDMPEnabled();
01180         void setDMPEnabled(bool enabled);
01181         void resetDMP();
01182         
01183         // BANK_SEL register
01184         void setMemoryBank(uint8_t bank, bool prefetchEnabled=false, bool userBank=false);
01185         
01186         // MEM_START_ADDR register
01187         void setMemoryStartAddress(uint8_t address);
01188         
01189         // MEM_R_W register
01190         uint8_t readMemoryByte();
01191         void writeMemoryByte(uint8_t data);
01192         void readMemoryBlock(uint8_t *data, uint16_t dataSize, uint8_t bank=0, uint8_t address=0);
01193         bool writeMemoryBlock(const uint8_t *data, uint16_t dataSize, uint8_t bank=0, uint8_t address=0, bool verify=true, bool useProgMem=false);
01194         bool writeProgMemoryBlock(const uint8_t *data, uint16_t dataSize, uint8_t bank=0, uint8_t address=0, bool verify=true);
01195 
01196         bool writeDMPConfigurationSet(const uint8_t *data, uint16_t dataSize, bool useProgMem=false);
01197         bool writeProgDMPConfigurationSet(const uint8_t *data, uint16_t dataSize);
01198 
01199         // DMP_CFG_1 register
01200         uint8_t getDMPConfig1();
01201         void setDMPConfig1(uint8_t config);
01202 
01203         // DMP_CFG_2 register
01204         uint8_t getDMPConfig2();
01205         void setDMPConfig2(uint8_t config);
01206         
01207         void initialize();
01208 
01209 #ifdef MPU9250
01210         void initialize9250();
01211         void initialize9250MasterMode();
01212         void get9250Motion9Counts(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz, int16_t* hx, int16_t* hy, int16_t* hz);
01213         void get9250Motion9(float* ax, float* ay, float* az, float* gx, float* gy, float* gz, float* hx, float* hy, float* hz);
01214         void get9250AccelCounts(int16_t* ax, int16_t* ay, int16_t* az);
01215         void get9250GyroCounts(int16_t* gx, int16_t* gy, int16_t* gz);
01216         void get9250MagCounts(int16_t* hx, int16_t* hy, int16_t* hz);
01217         void get9250TempCounts(int16_t* t);
01218         int setFilt9250(mpu9250_dlpf_bandwidth bandwidth, uint8_t SRD);
01219         int enableInt9250(bool enable);
01220         void readAKRegisters(uint8_t subAddress, uint8_t count, uint8_t* dest);
01221         bool writeAKRegister(uint8_t subAddress, uint8_t data);
01222         bool writeRegister(uint8_t subAddress, uint8_t data);
01223         void readRegister(uint8_t subAddress, uint8_t count, uint8_t* dest);
01224         void setStandbyDisable();
01225 #endif
01226 
01227         // special methods for MotionApps 2.0 implementation
01228         #ifdef MPU6050_INCLUDE_DMP_MOTIONAPPS20
01229             uint8_t *dmpPacketBuffer;
01230             uint16_t dmpPacketSize;
01231 
01232             uint8_t dmpInitialize();
01233             bool dmpPacketAvailable();
01234 
01235             uint8_t dmpSetFIFORate(uint8_t fifoRate);
01236             uint8_t dmpGetFIFORate();
01237             uint8_t dmpGetSampleStepSizeMS();
01238             uint8_t dmpGetSampleFrequency();
01239             int32_t dmpDecodeTemperature(int8_t tempReg);
01240             
01241             // Register callbacks after a packet of FIFO data is processed
01242             //uint8_t dmpRegisterFIFORateProcess(inv_obj_func func, int16_t priority);
01243             //uint8_t dmpUnregisterFIFORateProcess(inv_obj_func func);
01244             uint8_t dmpRunFIFORateProcesses();
01245             
01246             // Setup FIFO for various output
01247             uint8_t dmpSendQuaternion(uint_fast16_t accuracy);
01248             uint8_t dmpSendGyro(uint_fast16_t elements, uint_fast16_t accuracy);
01249             uint8_t dmpSendAccel(uint_fast16_t elements, uint_fast16_t accuracy);
01250             uint8_t dmpSendLinearAccel(uint_fast16_t elements, uint_fast16_t accuracy);
01251             uint8_t dmpSendLinearAccelInWorld(uint_fast16_t elements, uint_fast16_t accuracy);
01252             uint8_t dmpSendControlData(uint_fast16_t elements, uint_fast16_t accuracy);
01253             uint8_t dmpSendSensorData(uint_fast16_t elements, uint_fast16_t accuracy);
01254             uint8_t dmpSendExternalSensorData(uint_fast16_t elements, uint_fast16_t accuracy);
01255             uint8_t dmpSendGravity(uint_fast16_t elements, uint_fast16_t accuracy);
01256             uint8_t dmpSendPacketNumber(uint_fast16_t accuracy);
01257             uint8_t dmpSendQuantizedAccel(uint_fast16_t elements, uint_fast16_t accuracy);
01258             uint8_t dmpSendEIS(uint_fast16_t elements, uint_fast16_t accuracy);
01259 
01260             // Get Fixed Point data from FIFO
01261             uint8_t dmpGetAccel(int32_t *data, const uint8_t* packet=0);
01262             uint8_t dmpGetAccel(int16_t *data, const uint8_t* packet=0);
01263             uint8_t dmpGetAccel(VectorInt16 *v, const uint8_t* packet=0);
01264             uint8_t dmpGetQuaternion(int32_t *data, const uint8_t* packet=0);
01265             uint8_t dmpGetQuaternion(int16_t *data, const uint8_t* packet=0);
01266             uint8_t dmpGetQuaternion(Quaternion *q, const uint8_t* packet=0);
01267             uint8_t dmpGet6AxisQuaternion(int32_t *data, const uint8_t* packet=0);
01268             uint8_t dmpGet6AxisQuaternion(int16_t *data, const uint8_t* packet=0);
01269             uint8_t dmpGet6AxisQuaternion(Quaternion *q, const uint8_t* packet=0);
01270             uint8_t dmpGetRelativeQuaternion(int32_t *data, const uint8_t* packet=0);
01271             uint8_t dmpGetRelativeQuaternion(int16_t *data, const uint8_t* packet=0);
01272             uint8_t dmpGetRelativeQuaternion(Quaternion *data, const uint8_t* packet=0);
01273             uint8_t dmpGetGyro(int32_t *data, const uint8_t* packet=0);
01274             uint8_t dmpGetGyro(int16_t *data, const uint8_t* packet=0);
01275             uint8_t dmpGetGyro(VectorInt16 *v, const uint8_t* packet=0);
01276             uint8_t dmpSetLinearAccelFilterCoefficient(float coef);
01277             uint8_t dmpGetLinearAccel(int32_t *data, const uint8_t* packet=0);
01278             uint8_t dmpGetLinearAccel(int16_t *data, const uint8_t* packet=0);
01279             uint8_t dmpGetLinearAccel(VectorInt16 *v, const uint8_t* packet=0);
01280             uint8_t dmpGetLinearAccel(VectorInt16 *v, VectorInt16 *vRaw, VectorFloat *gravity);
01281             uint8_t dmpGetLinearAccelInWorld(int32_t *data, const uint8_t* packet=0);
01282             uint8_t dmpGetLinearAccelInWorld(int16_t *data, const uint8_t* packet=0);
01283             uint8_t dmpGetLinearAccelInWorld(VectorInt16 *v, const uint8_t* packet=0);
01284             uint8_t dmpGetLinearAccelInWorld(VectorInt16 *v, VectorInt16 *vReal, Quaternion *q);
01285             uint8_t dmpGetGyroAndAccelSensor(int32_t *data, const uint8_t* packet=0);
01286             uint8_t dmpGetGyroAndAccelSensor(int16_t *data, const uint8_t* packet=0);
01287             uint8_t dmpGetGyroAndAccelSensor(VectorInt16 *g, VectorInt16 *a, const uint8_t* packet=0);
01288             uint8_t dmpGetGyroSensor(int32_t *data, const uint8_t* packet=0);
01289             uint8_t dmpGetGyroSensor(int16_t *data, const uint8_t* packet=0);
01290             uint8_t dmpGetGyroSensor(VectorInt16 *v, const uint8_t* packet=0);
01291             uint8_t dmpGetControlData(int32_t *data, const uint8_t* packet=0);
01292             uint8_t dmpGetTemperature(int32_t *data, const uint8_t* packet=0);
01293             uint8_t dmpGetGravity(int32_t *data, const uint8_t* packet=0);
01294             uint8_t dmpGetGravity(int16_t *data, const uint8_t* packet=0);
01295             uint8_t dmpGetGravity(VectorInt16 *v, const uint8_t* packet=0);
01296             uint8_t dmpGetGravity(VectorFloat *v, Quaternion *q);
01297             uint8_t dmpGetUnquantizedAccel(int32_t *data, const uint8_t* packet=0);
01298             uint8_t dmpGetUnquantizedAccel(int16_t *data, const uint8_t* packet=0);
01299             uint8_t dmpGetUnquantizedAccel(VectorInt16 *v, const uint8_t* packet=0);
01300             uint8_t dmpGetQuantizedAccel(int32_t *data, const uint8_t* packet=0);
01301             uint8_t dmpGetQuantizedAccel(int16_t *data, const uint8_t* packet=0);
01302             uint8_t dmpGetQuantizedAccel(VectorInt16 *v, const uint8_t* packet=0);
01303             uint8_t dmpGetExternalSensorData(int32_t *data, uint16_t size, const uint8_t* packet=0);
01304             uint8_t dmpGetEIS(int32_t *data, const uint8_t* packet=0);
01305             
01306             uint8_t dmpGetEuler(float *data, Quaternion *q);
01307             uint8_t dmpGetYawPitchRoll(float *data, Quaternion *q, VectorFloat *gravity);
01308 
01309             // Get Floating Point data from FIFO
01310             uint8_t dmpGetAccelFloat(float *data, const uint8_t* packet=0);
01311             uint8_t dmpGetQuaternionFloat(float *data, const uint8_t* packet=0);
01312 
01313             uint8_t dmpProcessFIFOPacket(const unsigned char *dmpData);
01314             uint8_t dmpReadAndProcessFIFOPacket(uint8_t numPackets, uint8_t *processed=NULL);
01315 
01316             uint8_t dmpSetFIFOProcessedCallback(void (*func) (void));
01317 
01318             uint8_t dmpInitFIFOParam();
01319             uint8_t dmpCloseFIFO();
01320             uint8_t dmpSetGyroDataSource(uint8_t source);
01321             uint8_t dmpDecodeQuantizedAccel();
01322             uint32_t dmpGetGyroSumOfSquare();
01323             uint32_t dmpGetAccelSumOfSquare();
01324             void dmpOverrideQuaternion(long *q);
01325             uint16_t dmpGetFIFOPacketSize();
01326         #endif
01327 
01328         // special methods for MotionApps 4.1 implementation
01329         #ifdef MPU6050_INCLUDE_DMP_MOTIONAPPS41
01330             uint8_t *dmpPacketBuffer;
01331             uint16_t dmpPacketSize;
01332 
01333             uint8_t dmpInitialize();
01334             bool dmpPacketAvailable();
01335 
01336             uint8_t dmpSetFIFORate(uint8_t fifoRate);
01337             uint8_t dmpGetFIFORate();
01338             uint8_t dmpGetSampleStepSizeMS();
01339             uint8_t dmpGetSampleFrequency();
01340             int32_t dmpDecodeTemperature(int8_t tempReg);
01341             
01342             // Register callbacks after a packet of FIFO data is processed
01343             //uint8_t dmpRegisterFIFORateProcess(inv_obj_func func, int16_t priority);
01344             //uint8_t dmpUnregisterFIFORateProcess(inv_obj_func func);
01345             uint8_t dmpRunFIFORateProcesses();
01346             
01347             // Setup FIFO for various output
01348             uint8_t dmpSendQuaternion(uint_fast16_t accuracy);
01349             uint8_t dmpSendGyro(uint_fast16_t elements, uint_fast16_t accuracy);
01350             uint8_t dmpSendAccel(uint_fast16_t elements, uint_fast16_t accuracy);
01351             uint8_t dmpSendLinearAccel(uint_fast16_t elements, uint_fast16_t accuracy);
01352             uint8_t dmpSendLinearAccelInWorld(uint_fast16_t elements, uint_fast16_t accuracy);
01353             uint8_t dmpSendControlData(uint_fast16_t elements, uint_fast16_t accuracy);
01354             uint8_t dmpSendSensorData(uint_fast16_t elements, uint_fast16_t accuracy);
01355             uint8_t dmpSendExternalSensorData(uint_fast16_t elements, uint_fast16_t accuracy);
01356             uint8_t dmpSendGravity(uint_fast16_t elements, uint_fast16_t accuracy);
01357             uint8_t dmpSendPacketNumber(uint_fast16_t accuracy);
01358             uint8_t dmpSendQuantizedAccel(uint_fast16_t elements, uint_fast16_t accuracy);
01359             uint8_t dmpSendEIS(uint_fast16_t elements, uint_fast16_t accuracy);
01360 
01361             // Get Fixed Point data from FIFO
01362             uint8_t dmpGetAccel(int32_t *data, const uint8_t* packet=0);
01363             uint8_t dmpGetAccel(int16_t *data, const uint8_t* packet=0);
01364             uint8_t dmpGetAccel(VectorInt16 *v, const uint8_t* packet=0);
01365             uint8_t dmpGetQuaternion(int32_t *data, const uint8_t* packet=0);
01366             uint8_t dmpGetQuaternion(int16_t *data, const uint8_t* packet=0);
01367             uint8_t dmpGetQuaternion(Quaternion *q, const uint8_t* packet=0);
01368             uint8_t dmpGet6AxisQuaternion(int32_t *data, const uint8_t* packet=0);
01369             uint8_t dmpGet6AxisQuaternion(int16_t *data, const uint8_t* packet=0);
01370             uint8_t dmpGet6AxisQuaternion(Quaternion *q, const uint8_t* packet=0);
01371             uint8_t dmpGetRelativeQuaternion(int32_t *data, const uint8_t* packet=0);
01372             uint8_t dmpGetRelativeQuaternion(int16_t *data, const uint8_t* packet=0);
01373             uint8_t dmpGetRelativeQuaternion(Quaternion *data, const uint8_t* packet=0);
01374             uint8_t dmpGetGyro(int32_t *data, const uint8_t* packet=0);
01375             uint8_t dmpGetGyro(int16_t *data, const uint8_t* packet=0);
01376             uint8_t dmpGetGyro(VectorInt16 *v, const uint8_t* packet=0);
01377             uint8_t dmpGetMag(int16_t *data, const uint8_t* packet=0);
01378             uint8_t dmpSetLinearAccelFilterCoefficient(float coef);
01379             uint8_t dmpGetLinearAccel(int32_t *data, const uint8_t* packet=0);
01380             uint8_t dmpGetLinearAccel(int16_t *data, const uint8_t* packet=0);
01381             uint8_t dmpGetLinearAccel(VectorInt16 *v, const uint8_t* packet=0);
01382             uint8_t dmpGetLinearAccel(VectorInt16 *v, VectorInt16 *vRaw, VectorFloat *gravity);
01383             uint8_t dmpGetLinearAccelInWorld(int32_t *data, const uint8_t* packet=0);
01384             uint8_t dmpGetLinearAccelInWorld(int16_t *data, const uint8_t* packet=0);
01385             uint8_t dmpGetLinearAccelInWorld(VectorInt16 *v, const uint8_t* packet=0);
01386             uint8_t dmpGetLinearAccelInWorld(VectorInt16 *v, VectorInt16 *vReal, Quaternion *q);
01387             uint8_t dmpGetGyroAndAccelSensor(int32_t *data, const uint8_t* packet=0);
01388             uint8_t dmpGetGyroAndAccelSensor(int16_t *data, const uint8_t* packet=0);
01389             uint8_t dmpGetGyroAndAccelSensor(VectorInt16 *g, VectorInt16 *a, const uint8_t* packet=0);
01390             uint8_t dmpGetGyroSensor(int32_t *data, const uint8_t* packet=0);
01391             uint8_t dmpGetGyroSensor(int16_t *data, const uint8_t* packet=0);
01392             uint8_t dmpGetGyroSensor(VectorInt16 *v, const uint8_t* packet=0);
01393             uint8_t dmpGetControlData(int32_t *data, const uint8_t* packet=0);
01394             uint8_t dmpGetTemperature(int32_t *data, const uint8_t* packet=0);
01395             uint8_t dmpGetGravity(int32_t *data, const uint8_t* packet=0);
01396             uint8_t dmpGetGravity(int16_t *data, const uint8_t* packet=0);
01397             uint8_t dmpGetGravity(VectorInt16 *v, const uint8_t* packet=0);
01398             uint8_t dmpGetGravity(VectorFloat *v, Quaternion *q);
01399             uint8_t dmpGetUnquantizedAccel(int32_t *data, const uint8_t* packet=0);
01400             uint8_t dmpGetUnquantizedAccel(int16_t *data, const uint8_t* packet=0);
01401             uint8_t dmpGetUnquantizedAccel(VectorInt16 *v, const uint8_t* packet=0);
01402             uint8_t dmpGetQuantizedAccel(int32_t *data, const uint8_t* packet=0);
01403             uint8_t dmpGetQuantizedAccel(int16_t *data, const uint8_t* packet=0);
01404             uint8_t dmpGetQuantizedAccel(VectorInt16 *v, const uint8_t* packet=0);
01405             uint8_t dmpGetExternalSensorData(int32_t *data, uint16_t size, const uint8_t* packet=0);
01406             uint8_t dmpGetEIS(int32_t *data, const uint8_t* packet=0);
01407             
01408             uint8_t dmpGetEuler(float *data, Quaternion *q);
01409             uint8_t dmpGetYawPitchRoll(float *data, Quaternion *q, VectorFloat *gravity);
01410 
01411             // Get Floating Point data from FIFO
01412             uint8_t dmpGetAccelFloat(float *data, const uint8_t* packet=0);
01413             uint8_t dmpGetQuaternionFloat(float *data, const uint8_t* packet=0);
01414 
01415             uint8_t dmpProcessFIFOPacket(const unsigned char *dmpData);
01416             uint8_t dmpReadAndProcessFIFOPacket(uint8_t numPackets, uint8_t *processed=NULL);
01417 
01418             uint8_t dmpSetFIFOProcessedCallback(void (*func) (void));
01419 
01420             uint8_t dmpInitFIFOParam();
01421             uint8_t dmpCloseFIFO();
01422             uint8_t dmpSetGyroDataSource(uint8_t source);
01423             uint8_t dmpDecodeQuantizedAccel();
01424             uint32_t dmpGetGyroSumOfSquare();
01425             uint32_t dmpGetAccelSumOfSquare();
01426             void dmpOverrideQuaternion(long *q);
01427             uint16_t dmpGetFIFOPacketSize();
01428         #endif
01429 
01430     private:
01431         uint8_t devAddr;
01432 #ifdef MPU9250
01433         uint8_t buffer[21];
01434 #else
01435         uint8_t buffer[14];
01436 #endif
01437         uint8_t magDevAddr;
01438         
01439 #ifdef MPU9250
01440         // transformation matrix
01441         /* transform the accel and gyro axes to match the magnetometer axes */
01442         int16_t tX[3];// = {0,  1,  0}; 
01443         int16_t tY[3];// = {1,  0,  0};
01444         int16_t tZ[3];// = {0,  0, 1};  //was -1  transformation is done within lib.
01445 #endif
01446 };
01447 
01448 #endif /* _MPU6050_H_ */