BLE demo for the Health-Thermometer service.

Dependencies:   BLE_API MaximBLE mbed

Fork of BLE_Thermometer by Bluetooth Low Energy

Revision:
10:9a7e23066427
Parent:
8:63addc0221e7
Child:
13:30f6f65629b5
--- a/main.cpp	Tue Mar 24 08:16:30 2015 +0000
+++ b/main.cpp	Wed Apr 01 08:39:00 2015 +0000
@@ -31,33 +31,52 @@
     ble.startAdvertising();
 }
 
+void periodicCallback(void)
+{
+    led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */
+
+    /* Note that the periodicCallback() executes in interrupt context, so it is safer to do
+     * heavy-weight sensor polling from the main thread. */
+    triggerSensorPolling = true;
+}
+
 int main(void)
 {
     led1 = 1;
-    
-    /* Initialize BLE baselayer*/
+    Ticker ticker;
+    ticker.attach(periodicCallback, 1);
+
     ble.init();
     ble.onDisconnection(disconnectionCallback);
 
+    /* Setup primary service. */
+    float currentTemperature = 39.6;
+    HealthThermometerService thermometerService(ble, currentTemperature, HealthThermometerService::LOCATION_EAR);
+
     /* setup advertising */
     ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
     ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
     ble.accumulateAdvertisingPayload(GapAdvertisingData::THERMOMETER_EAR);
     ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
     ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
-    ble.setAdvertisingInterval(1600); /* 1000ms; in multiples of 0.625ms. */
-
-    /* setup Thermometer*/
-    float initialTemperature = 39.6;
-    HealthThermometerService thermometerService(ble, initialTemperature, HealthThermometerService::LOCATION_EAR);
-
-    /* Start Advertising*/
+    ble.setAdvertisingInterval(1000); /* 1000ms */
     ble.startAdvertising();
 
-    /* incriment temperature by 1 degree every second*/
     while (true) {
-        thermometerService.updateTemperature((initialTemperature++));
-        wait(2);
-        led1 = !led1; /* Flash LED*/
+        if (triggerSensorPolling && ble.getGapState().connected) {
+            triggerSensorPolling = false;
+
+            /* Do blocking calls or whatever is necessary for sensor polling. */
+            // error = sensor.readData();
+            // if (!error) {
+            //     thermometerService.updateTemperature(c);
+            // }
+
+            /* In our case, we simply update the dummy temperature measurement. */
+            currentTemperature += 0.1;
+            thermometerService.updateTemperature(currentTemperature);
+        } else {
+            ble.waitForEvent();
+        }
     }
 }