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

Dependencies:   BLE_API mbed nRF51822 MPU6050_lib

Committer:
fruediger
Date:
Thu Jun 25 14:35:26 2015 +0000
Revision:
3:d72d9195dc26
Parent:
1:6a40ad9ac7e5
Child:
4:a97e6917f731
changed service name to MPU6050Service,; changed service architecture,; prepared service for the MPU6050 communication on I?C,; tweaked blinky a little

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 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 3:d72d9195dc26 18 static const float tickerTimeout = 0.1f;
fruediger 3:d72d9195dc26 19 static const float connectedBlinkSequ[] = { 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f,
fruediger 3:d72d9195dc26 20 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f,
fruediger 3:d72d9195dc26 21 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f,
fruediger 3:d72d9195dc26 22 0.000f, 0.000f, 0.000f, 0.000f, 0.000f, 0.000f,
fruediger 3:d72d9195dc26 23 0.000f, 0.067f, 0.250f, 0.500f, 0.750f, 0.933f,
fruediger 3:d72d9195dc26 24 1.000f, 0.933f, 0.750f, 0.500f, 0.250f, 0.067f };
fruediger 3:d72d9195dc26 25 static const float disconnectedBlinkSequ[] = { 1.000f, 0.933f, 0.750f, 0.500f, 0.250f, 0.067f,
fruediger 3:d72d9195dc26 26 0.000f, 0.067f, 0.250f, 0.500f, 0.750f, 0.933f,
fruediger 3:d72d9195dc26 27 1.000f, 0.933f, 0.750f, 0.500f, 0.250f, 0.067f,
fruediger 3:d72d9195dc26 28 0.000f, 0.067f, 0.250f, 0.500f, 0.750f, 0.933f,
fruediger 3:d72d9195dc26 29 1.000f, 0.933f, 0.750f, 0.500f, 0.250f, 0.067f,
fruediger 3:d72d9195dc26 30 0.000f, 0.067f, 0.250f, 0.500f, 0.750f, 0.933f,
fruediger 3:d72d9195dc26 31 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f,
fruediger 3:d72d9195dc26 32 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f,
fruediger 3:d72d9195dc26 33 1.000f, 1.000f, 1.000f, 1.000f, 1.000f, 1.000f };
fruediger 1:6a40ad9ac7e5 34
fruediger 1:6a40ad9ac7e5 35
fruediger 1:6a40ad9ac7e5 36
fruediger 1:6a40ad9ac7e5 37 /** Global variables */
fruediger 1:6a40ad9ac7e5 38
fruediger 3:d72d9195dc26 39 Serial pc(USBTX, USBRX);
fruediger 3:d72d9195dc26 40
fruediger 0:23fd064af409 41 BLE ble;
fruediger 0:23fd064af409 42 Gap::ConnectionParams_t fast;
fruediger 0:23fd064af409 43
fruediger 3:d72d9195dc26 44 MPU6050Service *mpu6050;
fruediger 0:23fd064af409 45
fruediger 3:d72d9195dc26 46 PwmOut led(LED1);
fruediger 0:23fd064af409 47 Ticker ticker;
fruediger 0:23fd064af409 48
fruediger 3:d72d9195dc26 49 DigitalOut pin8(P0_8);
fruediger 3:d72d9195dc26 50 DigitalOut pin10(P0_10);
fruediger 1:6a40ad9ac7e5 51
fruediger 1:6a40ad9ac7e5 52
fruediger 3:d72d9195dc26 53 /** Helpers */
fruediger 1:6a40ad9ac7e5 54
fruediger 0:23fd064af409 55 inline Gap &gap()
fruediger 0:23fd064af409 56 {
fruediger 0:23fd064af409 57 // get us the corresponding Gap instance only once and then save and reuse that instance
fruediger 0:23fd064af409 58 // (the underlying Gap instance shouldn't change on the BLE object)
fruediger 0:23fd064af409 59 static Gap &gap = ble.gap();
fruediger 0:23fd064af409 60 return gap;
fruediger 0:23fd064af409 61 }
fruediger 0:23fd064af409 62
fruediger 1:6a40ad9ac7e5 63
fruediger 1:6a40ad9ac7e5 64
fruediger 1:6a40ad9ac7e5 65 /** Callback functions */
fruediger 1:6a40ad9ac7e5 66
fruediger 0:23fd064af409 67 void periodicCallback()
fruediger 3:d72d9195dc26 68 {
fruediger 3:d72d9195dc26 69 static int n = -1;
fruediger 3:d72d9195dc26 70 static const int connectedBlinkSequSize = sizeof(connectedBlinkSequ) / sizeof(float);
fruediger 3:d72d9195dc26 71 static const int disconnectedBlinkSequSize = sizeof(disconnectedBlinkSequ) / sizeof(float);
fruediger 3:d72d9195dc26 72
fruediger 3:d72d9195dc26 73 if (gap().getState().connected)
fruediger 3:d72d9195dc26 74 {
fruediger 3:d72d9195dc26 75 n = ((n + 1) % connectedBlinkSequSize);
fruediger 3:d72d9195dc26 76 led = connectedBlinkSequ[n];
fruediger 3:d72d9195dc26 77 }
fruediger 3:d72d9195dc26 78 else
fruediger 3:d72d9195dc26 79 {
fruediger 3:d72d9195dc26 80 n = ((n + 1) % disconnectedBlinkSequSize);
fruediger 3:d72d9195dc26 81 led = disconnectedBlinkSequ[n];
fruediger 3:d72d9195dc26 82 }
fruediger 3:d72d9195dc26 83
fruediger 3:d72d9195dc26 84 static int m = -1;
fruediger 3:d72d9195dc26 85
fruediger 3:d72d9195dc26 86 m = (m + 1) % 20;
fruediger 3:d72d9195dc26 87 if (m == 0)
fruediger 3:d72d9195dc26 88 {
fruediger 3:d72d9195dc26 89 pin8 = !pin8;
fruediger 3:d72d9195dc26 90 pin10 = !pin10;
fruediger 3:d72d9195dc26 91 }
fruediger 0:23fd064af409 92 }
fruediger 0:23fd064af409 93
fruediger 0:23fd064af409 94 void timeoutCallback(Gap::TimeoutSource_t)
fruediger 0:23fd064af409 95 {
fruediger 0:23fd064af409 96 gap().startAdvertising();
fruediger 0:23fd064af409 97 }
fruediger 0:23fd064af409 98
fruediger 0:23fd064af409 99 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
fruediger 0:23fd064af409 100 {
fruediger 0:23fd064af409 101 gap().startAdvertising();
fruediger 0:23fd064af409 102 }
fruediger 0:23fd064af409 103
fruediger 0:23fd064af409 104 void connectionCallback(const Gap::ConnectionCallbackParams_t *params)
fruediger 0:23fd064af409 105 {
fruediger 0:23fd064af409 106 // update the connection parameters with the tuned fast ones
fruediger 0:23fd064af409 107 ble.updateConnectionParams(params->handle, &fast);
fruediger 0:23fd064af409 108
fruediger 0:23fd064af409 109 // start polling and sending sensor data
fruediger 3:d72d9195dc26 110 mpu6050->start();
fruediger 0:23fd064af409 111 }
fruediger 0:23fd064af409 112
fruediger 1:6a40ad9ac7e5 113
fruediger 1:6a40ad9ac7e5 114
fruediger 1:6a40ad9ac7e5 115 /** Main */
fruediger 1:6a40ad9ac7e5 116
fruediger 0:23fd064af409 117 int main()
fruediger 1:6a40ad9ac7e5 118 {
fruediger 1:6a40ad9ac7e5 119 led = 0;
fruediger 3:d72d9195dc26 120
fruediger 3:d72d9195dc26 121 pin8 = 0;
fruediger 3:d72d9195dc26 122 pin10 = 0;
fruediger 1:6a40ad9ac7e5 123
fruediger 0:23fd064af409 124 ble.init();
fruediger 1:6a40ad9ac7e5 125
fruediger 1:6a40ad9ac7e5 126 ticker.attach(periodicCallback, tickerTimeout);
fruediger 0:23fd064af409 127
fruediger 0:23fd064af409 128 gap().onTimeout(timeoutCallback);
fruediger 0:23fd064af409 129 gap().onDisconnection(disconnectionCallback);
fruediger 0:23fd064af409 130 gap().onConnection(connectionCallback);
fruediger 0:23fd064af409 131
fruediger 0:23fd064af409 132 gap().setDeviceName((const uint8_t*)deviceName);
fruediger 0:23fd064af409 133
fruediger 0:23fd064af409 134 gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
fruediger 0:23fd064af409 135 gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (const uint8_t*)deviceName, sizeof(deviceName));
fruediger 0:23fd064af409 136 gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
fruediger 0:23fd064af409 137
fruediger 0:23fd064af409 138 //TODO: DECISION: advertising at minimal interval may consumes to much power, but is way faster
fruediger 0:23fd064af409 139 gap().setAdvertisingInterval(gap().getMinAdvertisingInterval());
fruediger 0:23fd064af409 140
fruediger 0:23fd064af409 141 // tune the preferred connection parameters to enable transfer more often
fruediger 0:23fd064af409 142 // TODO: DECISION: also waht about power consumption?
fruediger 0:23fd064af409 143 gap().getPreferredConnectionParams(&fast);
fruediger 0:23fd064af409 144 fast.minConnectionInterval = minimumConnectionInterval;
fruediger 0:23fd064af409 145 fast.maxConnectionInterval = maximumConnectionInterval;
fruediger 0:23fd064af409 146 fast.slaveLatency = slaveLatency;
fruediger 0:23fd064af409 147 gap().setPreferredConnectionParams(&fast);
fruediger 0:23fd064af409 148
fruediger 0:23fd064af409 149 gap().startAdvertising();
fruediger 0:23fd064af409 150
fruediger 3:d72d9195dc26 151 MPU6050Service _mpu6050(ble);
fruediger 3:d72d9195dc26 152 mpu6050 = &_mpu6050;
fruediger 0:23fd064af409 153
fruediger 0:23fd064af409 154 while (true)
fruediger 0:23fd064af409 155 ble.waitForEvent();
fruediger 0:23fd064af409 156 }