Simple beacon for nRF51822

Dependencies:   BLE_API mbed nRF51822Copy

Fork of BLE_iBeacon by Bluetooth Low Energy

This is the demo beacon for ARM TechCon 2014.

Based on the original library, this demo reads the onboard switches and temperature sensor and beacons them out as a BLE advertisment.

main.cpp

Committer:
Rohit Grover
Date:
2014-05-22
Revision:
17:e7748951593e
Parent:
16:3a0aa30e3b12
Child:
18:e49bb8b059bf

File content as of revision 17:e7748951593e:

/* 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"

BLEDevice  ble;                /* BLE radio driver */

DigitalOut mainloopLED(LED1);
DigitalOut tickerLED(LED2);
Ticker     flipper;
Serial     pc(USBTX,USBRX);

/*
 * 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 = E2 0A 39 F4 73 F5 4B C4 A1 2F 17 D1 AD 07 A9 61
 * Major/Minor  = 0000 / 0000
 * Tx Power     = C8
 */
uint8_t beaconPayload[] = {
    0x4C, 0x00, // Company identifier code (0x004C == Apple)
    0x02,       // ID
    0x15,       // length of the remaining payload
    0xE2, 0x0A, 0x39, 0xF4, 0x73, 0xF5, 0x4B, 0xC4, // UUID
    0xA1, 0x2F, 0x17, 0xD1, 0xAD, 0x07, 0xA9, 0x61,
    0x00, 0x00, // the major value to differenciate a location
    0x00, 0x00, // the minor value to differenciate a location
    0xC8        // 2's complement of the Tx power (-56dB)
};

static void setupAppHardware(void);
static void tickerCallback(void);

int main(void)
{
    setupAppHardware();

    pc.printf("Initialising BTLE transport\n\r");
    ble.init();
    ble.reset();

    /* Setup advertising data. This includes AD structures in the payload of
     * advertising packets. */
    {
        GapAdvertisingData advData;
        advData.addFlags(GapAdvertisingData::BREDR_NOT_SUPPORTED);
        advData.addData(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA,
                        beaconPayload,
                        sizeof(beaconPayload));
        ble.setAdvertisingData(advData);
    }

    /* Start advertising! */
    GapAdvertisingParams advParams(
        GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED);
    ble.startAdvertising(advParams);

    /* Do blinky on mainloopLED while we're waiting for BLE events */
    for (;; ) {
        mainloopLED = !mainloopLED;
        wait(1);
    }
}

void setupAppHardware(void)
{
    /* Setup blinkies: mainloopLED is toggled in main, tickerLED is
     * toggled via Ticker */
    mainloopLED = 1;
    tickerLED   = 1;
    flipper.attach(&tickerCallback, 1.0);
}

/**************************************************************************/
/*!
    @brief  Ticker callback to switch tickerLED state
*/
/**************************************************************************/
void tickerCallback(void)
{
    tickerLED = !tickerLED;
}