Test for central Device A iBeacon

Dependencies:   BLE_API mbed nRF51822

Committer:
jslater8
Date:
Mon Jul 20 13:46:24 2015 +0000
Revision:
0:c9040e9dbeac
almost finished

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jslater8 0:c9040e9dbeac 1 /* mbed Microcontroller Library
jslater8 0:c9040e9dbeac 2 * Copyright (c) 2006-2013 ARM Limited
jslater8 0:c9040e9dbeac 3 *
jslater8 0:c9040e9dbeac 4 * Licensed under the Apache License, Version 2.0 (the "License");
jslater8 0:c9040e9dbeac 5 * you may not use this file except in compliance with the License.
jslater8 0:c9040e9dbeac 6 * You may obtain a copy of the License at
jslater8 0:c9040e9dbeac 7 *
jslater8 0:c9040e9dbeac 8 * http://www.apache.org/licenses/LICENSE-2.0
jslater8 0:c9040e9dbeac 9 *
jslater8 0:c9040e9dbeac 10 * Unless required by applicable law or agreed to in writing, software
jslater8 0:c9040e9dbeac 11 * distributed under the License is distributed on an "AS IS" BASIS,
jslater8 0:c9040e9dbeac 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
jslater8 0:c9040e9dbeac 13 * See the License for the specific language governing permissions and
jslater8 0:c9040e9dbeac 14 * limitations under the License.
jslater8 0:c9040e9dbeac 15 */
jslater8 0:c9040e9dbeac 16
jslater8 0:c9040e9dbeac 17 #include "mbed.h"
jslater8 0:c9040e9dbeac 18 #include "iBeaconService.h"
jslater8 0:c9040e9dbeac 19
jslater8 0:c9040e9dbeac 20 #define BLE_CHECK(X) (X == BLE_ERROR_NONE) ? (printf("{{success}}\r\n")) : printf("{{failure}} %s at line %u ERROR CODE: %u\r\n", #X, __LINE__, (X));
jslater8 0:c9040e9dbeac 21 #define BLE_EQUAL(X,Y) ((X)==(Y)) ? (printf("{{sucess}}\n")) : printf("{{failure}}\n");
jslater8 0:c9040e9dbeac 22
jslater8 0:c9040e9dbeac 23 /**
jslater8 0:c9040e9dbeac 24 * For this demo application, populate the beacon advertisement payload
jslater8 0:c9040e9dbeac 25 * with 2 AD structures: FLAG and MSD (manufacturer specific data).
jslater8 0:c9040e9dbeac 26 *
jslater8 0:c9040e9dbeac 27 * Reference:
jslater8 0:c9040e9dbeac 28 * Bluetooth Core Specification 4.0 (Vol. 3), Part C, Section 11, 18
jslater8 0:c9040e9dbeac 29 */
jslater8 0:c9040e9dbeac 30
jslater8 0:c9040e9dbeac 31 BLE ble;
jslater8 0:c9040e9dbeac 32 Ticker tick;
jslater8 0:c9040e9dbeac 33 DigitalOut myled(LED1);
jslater8 0:c9040e9dbeac 34 /**
jslater8 0:c9040e9dbeac 35 * The Beacon payload has the following composition:
jslater8 0:c9040e9dbeac 36 * 128-Bit / 16byte UUID = E2 0A 39 F4 73 F5 4B C4 A1 2F 17 D1 AD 07 A9 61
jslater8 0:c9040e9dbeac 37 * Major/Minor = 0x1122 / 0x3344
jslater8 0:c9040e9dbeac 38 * Tx Power = 0xC8 = 200, 2's compliment is 256-200 = (-56dB)
jslater8 0:c9040e9dbeac 39 *
jslater8 0:c9040e9dbeac 40 * Note: please remember to calibrate your beacons
jslater8 0:c9040e9dbeac 41 * TX Power for more accurate results.
jslater8 0:c9040e9dbeac 42 */
jslater8 0:c9040e9dbeac 43 const uint8_t uuid[] = {0xE2, 0x0A, 0x39, 0xF4, 0x73, 0xF5, 0x4B, 0xC4,
jslater8 0:c9040e9dbeac 44 0xA1, 0x2F, 0x17, 0xD1, 0xAD, 0x07, 0xA9, 0x61
jslater8 0:c9040e9dbeac 45 };
jslater8 0:c9040e9dbeac 46 uint16_t majorNumber = 1122;
jslater8 0:c9040e9dbeac 47 uint16_t minorNumber = 3344;
jslater8 0:c9040e9dbeac 48 uint16_t txPower = 0xC8;
jslater8 0:c9040e9dbeac 49
jslater8 0:c9040e9dbeac 50 Gap::AddressType_t addressType;
jslater8 0:c9040e9dbeac 51 Gap::Address_t address;
jslater8 0:c9040e9dbeac 52 Gap::Address_t addrTest = {110,100,100,100,100,100};
jslater8 0:c9040e9dbeac 53 const static char DEVICE_NAME[] = "IBEACONTEST";
jslater8 0:c9040e9dbeac 54 Gap::GapState_t state;
jslater8 0:c9040e9dbeac 55
jslater8 0:c9040e9dbeac 56 void changeAdvPay(void);
jslater8 0:c9040e9dbeac 57 void changeScanRes(void);
jslater8 0:c9040e9dbeac 58 /**
jslater8 0:c9040e9dbeac 59 * Test to change advertisement interval
jslater8 0:c9040e9dbeac 60 */
jslater8 0:c9040e9dbeac 61 void changeAdvTime(void){
jslater8 0:c9040e9dbeac 62 tick.detach();
jslater8 0:c9040e9dbeac 63 BLE_CHECK(ble.gap().stopAdvertising());
jslater8 0:c9040e9dbeac 64 ble.gap().setAdvertisingTimeout(0);
jslater8 0:c9040e9dbeac 65 ble.gap().setAdvertisingInterval(500);
jslater8 0:c9040e9dbeac 66 BLE_CHECK(ble.gap().startAdvertising());
jslater8 0:c9040e9dbeac 67 }
jslater8 0:c9040e9dbeac 68 /**
jslater8 0:c9040e9dbeac 69 * Test to change advertisement payload
jslater8 0:c9040e9dbeac 70 */
jslater8 0:c9040e9dbeac 71 void changeAdvPay(void){
jslater8 0:c9040e9dbeac 72 tick.detach();
jslater8 0:c9040e9dbeac 73 BLE_CHECK(ble.gap().stopAdvertising());
jslater8 0:c9040e9dbeac 74 ble.gap().clearAdvertisingPayload();
jslater8 0:c9040e9dbeac 75 ble.gap().setAdvertisingTimeout(0);
jslater8 0:c9040e9dbeac 76 BLE_CHECK(ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::LE_GENERAL_DISCOVERABLE | GapAdvertisingData::BREDR_NOT_SUPPORTED));
jslater8 0:c9040e9dbeac 77 BLE_CHECK(ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::OUTDOOR_GENERIC));
jslater8 0:c9040e9dbeac 78 BLE_CHECK(ble.gap().accumulateAdvertisingPayloadTxPower(10));
jslater8 0:c9040e9dbeac 79 uint8_t data[5] = {123,123,123,123,123};
jslater8 0:c9040e9dbeac 80 BLE_CHECK(ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::SERVICE_DATA, data, 5));
jslater8 0:c9040e9dbeac 81 //BLE_CHECK(ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)));
jslater8 0:c9040e9dbeac 82 ble.gap().setAdvertisingInterval(500);
jslater8 0:c9040e9dbeac 83 BLE_CHECK(ble.gap().startAdvertising());
jslater8 0:c9040e9dbeac 84 }
jslater8 0:c9040e9dbeac 85 /**
jslater8 0:c9040e9dbeac 86 * Test to change add a scan response
jslater8 0:c9040e9dbeac 87 */
jslater8 0:c9040e9dbeac 88 void changeScanRes(void){
jslater8 0:c9040e9dbeac 89 tick.detach();
jslater8 0:c9040e9dbeac 90 BLE_CHECK(ble.gap().stopAdvertising());
jslater8 0:c9040e9dbeac 91 ble.gap().clearAdvertisingPayload();
jslater8 0:c9040e9dbeac 92 ble.gap().clearScanResponse();
jslater8 0:c9040e9dbeac 93 ble.gap().setAdvertisingTimeout(0);
jslater8 0:c9040e9dbeac 94 ble.setAdvertisingType(GapAdvertisingParams::ADV_SCANNABLE_UNDIRECTED);
jslater8 0:c9040e9dbeac 95 uint8_t data2[5] = {50,50,50,50,50};
jslater8 0:c9040e9dbeac 96 BLE_CHECK(ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::SERVICE_DATA, data2, sizeof(data2)));
jslater8 0:c9040e9dbeac 97 uint8_t data[5] = {50,50,50,50,50};
jslater8 0:c9040e9dbeac 98 BLE_CHECK(ble.gap().accumulateScanResponse(GapAdvertisingData::SERVICE_DATA, data, sizeof(data)));
jslater8 0:c9040e9dbeac 99 ble.gap().setAdvertisingInterval(500);
jslater8 0:c9040e9dbeac 100 BLE_CHECK(ble.gap().startAdvertising());
jslater8 0:c9040e9dbeac 101 }
jslater8 0:c9040e9dbeac 102 /**
jslater8 0:c9040e9dbeac 103 * Test to change advertisement timeout
jslater8 0:c9040e9dbeac 104 */
jslater8 0:c9040e9dbeac 105 void timeoutTest(void){
jslater8 0:c9040e9dbeac 106 BLE_CHECK(ble.gap().stopAdvertising());
jslater8 0:c9040e9dbeac 107 ble.gap().clearAdvertisingPayload();
jslater8 0:c9040e9dbeac 108 ble.gap().clearScanResponse();
jslater8 0:c9040e9dbeac 109 ble.gap().setAdvertisingTimeout(5);
jslater8 0:c9040e9dbeac 110 BLE_CHECK(ble.gap().startAdvertising());
jslater8 0:c9040e9dbeac 111 }
jslater8 0:c9040e9dbeac 112 /**
jslater8 0:c9040e9dbeac 113 * Reset function run after every test
jslater8 0:c9040e9dbeac 114 */
jslater8 0:c9040e9dbeac 115 void reset(void){
jslater8 0:c9040e9dbeac 116 tick.detach();
jslater8 0:c9040e9dbeac 117 ble.gap().stopAdvertising();
jslater8 0:c9040e9dbeac 118 ble.gap().clearAdvertisingPayload();
jslater8 0:c9040e9dbeac 119 ble.gap().clearScanResponse();
jslater8 0:c9040e9dbeac 120 ble.gap().setAdvertisingTimeout(0);
jslater8 0:c9040e9dbeac 121 ble.gap().setAdvertisingInterval(1000);
jslater8 0:c9040e9dbeac 122 uint8_t data2[5] = {0,0,0,0,0};
jslater8 0:c9040e9dbeac 123 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::SERVICE_DATA, data2, sizeof(data2));
jslater8 0:c9040e9dbeac 124 BLE_CHECK(ble.gap().startAdvertising());
jslater8 0:c9040e9dbeac 125 }
jslater8 0:c9040e9dbeac 126 /**
jslater8 0:c9040e9dbeac 127 * Controls which tests are run from input from PC
jslater8 0:c9040e9dbeac 128 */
jslater8 0:c9040e9dbeac 129 void testCentre(void){
jslater8 0:c9040e9dbeac 130 int x;
jslater8 0:c9040e9dbeac 131 scanf("%d" , &x);
jslater8 0:c9040e9dbeac 132 printf("%d:%d:%d:%d:%d:%d\n", address[0], address[1], address[2], address[3], address[4], address[5]);
jslater8 0:c9040e9dbeac 133 GapAdvertisingData testData = ble.gap().getAdvertisingPayload();
jslater8 0:c9040e9dbeac 134 state = ble.gap().getState();
jslater8 0:c9040e9dbeac 135 !(testData.getPayload()) ? printf("{{failure}} ble.gap().getAdvertisingPayload() at line %u\r\n", __LINE__) : printf("{{success}}\r\n");
jslater8 0:c9040e9dbeac 136 (state.connected == 1 || state.advertising == 0) ? printf("{{failure}} ble.gap().getState() at line %u\r\n", __LINE__) : printf("{{success}}\r\n");
jslater8 0:c9040e9dbeac 137 while(true){
jslater8 0:c9040e9dbeac 138 scanf("%d", &x);
jslater8 0:c9040e9dbeac 139 switch (x){
jslater8 0:c9040e9dbeac 140 case 0:
jslater8 0:c9040e9dbeac 141 changeAdvTime();
jslater8 0:c9040e9dbeac 142 break;
jslater8 0:c9040e9dbeac 143 case 1:
jslater8 0:c9040e9dbeac 144 changeAdvPay();
jslater8 0:c9040e9dbeac 145 break;
jslater8 0:c9040e9dbeac 146 case 2:
jslater8 0:c9040e9dbeac 147 timeoutTest();
jslater8 0:c9040e9dbeac 148 break;
jslater8 0:c9040e9dbeac 149 case 3:
jslater8 0:c9040e9dbeac 150 changeScanRes();
jslater8 0:c9040e9dbeac 151 break;
jslater8 0:c9040e9dbeac 152 default:
jslater8 0:c9040e9dbeac 153 return;
jslater8 0:c9040e9dbeac 154 }
jslater8 0:c9040e9dbeac 155 scanf("%d", &x);
jslater8 0:c9040e9dbeac 156 reset();
jslater8 0:c9040e9dbeac 157 }
jslater8 0:c9040e9dbeac 158 }
jslater8 0:c9040e9dbeac 159
jslater8 0:c9040e9dbeac 160 int main(void)
jslater8 0:c9040e9dbeac 161 {
jslater8 0:c9040e9dbeac 162 myled = 0;
jslater8 0:c9040e9dbeac 163
jslater8 0:c9040e9dbeac 164 BLE_CHECK(ble.init());
jslater8 0:c9040e9dbeac 165
jslater8 0:c9040e9dbeac 166 iBeaconService ibeacon(ble, uuid, majorNumber, minorNumber, txPower);
jslater8 0:c9040e9dbeac 167
jslater8 0:c9040e9dbeac 168 ble.gap().setAdvertisingInterval(1000); /* 1000ms. */
jslater8 0:c9040e9dbeac 169 ble.gap().setAdvertisingTimeout(0);
jslater8 0:c9040e9dbeac 170
jslater8 0:c9040e9dbeac 171 BLE_CHECK(ble.gap().setAddress(Gap::ADDR_TYPE_PUBLIC, addrTest));
jslater8 0:c9040e9dbeac 172 BLE_CHECK(ble.gap().getAddress(&addressType, address));
jslater8 0:c9040e9dbeac 173 BLE_CHECK(ble.gap().startAdvertising());
jslater8 0:c9040e9dbeac 174
jslater8 0:c9040e9dbeac 175 GapAdvertisingData testData = ble.gap().getAdvertisingPayload();
jslater8 0:c9040e9dbeac 176
jslater8 0:c9040e9dbeac 177 printf("{{success}}" "\n" "{{end}}" "\n"); //tells mbedhtrun to finish
jslater8 0:c9040e9dbeac 178 testCentre();
jslater8 0:c9040e9dbeac 179 }