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