test

Committer:
TRxStudio
Date:
Mon Aug 03 22:16:42 2020 +0000
Revision:
0:a1e69a052b91
test

Who changed what in which revision?

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