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 Jun 24 21:49:51 2015 +0000
Revision:
1:6a40ad9ac7e5
Parent:
0:23fd064af409
Child:
3:d72d9195dc26
added blink sequences to indicate connection state

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 0:23fd064af409 6 #include "MotionOrientationService.h"
fruediger 0:23fd064af409 7
fruediger 1:6a40ad9ac7e5 8
fruediger 1:6a40ad9ac7e5 9
fruediger 1:6a40ad9ac7e5 10 /** Constants */
fruediger 1:6a40ad9ac7e5 11
fruediger 1:6a40ad9ac7e5 12 static const char deviceName[] = "nano bear " XSTRING_(MBED_BUILD_TIMESTAMP);
fruediger 1:6a40ad9ac7e5 13
fruediger 0:23fd064af409 14 static const uint16_t minimumConnectionInterval = Gap::MSEC_TO_GAP_DURATION_UNITS(20); // 20ms
fruediger 0:23fd064af409 15 static const uint16_t maximumConnectionInterval = Gap::MSEC_TO_GAP_DURATION_UNITS(40); // 40ms;
fruediger 0:23fd064af409 16 static const uint16_t slaveLatency = 0;
fruediger 0:23fd064af409 17
fruediger 1:6a40ad9ac7e5 18 static const float tickerTimeout = 0.2f;
fruediger 1:6a40ad9ac7e5 19 static const uint8_t connectedBlinkSequ[] = {1, 1, 1, 0};
fruediger 1:6a40ad9ac7e5 20 static const uint8_t disconnectedBlinkSequ[] = {1, 0, 1, 0, 1, 0, 0, 0};
fruediger 1:6a40ad9ac7e5 21
fruediger 1:6a40ad9ac7e5 22
fruediger 1:6a40ad9ac7e5 23
fruediger 1:6a40ad9ac7e5 24 /** Global variables */
fruediger 1:6a40ad9ac7e5 25
fruediger 0:23fd064af409 26 BLE ble;
fruediger 0:23fd064af409 27 Gap::ConnectionParams_t fast;
fruediger 0:23fd064af409 28
fruediger 0:23fd064af409 29 MotionOrientationService *mos;
fruediger 0:23fd064af409 30
fruediger 0:23fd064af409 31 DigitalOut led(LED1);
fruediger 0:23fd064af409 32 Ticker ticker;
fruediger 0:23fd064af409 33
fruediger 1:6a40ad9ac7e5 34
fruediger 1:6a40ad9ac7e5 35
fruediger 1:6a40ad9ac7e5 36 /** Helper functions */
fruediger 1:6a40ad9ac7e5 37
fruediger 0:23fd064af409 38 inline Gap &gap()
fruediger 0:23fd064af409 39 {
fruediger 0:23fd064af409 40 // get us the corresponding Gap instance only once and then save and reuse that instance
fruediger 0:23fd064af409 41 // (the underlying Gap instance shouldn't change on the BLE object)
fruediger 0:23fd064af409 42 static Gap &gap = ble.gap();
fruediger 0:23fd064af409 43 return gap;
fruediger 0:23fd064af409 44 }
fruediger 0:23fd064af409 45
fruediger 1:6a40ad9ac7e5 46 void blink(const uint8_t sequence[])
fruediger 1:6a40ad9ac7e5 47 {
fruediger 1:6a40ad9ac7e5 48 static int n = -1;
fruediger 1:6a40ad9ac7e5 49
fruediger 1:6a40ad9ac7e5 50 n = ((n + 1) % sizeof(sequence));
fruediger 1:6a40ad9ac7e5 51
fruediger 1:6a40ad9ac7e5 52 led = sequence[n];
fruediger 1:6a40ad9ac7e5 53 }
fruediger 1:6a40ad9ac7e5 54
fruediger 1:6a40ad9ac7e5 55
fruediger 1:6a40ad9ac7e5 56
fruediger 1:6a40ad9ac7e5 57 /** Callback functions */
fruediger 1:6a40ad9ac7e5 58
fruediger 0:23fd064af409 59 void periodicCallback()
fruediger 0:23fd064af409 60 {
fruediger 1:6a40ad9ac7e5 61 blink(gap().getState().connected ? connectedBlinkSequ : disconnectedBlinkSequ);
fruediger 0:23fd064af409 62 }
fruediger 0:23fd064af409 63
fruediger 0:23fd064af409 64 void timeoutCallback(Gap::TimeoutSource_t)
fruediger 0:23fd064af409 65 {
fruediger 0:23fd064af409 66 gap().startAdvertising();
fruediger 0:23fd064af409 67 }
fruediger 0:23fd064af409 68
fruediger 0:23fd064af409 69 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
fruediger 0:23fd064af409 70 {
fruediger 0:23fd064af409 71 gap().startAdvertising();
fruediger 0:23fd064af409 72 }
fruediger 0:23fd064af409 73
fruediger 0:23fd064af409 74 void connectionCallback(const Gap::ConnectionCallbackParams_t *params)
fruediger 0:23fd064af409 75 {
fruediger 0:23fd064af409 76 // update the connection parameters with the tuned fast ones
fruediger 0:23fd064af409 77 ble.updateConnectionParams(params->handle, &fast);
fruediger 0:23fd064af409 78
fruediger 0:23fd064af409 79 // start polling and sending sensor data
fruediger 0:23fd064af409 80 mos->start();
fruediger 0:23fd064af409 81 }
fruediger 0:23fd064af409 82
fruediger 1:6a40ad9ac7e5 83
fruediger 1:6a40ad9ac7e5 84
fruediger 1:6a40ad9ac7e5 85 /** Main */
fruediger 1:6a40ad9ac7e5 86
fruediger 0:23fd064af409 87 int main()
fruediger 1:6a40ad9ac7e5 88 {
fruediger 1:6a40ad9ac7e5 89 led = 0;
fruediger 1:6a40ad9ac7e5 90
fruediger 0:23fd064af409 91 ble.init();
fruediger 1:6a40ad9ac7e5 92
fruediger 1:6a40ad9ac7e5 93 ticker.attach(periodicCallback, tickerTimeout);
fruediger 0:23fd064af409 94
fruediger 0:23fd064af409 95 gap().onTimeout(timeoutCallback);
fruediger 0:23fd064af409 96 gap().onDisconnection(disconnectionCallback);
fruediger 0:23fd064af409 97 gap().onConnection(connectionCallback);
fruediger 0:23fd064af409 98
fruediger 0:23fd064af409 99 gap().setDeviceName((const uint8_t*)deviceName);
fruediger 0:23fd064af409 100
fruediger 0:23fd064af409 101 gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
fruediger 0:23fd064af409 102 gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (const uint8_t*)deviceName, sizeof(deviceName));
fruediger 0:23fd064af409 103 gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
fruediger 0:23fd064af409 104
fruediger 0:23fd064af409 105 //TODO: DECISION: advertising at minimal interval may consumes to much power, but is way faster
fruediger 0:23fd064af409 106 gap().setAdvertisingInterval(gap().getMinAdvertisingInterval());
fruediger 0:23fd064af409 107
fruediger 0:23fd064af409 108 // tune the preferred connection parameters to enable transfer more often
fruediger 0:23fd064af409 109 // TODO: DECISION: also waht about power consumption?
fruediger 0:23fd064af409 110 gap().getPreferredConnectionParams(&fast);
fruediger 0:23fd064af409 111 fast.minConnectionInterval = minimumConnectionInterval;
fruediger 0:23fd064af409 112 fast.maxConnectionInterval = maximumConnectionInterval;
fruediger 0:23fd064af409 113 fast.slaveLatency = slaveLatency;
fruediger 0:23fd064af409 114 gap().setPreferredConnectionParams(&fast);
fruediger 0:23fd064af409 115
fruediger 0:23fd064af409 116 gap().startAdvertising();
fruediger 0:23fd064af409 117
fruediger 0:23fd064af409 118 MotionOrientationService _mos(ble);
fruediger 0:23fd064af409 119 mos = &_mos;
fruediger 0:23fd064af409 120
fruediger 0:23fd064af409 121 while (true)
fruediger 0:23fd064af409 122 ble.waitForEvent();
fruediger 0:23fd064af409 123 }