2018-10-22: This is a temporary repository to fix issue mbed OS issue 8344. I'm reverting to an earlier mbed revision that isn't messed up. Expect mbed to fix the linker issue in the next release and I'll remove this repository. I havne't tested the code at this revision - sorry!

Dependencies:   BLE_API mbed mbedtls nRF51822

Revision:
4:e5fa4c8838db
Parent:
3:3eda308b78e6
Child:
5:f4d74a8cad43
--- a/main.cpp	Mon Jul 20 08:58:21 2015 +0000
+++ b/main.cpp	Fri Jul 31 09:11:43 2015 +0000
@@ -17,51 +17,48 @@
 
 #include "mbed.h"
 #include "ble/BLE.h"
-#include "ble/DiscoveredCharacteristic.h"
-#include "ble/DiscoveredService.h"
 #include "TMP_nrf51/TMP_nrf51.h"
 
-#define COMP_ID_TEST 0xFEFE
+#define APP_SPECIFIC_ID_TEST 0xFEFE
 
 #pragma pack(1)
-typedef struct manufacturerData {
-    uint16_t companyId;
-    /* User defined manufacture data */
-    TMP_nrf51::tmpSensorValue_t tmpSensorValue;
-} manufacturerData_t;
+struct ApplicationData_t {
+    uint16_t applicationSpecificId;             /* An ID used to identify temperature value
+                                                   in the manufacture specific AD data field */
+    TMP_nrf51::tmpSensorValue_t tmpSensorValue; /* User defined application data */
+};
 #pragma pack()
 
 BLE ble;
 TMP_nrf51 tempSensor;
 DigitalOut alivenessLED(LED1, 1);
-static bool triggerTempValueRead = true;
+static bool triggerTempValueUpdate = false;
 
 void periodicCallback(void)
 {
     /* Do blinky on LED1 while we're waiting for BLE events */
     alivenessLED = !alivenessLED;
-    triggerTempValueRead = true;
+    triggerTempValueUpdate = true;
+}
+
+void accumulateApplicationData(ApplicationData_t &appData)
+{
+    appData.applicationSpecificId = APP_SPECIFIC_ID_TEST;
+    /* Read a new temperature value */
+    appData.tmpSensorValue = tempSensor.get();
 }
 
 void temperatureValueAdvertising(void)
 {
-    manufacturerData_t manuData;
-    manuData.companyId = COMP_ID_TEST;
+    ApplicationData_t appData;
     
-    /* Read a new temperature value */
-    manuData.tmpSensorValue = tempSensor.get();
-    printf("Temp is %f\r\n", (float)manuData.tmpSensorValue);
-    
-    /* Stop advertising and clear the payload if in advertising state */
-    if((ble.gap().getState()).advertising == 1) {
-        ble.gap().stopAdvertising();
-        ble.gap().clearAdvertisingPayload();
-    }
+    accumulateApplicationData(appData);
+    //printf("Temp is %f\r\n", (float)appData.tmpSensorValue);
     
     /* Setup advertising payload */
     ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); /* Set flag */
     ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::GENERIC_THERMOMETER); /* Set appearance */
-    ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t *)&manuData, sizeof(manufacturerData_t)); /* Set data */
+    ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t *)&appData, sizeof(ApplicationData_t)); /* Set data */
     /* Setup advertising parameters */
     ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED);
     ble.gap().setAdvertisingInterval(500);
@@ -69,18 +66,35 @@
     ble.gap().startAdvertising();
 }
 
+void updateSensorValueInAdvPayload(void)
+{
+    ApplicationData_t appData;
+    
+    accumulateApplicationData(appData);
+    
+    /* Stop advertising first */
+    ble.gap().stopAdvertising();
+    /* Only update temperature value field */
+    ble.gap().updateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t *)&appData, sizeof(ApplicationData_t));
+    /* Start advertising again */
+    ble.gap().startAdvertising();
+}
+
 int main(void)
 {
     Ticker ticker;
-    /* Refresh temperature value every 2 seconds */
+    /* Enable trigger every 2 seconds */
     ticker.attach(periodicCallback, 2);
 
     ble.init();
-
+    /* Start temperature advertising */
+    temperatureValueAdvertising();
+    
     while (true) {
-        if (triggerTempValueRead) {
-            temperatureValueAdvertising();
-            triggerTempValueRead = false;
+        if (triggerTempValueUpdate) {
+            /* Update temperature value */
+            updateSensorValueInAdvPayload();
+            triggerTempValueUpdate = false;
         }
         ble.waitForEvent();
     }