BLE iBeacon demonstrating how to change the payload data every second

Dependencies:   BLE_API mbed nRF51822

Fork of BLE_iBeacon by Bluetooth Low Energy

Revision:
48:6568db49629c
Parent:
47:447eb23e67e2
Child:
49:a3428aa11fc7
--- a/main.cpp	Wed Nov 05 14:16:16 2014 +0000
+++ b/main.cpp	Thu Dec 04 05:47:24 2014 +0000
@@ -1,50 +1,21 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2006-2013 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
 #include "mbed.h"
 #include "BLEDevice.h"
+#include "nrf_temp.h"
 
 BLEDevice ble;
 
-#define NEED_CONSOLE_OUTPUT 0 /* Set this if you need debug messages on the console;
-                               * it will have an impact on code-size and power consumption. */
+#define NEED_CONSOLE_OUTPUT 1 /* Set this if you need debug messages on the console;
+* it will have an impact on code-size and power consumption. */
 
 #if NEED_CONSOLE_OUTPUT
 Serial  pc(USBTX, USBRX);
+DigitalOut led1(LED1);
 #define DEBUG(...) { pc.printf(__VA_ARGS__); }
 #else
 #define DEBUG(...) /* nothing */
 #endif /* #if NEED_CONSOLE_OUTPUT */
 
-/*
- * For this demo application, populate the beacon advertisement payload
- * with 2 AD structures: FLAG and MSD (manufacturer specific data).
- *
- * Reference:
- *  Bluetooth Core Specification 4.0 (Vol. 3), Part C, Section 11, 18
- */
-
-/*
- * The Beacon payload (encapsulated within the MSD advertising data structure)
- * has the following composition:
- * 128-Bit UUID = 01 12 23 34 45 56 67 78 89 9A AB BC CD DE EF F0
- * Major/Minor  = 0000 / 0000
- * Tx Power     = C8
- */
-const uint8_t beaconPayload[] = {
+uint8_t beaconPayload[] = {
     0x4C, 0x00,
     0x02,
     0x15,
@@ -55,27 +26,81 @@
     0xC7
 };
 
+uint8_t counter = 100;
+static volatile bool  triggerPayloadUpdatePolling = false;
+
+void periodicCallback(void)
+{
+    led1 = !led1; 
+    /* Note that the periodicCallback() executes in interrupt context, so it is safer to do
+     * heavy-weight sensor polling from the main thread. */
+    triggerPayloadUpdatePolling = true;
+}
+
 int main(void)
 {
+
+
+    Ticker ticker;
+    ticker.attach(periodicCallback, 1);    //Sets update time of sensors
+
     DEBUG("Initialising BTLE transport\n\r");
+    beaconPayload[21] = 0x01;   //Minor value 2
+    beaconPayload[23] = 0x01;   //Minor value 2
     ble.init();
+     nrf_temp_init();
+   // pc.printf("temperature init");
 
     ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
     ble.accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, beaconPayload, sizeof(beaconPayload));
-
     ble.setAdvertisingType(GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED);
-    ble.setAdvertisingInterval(1600); /* 1s; in multiples of 0.625ms. */
+    ble.setAdvertisingInterval(16000); /* 1s; in multiples of 0.625ms. */
     ble.startAdvertising();
 
     for (;;) {
-        ble.waitForEvent();
-    }
+
+        /* Note that the periodicCallback() executes in interrupt context, so it is safer to do
+        * heavy-weight sensor polling from the main thread. */
+        if(triggerPayloadUpdatePolling) {
+            triggerPayloadUpdatePolling = false;
+            if(counter<100) {
+                counter++;
+            } else {
+                counter = 0;
+            }
+
+
+            int32_t temperature = 0;
+
+            NRF_TEMP->TASKS_START = 1; /* Start the temperature measurement */
+            while ((NRF_TEMP->EVENTS_DATARDY & TEMP_INTENSET_DATARDY_Msk) != (TEMP_INTENSET_DATARDY_Set << TEMP_INTENSET_DATARDY_Pos)) {
+            }
+            NRF_TEMP->EVENTS_DATARDY = 0;
+
+            temperature = (uint8_t)(nrf_temp_read()/4);
+
 
-    // An alternative to the above:
-    //
-    // DigitalOut mainloopLED(LED1);
-    // for (;;) {
-    //     mainloopLED = !mainloopLED;
-    //     ble.waitForEvent();
-    // }
-}
+            NRF_TEMP->TASKS_STOP = 1; /* Stop the temperature measurement */
+
+
+
+
+
+            DEBUG("are we here %d \n ",counter);
+            beaconPayload[21] = temperature;   //Major value 2
+            beaconPayload[23] = counter; //Minor value 2
+            ble.clearAdvertisingPayload();
+
+            ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
+            ble.accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, beaconPayload, sizeof(beaconPayload));
+            ble.setAdvertisingType(GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED);
+            ble.setAdvertisingInterval(16000); /* 1s; in multiples of 0.625ms. */
+            ble.startAdvertising();
+
+        } else {
+
+            ble.waitForEvent();
+        }
+
+    }
+}
\ No newline at end of file