mbed code for UberVest health monitoring

Dependencies:   BLE_API mbed nRF51822

main.cpp

Committer:
haydenball
Date:
2015-10-24
Revision:
4:851d3f52c344
Parent:
3:183823979708
Child:
5:40fcfb34e48f

File content as of revision 4:851d3f52c344:

/* mbed Microcontroller Library
 * Copyright (c) 2006-2013 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.h"
#include "UberVestService.h"

// Outputs
DigitalOut connectionLed(LED1);
DigitalOut led2(LED2);
DigitalOut led3(LED3);

// Inputs
InterruptIn button(BUTTON1);
AnalogIn    ecg(p1);

BLE     ble;

const static char     DEVICE_NAME[] = "UberVest";
static const uint16_t uuid16_list[] = {UberVestService::UBER_VEST_SERVICE_UUID};

enum {
    RELEASED = 0,
    PRESSED,
    IDLE
};

static uint8_t buttonState = IDLE;
static int8_t ecgValue;
static volatile bool sample = false;

UberVestService *uberVestServicePtr;

void buttonPressedCallback(void)
{
    /* Note that the buttonPressedCallback() executes in interrupt context, so it is safer to access
     * BLE device API from the main thread. */
    buttonState = PRESSED;
}

void buttonReleasedCallback(void)
{
    /* Note that the buttonReleasedCallback() executes in interrupt context, so it is safer to access
     * BLE device API from the main thread. */
    buttonState = RELEASED;
}

void connectionCallback(const Gap::ConnectionCallbackParams_t *params)
{
    connectionLed = 1;
}

void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
{
    ble.gap().startAdvertising();
    connectionLed = 0;
}

void sampleTimer(void)
{
    led2 = !led2;
    sample = true;
}
    
int main(void)
{
    button.fall(buttonPressedCallback);
    button.rise(buttonReleasedCallback);

    ble.init();
    ble.gap().onConnection(connectionCallback);
    ble.gap().onDisconnection(disconnectionCallback);

    UberVestService uberVestService(ble, false /* initial value for button pressed */, 0);
    uberVestServicePtr = &uberVestService;
    
    Ticker sampler;
    sampler.attach(sampleTimer, 0.02);

    /* 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::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();

    while (true) {
        if (buttonState!=IDLE) {
            uberVestServicePtr->updateButtonState(buttonState);
            buttonState = IDLE;
        }
        
        if (ble.getGapState().connected && sample) {
            led3 = 0;
            sample = false;
            ecgValue = (ecg.read() * 1024);
            uberVestServicePtr->updateEcg(ecgValue);
        } else {
            led3 = 1;
            ble.waitForEvent();
        }
    }
}