Update Health_Thermometer example to latest revision

pull/230/head
Emilio Monti 2014-03-24 17:18:17 +00:00
parent 5f2aec8bc7
commit 232bd99880
1 changed files with 40 additions and 99 deletions

View File

@ -1,5 +1,5 @@
/* mbed Microcontroller Library /* mbed Microcontroller Library
* Copyright (c) 2006-2013 ARM Limited * Copyright (c) 2006-2014 ARM Limited
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -15,22 +15,22 @@
*/ */
#include "mbed.h" #include "mbed.h"
#include "nRF51822n.h"
#include "TMP102.h" #include "TMP102.h"
#include "nRF51822n.h"
nRF51822n nrf; /* BLE radio driver */ nRF51822n nrf; /* BLE radio driver */
TMP102 healthThemometer(p22, p20, 0x90); /* The TMP102 connected to our board */
DigitalOut led1(LED1); /* LEDs for indication: */
DigitalOut led2(LED2); DigitalOut oneSecondLed(LED1); /* LED1 is toggled every second. */
Serial pc(USBTX,USBRX); DigitalOut advertisingStateLed(LED2); /* LED2 is on when we are advertising, otherwise off. */
TMP102 healthThemometer(p22, p20, 0x90);
/* Device Information service */
uint8_t manufacturerName[4] = { 'm', 'b', 'e', 'd' }; /* Health Thermometer Service */
GattService deviceInformationService ( GattService::UUID_DEVICE_INFORMATION_SERVICE ); uint8_t thermTempPayload[5] = { 0, 0, 0, 0, 0 };
GattCharacteristic deviceManufacturer ( GattCharacteristic::UUID_MANUFACTURER_NAME_STRING_CHAR, GattService thermService (GattService::UUID_HEALTH_THERMOMETER_SERVICE);
sizeof(manufacturerName), sizeof(manufacturerName), GattCharacteristic thermTemp (GattCharacteristic::UUID_TEMPERATURE_MEASUREMENT_CHAR,
GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); 5, 5, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE);
/* Battery Level Service */ /* Battery Level Service */
uint8_t batt = 100; /* Battery level */ uint8_t batt = 100; /* Battery level */
@ -41,19 +41,13 @@ GattCharacteristic battLevel ( GattCharacteristic::UUID_BATTERY_LEVEL_CHAR, 1,
GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
/* Health Thermometer Service */
uint8_t thermTempPayload[5] = { 0, 0, 0, 0, 0 };
GattService thermService (GattService::UUID_HEALTH_THERMOMETER_SERVICE);
GattCharacteristic thermTemp (GattCharacteristic::UUID_TEMPERATURE_MEASUREMENT_CHAR,
5, 5, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE);
/* Advertising data and parameters */ /* Advertising data and parameters */
GapAdvertisingData advData; GapAdvertisingData advData;
GapAdvertisingData scanResponse; GapAdvertisingData scanResponse;
GapAdvertisingParams advParams ( GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED ); GapAdvertisingParams advParams ( GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED );
uint16_t uuid16_list[] = { GattService::UUID_BATTERY_SERVICE,
GattService::UUID_DEVICE_INFORMATION_SERVICE, uint16_t uuid16_list[] = {GattService::UUID_HEALTH_THERMOMETER_SERVICE,
GattService::UUID_HEALTH_THERMOMETER_SERVICE }; GattService::UUID_BATTERY_SERVICE};
uint32_t quick_ieee11073_from_float(float temperature); uint32_t quick_ieee11073_from_float(float temperature);
void updateServiceValues(void); void updateServiceValues(void);
@ -66,59 +60,18 @@ void updateServiceValues(void);
/**************************************************************************/ /**************************************************************************/
class GapEventHandler : public GapEvents class GapEventHandler : public GapEvents
{ {
virtual void onTimeout(void) //virtual void onTimeout(void) {}
{
pc.printf("Advertising Timeout!\n\r");
// Restart the advertising process with a much slower interval,
// only start advertising again after a button press, etc.
}
virtual void onConnected(void) virtual void onConnected(void)
{ {
pc.printf("Connected!\n\r"); advertisingStateLed = 0;
} }
/* When a client device disconnects we need to start advertising again. */
virtual void onDisconnected(void) virtual void onDisconnected(void)
{ {
pc.printf("Disconnected!\n\r");
pc.printf("Restarting the advertising process\n\r");
nrf.getGap().startAdvertising(advParams); nrf.getGap().startAdvertising(advParams);
} advertisingStateLed = 1;
};
/**************************************************************************/
/*!
@brief This custom class can be used to override any GattServerEvents
that you are interested in handling on an application level.
*/
/**************************************************************************/
class GattServerEventHandler : public GattServerEvents
{
//virtual void onDataSent(void) {}
//virtual void onDataWritten(void) {}
virtual void onUpdatesEnabled(uint16_t charHandle)
{
if (charHandle == thermTemp.handle)
{
pc.printf("Temperature indication enabled\n\r");
}
}
virtual void onUpdatesDisabled(uint16_t charHandle)
{
if (charHandle == thermTemp.handle)
{
pc.printf("Temperature indication disabled\n\r");
}
}
virtual void onConfirmationReceived(uint16_t charHandle)
{
if (charHandle == thermTemp.handle)
{
pc.printf("Temperature indication received\n\r");
}
} }
}; };
@ -129,18 +82,14 @@ class GattServerEventHandler : public GattServerEvents
/**************************************************************************/ /**************************************************************************/
int main(void) int main(void)
{ {
pc.baud(115200);
/* Setup blinky: led1 is toggled in main, led2 is toggled via Ticker */ /* Setup blinky led */
led1=1; oneSecondLed=1;
led2=1;
/* Setup the local GAP/GATT event handlers */ /* Setup an event handler for GAP events i.e. Client/Server connection events. */
nrf.getGap().setEventHandler(new GapEventHandler()); nrf.getGap().setEventHandler(new GapEventHandler());
nrf.getGattServer().setEventHandler(new GattServerEventHandler());
/* Initialise the nRF51822 */ /* Initialise the nRF51822 */
pc.printf("Initialising the nRF51822\n\r");
nrf.init(); nrf.init();
/* Make sure we get a clean start */ /* Make sure we get a clean start */
@ -153,55 +102,46 @@ int main(void)
advData.addAppearance(GapAdvertisingData::GENERIC_THERMOMETER); advData.addAppearance(GapAdvertisingData::GENERIC_THERMOMETER);
nrf.getGap().setAdvertisingData(advData, scanResponse); nrf.getGap().setAdvertisingData(advData, scanResponse);
/* Add the Battery Level service */
battService.addCharacteristic(battLevel);
nrf.getGattServer().addService(battService);
/* Add the Device Information service */
deviceInformationService.addCharacteristic(deviceManufacturer);
nrf.getGattServer().addService(deviceInformationService);
/* Health Thermometer Service */ /* Health Thermometer Service */
thermService.addCharacteristic(thermTemp); thermService.addCharacteristic(thermTemp);
nrf.getGattServer().addService(thermService); nrf.getGattServer().addService(thermService);
/* Add the Battery Level service */
battService.addCharacteristic(battLevel);
nrf.getGattServer().addService(battService);
/* Start advertising (make sure you've added all your data first) */ /* Start advertising (make sure you've added all your data first) */
nrf.getGap().startAdvertising(advParams); nrf.getGap().startAdvertising(advParams);
advertisingStateLed = 1;
/* Now that we're live, update the battery level characteristic, and */
/* change the device manufacturer characteristic to 'mbed' */
nrf.getGattServer().updateValue(battLevel.handle, (uint8_t*)&batt, sizeof(batt));
nrf.getGattServer().updateValue(deviceManufacturer.handle, manufacturerName, sizeof(manufacturerName));
nrf.getGattServer().updateValue(thermTemp.handle, thermTempPayload, sizeof(thermTempPayload));
for (;;) for (;;)
{ {
wait(1); /* Now that we're live, update the battery level & temperature characteristics */
updateServiceValues(); updateServiceValues();
wait(1);
} }
} }
/**************************************************************************/ /**************************************************************************/
/*! /*!
@brief Ticker callback to switch led2 state @brief Ticker callback to switch advertisingStateLed state
*/ */
/**************************************************************************/ /**************************************************************************/
void updateServiceValues(void) void updateServiceValues(void)
{ {
/* Toggle the LED */ /* Toggle the one second LEDs */
led1 = !led1; oneSecondLed = !oneSecondLed;
/* Update battery level */ /* Update battery level */
nrf.getGattServer().updateValue(battLevel.handle, (uint8_t*)&batt, sizeof(batt)); nrf.getGattServer().updateValue(battLevel.handle, (uint8_t*)&batt, sizeof(batt));
/* Decrement the battery level. */
batt <=50 ? batt=100 : batt--;;
/* Update the temperature */ /* Update the temperature. Note that we need to convert to an ieee11073 format float. */
float temperature = healthThemometer.read(); float temperature = healthThemometer.read();
uint32_t temp_ieee11073 = quick_ieee11073_from_float(temperature); uint32_t temp_ieee11073 = quick_ieee11073_from_float(temperature);
memcpy(thermTempPayload+1, &temp_ieee11073, 4); memcpy(thermTempPayload+1, &temp_ieee11073, 4);
nrf.getGattServer().updateValue(thermTemp.handle, thermTempPayload, sizeof(thermTempPayload)); nrf.getGattServer().updateValue(thermTemp.handle, thermTempPayload, sizeof(thermTempPayload));
printf("Temperature: %f Celsius\r\n", temperature);
} }
/** /**
@ -216,3 +156,4 @@ uint32_t quick_ieee11073_from_float(float temperature)
return ( ((uint32_t)exponent) << 24) | mantissa; return ( ((uint32_t)exponent) << 24) | mantissa;
} }