BLE iBeacon demonstrating how to change the payload data every second
Dependencies: BLE_API mbed nRF51822
Fork of BLE_iBeacon by
Diff: main.cpp
- 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