9Axis IMU MPU9150 's library. This project is ported from this Arduino's project https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU9150. Connect pinName 27 to SCL, PinName 28 to SDA, GND to GND, and VOUT to VCC to try this library. The example is here

Dependencies:   ArduinoSerial I2Cdev

Dependents:   MPU9150_Example

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers MPU9150.h Source File

MPU9150.h

00001 #ifndef _MPU9150_H_
00002 #define _MPU9150_H_
00003 
00004 #include "I2Cdev.h"
00005 
00006 // supporting link:  http://forum.arduino.cc/index.php?&topic=143444.msg1079517#msg1079517
00007 // also: http://forum.arduino.cc/index.php?&topic=141571.msg1062899#msg1062899s
00008 #ifdef __AVR__
00009 #include <avr/pgmspace.h>
00010 #else
00011 #define PROGMEM /* empty */
00012 #define pgm_read_byte(x) (*(x))
00013 #define pgm_read_word(x) (*(x))
00014 #define pgm_read_float(x) (*(x))
00015 #define PSTR(STR) STR
00016 #endif
00017 
00018 //Magnetometer Registers
00019 #define MPU9150_RA_MAG_ADDRESS      0x0C
00020 #define MPU9150_RA_MAG_XOUT_L       0x03
00021 #define MPU9150_RA_MAG_XOUT_H       0x04
00022 #define MPU9150_RA_MAG_YOUT_L       0x05
00023 #define MPU9150_RA_MAG_YOUT_H       0x06
00024 #define MPU9150_RA_MAG_ZOUT_L       0x07
00025 #define MPU9150_RA_MAG_ZOUT_H       0x08
00026 
00027 #define MPU9150_ADDRESS_AD0_LOW     0x68 // address pin low (GND), default for InvenSense evaluation board
00028 #define MPU9150_ADDRESS_AD0_HIGH    0x69 // address pin high (VCC)
00029 #define MPU9150_DEFAULT_ADDRESS     MPU9150_ADDRESS_AD0_LOW
00030 
00031 #define MPU9150_RA_XG_OFFS_TC       0x00 //[7] PWR_MODE, [6:1] XG_OFFS_TC, [0] OTP_BNK_VLD
00032 #define MPU9150_RA_YG_OFFS_TC       0x01 //[7] PWR_MODE, [6:1] YG_OFFS_TC, [0] OTP_BNK_VLD
00033 #define MPU9150_RA_ZG_OFFS_TC       0x02 //[7] PWR_MODE, [6:1] ZG_OFFS_TC, [0] OTP_BNK_VLD
00034 #define MPU9150_RA_X_FINE_GAIN      0x03 //[7:0] X_FINE_GAIN
00035 #define MPU9150_RA_Y_FINE_GAIN      0x04 //[7:0] Y_FINE_GAIN
00036 #define MPU9150_RA_Z_FINE_GAIN      0x05 //[7:0] Z_FINE_GAIN
00037 #define MPU9150_RA_XA_OFFS_H        0x06 //[15:0] XA_OFFS
00038 #define MPU9150_RA_XA_OFFS_L_TC     0x07
00039 #define MPU9150_RA_YA_OFFS_H        0x08 //[15:0] YA_OFFS
00040 #define MPU9150_RA_YA_OFFS_L_TC     0x09
00041 #define MPU9150_RA_ZA_OFFS_H        0x0A //[15:0] ZA_OFFS
00042 #define MPU9150_RA_ZA_OFFS_L_TC     0x0B
00043 #define MPU9150_RA_XG_OFFS_USRH     0x13 //[15:0] XG_OFFS_USR
00044 #define MPU9150_RA_XG_OFFS_USRL     0x14
00045 #define MPU9150_RA_YG_OFFS_USRH     0x15 //[15:0] YG_OFFS_USR
00046 #define MPU9150_RA_YG_OFFS_USRL     0x16
00047 #define MPU9150_RA_ZG_OFFS_USRH     0x17 //[15:0] ZG_OFFS_USR
00048 #define MPU9150_RA_ZG_OFFS_USRL     0x18
00049 #define MPU9150_RA_SMPLRT_DIV       0x19
00050 #define MPU9150_RA_CONFIG           0x1A
00051 #define MPU9150_RA_GYRO_CONFIG      0x1B
00052 #define MPU9150_RA_ACCEL_CONFIG     0x1C
00053 #define MPU9150_RA_FF_THR           0x1D
00054 #define MPU9150_RA_FF_DUR           0x1E
00055 #define MPU9150_RA_MOT_THR          0x1F
00056 #define MPU9150_RA_MOT_DUR          0x20
00057 #define MPU9150_RA_ZRMOT_THR        0x21
00058 #define MPU9150_RA_ZRMOT_DUR        0x22
00059 #define MPU9150_RA_FIFO_EN          0x23
00060 #define MPU9150_RA_I2C_MST_CTRL     0x24
00061 #define MPU9150_RA_I2C_SLV0_ADDR    0x25
00062 #define MPU9150_RA_I2C_SLV0_REG     0x26
00063 #define MPU9150_RA_I2C_SLV0_CTRL    0x27
00064 #define MPU9150_RA_I2C_SLV1_ADDR    0x28
00065 #define MPU9150_RA_I2C_SLV1_REG     0x29
00066 #define MPU9150_RA_I2C_SLV1_CTRL    0x2A
00067 #define MPU9150_RA_I2C_SLV2_ADDR    0x2B
00068 #define MPU9150_RA_I2C_SLV2_REG     0x2C
00069 #define MPU9150_RA_I2C_SLV2_CTRL    0x2D
00070 #define MPU9150_RA_I2C_SLV3_ADDR    0x2E
00071 #define MPU9150_RA_I2C_SLV3_REG     0x2F
00072 #define MPU9150_RA_I2C_SLV3_CTRL    0x30
00073 #define MPU9150_RA_I2C_SLV4_ADDR    0x31
00074 #define MPU9150_RA_I2C_SLV4_REG     0x32
00075 #define MPU9150_RA_I2C_SLV4_DO      0x33
00076 #define MPU9150_RA_I2C_SLV4_CTRL    0x34
00077 #define MPU9150_RA_I2C_SLV4_DI      0x35
00078 #define MPU9150_RA_I2C_MST_STATUS   0x36
00079 #define MPU9150_RA_INT_PIN_CFG      0x37
00080 #define MPU9150_RA_INT_ENABLE       0x38
00081 #define MPU9150_RA_DMP_INT_STATUS   0x39
00082 #define MPU9150_RA_INT_STATUS       0x3A
00083 #define MPU9150_RA_ACCEL_XOUT_H     0x3B
00084 #define MPU9150_RA_ACCEL_XOUT_L     0x3C
00085 #define MPU9150_RA_ACCEL_YOUT_H     0x3D
00086 #define MPU9150_RA_ACCEL_YOUT_L     0x3E
00087 #define MPU9150_RA_ACCEL_ZOUT_H     0x3F
00088 #define MPU9150_RA_ACCEL_ZOUT_L     0x40
00089 #define MPU9150_RA_TEMP_OUT_H       0x41
00090 #define MPU9150_RA_TEMP_OUT_L       0x42
00091 #define MPU9150_RA_GYRO_XOUT_H      0x43
00092 #define MPU9150_RA_GYRO_XOUT_L      0x44
00093 #define MPU9150_RA_GYRO_YOUT_H      0x45
00094 #define MPU9150_RA_GYRO_YOUT_L      0x46
00095 #define MPU9150_RA_GYRO_ZOUT_H      0x47
00096 #define MPU9150_RA_GYRO_ZOUT_L      0x48
00097 #define MPU9150_RA_EXT_SENS_DATA_00 0x49
00098 #define MPU9150_RA_EXT_SENS_DATA_01 0x4A
00099 #define MPU9150_RA_EXT_SENS_DATA_02 0x4B
00100 #define MPU9150_RA_EXT_SENS_DATA_03 0x4C
00101 #define MPU9150_RA_EXT_SENS_DATA_04 0x4D
00102 #define MPU9150_RA_EXT_SENS_DATA_05 0x4E
00103 #define MPU9150_RA_EXT_SENS_DATA_06 0x4F
00104 #define MPU9150_RA_EXT_SENS_DATA_07 0x50
00105 #define MPU9150_RA_EXT_SENS_DATA_08 0x51
00106 #define MPU9150_RA_EXT_SENS_DATA_09 0x52
00107 #define MPU9150_RA_EXT_SENS_DATA_10 0x53
00108 #define MPU9150_RA_EXT_SENS_DATA_11 0x54
00109 #define MPU9150_RA_EXT_SENS_DATA_12 0x55
00110 #define MPU9150_RA_EXT_SENS_DATA_13 0x56
00111 #define MPU9150_RA_EXT_SENS_DATA_14 0x57
00112 #define MPU9150_RA_EXT_SENS_DATA_15 0x58
00113 #define MPU9150_RA_EXT_SENS_DATA_16 0x59
00114 #define MPU9150_RA_EXT_SENS_DATA_17 0x5A
00115 #define MPU9150_RA_EXT_SENS_DATA_18 0x5B
00116 #define MPU9150_RA_EXT_SENS_DATA_19 0x5C
00117 #define MPU9150_RA_EXT_SENS_DATA_20 0x5D
00118 #define MPU9150_RA_EXT_SENS_DATA_21 0x5E
00119 #define MPU9150_RA_EXT_SENS_DATA_22 0x5F
00120 #define MPU9150_RA_EXT_SENS_DATA_23 0x60
00121 #define MPU9150_RA_MOT_DETECT_STATUS    0x61
00122 #define MPU9150_RA_I2C_SLV0_DO      0x63
00123 #define MPU9150_RA_I2C_SLV1_DO      0x64
00124 #define MPU9150_RA_I2C_SLV2_DO      0x65
00125 #define MPU9150_RA_I2C_SLV3_DO      0x66
00126 #define MPU9150_RA_I2C_MST_DELAY_CTRL   0x67
00127 #define MPU9150_RA_SIGNAL_PATH_RESET    0x68
00128 #define MPU9150_RA_MOT_DETECT_CTRL      0x69
00129 #define MPU9150_RA_USER_CTRL        0x6A
00130 #define MPU9150_RA_PWR_MGMT_1       0x6B
00131 #define MPU9150_RA_PWR_MGMT_2       0x6C
00132 #define MPU9150_RA_BANK_SEL         0x6D
00133 #define MPU9150_RA_MEM_START_ADDR   0x6E
00134 #define MPU9150_RA_MEM_R_W          0x6F
00135 #define MPU9150_RA_DMP_CFG_1        0x70
00136 #define MPU9150_RA_DMP_CFG_2        0x71
00137 #define MPU9150_RA_FIFO_COUNTH      0x72
00138 #define MPU9150_RA_FIFO_COUNTL      0x73
00139 #define MPU9150_RA_FIFO_R_W         0x74
00140 #define MPU9150_RA_WHO_AM_I         0x75
00141 
00142 #define MPU9150_TC_PWR_MODE_BIT     7
00143 #define MPU9150_TC_OFFSET_BIT       6
00144 #define MPU9150_TC_OFFSET_LENGTH    6
00145 #define MPU9150_TC_OTP_BNK_VLD_BIT  0
00146 
00147 #define MPU9150_VDDIO_LEVEL_VLOGIC  0
00148 #define MPU9150_VDDIO_LEVEL_VDD     1
00149 
00150 #define MPU9150_CFG_EXT_SYNC_SET_BIT    5
00151 #define MPU9150_CFG_EXT_SYNC_SET_LENGTH 3
00152 #define MPU9150_CFG_DLPF_CFG_BIT    2
00153 #define MPU9150_CFG_DLPF_CFG_LENGTH 3
00154 
00155 #define MPU9150_EXT_SYNC_DISABLED       0x0
00156 #define MPU9150_EXT_SYNC_TEMP_OUT_L     0x1
00157 #define MPU9150_EXT_SYNC_GYRO_XOUT_L    0x2
00158 #define MPU9150_EXT_SYNC_GYRO_YOUT_L    0x3
00159 #define MPU9150_EXT_SYNC_GYRO_ZOUT_L    0x4
00160 #define MPU9150_EXT_SYNC_ACCEL_XOUT_L   0x5
00161 #define MPU9150_EXT_SYNC_ACCEL_YOUT_L   0x6
00162 #define MPU9150_EXT_SYNC_ACCEL_ZOUT_L   0x7
00163 
00164 #define MPU9150_DLPF_BW_256         0x00
00165 #define MPU9150_DLPF_BW_188         0x01
00166 #define MPU9150_DLPF_BW_98          0x02
00167 #define MPU9150_DLPF_BW_42          0x03
00168 #define MPU9150_DLPF_BW_20          0x04
00169 #define MPU9150_DLPF_BW_10          0x05
00170 #define MPU9150_DLPF_BW_5           0x06
00171 
00172 #define MPU9150_GCONFIG_FS_SEL_BIT      4
00173 #define MPU9150_GCONFIG_FS_SEL_LENGTH   2
00174 
00175 #define MPU9150_GYRO_FS_250         0x00
00176 #define MPU9150_GYRO_FS_500         0x01
00177 #define MPU9150_GYRO_FS_1000        0x02
00178 #define MPU9150_GYRO_FS_2000        0x03
00179 
00180 #define MPU9150_ACONFIG_XA_ST_BIT           7
00181 #define MPU9150_ACONFIG_YA_ST_BIT           6
00182 #define MPU9150_ACONFIG_ZA_ST_BIT           5
00183 #define MPU9150_ACONFIG_AFS_SEL_BIT         4
00184 #define MPU9150_ACONFIG_AFS_SEL_LENGTH      2
00185 #define MPU9150_ACONFIG_ACCEL_HPF_BIT       2
00186 #define MPU9150_ACONFIG_ACCEL_HPF_LENGTH    3
00187 
00188 #define MPU9150_ACCEL_FS_2          0x00
00189 #define MPU9150_ACCEL_FS_4          0x01
00190 #define MPU9150_ACCEL_FS_8          0x02
00191 #define MPU9150_ACCEL_FS_16         0x03
00192 
00193 #define MPU9150_DHPF_RESET          0x00
00194 #define MPU9150_DHPF_5              0x01
00195 #define MPU9150_DHPF_2P5            0x02
00196 #define MPU9150_DHPF_1P25           0x03
00197 #define MPU9150_DHPF_0P63           0x04
00198 #define MPU9150_DHPF_HOLD           0x07
00199 
00200 #define MPU9150_TEMP_FIFO_EN_BIT    7
00201 #define MPU9150_XG_FIFO_EN_BIT      6
00202 #define MPU9150_YG_FIFO_EN_BIT      5
00203 #define MPU9150_ZG_FIFO_EN_BIT      4
00204 #define MPU9150_ACCEL_FIFO_EN_BIT   3
00205 #define MPU9150_SLV2_FIFO_EN_BIT    2
00206 #define MPU9150_SLV1_FIFO_EN_BIT    1
00207 #define MPU9150_SLV0_FIFO_EN_BIT    0
00208 
00209 #define MPU9150_MULT_MST_EN_BIT     7
00210 #define MPU9150_WAIT_FOR_ES_BIT     6
00211 #define MPU9150_SLV_3_FIFO_EN_BIT   5
00212 #define MPU9150_I2C_MST_P_NSR_BIT   4
00213 #define MPU9150_I2C_MST_CLK_BIT     3
00214 #define MPU9150_I2C_MST_CLK_LENGTH  4
00215 
00216 #define MPU9150_CLOCK_DIV_348       0x0
00217 #define MPU9150_CLOCK_DIV_333       0x1
00218 #define MPU9150_CLOCK_DIV_320       0x2
00219 #define MPU9150_CLOCK_DIV_308       0x3
00220 #define MPU9150_CLOCK_DIV_296       0x4
00221 #define MPU9150_CLOCK_DIV_286       0x5
00222 #define MPU9150_CLOCK_DIV_276       0x6
00223 #define MPU9150_CLOCK_DIV_267       0x7
00224 #define MPU9150_CLOCK_DIV_258       0x8
00225 #define MPU9150_CLOCK_DIV_500       0x9
00226 #define MPU9150_CLOCK_DIV_471       0xA
00227 #define MPU9150_CLOCK_DIV_444       0xB
00228 #define MPU9150_CLOCK_DIV_421       0xC
00229 #define MPU9150_CLOCK_DIV_400       0xD
00230 #define MPU9150_CLOCK_DIV_381       0xE
00231 #define MPU9150_CLOCK_DIV_364       0xF
00232 
00233 #define MPU9150_I2C_SLV_RW_BIT      7
00234 #define MPU9150_I2C_SLV_ADDR_BIT    6
00235 #define MPU9150_I2C_SLV_ADDR_LENGTH 7
00236 #define MPU9150_I2C_SLV_EN_BIT      7
00237 #define MPU9150_I2C_SLV_BYTE_SW_BIT 6
00238 #define MPU9150_I2C_SLV_REG_DIS_BIT 5
00239 #define MPU9150_I2C_SLV_GRP_BIT     4
00240 #define MPU9150_I2C_SLV_LEN_BIT     3
00241 #define MPU9150_I2C_SLV_LEN_LENGTH  4
00242 
00243 #define MPU9150_I2C_SLV4_RW_BIT         7
00244 #define MPU9150_I2C_SLV4_ADDR_BIT       6
00245 #define MPU9150_I2C_SLV4_ADDR_LENGTH    7
00246 #define MPU9150_I2C_SLV4_EN_BIT         7
00247 #define MPU9150_I2C_SLV4_INT_EN_BIT     6
00248 #define MPU9150_I2C_SLV4_REG_DIS_BIT    5
00249 #define MPU9150_I2C_SLV4_MST_DLY_BIT    4
00250 #define MPU9150_I2C_SLV4_MST_DLY_LENGTH 5
00251 
00252 #define MPU9150_MST_PASS_THROUGH_BIT    7
00253 #define MPU9150_MST_I2C_SLV4_DONE_BIT   6
00254 #define MPU9150_MST_I2C_LOST_ARB_BIT    5
00255 #define MPU9150_MST_I2C_SLV4_NACK_BIT   4
00256 #define MPU9150_MST_I2C_SLV3_NACK_BIT   3
00257 #define MPU9150_MST_I2C_SLV2_NACK_BIT   2
00258 #define MPU9150_MST_I2C_SLV1_NACK_BIT   1
00259 #define MPU9150_MST_I2C_SLV0_NACK_BIT   0
00260 
00261 #define MPU9150_INTCFG_INT_LEVEL_BIT        7
00262 #define MPU9150_INTCFG_INT_OPEN_BIT         6
00263 #define MPU9150_INTCFG_LATCH_INT_EN_BIT     5
00264 #define MPU9150_INTCFG_INT_RD_CLEAR_BIT     4
00265 #define MPU9150_INTCFG_FSYNC_INT_LEVEL_BIT  3
00266 #define MPU9150_INTCFG_FSYNC_INT_EN_BIT     2
00267 #define MPU9150_INTCFG_I2C_BYPASS_EN_BIT    1
00268 #define MPU9150_INTCFG_CLKOUT_EN_BIT        0
00269 
00270 #define MPU9150_INTMODE_ACTIVEHIGH  0x00
00271 #define MPU9150_INTMODE_ACTIVELOW   0x01
00272 
00273 #define MPU9150_INTDRV_PUSHPULL     0x00
00274 #define MPU9150_INTDRV_OPENDRAIN    0x01
00275 
00276 #define MPU9150_INTLATCH_50USPULSE  0x00
00277 #define MPU9150_INTLATCH_WAITCLEAR  0x01
00278 
00279 #define MPU9150_INTCLEAR_STATUSREAD 0x00
00280 #define MPU9150_INTCLEAR_ANYREAD    0x01
00281 
00282 #define MPU9150_INTERRUPT_FF_BIT            7
00283 #define MPU9150_INTERRUPT_MOT_BIT           6
00284 #define MPU9150_INTERRUPT_ZMOT_BIT          5
00285 #define MPU9150_INTERRUPT_FIFO_OFLOW_BIT    4
00286 #define MPU9150_INTERRUPT_I2C_MST_INT_BIT   3
00287 #define MPU9150_INTERRUPT_PLL_RDY_INT_BIT   2
00288 #define MPU9150_INTERRUPT_DMP_INT_BIT       1
00289 #define MPU9150_INTERRUPT_DATA_RDY_BIT      0
00290 
00291 // TODO: figure out what these actually do
00292 // UMPL source code is not very obivous
00293 #define MPU9150_DMPINT_5_BIT            5
00294 #define MPU9150_DMPINT_4_BIT            4
00295 #define MPU9150_DMPINT_3_BIT            3
00296 #define MPU9150_DMPINT_2_BIT            2
00297 #define MPU9150_DMPINT_1_BIT            1
00298 #define MPU9150_DMPINT_0_BIT            0
00299 
00300 #define MPU9150_MOTION_MOT_XNEG_BIT     7
00301 #define MPU9150_MOTION_MOT_XPOS_BIT     6
00302 #define MPU9150_MOTION_MOT_YNEG_BIT     5
00303 #define MPU9150_MOTION_MOT_YPOS_BIT     4
00304 #define MPU9150_MOTION_MOT_ZNEG_BIT     3
00305 #define MPU9150_MOTION_MOT_ZPOS_BIT     2
00306 #define MPU9150_MOTION_MOT_ZRMOT_BIT    0
00307 
00308 #define MPU9150_DELAYCTRL_DELAY_ES_SHADOW_BIT   7
00309 #define MPU9150_DELAYCTRL_I2C_SLV4_DLY_EN_BIT   4
00310 #define MPU9150_DELAYCTRL_I2C_SLV3_DLY_EN_BIT   3
00311 #define MPU9150_DELAYCTRL_I2C_SLV2_DLY_EN_BIT   2
00312 #define MPU9150_DELAYCTRL_I2C_SLV1_DLY_EN_BIT   1
00313 #define MPU9150_DELAYCTRL_I2C_SLV0_DLY_EN_BIT   0
00314 
00315 #define MPU9150_PATHRESET_GYRO_RESET_BIT    2
00316 #define MPU9150_PATHRESET_ACCEL_RESET_BIT   1
00317 #define MPU9150_PATHRESET_TEMP_RESET_BIT    0
00318 
00319 #define MPU9150_DETECT_ACCEL_ON_DELAY_BIT       5
00320 #define MPU9150_DETECT_ACCEL_ON_DELAY_LENGTH    2
00321 #define MPU9150_DETECT_FF_COUNT_BIT             3
00322 #define MPU9150_DETECT_FF_COUNT_LENGTH          2
00323 #define MPU9150_DETECT_MOT_COUNT_BIT            1
00324 #define MPU9150_DETECT_MOT_COUNT_LENGTH         2
00325 
00326 #define MPU9150_DETECT_DECREMENT_RESET  0x0
00327 #define MPU9150_DETECT_DECREMENT_1      0x1
00328 #define MPU9150_DETECT_DECREMENT_2      0x2
00329 #define MPU9150_DETECT_DECREMENT_4      0x3
00330 
00331 #define MPU9150_USERCTRL_DMP_EN_BIT             7
00332 #define MPU9150_USERCTRL_FIFO_EN_BIT            6
00333 #define MPU9150_USERCTRL_I2C_MST_EN_BIT         5
00334 #define MPU9150_USERCTRL_I2C_IF_DIS_BIT         4
00335 #define MPU9150_USERCTRL_DMP_RESET_BIT          3
00336 #define MPU9150_USERCTRL_FIFO_RESET_BIT         2
00337 #define MPU9150_USERCTRL_I2C_MST_RESET_BIT      1
00338 #define MPU9150_USERCTRL_SIG_COND_RESET_BIT     0
00339 
00340 #define MPU9150_PWR1_DEVICE_RESET_BIT   7
00341 #define MPU9150_PWR1_SLEEP_BIT          6
00342 #define MPU9150_PWR1_CYCLE_BIT          5
00343 #define MPU9150_PWR1_TEMP_DIS_BIT       3
00344 #define MPU9150_PWR1_CLKSEL_BIT         2
00345 #define MPU9150_PWR1_CLKSEL_LENGTH      3
00346 
00347 #define MPU9150_CLOCK_INTERNAL          0x00
00348 #define MPU9150_CLOCK_PLL_XGYRO         0x01
00349 #define MPU9150_CLOCK_PLL_YGYRO         0x02
00350 #define MPU9150_CLOCK_PLL_ZGYRO         0x03
00351 #define MPU9150_CLOCK_PLL_EXT32K        0x04
00352 #define MPU9150_CLOCK_PLL_EXT19M        0x05
00353 #define MPU9150_CLOCK_KEEP_RESET        0x07
00354 
00355 #define MPU9150_PWR2_LP_WAKE_CTRL_BIT       7
00356 #define MPU9150_PWR2_LP_WAKE_CTRL_LENGTH    2
00357 #define MPU9150_PWR2_STBY_XA_BIT            5
00358 #define MPU9150_PWR2_STBY_YA_BIT            4
00359 #define MPU9150_PWR2_STBY_ZA_BIT            3
00360 #define MPU9150_PWR2_STBY_XG_BIT            2
00361 #define MPU9150_PWR2_STBY_YG_BIT            1
00362 #define MPU9150_PWR2_STBY_ZG_BIT            0
00363 
00364 #define MPU9150_WAKE_FREQ_1P25      0x0
00365 #define MPU9150_WAKE_FREQ_2P5       0x1
00366 #define MPU9150_WAKE_FREQ_5         0x2
00367 #define MPU9150_WAKE_FREQ_10        0x3
00368 
00369 #define MPU9150_BANKSEL_PRFTCH_EN_BIT       6
00370 #define MPU9150_BANKSEL_CFG_USER_BANK_BIT   5
00371 #define MPU9150_BANKSEL_MEM_SEL_BIT         4
00372 #define MPU9150_BANKSEL_MEM_SEL_LENGTH      5
00373 
00374 #define MPU9150_WHO_AM_I_BIT        6
00375 #define MPU9150_WHO_AM_I_LENGTH     6
00376 
00377 #define MPU9150_DMP_MEMORY_BANKS        8
00378 #define MPU9150_DMP_MEMORY_BANK_SIZE    256
00379 #define MPU9150_DMP_MEMORY_CHUNK_SIZE   16
00380 
00381 // note: DMP code memory blocks defined at end of header file
00382 
00383 class MPU9150 {
00384     public:
00385         MPU9150();
00386         MPU9150(uint8_t address);
00387 
00388         void initialize();
00389         bool testConnection();
00390 
00391         // AUX_VDDIO register
00392         uint8_t getAuxVDDIOLevel();
00393         void setAuxVDDIOLevel(uint8_t level);
00394 
00395         // SMPLRT_DIV register
00396         uint8_t getRate();
00397         void setRate(uint8_t rate);
00398 
00399         // CONFIG register
00400         uint8_t getExternalFrameSync();
00401         void setExternalFrameSync(uint8_t sync);
00402         uint8_t getDLPFMode();
00403         void setDLPFMode(uint8_t bandwidth);
00404 
00405         // GYRO_CONFIG register
00406         uint8_t getFullScaleGyroRange();
00407         void setFullScaleGyroRange(uint8_t range);
00408 
00409         // ACCEL_CONFIG register
00410         bool getAccelXSelfTest();
00411         void setAccelXSelfTest(bool enabled);
00412         bool getAccelYSelfTest();
00413         void setAccelYSelfTest(bool enabled);
00414         bool getAccelZSelfTest();
00415         void setAccelZSelfTest(bool enabled);
00416         uint8_t getFullScaleAccelRange();
00417         void setFullScaleAccelRange(uint8_t range);
00418         uint8_t getDHPFMode();
00419         void setDHPFMode(uint8_t mode);
00420 
00421         // FF_THR register
00422         uint8_t getFreefallDetectionThreshold();
00423         void setFreefallDetectionThreshold(uint8_t threshold);
00424 
00425         // FF_DUR register
00426         uint8_t getFreefallDetectionDuration();
00427         void setFreefallDetectionDuration(uint8_t duration);
00428 
00429         // MOT_THR register
00430         uint8_t getMotionDetectionThreshold();
00431         void setMotionDetectionThreshold(uint8_t threshold);
00432 
00433         // MOT_DUR register
00434         uint8_t getMotionDetectionDuration();
00435         void setMotionDetectionDuration(uint8_t duration);
00436 
00437         // ZRMOT_THR register
00438         uint8_t getZeroMotionDetectionThreshold();
00439         void setZeroMotionDetectionThreshold(uint8_t threshold);
00440 
00441         // ZRMOT_DUR register
00442         uint8_t getZeroMotionDetectionDuration();
00443         void setZeroMotionDetectionDuration(uint8_t duration);
00444 
00445         // FIFO_EN register
00446         bool getTempFIFOEnabled();
00447         void setTempFIFOEnabled(bool enabled);
00448         bool getXGyroFIFOEnabled();
00449         void setXGyroFIFOEnabled(bool enabled);
00450         bool getYGyroFIFOEnabled();
00451         void setYGyroFIFOEnabled(bool enabled);
00452         bool getZGyroFIFOEnabled();
00453         void setZGyroFIFOEnabled(bool enabled);
00454         bool getAccelFIFOEnabled();
00455         void setAccelFIFOEnabled(bool enabled);
00456         bool getSlave2FIFOEnabled();
00457         void setSlave2FIFOEnabled(bool enabled);
00458         bool getSlave1FIFOEnabled();
00459         void setSlave1FIFOEnabled(bool enabled);
00460         bool getSlave0FIFOEnabled();
00461         void setSlave0FIFOEnabled(bool enabled);
00462 
00463         // I2C_MST_CTRL register
00464         bool getMultiMasterEnabled();
00465         void setMultiMasterEnabled(bool enabled);
00466         bool getWaitForExternalSensorEnabled();
00467         void setWaitForExternalSensorEnabled(bool enabled);
00468         bool getSlave3FIFOEnabled();
00469         void setSlave3FIFOEnabled(bool enabled);
00470         bool getSlaveReadWriteTransitionEnabled();
00471         void setSlaveReadWriteTransitionEnabled(bool enabled);
00472         uint8_t getMasterClockSpeed();
00473         void setMasterClockSpeed(uint8_t speed);
00474 
00475         // I2C_SLV* registers (Slave 0-3)
00476         uint8_t getSlaveAddress(uint8_t num);
00477         void setSlaveAddress(uint8_t num, uint8_t address);
00478         uint8_t getSlaveRegister(uint8_t num);
00479         void setSlaveRegister(uint8_t num, uint8_t reg);
00480         bool getSlaveEnabled(uint8_t num);
00481         void setSlaveEnabled(uint8_t num, bool enabled);
00482         bool getSlaveWordByteSwap(uint8_t num);
00483         void setSlaveWordByteSwap(uint8_t num, bool enabled);
00484         bool getSlaveWriteMode(uint8_t num);
00485         void setSlaveWriteMode(uint8_t num, bool mode);
00486         bool getSlaveWordGroupOffset(uint8_t num);
00487         void setSlaveWordGroupOffset(uint8_t num, bool enabled);
00488         uint8_t getSlaveDataLength(uint8_t num);
00489         void setSlaveDataLength(uint8_t num, uint8_t length);
00490 
00491         // I2C_SLV* registers (Slave 4)
00492         uint8_t getSlave4Address();
00493         void setSlave4Address(uint8_t address);
00494         uint8_t getSlave4Register();
00495         void setSlave4Register(uint8_t reg);
00496         void setSlave4OutputByte(uint8_t data);
00497         bool getSlave4Enabled();
00498         void setSlave4Enabled(bool enabled);
00499         bool getSlave4InterruptEnabled();
00500         void setSlave4InterruptEnabled(bool enabled);
00501         bool getSlave4WriteMode();
00502         void setSlave4WriteMode(bool mode);
00503         uint8_t getSlave4MasterDelay();
00504         void setSlave4MasterDelay(uint8_t delay);
00505         uint8_t getSlate4InputByte();
00506 
00507         // I2C_MST_STATUS register
00508         bool getPassthroughStatus();
00509         bool getSlave4IsDone();
00510         bool getLostArbitration();
00511         bool getSlave4Nack();
00512         bool getSlave3Nack();
00513         bool getSlave2Nack();
00514         bool getSlave1Nack();
00515         bool getSlave0Nack();
00516 
00517         // INT_PIN_CFG register
00518         bool getInterruptMode();
00519         void setInterruptMode(bool mode);
00520         bool getInterruptDrive();
00521         void setInterruptDrive(bool drive);
00522         bool getInterruptLatch();
00523         void setInterruptLatch(bool latch);
00524         bool getInterruptLatchClear();
00525         void setInterruptLatchClear(bool clear);
00526         bool getFSyncInterruptLevel();
00527         void setFSyncInterruptLevel(bool level);
00528         bool getFSyncInterruptEnabled();
00529         void setFSyncInterruptEnabled(bool enabled);
00530         bool getI2CBypassEnabled();
00531         void setI2CBypassEnabled(bool enabled);
00532         bool getClockOutputEnabled();
00533         void setClockOutputEnabled(bool enabled);
00534 
00535         // INT_ENABLE register
00536         uint8_t getIntEnabled();
00537         void setIntEnabled(uint8_t enabled);
00538         bool getIntFreefallEnabled();
00539         void setIntFreefallEnabled(bool enabled);
00540         bool getIntMotionEnabled();
00541         void setIntMotionEnabled(bool enabled);
00542         bool getIntZeroMotionEnabled();
00543         void setIntZeroMotionEnabled(bool enabled);
00544         bool getIntFIFOBufferOverflowEnabled();
00545         void setIntFIFOBufferOverflowEnabled(bool enabled);
00546         bool getIntI2CMasterEnabled();
00547         void setIntI2CMasterEnabled(bool enabled);
00548         bool getIntDataReadyEnabled();
00549         void setIntDataReadyEnabled(bool enabled);
00550 
00551         // INT_STATUS register
00552         uint8_t getIntStatus();
00553         bool getIntFreefallStatus();
00554         bool getIntMotionStatus();
00555         bool getIntZeroMotionStatus();
00556         bool getIntFIFOBufferOverflowStatus();
00557         bool getIntI2CMasterStatus();
00558         bool getIntDataReadyStatus();
00559 
00560         // ACCEL_*OUT_* registers
00561         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);
00562         void getMotion6(int16_t* ax, int16_t* ay, int16_t* az, int16_t* gx, int16_t* gy, int16_t* gz);
00563         void getAcceleration(int16_t* x, int16_t* y, int16_t* z);
00564         int16_t getAccelerationX();
00565         int16_t getAccelerationY();
00566         int16_t getAccelerationZ();
00567 
00568         // TEMP_OUT_* registers
00569         int16_t getTemperature();
00570 
00571         // GYRO_*OUT_* registers
00572         void getRotation(int16_t* x, int16_t* y, int16_t* z);
00573         int16_t getRotationX();
00574         int16_t getRotationY();
00575         int16_t getRotationZ();
00576 
00577         // EXT_SENS_DATA_* registers
00578         uint8_t getExternalSensorByte(int position);
00579         uint16_t getExternalSensorWord(int position);
00580         uint32_t getExternalSensorDWord(int position);
00581 
00582         // MOT_DETECT_STATUS register
00583         bool getXNegMotionDetected();
00584         bool getXPosMotionDetected();
00585         bool getYNegMotionDetected();
00586         bool getYPosMotionDetected();
00587         bool getZNegMotionDetected();
00588         bool getZPosMotionDetected();
00589         bool getZeroMotionDetected();
00590 
00591         // I2C_SLV*_DO register
00592         void setSlaveOutputByte(uint8_t num, uint8_t data);
00593 
00594         // I2C_MST_DELAY_CTRL register
00595         bool getExternalShadowDelayEnabled();
00596         void setExternalShadowDelayEnabled(bool enabled);
00597         bool getSlaveDelayEnabled(uint8_t num);
00598         void setSlaveDelayEnabled(uint8_t num, bool enabled);
00599 
00600         // SIGNAL_PATH_RESET register
00601         void resetGyroscopePath();
00602         void resetAccelerometerPath();
00603         void resetTemperaturePath();
00604 
00605         // MOT_DETECT_CTRL register
00606         uint8_t getAccelerometerPowerOnDelay();
00607         void setAccelerometerPowerOnDelay(uint8_t delay);
00608         uint8_t getFreefallDetectionCounterDecrement();
00609         void setFreefallDetectionCounterDecrement(uint8_t decrement);
00610         uint8_t getMotionDetectionCounterDecrement();
00611         void setMotionDetectionCounterDecrement(uint8_t decrement);
00612 
00613         // USER_CTRL register
00614         bool getFIFOEnabled();
00615         void setFIFOEnabled(bool enabled);
00616         bool getI2CMasterModeEnabled();
00617         void setI2CMasterModeEnabled(bool enabled);
00618         void switchSPIEnabled(bool enabled);
00619         void resetFIFO();
00620         void resetI2CMaster();
00621         void resetSensors();
00622 
00623         // PWR_MGMT_1 register
00624         void reset();
00625         bool getSleepEnabled();
00626         void setSleepEnabled(bool enabled);
00627         bool getWakeCycleEnabled();
00628         void setWakeCycleEnabled(bool enabled);
00629         bool getTempSensorEnabled();
00630         void setTempSensorEnabled(bool enabled);
00631         uint8_t getClockSource();
00632         void setClockSource(uint8_t source);
00633 
00634         // PWR_MGMT_2 register
00635         uint8_t getWakeFrequency();
00636         void setWakeFrequency(uint8_t frequency);
00637         bool getStandbyXAccelEnabled();
00638         void setStandbyXAccelEnabled(bool enabled);
00639         bool getStandbyYAccelEnabled();
00640         void setStandbyYAccelEnabled(bool enabled);
00641         bool getStandbyZAccelEnabled();
00642         void setStandbyZAccelEnabled(bool enabled);
00643         bool getStandbyXGyroEnabled();
00644         void setStandbyXGyroEnabled(bool enabled);
00645         bool getStandbyYGyroEnabled();
00646         void setStandbyYGyroEnabled(bool enabled);
00647         bool getStandbyZGyroEnabled();
00648         void setStandbyZGyroEnabled(bool enabled);
00649 
00650         // FIFO_COUNT_* registers
00651         uint16_t getFIFOCount();
00652 
00653         // FIFO_R_W register
00654         uint8_t getFIFOByte();
00655         void setFIFOByte(uint8_t data);
00656         void getFIFOBytes(uint8_t *data, uint8_t length);
00657 
00658         // WHO_AM_I register
00659         uint8_t getDeviceID();
00660         void setDeviceID(uint8_t id);
00661 
00662         // ======== UNDOCUMENTED/DMP REGISTERS/METHODS ========
00663 
00664         // XG_OFFS_TC register
00665         uint8_t getOTPBankValid();
00666         void setOTPBankValid(bool enabled);
00667         int8_t getXGyroOffsetTC();
00668         void setXGyroOffsetTC(int8_t offset);
00669 
00670         // YG_OFFS_TC register
00671         int8_t getYGyroOffsetTC();
00672         void setYGyroOffsetTC(int8_t offset);
00673 
00674         // ZG_OFFS_TC register
00675         int8_t getZGyroOffsetTC();
00676         void setZGyroOffsetTC(int8_t offset);
00677 
00678         // X_FINE_GAIN register
00679         int8_t getXFineGain();
00680         void setXFineGain(int8_t gain);
00681 
00682         // Y_FINE_GAIN register
00683         int8_t getYFineGain();
00684         void setYFineGain(int8_t gain);
00685 
00686         // Z_FINE_GAIN register
00687         int8_t getZFineGain();
00688         void setZFineGain(int8_t gain);
00689 
00690         // XA_OFFS_* registers
00691         int16_t getXAccelOffset();
00692         void setXAccelOffset(int16_t offset);
00693 
00694         // YA_OFFS_* register
00695         int16_t getYAccelOffset();
00696         void setYAccelOffset(int16_t offset);
00697 
00698         // ZA_OFFS_* register
00699         int16_t getZAccelOffset();
00700         void setZAccelOffset(int16_t offset);
00701 
00702         // XG_OFFS_USR* registers
00703         int16_t getXGyroOffset();
00704         void setXGyroOffset(int16_t offset);
00705 
00706         // YG_OFFS_USR* register
00707         int16_t getYGyroOffset();
00708         void setYGyroOffset(int16_t offset);
00709 
00710         // ZG_OFFS_USR* register
00711         int16_t getZGyroOffset();
00712         void setZGyroOffset(int16_t offset);
00713 
00714         // INT_ENABLE register (DMP functions)
00715         bool getIntPLLReadyEnabled();
00716         void setIntPLLReadyEnabled(bool enabled);
00717         bool getIntDMPEnabled();
00718         void setIntDMPEnabled(bool enabled);
00719 
00720         // DMP_INT_STATUS
00721         bool getDMPInt5Status();
00722         bool getDMPInt4Status();
00723         bool getDMPInt3Status();
00724         bool getDMPInt2Status();
00725         bool getDMPInt1Status();
00726         bool getDMPInt0Status();
00727 
00728         // INT_STATUS register (DMP functions)
00729         bool getIntPLLReadyStatus();
00730         bool getIntDMPStatus();
00731 
00732         // USER_CTRL register (DMP functions)
00733         bool getDMPEnabled();
00734         void setDMPEnabled(bool enabled);
00735         void resetDMP();
00736 
00737         // BANK_SEL register
00738         void setMemoryBank(uint8_t bank, bool prefetchEnabled=false, bool userBank=false);
00739 
00740         // MEM_START_ADDR register
00741         void setMemoryStartAddress(uint8_t address);
00742 
00743         // MEM_R_W register
00744         uint8_t readMemoryByte();
00745         void writeMemoryByte(uint8_t data);
00746         void readMemoryBlock(uint8_t *data, uint16_t dataSize, uint8_t bank=0, uint8_t address=0);
00747         bool writeMemoryBlock(const uint8_t *data, uint16_t dataSize, uint8_t bank=0, uint8_t address=0, bool verify=true, bool useProgMem=false);
00748         bool writeProgMemoryBlock(const uint8_t *data, uint16_t dataSize, uint8_t bank=0, uint8_t address=0, bool verify=true);
00749 
00750         bool writeDMPConfigurationSet(const uint8_t *data, uint16_t dataSize, bool useProgMem=false);
00751         bool writeProgDMPConfigurationSet(const uint8_t *data, uint16_t dataSize);
00752 
00753         // DMP_CFG_1 register
00754         uint8_t getDMPConfig1();
00755         void setDMPConfig1(uint8_t config);
00756 
00757         // DMP_CFG_2 register
00758         uint8_t getDMPConfig2();
00759         void setDMPConfig2(uint8_t config);
00760 
00761         // special methods for MotionApps 2.0 implementation
00762         #ifdef MPU9150_INCLUDE_DMP_MOTIONAPPS20
00763             uint8_t *dmpPacketBuffer;
00764             uint16_t dmpPacketSize;
00765 
00766             uint8_t dmpInitialize();
00767             bool dmpPacketAvailable();
00768 
00769             uint8_t dmpSetFIFORate(uint8_t fifoRate);
00770             uint8_t dmpGetFIFORate();
00771             uint8_t dmpGetSampleStepSizeMS();
00772             uint8_t dmpGetSampleFrequency();
00773             int32_t dmpDecodeTemperature(int8_t tempReg);
00774 
00775             // Register callbacks after a packet of FIFO data is processed
00776             //uint8_t dmpRegisterFIFORateProcess(inv_obj_func func, int16_t priority);
00777             //uint8_t dmpUnregisterFIFORateProcess(inv_obj_func func);
00778             uint8_t dmpRunFIFORateProcesses();
00779 
00780             // Setup FIFO for various output
00781             uint8_t dmpSendQuaternion(uint_fast16_t accuracy);
00782             uint8_t dmpSendGyro(uint_fast16_t elements, uint_fast16_t accuracy);
00783             uint8_t dmpSendAccel(uint_fast16_t elements, uint_fast16_t accuracy);
00784             uint8_t dmpSendLinearAccel(uint_fast16_t elements, uint_fast16_t accuracy);
00785             uint8_t dmpSendLinearAccelInWorld(uint_fast16_t elements, uint_fast16_t accuracy);
00786             uint8_t dmpSendControlData(uint_fast16_t elements, uint_fast16_t accuracy);
00787             uint8_t dmpSendSensorData(uint_fast16_t elements, uint_fast16_t accuracy);
00788             uint8_t dmpSendExternalSensorData(uint_fast16_t elements, uint_fast16_t accuracy);
00789             uint8_t dmpSendGravity(uint_fast16_t elements, uint_fast16_t accuracy);
00790             uint8_t dmpSendPacketNumber(uint_fast16_t accuracy);
00791             uint8_t dmpSendQuantizedAccel(uint_fast16_t elements, uint_fast16_t accuracy);
00792             uint8_t dmpSendEIS(uint_fast16_t elements, uint_fast16_t accuracy);
00793 
00794             // Get Fixed Point data from FIFO
00795             uint8_t dmpGetAccel(int32_t *data, const uint8_t* packet=0);
00796             uint8_t dmpGetAccel(int16_t *data, const uint8_t* packet=0);
00797             uint8_t dmpGetAccel(VectorInt16 *v, const uint8_t* packet=0);
00798             uint8_t dmpGetQuaternion(int32_t *data, const uint8_t* packet=0);
00799             uint8_t dmpGetQuaternion(int16_t *data, const uint8_t* packet=0);
00800             uint8_t dmpGetQuaternion(Quaternion *q, const uint8_t* packet=0);
00801             uint8_t dmpGet6AxisQuaternion(int32_t *data, const uint8_t* packet=0);
00802             uint8_t dmpGet6AxisQuaternion(int16_t *data, const uint8_t* packet=0);
00803             uint8_t dmpGet6AxisQuaternion(Quaternion *q, const uint8_t* packet=0);
00804             uint8_t dmpGetRelativeQuaternion(int32_t *data, const uint8_t* packet=0);
00805             uint8_t dmpGetRelativeQuaternion(int16_t *data, const uint8_t* packet=0);
00806             uint8_t dmpGetRelativeQuaternion(Quaternion *data, const uint8_t* packet=0);
00807             uint8_t dmpGetGyro(int32_t *data, const uint8_t* packet=0);
00808             uint8_t dmpGetGyro(int16_t *data, const uint8_t* packet=0);
00809             uint8_t dmpGetGyro(VectorInt16 *v, const uint8_t* packet=0);
00810             uint8_t dmpSetLinearAccelFilterCoefficient(float coef);
00811             uint8_t dmpGetLinearAccel(int32_t *data, const uint8_t* packet=0);
00812             uint8_t dmpGetLinearAccel(int16_t *data, const uint8_t* packet=0);
00813             uint8_t dmpGetLinearAccel(VectorInt16 *v, const uint8_t* packet=0);
00814             uint8_t dmpGetLinearAccel(VectorInt16 *v, VectorInt16 *vRaw, VectorFloat *gravity);
00815             uint8_t dmpGetLinearAccelInWorld(int32_t *data, const uint8_t* packet=0);
00816             uint8_t dmpGetLinearAccelInWorld(int16_t *data, const uint8_t* packet=0);
00817             uint8_t dmpGetLinearAccelInWorld(VectorInt16 *v, const uint8_t* packet=0);
00818             uint8_t dmpGetLinearAccelInWorld(VectorInt16 *v, VectorInt16 *vReal, Quaternion *q);
00819             uint8_t dmpGetGyroAndAccelSensor(int32_t *data, const uint8_t* packet=0);
00820             uint8_t dmpGetGyroAndAccelSensor(int16_t *data, const uint8_t* packet=0);
00821             uint8_t dmpGetGyroAndAccelSensor(VectorInt16 *g, VectorInt16 *a, const uint8_t* packet=0);
00822             uint8_t dmpGetGyroSensor(int32_t *data, const uint8_t* packet=0);
00823             uint8_t dmpGetGyroSensor(int16_t *data, const uint8_t* packet=0);
00824             uint8_t dmpGetGyroSensor(VectorInt16 *v, const uint8_t* packet=0);
00825             uint8_t dmpGetControlData(int32_t *data, const uint8_t* packet=0);
00826             uint8_t dmpGetTemperature(int32_t *data, const uint8_t* packet=0);
00827             uint8_t dmpGetGravity(int32_t *data, const uint8_t* packet=0);
00828             uint8_t dmpGetGravity(int16_t *data, const uint8_t* packet=0);
00829             uint8_t dmpGetGravity(VectorInt16 *v, const uint8_t* packet=0);
00830             uint8_t dmpGetGravity(VectorFloat *v, Quaternion *q);
00831             uint8_t dmpGetUnquantizedAccel(int32_t *data, const uint8_t* packet=0);
00832             uint8_t dmpGetUnquantizedAccel(int16_t *data, const uint8_t* packet=0);
00833             uint8_t dmpGetUnquantizedAccel(VectorInt16 *v, const uint8_t* packet=0);
00834             uint8_t dmpGetQuantizedAccel(int32_t *data, const uint8_t* packet=0);
00835             uint8_t dmpGetQuantizedAccel(int16_t *data, const uint8_t* packet=0);
00836             uint8_t dmpGetQuantizedAccel(VectorInt16 *v, const uint8_t* packet=0);
00837             uint8_t dmpGetExternalSensorData(int32_t *data, uint16_t size, const uint8_t* packet=0);
00838             uint8_t dmpGetEIS(int32_t *data, const uint8_t* packet=0);
00839 
00840             uint8_t dmpGetEuler(float *data, Quaternion *q);
00841             uint8_t dmpGetYawPitchRoll(float *data, Quaternion *q, VectorFloat *gravity);
00842 
00843             // Get Floating Point data from FIFO
00844             uint8_t dmpGetAccelFloat(float *data, const uint8_t* packet=0);
00845             uint8_t dmpGetQuaternionFloat(float *data, const uint8_t* packet=0);
00846 
00847             uint8_t dmpProcessFIFOPacket(const unsigned char *dmpData);
00848             uint8_t dmpReadAndProcessFIFOPacket(uint8_t numPackets, uint8_t *processed=NULL);
00849 
00850             uint8_t dmpSetFIFOProcessedCallback(void (*func) (void));
00851 
00852             uint8_t dmpInitFIFOParam();
00853             uint8_t dmpCloseFIFO();
00854             uint8_t dmpSetGyroDataSource(uint8_t source);
00855             uint8_t dmpDecodeQuantizedAccel();
00856             uint32_t dmpGetGyroSumOfSquare();
00857             uint32_t dmpGetAccelSumOfSquare();
00858             void dmpOverrideQuaternion(long *q);
00859             uint16_t dmpGetFIFOPacketSize();
00860         #endif
00861 
00862         // special methods for MotionApps 4.1 implementation
00863         #ifdef MPU9150_INCLUDE_DMP_MOTIONAPPS41
00864             uint8_t *dmpPacketBuffer;
00865             uint16_t dmpPacketSize;
00866 
00867             uint8_t dmpInitialize();
00868             bool dmpPacketAvailable();
00869 
00870             uint8_t dmpSetFIFORate(uint8_t fifoRate);
00871             uint8_t dmpGetFIFORate();
00872             uint8_t dmpGetSampleStepSizeMS();
00873             uint8_t dmpGetSampleFrequency();
00874             int32_t dmpDecodeTemperature(int8_t tempReg);
00875 
00876             // Register callbacks after a packet of FIFO data is processed
00877             //uint8_t dmpRegisterFIFORateProcess(inv_obj_func func, int16_t priority);
00878             //uint8_t dmpUnregisterFIFORateProcess(inv_obj_func func);
00879             uint8_t dmpRunFIFORateProcesses();
00880 
00881             // Setup FIFO for various output
00882             uint8_t dmpSendQuaternion(uint_fast16_t accuracy);
00883             uint8_t dmpSendGyro(uint_fast16_t elements, uint_fast16_t accuracy);
00884             uint8_t dmpSendAccel(uint_fast16_t elements, uint_fast16_t accuracy);
00885             uint8_t dmpSendLinearAccel(uint_fast16_t elements, uint_fast16_t accuracy);
00886             uint8_t dmpSendLinearAccelInWorld(uint_fast16_t elements, uint_fast16_t accuracy);
00887             uint8_t dmpSendControlData(uint_fast16_t elements, uint_fast16_t accuracy);
00888             uint8_t dmpSendSensorData(uint_fast16_t elements, uint_fast16_t accuracy);
00889             uint8_t dmpSendExternalSensorData(uint_fast16_t elements, uint_fast16_t accuracy);
00890             uint8_t dmpSendGravity(uint_fast16_t elements, uint_fast16_t accuracy);
00891             uint8_t dmpSendPacketNumber(uint_fast16_t accuracy);
00892             uint8_t dmpSendQuantizedAccel(uint_fast16_t elements, uint_fast16_t accuracy);
00893             uint8_t dmpSendEIS(uint_fast16_t elements, uint_fast16_t accuracy);
00894 
00895             // Get Fixed Point data from FIFO
00896             uint8_t dmpGetAccel(int32_t *data, const uint8_t* packet=0);
00897             uint8_t dmpGetAccel(int16_t *data, const uint8_t* packet=0);
00898             uint8_t dmpGetAccel(VectorInt16 *v, const uint8_t* packet=0);
00899             uint8_t dmpGetQuaternion(int32_t *data, const uint8_t* packet=0);
00900             uint8_t dmpGetQuaternion(int16_t *data, const uint8_t* packet=0);
00901             uint8_t dmpGetQuaternion(Quaternion *q, const uint8_t* packet=0);
00902             uint8_t dmpGet6AxisQuaternion(int32_t *data, const uint8_t* packet=0);
00903             uint8_t dmpGet6AxisQuaternion(int16_t *data, const uint8_t* packet=0);
00904             uint8_t dmpGet6AxisQuaternion(Quaternion *q, const uint8_t* packet=0);
00905             uint8_t dmpGetRelativeQuaternion(int32_t *data, const uint8_t* packet=0);
00906             uint8_t dmpGetRelativeQuaternion(int16_t *data, const uint8_t* packet=0);
00907             uint8_t dmpGetRelativeQuaternion(Quaternion *data, const uint8_t* packet=0);
00908             uint8_t dmpGetGyro(int32_t *data, const uint8_t* packet=0);
00909             uint8_t dmpGetGyro(int16_t *data, const uint8_t* packet=0);
00910             uint8_t dmpGetGyro(VectorInt16 *v, const uint8_t* packet=0);
00911             uint8_t dmpGetMag(int16_t *data, const uint8_t* packet=0);
00912             uint8_t dmpSetLinearAccelFilterCoefficient(float coef);
00913             uint8_t dmpGetLinearAccel(int32_t *data, const uint8_t* packet=0);
00914             uint8_t dmpGetLinearAccel(int16_t *data, const uint8_t* packet=0);
00915             uint8_t dmpGetLinearAccel(VectorInt16 *v, const uint8_t* packet=0);
00916             uint8_t dmpGetLinearAccel(VectorInt16 *v, VectorInt16 *vRaw, VectorFloat *gravity);
00917             uint8_t dmpGetLinearAccelInWorld(int32_t *data, const uint8_t* packet=0);
00918             uint8_t dmpGetLinearAccelInWorld(int16_t *data, const uint8_t* packet=0);
00919             uint8_t dmpGetLinearAccelInWorld(VectorInt16 *v, const uint8_t* packet=0);
00920             uint8_t dmpGetLinearAccelInWorld(VectorInt16 *v, VectorInt16 *vReal, Quaternion *q);
00921             uint8_t dmpGetGyroAndAccelSensor(int32_t *data, const uint8_t* packet=0);
00922             uint8_t dmpGetGyroAndAccelSensor(int16_t *data, const uint8_t* packet=0);
00923             uint8_t dmpGetGyroAndAccelSensor(VectorInt16 *g, VectorInt16 *a, const uint8_t* packet=0);
00924             uint8_t dmpGetGyroSensor(int32_t *data, const uint8_t* packet=0);
00925             uint8_t dmpGetGyroSensor(int16_t *data, const uint8_t* packet=0);
00926             uint8_t dmpGetGyroSensor(VectorInt16 *v, const uint8_t* packet=0);
00927             uint8_t dmpGetControlData(int32_t *data, const uint8_t* packet=0);
00928             uint8_t dmpGetTemperature(int32_t *data, const uint8_t* packet=0);
00929             uint8_t dmpGetGravity(int32_t *data, const uint8_t* packet=0);
00930             uint8_t dmpGetGravity(int16_t *data, const uint8_t* packet=0);
00931             uint8_t dmpGetGravity(VectorInt16 *v, const uint8_t* packet=0);
00932             uint8_t dmpGetGravity(VectorFloat *v, Quaternion *q);
00933             uint8_t dmpGetUnquantizedAccel(int32_t *data, const uint8_t* packet=0);
00934             uint8_t dmpGetUnquantizedAccel(int16_t *data, const uint8_t* packet=0);
00935             uint8_t dmpGetUnquantizedAccel(VectorInt16 *v, const uint8_t* packet=0);
00936             uint8_t dmpGetQuantizedAccel(int32_t *data, const uint8_t* packet=0);
00937             uint8_t dmpGetQuantizedAccel(int16_t *data, const uint8_t* packet=0);
00938             uint8_t dmpGetQuantizedAccel(VectorInt16 *v, const uint8_t* packet=0);
00939             uint8_t dmpGetExternalSensorData(int32_t *data, uint16_t size, const uint8_t* packet=0);
00940             uint8_t dmpGetEIS(int32_t *data, const uint8_t* packet=0);
00941 
00942             uint8_t dmpGetEuler(float *data, Quaternion *q);
00943             uint8_t dmpGetYawPitchRoll(float *data, Quaternion *q, VectorFloat *gravity);
00944 
00945             // Get Floating Point data from FIFO
00946             uint8_t dmpGetAccelFloat(float *data, const uint8_t* packet=0);
00947             uint8_t dmpGetQuaternionFloat(float *data, const uint8_t* packet=0);
00948 
00949             uint8_t dmpProcessFIFOPacket(const unsigned char *dmpData);
00950             uint8_t dmpReadAndProcessFIFOPacket(uint8_t numPackets, uint8_t *processed=NULL);
00951 
00952             uint8_t dmpSetFIFOProcessedCallback(void (*func) (void));
00953 
00954             uint8_t dmpInitFIFOParam();
00955             uint8_t dmpCloseFIFO();
00956             uint8_t dmpSetGyroDataSource(uint8_t source);
00957             uint8_t dmpDecodeQuantizedAccel();
00958             uint32_t dmpGetGyroSumOfSquare();
00959             uint32_t dmpGetAccelSumOfSquare();
00960             void dmpOverrideQuaternion(long *q);
00961             uint16_t dmpGetFIFOPacketSize();
00962         #endif
00963 
00964     private:
00965         uint8_t devAddr;
00966         uint8_t buffer[14];
00967 };
00968 
00969 #endif /* _MPU9150_H_ */