BLE GATT-service implementation for high quantity sensor data from a MPU6050-accelerator/gyroscope
Dependencies: BLE_API mbed nRF51822 MPU6050_lib
main.cpp@1:6a40ad9ac7e5, 2015-06-24 (annotated)
- 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?
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 | 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 | } |