Felix Rüdiger / MPU6050_lib

Dependents:   BLE_Nano_MPU6050Service

Committer:
fruediger
Date:
Thu Jul 02 00:39:12 2015 +0000
Revision:
1:96a227d1ca7e
Parent:
0:95916b07e8be
Child:
2:32b13cc64cb0
more complete port

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fruediger 0:95916b07e8be 1 #pragma once
fruediger 0:95916b07e8be 2 #ifndef __MPU6050_H__
fruediger 0:95916b07e8be 3 #define __MPU6050_H__
fruediger 0:95916b07e8be 4
fruediger 0:95916b07e8be 5 /**
fruediger 0:95916b07e8be 6 * Based on the work of authors of
fruediger 0:95916b07e8be 7 * https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050
fruediger 0:95916b07e8be 8 *
fruediger 0:95916b07e8be 9 * Ported by Felix Rüdiger, 2015
fruediger 0:95916b07e8be 10 * (scrapping all the I2C-slave-bus stuff)
fruediger 0:95916b07e8be 11 *
fruediger 0:95916b07e8be 12 */
fruediger 0:95916b07e8be 13
fruediger 0:95916b07e8be 14 #include "mbed.h"
fruediger 0:95916b07e8be 15 #include "helpers.h"
fruediger 0:95916b07e8be 16
fruediger 0:95916b07e8be 17 class MPU6050
fruediger 0:95916b07e8be 18 {
fruediger 0:95916b07e8be 19 public:
fruediger 1:96a227d1ca7e 20 /**
fruediger 1:96a227d1ca7e 21 * Constants
fruediger 1:96a227d1ca7e 22 */
fruediger 1:96a227d1ca7e 23
fruediger 0:95916b07e8be 24 enum BaseAddress
fruediger 0:95916b07e8be 25 {
fruediger 0:95916b07e8be 26 // left shift by 1 bit is neccessary for mbed's I2C abstraction class
fruediger 0:95916b07e8be 27 // look at https://developer.mbed.org/users/okano/notebook/i2c-access-examples/
fruediger 0:95916b07e8be 28 ADDRESS_0 = BYTE(01101000) << 1,
fruediger 0:95916b07e8be 29 ADRESSS_1 = BYTE(01101001) << 1
fruediger 0:95916b07e8be 30 };
fruediger 0:95916b07e8be 31
fruediger 0:95916b07e8be 32 enum Register
fruediger 0:95916b07e8be 33 {
fruediger 0:95916b07e8be 34 REG_AUX_VDDIO = 0x01, // R/W
fruediger 0:95916b07e8be 35 REG_SMPLRT_DIV = 0x19, // R/W
fruediger 0:95916b07e8be 36 REG_CONFIG = 0x1A, // R/W
fruediger 0:95916b07e8be 37 REG_GYRO_CONFIG = 0x1B, // R/W
fruediger 0:95916b07e8be 38 REG_ACCEL_CONFIG = 0x1C, // R/W
fruediger 0:95916b07e8be 39 REG_FF_THR = 0x1D, // R/W
fruediger 0:95916b07e8be 40 REG_FF_DUR = 0x1E, // R/W
fruediger 0:95916b07e8be 41 REG_MOT_THR = 0x1F, // R/W
fruediger 0:95916b07e8be 42 REG_MOT_DUR = 0x20, // R/W
fruediger 0:95916b07e8be 43 REG_ZRMOT_THR = 0x21, // R/W
fruediger 0:95916b07e8be 44 REG_ZRMOT_DUR = 0x22, // R/W
fruediger 0:95916b07e8be 45 REG_FIFO_EN = 0x23, // R/W
fruediger 0:95916b07e8be 46 /* REG_I2C_MST_CTRL = 0x24, // R/W
fruediger 0:95916b07e8be 47 REG_I2C_SLV0_ADDR = 0x25, // R/W
fruediger 0:95916b07e8be 48 REG_I2C_SLV0_REG = 0x26, // R/W
fruediger 0:95916b07e8be 49 REG_I2C_SLV0_CTRL = 0x27, // R/W
fruediger 0:95916b07e8be 50 REG_I2C_SLV1_ADDR = 0x28, // R/W
fruediger 0:95916b07e8be 51 REG_I2C_SLV1_REG = 0x29, // R/W
fruediger 0:95916b07e8be 52 REG_I2C_SLV1_CTRL = 0x2A, // R/W
fruediger 0:95916b07e8be 53 REG_I2C_SLV2_ADDR = 0x2B, // R/W
fruediger 0:95916b07e8be 54 REG_I2C_SLV2_REG = 0x2C, // R/W
fruediger 0:95916b07e8be 55 REG_I2C_SLV2_CTRL = 0x2D, // R/W
fruediger 0:95916b07e8be 56 REG_I2C_SLV3_ADDR = 0x2E, // R/W
fruediger 0:95916b07e8be 57 REG_I2C_SLV3_REG = 0x2F, // R/W
fruediger 0:95916b07e8be 58 REG_I2C_SLV3_CTRL = 0x30, // R/W
fruediger 0:95916b07e8be 59 REG_I2C_SLV4_ADDR = 0x31, // R/W
fruediger 0:95916b07e8be 60 REG_I2C_SLV4_REG = 0x32, // R/W
fruediger 0:95916b07e8be 61 REG_I2C_SLV4_DO = 0x33, // R/W
fruediger 0:95916b07e8be 62 REG_I2C_SLV4_CTRL = 0x34, // R/W
fruediger 0:95916b07e8be 63 REG_I2C_SLV4_DI = 0x35, // R
fruediger 1:96a227d1ca7e 64 REG_I2C_MST_STATUS = 0x36, // R */
fruediger 0:95916b07e8be 65 REG_INT_PIN_CFG = 0x37, // R/W
fruediger 0:95916b07e8be 66 REG_INT_ENABLE = 0x38, // R/W
fruediger 0:95916b07e8be 67 REG_INT_STATUS = 0x3A, // R
fruediger 0:95916b07e8be 68 REG_ACCEL_XOUT_H = 0x3B, // R
fruediger 0:95916b07e8be 69 REG_ACCEL_XOUT_L = 0x3C, // R
fruediger 0:95916b07e8be 70 REG_ACCEL_YOUT_H = 0x3D, // R
fruediger 0:95916b07e8be 71 REG_ACCEL_YOUT_L = 0x3E, // R
fruediger 0:95916b07e8be 72 REG_ACCEL_ZOUT_H = 0x3F, // R
fruediger 0:95916b07e8be 73 REG_ACCEL_ZOUT_L = 0x40, // R
fruediger 0:95916b07e8be 74 REG_TEMP_OUT_H = 0x41, // R
fruediger 0:95916b07e8be 75 REG_TEMP_OUT_L = 0x42, // R
fruediger 0:95916b07e8be 76 REG_GYRO_XOUT_H = 0x43, // R
fruediger 0:95916b07e8be 77 REG_GYRO_XOUT_L = 0x44, // R
fruediger 0:95916b07e8be 78 REG_GYRO_YOUT_H = 0x45, // R
fruediger 0:95916b07e8be 79 REG_GYRO_YOUT_L = 0x46, // R
fruediger 0:95916b07e8be 80 REG_GYRO_ZOUT_H = 0x47, // R
fruediger 0:95916b07e8be 81 REG_GYRO_ZOUT_L = 0x48, // R
fruediger 1:96a227d1ca7e 82 /* REG_EXT_SENS_DATA_00 = 0x49, // R
fruediger 0:95916b07e8be 83 REG_EXT_SENS_DATA_01 = 0x4A, // R
fruediger 0:95916b07e8be 84 REG_EXT_SENS_DATA_02 = 0x4B, // R
fruediger 0:95916b07e8be 85 REG_EXT_SENS_DATA_03 = 0x4C, // R
fruediger 0:95916b07e8be 86 REG_EXT_SENS_DATA_04 = 0x4D, // R
fruediger 0:95916b07e8be 87 REG_EXT_SENS_DATA_05 = 0x4E, // R
fruediger 0:95916b07e8be 88 REG_EXT_SENS_DATA_06 = 0x4F, // R
fruediger 0:95916b07e8be 89 REG_EXT_SENS_DATA_07 = 0x50, // R
fruediger 0:95916b07e8be 90 REG_EXT_SENS_DATA_08 = 0x51, // R
fruediger 0:95916b07e8be 91 REG_EXT_SENS_DATA_09 = 0x52, // R
fruediger 0:95916b07e8be 92 REG_EXT_SENS_DATA_10 = 0x53, // R
fruediger 0:95916b07e8be 93 REG_EXT_SENS_DATA_11 = 0x54, // R
fruediger 0:95916b07e8be 94 REG_EXT_SENS_DATA_12 = 0x55, // R
fruediger 0:95916b07e8be 95 REG_EXT_SENS_DATA_13 = 0x56, // R
fruediger 0:95916b07e8be 96 REG_EXT_SENS_DATA_14 = 0x57, // R
fruediger 0:95916b07e8be 97 REG_EXT_SENS_DATA_15 = 0x58, // R
fruediger 0:95916b07e8be 98 REG_EXT_SENS_DATA_16 = 0x59, // R
fruediger 0:95916b07e8be 99 REG_EXT_SENS_DATA_17 = 0x5A, // R
fruediger 0:95916b07e8be 100 REG_EXT_SENS_DATA_18 = 0x5B, // R
fruediger 0:95916b07e8be 101 REG_EXT_SENS_DATA_19 = 0x5C, // R
fruediger 0:95916b07e8be 102 REG_EXT_SENS_DATA_20 = 0x5D, // R
fruediger 0:95916b07e8be 103 REG_EXT_SENS_DATA_21 = 0x5E, // R
fruediger 0:95916b07e8be 104 REG_EXT_SENS_DATA_22 = 0x5F, // R
fruediger 1:96a227d1ca7e 105 REG_EXT_SENS_DATA_23 = 0x60, // R */
fruediger 0:95916b07e8be 106 REG_MOT_DETECT_STATUS = 0x61, // R
fruediger 0:95916b07e8be 107 REG_I2C_SLV0_DO = 0x63, // R/W
fruediger 0:95916b07e8be 108 REG_I2C_SLV1_DO = 0x64, // R/W
fruediger 0:95916b07e8be 109 REG_I2C_SLV2_DO = 0x65, // R/W
fruediger 0:95916b07e8be 110 REG_I2C_SLV3_DO = 0x66, // R/W
fruediger 0:95916b07e8be 111 REG_I2C_MST_DELAY_CTRL = 0x67, // R/W
fruediger 0:95916b07e8be 112 REG_SIGNAL_PATH_RESET = 0x68, // R/W
fruediger 0:95916b07e8be 113 REG_MOT_DETECT_CTRL = 0x69, // R/W
fruediger 0:95916b07e8be 114 REG_USER_CTRL = 0x6A, // R/W
fruediger 0:95916b07e8be 115 REG_PWR_MGMT_1 = 0x6B, // R/W
fruediger 0:95916b07e8be 116 REG_PWR_MGMT_2 = 0x6C, // R/W
fruediger 0:95916b07e8be 117 REG_FIFO_COUNTH = 0x72, // R/W
fruediger 0:95916b07e8be 118 REG_FIFO_COUNTL = 0x73, // R/W
fruediger 0:95916b07e8be 119 REG_FIFO_R_W = 0x74, // R/W
fruediger 0:95916b07e8be 120 REG_WHO_AM_I = 0x75 // R
fruediger 0:95916b07e8be 121 };
fruediger 0:95916b07e8be 122
fruediger 0:95916b07e8be 123 static const uint8_t AUX_VDDIO_MASK = BYTE(10000000);
fruediger 0:95916b07e8be 124 enum AuxVDDIOLevel
fruediger 0:95916b07e8be 125 {
fruediger 0:95916b07e8be 126 AUX_VDDIO_VLOGIC = BYTE(00000000),
fruediger 0:95916b07e8be 127 AUX_VDDIO_VDD = BYTE(10000000)
fruediger 0:95916b07e8be 128 };
fruediger 0:95916b07e8be 129
fruediger 0:95916b07e8be 130 static const uint8_t EXT_SYNC_MASK = BYTE(00111000);
fruediger 0:95916b07e8be 131 enum ExtFrameSync
fruediger 0:95916b07e8be 132 {
fruediger 0:95916b07e8be 133 EXT_SYNC_DISABLED = BYTE(00000000),
fruediger 0:95916b07e8be 134 EXT_SYNC_TEMP_OUT_L = BYTE(00001000),
fruediger 0:95916b07e8be 135 EXT_SYNC_GYRO_XOUT_L = BYTE(00010000),
fruediger 0:95916b07e8be 136 EXT_SYNC_GYRO_YOUT_L = BYTE(00011000),
fruediger 0:95916b07e8be 137 EXT_SYNC_GYRO_ZOUT_L = BYTE(00100000),
fruediger 0:95916b07e8be 138 EXT_SYNC_ACCEL_XOUT_L = BYTE(00101000),
fruediger 0:95916b07e8be 139 EXT_SYNC_ACCEL_YOUT_L = BYTE(00110000),
fruediger 0:95916b07e8be 140 EXT_SYNC_ACCEL_ZOUT_L = BYTE(00111000)
fruediger 0:95916b07e8be 141 };
fruediger 0:95916b07e8be 142
fruediger 0:95916b07e8be 143 static const uint8_t DLPF_MASK = BYTE(00000111);
fruediger 0:95916b07e8be 144 enum DLPFBandwidth
fruediger 0:95916b07e8be 145 {
fruediger 0:95916b07e8be 146 DLPF_260HZ_256Hz = BYTE(00000000),
fruediger 0:95916b07e8be 147 DLPF_184HZ_188Hz = BYTE(00000001),
fruediger 0:95916b07e8be 148 DLPF_94HZ_98HZ = BYTE(00000010),
fruediger 0:95916b07e8be 149 DLPF_44HZ_42HZ = BYTE(00000011),
fruediger 0:95916b07e8be 150 DLPF_21HZ_20HZ = BYTE(00000100),
fruediger 0:95916b07e8be 151 DLPF_10HZ_10HZ = BYTE(00000101),
fruediger 0:95916b07e8be 152 DLPF_5HZ_5HZ = BYTE(00000110),
fruediger 0:95916b07e8be 153 DLPF_RESERVED = BYTE(00000111)
fruediger 0:95916b07e8be 154 };
fruediger 0:95916b07e8be 155
fruediger 0:95916b07e8be 156 static const uint8_t GYRO_X_ST_MASK = BYTE(10000000);
fruediger 0:95916b07e8be 157 static const uint8_t GYRO_Y_ST_MASK = BYTE(01000000);
fruediger 0:95916b07e8be 158 static const uint8_t GYRO_Z_ST_MASK = BYTE(00100000);
fruediger 0:95916b07e8be 159
fruediger 0:95916b07e8be 160 static const uint8_t GYRO_RANGE_MASK = BYTE(00011000);
fruediger 0:95916b07e8be 161 enum GyroRange
fruediger 0:95916b07e8be 162 {
fruediger 0:95916b07e8be 163 GYRO_RANGE_250 = BYTE(00000000),
fruediger 0:95916b07e8be 164 GYRO_RANGE_500 = BYTE(00001000),
fruediger 0:95916b07e8be 165 GYRO_RANGE_1000 = BYTE(00010000),
fruediger 0:95916b07e8be 166 GYRO_RANGE_2000 = BYTE(00011000)
fruediger 0:95916b07e8be 167 };
fruediger 0:95916b07e8be 168
fruediger 0:95916b07e8be 169 static const uint8_t ACCEL_X_ST_MASK = BYTE(10000000);
fruediger 0:95916b07e8be 170 static const uint8_t ACCEL_Y_ST_MASK = BYTE(01000000);
fruediger 0:95916b07e8be 171 static const uint8_t ACCEL_Z_ST_MASK = BYTE(00100000);
fruediger 0:95916b07e8be 172
fruediger 0:95916b07e8be 173 static const uint8_t ACCEL_HPF_MASK = BYTE(00000111);
fruediger 0:95916b07e8be 174 enum AccelHPFCutOff
fruediger 0:95916b07e8be 175 {
fruediger 0:95916b07e8be 176 ACCEL_HPF_RESET = BYTE(00000000),
fruediger 0:95916b07e8be 177 ACCEL_HPF_5HZ = BYTE(00000001),
fruediger 0:95916b07e8be 178 ACCEL_HPF_2_5HZ = BYTE(00000010),
fruediger 0:95916b07e8be 179 ACCEL_HPF_1_25HZ = BYTE(00000011),
fruediger 0:95916b07e8be 180 ACCEL_HPF_0_63HZ = BYTE(00000100),
fruediger 0:95916b07e8be 181 ACCEL_HPF_HOLD = BYTE(00000111)
fruediger 0:95916b07e8be 182 };
fruediger 0:95916b07e8be 183
fruediger 0:95916b07e8be 184 static const uint8_t ACCEL_RANGE_MASK = BYTE(00011000);
fruediger 0:95916b07e8be 185 enum AccelRange
fruediger 0:95916b07e8be 186 {
fruediger 0:95916b07e8be 187 ACCEL_RANGE_2G = BYTE(00000000),
fruediger 0:95916b07e8be 188 ACCEL_RANGE_4G = BYTE(00001000),
fruediger 0:95916b07e8be 189 ACCEL_RANGE_8G = BYTE(00010000),
fruediger 0:95916b07e8be 190 ACCEL_RANGE_16G = BYTE(00011000)
fruediger 0:95916b07e8be 191 };
fruediger 0:95916b07e8be 192
fruediger 0:95916b07e8be 193 static const uint8_t TEMP_FIFO_EN_MASK = BYTE(10000000);
fruediger 0:95916b07e8be 194 static const uint8_t GYRO_X_FIFO_EN_MASK = BYTE(01000000);
fruediger 0:95916b07e8be 195 static const uint8_t GYRO_Y_FIFO_EN_MASK = BYTE(00100000);
fruediger 0:95916b07e8be 196 static const uint8_t GYRO_Z_FIFO_EN_MASK = BYTE(00010000);
fruediger 0:95916b07e8be 197 static const uint8_t ACCEL_FIFO_EN_MASK = BYTE(00001000);
fruediger 0:95916b07e8be 198
fruediger 1:96a227d1ca7e 199 static const uint8_t INT_LEVEL_MASK = BYTE(10000000);
fruediger 1:96a227d1ca7e 200 enum InterruptLevel
fruediger 1:96a227d1ca7e 201 {
fruediger 1:96a227d1ca7e 202 INT_LEVEL_ACTIVE_HIGH = BYTE(00000000),
fruediger 1:96a227d1ca7e 203 INT_LEVEL_ACTIVE_LOW = BYTE(10000000)
fruediger 1:96a227d1ca7e 204 };
fruediger 1:96a227d1ca7e 205
fruediger 1:96a227d1ca7e 206 static const uint8_t INT_DRIVE_MASK = BYTE(01000000);
fruediger 1:96a227d1ca7e 207 enum InterruptDrive
fruediger 1:96a227d1ca7e 208 {
fruediger 1:96a227d1ca7e 209 INT_DRIVE_PUSH_PULL = BYTE(00000000),
fruediger 1:96a227d1ca7e 210 INT_DRIVE_OPEN_DRAIN = BYTE(01000000)
fruediger 1:96a227d1ca7e 211 };
fruediger 1:96a227d1ca7e 212
fruediger 1:96a227d1ca7e 213 static const uint8_t INT_LATCH_MASK = BYTE(00100000);
fruediger 1:96a227d1ca7e 214 enum InterruptLatch
fruediger 1:96a227d1ca7e 215 {
fruediger 1:96a227d1ca7e 216 INT_LATCH_50US_PULSE = BYTE(00000000),
fruediger 1:96a227d1ca7e 217 INT_LATCH_WAIT_CLEARED = BYTE(00100000)
fruediger 1:96a227d1ca7e 218 };
fruediger 1:96a227d1ca7e 219
fruediger 1:96a227d1ca7e 220 static const uint8_t INT_CLEAR_MASK = BYTE(00010000);
fruediger 1:96a227d1ca7e 221 enum InterruptClear
fruediger 1:96a227d1ca7e 222 {
fruediger 1:96a227d1ca7e 223 INT_CLEAR_STATUS_ONLY_READ = BYTE(00000000),
fruediger 1:96a227d1ca7e 224 INT_CLEAR_ANY_READ = BYTE(00010000)
fruediger 1:96a227d1ca7e 225 };
fruediger 1:96a227d1ca7e 226
fruediger 1:96a227d1ca7e 227 static const uint8_t INT_FSYNC_LEVEL_MASK = BYTE(00001000);
fruediger 1:96a227d1ca7e 228 enum InterruptFSyncLevel
fruediger 1:96a227d1ca7e 229 {
fruediger 1:96a227d1ca7e 230 INT_FSYNC_LEVEL_ACTIVE_HIGH = BYTE(00000000),
fruediger 1:96a227d1ca7e 231 INT_FSYNC_LEVEL_ACTIVE_LOW = BYTE(00001000)
fruediger 1:96a227d1ca7e 232 };
fruediger 1:96a227d1ca7e 233
fruediger 1:96a227d1ca7e 234 static const uint8_t INT_FSYNC_EN_MASK = BYTE(00000100);
fruediger 1:96a227d1ca7e 235
fruediger 1:96a227d1ca7e 236 enum Interrupt
fruediger 1:96a227d1ca7e 237 {
fruediger 1:96a227d1ca7e 238 INT_FREEFALL = BYTE(10000000),
fruediger 1:96a227d1ca7e 239 INT_MOTION = BYTE(01000000),
fruediger 1:96a227d1ca7e 240 INT_ZERO_MOTION = BYTE(00100000),
fruediger 1:96a227d1ca7e 241 INT_FIFO_OVERFLOW = BYTE(00010000),
fruediger 1:96a227d1ca7e 242 /* INT_I2C_MASTER = BYTE(00001000),
fruediger 1:96a227d1ca7e 243 INT_PLL_READY = BYTE(00000100),
fruediger 1:96a227d1ca7e 244 INT_DMP_INIT = BYTE(00000010), */
fruediger 1:96a227d1ca7e 245 INT_DATA_READY = BYTE(00000001)
fruediger 1:96a227d1ca7e 246 };
fruediger 1:96a227d1ca7e 247 friend inline Interrupt operator|(Interrupt a, Interrupt b) { return static_cast<Interrupt>(static_cast<int>(a) | static_cast<int>(b)); }
fruediger 1:96a227d1ca7e 248 friend inline Interrupt operator&(Interrupt a, Interrupt b) { return static_cast<Interrupt>(static_cast<int>(a) & static_cast<int>(b)); }
fruediger 1:96a227d1ca7e 249
fruediger 1:96a227d1ca7e 250 /**
fruediger 1:96a227d1ca7e 251 * basic members
fruediger 1:96a227d1ca7e 252 */
fruediger 1:96a227d1ca7e 253
fruediger 0:95916b07e8be 254 MPU6050(PinName sda, PinName scl, BaseAddress address = ADDRESS_0) : i2c(sda, scl), baseAddress(address)
fruediger 0:95916b07e8be 255 { }
fruediger 0:95916b07e8be 256
fruediger 0:95916b07e8be 257 BaseAddress getAddress() { return baseAddress; }
fruediger 0:95916b07e8be 258
fruediger 0:95916b07e8be 259 /**
fruediger 0:95916b07e8be 260 * REG_AUX_VDDIO register
fruediger 0:95916b07e8be 261 */
fruediger 0:95916b07e8be 262
fruediger 0:95916b07e8be 263 bool getAuxVDDIOLevel(AuxVDDIOLevel *level, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 264 bool setAuxVDDIOLevel(AuxVDDIOLevel level, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 265
fruediger 0:95916b07e8be 266 /**
fruediger 0:95916b07e8be 267 * REG_SMPLRT_DIV register
fruediger 0:95916b07e8be 268 */
fruediger 0:95916b07e8be 269
fruediger 0:95916b07e8be 270 bool getGyroSampleRateDivider(uint8_t *rateDivider, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 271 bool setGyroSampleRateDivider(uint8_t rateDivider, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 272
fruediger 0:95916b07e8be 273 /**
fruediger 0:95916b07e8be 274 * REG_CONFIG register
fruediger 0:95916b07e8be 275 */
fruediger 0:95916b07e8be 276
fruediger 0:95916b07e8be 277 bool getExternalFrameSync(ExtFrameSync *frameSync, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 278 bool setExternalFrameSync(ExtFrameSync frameSync, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 279
fruediger 0:95916b07e8be 280 bool getDLPFBandwidth(DLPFBandwidth *bandwidth, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 281 bool setDLPFBandwidth(DLPFBandwidth bandwidth, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 282
fruediger 0:95916b07e8be 283 /**
fruediger 0:95916b07e8be 284 * REG_GYRO_CONFIG register
fruediger 0:95916b07e8be 285 */
fruediger 0:95916b07e8be 286
fruediger 0:95916b07e8be 287 bool getGyroXSelfTestEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 288 bool setGyroXSelfTestEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 289
fruediger 0:95916b07e8be 290 bool getGyroYSelfTestEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 291 bool setGyroYSelfTestEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 292
fruediger 0:95916b07e8be 293 bool getGyroZSelfTestEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 294 bool setGyroZSelfTestEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 295
fruediger 0:95916b07e8be 296 bool getGyroRange(GyroRange *gyroRange, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 297 bool setGyroRange(GyroRange gyroRange, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 298
fruediger 0:95916b07e8be 299 /**
fruediger 0:95916b07e8be 300 * REG_ACCEL_CONFIG register
fruediger 0:95916b07e8be 301 */
fruediger 0:95916b07e8be 302
fruediger 0:95916b07e8be 303 bool getAccelXSelfTestEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 304 bool setAccelXSelfTestEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 305
fruediger 0:95916b07e8be 306 bool getAccelYSelfTestEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 307 bool setAccelYSelfTestEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 308
fruediger 0:95916b07e8be 309 bool getAccelZSelfTestEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 310 bool setAccelZSelfTestEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 311
fruediger 0:95916b07e8be 312 bool getAccelHPFCutOff(AccelHPFCutOff *frequency, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 313 bool setAccelHPFCutOff(AccelHPFCutOff frequency, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 314
fruediger 0:95916b07e8be 315 bool getAccelRange(AccelRange *accelRange, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 316 bool setAccelRange(AccelRange accelRange, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 317
fruediger 0:95916b07e8be 318 /**
fruediger 0:95916b07e8be 319 * REG_FF_THR register
fruediger 0:95916b07e8be 320 */
fruediger 0:95916b07e8be 321
fruediger 0:95916b07e8be 322 bool getFreefallDetectionThreshold(uint8_t *threshold, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 323 bool setFreefallDetectionThreshold(uint8_t threshold, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 324
fruediger 0:95916b07e8be 325 /**
fruediger 0:95916b07e8be 326 * REG_FF_DUR register
fruediger 0:95916b07e8be 327 */
fruediger 0:95916b07e8be 328
fruediger 0:95916b07e8be 329 bool getFreefallDetectionDuration(uint8_t *duration, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 330 bool setFreefallDetectionDuration(uint8_t duration, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 331
fruediger 0:95916b07e8be 332 /**
fruediger 0:95916b07e8be 333 * REG_MOT_THR register
fruediger 0:95916b07e8be 334 */
fruediger 0:95916b07e8be 335
fruediger 0:95916b07e8be 336 bool getMotionDetectionThreshold(uint8_t *threshold, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 337 bool setMotionDetectionThreshold(uint8_t threshold, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 338
fruediger 0:95916b07e8be 339 /**
fruediger 0:95916b07e8be 340 * REG_MOT_DUR register
fruediger 0:95916b07e8be 341 */
fruediger 0:95916b07e8be 342
fruediger 0:95916b07e8be 343 bool getMotionDetectionDuration(uint8_t *duration, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 344 bool setMotionDetectionDuration(uint8_t duration, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 345
fruediger 0:95916b07e8be 346 /**
fruediger 0:95916b07e8be 347 * REG_ZRMOT_THR register
fruediger 0:95916b07e8be 348 */
fruediger 0:95916b07e8be 349
fruediger 0:95916b07e8be 350 bool getZeroMotionDetectionThreshold(uint8_t *threshold, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 351 bool setZeroMotionDetectionThreshold(uint8_t threshold, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 352
fruediger 0:95916b07e8be 353 /**
fruediger 0:95916b07e8be 354 * REG_ZRMOT_DUR register
fruediger 0:95916b07e8be 355 */
fruediger 0:95916b07e8be 356
fruediger 0:95916b07e8be 357 bool getZeroMotionDetectionDuration(uint8_t *duration, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 358 bool setZeroMotionDetectionDuration(uint8_t duration, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 359
fruediger 0:95916b07e8be 360 /**
fruediger 0:95916b07e8be 361 * REG_FIFO_EN register
fruediger 0:95916b07e8be 362 */
fruediger 0:95916b07e8be 363
fruediger 0:95916b07e8be 364 bool getTempFIFOEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 365 bool setTempFIFOEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 366
fruediger 0:95916b07e8be 367 bool getGyroXFIFOEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 368 bool setGyroXFIFOEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 369
fruediger 0:95916b07e8be 370 bool getGyroYFIFOEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 371 bool setGyroYFIFOEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 372
fruediger 0:95916b07e8be 373 bool getGyroZFIFOEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 374 bool setGyroZFIFOEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 375
fruediger 0:95916b07e8be 376 bool getAccelFIFOEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 377 bool setAccelFIFOEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 378
fruediger 0:95916b07e8be 379 /**
fruediger 1:96a227d1ca7e 380 * REG_INT_PIN_CFG register
fruediger 1:96a227d1ca7e 381 */
fruediger 1:96a227d1ca7e 382
fruediger 1:96a227d1ca7e 383 bool getInterruptLevel(InterruptLevel *level, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 384 bool setInterruptLevel(InterruptLevel level, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 385
fruediger 1:96a227d1ca7e 386 bool getInterruptDrive(InterruptDrive *drive, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 387 bool setInterruptDrive(InterruptDrive drive, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 388
fruediger 1:96a227d1ca7e 389 bool getInterruptLatch(InterruptLatch *latch, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 390 bool setInterruptLatch(InterruptLatch latch, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 391
fruediger 1:96a227d1ca7e 392 bool getInterruptLatchClear(InterruptClear *latchClear, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 393 bool setInterruptLatchClear(InterruptClear latchClear, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 394
fruediger 1:96a227d1ca7e 395 bool getInterruptFSyncLevel(InterruptFSyncLevel *fsyncLevel, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 396 bool setInterruptFSyncLevel(InterruptFSyncLevel fsyncLevel, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 397
fruediger 1:96a227d1ca7e 398 bool getInterruptFSyncEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 399 bool setInterruptFSyncEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 400
fruediger 1:96a227d1ca7e 401 /**
fruediger 1:96a227d1ca7e 402 * REG_INT_ENABLE register
fruediger 1:96a227d1ca7e 403 */
fruediger 1:96a227d1ca7e 404
fruediger 1:96a227d1ca7e 405 bool getInterruptsEnabled(Interrupt *interruptSet, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 406 bool setInterruptsEnabled(Interrupt interruptSet, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 407
fruediger 1:96a227d1ca7e 408 bool getInterruptFreefallEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 409 bool setInterruptFreefallEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 410
fruediger 1:96a227d1ca7e 411 bool getInterruptMotionEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 412 bool setInterruptMotionEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 413
fruediger 1:96a227d1ca7e 414 bool getInterruptZeroMotionEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 415 bool setInterruptZeroMotionEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 416
fruediger 1:96a227d1ca7e 417 bool getInterruptFIFOOverflowEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 418 bool setInterruptFIFOOverflowEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 419
fruediger 1:96a227d1ca7e 420 bool getInterruptDataReadyEnabled(bool *enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 421 bool setInterruptDataReadyEnabled(bool enabled, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 422
fruediger 1:96a227d1ca7e 423 /**
fruediger 1:96a227d1ca7e 424 * REG_INT_STATUS register
fruediger 1:96a227d1ca7e 425 */
fruediger 1:96a227d1ca7e 426
fruediger 1:96a227d1ca7e 427 bool getInterruptStatuses(Interrupt *interruptSet, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 428
fruediger 1:96a227d1ca7e 429 bool getInterruptFreefallStatus(bool *status, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 430
fruediger 1:96a227d1ca7e 431 bool getInterruptMotionStatus(bool *status, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 432
fruediger 1:96a227d1ca7e 433 bool getInterruptZeroMotionStatus(bool *status, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 434
fruediger 1:96a227d1ca7e 435 bool getInterruptFIFOOverflowStatus(bool *status, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 436
fruediger 1:96a227d1ca7e 437 bool getInterruptDataReadyStatus(bool *status, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 438
fruediger 1:96a227d1ca7e 439 /**
fruediger 1:96a227d1ca7e 440 * REG_ACCEL_XOUT_H
fruediger 1:96a227d1ca7e 441 * REG_ACCEL_XOUT_L
fruediger 1:96a227d1ca7e 442 * REG_ACCEL_YOUT_H
fruediger 1:96a227d1ca7e 443 * REG_ACCEL_YOUT_L
fruediger 1:96a227d1ca7e 444 * REG_ACCEL_ZOUT_H
fruediger 1:96a227d1ca7e 445 * REG_ACCEL_ZOUT_L
fruediger 1:96a227d1ca7e 446 * REG_TEMP_OUT_H
fruediger 1:96a227d1ca7e 447 * REG_TEMP_OUT_L
fruediger 1:96a227d1ca7e 448 * REG_GYRO_XOUT_H
fruediger 1:96a227d1ca7e 449 * REG_GYRO_XOUT_L
fruediger 1:96a227d1ca7e 450 * REG_GYRO_YOUT_H
fruediger 1:96a227d1ca7e 451 * REG_GYRO_YOUT_L
fruediger 1:96a227d1ca7e 452 * REG_GYRO_ZOUT_H
fruediger 1:96a227d1ca7e 453 * REG_GYRO_ZOUT_L registers
fruediger 1:96a227d1ca7e 454 */
fruediger 1:96a227d1ca7e 455
fruediger 1:96a227d1ca7e 456 /** Acceleration */
fruediger 1:96a227d1ca7e 457
fruediger 1:96a227d1ca7e 458 bool getAcceleration(int16_t *ax, int16_t *ay, int16_t *az, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 459
fruediger 1:96a227d1ca7e 460 bool getAccelerationX(int16_t* ax, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 461
fruediger 1:96a227d1ca7e 462 bool getAccelerationY(int16_t* ay, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 463
fruediger 1:96a227d1ca7e 464 bool getAccelerationZ(int16_t* az, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 465
fruediger 1:96a227d1ca7e 466 /** Temperature */
fruediger 1:96a227d1ca7e 467
fruediger 1:96a227d1ca7e 468 bool getTemperature(int16_t* temp, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 469
fruediger 1:96a227d1ca7e 470 /** Rotation speed */
fruediger 1:96a227d1ca7e 471
fruediger 1:96a227d1ca7e 472 bool getRotationSpeed(int16_t *ox, int16_t *oy, int16_t *oz, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 473
fruediger 1:96a227d1ca7e 474 bool getRotationSpeedX(int16_t* ox, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 475
fruediger 1:96a227d1ca7e 476 bool getRotationSpeedY(int16_t* oy, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 477
fruediger 1:96a227d1ca7e 478 bool getRotationSpeedZ(int16_t* oz, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 479
fruediger 1:96a227d1ca7e 480 /** All three */
fruediger 1:96a227d1ca7e 481
fruediger 1:96a227d1ca7e 482 bool getMotionAndTemperature(int16_t* ax, int16_t* ay, int16_t* az,
fruediger 1:96a227d1ca7e 483 int16_t* ox, int16_t* oy, int16_t* oz,
fruediger 1:96a227d1ca7e 484 int16_t* temp, float timeout_secs = defaultTimeout_secs);
fruediger 1:96a227d1ca7e 485
fruediger 1:96a227d1ca7e 486 /**
fruediger 0:95916b07e8be 487 * Read and write registers
fruediger 0:95916b07e8be 488 */
fruediger 0:95916b07e8be 489
fruediger 0:95916b07e8be 490 bool read(Register reg, uint8_t *data, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 491 bool read(Register reg, uint8_t *data, size_t length, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 492
fruediger 0:95916b07e8be 493 bool write(Register reg, uint8_t data, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 494 bool write(Register reg, uint8_t *data, size_t length, float timeout_secs = defaultTimeout_secs);
fruediger 0:95916b07e8be 495
fruediger 0:95916b07e8be 496 private:
fruediger 0:95916b07e8be 497 static const float retryDelay_secs = 0.005;
fruediger 0:95916b07e8be 498 static const float defaultTimeout_secs = 0.1; // makes a maximum of 20 tries
fruediger 0:95916b07e8be 499
fruediger 0:95916b07e8be 500 I2C i2c;
fruediger 0:95916b07e8be 501 BaseAddress baseAddress;
fruediger 0:95916b07e8be 502 };
fruediger 0:95916b07e8be 503
fruediger 0:95916b07e8be 504 #endif