An example BLE Health Thermometer using the mbed BLE API and Nordic NRF51822

Dependencies:   BLE_API_Native_blog TMP102 mbed

Files at this revision

API Documentation at this revision

Comitter:
donalm
Date:
Sun Feb 23 14:39:55 2014 +0000
Parent:
1:0b759b99a902
Commit message:
Some tidy up while writing the blog.

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r 0b759b99a902 -r f11df1469db2 main.cpp
--- a/main.cpp	Sun Feb 23 12:53:35 2014 +0000
+++ b/main.cpp	Sun Feb 23 14:39:55 2014 +0000
@@ -21,18 +21,10 @@
 nRF51822n   nrf;                               /* BLE radio driver */
 TMP102      healthThemometer(p22, p20, 0x90);  /* The TMP102 connected to our board */
 
-/* LEDs and serial output for debug: */
-DigitalOut  led1(LED1);
-DigitalOut  led2(LED2);
-Serial      pc(USBTX,USBRX);
-
+/* LEDs for indication: */
+DigitalOut  oneSecondLed(LED1);        /* LED1 is toggled every second. */
+DigitalOut  advertisingStateLed(LED2); /* LED2 is on when we are advertising, otherwise off. */
 
-/* Device Information service */
-uint8_t            manufacturerName[4] = { 'm', 'b', 'e', 'd' };
-GattService        deviceInformationService ( GattService::UUID_DEVICE_INFORMATION_SERVICE );
-GattCharacteristic deviceManufacturer ( GattCharacteristic::UUID_MANUFACTURER_NAME_STRING_CHAR,
-                                        sizeof(manufacturerName), sizeof(manufacturerName),
-                                        GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
 
 /* Health Thermometer Service */ 
 uint8_t             thermTempPayload[5] = { 0, 0, 0, 0, 0 };
@@ -53,6 +45,7 @@
 GapAdvertisingData   advData;
 GapAdvertisingData   scanResponse;
 GapAdvertisingParams advParams ( GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED );
+
 uint16_t             uuid16_list[] = {GattService::UUID_HEALTH_THERMOMETER_SERVICE,
                                       GattService::UUID_BATTERY_SERVICE};
 
@@ -67,59 +60,18 @@
 /**************************************************************************/
 class GapEventHandler : public GapEvents
 {
-    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 onTimeout(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)
     {
-        pc.printf("Disconnected!\n\r");
-        pc.printf("Restarting the advertising process\n\r");
         nrf.getGap().startAdvertising(advParams);
-    }
-};
-
-/**************************************************************************/
-/*!
-    @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");
-        }
+        advertisingStateLed = 1;
     }
 };
 
@@ -130,18 +82,14 @@
 /**************************************************************************/
 int main(void)
 {
-    pc.baud(115200);
+    
+    /* Setup blinky led */
+    oneSecondLed=1;
     
-    /* Setup blinky: led1 is toggled in main, led2 is toggled via Ticker */
-    led1=1;
-    led2=0;
-
-    /* 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.getGattServer().setEventHandler(new GattServerEventHandler());
-
+    
     /* Initialise the nRF51822 */
-    pc.printf("Initialising the nRF51822\n\r");
     nrf.init();
 
     /* Make sure we get a clean start */
@@ -164,41 +112,36 @@
 
     /* Start advertising (make sure you've added all your data first) */
     nrf.getGap().startAdvertising(advParams);
-    
-    /* 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));
-
+    advertisingStateLed = 1;
 
     for (;;)
     {
+        /* Now that we're live, update the battery level & temperature characteristics */
+        updateServiceValues();
         wait(1);
-        updateServiceValues();
     }
 }
 
 /**************************************************************************/
 /*!
-    @brief  Ticker callback to switch led2 state
+    @brief  Ticker callback to switch advertisingStateLed state
 */
 /**************************************************************************/
 void updateServiceValues(void)
 {
-      /* Toggle the LEDs */
-      led1 = !led1;
-      led2 = !led2;
+      /* 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 */
+      /* Update the temperature. Note that we need to convert to an ieee11073 format float. */
       float temperature = healthThemometer.read();
       uint32_t temp_ieee11073 = quick_ieee11073_from_float(temperature);
       memcpy(thermTempPayload+1, &temp_ieee11073, 4);
       nrf.getGattServer().updateValue(thermTemp.handle, thermTempPayload, sizeof(thermTempPayload));
-      printf("Temperature: %f Celsius\r\n", temperature);
 }
 
 /**
@@ -212,4 +155,5 @@
     uint32_t mantissa = (uint32_t)(temperature*10);
     
     return ( ((uint32_t)exponent) << 24) | mantissa;
-}
\ No newline at end of file
+}
+