20200716 read Status Register each second

Dependencies:   SDFileSystem mbed-os-example-ble-GattServer max32630fthr

Committer:
mbed_official
Date:
Wed Jun 20 11:03:22 2018 +0100
Revision:
0:c671a4833315
Child:
21:51e162c130a9
Merge pull request #158 from adbridge/master

Updating mbed-os to mbed-os-5.8.6
.
Commit copied from https://github.com/ARMmbed/mbed-os-example-ble

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_ */