Example for SDT BLE-ibeacon

Committer:
group-Sigma-Delta-Technologies
Date:
Mon Sep 17 02:28:29 2018 +0000
Revision:
0:1bed737533ab
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
group-Sigma-Delta-Technologies 0:1bed737533ab 1 /* SDT-example-ble-ibeacon
group-Sigma-Delta-Technologies 0:1bed737533ab 2 *
group-Sigma-Delta-Technologies 0:1bed737533ab 3 * Copyright (c) 2018 Sigma Delta Technologies Inc.
group-Sigma-Delta-Technologies 0:1bed737533ab 4 *
group-Sigma-Delta-Technologies 0:1bed737533ab 5 * MIT License
group-Sigma-Delta-Technologies 0:1bed737533ab 6 *
group-Sigma-Delta-Technologies 0:1bed737533ab 7 * Permission is hereby granted, free of charge, to any person
group-Sigma-Delta-Technologies 0:1bed737533ab 8 * obtaining a copy of this software and associated documentation
group-Sigma-Delta-Technologies 0:1bed737533ab 9 * files (the "Software"), to deal in the Software without
group-Sigma-Delta-Technologies 0:1bed737533ab 10 * restriction, including without limitation the rights to use,
group-Sigma-Delta-Technologies 0:1bed737533ab 11 * copy, modify, merge, publish, distribute, sublicense, and/or sell
group-Sigma-Delta-Technologies 0:1bed737533ab 12 * copies of the Software, and to permit persons to whom the
group-Sigma-Delta-Technologies 0:1bed737533ab 13 * Software is furnished to do so, subject to the following
group-Sigma-Delta-Technologies 0:1bed737533ab 14 * conditions:
group-Sigma-Delta-Technologies 0:1bed737533ab 15 *
group-Sigma-Delta-Technologies 0:1bed737533ab 16 * The above copyright notice and this permission notice shall be
group-Sigma-Delta-Technologies 0:1bed737533ab 17 * included in all copies or substantial portions of the Software.
group-Sigma-Delta-Technologies 0:1bed737533ab 18 *
group-Sigma-Delta-Technologies 0:1bed737533ab 19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
group-Sigma-Delta-Technologies 0:1bed737533ab 20 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
group-Sigma-Delta-Technologies 0:1bed737533ab 21 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
group-Sigma-Delta-Technologies 0:1bed737533ab 22 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
group-Sigma-Delta-Technologies 0:1bed737533ab 23 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
group-Sigma-Delta-Technologies 0:1bed737533ab 24 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
group-Sigma-Delta-Technologies 0:1bed737533ab 25 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
group-Sigma-Delta-Technologies 0:1bed737533ab 26 * OTHER DEALINGS IN THE SOFTWARE.
group-Sigma-Delta-Technologies 0:1bed737533ab 27 */
group-Sigma-Delta-Technologies 0:1bed737533ab 28
group-Sigma-Delta-Technologies 0:1bed737533ab 29 #include "mbed.h"
group-Sigma-Delta-Technologies 0:1bed737533ab 30 #include "features/FEATURE_BLE/ble/BLE.h"
group-Sigma-Delta-Technologies 0:1bed737533ab 31 #include "features/FEATURE_BLE/ble/services/iBeacon.h"
group-Sigma-Delta-Technologies 0:1bed737533ab 32 #include "events/mbed_events.h"
group-Sigma-Delta-Technologies 0:1bed737533ab 33
group-Sigma-Delta-Technologies 0:1bed737533ab 34 /* Serial */
group-Sigma-Delta-Technologies 0:1bed737533ab 35 #define BAUDRATE 9600
group-Sigma-Delta-Technologies 0:1bed737533ab 36 Serial g_Serial_pc(USBTX, USBRX, BAUDRATE);
group-Sigma-Delta-Technologies 0:1bed737533ab 37
group-Sigma-Delta-Technologies 0:1bed737533ab 38 /* DigitalOut */
group-Sigma-Delta-Technologies 0:1bed737533ab 39 #define LED_ON 0
group-Sigma-Delta-Technologies 0:1bed737533ab 40 #define LED_OFF 1
group-Sigma-Delta-Technologies 0:1bed737533ab 41 DigitalOut g_DO_LedRed(LED_RED, LED_OFF);
group-Sigma-Delta-Technologies 0:1bed737533ab 42 DigitalOut g_DO_LedGreen(LED_GREEN, LED_OFF);
group-Sigma-Delta-Technologies 0:1bed737533ab 43 DigitalOut g_DO_LedBlue(LED_BLUE, LED_OFF);
group-Sigma-Delta-Technologies 0:1bed737533ab 44
group-Sigma-Delta-Technologies 0:1bed737533ab 45 /* Ticker */
group-Sigma-Delta-Technologies 0:1bed737533ab 46 Ticker g_Ticker;
group-Sigma-Delta-Technologies 0:1bed737533ab 47
group-Sigma-Delta-Technologies 0:1bed737533ab 48 /* EventQueue */
group-Sigma-Delta-Technologies 0:1bed737533ab 49 EventQueue g_EventQueue(4 * EVENTS_EVENT_SIZE);
group-Sigma-Delta-Technologies 0:1bed737533ab 50
group-Sigma-Delta-Technologies 0:1bed737533ab 51 /* BLE */
group-Sigma-Delta-Technologies 0:1bed737533ab 52 #define BLE_DEVICE_NAME "SDT Device"
group-Sigma-Delta-Technologies 0:1bed737533ab 53 BLE& g_pBle = BLE::Instance(); // Default ID of instance is 'DEFAULT_INSTANCE'
group-Sigma-Delta-Technologies 0:1bed737533ab 54
group-Sigma-Delta-Technologies 0:1bed737533ab 55 /* iBeacon */
group-Sigma-Delta-Technologies 0:1bed737533ab 56 iBeacon* g_pIbeacon;
group-Sigma-Delta-Technologies 0:1bed737533ab 57
group-Sigma-Delta-Technologies 0:1bed737533ab 58
group-Sigma-Delta-Technologies 0:1bed737533ab 59
group-Sigma-Delta-Technologies 0:1bed737533ab 60 void callbackTicker(void) {
group-Sigma-Delta-Technologies 0:1bed737533ab 61 g_Serial_pc.printf("LED Toggle\n");
group-Sigma-Delta-Technologies 0:1bed737533ab 62 g_DO_LedBlue = !g_DO_LedBlue;
group-Sigma-Delta-Technologies 0:1bed737533ab 63 }
group-Sigma-Delta-Technologies 0:1bed737533ab 64
group-Sigma-Delta-Technologies 0:1bed737533ab 65 void callbackEventsToProcess(BLE::OnEventsToProcessCallbackContext* context) {
group-Sigma-Delta-Technologies 0:1bed737533ab 66 g_EventQueue.call(Callback<void()>(&g_pBle, &BLE::processEvents));
group-Sigma-Delta-Technologies 0:1bed737533ab 67 }
group-Sigma-Delta-Technologies 0:1bed737533ab 68
group-Sigma-Delta-Technologies 0:1bed737533ab 69 void initIBeacon(BLE& ble) {
group-Sigma-Delta-Technologies 0:1bed737533ab 70 /**
group-Sigma-Delta-Technologies 0:1bed737533ab 71 * The Beacon payload has the following composition:
group-Sigma-Delta-Technologies 0:1bed737533ab 72 * 128-Bit / 16byte UUID = E2 0A 39 F4 73 F5 4B C4 A1 2F 17 D1 AD 07 A9 61
group-Sigma-Delta-Technologies 0:1bed737533ab 73 * Major/Minor = 0x1122 / 0x3344
group-Sigma-Delta-Technologies 0:1bed737533ab 74 * Tx Power = 0xC8 = 200, 2's compliment is 256-200 = (-56dB)
group-Sigma-Delta-Technologies 0:1bed737533ab 75 *
group-Sigma-Delta-Technologies 0:1bed737533ab 76 * Note: please remember to calibrate your beacons TX Power for more accurate results.
group-Sigma-Delta-Technologies 0:1bed737533ab 77 */
group-Sigma-Delta-Technologies 0:1bed737533ab 78 const uint8_t uuid[] = {0xE2, 0x0A, 0x39, 0xF4, 0x73, 0xF5, 0x4B, 0xC4,
group-Sigma-Delta-Technologies 0:1bed737533ab 79 0xA1, 0x2F, 0x17, 0xD1, 0xAD, 0x07, 0xA9, 0x61};
group-Sigma-Delta-Technologies 0:1bed737533ab 80 uint16_t majorNumber = 1122;
group-Sigma-Delta-Technologies 0:1bed737533ab 81 uint16_t minorNumber = 3344;
group-Sigma-Delta-Technologies 0:1bed737533ab 82 uint16_t txPower = 0xC8;
group-Sigma-Delta-Technologies 0:1bed737533ab 83 g_pIbeacon = new iBeacon(ble, uuid, majorNumber, minorNumber, txPower);
group-Sigma-Delta-Technologies 0:1bed737533ab 84 }
group-Sigma-Delta-Technologies 0:1bed737533ab 85
group-Sigma-Delta-Technologies 0:1bed737533ab 86 void printMacAddress(BLE& ble) {
group-Sigma-Delta-Technologies 0:1bed737533ab 87 /* Print out device MAC address to the console */
group-Sigma-Delta-Technologies 0:1bed737533ab 88 Gap::AddressType_t addr_type;
group-Sigma-Delta-Technologies 0:1bed737533ab 89 Gap::Address_t address;
group-Sigma-Delta-Technologies 0:1bed737533ab 90
group-Sigma-Delta-Technologies 0:1bed737533ab 91 ble.gap().getAddress(&addr_type, address);
group-Sigma-Delta-Technologies 0:1bed737533ab 92 g_Serial_pc.printf("DEVICE MAC ADDRESS = ");
group-Sigma-Delta-Technologies 0:1bed737533ab 93 for (int i = 5; i >= 1; i--){
group-Sigma-Delta-Technologies 0:1bed737533ab 94 g_Serial_pc.printf("%02x:", address[i]);
group-Sigma-Delta-Technologies 0:1bed737533ab 95 }
group-Sigma-Delta-Technologies 0:1bed737533ab 96 g_Serial_pc.printf("%02x\n", address[0]);
group-Sigma-Delta-Technologies 0:1bed737533ab 97 }
group-Sigma-Delta-Technologies 0:1bed737533ab 98
group-Sigma-Delta-Technologies 0:1bed737533ab 99 /**
group-Sigma-Delta-Technologies 0:1bed737533ab 100 * Callback triggered when the ble initialization process has finished
group-Sigma-Delta-Technologies 0:1bed737533ab 101 */
group-Sigma-Delta-Technologies 0:1bed737533ab 102 void callbackBleInitComplete(BLE::InitializationCompleteCallbackContext* params) {
group-Sigma-Delta-Technologies 0:1bed737533ab 103 BLE& ble = params->ble; // 'ble' equals g_pBle declared in global
group-Sigma-Delta-Technologies 0:1bed737533ab 104 ble_error_t error = params->error; // 'error' has BLE_ERROR_NONE if the initialization procedure started successfully.
group-Sigma-Delta-Technologies 0:1bed737533ab 105
group-Sigma-Delta-Technologies 0:1bed737533ab 106 if (error == BLE_ERROR_NONE) {
group-Sigma-Delta-Technologies 0:1bed737533ab 107 g_Serial_pc.printf("Initialization completed successfully\n");
group-Sigma-Delta-Technologies 0:1bed737533ab 108 }
group-Sigma-Delta-Technologies 0:1bed737533ab 109 else {
group-Sigma-Delta-Technologies 0:1bed737533ab 110 /* In case of error, forward the error handling to onBleInitError */
group-Sigma-Delta-Technologies 0:1bed737533ab 111 g_Serial_pc.printf("Initialization failled\n");
group-Sigma-Delta-Technologies 0:1bed737533ab 112 return;
group-Sigma-Delta-Technologies 0:1bed737533ab 113 }
group-Sigma-Delta-Technologies 0:1bed737533ab 114
group-Sigma-Delta-Technologies 0:1bed737533ab 115 /* Ensure that it is the default instance of BLE */
group-Sigma-Delta-Technologies 0:1bed737533ab 116 if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
group-Sigma-Delta-Technologies 0:1bed737533ab 117 g_Serial_pc.printf("ID of BLE instance is not DEFAULT_INSTANCE\n");
group-Sigma-Delta-Technologies 0:1bed737533ab 118 return;
group-Sigma-Delta-Technologies 0:1bed737533ab 119 }
group-Sigma-Delta-Technologies 0:1bed737533ab 120
group-Sigma-Delta-Technologies 0:1bed737533ab 121 /* Setup iBeacon */
group-Sigma-Delta-Technologies 0:1bed737533ab 122 initIBeacon(ble);
group-Sigma-Delta-Technologies 0:1bed737533ab 123
group-Sigma-Delta-Technologies 0:1bed737533ab 124 /* Setup and start advertising */
group-Sigma-Delta-Technologies 0:1bed737533ab 125 printMacAddress(ble); // Optional function
group-Sigma-Delta-Technologies 0:1bed737533ab 126 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME, (const uint8_t *)BLE_DEVICE_NAME, sizeof(BLE_DEVICE_NAME) - 1);
group-Sigma-Delta-Technologies 0:1bed737533ab 127 ble.gap().setAdvertisingInterval(1000); // Advertising interval in units of milliseconds
group-Sigma-Delta-Technologies 0:1bed737533ab 128 ble.gap().startAdvertising();
group-Sigma-Delta-Technologies 0:1bed737533ab 129 g_Serial_pc.printf("Start advertising\n");
group-Sigma-Delta-Technologies 0:1bed737533ab 130 }
group-Sigma-Delta-Technologies 0:1bed737533ab 131
group-Sigma-Delta-Technologies 0:1bed737533ab 132 int main(void) {
group-Sigma-Delta-Technologies 0:1bed737533ab 133 g_Serial_pc.printf("< Sigma Delta Technologies Inc. >\n\r");
group-Sigma-Delta-Technologies 0:1bed737533ab 134
group-Sigma-Delta-Technologies 0:1bed737533ab 135 /* Init BLE and iBeacon */
group-Sigma-Delta-Technologies 0:1bed737533ab 136 g_pBle.onEventsToProcess(callbackEventsToProcess);
group-Sigma-Delta-Technologies 0:1bed737533ab 137 g_pBle.init(callbackBleInitComplete);
group-Sigma-Delta-Technologies 0:1bed737533ab 138
group-Sigma-Delta-Technologies 0:1bed737533ab 139 /* Check whether IC is running or not */
group-Sigma-Delta-Technologies 0:1bed737533ab 140 g_Ticker.attach(callbackTicker, 1);
group-Sigma-Delta-Technologies 0:1bed737533ab 141
group-Sigma-Delta-Technologies 0:1bed737533ab 142 g_EventQueue.dispatch_forever();
group-Sigma-Delta-Technologies 0:1bed737533ab 143
group-Sigma-Delta-Technologies 0:1bed737533ab 144 return 0;
group-Sigma-Delta-Technologies 0:1bed737533ab 145 }