Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: BLE_API_Native_IRC mbed
Fork of sw_input_sample by
main.cpp
- Committer:
- tkubotake
- Date:
- 2014-08-04
- Revision:
- 0:62a78063f1a9
- Child:
- 1:2c34ba518eb3
File content as of revision 0:62a78063f1a9:
#include "mbed.h"
#include "SwDigital.h"
#include "nRF51822n.h"
nRF51822n nrf; /* BLE radio driver */
SwDigital sw(p2,p3,p4,p5); // p2 : sw1 control LED1,LED2
// p3 : sw2 control LED3,LED4
enum{
sw1,
sw2,
sw3,
sw4
};
/* LEDs for indication: */
DigitalOut oneSecondLed(LED1); /* LED1 is toggled every second. */
DigitalOut advertisingStateLed(LED2); /* LED2 is on when we are advertising, otherwise off. */
/* 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);
/* Battery Level Service */
uint8_t batt = 100; /* Battery level */
uint8_t read_batt = 0; /* Variable to hold battery level reads */
GattService battService ( GattService::UUID_BATTERY_SERVICE );
GattCharacteristic battLevel ( GattCharacteristic::UUID_BATTERY_LEVEL_CHAR, 1, 1,
GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY |
GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
/* Advertising data and parameters */
GapAdvertisingData advData;
GapAdvertisingData scanResponse;
GapAdvertisingParams advParams ( GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED );
uint16_t uuid16_list[] = {GattService::UUID_HEALTH_THERMOMETER_SERVICE,
GattService::UUID_BATTERY_SERVICE};
uint32_t quick_ieee11073_from_float(float temperature);
void updateServiceValues(int n);
/**************************************************************************/
/*!
@brief This custom class can be used to override any GapEvents
that you are interested in handling on an application level.
*/
/**************************************************************************/
class GapEventHandler : public GapEvents
{
//virtual void onTimeout(void) {}
virtual void onConnected(void)
{
advertisingStateLed = 0;
}
/* When a client device disconnects we need to start advertising again. */
virtual void onDisconnected(void)
{
nrf.getGap().startAdvertising(advParams);
advertisingStateLed = 1;
}
};
/**************************************************************************/
/*!
@brief Program entry point
*/
/**************************************************************************/
int main(void)
{
/* Setup blinky led */
oneSecondLed=1;
/* Setup an event handler for GAP events i.e. Client/Server connection events. */
nrf.getGap().setEventHandler(new GapEventHandler());
/* Initialise the nRF51822 */
nrf.init();
/* Make sure we get a clean start */
nrf.reset();
/* Add BLE-Only flag and complete service list to the advertising data */
advData.addFlags(GapAdvertisingData::BREDR_NOT_SUPPORTED);
advData.addData(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS,
(uint8_t*)uuid16_list, sizeof(uuid16_list));
advData.addAppearance(GapAdvertisingData::GENERIC_THERMOMETER);
nrf.getGap().setAdvertisingData(advData, scanResponse);
/* Health Thermometer Service */
thermService.addCharacteristic(thermTemp);
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) */
nrf.getGap().startAdvertising(advParams);
// advertisingStateLed = 1;
while(1)
{
sw.refreshEdgeData();
// tact action (sw level = on : led1 = on)
oneSecondLed = sw.checkLevel(sw1);
/* Now that we're live, update the battery level & temperature characteristics */
updateServiceValues(oneSecondLed.read());
//wait(0.1);
}
}
/**************************************************************************/
/*!
@brief Ticker callback to switch advertisingStateLed state
*/
/**************************************************************************/
void updateServiceValues(int n)
{
/* Toggle the one second LEDs */
//oneSecondLed = !oneSecondLed;
/* Update battery level */
nrf.getGattServer().updateValue(battLevel.handle, (uint8_t*)&batt, sizeof(batt));
/* Decrement the battery level. */
batt <=50 ? batt=100 : batt--;;
/* Update the temperature. Note that we need to convert to an ieee11073 format float. */
//float temperature = healthThemometer.read();
float temperature = 2.1*n;
uint32_t temp_ieee11073 = quick_ieee11073_from_float(temperature);
memcpy(thermTempPayload+1, &temp_ieee11073, 4);
nrf.getGattServer().updateValue(thermTemp.handle, thermTempPayload, sizeof(thermTempPayload));
}
/**
* @brief A very quick conversion between a float temperature and 11073-20601 FLOAT-Type.
* @param temperature The temperature as a float.
* @return The temperature in 11073-20601 FLOAT-Type format.
*/
uint32_t quick_ieee11073_from_float(float temperature)
{
uint8_t exponent = 0xFF; //exponent is -1
uint32_t mantissa = (uint32_t)(temperature*10);
return ( ((uint32_t)exponent) << 24) | mantissa;
}
