Exercise 4 Calzana Iandiorio

Committer:
mcalzana
Date:
Fri Nov 30 16:29:55 2018 +0000
Revision:
2:59e9845ddbb6
Parent:
1:7b8b65fd1d74
Exercise 4

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mcalzana 0:c544827b6b11 1 /* mbed Microcontroller Library
mcalzana 0:c544827b6b11 2 * Copyright (c) 2006-2015 ARM Limited
mcalzana 0:c544827b6b11 3 *
mcalzana 0:c544827b6b11 4 * Licensed under the Apache License, Version 2.0 (the "License");
mcalzana 0:c544827b6b11 5 * you may not use this file except in compliance with the License.
mcalzana 0:c544827b6b11 6 * You may obtain a copy of the License at
mcalzana 0:c544827b6b11 7 *
mcalzana 0:c544827b6b11 8 * http://www.apache.org/licenses/LICENSE-2.0
mcalzana 0:c544827b6b11 9 *
mcalzana 0:c544827b6b11 10 * Unless required by applicable law or agreed to in writing, software
mcalzana 0:c544827b6b11 11 * distributed under the License is distributed on an "AS IS" BASIS,
mcalzana 0:c544827b6b11 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mcalzana 0:c544827b6b11 13 * See the License for the specific language governing permissions and
mcalzana 0:c544827b6b11 14 * limitations under the License.
mcalzana 0:c544827b6b11 15 */
mcalzana 0:c544827b6b11 16
mcalzana 0:c544827b6b11 17 #include <events/mbed_events.h>
mcalzana 0:c544827b6b11 18 #include <mbed.h>
mcalzana 0:c544827b6b11 19 #include "ble/BLE.h"
mcalzana 0:c544827b6b11 20 #include "ble/DiscoveredCharacteristic.h"
mcalzana 0:c544827b6b11 21 #include "ble/DiscoveredService.h"
mcalzana 0:c544827b6b11 22
mcalzana 2:59e9845ddbb6 23 static DigitalOut led1(LED1);
mcalzana 2:59e9845ddbb6 24 static DigitalOut led2(LED2);
mcalzana 2:59e9845ddbb6 25 static DigitalOut led3(LED3);
mcalzana 2:59e9845ddbb6 26 static bool blinkLed1 = false;
mcalzana 2:59e9845ddbb6 27 static bool blinkLed2 = false;
mcalzana 2:59e9845ddbb6 28 static bool blinkLed3 = false;
mcalzana 0:c544827b6b11 29 static DiscoveredCharacteristic ledCharacteristic;
mcalzana 0:c544827b6b11 30 static bool triggerLedCharacteristic;
mcalzana 0:c544827b6b11 31 static const char PEER_NAME[] = "LED666";
mcalzana 0:c544827b6b11 32 static uint8_t toggledValue = 0x0;
mcalzana 0:c544827b6b11 33 InterruptIn button(USER_BUTTON);
mcalzana 0:c544827b6b11 34
mcalzana 0:c544827b6b11 35 static EventQueue eventQueue(/* event count */ 16 * EVENTS_EVENT_SIZE);
mcalzana 0:c544827b6b11 36
mcalzana 0:c544827b6b11 37 void periodicCallback(void) {
mcalzana 2:59e9845ddbb6 38 if(blinkLed1){
mcalzana 2:59e9845ddbb6 39 led1 = !led1;
mcalzana 2:59e9845ddbb6 40 led2 = 0;
mcalzana 2:59e9845ddbb6 41 led3 = 0;
mcalzana 2:59e9845ddbb6 42 }else if(blinkLed2){
mcalzana 2:59e9845ddbb6 43 led1 = 0;
mcalzana 2:59e9845ddbb6 44 led2 = !led2;
mcalzana 2:59e9845ddbb6 45 led3 = 0;
mcalzana 2:59e9845ddbb6 46 }else if(blinkLed3){
mcalzana 2:59e9845ddbb6 47 led1 = 0;
mcalzana 2:59e9845ddbb6 48 led2 = 0;
mcalzana 2:59e9845ddbb6 49 led3 = !led3;
mcalzana 1:7b8b65fd1d74 50 }
mcalzana 0:c544827b6b11 51 }
mcalzana 0:c544827b6b11 52
mcalzana 0:c544827b6b11 53 void advertisementCallback(const Gap::AdvertisementCallbackParams_t *params) {
mcalzana 0:c544827b6b11 54 // parse the advertising payload, looking for data type COMPLETE_LOCAL_NAME
mcalzana 0:c544827b6b11 55 // The advertising payload is a collection of key/value records where
mcalzana 0:c544827b6b11 56 // byte 0: length of the record excluding this byte
mcalzana 0:c544827b6b11 57 // byte 1: The key, it is the type of the data
mcalzana 0:c544827b6b11 58 // byte [2..N] The value. N is equal to byte0 - 1
mcalzana 2:59e9845ddbb6 59
mcalzana 0:c544827b6b11 60 for (uint8_t i = 0; i < params->advertisingDataLen; ++i) {
mcalzana 0:c544827b6b11 61
mcalzana 0:c544827b6b11 62 const uint8_t record_length = params->advertisingData[i];
mcalzana 0:c544827b6b11 63 if (record_length == 0) {
mcalzana 0:c544827b6b11 64 continue;
mcalzana 0:c544827b6b11 65 }
mcalzana 0:c544827b6b11 66 const uint8_t type = params->advertisingData[i + 1];
mcalzana 0:c544827b6b11 67 const uint8_t* value = params->advertisingData + i + 2;
mcalzana 0:c544827b6b11 68 const uint8_t value_length = record_length - 1;
mcalzana 0:c544827b6b11 69 if(type == GapAdvertisingData::COMPLETE_LOCAL_NAME) {
mcalzana 0:c544827b6b11 70 if ((value_length == sizeof(PEER_NAME)) && (memcmp(value, PEER_NAME, value_length) == 0)) {
mcalzana 2:59e9845ddbb6 71 printf("connected. %d \n", params->rssi);
mcalzana 2:59e9845ddbb6 72 if(params->rssi > -60){
mcalzana 1:7b8b65fd1d74 73 printf("NEAR\n");
mcalzana 2:59e9845ddbb6 74 blinkLed1 = true;
mcalzana 2:59e9845ddbb6 75 blinkLed2 = false;
mcalzana 2:59e9845ddbb6 76 blinkLed3 = false;
mcalzana 2:59e9845ddbb6 77 }else if(params->rssi > -80){
mcalzana 1:7b8b65fd1d74 78 printf("MEDIUM\n");
mcalzana 2:59e9845ddbb6 79 blinkLed1 = false;
mcalzana 2:59e9845ddbb6 80 blinkLed2 = true;
mcalzana 2:59e9845ddbb6 81 blinkLed3 = false;
mcalzana 1:7b8b65fd1d74 82 }else{
mcalzana 1:7b8b65fd1d74 83 printf("FAR\n");
mcalzana 2:59e9845ddbb6 84 blinkLed1 = false;
mcalzana 2:59e9845ddbb6 85 blinkLed2 = false;
mcalzana 2:59e9845ddbb6 86 blinkLed3 = true;
mcalzana 1:7b8b65fd1d74 87 }
mcalzana 0:c544827b6b11 88 break;
mcalzana 0:c544827b6b11 89 }
mcalzana 0:c544827b6b11 90 }
mcalzana 0:c544827b6b11 91 i += record_length;
mcalzana 0:c544827b6b11 92 }
mcalzana 0:c544827b6b11 93 }
mcalzana 0:c544827b6b11 94
mcalzana 0:c544827b6b11 95 void serviceDiscoveryCallback(const DiscoveredService *service) {
mcalzana 0:c544827b6b11 96 if (service->getUUID().shortOrLong() == UUID::UUID_TYPE_SHORT) {
mcalzana 0:c544827b6b11 97 printf("S UUID-%x attrs[%u %u]\r\n", service->getUUID().getShortUUID(), service->getStartHandle(), service->getEndHandle());
mcalzana 0:c544827b6b11 98 } else {
mcalzana 0:c544827b6b11 99 printf("S UUID-");
mcalzana 0:c544827b6b11 100 const uint8_t *longUUIDBytes = service->getUUID().getBaseUUID();
mcalzana 0:c544827b6b11 101 for (unsigned i = 0; i < UUID::LENGTH_OF_LONG_UUID; i++) {
mcalzana 0:c544827b6b11 102 printf("%02x", longUUIDBytes[i]);
mcalzana 0:c544827b6b11 103 }
mcalzana 0:c544827b6b11 104 printf(" attrs[%u %u]\r\n", service->getStartHandle(), service->getEndHandle());
mcalzana 0:c544827b6b11 105 }
mcalzana 0:c544827b6b11 106 }
mcalzana 0:c544827b6b11 107
mcalzana 0:c544827b6b11 108 void updateLedCharacteristic(void) {
mcalzana 0:c544827b6b11 109 if (!BLE::Instance().gattClient().isServiceDiscoveryActive()) {
mcalzana 0:c544827b6b11 110 ledCharacteristic.read();
mcalzana 0:c544827b6b11 111 }
mcalzana 0:c544827b6b11 112 }
mcalzana 0:c544827b6b11 113
mcalzana 0:c544827b6b11 114 void characteristicDiscoveryCallback(const DiscoveredCharacteristic *characteristicP) {
mcalzana 0:c544827b6b11 115 printf(" C UUID-%x valueAttr[%u] props[%x]\r\n", characteristicP->getUUID().getShortUUID(), characteristicP->getValueHandle(), (uint8_t)characteristicP->getProperties().broadcast());
mcalzana 0:c544827b6b11 116 if (characteristicP->getUUID().getShortUUID() == 0xa001) { /* !ALERT! Alter this filter to suit your device. */
mcalzana 0:c544827b6b11 117 ledCharacteristic = *characteristicP;
mcalzana 0:c544827b6b11 118 triggerLedCharacteristic = true;
mcalzana 0:c544827b6b11 119 }
mcalzana 0:c544827b6b11 120 }
mcalzana 0:c544827b6b11 121
mcalzana 0:c544827b6b11 122 void discoveryTerminationCallback(Gap::Handle_t connectionHandle) {
mcalzana 0:c544827b6b11 123 printf("terminated SD for handle %u\r\n", connectionHandle);
mcalzana 0:c544827b6b11 124 if (triggerLedCharacteristic) {
mcalzana 0:c544827b6b11 125 triggerLedCharacteristic = false;
mcalzana 0:c544827b6b11 126 eventQueue.call(updateLedCharacteristic);
mcalzana 0:c544827b6b11 127 }
mcalzana 0:c544827b6b11 128 }
mcalzana 0:c544827b6b11 129
mcalzana 0:c544827b6b11 130 void connectionCallback(const Gap::ConnectionCallbackParams_t *params) {
mcalzana 0:c544827b6b11 131 if (params->role == Gap::CENTRAL) {
mcalzana 0:c544827b6b11 132 BLE &ble = BLE::Instance();
mcalzana 0:c544827b6b11 133 ble.gattClient().onServiceDiscoveryTermination(discoveryTerminationCallback);
mcalzana 0:c544827b6b11 134 ble.gattClient().launchServiceDiscovery(params->handle, serviceDiscoveryCallback, characteristicDiscoveryCallback, 0xa000, 0xa001);
mcalzana 0:c544827b6b11 135 }
mcalzana 0:c544827b6b11 136 }
mcalzana 0:c544827b6b11 137
mcalzana 0:c544827b6b11 138 void triggerToggledWrite(const GattReadCallbackParams *response) {
mcalzana 0:c544827b6b11 139 if (response->handle == ledCharacteristic.getValueHandle()) {
mcalzana 0:c544827b6b11 140 printf("triggerToggledWrite: handle %u, offset %u, len %u\r\n", response->handle, response->offset, response->len);
mcalzana 0:c544827b6b11 141 for (unsigned index = 0; index < response->len; index++) {
mcalzana 0:c544827b6b11 142 printf("%c[%02x]", response->data[index], response->data[index]);
mcalzana 0:c544827b6b11 143 }
mcalzana 0:c544827b6b11 144 printf("\r\n");
mcalzana 0:c544827b6b11 145 ledCharacteristic.write(1, &toggledValue);
mcalzana 0:c544827b6b11 146 }
mcalzana 0:c544827b6b11 147 }
mcalzana 0:c544827b6b11 148
mcalzana 0:c544827b6b11 149 void triggerRead(const GattWriteCallbackParams *response) {
mcalzana 0:c544827b6b11 150 if (response->handle == ledCharacteristic.getValueHandle()) {
mcalzana 0:c544827b6b11 151 ledCharacteristic.read();
mcalzana 0:c544827b6b11 152 }
mcalzana 0:c544827b6b11 153 }
mcalzana 0:c544827b6b11 154
mcalzana 0:c544827b6b11 155 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *) {
mcalzana 0:c544827b6b11 156 printf("disconnected\r\n");
mcalzana 0:c544827b6b11 157 /* Start scanning and try to connect again */
mcalzana 0:c544827b6b11 158 BLE::Instance().gap().startScan(advertisementCallback);
mcalzana 0:c544827b6b11 159 }
mcalzana 0:c544827b6b11 160
mcalzana 0:c544827b6b11 161 void onBleInitError(BLE &ble, ble_error_t error)
mcalzana 0:c544827b6b11 162 {
mcalzana 0:c544827b6b11 163 /* Initialization error handling should go here */
mcalzana 0:c544827b6b11 164 }
mcalzana 0:c544827b6b11 165
mcalzana 0:c544827b6b11 166 void printMacAddress()
mcalzana 0:c544827b6b11 167 {
mcalzana 0:c544827b6b11 168 /* Print out device MAC address to the console*/
mcalzana 0:c544827b6b11 169 Gap::AddressType_t addr_type;
mcalzana 0:c544827b6b11 170 Gap::Address_t address;
mcalzana 0:c544827b6b11 171 BLE::Instance().gap().getAddress(&addr_type, address);
mcalzana 0:c544827b6b11 172 printf("DEVICE MAC ADDRESS: ");
mcalzana 0:c544827b6b11 173 for (int i = 5; i >= 1; i--){
mcalzana 0:c544827b6b11 174 printf("%02x:", address[i]);
mcalzana 0:c544827b6b11 175 }
mcalzana 0:c544827b6b11 176 printf("%02x\r\n", address[0]);
mcalzana 0:c544827b6b11 177 }
mcalzana 0:c544827b6b11 178
mcalzana 0:c544827b6b11 179 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
mcalzana 0:c544827b6b11 180 {
mcalzana 0:c544827b6b11 181 BLE& ble = params->ble;
mcalzana 0:c544827b6b11 182 ble_error_t error = params->error;
mcalzana 0:c544827b6b11 183
mcalzana 0:c544827b6b11 184 if (error != BLE_ERROR_NONE) {
mcalzana 0:c544827b6b11 185 /* In case of error, forward the error handling to onBleInitError */
mcalzana 0:c544827b6b11 186 onBleInitError(ble, error);
mcalzana 0:c544827b6b11 187 return;
mcalzana 0:c544827b6b11 188 }
mcalzana 0:c544827b6b11 189
mcalzana 0:c544827b6b11 190 /* Ensure that it is the default instance of BLE */
mcalzana 0:c544827b6b11 191 if (ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
mcalzana 0:c544827b6b11 192 return;
mcalzana 0:c544827b6b11 193 }
mcalzana 0:c544827b6b11 194
mcalzana 0:c544827b6b11 195 ble.gap().onDisconnection(disconnectionCallback);
mcalzana 0:c544827b6b11 196 ble.gap().onConnection(connectionCallback);
mcalzana 0:c544827b6b11 197
mcalzana 0:c544827b6b11 198 ble.gattClient().onDataRead(triggerToggledWrite);
mcalzana 0:c544827b6b11 199 ble.gattClient().onDataWrite(triggerRead);
mcalzana 0:c544827b6b11 200
mcalzana 0:c544827b6b11 201 // scan interval: 400ms and scan window: 400ms.
mcalzana 0:c544827b6b11 202 // Every 400ms the device will scan for 400ms
mcalzana 0:c544827b6b11 203 // This means that the device will scan continuously.
mcalzana 0:c544827b6b11 204 ble.gap().setScanParams(400, 400);
mcalzana 0:c544827b6b11 205 ble.gap().startScan(advertisementCallback);
mcalzana 0:c544827b6b11 206
mcalzana 0:c544827b6b11 207 printMacAddress();
mcalzana 0:c544827b6b11 208 }
mcalzana 0:c544827b6b11 209
mcalzana 0:c544827b6b11 210 void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) {
mcalzana 0:c544827b6b11 211 BLE &ble = BLE::Instance();
mcalzana 0:c544827b6b11 212 eventQueue.call(Callback<void()>(&ble, &BLE::processEvents));
mcalzana 0:c544827b6b11 213 }
mcalzana 0:c544827b6b11 214
mcalzana 0:c544827b6b11 215 void rise_handler_iterrupt_context(void) {
mcalzana 0:c544827b6b11 216 toggledValue = 0x0;
mcalzana 0:c544827b6b11 217 }
mcalzana 0:c544827b6b11 218
mcalzana 0:c544827b6b11 219 void fall_handler_iterrupt_context(void) {
mcalzana 0:c544827b6b11 220 toggledValue = 0x1;
mcalzana 0:c544827b6b11 221 }
mcalzana 0:c544827b6b11 222
mcalzana 0:c544827b6b11 223 int main()
mcalzana 0:c544827b6b11 224 {
mcalzana 0:c544827b6b11 225
mcalzana 0:c544827b6b11 226 triggerLedCharacteristic = false;
mcalzana 0:c544827b6b11 227 eventQueue.call_every(500, periodicCallback);
mcalzana 0:c544827b6b11 228
mcalzana 0:c544827b6b11 229 BLE &ble = BLE::Instance();
mcalzana 0:c544827b6b11 230 ble.onEventsToProcess(scheduleBleEventsProcessing);
mcalzana 0:c544827b6b11 231 ble.init(bleInitComplete);
mcalzana 0:c544827b6b11 232 button.rise(rise_handler_iterrupt_context);
mcalzana 0:c544827b6b11 233 button.fall(fall_handler_iterrupt_context);
mcalzana 0:c544827b6b11 234
mcalzana 0:c544827b6b11 235 eventQueue.dispatch_forever();
mcalzana 0:c544827b6b11 236
mcalzana 0:c544827b6b11 237 return 0;
mcalzana 0:c544827b6b11 238 }