For MAX32630FTHR Demo Board: Controls LEDs on the demo board interfaced through BLE peripheral testing apps like LightBlue for iOS. Debug output on serial port.

Dependencies:   max32630fthr

Committer:
Lugs
Date:
Sat Nov 09 01:44:19 2019 +0000
Revision:
20:efe8deed8f74
Parent:
0:c671a4833315
For MAX32630FTHR Demo Board:; Controls LEDs on the demo board using BLE GATT interfaced through BLE testing apps on phones (lightblue for iOS)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 0:c671a4833315 1 /* mbed Microcontroller Library
mbed_official 0:c671a4833315 2 * Copyright (c) 2017 ARM Limited
mbed_official 0:c671a4833315 3 *
mbed_official 0:c671a4833315 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 0:c671a4833315 5 * you may not use this file except in compliance with the License.
mbed_official 0:c671a4833315 6 * You may obtain a copy of the License at
mbed_official 0:c671a4833315 7 *
mbed_official 0:c671a4833315 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 0:c671a4833315 9 *
mbed_official 0:c671a4833315 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 0:c671a4833315 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 0:c671a4833315 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 0:c671a4833315 13 * See the License for the specific language governing permissions and
mbed_official 0:c671a4833315 14 * limitations under the License.
mbed_official 0:c671a4833315 15 */
mbed_official 0:c671a4833315 16
mbed_official 0:c671a4833315 17 #ifndef GATT_SERVER_EXAMPLE_BLE_PROCESS_H_
mbed_official 0:c671a4833315 18 #define GATT_SERVER_EXAMPLE_BLE_PROCESS_H_
mbed_official 0:c671a4833315 19
mbed_official 0:c671a4833315 20 #include <stdint.h>
mbed_official 0:c671a4833315 21 #include <stdio.h>
mbed_official 0:c671a4833315 22
mbed_official 0:c671a4833315 23 #include "events/EventQueue.h"
mbed_official 0:c671a4833315 24 #include "platform/Callback.h"
mbed_official 0:c671a4833315 25 #include "platform/NonCopyable.h"
mbed_official 0:c671a4833315 26
mbed_official 0:c671a4833315 27 #include "ble/BLE.h"
mbed_official 0:c671a4833315 28 #include "ble/Gap.h"
mbed_official 0:c671a4833315 29 #include "ble/GapAdvertisingParams.h"
mbed_official 0:c671a4833315 30 #include "ble/GapAdvertisingData.h"
mbed_official 0:c671a4833315 31 #include "ble/FunctionPointerWithContext.h"
mbed_official 0:c671a4833315 32
mbed_official 0:c671a4833315 33 /**
mbed_official 0:c671a4833315 34 * Handle initialization adn shutdown of the BLE Instance.
mbed_official 0:c671a4833315 35 *
mbed_official 0:c671a4833315 36 * Setup advertising payload and manage advertising state.
mbed_official 0:c671a4833315 37 * Delegate to GattClientProcess once the connection is established.
mbed_official 0:c671a4833315 38 */
mbed_official 0:c671a4833315 39 class BLEProcess : private mbed::NonCopyable<BLEProcess> {
mbed_official 0:c671a4833315 40 public:
mbed_official 0:c671a4833315 41 /**
mbed_official 0:c671a4833315 42 * Construct a BLEProcess from an event queue and a ble interface.
mbed_official 0:c671a4833315 43 *
mbed_official 0:c671a4833315 44 * Call start() to initiate ble processing.
mbed_official 0:c671a4833315 45 */
mbed_official 0:c671a4833315 46 BLEProcess(events::EventQueue &event_queue, BLE &ble_interface) :
mbed_official 0:c671a4833315 47 _event_queue(event_queue),
mbed_official 0:c671a4833315 48 _ble_interface(ble_interface),
mbed_official 0:c671a4833315 49 _post_init_cb() {
mbed_official 0:c671a4833315 50 }
mbed_official 0:c671a4833315 51
mbed_official 0:c671a4833315 52 ~BLEProcess()
mbed_official 0:c671a4833315 53 {
mbed_official 0:c671a4833315 54 stop();
mbed_official 0:c671a4833315 55 }
mbed_official 0:c671a4833315 56
mbed_official 0:c671a4833315 57 /**
mbed_official 0:c671a4833315 58 * Subscription to the ble interface initialization event.
mbed_official 0:c671a4833315 59 *
mbed_official 0:c671a4833315 60 * @param[in] cb The callback object that will be called when the ble
mbed_official 0:c671a4833315 61 * interface is initialized.
mbed_official 0:c671a4833315 62 */
mbed_official 0:c671a4833315 63 void on_init(mbed::Callback<void(BLE&, events::EventQueue&)> cb)
mbed_official 0:c671a4833315 64 {
mbed_official 0:c671a4833315 65 _post_init_cb = cb;
mbed_official 0:c671a4833315 66 }
mbed_official 0:c671a4833315 67
mbed_official 0:c671a4833315 68 /**
mbed_official 0:c671a4833315 69 * Initialize the ble interface, configure it and start advertising.
mbed_official 0:c671a4833315 70 */
mbed_official 0:c671a4833315 71 bool start()
mbed_official 0:c671a4833315 72 {
mbed_official 0:c671a4833315 73 printf("Ble process started.\r\n");
mbed_official 0:c671a4833315 74
mbed_official 0:c671a4833315 75 if (_ble_interface.hasInitialized()) {
mbed_official 0:c671a4833315 76 printf("Error: the ble instance has already been initialized.\r\n");
mbed_official 0:c671a4833315 77 return false;
mbed_official 0:c671a4833315 78 }
mbed_official 0:c671a4833315 79
mbed_official 0:c671a4833315 80 _ble_interface.onEventsToProcess(
mbed_official 0:c671a4833315 81 makeFunctionPointer(this, &BLEProcess::schedule_ble_events)
mbed_official 0:c671a4833315 82 );
mbed_official 0:c671a4833315 83
mbed_official 0:c671a4833315 84 ble_error_t error = _ble_interface.init(
mbed_official 0:c671a4833315 85 this, &BLEProcess::when_init_complete
mbed_official 0:c671a4833315 86 );
mbed_official 0:c671a4833315 87
mbed_official 0:c671a4833315 88 if (error) {
mbed_official 0:c671a4833315 89 printf("Error: %u returned by BLE::init.\r\n", error);
mbed_official 0:c671a4833315 90 return false;
mbed_official 0:c671a4833315 91 }
mbed_official 0:c671a4833315 92
mbed_official 0:c671a4833315 93 return true;
mbed_official 0:c671a4833315 94 }
mbed_official 0:c671a4833315 95
mbed_official 0:c671a4833315 96 /**
mbed_official 0:c671a4833315 97 * Close existing connections and stop the process.
mbed_official 0:c671a4833315 98 */
mbed_official 0:c671a4833315 99 void stop()
mbed_official 0:c671a4833315 100 {
mbed_official 0:c671a4833315 101 if (_ble_interface.hasInitialized()) {
mbed_official 0:c671a4833315 102 _ble_interface.shutdown();
mbed_official 0:c671a4833315 103 printf("Ble process stopped.");
mbed_official 0:c671a4833315 104 }
mbed_official 0:c671a4833315 105 }
mbed_official 0:c671a4833315 106
mbed_official 0:c671a4833315 107 private:
mbed_official 0:c671a4833315 108
mbed_official 0:c671a4833315 109 /**
mbed_official 0:c671a4833315 110 * Schedule processing of events from the BLE middleware in the event queue.
mbed_official 0:c671a4833315 111 */
mbed_official 0:c671a4833315 112 void schedule_ble_events(BLE::OnEventsToProcessCallbackContext *event)
mbed_official 0:c671a4833315 113 {
mbed_official 0:c671a4833315 114 _event_queue.call(mbed::callback(&event->ble, &BLE::processEvents));
mbed_official 0:c671a4833315 115 }
mbed_official 0:c671a4833315 116
mbed_official 0:c671a4833315 117 /**
mbed_official 0:c671a4833315 118 * Sets up adverting payload and start advertising.
mbed_official 0:c671a4833315 119 *
mbed_official 0:c671a4833315 120 * This function is invoked when the ble interface is initialized.
mbed_official 0:c671a4833315 121 */
mbed_official 0:c671a4833315 122 void when_init_complete(BLE::InitializationCompleteCallbackContext *event)
mbed_official 0:c671a4833315 123 {
mbed_official 0:c671a4833315 124 if (event->error) {
mbed_official 0:c671a4833315 125 printf("Error %u during the initialization\r\n", event->error);
mbed_official 0:c671a4833315 126 return;
mbed_official 0:c671a4833315 127 }
mbed_official 0:c671a4833315 128 printf("Ble instance initialized\r\n");
mbed_official 0:c671a4833315 129
mbed_official 0:c671a4833315 130 Gap &gap = _ble_interface.gap();
mbed_official 0:c671a4833315 131 ble_error_t error = gap.setAdvertisingPayload(make_advertising_data());
mbed_official 0:c671a4833315 132 if (error) {
mbed_official 0:c671a4833315 133 printf("Error %u during gap.setAdvertisingPayload\r\n", error);
mbed_official 0:c671a4833315 134 return;
mbed_official 0:c671a4833315 135 }
mbed_official 0:c671a4833315 136
mbed_official 0:c671a4833315 137 gap.setAdvertisingParams(make_advertising_params());
mbed_official 0:c671a4833315 138
mbed_official 0:c671a4833315 139 gap.onConnection(this, &BLEProcess::when_connection);
mbed_official 0:c671a4833315 140 gap.onDisconnection(this, &BLEProcess::when_disconnection);
mbed_official 0:c671a4833315 141
mbed_official 0:c671a4833315 142 start_advertising();
mbed_official 0:c671a4833315 143
mbed_official 0:c671a4833315 144 if (_post_init_cb) {
mbed_official 0:c671a4833315 145 _post_init_cb(_ble_interface, _event_queue);
mbed_official 0:c671a4833315 146 }
mbed_official 0:c671a4833315 147 }
mbed_official 0:c671a4833315 148
mbed_official 0:c671a4833315 149 void when_connection(const Gap::ConnectionCallbackParams_t *connection_event)
mbed_official 0:c671a4833315 150 {
mbed_official 0:c671a4833315 151 printf("Connected.\r\n");
mbed_official 0:c671a4833315 152 }
mbed_official 0:c671a4833315 153
mbed_official 0:c671a4833315 154 void when_disconnection(const Gap::DisconnectionCallbackParams_t *event)
mbed_official 0:c671a4833315 155 {
mbed_official 0:c671a4833315 156 printf("Disconnected.\r\n");
mbed_official 0:c671a4833315 157 start_advertising();
mbed_official 0:c671a4833315 158 }
mbed_official 0:c671a4833315 159
mbed_official 0:c671a4833315 160 void start_advertising(void)
mbed_official 0:c671a4833315 161 {
mbed_official 0:c671a4833315 162 ble_error_t error = _ble_interface.gap().startAdvertising();
mbed_official 0:c671a4833315 163 if (error) {
mbed_official 0:c671a4833315 164 printf("Error %u during gap.startAdvertising.\r\n", error);
mbed_official 0:c671a4833315 165 return;
mbed_official 0:c671a4833315 166 } else {
mbed_official 0:c671a4833315 167 printf("Advertising started.\r\n");
mbed_official 0:c671a4833315 168 }
mbed_official 0:c671a4833315 169 }
mbed_official 0:c671a4833315 170
mbed_official 0:c671a4833315 171 static GapAdvertisingData make_advertising_data(void)
mbed_official 0:c671a4833315 172 {
mbed_official 0:c671a4833315 173 static const uint8_t device_name[] = "GattServer";
mbed_official 0:c671a4833315 174 GapAdvertisingData advertising_data;
mbed_official 0:c671a4833315 175
mbed_official 0:c671a4833315 176 // add advertising flags
mbed_official 0:c671a4833315 177 advertising_data.addFlags(
mbed_official 0:c671a4833315 178 GapAdvertisingData::LE_GENERAL_DISCOVERABLE |
mbed_official 0:c671a4833315 179 GapAdvertisingData::BREDR_NOT_SUPPORTED
mbed_official 0:c671a4833315 180 );
mbed_official 0:c671a4833315 181
mbed_official 0:c671a4833315 182 // add device name
mbed_official 0:c671a4833315 183 advertising_data.addData(
mbed_official 0:c671a4833315 184 GapAdvertisingData::COMPLETE_LOCAL_NAME,
mbed_official 0:c671a4833315 185 device_name,
mbed_official 0:c671a4833315 186 sizeof(device_name)
mbed_official 0:c671a4833315 187 );
mbed_official 0:c671a4833315 188
mbed_official 0:c671a4833315 189 return advertising_data;
mbed_official 0:c671a4833315 190 }
mbed_official 0:c671a4833315 191
mbed_official 0:c671a4833315 192 static GapAdvertisingParams make_advertising_params(void)
mbed_official 0:c671a4833315 193 {
mbed_official 0:c671a4833315 194 return GapAdvertisingParams(
mbed_official 0:c671a4833315 195 /* type */ GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED,
mbed_official 0:c671a4833315 196 /* interval */ GapAdvertisingParams::MSEC_TO_ADVERTISEMENT_DURATION_UNITS(500),
mbed_official 0:c671a4833315 197 /* timeout */ 0
mbed_official 0:c671a4833315 198 );
mbed_official 0:c671a4833315 199 }
mbed_official 0:c671a4833315 200
mbed_official 0:c671a4833315 201 events::EventQueue &_event_queue;
mbed_official 0:c671a4833315 202 BLE &_ble_interface;
mbed_official 0:c671a4833315 203 mbed::Callback<void(BLE&, events::EventQueue&)> _post_init_cb;
mbed_official 0:c671a4833315 204 };
mbed_official 0:c671a4833315 205
mbed_official 0:c671a4833315 206 #endif /* GATT_SERVER_EXAMPLE_BLE_PROCESS_H_ */