
this is using the mbed os version 5-13-1
source/BleManager.h@118:8df0e9c2ee3f, 2019-05-25 (annotated)
- Committer:
- ocomeni
- Date:
- Sat May 25 16:25:42 2019 +0000
- Branch:
- PassingRegression
- Revision:
- 118:8df0e9c2ee3f
- Parent:
- 116:2296cf274661
- Child:
- 119:8d939a902333
- fixed memory leak bug with ATCMD manager; - added BLE memory pool and queues and connected up to main, BLE manager and ATCMD; - code compiling; - python test passing
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ocomeni | 75:08eff6258e1b | 1 | #ifndef __BLE_MANAGER_H__ |
ocomeni | 74:f26e846adfe9 | 2 | #define __BLE_MANAGER_H__ |
ocomeni | 75:08eff6258e1b | 3 | |
ocomeni | 75:08eff6258e1b | 4 | |
ocomeni | 75:08eff6258e1b | 5 | /* mbed Microcontroller Library |
ocomeni | 75:08eff6258e1b | 6 | * Copyright (c) 2006-2013 ARM Limited |
ocomeni | 75:08eff6258e1b | 7 | * |
ocomeni | 75:08eff6258e1b | 8 | * Licensed under the Apache License, Version 2.0 (the "License"); |
ocomeni | 75:08eff6258e1b | 9 | * you may not use this file except in compliance with the License. |
ocomeni | 75:08eff6258e1b | 10 | * You may obtain a copy of the License at |
ocomeni | 75:08eff6258e1b | 11 | * |
ocomeni | 75:08eff6258e1b | 12 | * http://www.apache.org/licenses/LICENSE-2.0 |
ocomeni | 75:08eff6258e1b | 13 | * |
ocomeni | 75:08eff6258e1b | 14 | * Unless required by applicable law or agreed to in writing, software |
ocomeni | 75:08eff6258e1b | 15 | * distributed under the License is distributed on an "AS IS" BASIS, |
ocomeni | 75:08eff6258e1b | 16 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
ocomeni | 75:08eff6258e1b | 17 | * See the License for the specific language governing permissions and |
ocomeni | 75:08eff6258e1b | 18 | * limitations under the License. |
ocomeni | 75:08eff6258e1b | 19 | */ |
ocomeni | 75:08eff6258e1b | 20 | |
ocomeni | 75:08eff6258e1b | 21 | #include <events/mbed_events.h> |
ocomeni | 75:08eff6258e1b | 22 | #include <mbed.h> |
ocomeni | 75:08eff6258e1b | 23 | #include "ble/BLE.h" |
ocomeni | 75:08eff6258e1b | 24 | #include "SecurityManager.h" |
ocomeni | 78:07bb86e3ce14 | 25 | #include "common_types.h" |
ocomeni | 75:08eff6258e1b | 26 | |
ocomeni | 75:08eff6258e1b | 27 | /** This example demonstrates all the basic setup required |
ocomeni | 75:08eff6258e1b | 28 | * for pairing and setting up link security both as a central and peripheral |
ocomeni | 75:08eff6258e1b | 29 | * |
ocomeni | 75:08eff6258e1b | 30 | * The example is implemented as two classes, one for the peripheral and one |
ocomeni | 75:08eff6258e1b | 31 | * for central inheriting from a common base. They are run in sequence and |
ocomeni | 75:08eff6258e1b | 32 | * require a peer device to connect to. During the peripheral device demonstration |
ocomeni | 75:08eff6258e1b | 33 | * a peer device is required to connect. In the central device demonstration |
ocomeni | 75:08eff6258e1b | 34 | * this peer device will be scanned for and connected to - therefore it should |
ocomeni | 75:08eff6258e1b | 35 | * be advertising with the same address as when it connected. |
ocomeni | 75:08eff6258e1b | 36 | * |
ocomeni | 75:08eff6258e1b | 37 | * During the test output is written on the serial connection to monitor its |
ocomeni | 75:08eff6258e1b | 38 | * progress. |
ocomeni | 75:08eff6258e1b | 39 | */ |
ocomeni | 75:08eff6258e1b | 40 | |
ocomeni | 75:08eff6258e1b | 41 | |
ocomeni | 75:08eff6258e1b | 42 | /* for demonstration purposes we will store the peer device address |
ocomeni | 75:08eff6258e1b | 43 | * of the device that connects to us in the first demonstration |
ocomeni | 75:08eff6258e1b | 44 | * so we can use its address to reconnect to it later */ |
ocomeni | 75:08eff6258e1b | 45 | static BLEProtocol::AddressBytes_t peer_address; |
ocomeni | 75:08eff6258e1b | 46 | |
ocomeni | 75:08eff6258e1b | 47 | /** Base class for both peripheral and central. The same class that provides |
ocomeni | 75:08eff6258e1b | 48 | * the logic for the application also implements the SecurityManagerEventHandler |
ocomeni | 75:08eff6258e1b | 49 | * which is the interface used by the Security Manager to communicate events |
ocomeni | 75:08eff6258e1b | 50 | * back to the applications. You can provide overrides for a selection of events |
ocomeni | 75:08eff6258e1b | 51 | * your application is interested in. |
ocomeni | 75:08eff6258e1b | 52 | */ |
ocomeni | 75:08eff6258e1b | 53 | class SMDevice : private mbed::NonCopyable<SMDevice>, |
ocomeni | 75:08eff6258e1b | 54 | public SecurityManager::EventHandler |
ocomeni | 75:08eff6258e1b | 55 | { |
ocomeni | 75:08eff6258e1b | 56 | public: |
ocomeni | 78:07bb86e3ce14 | 57 | SMDevice(BLE &ble, events::EventQueue &event_queue, |
ocomeni | 118:8df0e9c2ee3f | 58 | BLEProtocol::AddressBytes_t &peer_address, |
ocomeni | 118:8df0e9c2ee3f | 59 | MemoryPool<at_ble_msg_t, PQDSZ_BLE> *aT2BleDatamPool, |
ocomeni | 118:8df0e9c2ee3f | 60 | Queue<at_ble_msg_t, PQDSZ_BLE> *aT2BleDataQueue, |
ocomeni | 118:8df0e9c2ee3f | 61 | MemoryPool<ble_at_msg_t, PQDSZ_BLE> *ble2ATDatamPool, |
ocomeni | 118:8df0e9c2ee3f | 62 | Queue<ble_at_msg_t, PQDSZ_BLE> *ble2ATDataQueue, |
ocomeni | 118:8df0e9c2ee3f | 63 | ble_config_t *ble_config); |
ocomeni | 75:08eff6258e1b | 64 | |
ocomeni | 75:08eff6258e1b | 65 | virtual ~SMDevice(); |
ocomeni | 75:08eff6258e1b | 66 | |
ocomeni | 75:08eff6258e1b | 67 | /** Start BLE interface initialisation */ |
ocomeni | 75:08eff6258e1b | 68 | void run(); |
ocomeni | 75:08eff6258e1b | 69 | |
ocomeni | 75:08eff6258e1b | 70 | /* event handler functions */ |
ocomeni | 75:08eff6258e1b | 71 | |
ocomeni | 75:08eff6258e1b | 72 | /** Respond to a pairing request. This will be called by the stack |
ocomeni | 75:08eff6258e1b | 73 | * when a pairing request arrives and expects the application to |
ocomeni | 75:08eff6258e1b | 74 | * call acceptPairingRequest or cancelPairingRequest */ |
ocomeni | 75:08eff6258e1b | 75 | virtual void pairingRequest( |
ocomeni | 75:08eff6258e1b | 76 | ble::connection_handle_t connectionHandle |
ocomeni | 75:08eff6258e1b | 77 | ); |
ocomeni | 75:08eff6258e1b | 78 | |
ocomeni | 75:08eff6258e1b | 79 | /** Inform the application of a successful pairing. Terminate the demonstration. */ |
ocomeni | 75:08eff6258e1b | 80 | virtual void pairingResult( |
ocomeni | 75:08eff6258e1b | 81 | ble::connection_handle_t connectionHandle, |
ocomeni | 75:08eff6258e1b | 82 | SecurityManager::SecurityCompletionStatus_t result |
ocomeni | 75:08eff6258e1b | 83 | ); |
ocomeni | 75:08eff6258e1b | 84 | |
ocomeni | 75:08eff6258e1b | 85 | /** Inform the application of change in encryption status. This will be |
ocomeni | 75:08eff6258e1b | 86 | * communicated through the serial port */ |
ocomeni | 75:08eff6258e1b | 87 | virtual void linkEncryptionResult( |
ocomeni | 75:08eff6258e1b | 88 | ble::connection_handle_t connectionHandle, |
ocomeni | 75:08eff6258e1b | 89 | ble::link_encryption_t result |
ocomeni | 75:08eff6258e1b | 90 | ); |
ocomeni | 77:0b505d1e15f4 | 91 | |
ocomeni | 77:0b505d1e15f4 | 92 | void shutDown(); |
ocomeni | 79:a2187bbfa407 | 93 | void sendBLEUartData(char * str); |
ocomeni | 75:08eff6258e1b | 94 | |
ocomeni | 113:888e262ff0a9 | 95 | protected: |
ocomeni | 113:888e262ff0a9 | 96 | // connection status |
ocomeni | 113:888e262ff0a9 | 97 | bool isConnected; |
ocomeni | 75:08eff6258e1b | 98 | private: |
ocomeni | 113:888e262ff0a9 | 99 | /** Override to start chosen activity when initialisation completes */ |
ocomeni | 75:08eff6258e1b | 100 | virtual void start() = 0; |
ocomeni | 75:08eff6258e1b | 101 | |
ocomeni | 75:08eff6258e1b | 102 | /** This is called when BLE interface is initialised and starts the demonstration */ |
ocomeni | 75:08eff6258e1b | 103 | void on_init_complete(BLE::InitializationCompleteCallbackContext *event); |
ocomeni | 75:08eff6258e1b | 104 | |
ocomeni | 75:08eff6258e1b | 105 | /** This is called by Gap to notify the application we connected */ |
ocomeni | 75:08eff6258e1b | 106 | virtual void on_connect(const Gap::ConnectionCallbackParams_t *connection_event) = 0; |
ocomeni | 75:08eff6258e1b | 107 | |
ocomeni | 75:08eff6258e1b | 108 | /** This is called by Gap to notify the application we disconnected, |
ocomeni | 75:08eff6258e1b | 109 | * in our case it ends the demonstration. */ |
ocomeni | 75:08eff6258e1b | 110 | void on_disconnect(const Gap::DisconnectionCallbackParams_t *event); |
ocomeni | 75:08eff6258e1b | 111 | |
ocomeni | 75:08eff6258e1b | 112 | /** End demonstration unexpectedly. Called if timeout is reached during advertising, |
ocomeni | 75:08eff6258e1b | 113 | * scanning or connection initiation */ |
ocomeni | 75:08eff6258e1b | 114 | void on_timeout(const Gap::TimeoutSource_t source); |
ocomeni | 75:08eff6258e1b | 115 | |
ocomeni | 75:08eff6258e1b | 116 | /** Schedule processing of events from the BLE in the event queue. */ |
ocomeni | 75:08eff6258e1b | 117 | void schedule_ble_events(BLE::OnEventsToProcessCallbackContext *context); |
ocomeni | 75:08eff6258e1b | 118 | |
ocomeni | 75:08eff6258e1b | 119 | /** Blink LED to show we're running */ |
ocomeni | 75:08eff6258e1b | 120 | void blink(void); |
ocomeni | 76:6afda865fbf8 | 121 | /** Echo received data back */ |
ocomeni | 76:6afda865fbf8 | 122 | void EchoBleUartReceived(); |
ocomeni | 79:a2187bbfa407 | 123 | |
ocomeni | 77:0b505d1e15f4 | 124 | |
ocomeni | 77:0b505d1e15f4 | 125 | void reportGapState(); |
ocomeni | 76:6afda865fbf8 | 126 | |
ocomeni | 76:6afda865fbf8 | 127 | /** |
ocomeni | 76:6afda865fbf8 | 128 | * This callback allows the LEDService to receive updates to the ledState Characteristic. |
ocomeni | 76:6afda865fbf8 | 129 | * |
ocomeni | 76:6afda865fbf8 | 130 | * @param[in] params |
ocomeni | 76:6afda865fbf8 | 131 | * Information about the characterisitc being updated. |
ocomeni | 76:6afda865fbf8 | 132 | */ |
ocomeni | 76:6afda865fbf8 | 133 | void onDataWrittenCallback(const GattWriteCallbackParams *params); |
ocomeni | 79:a2187bbfa407 | 134 | //void passkeyDisplayCallback(Gap::Handle_t handle, const SecurityManager::Passkey_t passkey); |
ocomeni | 79:a2187bbfa407 | 135 | //void securitySetupCompletedCallback(Gap::Handle_t handle, SecurityManager::SecurityCompletionStatus_t status); |
ocomeni | 75:08eff6258e1b | 136 | |
ocomeni | 75:08eff6258e1b | 137 | private: |
ocomeni | 75:08eff6258e1b | 138 | DigitalOut _led1; |
ocomeni | 118:8df0e9c2ee3f | 139 | /* Queue and memory pool for AT to BLE data */ |
ocomeni | 118:8df0e9c2ee3f | 140 | MemoryPool<at_ble_msg_t, PQDSZ_BLE> *_aT2BleDatamPool; |
ocomeni | 118:8df0e9c2ee3f | 141 | Queue<at_ble_msg_t, PQDSZ_BLE> *_aT2BleDataQueue; |
ocomeni | 118:8df0e9c2ee3f | 142 | |
ocomeni | 118:8df0e9c2ee3f | 143 | |
ocomeni | 118:8df0e9c2ee3f | 144 | /* Queue and memory pool for BLE to AT data */ |
ocomeni | 118:8df0e9c2ee3f | 145 | MemoryPool<ble_at_msg_t, PQDSZ_BLE> *_ble2ATDatamPool; |
ocomeni | 118:8df0e9c2ee3f | 146 | Queue<ble_at_msg_t, PQDSZ_BLE> *_ble2ATDataQueue; |
ocomeni | 75:08eff6258e1b | 147 | |
ocomeni | 75:08eff6258e1b | 148 | protected: |
ocomeni | 75:08eff6258e1b | 149 | BLE &_ble; |
ocomeni | 116:2296cf274661 | 150 | ble_config_t *ble_config; |
ocomeni | 75:08eff6258e1b | 151 | events::EventQueue &_event_queue; |
ocomeni | 75:08eff6258e1b | 152 | BLEProtocol::AddressBytes_t &_peer_address; |
ocomeni | 75:08eff6258e1b | 153 | ble::connection_handle_t _handle; |
ocomeni | 75:08eff6258e1b | 154 | bool _is_connecting; |
ocomeni | 75:08eff6258e1b | 155 | }; |
ocomeni | 75:08eff6258e1b | 156 | |
ocomeni | 75:08eff6258e1b | 157 | /** A peripheral device will advertise, accept the connection and request |
ocomeni | 75:08eff6258e1b | 158 | * a change in link security. */ |
ocomeni | 75:08eff6258e1b | 159 | class SMDevicePeripheral : public SMDevice { |
ocomeni | 75:08eff6258e1b | 160 | public: |
ocomeni | 78:07bb86e3ce14 | 161 | SMDevicePeripheral(BLE &ble, events::EventQueue &event_queue, |
ocomeni | 118:8df0e9c2ee3f | 162 | BLEProtocol::AddressBytes_t &peer_address, |
ocomeni | 118:8df0e9c2ee3f | 163 | MemoryPool<at_ble_msg_t, PQDSZ_BLE> *aT2BleDatamPool, |
ocomeni | 118:8df0e9c2ee3f | 164 | Queue<at_ble_msg_t, PQDSZ_BLE> *aT2BleDataQueue, |
ocomeni | 118:8df0e9c2ee3f | 165 | MemoryPool<ble_at_msg_t, PQDSZ_BLE> *ble2ATDatamPool, |
ocomeni | 118:8df0e9c2ee3f | 166 | Queue<ble_at_msg_t, PQDSZ_BLE> *ble2ATDataQueue, |
ocomeni | 118:8df0e9c2ee3f | 167 | ble_config_t *ble_config); |
ocomeni | 75:08eff6258e1b | 168 | |
ocomeni | 75:08eff6258e1b | 169 | virtual void start(); |
ocomeni | 75:08eff6258e1b | 170 | |
ocomeni | 75:08eff6258e1b | 171 | /** This is called by Gap to notify the application we connected, |
ocomeni | 75:08eff6258e1b | 172 | * in our case it immediately requests a change in link security */ |
ocomeni | 75:08eff6258e1b | 173 | virtual void on_connect(const Gap::ConnectionCallbackParams_t *connection_event); |
ocomeni | 77:0b505d1e15f4 | 174 | void stopAdvertising(); |
ocomeni | 77:0b505d1e15f4 | 175 | void startAdvertising(); |
ocomeni | 76:6afda865fbf8 | 176 | |
ocomeni | 75:08eff6258e1b | 177 | }; |
ocomeni | 75:08eff6258e1b | 178 | |
ocomeni | 75:08eff6258e1b | 179 | /** A central device will scan, connect to a peer and request pairing. */ |
ocomeni | 75:08eff6258e1b | 180 | class SMDeviceCentral : public SMDevice { |
ocomeni | 75:08eff6258e1b | 181 | public: |
ocomeni | 78:07bb86e3ce14 | 182 | SMDeviceCentral(BLE &ble, events::EventQueue &event_queue, |
ocomeni | 118:8df0e9c2ee3f | 183 | BLEProtocol::AddressBytes_t &peer_address, |
ocomeni | 118:8df0e9c2ee3f | 184 | MemoryPool<at_ble_msg_t, PQDSZ_BLE> *aT2BleDatamPool, |
ocomeni | 118:8df0e9c2ee3f | 185 | Queue<at_ble_msg_t, PQDSZ_BLE> *aT2BleDataQueue, |
ocomeni | 118:8df0e9c2ee3f | 186 | MemoryPool<ble_at_msg_t, PQDSZ_BLE> *ble2ATDatamPool, |
ocomeni | 118:8df0e9c2ee3f | 187 | Queue<ble_at_msg_t, PQDSZ_BLE> *ble2ATDataQueue, |
ocomeni | 118:8df0e9c2ee3f | 188 | ble_config_t *ble_config); |
ocomeni | 75:08eff6258e1b | 189 | |
ocomeni | 75:08eff6258e1b | 190 | virtual void start(); |
ocomeni | 75:08eff6258e1b | 191 | |
ocomeni | 75:08eff6258e1b | 192 | /** Look at scan payload to find a peer device and connect to it */ |
ocomeni | 75:08eff6258e1b | 193 | void on_scan(const Gap::AdvertisementCallbackParams_t *params); |
ocomeni | 75:08eff6258e1b | 194 | |
ocomeni | 75:08eff6258e1b | 195 | /** This is called by Gap to notify the application we connected, |
ocomeni | 75:08eff6258e1b | 196 | * in our case it immediately request pairing */ |
ocomeni | 75:08eff6258e1b | 197 | virtual void on_connect(const Gap::ConnectionCallbackParams_t *connection_event); |
ocomeni | 75:08eff6258e1b | 198 | }; |
ocomeni | 75:08eff6258e1b | 199 | |
ocomeni | 75:08eff6258e1b | 200 | |
ocomeni | 75:08eff6258e1b | 201 | #if MBED_CONF_APP_FILESYSTEM_SUPPORT |
ocomeni | 75:08eff6258e1b | 202 | bool create_filesystem(); |
ocomeni | 75:08eff6258e1b | 203 | #endif //MBED_CONF_APP_FILESYSTEM_SUPPORT |
ocomeni | 75:08eff6258e1b | 204 | |
ocomeni | 74:f26e846adfe9 | 205 | #endif // __BLE_MANAGER_H__ |