BLE GATT-service implementation for high quantity sensor data from a MPU6050-accelerator/gyroscope

Dependencies:   BLE_API mbed nRF51822 MPU6050_lib

Committer:
fruediger
Date:
Tue Sep 08 13:42:58 2015 +0000
Revision:
10:b305e261e7d1
Parent:
9:6a28d9c0e486
Child:
12:dc46aa2edccd
mostly complete commit; too many minor changes to list them all...

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fruediger 3:d72d9195dc26 1 #pragma once
fruediger 3:d72d9195dc26 2 #ifndef __MPU6050_SERVICE_H__
fruediger 3:d72d9195dc26 3 #define __MPU6050_SERVICE_H__
fruediger 3:d72d9195dc26 4
fruediger 3:d72d9195dc26 5 #include "BLE.h"
fruediger 9:6a28d9c0e486 6 #include "MPU6050.h"
fruediger 3:d72d9195dc26 7
fruediger 3:d72d9195dc26 8 class MPU6050Service
fruediger 3:d72d9195dc26 9 {
fruediger 3:d72d9195dc26 10 public:
fruediger 3:d72d9195dc26 11 enum
fruediger 3:d72d9195dc26 12 {
fruediger 9:6a28d9c0e486 13 UUID_MPU6050_SERVICE = 0xA123,
fruediger 3:d72d9195dc26 14
fruediger 3:d72d9195dc26 15 UUID_MPU6050_SENSOR_DATA_CHAR = 0xA124,
fruediger 10:b305e261e7d1 16 UUID_MPU6050_MOTION_INDICATOR_CHAR = 0xA125,
fruediger 10:b305e261e7d1 17 UUID_MPU6050_MEASURING_RANGE_CHAR = 0xA126,
fruediger 10:b305e261e7d1 18 UUID_MPU6050_MASTER_CLOCK_CHAR = 0xA127
fruediger 3:d72d9195dc26 19 };
fruediger 3:d72d9195dc26 20
fruediger 9:6a28d9c0e486 21 enum MeasuringRange
fruediger 9:6a28d9c0e486 22 {
fruediger 9:6a28d9c0e486 23 ACCEL_RANGE_2G = 0x00, // 0b__00
fruediger 9:6a28d9c0e486 24 ACCEL_RANGE_4G = 0x01, // 0b__01
fruediger 9:6a28d9c0e486 25 ACCEL_RANGE_8G = 0x02, // 0b__10
fruediger 9:6a28d9c0e486 26 ACCEL_RANGE_16G = 0x03, // 0b__11
fruediger 9:6a28d9c0e486 27
fruediger 10:b305e261e7d1 28 ACCEL_RANGE_MASK = 0x03, // 0b__11
fruediger 10:b305e261e7d1 29
fruediger 9:6a28d9c0e486 30 GYRO_RANGE_250 = 0x00, // 0b00__
fruediger 9:6a28d9c0e486 31 GYRO_RANGE_500 = 0x04, // 0b01__
fruediger 9:6a28d9c0e486 32 GYRO_RANGE_1000 = 0x08, // 0b10__
fruediger 10:b305e261e7d1 33 GYRO_RANGE_2000 = 0x0C, // 0b11__
fruediger 10:b305e261e7d1 34
fruediger 10:b305e261e7d1 35 GYRO_RANGE_MASK = 0x0C // 0b11__
fruediger 9:6a28d9c0e486 36 };
fruediger 9:6a28d9c0e486 37 friend inline MeasuringRange operator|(MeasuringRange a, MeasuringRange b) { return static_cast<MeasuringRange>(static_cast<int>(a) | static_cast<int>(b)); }
fruediger 10:b305e261e7d1 38 friend inline MeasuringRange operator&(MeasuringRange a, MeasuringRange b) { return static_cast<MeasuringRange>(static_cast<int>(a) & static_cast<int>(b)); }
fruediger 9:6a28d9c0e486 39
fruediger 10:b305e261e7d1 40 enum MotionIndicator
fruediger 9:6a28d9c0e486 41 {
fruediger 10:b305e261e7d1 42 MOTION_IND_NEGATIVE_X = MPU6050::MOT_NEGATIVE_X,
fruediger 10:b305e261e7d1 43 MOTION_IND_POSITIVE_X = MPU6050::MOT_POSITIVE_X,
fruediger 10:b305e261e7d1 44
fruediger 10:b305e261e7d1 45 MOTION_IND_NEGATIVE_Y = MPU6050::MOT_NEGATIVE_Y,
fruediger 10:b305e261e7d1 46 MOTION_IND_POSITIVE_Y = MPU6050::MOT_POSITIVE_Y,
fruediger 10:b305e261e7d1 47
fruediger 10:b305e261e7d1 48 MOTION_IND_NEGATIVE_Z = MPU6050::MOT_NEGATIVE_Z,
fruediger 10:b305e261e7d1 49 MOTION_IND_POSITIVE_Z = MPU6050::MOT_POSITIVE_Z,
fruediger 9:6a28d9c0e486 50
fruediger 10:b305e261e7d1 51 MOTION_IND_FREEFALL = 0x02, // 0b00000010
fruediger 10:b305e261e7d1 52 MOTION_IND_ZERO_MOTION = MPU6050::MOT_ZERO
fruediger 10:b305e261e7d1 53 };
fruediger 10:b305e261e7d1 54 friend inline MotionIndicator operator|(MotionIndicator a, MotionIndicator b) { return static_cast<MotionIndicator>(static_cast<int>(a) | static_cast<int>(b)); }
fruediger 10:b305e261e7d1 55 friend inline MotionIndicator operator&(MotionIndicator a, MotionIndicator b) { return static_cast<MotionIndicator>(static_cast<int>(a) & static_cast<int>(b)); }
fruediger 10:b305e261e7d1 56
fruediger 10:b305e261e7d1 57 typedef __packed struct
fruediger 10:b305e261e7d1 58 {
fruediger 10:b305e261e7d1 59 int16_t accelX, accelY, accelZ;
fruediger 10:b305e261e7d1 60
fruediger 10:b305e261e7d1 61 int16_t temperature;
fruediger 9:6a28d9c0e486 62
fruediger 10:b305e261e7d1 63 int16_t gyroX, gyroY, gyroZ;
fruediger 9:6a28d9c0e486 64
fruediger 10:b305e261e7d1 65 uint32_t clock_us;
fruediger 9:6a28d9c0e486 66 } SensorData;
fruediger 9:6a28d9c0e486 67
fruediger 10:b305e261e7d1 68 typedef __packed struct
fruediger 10:b305e261e7d1 69 {
fruediger 10:b305e261e7d1 70 MotionIndicator indicator;
fruediger 10:b305e261e7d1 71
fruediger 10:b305e261e7d1 72 uint32_t clock_us;
fruediger 10:b305e261e7d1 73
fruediger 10:b305e261e7d1 74 } MotionIndication;
fruediger 10:b305e261e7d1 75
fruediger 3:d72d9195dc26 76 MPU6050Service
fruediger 3:d72d9195dc26 77 (
fruediger 9:6a28d9c0e486 78 BLE &ble,
fruediger 9:6a28d9c0e486 79 MPU6050 &mpu6050,
fruediger 10:b305e261e7d1 80 PinName interruptPin,
fruediger 9:6a28d9c0e486 81 const SensorData *initialData = NULL,
fruediger 9:6a28d9c0e486 82 const MeasuringRange measuringRange = ACCEL_RANGE_2G | GYRO_RANGE_250,
fruediger 9:6a28d9c0e486 83 const uint32_t masterClock_us = 0
fruediger 3:d72d9195dc26 84 ) :
fruediger 3:d72d9195dc26 85 gattServer(ble.gattServer()),
fruediger 9:6a28d9c0e486 86 mpu(mpu6050),
fruediger 10:b305e261e7d1 87 intIn(interruptPin),
fruediger 10:b305e261e7d1 88 timer(),
fruediger 9:6a28d9c0e486 89
fruediger 9:6a28d9c0e486 90 _isRunning(false),
fruediger 9:6a28d9c0e486 91 updateSensorDataCharacteristicTrigger(false),
fruediger 9:6a28d9c0e486 92
fruediger 10:b305e261e7d1 93 timerOffset_us(masterClock_us),
fruediger 9:6a28d9c0e486 94
fruediger 3:d72d9195dc26 95 sensorDataCharacteristic
fruediger 3:d72d9195dc26 96 (
fruediger 3:d72d9195dc26 97 UUID_MPU6050_SENSOR_DATA_CHAR,
fruediger 9:6a28d9c0e486 98 (SensorData*)initialData,
fruediger 3:d72d9195dc26 99 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY // improving latency by repurposing notifications and "writing" the client
fruediger 3:d72d9195dc26 100 // (i.e. indicating the client but not wait for a response)
fruediger 3:d72d9195dc26 101 ),
fruediger 10:b305e261e7d1 102 motionIndicatorCharaceristic
fruediger 10:b305e261e7d1 103 (
fruediger 10:b305e261e7d1 104 UUID_MPU6050_MOTION_INDICATOR_CHAR,
fruediger 10:b305e261e7d1 105 NULL,
fruediger 10:b305e261e7d1 106 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY
fruediger 10:b305e261e7d1 107 ),
fruediger 3:d72d9195dc26 108 measuringRangeCharacteristic
fruediger 3:d72d9195dc26 109 (
fruediger 3:d72d9195dc26 110 UUID_MPU6050_MEASURING_RANGE_CHAR,
fruediger 9:6a28d9c0e486 111 (MeasuringRange*)&measuringRange,
fruediger 3:d72d9195dc26 112 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE // also improving latency
fruediger 3:d72d9195dc26 113 ),
fruediger 3:d72d9195dc26 114 masterClockCharacteristic
fruediger 3:d72d9195dc26 115 (
fruediger 3:d72d9195dc26 116 UUID_MPU6050_MASTER_CLOCK_CHAR,
fruediger 4:a97e6917f731 117 (uint32_t*)&masterClock_us,
fruediger 3:d72d9195dc26 118 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE // look above again
fruediger 3:d72d9195dc26 119 )
fruediger 3:d72d9195dc26 120 {
fruediger 7:af3e2b9c137a 121 static bool serviceAdded = false;
fruediger 3:d72d9195dc26 122 if (serviceAdded)
fruediger 3:d72d9195dc26 123 return;
fruediger 3:d72d9195dc26 124
fruediger 3:d72d9195dc26 125 GattCharacteristic *charTable[] =
fruediger 3:d72d9195dc26 126 {
fruediger 3:d72d9195dc26 127 &sensorDataCharacteristic,
fruediger 10:b305e261e7d1 128 &motionIndicatorCharaceristic,
fruediger 3:d72d9195dc26 129 &measuringRangeCharacteristic,
fruediger 3:d72d9195dc26 130 &masterClockCharacteristic
fruediger 3:d72d9195dc26 131 };
fruediger 3:d72d9195dc26 132
fruediger 9:6a28d9c0e486 133 GattService mpu6050Service(UUID_MPU6050_SERVICE, charTable, sizeof(charTable) / sizeof(GattCharacteristic*));
fruediger 3:d72d9195dc26 134
fruediger 3:d72d9195dc26 135 gattServer.addService(mpu6050Service);
fruediger 3:d72d9195dc26 136 gattServer.onDataSent(this, &MPU6050Service::dataSentCallback);
fruediger 3:d72d9195dc26 137 gattServer.onDataWritten(this, &MPU6050Service::dataWrittenCallback);
fruediger 3:d72d9195dc26 138
fruediger 10:b305e261e7d1 139 intIn.rise(this, &MPU6050Service::interruptRiseCallback);
fruediger 10:b305e261e7d1 140
fruediger 3:d72d9195dc26 141 serviceAdded = true;
fruediger 3:d72d9195dc26 142 }
fruediger 3:d72d9195dc26 143
fruediger 9:6a28d9c0e486 144 bool isRunning()
fruediger 3:d72d9195dc26 145 {
fruediger 9:6a28d9c0e486 146 return _isRunning;
fruediger 9:6a28d9c0e486 147 }
fruediger 9:6a28d9c0e486 148
fruediger 9:6a28d9c0e486 149 bool start()
fruediger 9:6a28d9c0e486 150 {
fruediger 9:6a28d9c0e486 151 if (!deviceReset())
fruediger 9:6a28d9c0e486 152 {
fruediger 9:6a28d9c0e486 153 _isRunning = false;
fruediger 9:6a28d9c0e486 154 return false;
fruediger 9:6a28d9c0e486 155 }
fruediger 10:b305e261e7d1 156
fruediger 10:b305e261e7d1 157 timer.stop();
fruediger 10:b305e261e7d1 158 timer.reset();
fruediger 10:b305e261e7d1 159 timer.start();
fruediger 9:6a28d9c0e486 160
fruediger 9:6a28d9c0e486 161 _isRunning = true;
fruediger 9:6a28d9c0e486 162
fruediger 3:d72d9195dc26 163 // sending data once will invoke the dataSent(...) callback later on
fruediger 9:6a28d9c0e486 164 // which will be looped by the event driven behavior of the BLE API (because it will send data again on it's own and so on)
fruediger 9:6a28d9c0e486 165 updateSensorDataCharacteristicTrigger = true;
fruediger 9:6a28d9c0e486 166
fruediger 9:6a28d9c0e486 167 return true;
fruediger 9:6a28d9c0e486 168 }
fruediger 9:6a28d9c0e486 169
fruediger 9:6a28d9c0e486 170 void stop()
fruediger 10:b305e261e7d1 171 {
fruediger 9:6a28d9c0e486 172 _isRunning = false;
fruediger 9:6a28d9c0e486 173 }
fruediger 9:6a28d9c0e486 174
fruediger 9:6a28d9c0e486 175 void handleService()
fruediger 9:6a28d9c0e486 176 {
fruediger 10:b305e261e7d1 177 if (_isRunning)
fruediger 10:b305e261e7d1 178 {
fruediger 10:b305e261e7d1 179 if (updateMeasuringRangeTrigger)
fruediger 10:b305e261e7d1 180 updateMeasuringRange();
fruediger 10:b305e261e7d1 181 if (updateSensorDataCharacteristicTrigger)
fruediger 10:b305e261e7d1 182 updateSensorDataCharacteristic();
fruediger 10:b305e261e7d1 183 if (updateMotionIndicatorCharacteristicTrigger)
fruediger 10:b305e261e7d1 184 updateMotionIndicatorCharacteristic();
fruediger 10:b305e261e7d1 185 }
fruediger 3:d72d9195dc26 186 }
fruediger 3:d72d9195dc26 187
fruediger 10:b305e261e7d1 188 private:
fruediger 10:b305e261e7d1 189 static const int MAX_SENSOR_POLLS_PER_UPDATE = 15;
fruediger 9:6a28d9c0e486 190
fruediger 3:d72d9195dc26 191 GattServer &gattServer;
fruediger 9:6a28d9c0e486 192 MPU6050 &mpu;
fruediger 10:b305e261e7d1 193 InterruptIn intIn;
fruediger 10:b305e261e7d1 194 Timer timer;
fruediger 5:ea4d280a0a2f 195
fruediger 9:6a28d9c0e486 196 volatile bool _isRunning;
fruediger 9:6a28d9c0e486 197 bool updateSensorDataCharacteristicTrigger;
fruediger 10:b305e261e7d1 198 bool updateMotionIndicatorCharacteristicTrigger;
fruediger 10:b305e261e7d1 199 bool updateMeasuringRangeTrigger;
fruediger 9:6a28d9c0e486 200
fruediger 10:b305e261e7d1 201 uint32_t timerOffset_us;
fruediger 3:d72d9195dc26 202
fruediger 10:b305e261e7d1 203 ReadOnlyGattCharacteristic<SensorData> sensorDataCharacteristic;
fruediger 10:b305e261e7d1 204 ReadOnlyGattCharacteristic<MotionIndicator> motionIndicatorCharaceristic;
fruediger 10:b305e261e7d1 205 WriteOnlyGattCharacteristic<MeasuringRange> measuringRangeCharacteristic;
fruediger 10:b305e261e7d1 206 WriteOnlyGattCharacteristic<uint32_t> masterClockCharacteristic;
fruediger 3:d72d9195dc26 207
fruediger 3:d72d9195dc26 208 void dataSentCallback(unsigned count)
fruediger 3:d72d9195dc26 209 {
fruediger 3:d72d9195dc26 210 // we came here, if we just sent data,
fruediger 3:d72d9195dc26 211 // so lets keep the BLE stack busy by sending data again
fruediger 9:6a28d9c0e486 212 updateSensorDataCharacteristicTrigger = true;
fruediger 3:d72d9195dc26 213 }
fruediger 3:d72d9195dc26 214
fruediger 3:d72d9195dc26 215 void dataWrittenCallback(const GattWriteCallbackParams *context)
fruediger 3:d72d9195dc26 216 {
fruediger 10:b305e261e7d1 217 // update master clock immediately
fruediger 10:b305e261e7d1 218 if (context->handle == masterClockCharacteristic.getValueAttribute().getHandle())
fruediger 10:b305e261e7d1 219 {
fruediger 10:b305e261e7d1 220 timer.stop();
fruediger 10:b305e261e7d1 221 timer.reset();
fruediger 10:b305e261e7d1 222
fruediger 10:b305e261e7d1 223 timerOffset_us = *((uint32_t*)context->data);
fruediger 10:b305e261e7d1 224
fruediger 10:b305e261e7d1 225 timer.start();
fruediger 10:b305e261e7d1 226 }
fruediger 10:b305e261e7d1 227 // delay measuring range update
fruediger 10:b305e261e7d1 228 else if (context->handle == measuringRangeCharacteristic.getValueAttribute().getHandle())
fruediger 10:b305e261e7d1 229 {
fruediger 10:b305e261e7d1 230 updateMeasuringRangeTrigger = true;
fruediger 10:b305e261e7d1 231 }
fruediger 3:d72d9195dc26 232 }
fruediger 3:d72d9195dc26 233
fruediger 10:b305e261e7d1 234 void interruptRiseCallback()
fruediger 9:6a28d9c0e486 235 {
fruediger 10:b305e261e7d1 236 updateMotionIndicatorCharacteristicTrigger = true;
fruediger 9:6a28d9c0e486 237 }
fruediger 9:6a28d9c0e486 238
fruediger 3:d72d9195dc26 239 void updateSensorDataCharacteristic()
fruediger 10:b305e261e7d1 240 {
fruediger 10:b305e261e7d1 241 updateSensorDataCharacteristicTrigger = false;
fruediger 10:b305e261e7d1 242
fruediger 10:b305e261e7d1 243 int n = 0;
fruediger 10:b305e261e7d1 244 SensorData data;
fruediger 10:b305e261e7d1 245
fruediger 10:b305e261e7d1 246 for (; n < MAX_SENSOR_POLLS_PER_UPDATE; n++)
fruediger 10:b305e261e7d1 247 if (mpu.getMotionAndTemperature
fruediger 10:b305e261e7d1 248 (
fruediger 10:b305e261e7d1 249 (int16_t*)&(data.accelX), (int16_t*)&(data.accelY), (int16_t*)&(data.accelZ),
fruediger 10:b305e261e7d1 250 (int16_t*)&(data.temperature),
fruediger 10:b305e261e7d1 251 (int16_t*)&(data.gyroX), (int16_t*)&(data.gyroY), (int16_t*)&(data.gyroZ),
fruediger 10:b305e261e7d1 252 0.0
fruediger 10:b305e261e7d1 253 ))
fruediger 10:b305e261e7d1 254 {
fruediger 10:b305e261e7d1 255 data.clock_us = timer.read_us() + timerOffset_us;
fruediger 10:b305e261e7d1 256
fruediger 10:b305e261e7d1 257 if (gattServer.write(sensorDataCharacteristic.getValueHandle(), (uint8_t*)&data, sizeof(SensorData)) != BLE_ERROR_NONE)
fruediger 9:6a28d9c0e486 258 break;
fruediger 10:b305e261e7d1 259 }
fruediger 10:b305e261e7d1 260
fruediger 10:b305e261e7d1 261 if (n == 0)
fruediger 10:b305e261e7d1 262 updateSensorDataCharacteristicTrigger = true;
fruediger 10:b305e261e7d1 263 }
fruediger 10:b305e261e7d1 264
fruediger 10:b305e261e7d1 265 void updateMotionIndicatorCharacteristic()
fruediger 10:b305e261e7d1 266 {
fruediger 10:b305e261e7d1 267 updateMotionIndicatorCharacteristicTrigger = false;
fruediger 3:d72d9195dc26 268
fruediger 10:b305e261e7d1 269 MPU6050::Interrupt intSet = static_cast<MPU6050::Interrupt>(0);
fruediger 10:b305e261e7d1 270 MPU6050::Motion motSet = static_cast<MPU6050::Motion>(0);
fruediger 10:b305e261e7d1 271 MotionIndicator mot;
fruediger 10:b305e261e7d1 272
fruediger 10:b305e261e7d1 273 mpu.getInterruptStatuses(&intSet);
fruediger 10:b305e261e7d1 274 mpu.getMotionStatus(&motSet);
fruediger 10:b305e261e7d1 275
fruediger 10:b305e261e7d1 276 mot = *((MotionIndicator*)&motSet);
fruediger 10:b305e261e7d1 277
fruediger 10:b305e261e7d1 278 if ((intSet & MPU6050::INT_FREEFALL) != 0)
fruediger 10:b305e261e7d1 279 mot = mot | MOTION_IND_FREEFALL;
fruediger 10:b305e261e7d1 280 else
fruediger 10:b305e261e7d1 281 mot = mot & static_cast<MotionIndicator>(~0x02);
fruediger 10:b305e261e7d1 282
fruediger 10:b305e261e7d1 283 gattServer.write(motionIndicatorCharaceristic.getValueHandle(), (uint8_t*)&mot, sizeof(MotionIndicator));
fruediger 3:d72d9195dc26 284 }
fruediger 9:6a28d9c0e486 285
fruediger 10:b305e261e7d1 286 void updateMeasuringRange()
fruediger 10:b305e261e7d1 287 {
fruediger 10:b305e261e7d1 288 static const uint16_t sizeOfMeasuringRange = sizeof(MeasuringRange);
fruediger 10:b305e261e7d1 289
fruediger 10:b305e261e7d1 290 updateMeasuringRangeTrigger = false;
fruediger 10:b305e261e7d1 291
fruediger 10:b305e261e7d1 292 union
fruediger 10:b305e261e7d1 293 {
fruediger 10:b305e261e7d1 294 MeasuringRange range;
fruediger 10:b305e261e7d1 295 uint8_t bytes[sizeOfMeasuringRange];
fruediger 10:b305e261e7d1 296 } conv;
fruediger 10:b305e261e7d1 297
fruediger 10:b305e261e7d1 298 if (gattServer.read(measuringRangeCharacteristic.getValueHandle(), conv.bytes, (uint16_t*)&sizeOfMeasuringRange) == BLE_ERROR_NONE)
fruediger 10:b305e261e7d1 299 {
fruediger 10:b305e261e7d1 300 switch (conv.range & ACCEL_RANGE_MASK)
fruediger 10:b305e261e7d1 301 {
fruediger 10:b305e261e7d1 302 case ACCEL_RANGE_2G:
fruediger 10:b305e261e7d1 303 mpu.setAccelRange(MPU6050::ACCEL_RANGE_2G);
fruediger 10:b305e261e7d1 304 break;
fruediger 10:b305e261e7d1 305 case ACCEL_RANGE_4G:
fruediger 10:b305e261e7d1 306 mpu.setAccelRange(MPU6050::ACCEL_RANGE_4G);
fruediger 10:b305e261e7d1 307 break;
fruediger 10:b305e261e7d1 308 case ACCEL_RANGE_8G:
fruediger 10:b305e261e7d1 309 mpu.setAccelRange(MPU6050::ACCEL_RANGE_8G);
fruediger 10:b305e261e7d1 310 break;
fruediger 10:b305e261e7d1 311 case ACCEL_RANGE_16G:
fruediger 10:b305e261e7d1 312 mpu.setAccelRange(MPU6050::ACCEL_RANGE_16G);
fruediger 10:b305e261e7d1 313 break;
fruediger 10:b305e261e7d1 314 }
fruediger 10:b305e261e7d1 315
fruediger 10:b305e261e7d1 316 switch (conv.range & GYRO_RANGE_MASK)
fruediger 10:b305e261e7d1 317 {
fruediger 10:b305e261e7d1 318 case GYRO_RANGE_250:
fruediger 10:b305e261e7d1 319 mpu.setGyroRange(MPU6050::GYRO_RANGE_250);
fruediger 10:b305e261e7d1 320 break;
fruediger 10:b305e261e7d1 321 case GYRO_RANGE_500:
fruediger 10:b305e261e7d1 322 mpu.setGyroRange(MPU6050::GYRO_RANGE_500);
fruediger 10:b305e261e7d1 323 break;
fruediger 10:b305e261e7d1 324 case GYRO_RANGE_1000:
fruediger 10:b305e261e7d1 325 mpu.setGyroRange(MPU6050::GYRO_RANGE_1000);
fruediger 10:b305e261e7d1 326 break;
fruediger 10:b305e261e7d1 327 case GYRO_RANGE_2000:
fruediger 10:b305e261e7d1 328 mpu.setGyroRange(MPU6050::GYRO_RANGE_2000);
fruediger 10:b305e261e7d1 329 break;
fruediger 10:b305e261e7d1 330 }
fruediger 10:b305e261e7d1 331 }
fruediger 10:b305e261e7d1 332 }
fruediger 10:b305e261e7d1 333
fruediger 10:b305e261e7d1 334 inline bool deviceReset()
fruediger 9:6a28d9c0e486 335 {
fruediger 9:6a28d9c0e486 336 uint8_t id;
fruediger 9:6a28d9c0e486 337
fruediger 9:6a28d9c0e486 338 return
fruediger 9:6a28d9c0e486 339 mpu.getDeviceId(&id) &&
fruediger 9:6a28d9c0e486 340 (id == MPU6050::MPU6050_ID) &&
fruediger 9:6a28d9c0e486 341 mpu.reset() &&
fruediger 10:b305e261e7d1 342 mpu.setClockSource(MPU6050::CLOCK_SRC_INTERNAL_8MHZ) &&
fruediger 10:b305e261e7d1 343 mpu.setInterruptsEnabled(MPU6050::INT_FREEFALL | MPU6050::INT_MOTION | MPU6050::INT_ZERO_MOTION) &&
fruediger 10:b305e261e7d1 344 mpu.setSleepEnabled(false);
fruediger 9:6a28d9c0e486 345 }
fruediger 3:d72d9195dc26 346 };
fruediger 3:d72d9195dc26 347
fruediger 3:d72d9195dc26 348 #endif