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
Diff: main.cpp
- Revision:
- 0:62a78063f1a9
- Child:
- 1:2c34ba518eb3
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Mon Aug 04 11:11:06 2014 +0000
@@ -0,0 +1,155 @@
+#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;
+}
\ No newline at end of file
