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 20:34:11 2015 +0000
Revision:
0:23fd064af409
Child:
1:6a40ad9ac7e5
initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fruediger 0:23fd064af409 1 #include "mbed.h"
fruediger 0:23fd064af409 2 #include "BLE.h"
fruediger 0:23fd064af409 3 #include "MotionOrientationService.h"
fruediger 0:23fd064af409 4
fruediger 0:23fd064af409 5 static const char deviceName[] = "nano bear";
fruediger 0:23fd064af409 6 static const uint16_t minimumConnectionInterval = Gap::MSEC_TO_GAP_DURATION_UNITS(20); // 20ms
fruediger 0:23fd064af409 7 static const uint16_t maximumConnectionInterval = Gap::MSEC_TO_GAP_DURATION_UNITS(40); // 40ms;
fruediger 0:23fd064af409 8 static const uint16_t slaveLatency = 0;
fruediger 0:23fd064af409 9
fruediger 0:23fd064af409 10 BLE ble;
fruediger 0:23fd064af409 11 Gap::ConnectionParams_t fast;
fruediger 0:23fd064af409 12
fruediger 0:23fd064af409 13 MotionOrientationService *mos;
fruediger 0:23fd064af409 14
fruediger 0:23fd064af409 15 DigitalOut led(LED1);
fruediger 0:23fd064af409 16 Ticker ticker;
fruediger 0:23fd064af409 17
fruediger 0:23fd064af409 18 inline Gap &gap()
fruediger 0:23fd064af409 19 {
fruediger 0:23fd064af409 20 // get us the corresponding Gap instance only once and then save and reuse that instance
fruediger 0:23fd064af409 21 // (the underlying Gap instance shouldn't change on the BLE object)
fruediger 0:23fd064af409 22 static Gap &gap = ble.gap();
fruediger 0:23fd064af409 23 return gap;
fruediger 0:23fd064af409 24 }
fruediger 0:23fd064af409 25
fruediger 0:23fd064af409 26 void periodicCallback()
fruediger 0:23fd064af409 27 {
fruediger 0:23fd064af409 28 led = gap().getState().connected ? 1 : !led;
fruediger 0:23fd064af409 29 }
fruediger 0:23fd064af409 30
fruediger 0:23fd064af409 31 void timeoutCallback(Gap::TimeoutSource_t)
fruediger 0:23fd064af409 32 {
fruediger 0:23fd064af409 33 gap().startAdvertising();
fruediger 0:23fd064af409 34 }
fruediger 0:23fd064af409 35
fruediger 0:23fd064af409 36 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
fruediger 0:23fd064af409 37 {
fruediger 0:23fd064af409 38 gap().startAdvertising();
fruediger 0:23fd064af409 39 }
fruediger 0:23fd064af409 40
fruediger 0:23fd064af409 41 void connectionCallback(const Gap::ConnectionCallbackParams_t *params)
fruediger 0:23fd064af409 42 {
fruediger 0:23fd064af409 43 // update the connection parameters with the tuned fast ones
fruediger 0:23fd064af409 44 ble.updateConnectionParams(params->handle, &fast);
fruediger 0:23fd064af409 45
fruediger 0:23fd064af409 46 // start polling and sending sensor data
fruediger 0:23fd064af409 47 mos->start();
fruediger 0:23fd064af409 48 }
fruediger 0:23fd064af409 49
fruediger 0:23fd064af409 50 int main()
fruediger 0:23fd064af409 51 {
fruediger 0:23fd064af409 52 ticker.attach(periodicCallback, 0.2f);
fruediger 0:23fd064af409 53
fruediger 0:23fd064af409 54 ble.init();
fruediger 0:23fd064af409 55
fruediger 0:23fd064af409 56 gap().onTimeout(timeoutCallback);
fruediger 0:23fd064af409 57 gap().onDisconnection(disconnectionCallback);
fruediger 0:23fd064af409 58 gap().onConnection(connectionCallback);
fruediger 0:23fd064af409 59
fruediger 0:23fd064af409 60 gap().setDeviceName((const uint8_t*)deviceName);
fruediger 0:23fd064af409 61
fruediger 0:23fd064af409 62 gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
fruediger 0:23fd064af409 63 gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (const uint8_t*)deviceName, sizeof(deviceName));
fruediger 0:23fd064af409 64 gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
fruediger 0:23fd064af409 65
fruediger 0:23fd064af409 66 //TODO: DECISION: advertising at minimal interval may consumes to much power, but is way faster
fruediger 0:23fd064af409 67 gap().setAdvertisingInterval(gap().getMinAdvertisingInterval());
fruediger 0:23fd064af409 68
fruediger 0:23fd064af409 69 // tune the preferred connection parameters to enable transfer more often
fruediger 0:23fd064af409 70 // TODO: DECISION: also waht about power consumption?
fruediger 0:23fd064af409 71 gap().getPreferredConnectionParams(&fast);
fruediger 0:23fd064af409 72 fast.minConnectionInterval = minimumConnectionInterval;
fruediger 0:23fd064af409 73 fast.maxConnectionInterval = maximumConnectionInterval;
fruediger 0:23fd064af409 74 fast.slaveLatency = slaveLatency;
fruediger 0:23fd064af409 75 gap().setPreferredConnectionParams(&fast);
fruediger 0:23fd064af409 76
fruediger 0:23fd064af409 77 gap().startAdvertising();
fruediger 0:23fd064af409 78
fruediger 0:23fd064af409 79 MotionOrientationService _mos(ble);
fruediger 0:23fd064af409 80 mos = &_mos;
fruediger 0:23fd064af409 81
fruediger 0:23fd064af409 82 while (true)
fruediger 0:23fd064af409 83 ble.waitForEvent();
fruediger 0:23fd064af409 84 }