Heart Rate program only for TYBLE16

Dependencies:   TYBLE16_BASE

Please refer flowing link.
/users/kenjiArai/notebook/tyble16-module-will-become-a-mbed-family--mbedliza/

main.cpp

Committer:
kenjiArai
Date:
2018-02-25
Revision:
1:ba83bf091a45
Parent:
0:81403b36fabe

File content as of revision 1:ba83bf091a45:

/* 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.
 */
/*
    Modified by Kenji Arai, Feburary 25th, 2018
 */

#include "mbed.h"
#include "TYBLE16_BASE.h"
#include "ble/BLE.h"
#include "ble/services/HeartRateService.h"
#include "ble/services/BatteryService.h"
#include "ble/services/DeviceInformationService.h"

DigitalOut  led1(P0_5);
Serial      pc(P0_1, P0_3);

const static char     DEVICE_NAME[] = "TYBLE16";

static const uint16_t uuid16_list[] =
                            {GattService::UUID_HEART_RATE_SERVICE,
                             GattService::UUID_DEVICE_INFORMATION_SERVICE};

static volatile bool  triggerSensorPolling = false;

uint8_t hrmCounter = 100; // init HRM to 100bps

HeartRateService         *hrService;
DeviceInformationService *deviceInfo;

void disconnectionCallback(
    const Gap::DisconnectionCallbackParams_t *params
)
{
    // restart advertising
    BLE::Instance(BLE::DEFAULT_INSTANCE).gap().startAdvertising();
}

void periodicCallback(void)
{
    led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */
    
    /* Note that the periodicCallback() executes in interrupt context,
     * so it is safer to do
     * heavy-weight sensor polling from the main thread. */
    triggerSensorPolling = true;
}

void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
{
    BLE &ble          = params->ble;
    ble_error_t error = params->error;

    if (error != BLE_ERROR_NONE) {
        return;
    }

    ble.gap().onDisconnection(disconnectionCallback);

    /* Setup primary service. */
    hrService = new HeartRateService(
                                     ble,
                                     hrmCounter,
                                     HeartRateService::LOCATION_FINGER
                                     );

    /* Setup auxiliary service. */
    deviceInfo = new DeviceInformationService(
                                     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::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();
}

int main(void)
{
    led1 = 1;
    Ticker ticker;
    ticker.attach(periodicCallback, 1);     // blink LED every second

    BLE& ble = BLE::Instance(BLE::DEFAULT_INSTANCE);
    ble.init(bleInitComplete);

    /* SpinWait for initialization to complete. This is necessary 
     * because the BLE object is used in the main loop below. */
    while (ble.hasInitialized()  == false) { /* spin loop */ }
    // Check TYBLE-16 configuration
    cpu_sys();
    if (compile_condition() == false) {
        pc.printf("This is wrong configuration!!\r\n");
        while(true) {
            led1 = !led1;
            wait(0.2);
        }
    }
    //
    // infinite loop
    while (true) {
        // check for trigger from periodicCallback()
        if (triggerSensorPolling && ble.getGapState().connected) {
            triggerSensorPolling = false;

            // Do blocking calls or whatever is necessary for sensor polling.
            // In our case, we simply update the HRM measurement.
            hrmCounter++;
            if (hrmCounter == 175) { //  100 <= HRM bps <=175
                hrmCounter = 100;
            }

            hrService->updateHeartRate(hrmCounter);
        } else {
            ble.waitForEvent(); // low power wait for event
        }
    }
}