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:
23:b66fa312e926
Parent:
22:080d9bf2f5c0
Child:
24:9bcd0dbf0f41

File content as of revision 23:b66fa312e926:

/* 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
 */
const static 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();

    ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
    ble.accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA,
                                     beaconPayload,
                                     sizeof(beaconPayload));

    ble.setAdvertisingType(GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED);
    ble.setAdvertisingTimeout(0);    /* disable timeout. */
    ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */
    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;
}