GPS to Pulga

Dependencies:   Si1133 BME280

Committer:
pancotinho
Date:
Wed Jul 10 17:50:57 2019 +0000
Revision:
20:86417f956e22
Parent:
19:622c672f6d5f
Child:
22:2c6161c96a76
Frst commit

Who changed what in which revision?

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