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:
10:391c1acf4b9d
Parent:
9:438f44012039
Child:
11:6774f4827024

File content as of revision 10:391c1acf4b9d:

/* 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 "nRF51822n.h"

nRF51822n   nrf;                /* 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
 *
 * Reference:
 *  Bluetooth Core Specification 4.0 (Vol. 3), Part C, Section 11, 18
 */

/* Define an Beacon payload.
 *
 * This is the data part of the MSD AdvertisingData structure to be added to
 * the advertising payload.
 * --------------------------------------------------------------
 * 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();

    /* Initialise the nRF51822 */
    pc.printf("Initialising the nRF51822\n\r");
    nrf.init();
    nrf.reset();

    /* Setup advertising data. This includes AD structures in the payload of
     * advertising packets; and scan-response data. */
    {
        GapAdvertisingData advData;
        advData.addFlags(GapAdvertisingData::BREDR_NOT_SUPPORTED);
        advData.addData(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA,
                        beaconPayload,
                        sizeof(beaconPayload));
        GapAdvertisingData scanResponse;
        nrf.getGap().setAdvertisingData(advData, scanResponse);
    }

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

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

    /* unreachable. */
}

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;
}