mirror of https://github.com/ARMmbed/mbed-os.git
Update Health_Thermometer example to latest revision
parent
5f2aec8bc7
commit
232bd99880
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue