Heart Rate Monitor example for the BLE API using nRF51822 native mode drivers
Dependencies: BLE_API mbed nRF51822
Fork of BLE_HeartRate by
main.cpp
- Committer:
- ankuraga
- Date:
- 2015-09-02
- Revision:
- 73:82447ab9efd8
- Parent:
- 72:fa6520343b72
File content as of revision 73:82447ab9efd8:
/* mbed Microcontroller Library * Copyright (c) 2006-2015 ARM Limited * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mbed.h" #include "ble/BLE.h" #include "ble/services/HeartRateService.h" #include "ble/services/HealthThermometerService.h" #include "ble/services/BatteryService.h" #include "ble/services/DeviceInformationService.h" #include "PulseSensor.h" BLE ble; DigitalOut led1(LED1); const static char DEVICE_NAME[] = "HRM1"; static const uint16_t uuid16_list[] = {GattService::UUID_HEART_RATE_SERVICE, GattService::UUID_HEALTH_THERMOMETER_SERVICE, GattService::UUID_DEVICE_INFORMATION_SERVICE}; static volatile bool triggerSensorPolling = false; void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason) { ble.gap().startAdvertising(); // restart advertising } HeartRateService * hrService; HealthThermometerService * htService; void sendDataToProcessing(int, int); int main(void) { led1 = 1; ble.init(); ble.gap().onDisconnection(disconnectionCallback); /* Setup primary service. */ uint8_t hrmCounter = 100; // init HRM to 100bps int htCounter = 100; hrService = new HeartRateService(ble, hrmCounter, HeartRateService::LOCATION_FINGER); htService = new HealthThermometerService(ble, hrmCounter, HealthThermometerService::LOCATION_BODY); /* Setup auxiliary service. */ DeviceInformationService deviceInfo(ble, "ARM", "Model1", "SN1", "hw-rev1", "fw-rev1", "soft-rev1"); /* Setup advertising. */ ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list)); ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::GENERIC_HEART_RATE_SENSOR); ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::GENERIC_THERMOMETER); ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); ble.gap().setAdvertisingInterval(1000); /* 1000ms */ ble.gap().startAdvertising(); //PulseSensor sensor(P0_5, sendDataToProcessing); //sensor.start(); /*while (1){ led1 = 0; wait(1); led1 = 1; wait(1); }*/ // infinite loop while (1) { // check for trigger from periodicCallback() if (1) //(triggerSensorPolling && ble.getGapState().connected) { triggerSensorPolling = false; led1 = 1; wait(1); // Do blocking calls or whatever is necessary for sensor polling. // In our case, we simply update the HRM measurement. hrmCounter++; htCounter--; // 100 <= HRM bps <=175 if (hrmCounter == 175) { hrmCounter = 100; } if (htCounter == 1) { htCounter = 100; } // update bps sendDataToProcessing(hrmCounter, htCounter); led1 = 0; wait(1); } else { //ble.waitForEvent(); // low power wait for event led1 = 1; } } } //PulseSensor.h expects a function with argument (int)..you can't use uint8 here void sendDataToProcessing(int hrmCounter, int htCounter){ hrService->updateHeartRate((uint8_t)hrmCounter); htService->updateTemperature((float)htCounter); //or you could just cast it to unit8..this just eases debugging //int* ans = &hrmCounter; }