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

Dependencies:   BLE_API mbed nRF51822 MPU6050_lib

Committer:
fruediger
Date:
Wed Jul 22 16:03:03 2015 +0000
Revision:
9:6a28d9c0e486
Parent:
7:af3e2b9c137a
Child:
10:b305e261e7d1
implemented the MPU6050Service

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