Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of mbed-os-example-ble-LEDBlinker by
source/main.cpp@50:7dcc6a0d9c95, 2017-12-12 (annotated)
- Committer:
- wijtse
- Date:
- Tue Dec 12 10:22:18 2017 +0000
- Revision:
- 50:7dcc6a0d9c95
- Parent:
- 45:9fe6d1e21b8a
- Child:
- 51:510e74364627
first real version
Who changed what in which revision?
| User | Revision | Line number | New contents of line | 
|---|---|---|---|
| Vincent Coubard | 0:86bf1d2040b3 | 1 | /* mbed Microcontroller Library | 
| Vincent Coubard | 0:86bf1d2040b3 | 2 | * Copyright (c) 2006-2015 ARM Limited | 
| Vincent Coubard | 0:86bf1d2040b3 | 3 | * | 
| Vincent Coubard | 0:86bf1d2040b3 | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); | 
| Vincent Coubard | 0:86bf1d2040b3 | 5 | * you may not use this file except in compliance with the License. | 
| Vincent Coubard | 0:86bf1d2040b3 | 6 | * You may obtain a copy of the License at | 
| Vincent Coubard | 0:86bf1d2040b3 | 7 | * | 
| Vincent Coubard | 0:86bf1d2040b3 | 8 | * http://www.apache.org/licenses/LICENSE-2.0 | 
| Vincent Coubard | 0:86bf1d2040b3 | 9 | * | 
| Vincent Coubard | 0:86bf1d2040b3 | 10 | * Unless required by applicable law or agreed to in writing, software | 
| Vincent Coubard | 0:86bf1d2040b3 | 11 | * distributed under the License is distributed on an "AS IS" BASIS, | 
| Vincent Coubard | 0:86bf1d2040b3 | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
| Vincent Coubard | 0:86bf1d2040b3 | 13 | * See the License for the specific language governing permissions and | 
| Vincent Coubard | 0:86bf1d2040b3 | 14 | * limitations under the License. | 
| Vincent Coubard | 0:86bf1d2040b3 | 15 | */ | 
| Vincent Coubard | 0:86bf1d2040b3 | 16 | |
| mbed_official | 12:059c7b7fb18a | 17 | #include <events/mbed_events.h> | 
| Vincent Coubard | 0:86bf1d2040b3 | 18 | #include <mbed.h> | 
| Vincent Coubard | 0:86bf1d2040b3 | 19 | #include "ble/BLE.h" | 
| Vincent Coubard | 0:86bf1d2040b3 | 20 | #include "ble/DiscoveredCharacteristic.h" | 
| Vincent Coubard | 0:86bf1d2040b3 | 21 | #include "ble/DiscoveredService.h" | 
| wijtse | 50:7dcc6a0d9c95 | 22 | #include "LEDService.h" | 
| Vincent Coubard | 0:86bf1d2040b3 | 23 | |
| wijtse | 50:7dcc6a0d9c95 | 24 | DigitalOut alivenessLED(LED1, 0); | 
| wijtse | 50:7dcc6a0d9c95 | 25 | DigitalOut actuatedLED(LED2, 0); | 
| wijtse | 50:7dcc6a0d9c95 | 26 | |
| wijtse | 50:7dcc6a0d9c95 | 27 | const static char DEVICE_NAME[] = "LEDDIE"; | 
| wijtse | 50:7dcc6a0d9c95 | 28 | uint8_t NUMBER = 3; | 
| wijtse | 50:7dcc6a0d9c95 | 29 | uint8_t COUNTER = 0; | 
| wijtse | 50:7dcc6a0d9c95 | 30 | static const uint16_t uuid16_list[] = {LEDService::LED_SERVICE_UUID}; | 
| wijtse | 50:7dcc6a0d9c95 | 31 | |
| wijtse | 50:7dcc6a0d9c95 | 32 | LEDService *ledServicePtr; | 
| wijtse | 50:7dcc6a0d9c95 | 33 | |
| Vincent Coubard | 0:86bf1d2040b3 | 34 | static DiscoveredCharacteristic ledCharacteristic; | 
| Vincent Coubard | 0:86bf1d2040b3 | 35 | static bool triggerLedCharacteristic; | 
| wijtse | 50:7dcc6a0d9c95 | 36 | static const char PEER_NAME[] = "LEDDIE"; | 
| Vincent Coubard | 0:86bf1d2040b3 | 37 | |
| mbed_official | 28:64621b6587e1 | 38 | static EventQueue eventQueue(/* event count */ 16 * EVENTS_EVENT_SIZE); | 
| Vincent Coubard | 0:86bf1d2040b3 | 39 | |
| Vincent Coubard | 0:86bf1d2040b3 | 40 | void periodicCallback(void) { | 
| Vincent Coubard | 0:86bf1d2040b3 | 41 | alivenessLED = !alivenessLED; /* Do blinky on LED1 while we're waiting for BLE events */ | 
| Vincent Coubard | 0:86bf1d2040b3 | 42 | } | 
| Vincent Coubard | 0:86bf1d2040b3 | 43 | |
| Vincent Coubard | 0:86bf1d2040b3 | 44 | void advertisementCallback(const Gap::AdvertisementCallbackParams_t *params) { | 
| Vincent Coubard | 0:86bf1d2040b3 | 45 | // parse the advertising payload, looking for data type COMPLETE_LOCAL_NAME | 
| Vincent Coubard | 0:86bf1d2040b3 | 46 | // The advertising payload is a collection of key/value records where | 
| Vincent Coubard | 0:86bf1d2040b3 | 47 | // byte 0: length of the record excluding this byte | 
| Vincent Coubard | 0:86bf1d2040b3 | 48 | // byte 1: The key, it is the type of the data | 
| Vincent Coubard | 0:86bf1d2040b3 | 49 | // byte [2..N] The value. N is equal to byte0 - 1 | 
| wijtse | 50:7dcc6a0d9c95 | 50 | bool isTrustedDevice = false; | 
| wijtse | 50:7dcc6a0d9c95 | 51 | uint8_t readNumber; | 
| wijtse | 50:7dcc6a0d9c95 | 52 | uint8_t readCounter = 0; | 
| Vincent Coubard | 0:86bf1d2040b3 | 53 | for (uint8_t i = 0; i < params->advertisingDataLen; ++i) { | 
| Vincent Coubard | 0:86bf1d2040b3 | 54 | |
| Vincent Coubard | 0:86bf1d2040b3 | 55 | const uint8_t record_length = params->advertisingData[i]; | 
| Vincent Coubard | 0:86bf1d2040b3 | 56 | if (record_length == 0) { | 
| Vincent Coubard | 0:86bf1d2040b3 | 57 | continue; | 
| Vincent Coubard | 0:86bf1d2040b3 | 58 | } | 
| Vincent Coubard | 0:86bf1d2040b3 | 59 | const uint8_t type = params->advertisingData[i + 1]; | 
| Vincent Coubard | 0:86bf1d2040b3 | 60 | const uint8_t* value = params->advertisingData + i + 2; | 
| Vincent Coubard | 0:86bf1d2040b3 | 61 | const uint8_t value_length = record_length - 1; | 
| Vincent Coubard | 0:86bf1d2040b3 | 62 | |
| Vincent Coubard | 0:86bf1d2040b3 | 63 | if(type == GapAdvertisingData::COMPLETE_LOCAL_NAME) { | 
| Vincent Coubard | 0:86bf1d2040b3 | 64 | if ((value_length == sizeof(PEER_NAME)) && (memcmp(value, PEER_NAME, value_length) == 0)) { | 
| Vincent Coubard | 0:86bf1d2040b3 | 65 | printf( | 
| Vincent Coubard | 0:86bf1d2040b3 | 66 | "adv peerAddr[%02x %02x %02x %02x %02x %02x] rssi %d, isScanResponse %u, AdvertisementType %u\r\n", | 
| Vincent Coubard | 0:86bf1d2040b3 | 67 | params->peerAddr[5], params->peerAddr[4], params->peerAddr[3], params->peerAddr[2], | 
| Vincent Coubard | 0:86bf1d2040b3 | 68 | params->peerAddr[1], params->peerAddr[0], params->rssi, params->isScanResponse, params->type | 
| Vincent Coubard | 0:86bf1d2040b3 | 69 | ); | 
| wijtse | 50:7dcc6a0d9c95 | 70 | isTrustedDevice = true; | 
| Vincent Coubard | 0:86bf1d2040b3 | 71 | } | 
| Vincent Coubard | 0:86bf1d2040b3 | 72 | } | 
| wijtse | 50:7dcc6a0d9c95 | 73 | |
| wijtse | 50:7dcc6a0d9c95 | 74 | if(type == GapAdvertisingData::SERVICE_DATA && isTrustedDevice) { | 
| wijtse | 50:7dcc6a0d9c95 | 75 | printf("adv number = %d\n\r", *value); | 
| wijtse | 50:7dcc6a0d9c95 | 76 | readNumber = *value; | 
| wijtse | 50:7dcc6a0d9c95 | 77 | } | 
| wijtse | 50:7dcc6a0d9c95 | 78 | if(type == GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA && isTrustedDevice) { | 
| wijtse | 50:7dcc6a0d9c95 | 79 | printf("adv counter = %d\n\r",*value); | 
| wijtse | 50:7dcc6a0d9c95 | 80 | readCounter = *value; | 
| wijtse | 50:7dcc6a0d9c95 | 81 | } | 
| wijtse | 50:7dcc6a0d9c95 | 82 | |
| Vincent Coubard | 0:86bf1d2040b3 | 83 | i += record_length; | 
| Vincent Coubard | 0:86bf1d2040b3 | 84 | } | 
| wijtse | 50:7dcc6a0d9c95 | 85 | if (readCounter > COUNTER) { | 
| wijtse | 50:7dcc6a0d9c95 | 86 | printf("Updating number and counter because newCounter is bigger"); | 
| wijtse | 50:7dcc6a0d9c95 | 87 | NUMBER = readNumber; | 
| wijtse | 50:7dcc6a0d9c95 | 88 | COUNTER = readCounter; | 
| wijtse | 50:7dcc6a0d9c95 | 89 | |
| wijtse | 50:7dcc6a0d9c95 | 90 | BLE &ble = BLE::Instance(); | 
| wijtse | 50:7dcc6a0d9c95 | 91 | |
| wijtse | 50:7dcc6a0d9c95 | 92 | ble.gap().updateAdvertisingPayload(GapAdvertisingData::SERVICE_DATA , &NUMBER, sizeof(NUMBER)); | 
| wijtse | 50:7dcc6a0d9c95 | 93 | ble.gap().updateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA , &COUNTER, sizeof(COUNTER)); | 
| wijtse | 50:7dcc6a0d9c95 | 94 | ble.gap().startAdvertising(); | 
| wijtse | 50:7dcc6a0d9c95 | 95 | } | 
| Vincent Coubard | 0:86bf1d2040b3 | 96 | } | 
| Vincent Coubard | 0:86bf1d2040b3 | 97 | |
| Vincent Coubard | 0:86bf1d2040b3 | 98 | void serviceDiscoveryCallback(const DiscoveredService *service) { | 
| Vincent Coubard | 0:86bf1d2040b3 | 99 | if (service->getUUID().shortOrLong() == UUID::UUID_TYPE_SHORT) { | 
| Vincent Coubard | 0:86bf1d2040b3 | 100 | printf("S UUID-%x attrs[%u %u]\r\n", service->getUUID().getShortUUID(), service->getStartHandle(), service->getEndHandle()); | 
| Vincent Coubard | 0:86bf1d2040b3 | 101 | } else { | 
| Vincent Coubard | 0:86bf1d2040b3 | 102 | printf("S UUID-"); | 
| Vincent Coubard | 0:86bf1d2040b3 | 103 | const uint8_t *longUUIDBytes = service->getUUID().getBaseUUID(); | 
| Vincent Coubard | 0:86bf1d2040b3 | 104 | for (unsigned i = 0; i < UUID::LENGTH_OF_LONG_UUID; i++) { | 
| Vincent Coubard | 0:86bf1d2040b3 | 105 | printf("%02x", longUUIDBytes[i]); | 
| Vincent Coubard | 0:86bf1d2040b3 | 106 | } | 
| Vincent Coubard | 0:86bf1d2040b3 | 107 | printf(" attrs[%u %u]\r\n", service->getStartHandle(), service->getEndHandle()); | 
| Vincent Coubard | 0:86bf1d2040b3 | 108 | } | 
| Vincent Coubard | 0:86bf1d2040b3 | 109 | } | 
| Vincent Coubard | 0:86bf1d2040b3 | 110 | |
| Vincent Coubard | 0:86bf1d2040b3 | 111 | void updateLedCharacteristic(void) { | 
| Vincent Coubard | 0:86bf1d2040b3 | 112 | if (!BLE::Instance().gattClient().isServiceDiscoveryActive()) { | 
| Vincent Coubard | 0:86bf1d2040b3 | 113 | ledCharacteristic.read(); | 
| Vincent Coubard | 0:86bf1d2040b3 | 114 | } | 
| Vincent Coubard | 0:86bf1d2040b3 | 115 | } | 
| Vincent Coubard | 0:86bf1d2040b3 | 116 | |
| Vincent Coubard | 0:86bf1d2040b3 | 117 | void characteristicDiscoveryCallback(const DiscoveredCharacteristic *characteristicP) { | 
| Vincent Coubard | 0:86bf1d2040b3 | 118 | printf(" C UUID-%x valueAttr[%u] props[%x]\r\n", characteristicP->getUUID().getShortUUID(), characteristicP->getValueHandle(), (uint8_t)characteristicP->getProperties().broadcast()); | 
| Vincent Coubard | 0:86bf1d2040b3 | 119 | if (characteristicP->getUUID().getShortUUID() == 0xa001) { /* !ALERT! Alter this filter to suit your device. */ | 
| Vincent Coubard | 0:86bf1d2040b3 | 120 | ledCharacteristic = *characteristicP; | 
| Vincent Coubard | 0:86bf1d2040b3 | 121 | triggerLedCharacteristic = true; | 
| Vincent Coubard | 0:86bf1d2040b3 | 122 | } | 
| Vincent Coubard | 0:86bf1d2040b3 | 123 | } | 
| Vincent Coubard | 0:86bf1d2040b3 | 124 | |
| Vincent Coubard | 0:86bf1d2040b3 | 125 | void discoveryTerminationCallback(Gap::Handle_t connectionHandle) { | 
| Vincent Coubard | 0:86bf1d2040b3 | 126 | printf("terminated SD for handle %u\r\n", connectionHandle); | 
| Vincent Coubard | 0:86bf1d2040b3 | 127 | if (triggerLedCharacteristic) { | 
| Vincent Coubard | 0:86bf1d2040b3 | 128 | triggerLedCharacteristic = false; | 
| mbed_official | 12:059c7b7fb18a | 129 | eventQueue.call(updateLedCharacteristic); | 
| Vincent Coubard | 0:86bf1d2040b3 | 130 | } | 
| Vincent Coubard | 0:86bf1d2040b3 | 131 | } | 
| Vincent Coubard | 0:86bf1d2040b3 | 132 | |
| Vincent Coubard | 0:86bf1d2040b3 | 133 | void connectionCallback(const Gap::ConnectionCallbackParams_t *params) { | 
| Vincent Coubard | 0:86bf1d2040b3 | 134 | if (params->role == Gap::CENTRAL) { | 
| Vincent Coubard | 0:86bf1d2040b3 | 135 | BLE &ble = BLE::Instance(); | 
| Vincent Coubard | 0:86bf1d2040b3 | 136 | ble.gattClient().onServiceDiscoveryTermination(discoveryTerminationCallback); | 
| Vincent Coubard | 0:86bf1d2040b3 | 137 | ble.gattClient().launchServiceDiscovery(params->handle, serviceDiscoveryCallback, characteristicDiscoveryCallback, 0xa000, 0xa001); | 
| Vincent Coubard | 0:86bf1d2040b3 | 138 | } | 
| Vincent Coubard | 0:86bf1d2040b3 | 139 | } | 
| Vincent Coubard | 0:86bf1d2040b3 | 140 | |
| Vincent Coubard | 0:86bf1d2040b3 | 141 | void triggerToggledWrite(const GattReadCallbackParams *response) { | 
| Vincent Coubard | 0:86bf1d2040b3 | 142 | if (response->handle == ledCharacteristic.getValueHandle()) { | 
| Vincent Coubard | 0:86bf1d2040b3 | 143 | printf("triggerToggledWrite: handle %u, offset %u, len %u\r\n", response->handle, response->offset, response->len); | 
| Vincent Coubard | 0:86bf1d2040b3 | 144 | for (unsigned index = 0; index < response->len; index++) { | 
| Vincent Coubard | 0:86bf1d2040b3 | 145 | printf("%c[%02x]", response->data[index], response->data[index]); | 
| Vincent Coubard | 0:86bf1d2040b3 | 146 | } | 
| Vincent Coubard | 0:86bf1d2040b3 | 147 | printf("\r\n"); | 
| Vincent Coubard | 0:86bf1d2040b3 | 148 | |
| Vincent Coubard | 0:86bf1d2040b3 | 149 | uint8_t toggledValue = response->data[0] ^ 0x1; | 
| Vincent Coubard | 0:86bf1d2040b3 | 150 | ledCharacteristic.write(1, &toggledValue); | 
| Vincent Coubard | 0:86bf1d2040b3 | 151 | } | 
| Vincent Coubard | 0:86bf1d2040b3 | 152 | } | 
| Vincent Coubard | 0:86bf1d2040b3 | 153 | |
| Vincent Coubard | 0:86bf1d2040b3 | 154 | void triggerRead(const GattWriteCallbackParams *response) { | 
| Vincent Coubard | 0:86bf1d2040b3 | 155 | if (response->handle == ledCharacteristic.getValueHandle()) { | 
| Vincent Coubard | 0:86bf1d2040b3 | 156 | ledCharacteristic.read(); | 
| Vincent Coubard | 0:86bf1d2040b3 | 157 | } | 
| Vincent Coubard | 0:86bf1d2040b3 | 158 | } | 
| Vincent Coubard | 0:86bf1d2040b3 | 159 | |
| Vincent Coubard | 0:86bf1d2040b3 | 160 | void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *) { | 
| Vincent Coubard | 0:86bf1d2040b3 | 161 | printf("disconnected\r\n"); | 
| Vincent Coubard | 0:86bf1d2040b3 | 162 | /* Start scanning and try to connect again */ | 
| Vincent Coubard | 0:86bf1d2040b3 | 163 | BLE::Instance().gap().startScan(advertisementCallback); | 
| wijtse | 50:7dcc6a0d9c95 | 164 | BLE::Instance().gap().startAdvertising(); | 
| Vincent Coubard | 0:86bf1d2040b3 | 165 | } | 
| Vincent Coubard | 0:86bf1d2040b3 | 166 | |
| Vincent Coubard | 0:86bf1d2040b3 | 167 | void onBleInitError(BLE &ble, ble_error_t error) | 
| Vincent Coubard | 0:86bf1d2040b3 | 168 | { | 
| Vincent Coubard | 0:86bf1d2040b3 | 169 | /* Initialization error handling should go here */ | 
| Vincent Coubard | 0:86bf1d2040b3 | 170 | } | 
| Vincent Coubard | 0:86bf1d2040b3 | 171 | |
| mbed_official | 45:9fe6d1e21b8a | 172 | void printMacAddress() | 
| mbed_official | 45:9fe6d1e21b8a | 173 | { | 
| mbed_official | 45:9fe6d1e21b8a | 174 | /* Print out device MAC address to the console*/ | 
| mbed_official | 45:9fe6d1e21b8a | 175 | Gap::AddressType_t addr_type; | 
| mbed_official | 45:9fe6d1e21b8a | 176 | Gap::Address_t address; | 
| mbed_official | 45:9fe6d1e21b8a | 177 | BLE::Instance().gap().getAddress(&addr_type, address); | 
| mbed_official | 45:9fe6d1e21b8a | 178 | printf("DEVICE MAC ADDRESS: "); | 
| mbed_official | 45:9fe6d1e21b8a | 179 | for (int i = 5; i >= 1; i--){ | 
| mbed_official | 45:9fe6d1e21b8a | 180 | printf("%02x:", address[i]); | 
| mbed_official | 45:9fe6d1e21b8a | 181 | } | 
| mbed_official | 45:9fe6d1e21b8a | 182 | printf("%02x\r\n", address[0]); | 
| mbed_official | 45:9fe6d1e21b8a | 183 | } | 
| mbed_official | 45:9fe6d1e21b8a | 184 | |
| wijtse | 50:7dcc6a0d9c95 | 185 | // ============================================================================ | 
| wijtse | 50:7dcc6a0d9c95 | 186 | // ============================================================================ | 
| wijtse | 50:7dcc6a0d9c95 | 187 | // ============================================================================ | 
| wijtse | 50:7dcc6a0d9c95 | 188 | |
| wijtse | 50:7dcc6a0d9c95 | 189 | /** | 
| wijtse | 50:7dcc6a0d9c95 | 190 | * This callback allows the LEDService to receive updates to the ledState Characteristic. | 
| wijtse | 50:7dcc6a0d9c95 | 191 | * | 
| wijtse | 50:7dcc6a0d9c95 | 192 | * @param[in] params | 
| wijtse | 50:7dcc6a0d9c95 | 193 | * Information about the characterisitc being updated. | 
| wijtse | 50:7dcc6a0d9c95 | 194 | */ | 
| wijtse | 50:7dcc6a0d9c95 | 195 | void onDataWrittenCallback(const GattWriteCallbackParams *params) { | 
| wijtse | 50:7dcc6a0d9c95 | 196 | if ((params->handle == ledServicePtr->getValueHandle()) && (params->len == 1)) { | 
| wijtse | 50:7dcc6a0d9c95 | 197 | |
| wijtse | 50:7dcc6a0d9c95 | 198 | COUNTER++; | 
| wijtse | 50:7dcc6a0d9c95 | 199 | NUMBER = *(params->data); | 
| wijtse | 50:7dcc6a0d9c95 | 200 | |
| wijtse | 50:7dcc6a0d9c95 | 201 | BLE &ble = BLE::Instance(); | 
| wijtse | 50:7dcc6a0d9c95 | 202 | |
| wijtse | 50:7dcc6a0d9c95 | 203 | ble.gap().updateAdvertisingPayload(GapAdvertisingData::SERVICE_DATA , &NUMBER, sizeof(NUMBER)); | 
| wijtse | 50:7dcc6a0d9c95 | 204 | ble.gap().updateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA , &COUNTER, sizeof(COUNTER)); | 
| wijtse | 50:7dcc6a0d9c95 | 205 | |
| wijtse | 50:7dcc6a0d9c95 | 206 | printf("NUMBER after change %d\n\r",NUMBER); | 
| wijtse | 50:7dcc6a0d9c95 | 207 | printf("counter after change %d\n\r",COUNTER); | 
| wijtse | 50:7dcc6a0d9c95 | 208 | |
| wijtse | 50:7dcc6a0d9c95 | 209 | } | 
| wijtse | 50:7dcc6a0d9c95 | 210 | } | 
| wijtse | 50:7dcc6a0d9c95 | 211 | |
| wijtse | 50:7dcc6a0d9c95 | 212 | // ============================================================================ | 
| wijtse | 50:7dcc6a0d9c95 | 213 | // ============================================================================ | 
| wijtse | 50:7dcc6a0d9c95 | 214 | // ============================================================================ | 
| wijtse | 50:7dcc6a0d9c95 | 215 | |
| wijtse | 50:7dcc6a0d9c95 | 216 | |
| wijtse | 50:7dcc6a0d9c95 | 217 | |
| Vincent Coubard | 0:86bf1d2040b3 | 218 | void bleInitComplete(BLE::InitializationCompleteCallbackContext *params) | 
| Vincent Coubard | 0:86bf1d2040b3 | 219 | { | 
| Vincent Coubard | 0:86bf1d2040b3 | 220 | BLE& ble = params->ble; | 
| Vincent Coubard | 0:86bf1d2040b3 | 221 | ble_error_t error = params->error; | 
| Vincent Coubard | 0:86bf1d2040b3 | 222 | |
| Vincent Coubard | 0:86bf1d2040b3 | 223 | if (error != BLE_ERROR_NONE) { | 
| Vincent Coubard | 0:86bf1d2040b3 | 224 | /* In case of error, forward the error handling to onBleInitError */ | 
| Vincent Coubard | 0:86bf1d2040b3 | 225 | onBleInitError(ble, error); | 
| Vincent Coubard | 0:86bf1d2040b3 | 226 | return; | 
| Vincent Coubard | 0:86bf1d2040b3 | 227 | } | 
| Vincent Coubard | 0:86bf1d2040b3 | 228 | |
| Vincent Coubard | 0:86bf1d2040b3 | 229 | /* Ensure that it is the default instance of BLE */ | 
| Vincent Coubard | 0:86bf1d2040b3 | 230 | if (ble.getInstanceID() != BLE::DEFAULT_INSTANCE) { | 
| Vincent Coubard | 0:86bf1d2040b3 | 231 | return; | 
| Vincent Coubard | 0:86bf1d2040b3 | 232 | } | 
| Vincent Coubard | 0:86bf1d2040b3 | 233 | |
| Vincent Coubard | 0:86bf1d2040b3 | 234 | ble.gap().onDisconnection(disconnectionCallback); | 
| wijtse | 50:7dcc6a0d9c95 | 235 | |
| wijtse | 50:7dcc6a0d9c95 | 236 | |
| Vincent Coubard | 0:86bf1d2040b3 | 237 | |
| Vincent Coubard | 0:86bf1d2040b3 | 238 | // scan interval: 400ms and scan window: 400ms. | 
| Vincent Coubard | 0:86bf1d2040b3 | 239 | // Every 400ms the device will scan for 400ms | 
| Vincent Coubard | 0:86bf1d2040b3 | 240 | // This means that the device will scan continuously. | 
| Vincent Coubard | 0:86bf1d2040b3 | 241 | ble.gap().setScanParams(400, 400); | 
| Vincent Coubard | 0:86bf1d2040b3 | 242 | ble.gap().startScan(advertisementCallback); | 
| mbed_official | 45:9fe6d1e21b8a | 243 | |
| wijtse | 50:7dcc6a0d9c95 | 244 | // ======================================================================== | 
| wijtse | 50:7dcc6a0d9c95 | 245 | // ======================================================================== | 
| wijtse | 50:7dcc6a0d9c95 | 246 | // ======================================================================== | 
| wijtse | 50:7dcc6a0d9c95 | 247 | |
| wijtse | 50:7dcc6a0d9c95 | 248 | ble.gattServer().onDataWritten(onDataWrittenCallback); | 
| wijtse | 50:7dcc6a0d9c95 | 249 | |
| wijtse | 50:7dcc6a0d9c95 | 250 | bool initialValueForLEDCharacteristic = false; | 
| wijtse | 50:7dcc6a0d9c95 | 251 | ledServicePtr = new LEDService(ble, initialValueForLEDCharacteristic); | 
| wijtse | 50:7dcc6a0d9c95 | 252 | |
| wijtse | 50:7dcc6a0d9c95 | 253 | /* setup advertising */ | 
| wijtse | 50:7dcc6a0d9c95 | 254 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); | 
| wijtse | 50:7dcc6a0d9c95 | 255 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list)); | 
| wijtse | 50:7dcc6a0d9c95 | 256 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); | 
| wijtse | 50:7dcc6a0d9c95 | 257 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::SERVICE_DATA , &NUMBER, sizeof(NUMBER)); | 
| wijtse | 50:7dcc6a0d9c95 | 258 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA , &COUNTER, sizeof(COUNTER)); | 
| wijtse | 50:7dcc6a0d9c95 | 259 | |
| wijtse | 50:7dcc6a0d9c95 | 260 | |
| wijtse | 50:7dcc6a0d9c95 | 261 | ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); | 
| wijtse | 50:7dcc6a0d9c95 | 262 | ble.gap().setAdvertisingInterval(1000); /* 1000ms. */ | 
| wijtse | 50:7dcc6a0d9c95 | 263 | ble.gap().startAdvertising(); | 
| wijtse | 50:7dcc6a0d9c95 | 264 | |
| wijtse | 50:7dcc6a0d9c95 | 265 | // ======================================================================== | 
| wijtse | 50:7dcc6a0d9c95 | 266 | // ======================================================================== | 
| wijtse | 50:7dcc6a0d9c95 | 267 | // ======================================================================== | 
| mbed_official | 45:9fe6d1e21b8a | 268 | printMacAddress(); | 
| Vincent Coubard | 0:86bf1d2040b3 | 269 | } | 
| Vincent Coubard | 0:86bf1d2040b3 | 270 | |
| Vincent Coubard | 0:86bf1d2040b3 | 271 | void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) { | 
| Vincent Coubard | 0:86bf1d2040b3 | 272 | BLE &ble = BLE::Instance(); | 
| mbed_official | 12:059c7b7fb18a | 273 | eventQueue.call(Callback<void()>(&ble, &BLE::processEvents)); | 
| Vincent Coubard | 0:86bf1d2040b3 | 274 | } | 
| Vincent Coubard | 0:86bf1d2040b3 | 275 | |
| Vincent Coubard | 0:86bf1d2040b3 | 276 | int main() | 
| Vincent Coubard | 0:86bf1d2040b3 | 277 | { | 
| Vincent Coubard | 0:86bf1d2040b3 | 278 | triggerLedCharacteristic = false; | 
| mbed_official | 12:059c7b7fb18a | 279 | eventQueue.call_every(500, periodicCallback); | 
| Vincent Coubard | 0:86bf1d2040b3 | 280 | |
| Vincent Coubard | 0:86bf1d2040b3 | 281 | BLE &ble = BLE::Instance(); | 
| Vincent Coubard | 0:86bf1d2040b3 | 282 | ble.onEventsToProcess(scheduleBleEventsProcessing); | 
| Vincent Coubard | 0:86bf1d2040b3 | 283 | ble.init(bleInitComplete); | 
| Vincent Coubard | 0:86bf1d2040b3 | 284 | |
| mbed_official | 12:059c7b7fb18a | 285 | eventQueue.dispatch_forever(); | 
| Vincent Coubard | 0:86bf1d2040b3 | 286 | |
| Vincent Coubard | 0:86bf1d2040b3 | 287 | return 0; | 
| Vincent Coubard | 0:86bf1d2040b3 | 288 | } | 
