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-23
Revision:
20:5e84b5b253a5
Parent:
19:869d8c7306b4
Child:
21:a61af863b273

File content as of revision 20:5e84b5b253a5:

/* 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);
    }

    ble.setAdvertisingType(GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED);
    ble.startAdvertising();

    /* 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);
}

void tickerCallback(void)
{
    tickerLED = !tickerLED;
}