ble transmitter
Dependencies: mbed BLE_API nRF51822
transmitter_main.cpp@9:aa9d34bbb46c, 2019-04-19 (annotated)
- Committer:
- khyein8154
- Date:
- Fri Apr 19 07:03:57 2019 +0000
- Revision:
- 9:aa9d34bbb46c
- Parent:
- 8:2d82653c8ffd
Increment the sequence number and send new packets with increasing sequence number
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
aidanjabb | 0:37b6e6dc1a2f | 1 | #include "mbed.h" |
aidanjabb | 0:37b6e6dc1a2f | 2 | #include "ble/BLE.h" |
jzabins2 | 2:f8dfdded83bf | 3 | |
khyein8154 | 5:c7bbaa34373a | 4 | Serial pc(USBTX, USBRX); |
khyein8154 | 5:c7bbaa34373a | 5 | |
aidanjabb | 0:37b6e6dc1a2f | 6 | #define LED_RED p22 |
jzabins2 | 2:f8dfdded83bf | 7 | #define LED_GREEN p21 |
jzabins2 | 2:f8dfdded83bf | 8 | #define LED_BLUE p23 |
jzabins2 | 2:f8dfdded83bf | 9 | #define BUTTON_PIN p17 |
jzabins2 | 2:f8dfdded83bf | 10 | #define BATTERY_PIN p1 |
jzabins2 | 2:f8dfdded83bf | 11 | |
khyein8154 | 9:aa9d34bbb46c | 12 | DigitalOut greenLed(LED_GREEN); |
aidanjabb | 0:37b6e6dc1a2f | 13 | |
jzabins2 | 2:f8dfdded83bf | 14 | struct Packet { |
khyein8154 | 9:aa9d34bbb46c | 15 | uint8_t seqNum; |
jzabins2 | 4:c3123e9e7d39 | 16 | |
jzabins2 | 4:c3123e9e7d39 | 17 | Packet() : seqNum(0) {} |
jzabins2 | 2:f8dfdded83bf | 18 | }; |
khyein8154 | 9:aa9d34bbb46c | 19 | uint8_t seqNum2 = 7; |
jzabins2 | 2:f8dfdded83bf | 20 | |
jzabins2 | 3:76b8337374e7 | 21 | BLE ble; |
khyein8154 | 9:aa9d34bbb46c | 22 | Packet packet; |
khyein8154 | 9:aa9d34bbb46c | 23 | const static char DEVICE_NAME[] = "Transmitter"; |
aidanjabb | 0:37b6e6dc1a2f | 24 | static volatile bool triggerSensorPolling = false; |
jzabins2 | 3:76b8337374e7 | 25 | |
aidanjabb | 0:37b6e6dc1a2f | 26 | void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) |
aidanjabb | 0:37b6e6dc1a2f | 27 | { |
khyein8154 | 9:aa9d34bbb46c | 28 | ble.gap().startAdvertising(); // restart advertising |
jzabins2 | 3:76b8337374e7 | 29 | } |
jzabins2 | 3:76b8337374e7 | 30 | |
aidanjabb | 0:37b6e6dc1a2f | 31 | void periodicCallback(void) |
aidanjabb | 0:37b6e6dc1a2f | 32 | { |
khyein8154 | 9:aa9d34bbb46c | 33 | greenLed = !greenLed; /* Do blinky on greenLed while we're waiting for BLE events */ |
khyein8154 | 9:aa9d34bbb46c | 34 | //we can't do anything related gap() inside here! |
khyein8154 | 9:aa9d34bbb46c | 35 | //will get error and fault handler will be triggered |
jzabins2 | 3:76b8337374e7 | 36 | |
aidanjabb | 0:37b6e6dc1a2f | 37 | /* Note that the periodicCallback() executes in interrupt context, so it is safer to do |
aidanjabb | 0:37b6e6dc1a2f | 38 | * heavy-weight sensor polling from the main thread. */ |
aidanjabb | 0:37b6e6dc1a2f | 39 | triggerSensorPolling = true; |
aidanjabb | 0:37b6e6dc1a2f | 40 | } |
jzabins2 | 3:76b8337374e7 | 41 | |
aidanjabb | 0:37b6e6dc1a2f | 42 | void bleInitComplete(BLE::InitializationCompleteCallbackContext *params) |
aidanjabb | 0:37b6e6dc1a2f | 43 | { |
khyein8154 | 9:aa9d34bbb46c | 44 | BLE &localBle = params->ble; |
aidanjabb | 0:37b6e6dc1a2f | 45 | ble_error_t error = params->error; |
jzabins2 | 3:76b8337374e7 | 46 | |
aidanjabb | 0:37b6e6dc1a2f | 47 | if (error != BLE_ERROR_NONE) { |
aidanjabb | 0:37b6e6dc1a2f | 48 | return; |
aidanjabb | 0:37b6e6dc1a2f | 49 | } |
jzabins2 | 3:76b8337374e7 | 50 | |
khyein8154 | 9:aa9d34bbb46c | 51 | /* Ensure that it is the default instance of BLE */ |
khyein8154 | 9:aa9d34bbb46c | 52 | if (localBle.getInstanceID() != BLE::DEFAULT_INSTANCE) { |
khyein8154 | 9:aa9d34bbb46c | 53 | return; |
khyein8154 | 9:aa9d34bbb46c | 54 | } |
jzabins2 | 3:76b8337374e7 | 55 | |
khyein8154 | 9:aa9d34bbb46c | 56 | localBle.gap().onDisconnection(disconnectionCallback); |
jzabins2 | 8:2d82653c8ffd | 57 | |
khyein8154 | 9:aa9d34bbb46c | 58 | // localBle.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); |
khyein8154 | 9:aa9d34bbb46c | 59 | // localBle.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); |
khyein8154 | 9:aa9d34bbb46c | 60 | // localBle.gap().accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t *)&packet, sizeof(packet)); |
khyein8154 | 9:aa9d34bbb46c | 61 | localBle.gap().clearAdvertisingPayload(); |
khyein8154 | 9:aa9d34bbb46c | 62 | localBle.gap().accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t *)&packet.seqNum, sizeof(packet.seqNum)); |
khyein8154 | 9:aa9d34bbb46c | 63 | pc.printf("73: payload: %x\n", localBle.gap().getAdvertisingPayload()); |
aidanjabb | 0:37b6e6dc1a2f | 64 | } |
jzabins2 | 3:76b8337374e7 | 65 | |
aidanjabb | 0:37b6e6dc1a2f | 66 | int main(void) |
aidanjabb | 0:37b6e6dc1a2f | 67 | { |
khyein8154 | 9:aa9d34bbb46c | 68 | greenLed = 1; |
jzabins2 | 3:76b8337374e7 | 69 | |
aidanjabb | 0:37b6e6dc1a2f | 70 | Ticker ticker; |
khyein8154 | 9:aa9d34bbb46c | 71 | ticker.attach(periodicCallback, 5); |
jzabins2 | 3:76b8337374e7 | 72 | |
aidanjabb | 0:37b6e6dc1a2f | 73 | ble.init(bleInitComplete); |
aidanjabb | 0:37b6e6dc1a2f | 74 | |
aidanjabb | 0:37b6e6dc1a2f | 75 | /* SpinWait for initialization to complete. This is necessary because the |
aidanjabb | 0:37b6e6dc1a2f | 76 | * BLE object is used in the main loop below. */ |
khyein8154 | 9:aa9d34bbb46c | 77 | while (ble.hasInitialized() == false) { |
khyein8154 | 9:aa9d34bbb46c | 78 | pc.printf("Initializing BLE\n"); |
khyein8154 | 9:aa9d34bbb46c | 79 | } |
khyein8154 | 9:aa9d34bbb46c | 80 | |
khyein8154 | 9:aa9d34bbb46c | 81 | pc.printf("Init Completed\n"); |
khyein8154 | 9:aa9d34bbb46c | 82 | |
khyein8154 | 9:aa9d34bbb46c | 83 | ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
khyein8154 | 9:aa9d34bbb46c | 84 | ble.gap().setAdvertisingInterval(1000); /* 1000ms */ |
khyein8154 | 9:aa9d34bbb46c | 85 | ble.gap().setAdvertisingTimeout(0); |
khyein8154 | 9:aa9d34bbb46c | 86 | ble.gap().startAdvertising(); |
aidanjabb | 0:37b6e6dc1a2f | 87 | |
aidanjabb | 0:37b6e6dc1a2f | 88 | while (1) { |
aidanjabb | 0:37b6e6dc1a2f | 89 | // check for trigger from periodicCallback() |
khyein8154 | 9:aa9d34bbb46c | 90 | if (triggerSensorPolling) { |
khyein8154 | 9:aa9d34bbb46c | 91 | (packet.seqNum)++; |
khyein8154 | 9:aa9d34bbb46c | 92 | pc.printf("seq_num: %d\n", packet.seqNum); |
khyein8154 | 9:aa9d34bbb46c | 93 | ble.gap().clearAdvertisingPayload(); |
khyein8154 | 9:aa9d34bbb46c | 94 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t *)&packet.seqNum, sizeof(packet.seqNum)); |
khyein8154 | 9:aa9d34bbb46c | 95 | pc.printf("47: payload: %x\n", ble.gap().getAdvertisingPayload()); |
khyein8154 | 9:aa9d34bbb46c | 96 | |
aidanjabb | 0:37b6e6dc1a2f | 97 | triggerSensorPolling = false; |
khyein8154 | 9:aa9d34bbb46c | 98 | } |
khyein8154 | 9:aa9d34bbb46c | 99 | ble.waitForEvent(); |
aidanjabb | 0:37b6e6dc1a2f | 100 | } |
aidanjabb | 0:37b6e6dc1a2f | 101 | } |