mbed-os-examples / Mbed OS mbed-os-example-ble-Button
Committer:
mbed_official
Date:
Mon Jan 14 10:45:22 2019 +0000
Revision:
78:f06ac76a8f6d
Parent:
47:6aa590a64e1e
Child:
83:88f5f523e62e
Merge pull request #208 from ARMmbed/mbed-os-5.11.0-oob

Mbed OS 5.11.0
.
Commit copied from https://github.com/ARMmbed/mbed-os-example-ble

Who changed what in which revision?

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