Version 1

Committer:
d4rth_j0k3r
Date:
Fri Aug 07 07:10:58 2020 +0000
Revision:
0:ad26a5d97cd7
Child:
1:a6b119bfa56b
Version 1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
d4rth_j0k3r 0:ad26a5d97cd7 1 /* mbed Microcontroller Library
d4rth_j0k3r 0:ad26a5d97cd7 2 * Copyright (c) 2006-2013 ARM Limited
d4rth_j0k3r 0:ad26a5d97cd7 3 *
d4rth_j0k3r 0:ad26a5d97cd7 4 * Licensed under the Apache License, Version 2.0 (the "License");
d4rth_j0k3r 0:ad26a5d97cd7 5 * you may not use this file except in compliance with the License.
d4rth_j0k3r 0:ad26a5d97cd7 6 * You may obtain a copy of the License at
d4rth_j0k3r 0:ad26a5d97cd7 7 *
d4rth_j0k3r 0:ad26a5d97cd7 8 * http://www.apache.org/licenses/LICENSE-2.0
d4rth_j0k3r 0:ad26a5d97cd7 9 *
d4rth_j0k3r 0:ad26a5d97cd7 10 * Unless required by applicable law or agreed to in writing, software
d4rth_j0k3r 0:ad26a5d97cd7 11 * distributed under the License is distributed on an "AS IS" BASIS,
d4rth_j0k3r 0:ad26a5d97cd7 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
d4rth_j0k3r 0:ad26a5d97cd7 13 * See the License for the specific language governing permissions and
d4rth_j0k3r 0:ad26a5d97cd7 14 * limitations under the License.
d4rth_j0k3r 0:ad26a5d97cd7 15 */
d4rth_j0k3r 0:ad26a5d97cd7 16
d4rth_j0k3r 0:ad26a5d97cd7 17 #include <events/mbed_events.h>
d4rth_j0k3r 0:ad26a5d97cd7 18 #include <mbed.h>
d4rth_j0k3r 0:ad26a5d97cd7 19 #include "ble/BLE.h"
d4rth_j0k3r 0:ad26a5d97cd7 20 #include "LEDService.h"
d4rth_j0k3r 0:ad26a5d97cd7 21 #include "pretty_printer.h"
d4rth_j0k3r 0:ad26a5d97cd7 22
d4rth_j0k3r 0:ad26a5d97cd7 23 const static char DEVICE_NAME[] = "LED";
d4rth_j0k3r 0:ad26a5d97cd7 24
d4rth_j0k3r 0:ad26a5d97cd7 25 static EventQueue event_queue(/* event count */ 10 * EVENTS_EVENT_SIZE);
d4rth_j0k3r 0:ad26a5d97cd7 26
d4rth_j0k3r 0:ad26a5d97cd7 27 class LEDDemo : ble::Gap::EventHandler {
d4rth_j0k3r 0:ad26a5d97cd7 28 public:
d4rth_j0k3r 0:ad26a5d97cd7 29 LEDDemo(BLE &ble, events::EventQueue &event_queue) :
d4rth_j0k3r 0:ad26a5d97cd7 30 _ble(ble),
d4rth_j0k3r 0:ad26a5d97cd7 31 _event_queue(event_queue),
d4rth_j0k3r 0:ad26a5d97cd7 32 _alive_led(LED1, 1),
d4rth_j0k3r 0:ad26a5d97cd7 33 _actuated_led(LED2, 0),
d4rth_j0k3r 0:ad26a5d97cd7 34 _led_uuid(LEDService::LED_SERVICE_UUID),
d4rth_j0k3r 0:ad26a5d97cd7 35 _led_service(NULL),
d4rth_j0k3r 0:ad26a5d97cd7 36 _adv_data_builder(_adv_buffer) { }
d4rth_j0k3r 0:ad26a5d97cd7 37
d4rth_j0k3r 0:ad26a5d97cd7 38 ~LEDDemo() {
d4rth_j0k3r 0:ad26a5d97cd7 39 delete _led_service;
d4rth_j0k3r 0:ad26a5d97cd7 40 }
d4rth_j0k3r 0:ad26a5d97cd7 41
d4rth_j0k3r 0:ad26a5d97cd7 42 void start() {
d4rth_j0k3r 0:ad26a5d97cd7 43 _ble.gap().setEventHandler(this);
d4rth_j0k3r 0:ad26a5d97cd7 44
d4rth_j0k3r 0:ad26a5d97cd7 45 _ble.init(this, &LEDDemo::on_init_complete);
d4rth_j0k3r 0:ad26a5d97cd7 46
d4rth_j0k3r 0:ad26a5d97cd7 47 _event_queue.call_every(500, this, &LEDDemo::blink);
d4rth_j0k3r 0:ad26a5d97cd7 48
d4rth_j0k3r 0:ad26a5d97cd7 49 _event_queue.dispatch_forever();
d4rth_j0k3r 0:ad26a5d97cd7 50 }
d4rth_j0k3r 0:ad26a5d97cd7 51
d4rth_j0k3r 0:ad26a5d97cd7 52 private:
d4rth_j0k3r 0:ad26a5d97cd7 53 /** Callback triggered when the ble initialization process has finished */
d4rth_j0k3r 0:ad26a5d97cd7 54 void on_init_complete(BLE::InitializationCompleteCallbackContext *params) {
d4rth_j0k3r 0:ad26a5d97cd7 55 if (params->error != BLE_ERROR_NONE) {
d4rth_j0k3r 0:ad26a5d97cd7 56 printf("Ble initialization failed.");
d4rth_j0k3r 0:ad26a5d97cd7 57 return;
d4rth_j0k3r 0:ad26a5d97cd7 58 }
d4rth_j0k3r 0:ad26a5d97cd7 59
d4rth_j0k3r 0:ad26a5d97cd7 60 _led_service = new LEDService(_ble, false);
d4rth_j0k3r 0:ad26a5d97cd7 61
d4rth_j0k3r 0:ad26a5d97cd7 62 _ble.gattServer().onDataWritten(this, &LEDDemo::on_data_written);
d4rth_j0k3r 0:ad26a5d97cd7 63
d4rth_j0k3r 0:ad26a5d97cd7 64 print_mac_address();
d4rth_j0k3r 0:ad26a5d97cd7 65
d4rth_j0k3r 0:ad26a5d97cd7 66 start_advertising();
d4rth_j0k3r 0:ad26a5d97cd7 67 }
d4rth_j0k3r 0:ad26a5d97cd7 68
d4rth_j0k3r 0:ad26a5d97cd7 69 void start_advertising() {
d4rth_j0k3r 0:ad26a5d97cd7 70 /* Create advertising parameters and payload */
d4rth_j0k3r 0:ad26a5d97cd7 71
d4rth_j0k3r 0:ad26a5d97cd7 72 ble::AdvertisingParameters adv_parameters(
d4rth_j0k3r 0:ad26a5d97cd7 73 ble::advertising_type_t::CONNECTABLE_UNDIRECTED,
d4rth_j0k3r 0:ad26a5d97cd7 74 ble::adv_interval_t(ble::millisecond_t(1000))
d4rth_j0k3r 0:ad26a5d97cd7 75 );
d4rth_j0k3r 0:ad26a5d97cd7 76
d4rth_j0k3r 0:ad26a5d97cd7 77 _adv_data_builder.setFlags();
d4rth_j0k3r 0:ad26a5d97cd7 78 _adv_data_builder.setLocalServiceList(mbed::make_Span(&_led_uuid, 1));
d4rth_j0k3r 0:ad26a5d97cd7 79 _adv_data_builder.setName(DEVICE_NAME);
d4rth_j0k3r 0:ad26a5d97cd7 80
d4rth_j0k3r 0:ad26a5d97cd7 81 /* Setup advertising */
d4rth_j0k3r 0:ad26a5d97cd7 82
d4rth_j0k3r 0:ad26a5d97cd7 83 ble_error_t error = _ble.gap().setAdvertisingParameters(
d4rth_j0k3r 0:ad26a5d97cd7 84 ble::LEGACY_ADVERTISING_HANDLE,
d4rth_j0k3r 0:ad26a5d97cd7 85 adv_parameters
d4rth_j0k3r 0:ad26a5d97cd7 86 );
d4rth_j0k3r 0:ad26a5d97cd7 87
d4rth_j0k3r 0:ad26a5d97cd7 88 if (error) {
d4rth_j0k3r 0:ad26a5d97cd7 89 printf("_ble.gap().setAdvertisingParameters() failed\r\n");
d4rth_j0k3r 0:ad26a5d97cd7 90 return;
d4rth_j0k3r 0:ad26a5d97cd7 91 }
d4rth_j0k3r 0:ad26a5d97cd7 92
d4rth_j0k3r 0:ad26a5d97cd7 93 error = _ble.gap().setAdvertisingPayload(
d4rth_j0k3r 0:ad26a5d97cd7 94 ble::LEGACY_ADVERTISING_HANDLE,
d4rth_j0k3r 0:ad26a5d97cd7 95 _adv_data_builder.getAdvertisingData()
d4rth_j0k3r 0:ad26a5d97cd7 96 );
d4rth_j0k3r 0:ad26a5d97cd7 97
d4rth_j0k3r 0:ad26a5d97cd7 98 if (error) {
d4rth_j0k3r 0:ad26a5d97cd7 99 printf("_ble.gap().setAdvertisingPayload() failed\r\n");
d4rth_j0k3r 0:ad26a5d97cd7 100 return;
d4rth_j0k3r 0:ad26a5d97cd7 101 }
d4rth_j0k3r 0:ad26a5d97cd7 102
d4rth_j0k3r 0:ad26a5d97cd7 103 /* Start advertising */
d4rth_j0k3r 0:ad26a5d97cd7 104
d4rth_j0k3r 0:ad26a5d97cd7 105 error = _ble.gap().startAdvertising(ble::LEGACY_ADVERTISING_HANDLE);
d4rth_j0k3r 0:ad26a5d97cd7 106
d4rth_j0k3r 0:ad26a5d97cd7 107 if (error) {
d4rth_j0k3r 0:ad26a5d97cd7 108 printf("_ble.gap().startAdvertising() failed\r\n");
d4rth_j0k3r 0:ad26a5d97cd7 109 return;
d4rth_j0k3r 0:ad26a5d97cd7 110 }
d4rth_j0k3r 0:ad26a5d97cd7 111 }
d4rth_j0k3r 0:ad26a5d97cd7 112
d4rth_j0k3r 0:ad26a5d97cd7 113 /**
d4rth_j0k3r 0:ad26a5d97cd7 114 * This callback allows the LEDService to receive updates to the ledState Characteristic.
d4rth_j0k3r 0:ad26a5d97cd7 115 *
d4rth_j0k3r 0:ad26a5d97cd7 116 * @param[in] params Information about the characterisitc being updated.
d4rth_j0k3r 0:ad26a5d97cd7 117 */
d4rth_j0k3r 0:ad26a5d97cd7 118 void on_data_written(const GattWriteCallbackParams *params) {
d4rth_j0k3r 0:ad26a5d97cd7 119 if ((params->handle == _led_service->getValueHandle()) && (params->len == 1)) {
d4rth_j0k3r 0:ad26a5d97cd7 120 _actuated_led = *(params->data);
d4rth_j0k3r 0:ad26a5d97cd7 121 }
d4rth_j0k3r 0:ad26a5d97cd7 122 }
d4rth_j0k3r 0:ad26a5d97cd7 123
d4rth_j0k3r 0:ad26a5d97cd7 124 void blink() {
d4rth_j0k3r 0:ad26a5d97cd7 125 _alive_led = !_alive_led;
d4rth_j0k3r 0:ad26a5d97cd7 126 }
d4rth_j0k3r 0:ad26a5d97cd7 127
d4rth_j0k3r 0:ad26a5d97cd7 128 private:
d4rth_j0k3r 0:ad26a5d97cd7 129 /* Event handler */
d4rth_j0k3r 0:ad26a5d97cd7 130
d4rth_j0k3r 0:ad26a5d97cd7 131 void onDisconnectionComplete(const ble::DisconnectionCompleteEvent&) {
d4rth_j0k3r 0:ad26a5d97cd7 132 _ble.gap().startAdvertising(ble::LEGACY_ADVERTISING_HANDLE);
d4rth_j0k3r 0:ad26a5d97cd7 133 }
d4rth_j0k3r 0:ad26a5d97cd7 134
d4rth_j0k3r 0:ad26a5d97cd7 135 private:
d4rth_j0k3r 0:ad26a5d97cd7 136 BLE &_ble;
d4rth_j0k3r 0:ad26a5d97cd7 137 events::EventQueue &_event_queue;
d4rth_j0k3r 0:ad26a5d97cd7 138 DigitalOut _alive_led;
d4rth_j0k3r 0:ad26a5d97cd7 139 DigitalOut _actuated_led;
d4rth_j0k3r 0:ad26a5d97cd7 140
d4rth_j0k3r 0:ad26a5d97cd7 141 UUID _led_uuid;
d4rth_j0k3r 0:ad26a5d97cd7 142 LEDService *_led_service;
d4rth_j0k3r 0:ad26a5d97cd7 143
d4rth_j0k3r 0:ad26a5d97cd7 144 uint8_t _adv_buffer[ble::LEGACY_ADVERTISING_MAX_SIZE];
d4rth_j0k3r 0:ad26a5d97cd7 145 ble::AdvertisingDataBuilder _adv_data_builder;
d4rth_j0k3r 0:ad26a5d97cd7 146 };
d4rth_j0k3r 0:ad26a5d97cd7 147
d4rth_j0k3r 0:ad26a5d97cd7 148 /** Schedule processing of events from the BLE middleware in the event queue. */
d4rth_j0k3r 0:ad26a5d97cd7 149 void schedule_ble_events(BLE::OnEventsToProcessCallbackContext *context) {
d4rth_j0k3r 0:ad26a5d97cd7 150 event_queue.call(Callback<void()>(&context->ble, &BLE::processEvents));
d4rth_j0k3r 0:ad26a5d97cd7 151 }
d4rth_j0k3r 0:ad26a5d97cd7 152
d4rth_j0k3r 0:ad26a5d97cd7 153 int main()
d4rth_j0k3r 0:ad26a5d97cd7 154 {
d4rth_j0k3r 0:ad26a5d97cd7 155 BLE &ble = BLE::Instance();
d4rth_j0k3r 0:ad26a5d97cd7 156 ble.onEventsToProcess(schedule_ble_events);
d4rth_j0k3r 0:ad26a5d97cd7 157
d4rth_j0k3r 0:ad26a5d97cd7 158 LEDDemo demo(ble, event_queue);
d4rth_j0k3r 0:ad26a5d97cd7 159 demo.start();
d4rth_j0k3r 0:ad26a5d97cd7 160
d4rth_j0k3r 0:ad26a5d97cd7 161 return 0;
d4rth_j0k3r 0:ad26a5d97cd7 162 }
d4rth_j0k3r 0:ad26a5d97cd7 163