Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
00001 /* mbed Microcontroller Library 00002 * Copyright (c) 2006-2015 ARM Limited 00003 * 00004 * Licensed under the Apache License, Version 2.0 (the "License"); 00005 * you may not use this file except in compliance with the License. 00006 * You may obtain a copy of the License at 00007 * 00008 * http://www.apache.org/licenses/LICENSE-2.0 00009 * 00010 * Unless required by applicable law or agreed to in writing, software 00011 * distributed under the License is distributed on an "AS IS" BASIS, 00012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00013 * See the License for the specific language governing permissions and 00014 * limitations under the License. 00015 */ 00016 00017 #include <events/mbed_events.h> 00018 #include <mbed.h> 00019 #include "ble/BLE.h" 00020 #include "ble/Gap.h" 00021 #include "ble/services/HeartRateService.h" 00022 00023 DigitalOut led1(LED1, 1); 00024 00025 const static char DEVICE_NAME[] = "HRM"; 00026 static const uint16_t uuid16_list[] = {GattService::UUID_HEART_RATE_SERVICE}; 00027 00028 static uint8_t hrmCounter = 100; // init HRM to 100bps 00029 static HeartRateService *hrServicePtr; 00030 00031 static EventQueue eventQueue(/* event count */ 16 * EVENTS_EVENT_SIZE); 00032 00033 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) 00034 { 00035 BLE::Instance().gap().startAdvertising(); // restart advertising 00036 } 00037 00038 void updateSensorValue() { 00039 // Do blocking calls or whatever is necessary for sensor polling. 00040 // In our case, we simply update the HRM measurement. 00041 hrmCounter++; 00042 00043 // 100 <= HRM bps <=175 00044 if (hrmCounter == 175) { 00045 hrmCounter = 100; 00046 } 00047 00048 hrServicePtr->updateHeartRate(hrmCounter); 00049 } 00050 00051 void periodicCallback(void) 00052 { 00053 led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */ 00054 00055 if (BLE::Instance().getGapState().connected) { 00056 eventQueue.call(updateSensorValue); 00057 } 00058 } 00059 00060 void onBleInitError(BLE &ble, ble_error_t error) 00061 { 00062 (void)ble; 00063 (void)error; 00064 /* Initialization error handling should go here */ 00065 } 00066 00067 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params) 00068 { 00069 BLE& ble = params->ble; 00070 ble_error_t error = params->error; 00071 00072 if (error != BLE_ERROR_NONE) { 00073 onBleInitError(ble, error); 00074 return; 00075 } 00076 00077 if (ble.getInstanceID() != BLE::DEFAULT_INSTANCE) { 00078 return; 00079 } 00080 00081 ble.gap().onDisconnection(disconnectionCallback); 00082 00083 /* Setup primary service. */ 00084 hrServicePtr = new HeartRateService(ble, hrmCounter, HeartRateService::LOCATION_FINGER); 00085 00086 /* Setup advertising. */ 00087 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); 00088 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list)); 00089 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::GENERIC_HEART_RATE_SENSOR); 00090 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); 00091 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); 00092 ble.gap().setAdvertisingInterval(1000); /* 1000ms */ 00093 ble.gap().startAdvertising(); 00094 } 00095 00096 void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) { 00097 BLE &ble = BLE::Instance(); 00098 eventQueue.call(Callback<void()>(&ble, &BLE::processEvents)); 00099 } 00100 00101 int main() 00102 { 00103 eventQueue.call_every(500, periodicCallback); 00104 00105 BLE &ble = BLE::Instance(); 00106 ble.onEventsToProcess(scheduleBleEventsProcessing); 00107 ble.init(bleInitComplete); 00108 00109 eventQueue.dispatch_forever(); 00110 00111 return 0; 00112 }
Generated on Tue Jul 12 2022 15:34:11 by
1.7.2