
BLE GATT-service implementation for high quantity sensor data from a MPU6050-accelerator/gyroscope
Dependencies: BLE_API mbed nRF51822 MPU6050_lib
main.cpp@3:d72d9195dc26, 2015-06-25 (annotated)
- 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?
User | Revision | Line number | New 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 | } |