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 22 10:50:59 2015 +0000
Revision:
13:496c0f5e8a61
Parent:
12:dc46aa2edccd
last commit before making this a public repository

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fruediger 1:6a40ad9ac7e5 1 /** Includes */
fruediger 1:6a40ad9ac7e5 2
fruediger 1:6a40ad9ac7e5 3 #include "common.h"
fruediger 0:23fd064af409 4 #include "mbed.h"
fruediger 0:23fd064af409 5 #include "BLE.h"
fruediger 3:d72d9195dc26 6 #include "MPU6050Service.h"
fruediger 10:b305e261e7d1 7 #include "PowerService.h"
fruediger 5:ea4d280a0a2f 8 #include "services/DeviceInformationService.h"
fruediger 1:6a40ad9ac7e5 9
fruediger 1:6a40ad9ac7e5 10 /** Constants */
fruediger 1:6a40ad9ac7e5 11
fruediger 9:6a28d9c0e486 12 static const char deviceName[] = "nano bear";
fruediger 9:6a28d9c0e486 13 static const char deviceManufacturers[] = "???";
fruediger 9:6a28d9c0e486 14 static const char deviceModelNumber[] = "";
fruediger 9:6a28d9c0e486 15 static const char deviceSerialNumber[] = XSTRING_(MBED_BUILD_TIMESTAMP);
fruediger 9:6a28d9c0e486 16 static const char deviceHardwareRev[] = "0.1";
fruediger 9:6a28d9c0e486 17 static const char deviceFirmwareRev[] = "0.1";
fruediger 9:6a28d9c0e486 18 static const char deviceSoftwareRev[] = "";
fruediger 1:6a40ad9ac7e5 19
fruediger 9:6a28d9c0e486 20 static const uint16_t minimumConnectionInterval = Gap::MSEC_TO_GAP_DURATION_UNITS(20); // 20ms
fruediger 9:6a28d9c0e486 21 static const uint16_t maximumConnectionInterval = Gap::MSEC_TO_GAP_DURATION_UNITS(40); // 40ms;
fruediger 9:6a28d9c0e486 22 static const uint16_t slaveLatency = 0;
fruediger 9:6a28d9c0e486 23
fruediger 12:dc46aa2edccd 24 static const float ledTimeout = 0.05f;
fruediger 12:dc46aa2edccd 25 static const float batteryCritBlinkSequ[] = { 0.000f, 0.146f, 0.500f, 0.854f, 1.000f, 0.854f, 0.500f, 0.146f };
fruediger 12:dc46aa2edccd 26 static const float connectedBlinkSequ[] = { 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f,
fruediger 12:dc46aa2edccd 27 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f,
fruediger 12:dc46aa2edccd 28 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f,
fruediger 12:dc46aa2edccd 29 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f,
fruediger 12:dc46aa2edccd 30 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f,
fruediger 12:dc46aa2edccd 31 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f,
fruediger 12:dc46aa2edccd 32 1.000f, 0.962f, 0.854f, 0.691f, 0.500f, 0.309f, 0.146f, 0.038f,
fruediger 12:dc46aa2edccd 33 0.000f, 0.038f, 0.146f, 0.309f, 0.500f, 0.691f, 0.854f, 0.962f };
fruediger 12:dc46aa2edccd 34 static const float disconnectedBlinkSequ[] = { 0.000f, 0.038f, 0.146f, 0.309f, 0.500f, 0.691f, 0.854f, 0.962f,
fruediger 12:dc46aa2edccd 35 1.000f, 0.962f, 0.854f, 0.691f, 0.500f, 0.309f, 0.146f, 0.038f,
fruediger 12:dc46aa2edccd 36 0.000f, 0.038f, 0.146f, 0.309f, 0.500f, 0.691f, 0.854f, 0.962f,
fruediger 12:dc46aa2edccd 37 1.000f, 0.962f, 0.854f, 0.691f, 0.500f, 0.309f, 0.146f, 0.038f,
fruediger 12:dc46aa2edccd 38 0.000f, 0.038f, 0.146f, 0.309f, 0.500f, 0.691f, 0.854f, 0.962f,
fruediger 12:dc46aa2edccd 39 1.000f, 0.962f, 0.854f, 0.691f, 0.500f, 0.309f, 0.146f, 0.038f,
fruediger 12:dc46aa2edccd 40 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f,
fruediger 12:dc46aa2edccd 41 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f,
fruediger 12:dc46aa2edccd 42 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f };
fruediger 7:af3e2b9c137a 43
fruediger 7:af3e2b9c137a 44 /** Power determination stuff:
fruediger 7:af3e2b9c137a 45 *
fruediger 7:af3e2b9c137a 46 * The following is the schematic circuit ...
fruediger 7:af3e2b9c137a 47 *
fruediger 7:af3e2b9c137a 48 * I0-> ____
fruediger 7:af3e2b9c137a 49 * --------*-|____|-*----------- ... where ...
fruediger 10:b305e261e7d1 50 * | | R3 | |
fruediger 7:af3e2b9c137a 51 * | | | _____|_____ |
fruediger 7:af3e2b9c137a 52 * | | | | | | | | | ____
fruediger 7:af3e2b9c137a 53 * | R1 | | R4 | | | BLE nano | | | and -|____|- are resistors ...
fruediger 7:af3e2b9c137a 54 * | |_| |_| | |--... |_|
fruediger 7:af3e2b9c137a 55 * | |~0-> | | | |
fruediger 7:af3e2b9c137a 56 * | Uref1 *--------|----| P0_4 |--...
fruediger 7:af3e2b9c137a 57 * + __|__ | |~0->| | ... and ...
fruediger 7:af3e2b9c137a 58 * U0 ___ | Uref2 *----| P0_5 |--...
fruediger 7:af3e2b9c137a 59 * | | | | | + __|__
fruediger 7:af3e2b9c137a 60 * | | | | | | |--... ___ is the constant voltage source
fruediger 7:af3e2b9c137a 61 * | R2 | | R5 | | | | | (a battery in this case)
fruediger 7:af3e2b9c137a 62 * | |_| |_| |___________|
fruediger 7:af3e2b9c137a 63 * | | | |
fruediger 7:af3e2b9c137a 64 * | | | |
fruediger 7:af3e2b9c137a 65 * *-------*--------*----------*--------...
fruediger 7:af3e2b9c137a 66 * _|_
fruediger 7:af3e2b9c137a 67 *
fruediger 7:af3e2b9c137a 68 *
fruediger 7:af3e2b9c137a 69 * Therefore the input values are
fruediger 7:af3e2b9c137a 70 *
fruediger 7:af3e2b9c137a 71 * U0 = (R1 / R2 + 1) * Uref1
fruediger 7:af3e2b9c137a 72 *
fruediger 7:af3e2b9c137a 73 * I0 = ((R1 + R3) / R2 + 1) / R3 * Uref1 - (R4 / R5 + 1) / R3 * Uref2
fruediger 7:af3e2b9c137a 74 *
fruediger 7:af3e2b9c137a 75 */
fruediger 7:af3e2b9c137a 76
fruediger 7:af3e2b9c137a 77 #define R1 1000.0f
fruediger 7:af3e2b9c137a 78 #define R2 1000.0f
fruediger 10:b305e261e7d1 79 #define R3 10.0f
fruediger 7:af3e2b9c137a 80 #define R4 1000.0f
fruediger 7:af3e2b9c137a 81 #define R5 1000.0f
fruediger 7:af3e2b9c137a 82 #define NANO_OP_VOLT 3.3f
fruediger 10:b305e261e7d1 83
fruediger 10:b305e261e7d1 84 static const float powerAccumulationTimeout = 0.005f;
fruediger 7:af3e2b9c137a 85
fruediger 9:6a28d9c0e486 86 static const float voltFac = ((R1 / R2) + 1.0f) * NANO_OP_VOLT;
fruediger 9:6a28d9c0e486 87 static const float currFac1 = ((((R1 + R3) / R2) + 1.0f) / R3) * NANO_OP_VOLT;
fruediger 9:6a28d9c0e486 88 static const float currFac2 = (((R4 / R5) + 1.0f) / R3) * NANO_OP_VOLT;
fruediger 9:6a28d9c0e486 89
fruediger 9:6a28d9c0e486 90 static const float powerServiceUpdateTimeout = 0.1f;
fruediger 1:6a40ad9ac7e5 91
fruediger 1:6a40ad9ac7e5 92
fruediger 1:6a40ad9ac7e5 93
fruediger 1:6a40ad9ac7e5 94 /** Global variables */
fruediger 1:6a40ad9ac7e5 95
fruediger 0:23fd064af409 96 BLE ble;
fruediger 0:23fd064af409 97 Gap::ConnectionParams_t fast;
fruediger 0:23fd064af409 98
fruediger 9:6a28d9c0e486 99 MPU6050 mpu(I2C_SDA0, I2C_SCL0, MPU6050::ADDRESS_0);
fruediger 0:23fd064af409 100
fruediger 12:dc46aa2edccd 101 PwmOut btLed(P0_28);
fruediger 12:dc46aa2edccd 102 PwmOut pwrLed(P0_29);
fruediger 9:6a28d9c0e486 103 DigitalOut aliveLed(LED);
fruediger 10:b305e261e7d1 104
fruediger 7:af3e2b9c137a 105 AnalogIn uRef1(P0_4);
fruediger 7:af3e2b9c137a 106 AnalogIn uRef2(P0_5);
fruediger 4:a97e6917f731 107
fruediger 12:dc46aa2edccd 108 InterruptIn intIn(P0_9);
fruediger 12:dc46aa2edccd 109
fruediger 9:6a28d9c0e486 110 Ticker powerAccumulationTicker;
fruediger 9:6a28d9c0e486 111 Ticker powerServiceUpdateTicker;
fruediger 10:b305e261e7d1 112 Ticker ledTicker;
fruediger 7:af3e2b9c137a 113
fruediger 1:6a40ad9ac7e5 114
fruediger 1:6a40ad9ac7e5 115
fruediger 9:6a28d9c0e486 116 /** Callback and handler functions */
fruediger 9:6a28d9c0e486 117
fruediger 9:6a28d9c0e486 118 // Accumulate discharge
fruediger 9:6a28d9c0e486 119
fruediger 9:6a28d9c0e486 120 static float U0 = 0.0f;
fruediger 9:6a28d9c0e486 121 static float I0 = 0.0f;
fruediger 9:6a28d9c0e486 122 static float Q = 0.0f;
fruediger 9:6a28d9c0e486 123
fruediger 9:6a28d9c0e486 124 void powerAccumulationPeriodicCallback()
fruediger 9:6a28d9c0e486 125 {
fruediger 9:6a28d9c0e486 126 // we have to do it in here, since we want a good approximation of the dt-timestep
fruediger 9:6a28d9c0e486 127 // since these are simple calculations this won't take much time
fruediger 9:6a28d9c0e486 128
fruediger 9:6a28d9c0e486 129 register float u1 = uRef1.read();
fruediger 9:6a28d9c0e486 130
fruediger 9:6a28d9c0e486 131 U0 = u1 * voltFac;
fruediger 9:6a28d9c0e486 132 I0 = (u1 * currFac1) - (uRef2.read() * currFac2);
fruediger 9:6a28d9c0e486 133 Q += I0 * powerAccumulationTimeout;
fruediger 9:6a28d9c0e486 134 }
fruediger 9:6a28d9c0e486 135
fruediger 9:6a28d9c0e486 136
fruediger 9:6a28d9c0e486 137
fruediger 9:6a28d9c0e486 138 // Update the power service characteristics
fruediger 9:6a28d9c0e486 139
fruediger 9:6a28d9c0e486 140 static bool powerServiceUpdateTrigger = false;
fruediger 1:6a40ad9ac7e5 141
fruediger 9:6a28d9c0e486 142 void powerServiceUpdateHandler(PowerService* powerService)
fruediger 9:6a28d9c0e486 143 {
fruediger 9:6a28d9c0e486 144 powerServiceUpdateTrigger = false;
fruediger 9:6a28d9c0e486 145
fruediger 9:6a28d9c0e486 146 powerService->updateVoltage(U0);
fruediger 12:dc46aa2edccd 147 powerService->updateCurrent(I0 * 1000); // mA
fruediger 12:dc46aa2edccd 148 powerService->updateDischarge(Q * 0.277777777f); // mAh
fruediger 9:6a28d9c0e486 149 }
fruediger 9:6a28d9c0e486 150
fruediger 9:6a28d9c0e486 151 void powerServiceUpdatePeriodicCallback()
fruediger 9:6a28d9c0e486 152 {
fruediger 9:6a28d9c0e486 153 powerServiceUpdateTrigger = true;
fruediger 9:6a28d9c0e486 154 }
fruediger 9:6a28d9c0e486 155
fruediger 9:6a28d9c0e486 156
fruediger 9:6a28d9c0e486 157 // Update the bluetooth connection state LED
fruediger 9:6a28d9c0e486 158
fruediger 10:b305e261e7d1 159 static bool ledTrigger = false;
fruediger 10:b305e261e7d1 160 static bool batteryCritical = false;
fruediger 9:6a28d9c0e486 161
fruediger 12:dc46aa2edccd 162 void ledHandler(Gap &gap)
fruediger 9:6a28d9c0e486 163 {
fruediger 10:b305e261e7d1 164 ledTrigger = false;
fruediger 9:6a28d9c0e486 165
fruediger 12:dc46aa2edccd 166 static uint32_t cnt = 0;
fruediger 12:dc46aa2edccd 167 static const int batteryCritBlinkSequSize = sizeof(batteryCritBlinkSequ) / sizeof(float);
fruediger 12:dc46aa2edccd 168 static const int connectedBlinkSequSize = sizeof(connectedBlinkSequ) / sizeof(float);
fruediger 12:dc46aa2edccd 169 static const int disconnectedBlinkSequSize = sizeof(disconnectedBlinkSequ) / sizeof(float);
fruediger 9:6a28d9c0e486 170
fruediger 12:dc46aa2edccd 171 aliveLed = !aliveLed;
fruediger 3:d72d9195dc26 172
fruediger 9:6a28d9c0e486 173 if (gap.getState().connected)
fruediger 12:dc46aa2edccd 174 btLed = connectedBlinkSequ[cnt % connectedBlinkSequSize];
fruediger 3:d72d9195dc26 175 else
fruediger 12:dc46aa2edccd 176 btLed = disconnectedBlinkSequ[cnt % disconnectedBlinkSequSize];
fruediger 10:b305e261e7d1 177
fruediger 10:b305e261e7d1 178 if (batteryCritical)
fruediger 12:dc46aa2edccd 179 pwrLed = batteryCritBlinkSequ[cnt % batteryCritBlinkSequSize];
fruediger 10:b305e261e7d1 180 else
fruediger 10:b305e261e7d1 181 pwrLed = 1;
fruediger 12:dc46aa2edccd 182
fruediger 12:dc46aa2edccd 183 cnt++;
fruediger 0:23fd064af409 184 }
fruediger 0:23fd064af409 185
fruediger 10:b305e261e7d1 186 void ledPeriodicCallback()
fruediger 0:23fd064af409 187 {
fruediger 10:b305e261e7d1 188 ledTrigger = true;
fruediger 9:6a28d9c0e486 189 }
fruediger 9:6a28d9c0e486 190
fruediger 9:6a28d9c0e486 191
fruediger 9:6a28d9c0e486 192
fruediger 9:6a28d9c0e486 193 // Connection timeout
fruediger 9:6a28d9c0e486 194
fruediger 9:6a28d9c0e486 195 static bool timeoutTrigger = false;
fruediger 9:6a28d9c0e486 196
fruediger 10:b305e261e7d1 197 void timeoutHandler(Gap &gap, MPU6050Service *mpu)
fruediger 9:6a28d9c0e486 198 {
fruediger 9:6a28d9c0e486 199 timeoutTrigger = false;
fruediger 4:a97e6917f731 200
fruediger 10:b305e261e7d1 201 mpu->stop();
fruediger 9:6a28d9c0e486 202 gap.startAdvertising();
fruediger 9:6a28d9c0e486 203 }
fruediger 9:6a28d9c0e486 204
fruediger 9:6a28d9c0e486 205 void timeoutCallback(Gap::TimeoutSource_t source)
fruediger 9:6a28d9c0e486 206 {
fruediger 9:6a28d9c0e486 207 timeoutTrigger = true;
fruediger 9:6a28d9c0e486 208 }
fruediger 9:6a28d9c0e486 209
fruediger 9:6a28d9c0e486 210
fruediger 9:6a28d9c0e486 211
fruediger 9:6a28d9c0e486 212 // Disconnection
fruediger 9:6a28d9c0e486 213
fruediger 9:6a28d9c0e486 214 static bool disconnectionTrigger = false;
fruediger 9:6a28d9c0e486 215
fruediger 10:b305e261e7d1 216 void disconnectionHandler(Gap &gap, MPU6050Service *mpu)
fruediger 9:6a28d9c0e486 217 {
fruediger 9:6a28d9c0e486 218 disconnectionTrigger = false;
fruediger 4:a97e6917f731 219
fruediger 10:b305e261e7d1 220 mpu->stop();
fruediger 9:6a28d9c0e486 221 gap.startAdvertising();
fruediger 0:23fd064af409 222 }
fruediger 0:23fd064af409 223
fruediger 0:23fd064af409 224 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
fruediger 0:23fd064af409 225 {
fruediger 9:6a28d9c0e486 226 timeoutTrigger = true;
fruediger 9:6a28d9c0e486 227 }
fruediger 9:6a28d9c0e486 228
fruediger 9:6a28d9c0e486 229
fruediger 9:6a28d9c0e486 230 // Connection
fruediger 9:6a28d9c0e486 231
fruediger 9:6a28d9c0e486 232 static bool connectionTrigger = false;
fruediger 9:6a28d9c0e486 233
fruediger 9:6a28d9c0e486 234 void connectionHandler(MPU6050Service *mpu6050)
fruediger 9:6a28d9c0e486 235 {
fruediger 9:6a28d9c0e486 236 connectionTrigger = false;
fruediger 4:a97e6917f731 237
fruediger 9:6a28d9c0e486 238 mpu6050->start();
fruediger 0:23fd064af409 239 }
fruediger 0:23fd064af409 240
fruediger 0:23fd064af409 241 void connectionCallback(const Gap::ConnectionCallbackParams_t *params)
fruediger 9:6a28d9c0e486 242 {
fruediger 0:23fd064af409 243 // update the connection parameters with the tuned fast ones
fruediger 0:23fd064af409 244 ble.updateConnectionParams(params->handle, &fast);
fruediger 0:23fd064af409 245
fruediger 9:6a28d9c0e486 246 connectionTrigger = true;
fruediger 0:23fd064af409 247 }
fruediger 0:23fd064af409 248
fruediger 1:6a40ad9ac7e5 249
fruediger 1:6a40ad9ac7e5 250
fruediger 1:6a40ad9ac7e5 251 /** Main */
fruediger 1:6a40ad9ac7e5 252
fruediger 0:23fd064af409 253 int main()
fruediger 7:af3e2b9c137a 254 {
fruediger 12:dc46aa2edccd 255 btLed = 1.0f;
fruediger 12:dc46aa2edccd 256 pwrLed = 1.0f;
fruediger 9:6a28d9c0e486 257 aliveLed = 0;
fruediger 1:6a40ad9ac7e5 258
fruediger 9:6a28d9c0e486 259 ble.init();
fruediger 9:6a28d9c0e486 260
fruediger 9:6a28d9c0e486 261 Gap &gap = ble.gap();
fruediger 1:6a40ad9ac7e5 262
fruediger 9:6a28d9c0e486 263 powerAccumulationTicker.attach(powerAccumulationPeriodicCallback, powerAccumulationTimeout);
fruediger 9:6a28d9c0e486 264 powerServiceUpdateTicker.attach(powerServiceUpdatePeriodicCallback, powerServiceUpdateTimeout);
fruediger 10:b305e261e7d1 265 ledTicker.attach(ledPeriodicCallback, ledTimeout);
fruediger 0:23fd064af409 266
fruediger 9:6a28d9c0e486 267 gap.onTimeout(timeoutCallback);
fruediger 9:6a28d9c0e486 268 gap.onDisconnection(disconnectionCallback);
fruediger 9:6a28d9c0e486 269 gap.onConnection(connectionCallback);
fruediger 0:23fd064af409 270
fruediger 9:6a28d9c0e486 271 gap.setDeviceName((const uint8_t*)deviceName);
fruediger 0:23fd064af409 272
fruediger 9:6a28d9c0e486 273 gap.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
fruediger 9:6a28d9c0e486 274 gap.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (const uint8_t*)deviceName, sizeof(deviceName));
fruediger 9:6a28d9c0e486 275 gap.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
fruediger 0:23fd064af409 276
fruediger 0:23fd064af409 277 //TODO: DECISION: advertising at minimal interval may consumes to much power, but is way faster
fruediger 9:6a28d9c0e486 278 gap.setAdvertisingInterval(gap.getMinAdvertisingInterval());
fruediger 0:23fd064af409 279
fruediger 0:23fd064af409 280 // tune the preferred connection parameters to enable transfer more often
fruediger 0:23fd064af409 281 // TODO: DECISION: also waht about power consumption?
fruediger 9:6a28d9c0e486 282 gap.getPreferredConnectionParams(&fast);
fruediger 0:23fd064af409 283 fast.minConnectionInterval = minimumConnectionInterval;
fruediger 0:23fd064af409 284 fast.maxConnectionInterval = maximumConnectionInterval;
fruediger 0:23fd064af409 285 fast.slaveLatency = slaveLatency;
fruediger 9:6a28d9c0e486 286 gap.setPreferredConnectionParams(&fast);
fruediger 10:b305e261e7d1 287
fruediger 12:dc46aa2edccd 288 DeviceInformationService deviceInformation(ble, deviceManufacturers, deviceModelNumber, deviceSerialNumber, deviceHardwareRev, deviceFirmwareRev, deviceSoftwareRev);
fruediger 9:6a28d9c0e486 289 PowerService powerService(ble);
fruediger 12:dc46aa2edccd 290 MPU6050Service mpu6050(ble, mpu, &intIn);
fruediger 5:ea4d280a0a2f 291
fruediger 9:6a28d9c0e486 292 gap.startAdvertising();
fruediger 7:af3e2b9c137a 293
fruediger 0:23fd064af409 294 while (true)
fruediger 9:6a28d9c0e486 295 {
fruediger 9:6a28d9c0e486 296 // Handle all stuff within the user context
fruediger 9:6a28d9c0e486 297
fruediger 9:6a28d9c0e486 298 if (powerServiceUpdateTrigger)
fruediger 9:6a28d9c0e486 299 powerServiceUpdateHandler(&powerService);
fruediger 9:6a28d9c0e486 300
fruediger 10:b305e261e7d1 301 if (ledTrigger)
fruediger 12:dc46aa2edccd 302 ledHandler(gap);
fruediger 9:6a28d9c0e486 303
fruediger 9:6a28d9c0e486 304 if (connectionTrigger)
fruediger 9:6a28d9c0e486 305 connectionHandler(&mpu6050);
fruediger 9:6a28d9c0e486 306
fruediger 9:6a28d9c0e486 307 if (disconnectionTrigger)
fruediger 10:b305e261e7d1 308 disconnectionHandler(gap, &mpu6050);
fruediger 9:6a28d9c0e486 309
fruediger 9:6a28d9c0e486 310 if (timeoutTrigger)
fruediger 10:b305e261e7d1 311 timeoutHandler(gap, &mpu6050);
fruediger 9:6a28d9c0e486 312
fruediger 0:23fd064af409 313 ble.waitForEvent();
fruediger 10:b305e261e7d1 314
fruediger 10:b305e261e7d1 315 mpu6050.handleService();
fruediger 9:6a28d9c0e486 316 }
fruediger 0:23fd064af409 317 }