虽然移植完毕,但是不work。需要细调……

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers MPU6050.h Source File

MPU6050.h

00001 // I2Cdev library collection - MPU6050 I2C device class
00002 // Based on InvenSense MPU-6050 register map document rev. 2.0, 5/19/2011 (RM-MPU-6000A-00)
00003 // 10/3/2011 by Jeff Rowberg <jeff@rowberg.net>
00004 // Updates should (hopefully) always be available at https://github.com/jrowberg/i2cdevlib
00005 //
00006 // Changelog:
00007 //     ... - ongoing debug release
00008 
00009 // NOTE: THIS IS ONLY A PARIAL RELEASE. THIS DEVICE CLASS IS CURRENTLY UNDERGOING ACTIVE
00010 // DEVELOPMENT AND IS STILL MISSING SOME IMPORTANT FEATURES. PLEASE KEEP THIS IN MIND IF
00011 // YOU DECIDE TO USE THIS PARTICULAR CODE FOR ANYTHING.
00012 
00013 /* ============================================
00014 I2Cdev device library code is placed under the MIT license
00015 Copyright (c) 2012 Jeff Rowberg
00016 
00017 Permission is hereby granted, free of charge, to any person obtaining a copy
00018 of this software and associated documentation files (the "Software"), to deal
00019 in the Software without restriction, including without limitation the rights
00020 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
00021 copies of the Software, and to permit persons to whom the Software is
00022 furnished to do so, subject to the following conditions:
00023 
00024 The above copyright notice and this permission notice shall be included in
00025 all copies or substantial portions of the Software.
00026 
00027 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
00028 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00029 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
00030 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00031 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00032 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
00033 THE SOFTWARE.
00034 ===============================================
00035 */
00036 
00037 #ifndef _MPU6050_H_
00038 #define _MPU6050_H_
00039 
00040 #include "mbed.h"
00041 #include <math.h>
00042 #include "I2Cdev.h"
00043 //#include <avr/pgmspace.h>
00044 
00045 
00046 
00047 #define MPU6050_ADDRESS_AD0_LOW     0x68 // address pin low (GND), default for InvenSense evaluation board
00048 #define MPU6050_ADDRESS_AD0_HIGH    0x69 // address pin high (VCC)
00049 #define MPU6050_DEFAULT_ADDRESS     MPU6050_ADDRESS_AD0_LOW
00050 
00051 #define MPU6050_RA_XG_OFFS_TC       0x00 //[7] PWR_MODE, [6:1] XG_OFFS_TC, [0] OTP_BNK_VLD
00052 #define MPU6050_RA_YG_OFFS_TC       0x01 //[7] PWR_MODE, [6:1] YG_OFFS_TC, [0] OTP_BNK_VLD
00053 #define MPU6050_RA_ZG_OFFS_TC       0x02 //[7] PWR_MODE, [6:1] ZG_OFFS_TC, [0] OTP_BNK_VLD
00054 #define MPU6050_RA_X_FINE_GAIN      0x03 //[7:0] X_FINE_GAIN
00055 #define MPU6050_RA_Y_FINE_GAIN      0x04 //[7:0] Y_FINE_GAIN
00056 #define MPU6050_RA_Z_FINE_GAIN      0x05 //[7:0] Z_FINE_GAIN
00057 #define MPU6050_RA_XA_OFFS_H        0x06 //[15:0] XA_OFFS
00058 #define MPU6050_RA_XA_OFFS_L_TC     0x07
00059 #define MPU6050_RA_YA_OFFS_H        0x08 //[15:0] YA_OFFS
00060 #define MPU6050_RA_YA_OFFS_L_TC     0x09
00061 #define MPU6050_RA_ZA_OFFS_H        0x0A //[15:0] ZA_OFFS
00062 #define MPU6050_RA_ZA_OFFS_L_TC     0x0B
00063 #define MPU6050_RA_XG_OFFS_USRH     0x13 //[15:0] XG_OFFS_USR
00064 #define MPU6050_RA_XG_OFFS_USRL     0x14
00065 #define MPU6050_RA_YG_OFFS_USRH     0x15 //[15:0] YG_OFFS_USR
00066 #define MPU6050_RA_YG_OFFS_USRL     0x16
00067 #define MPU6050_RA_ZG_OFFS_USRH     0x17 //[15:0] ZG_OFFS_USR
00068 #define MPU6050_RA_ZG_OFFS_USRL     0x18
00069 #define MPU6050_RA_SMPLRT_DIV       0x19
00070 #define MPU6050_RA_CONFIG           0x1A
00071 #define MPU6050_RA_GYRO_CONFIG      0x1B
00072 #define MPU6050_RA_ACCEL_CONFIG     0x1C
00073 #define MPU6050_RA_FF_THR           0x1D
00074 #define MPU6050_RA_FF_DUR           0x1E
00075 #define MPU6050_RA_MOT_THR          0x1F
00076 #define MPU6050_RA_MOT_DUR          0x20
00077 #define MPU6050_RA_ZRMOT_THR        0x21
00078 #define MPU6050_RA_ZRMOT_DUR        0x22
00079 #define MPU6050_RA_FIFO_EN          0x23
00080 #define MPU6050_RA_I2C_MST_CTRL     0x24
00081 #define MPU6050_RA_I2C_SLV0_ADDR    0x25
00082 #define MPU6050_RA_I2C_SLV0_REG     0x26
00083 #define MPU6050_RA_I2C_SLV0_CTRL    0x27
00084 #define MPU6050_RA_I2C_SLV1_ADDR    0x28
00085 #define MPU6050_RA_I2C_SLV1_REG     0x29
00086 #define MPU6050_RA_I2C_SLV1_CTRL    0x2A
00087 #define MPU6050_RA_I2C_SLV2_ADDR    0x2B
00088 #define MPU6050_RA_I2C_SLV2_REG     0x2C
00089 #define MPU6050_RA_I2C_SLV2_CTRL    0x2D
00090 #define MPU6050_RA_I2C_SLV3_ADDR    0x2E
00091 #define MPU6050_RA_I2C_SLV3_REG     0x2F
00092 #define MPU6050_RA_I2C_SLV3_CTRL    0x30
00093 #define MPU6050_RA_I2C_SLV4_ADDR    0x31
00094 #define MPU6050_RA_I2C_SLV4_REG     0x32
00095 #define MPU6050_RA_I2C_SLV4_DO      0x33
00096 #define MPU6050_RA_I2C_SLV4_CTRL    0x34
00097 #define MPU6050_RA_I2C_SLV4_DI      0x35
00098 #define MPU6050_RA_I2C_MST_STATUS   0x36
00099 #define MPU6050_RA_INT_PIN_CFG      0x37
00100 #define MPU6050_RA_INT_ENABLE       0x38
00101 #define MPU6050_RA_DMP_INT_STATUS   0x39
00102 #define MPU6050_RA_INT_STATUS       0x3A
00103 #define MPU6050_RA_ACCEL_XOUT_H     0x3B
00104 #define MPU6050_RA_ACCEL_XOUT_L     0x3C
00105 #define MPU6050_RA_ACCEL_YOUT_H     0x3D
00106 #define MPU6050_RA_ACCEL_YOUT_L     0x3E
00107 #define MPU6050_RA_ACCEL_ZOUT_H     0x3F
00108 #define MPU6050_RA_ACCEL_ZOUT_L     0x40
00109 #define MPU6050_RA_TEMP_OUT_H       0x41
00110 #define MPU6050_RA_TEMP_OUT_L       0x42
00111 #define MPU6050_RA_GYRO_XOUT_H      0x43
00112 #define MPU6050_RA_GYRO_XOUT_L      0x44
00113 #define MPU6050_RA_GYRO_YOUT_H      0x45
00114 #define MPU6050_RA_GYRO_YOUT_L      0x46
00115 #define MPU6050_RA_GYRO_ZOUT_H      0x47
00116 #define MPU6050_RA_GYRO_ZOUT_L      0x48
00117 #define MPU6050_RA_EXT_SENS_DATA_00 0x49
00118 #define MPU6050_RA_EXT_SENS_DATA_01 0x4A
00119 #define MPU6050_RA_EXT_SENS_DATA_02 0x4B
00120 #define MPU6050_RA_EXT_SENS_DATA_03 0x4C
00121 #define MPU6050_RA_EXT_SENS_DATA_04 0x4D
00122 #define MPU6050_RA_EXT_SENS_DATA_05 0x4E
00123 #define MPU6050_RA_EXT_SENS_DATA_06 0x4F
00124 #define MPU6050_RA_EXT_SENS_DATA_07 0x50
00125 #define MPU6050_RA_EXT_SENS_DATA_08 0x51
00126 #define MPU6050_RA_EXT_SENS_DATA_09 0x52
00127 #define MPU6050_RA_EXT_SENS_DATA_10 0x53
00128 #define MPU6050_RA_EXT_SENS_DATA_11 0x54
00129 #define MPU6050_RA_EXT_SENS_DATA_12 0x55
00130 #define MPU6050_RA_EXT_SENS_DATA_13 0x56
00131 #define MPU6050_RA_EXT_SENS_DATA_14 0x57
00132 #define MPU6050_RA_EXT_SENS_DATA_15 0x58
00133 #define MPU6050_RA_EXT_SENS_DATA_16 0x59
00134 #define MPU6050_RA_EXT_SENS_DATA_17 0x5A
00135 #define MPU6050_RA_EXT_SENS_DATA_18 0x5B
00136 #define MPU6050_RA_EXT_SENS_DATA_19 0x5C
00137 #define MPU6050_RA_EXT_SENS_DATA_20 0x5D
00138 #define MPU6050_RA_EXT_SENS_DATA_21 0x5E
00139 #define MPU6050_RA_EXT_SENS_DATA_22 0x5F
00140 #define MPU6050_RA_EXT_SENS_DATA_23 0x60
00141 #define MPU6050_RA_MOT_DETECT_STATUS    0x61
00142 #define MPU6050_RA_I2C_SLV0_DO      0x63
00143 #define MPU6050_RA_I2C_SLV1_DO      0x64
00144 #define MPU6050_RA_I2C_SLV2_DO      0x65
00145 #define MPU6050_RA_I2C_SLV3_DO      0x66
00146 #define MPU6050_RA_I2C_MST_DELAY_CTRL   0x67
00147 #define MPU6050_RA_SIGNAL_PATH_RESET    0x68
00148 #define MPU6050_RA_MOT_DETECT_CTRL      0x69
00149 #define MPU6050_RA_USER_CTRL        0x6A
00150 #define MPU6050_RA_PWR_MGMT_1       0x6B
00151 #define MPU6050_RA_PWR_MGMT_2       0x6C
00152 #define MPU6050_RA_BANK_SEL         0x6D
00153 #define MPU6050_RA_MEM_START_ADDR   0x6E
00154 #define MPU6050_RA_MEM_R_W          0x6F
00155 #define MPU6050_RA_DMP_CFG_1        0x70
00156 #define MPU6050_RA_DMP_CFG_2        0x71
00157 #define MPU6050_RA_FIFO_COUNTH      0x72
00158 #define MPU6050_RA_FIFO_COUNTL      0x73
00159 #define MPU6050_RA_FIFO_R_W         0x74
00160 #define MPU6050_RA_WHO_AM_I         0x75
00161 
00162 #define MPU6050_TC_PWR_MODE_BIT     7
00163 #define MPU6050_TC_OFFSET_BIT       6
00164 #define MPU6050_TC_OFFSET_LENGTH    6
00165 #define MPU6050_TC_OTP_BNK_VLD_BIT  0
00166 
00167 #define MPU6050_VDDIO_LEVEL_VLOGIC  0
00168 #define MPU6050_VDDIO_LEVEL_VDD     1
00169 
00170 #define MPU6050_CFG_EXT_SYNC_SET_BIT    5
00171 #define MPU6050_CFG_EXT_SYNC_SET_LENGTH 3
00172 #define MPU6050_CFG_DLPF_CFG_BIT    2
00173 #define MPU6050_CFG_DLPF_CFG_LENGTH 3
00174 
00175 #define MPU6050_EXT_SYNC_DISABLED       0x0
00176 #define MPU6050_EXT_SYNC_TEMP_OUT_L     0x1
00177 #define MPU6050_EXT_SYNC_GYRO_XOUT_L    0x2
00178 #define MPU6050_EXT_SYNC_GYRO_YOUT_L    0x3
00179 #define MPU6050_EXT_SYNC_GYRO_ZOUT_L    0x4
00180 #define MPU6050_EXT_SYNC_ACCEL_XOUT_L   0x5
00181 #define MPU6050_EXT_SYNC_ACCEL_YOUT_L   0x6
00182 #define MPU6050_EXT_SYNC_ACCEL_ZOUT_L   0x7
00183 
00184 #define MPU6050_DLPF_BW_256         0x00
00185 #define MPU6050_DLPF_BW_188         0x01
00186 #define MPU6050_DLPF_BW_98          0x02
00187 #define MPU6050_DLPF_BW_42          0x03
00188 #define MPU6050_DLPF_BW_20          0x04
00189 #define MPU6050_DLPF_BW_10          0x05
00190 #define MPU6050_DLPF_BW_5           0x06
00191 
00192 #define MPU6050_GCONFIG_FS_SEL_BIT      4
00193 #define MPU6050_GCONFIG_FS_SEL_LENGTH   2
00194 
00195 #define MPU6050_GYRO_FS_250         0x00
00196 #define MPU6050_GYRO_FS_500         0x01
00197 #define MPU6050_GYRO_FS_1000        0x02
00198 #define MPU6050_GYRO_FS_2000        0x03
00199 
00200 #define MPU6050_ACONFIG_XA_ST_BIT           7
00201 #define MPU6050_ACONFIG_YA_ST_BIT           6
00202 #define MPU6050_ACONFIG_ZA_ST_BIT           5
00203 #define MPU6050_ACONFIG_AFS_SEL_BIT         4
00204 #define MPU6050_ACONFIG_AFS_SEL_LENGTH      2
00205 #define MPU6050_ACONFIG_ACCEL_HPF_BIT       2
00206 #define MPU6050_ACONFIG_ACCEL_HPF_LENGTH    3
00207 
00208 #define MPU6050_ACCEL_FS_2          0x00
00209 #define MPU6050_ACCEL_FS_4          0x01
00210 #define MPU6050_ACCEL_FS_8          0x02
00211 #define MPU6050_ACCEL_FS_16         0x03
00212 
00213 #define MPU6050_DHPF_RESET          0x00
00214 #define MPU6050_DHPF_5              0x01
00215 #define MPU6050_DHPF_2P5            0x02
00216 #define MPU6050_DHPF_1P25           0x03
00217 #define MPU6050_DHPF_0P63           0x04
00218 #define MPU6050_DHPF_HOLD           0x07
00219 
00220 #define MPU6050_TEMP_FIFO_EN_BIT    7
00221 #define MPU6050_XG_FIFO_EN_BIT      6
00222 #define MPU6050_YG_FIFO_EN_BIT      5
00223 #define MPU6050_ZG_FIFO_EN_BIT      4
00224 #define MPU6050_ACCEL_FIFO_EN_BIT   3
00225 #define MPU6050_SLV2_FIFO_EN_BIT    2
00226 #define MPU6050_SLV1_FIFO_EN_BIT    1
00227 #define MPU6050_SLV0_FIFO_EN_BIT    0
00228 
00229 #define MPU6050_MULT_MST_EN_BIT     7
00230 #define MPU6050_WAIT_FOR_ES_BIT     6
00231 #define MPU6050_SLV_3_FIFO_EN_BIT   5
00232 #define MPU6050_I2C_MST_P_NSR_BIT   4
00233 #define MPU6050_I2C_MST_CLK_BIT     3
00234 #define MPU6050_I2C_MST_CLK_LENGTH  4
00235 
00236 #define MPU6050_CLOCK_DIV_348       0x0
00237 #define MPU6050_CLOCK_DIV_333       0x1
00238 #define MPU6050_CLOCK_DIV_320       0x2
00239 #define MPU6050_CLOCK_DIV_308       0x3
00240 #define MPU6050_CLOCK_DIV_296       0x4
00241 #define MPU6050_CLOCK_DIV_286       0x5
00242 #define MPU6050_CLOCK_DIV_276       0x6
00243 #define MPU6050_CLOCK_DIV_267       0x7
00244 #define MPU6050_CLOCK_DIV_258       0x8
00245 #define MPU6050_CLOCK_DIV_500       0x9
00246 #define MPU6050_CLOCK_DIV_471       0xA
00247 #define MPU6050_CLOCK_DIV_444       0xB
00248 #define MPU6050_CLOCK_DIV_421       0xC
00249 #define MPU6050_CLOCK_DIV_400       0xD
00250 #define MPU6050_CLOCK_DIV_381       0xE
00251 #define MPU6050_CLOCK_DIV_364       0xF
00252 
00253 #define MPU6050_I2C_SLV_RW_BIT      7
00254 #define MPU6050_I2C_SLV_ADDR_BIT    6
00255 #define MPU6050_I2C_SLV_ADDR_LENGTH 7
00256 #define MPU6050_I2C_SLV_EN_BIT      7
00257 #define MPU6050_I2C_SLV_BYTE_SW_BIT 6
00258 #define MPU6050_I2C_SLV_REG_DIS_BIT 5
00259 #define MPU6050_I2C_SLV_GRP_BIT     4
00260 #define MPU6050_I2C_SLV_LEN_BIT     3
00261 #define MPU6050_I2C_SLV_LEN_LENGTH  4
00262 
00263 #define MPU6050_I2C_SLV4_RW_BIT         7
00264 #define MPU6050_I2C_SLV4_ADDR_BIT       6
00265 #define MPU6050_I2C_SLV4_ADDR_LENGTH    7
00266 #define MPU6050_I2C_SLV4_EN_BIT         7
00267 #define MPU6050_I2C_SLV4_INT_EN_BIT     6
00268 #define MPU6050_I2C_SLV4_REG_DIS_BIT    5
00269 #define MPU6050_I2C_SLV4_MST_DLY_BIT    4
00270 #define MPU6050_I2C_SLV4_MST_DLY_LENGTH 5
00271 
00272 #define MPU6050_MST_PASS_THROUGH_BIT    7
00273 #define MPU6050_MST_I2C_SLV4_DONE_BIT   6
00274 #define MPU6050_MST_I2C_LOST_ARB_BIT    5
00275 #define MPU6050_MST_I2C_SLV4_NACK_BIT   4
00276 #define MPU6050_MST_I2C_SLV3_NACK_BIT   3
00277 #define MPU6050_MST_I2C_SLV2_NACK_BIT   2
00278 #define MPU6050_MST_I2C_SLV1_NACK_BIT   1
00279 #define MPU6050_MST_I2C_SLV0_NACK_BIT   0
00280 
00281 #define MPU6050_INTCFG_INT_LEVEL_BIT        7
00282 #define MPU6050_INTCFG_INT_OPEN_BIT         6
00283 #define MPU6050_INTCFG_LATCH_INT_EN_BIT     5
00284 #define MPU6050_INTCFG_INT_RD_CLEAR_BIT     4
00285 #define MPU6050_INTCFG_FSYNC_INT_LEVEL_BIT  3
00286 #define MPU6050_INTCFG_FSYNC_INT_EN_BIT     2
00287 #define MPU6050_INTCFG_I2C_BYPASS_EN_BIT    1
00288 #define MPU6050_INTCFG_CLKOUT_EN_BIT        0
00289 
00290 #define MPU6050_INTMODE_ACTIVEHIGH  0x00
00291 #define MPU6050_INTMODE_ACTIVELOW   0x01
00292 
00293 #define MPU6050_INTDRV_PUSHPULL     0x00
00294 #define MPU6050_INTDRV_OPENDRAIN    0x01
00295 
00296 #define MPU6050_INTLATCH_50USPULSE  0x00
00297 #define MPU6050_INTLATCH_WAITCLEAR  0x01
00298 
00299 #define MPU6050_INTCLEAR_STATUSREAD 0x00
00300 #define MPU6050_INTCLEAR_ANYREAD    0x01
00301 
00302 #define MPU6050_INTERRUPT_FF_BIT            7
00303 #define MPU6050_INTERRUPT_MOT_BIT           6
00304 #define MPU6050_INTERRUPT_ZMOT_BIT          5
00305 #define MPU6050_INTERRUPT_FIFO_OFLOW_BIT    4
00306 #define MPU6050_INTERRUPT_I2C_MST_INT_BIT   3
00307 #define MPU6050_INTERRUPT_PLL_RDY_INT_BIT   2
00308 #define MPU6050_INTERRUPT_DMP_INT_BIT       1
00309 #define MPU6050_INTERRUPT_DATA_RDY_BIT      0
00310 
00311 // TODO: figure out what these actually do
00312 // UMPL source code is not very obivous
00313 #define MPU6050_DMPINT_5_BIT            5
00314 #define MPU6050_DMPINT_4_BIT            4
00315 #define MPU6050_DMPINT_3_BIT            3
00316 #define MPU6050_DMPINT_2_BIT            2
00317 #define MPU6050_DMPINT_1_BIT            1
00318 #define MPU6050_DMPINT_0_BIT            0
00319 
00320 #define MPU6050_MOTION_MOT_XNEG_BIT     7
00321 #define MPU6050_MOTION_MOT_XPOS_BIT     6
00322 #define MPU6050_MOTION_MOT_YNEG_BIT     5
00323 #define MPU6050_MOTION_MOT_YPOS_BIT     4
00324 #define MPU6050_MOTION_MOT_ZNEG_BIT     3
00325 #define MPU6050_MOTION_MOT_ZPOS_BIT     2
00326 #define MPU6050_MOTION_MOT_ZRMOT_BIT    0
00327 
00328 #define MPU6050_DELAYCTRL_DELAY_ES_SHADOW_BIT   7
00329 #define MPU6050_DELAYCTRL_I2C_SLV4_DLY_EN_BIT   4
00330 #define MPU6050_DELAYCTRL_I2C_SLV3_DLY_EN_BIT   3
00331 #define MPU6050_DELAYCTRL_I2C_SLV2_DLY_EN_BIT   2
00332 #define MPU6050_DELAYCTRL_I2C_SLV1_DLY_EN_BIT   1
00333 #define MPU6050_DELAYCTRL_I2C_SLV0_DLY_EN_BIT   0
00334 
00335 #define MPU6050_PATHRESET_GYRO_RESET_BIT    2
00336 #define MPU6050_PATHRESET_ACCEL_RESET_BIT   1
00337 #define MPU6050_PATHRESET_TEMP_RESET_BIT    0
00338 
00339 #define MPU6050_DETECT_ACCEL_ON_DELAY_BIT       5
00340 #define MPU6050_DETECT_ACCEL_ON_DELAY_LENGTH    2
00341 #define MPU6050_DETECT_FF_COUNT_BIT             3
00342 #define MPU6050_DETECT_FF_COUNT_LENGTH          2
00343 #define MPU6050_DETECT_MOT_COUNT_BIT            1
00344 #define MPU6050_DETECT_MOT_COUNT_LENGTH         2
00345 
00346 #define MPU6050_DETECT_DECREMENT_RESET  0x0
00347 #define MPU6050_DETECT_DECREMENT_1      0x1
00348 #define MPU6050_DETECT_DECREMENT_2      0x2
00349 #define MPU6050_DETECT_DECREMENT_4      0x3
00350 
00351 #define MPU6050_USERCTRL_DMP_EN_BIT             7
00352 #define MPU6050_USERCTRL_FIFO_EN_BIT            6
00353 #define MPU6050_USERCTRL_I2C_MST_EN_BIT         5
00354 #define MPU6050_USERCTRL_I2C_IF_DIS_BIT         4
00355 #define MPU6050_USERCTRL_DMP_RESET_BIT          3
00356 #define MPU6050_USERCTRL_FIFO_RESET_BIT         2
00357 #define MPU6050_USERCTRL_I2C_MST_RESET_BIT      1
00358 #define MPU6050_USERCTRL_SIG_COND_RESET_BIT     0
00359 
00360 #define MPU6050_PWR1_DEVICE_RESET_BIT   7
00361 #define MPU6050_PWR1_SLEEP_BIT          6
00362 #define MPU6050_PWR1_CYCLE_BIT          5
00363 #define MPU6050_PWR1_TEMP_DIS_BIT       3
00364 #define MPU6050_PWR1_CLKSEL_BIT         2
00365 #define MPU6050_PWR1_CLKSEL_LENGTH      3
00366 
00367 #define MPU6050_CLOCK_INTERNAL          0x00
00368 #define MPU6050_CLOCK_PLL_XGYRO         0x01
00369 #define MPU6050_CLOCK_PLL_YGYRO         0x02
00370 #define MPU6050_CLOCK_PLL_ZGYRO         0x03
00371 #define MPU6050_CLOCK_PLL_EXT32K        0x04
00372 #define MPU6050_CLOCK_PLL_EXT19M        0x05
00373 #define MPU6050_CLOCK_KEEP_RESET        0x07
00374 
00375 #define MPU6050_PWR2_LP_WAKE_CTRL_BIT       7
00376 #define MPU6050_PWR2_LP_WAKE_CTRL_LENGTH    2
00377 #define MPU6050_PWR2_STBY_XA_BIT            5
00378 #define MPU6050_PWR2_STBY_YA_BIT            4
00379 #define MPU6050_PWR2_STBY_ZA_BIT            3
00380 #define MPU6050_PWR2_STBY_XG_BIT            2
00381 #define MPU6050_PWR2_STBY_YG_BIT            1
00382 #define MPU6050_PWR2_STBY_ZG_BIT            0
00383 
00384 #define MPU6050_WAKE_FREQ_1P25      0x0
00385 #define MPU6050_WAKE_FREQ_2P5       0x1
00386 #define MPU6050_WAKE_FREQ_5         0x2
00387 #define MPU6050_WAKE_FREQ_10        0x3
00388 
00389 #define MPU6050_BANKSEL_PRFTCH_EN_BIT       6
00390 #define MPU6050_BANKSEL_CFG_USER_BANK_BIT   5
00391 #define MPU6050_BANKSEL_MEM_SEL_BIT         4
00392 #define MPU6050_BANKSEL_MEM_SEL_LENGTH      5
00393 
00394 #define MPU6050_WHO_AM_I_BIT        6
00395 #define MPU6050_WHO_AM_I_LENGTH     6
00396 
00397 #define MPU6050_DMP_MEMORY_BANKS        8
00398 #define MPU6050_DMP_MEMORY_BANK_SIZE    256
00399 #define MPU6050_DMP_MEMORY_CHUNK_SIZE   16
00400 
00401 // note: DMP code memory blocks defined at end of header file
00402 
00403 class MPU6050 {
00404     public:
00405         MPU6050();
00406         MPU6050(uint8_t address);
00407 
00408         void initialize();
00409         bool testConnection();
00410 
00411         // AUX_VDDIO register
00412         uint8_t getAuxVDDIOLevel();
00413         void setAuxVDDIOLevel(uint8_t level);
00414 
00415         // SMPLRT_DIV register
00416         uint8_t getRate();
00417         void setRate(uint8_t rate);
00418 
00419         // CONFIG register
00420         uint8_t getExternalFrameSync();
00421         void setExternalFrameSync(uint8_t sync);
00422         uint8_t getDLPFMode();
00423         void setDLPFMode(uint8_t bandwidth);
00424 
00425         // GYRO_CONFIG register
00426         uint8_t getFullScaleGyroRange();
00427         void setFullScaleGyroRange(uint8_t range);
00428 
00429         // ACCEL_CONFIG register
00430         bool getAccelXSelfTest();
00431         void setAccelXSelfTest(bool enabled);
00432         bool getAccelYSelfTest();
00433         void setAccelYSelfTest(bool enabled);
00434         bool getAccelZSelfTest();
00435         void setAccelZSelfTest(bool enabled);
00436         uint8_t getFullScaleAccelRange();
00437         void setFullScaleAccelRange(uint8_t range);
00438         uint8_t getDHPFMode();
00439         void setDHPFMode(uint8_t mode);
00440 
00441         // FF_THR register
00442         uint8_t getFreefallDetectionThreshold();
00443         void setFreefallDetectionThreshold(uint8_t threshold);
00444 
00445         // FF_DUR register
00446         uint8_t getFreefallDetectionDuration();
00447         void setFreefallDetectionDuration(uint8_t duration);
00448 
00449         // MOT_THR register
00450         uint8_t getMotionDetectionThreshold();
00451         void setMotionDetectionThreshold(uint8_t threshold);
00452 
00453         // MOT_DUR register
00454         uint8_t getMotionDetectionDuration();
00455         void setMotionDetectionDuration(uint8_t duration);
00456 
00457         // ZRMOT_THR register
00458         uint8_t getZeroMotionDetectionThreshold();
00459         void setZeroMotionDetectionThreshold(uint8_t threshold);
00460 
00461         // ZRMOT_DUR register
00462         uint8_t getZeroMotionDetectionDuration();
00463         void setZeroMotionDetectionDuration(uint8_t duration);
00464 
00465         // FIFO_EN register
00466         bool getTempFIFOEnabled();
00467         void setTempFIFOEnabled(bool enabled);
00468         bool getXGyroFIFOEnabled();
00469         void setXGyroFIFOEnabled(bool enabled);
00470         bool getYGyroFIFOEnabled();
00471         void setYGyroFIFOEnabled(bool enabled);
00472         bool getZGyroFIFOEnabled();
00473         void setZGyroFIFOEnabled(bool enabled);
00474         bool getAccelFIFOEnabled();
00475         void setAccelFIFOEnabled(bool enabled);
00476         bool getSlave2FIFOEnabled();
00477         void setSlave2FIFOEnabled(bool enabled);
00478         bool getSlave1FIFOEnabled();
00479         void setSlave1FIFOEnabled(bool enabled);
00480         bool getSlave0FIFOEnabled();
00481         void setSlave0FIFOEnabled(bool enabled);
00482 
00483         // I2C_MST_CTRL register
00484         bool getMultiMasterEnabled();
00485         void setMultiMasterEnabled(bool enabled);
00486         bool getWaitForExternalSensorEnabled();
00487         void setWaitForExternalSensorEnabled(bool enabled);
00488         bool getSlave3FIFOEnabled();
00489         void setSlave3FIFOEnabled(bool enabled);
00490         bool getSlaveReadWriteTransitionEnabled();
00491         void setSlaveReadWriteTransitionEnabled(bool enabled);
00492         uint8_t getMasterClockSpeed();
00493         void setMasterClockSpeed(uint8_t speed);
00494 
00495         // I2C_SLV* registers (Slave 0-3)
00496         uint8_t getSlaveAddress(uint8_t num);
00497         void setSlaveAddress(uint8_t num, uint8_t address);
00498         uint8_t getSlaveRegister(uint8_t num);
00499         void setSlaveRegister(uint8_t num, uint8_t reg);
00500         bool getSlaveEnabled(uint8_t num);
00501         void setSlaveEnabled(uint8_t num, bool enabled);
00502         bool getSlaveWordByteSwap(uint8_t num);
00503         void setSlaveWordByteSwap(uint8_t num, bool enabled);
00504         bool getSlaveWriteMode(uint8_t num);
00505         void setSlaveWriteMode(uint8_t num, bool mode);
00506         bool getSlaveWordGroupOffset(uint8_t num);
00507         void setSlaveWordGroupOffset(uint8_t num, bool enabled);
00508         uint8_t getSlaveDataLength(uint8_t num);
00509         void setSlaveDataLength(uint8_t num, uint8_t length);
00510 
00511         // I2C_SLV* registers (Slave 4)
00512         uint8_t getSlave4Address();
00513         void setSlave4Address(uint8_t address);
00514         uint8_t getSlave4Register();
00515         void setSlave4Register(uint8_t reg);
00516         void setSlave4OutputByte(uint8_t data);
00517         bool getSlave4Enabled();
00518         void setSlave4Enabled(bool enabled);
00519         bool getSlave4InterruptEnabled();
00520         void setSlave4InterruptEnabled(bool enabled);
00521         bool getSlave4WriteMode();
00522         void setSlave4WriteMode(bool mode);
00523         uint8_t getSlave4MasterDelay();
00524         void setSlave4MasterDelay(uint8_t delay);
00525         uint8_t getSlate4InputByte();
00526 
00527         // I2C_MST_STATUS register
00528         bool getPassthroughStatus();
00529         bool getSlave4IsDone();
00530         bool getLostArbitration();
00531         bool getSlave4Nack();
00532         bool getSlave3Nack();
00533         bool getSlave2Nack();
00534         bool getSlave1Nack();
00535         bool getSlave0Nack();
00536 
00537         // INT_PIN_CFG register
00538         bool getInterruptMode();
00539         void setInterruptMode(bool mode);
00540         bool getInterruptDrive();
00541         void setInterruptDrive(bool drive);
00542         bool getInterruptLatch();
00543         void setInterruptLatch(bool latch);
00544         bool getInterruptLatchClear();
00545         void setInterruptLatchClear(bool clear);
00546         bool getFSyncInterruptLevel();
00547         void setFSyncInterruptLevel(bool level);
00548         bool getFSyncInterruptEnabled();
00549         void setFSyncInterruptEnabled(bool enabled);
00550         bool getI2CBypassEnabled();
00551         void setI2CBypassEnabled(bool enabled);
00552         bool getClockOutputEnabled();
00553         void setClockOutputEnabled(bool enabled);
00554 
00555         // INT_ENABLE register
00556         uint8_t getIntEnabled();
00557         void setIntEnabled(uint8_t enabled);
00558         bool getIntFreefallEnabled();
00559         void setIntFreefallEnabled(bool enabled);
00560         bool getIntMotionEnabled();
00561         void setIntMotionEnabled(bool enabled);
00562         bool getIntZeroMotionEnabled();
00563         void setIntZeroMotionEnabled(bool enabled);
00564         bool getIntFIFOBufferOverflowEnabled();
00565         void setIntFIFOBufferOverflowEnabled(bool enabled);
00566         bool getIntI2CMasterEnabled();
00567         void setIntI2CMasterEnabled(bool enabled);
00568         bool getIntDataReadyEnabled();
00569         void setIntDataReadyEnabled(bool enabled);
00570 
00571         // INT_STATUS register
00572         uint8_t getIntStatus();
00573         bool getIntFreefallStatus();
00574         bool getIntMotionStatus();
00575         bool getIntZeroMotionStatus();
00576         bool getIntFIFOBufferOverflowStatus();
00577         bool getIntI2CMasterStatus();
00578         bool getIntDataReadyStatus();
00579 
00580         // ACCEL_*OUT_* registers
00581         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);
00582         void getMotion6(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz);
00583         void getAcceleration(int16_t* x, int16_t* y, int16_t* z);
00584         int16_t getAccelerationX();
00585         int16_t getAccelerationY();
00586         int16_t getAccelerationZ();
00587 
00588         // TEMP_OUT_* registers
00589         int16_t getTemperature();
00590 
00591         // GYRO_*OUT_* registers
00592         void getRotation(int16_t* x, int16_t* y, int16_t* z);
00593         int16_t getRotationX();
00594         int16_t getRotationY();
00595         int16_t getRotationZ();
00596 
00597         // EXT_SENS_DATA_* registers
00598         uint8_t getExternalSensorByte(int position);
00599         uint16_t getExternalSensorWord(int position);
00600         uint32_t getExternalSensorDWord(int position);
00601 
00602         // MOT_DETECT_STATUS register
00603         bool getXNegMotionDetected();
00604         bool getXPosMotionDetected();
00605         bool getYNegMotionDetected();
00606         bool getYPosMotionDetected();
00607         bool getZNegMotionDetected();
00608         bool getZPosMotionDetected();
00609         bool getZeroMotionDetected();
00610 
00611         // I2C_SLV*_DO register
00612         void setSlaveOutputByte(uint8_t num, uint8_t data);
00613 
00614         // I2C_MST_DELAY_CTRL register
00615         bool getExternalShadowDelayEnabled();
00616         void setExternalShadowDelayEnabled(bool enabled);
00617         bool getSlaveDelayEnabled(uint8_t num);
00618         void setSlaveDelayEnabled(uint8_t num, bool enabled);
00619 
00620         // SIGNAL_PATH_RESET register
00621         void resetGyroscopePath();
00622         void resetAccelerometerPath();
00623         void resetTemperaturePath();
00624 
00625         // MOT_DETECT_CTRL register
00626         uint8_t getAccelerometerPowerOnDelay();
00627         void setAccelerometerPowerOnDelay(uint8_t delay);
00628         uint8_t getFreefallDetectionCounterDecrement();
00629         void setFreefallDetectionCounterDecrement(uint8_t decrement);
00630         uint8_t getMotionDetectionCounterDecrement();
00631         void setMotionDetectionCounterDecrement(uint8_t decrement);
00632 
00633         // USER_CTRL register
00634         bool getFIFOEnabled();
00635         void setFIFOEnabled(bool enabled);
00636         bool getI2CMasterModeEnabled();
00637         void setI2CMasterModeEnabled(bool enabled);
00638         void switchSPIEnabled(bool enabled);
00639         void resetFIFO();
00640         void resetI2CMaster();
00641         void resetSensors();
00642 
00643         // PWR_MGMT_1 register
00644         void reset();
00645         bool getSleepEnabled();
00646         void setSleepEnabled(bool enabled);
00647         bool getWakeCycleEnabled();
00648         void setWakeCycleEnabled(bool enabled);
00649         bool getTempSensorEnabled();
00650         void setTempSensorEnabled(bool enabled);
00651         uint8_t getClockSource();
00652         void setClockSource(uint8_t source);
00653 
00654         // PWR_MGMT_2 register
00655         uint8_t getWakeFrequency();
00656         void setWakeFrequency(uint8_t frequency);
00657         bool getStandbyXAccelEnabled();
00658         void setStandbyXAccelEnabled(bool enabled);
00659         bool getStandbyYAccelEnabled();
00660         void setStandbyYAccelEnabled(bool enabled);
00661         bool getStandbyZAccelEnabled();
00662         void setStandbyZAccelEnabled(bool enabled);
00663         bool getStandbyXGyroEnabled();
00664         void setStandbyXGyroEnabled(bool enabled);
00665         bool getStandbyYGyroEnabled();
00666         void setStandbyYGyroEnabled(bool enabled);
00667         bool getStandbyZGyroEnabled();
00668         void setStandbyZGyroEnabled(bool enabled);
00669 
00670         // FIFO_COUNT_* registers
00671         uint16_t getFIFOCount();
00672 
00673         // FIFO_R_W register
00674         uint8_t getFIFOByte();
00675         void setFIFOByte(uint8_t data);
00676         void getFIFOBytes(uint8_t *data, uint8_t length);
00677 
00678         // WHO_AM_I register
00679         uint8_t getDeviceID();
00680         void setDeviceID(uint8_t id);
00681         
00682         // ======== UNDOCUMENTED/DMP REGISTERS/METHODS ========
00683         
00684         // XG_OFFS_TC register
00685         uint8_t getOTPBankValid();
00686         void setOTPBankValid(bool enabled);
00687         int8_t getXGyroOffsetTC();
00688         void setXGyroOffsetTC(int8_t offset);
00689 
00690         // YG_OFFS_TC register
00691         int8_t getYGyroOffsetTC();
00692         void setYGyroOffsetTC(int8_t offset);
00693 
00694         // ZG_OFFS_TC register
00695         int8_t getZGyroOffsetTC();
00696         void setZGyroOffsetTC(int8_t offset);
00697 
00698         // X_FINE_GAIN register
00699         int8_t getXFineGain();
00700         void setXFineGain(int8_t gain);
00701 
00702         // Y_FINE_GAIN register
00703         int8_t getYFineGain();
00704         void setYFineGain(int8_t gain);
00705 
00706         // Z_FINE_GAIN register
00707         int8_t getZFineGain();
00708         void setZFineGain(int8_t gain);
00709 
00710         // XA_OFFS_* registers
00711         int16_t getXAccelOffset();
00712         void setXAccelOffset(int16_t offset);
00713 
00714         // YA_OFFS_* register
00715         int16_t getYAccelOffset();
00716         void setYAccelOffset(int16_t offset);
00717 
00718         // ZA_OFFS_* register
00719         int16_t getZAccelOffset();
00720         void setZAccelOffset(int16_t offset);
00721 
00722         // XG_OFFS_USR* registers
00723         int16_t getXGyroOffset();
00724         void setXGyroOffset(int16_t offset);
00725 
00726         // YG_OFFS_USR* register
00727         int16_t getYGyroOffset();
00728         void setYGyroOffset(int16_t offset);
00729 
00730         // ZG_OFFS_USR* register
00731         int16_t getZGyroOffset();
00732         void setZGyroOffset(int16_t offset);
00733         
00734         // INT_ENABLE register (DMP functions)
00735         bool getIntPLLReadyEnabled();
00736         void setIntPLLReadyEnabled(bool enabled);
00737         bool getIntDMPEnabled();
00738         void setIntDMPEnabled(bool enabled);
00739         
00740         // DMP_INT_STATUS
00741         bool getDMPInt5Status();
00742         bool getDMPInt4Status();
00743         bool getDMPInt3Status();
00744         bool getDMPInt2Status();
00745         bool getDMPInt1Status();
00746         bool getDMPInt0Status();
00747 
00748         // INT_STATUS register (DMP functions)
00749         bool getIntPLLReadyStatus();
00750         bool getIntDMPStatus();
00751         
00752         // USER_CTRL register (DMP functions)
00753         bool getDMPEnabled();
00754         void setDMPEnabled(bool enabled);
00755         void resetDMP();
00756         
00757         // BANK_SEL register
00758         void setMemoryBank(uint8_t bank, bool prefetchEnabled=false, bool userBank=false);
00759         
00760         // MEM_START_ADDR register
00761         void setMemoryStartAddress(uint8_t address);
00762         
00763         // MEM_R_W register
00764         uint8_t readMemoryByte();
00765         void writeMemoryByte(uint8_t data);
00766         void readMemoryBlock(uint8_t *data, uint16_t dataSize, uint8_t bank=0, uint8_t address=0);
00767         bool writeMemoryBlock(const uint8_t *data, uint16_t dataSize, uint8_t bank=0, uint8_t address=0, bool verify=true, bool useProgMem=false);
00768         bool writeProgMemoryBlock(const uint8_t *data, uint16_t dataSize, uint8_t bank=0, uint8_t address=0, bool verify=true);
00769 
00770         bool writeDMPConfigurationSet(const uint8_t *data, uint16_t dataSize, bool useProgMem=false);
00771         bool writeProgDMPConfigurationSet(const uint8_t *data, uint16_t dataSize);
00772 
00773         // DMP_CFG_1 register
00774         uint8_t getDMPConfig1();
00775         void setDMPConfig1(uint8_t config);
00776 
00777         // DMP_CFG_2 register
00778         uint8_t getDMPConfig2();
00779         void setDMPConfig2(uint8_t config);
00780 
00781         // special methods for MotionApps 2.0 implementation
00782         #ifdef MPU6050_INCLUDE_DMP_MOTIONAPPS20
00783             uint8_t *dmpPacketBuffer;
00784             uint16_t dmpPacketSize;
00785 
00786             uint8_t dmpInitialize();
00787             bool dmpPacketAvailable();
00788 
00789             uint8_t dmpSetFIFORate(uint8_t fifoRate);
00790             uint8_t dmpGetFIFORate();
00791             uint8_t dmpGetSampleStepSizeMS();
00792             uint8_t dmpGetSampleFrequency();
00793             int32_t dmpDecodeTemperature(int8_t tempReg);
00794             
00795             // Register callbacks after a packet of FIFO data is processed
00796             //uint8_t dmpRegisterFIFORateProcess(inv_obj_func func, int16_t priority);
00797             //uint8_t dmpUnregisterFIFORateProcess(inv_obj_func func);
00798             uint8_t dmpRunFIFORateProcesses();
00799             
00800             // Setup FIFO for various output
00801             uint8_t dmpSendQuaternion(uint_fast16_t accuracy);
00802             uint8_t dmpSendGyro(uint_fast16_t elements, uint_fast16_t accuracy);
00803             uint8_t dmpSendAccel(uint_fast16_t elements, uint_fast16_t accuracy);
00804             uint8_t dmpSendLinearAccel(uint_fast16_t elements, uint_fast16_t accuracy);
00805             uint8_t dmpSendLinearAccelInWorld(uint_fast16_t elements, uint_fast16_t accuracy);
00806             uint8_t dmpSendControlData(uint_fast16_t elements, uint_fast16_t accuracy);
00807             uint8_t dmpSendSensorData(uint_fast16_t elements, uint_fast16_t accuracy);
00808             uint8_t dmpSendExternalSensorData(uint_fast16_t elements, uint_fast16_t accuracy);
00809             uint8_t dmpSendGravity(uint_fast16_t elements, uint_fast16_t accuracy);
00810             uint8_t dmpSendPacketNumber(uint_fast16_t accuracy);
00811             uint8_t dmpSendQuantizedAccel(uint_fast16_t elements, uint_fast16_t accuracy);
00812             uint8_t dmpSendEIS(uint_fast16_t elements, uint_fast16_t accuracy);
00813 
00814             // Get Fixed Point data from FIFO
00815             uint8_t dmpGetAccel(int32_t *data, const uint8_t* packet=0);
00816             uint8_t dmpGetAccel(int16_t *data, const uint8_t* packet=0);
00817             uint8_t dmpGetAccel(VectorInt16 *v, const uint8_t* packet=0);
00818             uint8_t dmpGetQuaternion(int32_t *data, const uint8_t* packet=0);
00819             uint8_t dmpGetQuaternion(int16_t *data, const uint8_t* packet=0);
00820             uint8_t dmpGetQuaternion(Quaternion *q, const uint8_t* packet=0);
00821             uint8_t dmpGet6AxisQuaternion(int32_t *data, const uint8_t* packet=0);
00822             uint8_t dmpGet6AxisQuaternion(int16_t *data, const uint8_t* packet=0);
00823             uint8_t dmpGet6AxisQuaternion(Quaternion *q, const uint8_t* packet=0);
00824             uint8_t dmpGetRelativeQuaternion(int32_t *data, const uint8_t* packet=0);
00825             uint8_t dmpGetRelativeQuaternion(int16_t *data, const uint8_t* packet=0);
00826             uint8_t dmpGetRelativeQuaternion(Quaternion *data, const uint8_t* packet=0);
00827             uint8_t dmpGetGyro(int32_t *data, const uint8_t* packet=0);
00828             uint8_t dmpGetGyro(int16_t *data, const uint8_t* packet=0);
00829             uint8_t dmpGetGyro(VectorInt16 *v, const uint8_t* packet=0);
00830             uint8_t dmpSetLinearAccelFilterCoefficient(float coef);
00831             uint8_t dmpGetLinearAccel(int32_t *data, const uint8_t* packet=0);
00832             uint8_t dmpGetLinearAccel(int16_t *data, const uint8_t* packet=0);
00833             uint8_t dmpGetLinearAccel(VectorInt16 *v, const uint8_t* packet=0);
00834             uint8_t dmpGetLinearAccel(VectorInt16 *v, VectorInt16 *vRaw, VectorFloat *gravity);
00835             uint8_t dmpGetLinearAccelInWorld(int32_t *data, const uint8_t* packet=0);
00836             uint8_t dmpGetLinearAccelInWorld(int16_t *data, const uint8_t* packet=0);
00837             uint8_t dmpGetLinearAccelInWorld(VectorInt16 *v, const uint8_t* packet=0);
00838             uint8_t dmpGetLinearAccelInWorld(VectorInt16 *v, VectorInt16 *vReal, Quaternion *q);
00839             uint8_t dmpGetGyroAndAccelSensor(int32_t *data, const uint8_t* packet=0);
00840             uint8_t dmpGetGyroAndAccelSensor(int16_t *data, const uint8_t* packet=0);
00841             uint8_t dmpGetGyroAndAccelSensor(VectorInt16 *g, VectorInt16 *a, const uint8_t* packet=0);
00842             uint8_t dmpGetGyroSensor(int32_t *data, const uint8_t* packet=0);
00843             uint8_t dmpGetGyroSensor(int16_t *data, const uint8_t* packet=0);
00844             uint8_t dmpGetGyroSensor(VectorInt16 *v, const uint8_t* packet=0);
00845             uint8_t dmpGetControlData(int32_t *data, const uint8_t* packet=0);
00846             uint8_t dmpGetTemperature(int32_t *data, const uint8_t* packet=0);
00847             uint8_t dmpGetGravity(int32_t *data, const uint8_t* packet=0);
00848             uint8_t dmpGetGravity(int16_t *data, const uint8_t* packet=0);
00849             uint8_t dmpGetGravity(VectorInt16 *v, const uint8_t* packet=0);
00850             uint8_t dmpGetGravity(VectorFloat *v, Quaternion *q);
00851             uint8_t dmpGetUnquantizedAccel(int32_t *data, const uint8_t* packet=0);
00852             uint8_t dmpGetUnquantizedAccel(int16_t *data, const uint8_t* packet=0);
00853             uint8_t dmpGetUnquantizedAccel(VectorInt16 *v, const uint8_t* packet=0);
00854             uint8_t dmpGetQuantizedAccel(int32_t *data, const uint8_t* packet=0);
00855             uint8_t dmpGetQuantizedAccel(int16_t *data, const uint8_t* packet=0);
00856             uint8_t dmpGetQuantizedAccel(VectorInt16 *v, const uint8_t* packet=0);
00857             uint8_t dmpGetExternalSensorData(int32_t *data, uint16_t size, const uint8_t* packet=0);
00858             uint8_t dmpGetEIS(int32_t *data, const uint8_t* packet=0);
00859             
00860             uint8_t dmpGetEuler(float *data, Quaternion *q);
00861             uint8_t dmpGetYawPitchRoll(float *data, Quaternion *q, VectorFloat *gravity);
00862 
00863             // Get Floating Point data from FIFO
00864             uint8_t dmpGetAccelFloat(float *data, const uint8_t* packet=0);
00865             uint8_t dmpGetQuaternionFloat(float *data, const uint8_t* packet=0);
00866 
00867             uint8_t dmpProcessFIFOPacket(const unsigned char *dmpData);
00868             uint8_t dmpReadAndProcessFIFOPacket(uint8_t numPackets, uint8_t *processed=NULL);
00869 
00870             uint8_t dmpSetFIFOProcessedCallback(void (*func) (void));
00871 
00872             uint8_t dmpInitFIFOParam();
00873             uint8_t dmpCloseFIFO();
00874             uint8_t dmpSetGyroDataSource(uint8_t source);
00875             uint8_t dmpDecodeQuantizedAccel();
00876             uint32_t dmpGetGyroSumOfSquare();
00877             uint32_t dmpGetAccelSumOfSquare();
00878             void dmpOverrideQuaternion(long *q);
00879             uint16_t dmpGetFIFOPacketSize();
00880         #endif
00881 
00882         // special methods for MotionApps 4.1 implementation
00883         #ifdef MPU6050_INCLUDE_DMP_MOTIONAPPS41
00884             uint8_t *dmpPacketBuffer;
00885             uint16_t dmpPacketSize;
00886 
00887             uint8_t dmpInitialize();
00888             bool dmpPacketAvailable();
00889 
00890             uint8_t dmpSetFIFORate(uint8_t fifoRate);
00891             uint8_t dmpGetFIFORate();
00892             uint8_t dmpGetSampleStepSizeMS();
00893             uint8_t dmpGetSampleFrequency();
00894             int32_t dmpDecodeTemperature(int8_t tempReg);
00895             
00896             // Register callbacks after a packet of FIFO data is processed
00897             //uint8_t dmpRegisterFIFORateProcess(inv_obj_func func, int16_t priority);
00898             //uint8_t dmpUnregisterFIFORateProcess(inv_obj_func func);
00899             uint8_t dmpRunFIFORateProcesses();
00900             
00901             // Setup FIFO for various output
00902             uint8_t dmpSendQuaternion(uint_fast16_t accuracy);
00903             uint8_t dmpSendGyro(uint_fast16_t elements, uint_fast16_t accuracy);
00904             uint8_t dmpSendAccel(uint_fast16_t elements, uint_fast16_t accuracy);
00905             uint8_t dmpSendLinearAccel(uint_fast16_t elements, uint_fast16_t accuracy);
00906             uint8_t dmpSendLinearAccelInWorld(uint_fast16_t elements, uint_fast16_t accuracy);
00907             uint8_t dmpSendControlData(uint_fast16_t elements, uint_fast16_t accuracy);
00908             uint8_t dmpSendSensorData(uint_fast16_t elements, uint_fast16_t accuracy);
00909             uint8_t dmpSendExternalSensorData(uint_fast16_t elements, uint_fast16_t accuracy);
00910             uint8_t dmpSendGravity(uint_fast16_t elements, uint_fast16_t accuracy);
00911             uint8_t dmpSendPacketNumber(uint_fast16_t accuracy);
00912             uint8_t dmpSendQuantizedAccel(uint_fast16_t elements, uint_fast16_t accuracy);
00913             uint8_t dmpSendEIS(uint_fast16_t elements, uint_fast16_t accuracy);
00914 
00915             // Get Fixed Point data from FIFO
00916             uint8_t dmpGetAccel(int32_t *data, const uint8_t* packet=0);
00917             uint8_t dmpGetAccel(int16_t *data, const uint8_t* packet=0);
00918             uint8_t dmpGetAccel(VectorInt16 *v, const uint8_t* packet=0);
00919             uint8_t dmpGetQuaternion(int32_t *data, const uint8_t* packet=0);
00920             uint8_t dmpGetQuaternion(int16_t *data, const uint8_t* packet=0);
00921             uint8_t dmpGetQuaternion(Quaternion *q, const uint8_t* packet=0);
00922             uint8_t dmpGet6AxisQuaternion(int32_t *data, const uint8_t* packet=0);
00923             uint8_t dmpGet6AxisQuaternion(int16_t *data, const uint8_t* packet=0);
00924             uint8_t dmpGet6AxisQuaternion(Quaternion *q, const uint8_t* packet=0);
00925             uint8_t dmpGetRelativeQuaternion(int32_t *data, const uint8_t* packet=0);
00926             uint8_t dmpGetRelativeQuaternion(int16_t *data, const uint8_t* packet=0);
00927             uint8_t dmpGetRelativeQuaternion(Quaternion *data, const uint8_t* packet=0);
00928             uint8_t dmpGetGyro(int32_t *data, const uint8_t* packet=0);
00929             uint8_t dmpGetGyro(int16_t *data, const uint8_t* packet=0);
00930             uint8_t dmpGetGyro(VectorInt16 *v, const uint8_t* packet=0);
00931             uint8_t dmpGetMag(int16_t *data, const uint8_t* packet=0);
00932             uint8_t dmpSetLinearAccelFilterCoefficient(float coef);
00933             uint8_t dmpGetLinearAccel(int32_t *data, const uint8_t* packet=0);
00934             uint8_t dmpGetLinearAccel(int16_t *data, const uint8_t* packet=0);
00935             uint8_t dmpGetLinearAccel(VectorInt16 *v, const uint8_t* packet=0);
00936             uint8_t dmpGetLinearAccel(VectorInt16 *v, VectorInt16 *vRaw, VectorFloat *gravity);
00937             uint8_t dmpGetLinearAccelInWorld(int32_t *data, const uint8_t* packet=0);
00938             uint8_t dmpGetLinearAccelInWorld(int16_t *data, const uint8_t* packet=0);
00939             uint8_t dmpGetLinearAccelInWorld(VectorInt16 *v, const uint8_t* packet=0);
00940             uint8_t dmpGetLinearAccelInWorld(VectorInt16 *v, VectorInt16 *vReal, Quaternion *q);
00941             uint8_t dmpGetGyroAndAccelSensor(int32_t *data, const uint8_t* packet=0);
00942             uint8_t dmpGetGyroAndAccelSensor(int16_t *data, const uint8_t* packet=0);
00943             uint8_t dmpGetGyroAndAccelSensor(VectorInt16 *g, VectorInt16 *a, const uint8_t* packet=0);
00944             uint8_t dmpGetGyroSensor(int32_t *data, const uint8_t* packet=0);
00945             uint8_t dmpGetGyroSensor(int16_t *data, const uint8_t* packet=0);
00946             uint8_t dmpGetGyroSensor(VectorInt16 *v, const uint8_t* packet=0);
00947             uint8_t dmpGetControlData(int32_t *data, const uint8_t* packet=0);
00948             uint8_t dmpGetTemperature(int32_t *data, const uint8_t* packet=0);
00949             uint8_t dmpGetGravity(int32_t *data, const uint8_t* packet=0);
00950             uint8_t dmpGetGravity(int16_t *data, const uint8_t* packet=0);
00951             uint8_t dmpGetGravity(VectorInt16 *v, const uint8_t* packet=0);
00952             uint8_t dmpGetGravity(VectorFloat *v, Quaternion *q);
00953             uint8_t dmpGetUnquantizedAccel(int32_t *data, const uint8_t* packet=0);
00954             uint8_t dmpGetUnquantizedAccel(int16_t *data, const uint8_t* packet=0);
00955             uint8_t dmpGetUnquantizedAccel(VectorInt16 *v, const uint8_t* packet=0);
00956             uint8_t dmpGetQuantizedAccel(int32_t *data, const uint8_t* packet=0);
00957             uint8_t dmpGetQuantizedAccel(int16_t *data, const uint8_t* packet=0);
00958             uint8_t dmpGetQuantizedAccel(VectorInt16 *v, const uint8_t* packet=0);
00959             uint8_t dmpGetExternalSensorData(int32_t *data, uint16_t size, const uint8_t* packet=0);
00960             uint8_t dmpGetEIS(int32_t *data, const uint8_t* packet=0);
00961             
00962             uint8_t dmpGetEuler(float *data, Quaternion *q);
00963             uint8_t dmpGetYawPitchRoll(float *data, Quaternion *q, VectorFloat *gravity);
00964 
00965             // Get Floating Point data from FIFO
00966             uint8_t dmpGetAccelFloat(float *data, const uint8_t* packet=0);
00967             uint8_t dmpGetQuaternionFloat(float *data, const uint8_t* packet=0);
00968 
00969             uint8_t dmpProcessFIFOPacket(const unsigned char *dmpData);
00970             uint8_t dmpReadAndProcessFIFOPacket(uint8_t numPackets, uint8_t *processed=NULL);
00971 
00972             uint8_t dmpSetFIFOProcessedCallback(void (*func) (void));
00973 
00974             uint8_t dmpInitFIFOParam();
00975             uint8_t dmpCloseFIFO();
00976             uint8_t dmpSetGyroDataSource(uint8_t source);
00977             uint8_t dmpDecodeQuantizedAccel();
00978             uint32_t dmpGetGyroSumOfSquare();
00979             uint32_t dmpGetAccelSumOfSquare();
00980             void dmpOverrideQuaternion(long *q);
00981             uint16_t dmpGetFIFOPacketSize();
00982         #endif
00983 
00984     private:
00985         uint8_t devAddr;
00986         uint8_t buffer[14];
00987 };
00988 
00989 #endif /* _MPU6050_H_ */
00990