ongoing Development Project for interfacing a BM019 Module with nrf51-based ble, acting as a nfc 2 ble bridge. Base project for opensource blueReader Device

Dependencies:   BLE_API mbed nRF51822

Committer:
SandraK
Date:
Fri Apr 22 06:06:15 2016 +0000
Revision:
0:6bb3a59b5028
initial commit of uart based bm019 firmware

Who changed what in which revision?

UserRevisionLine numberNew contents of line
SandraK 0:6bb3a59b5028 1 #include "mbed.h"
SandraK 0:6bb3a59b5028 2 #include "ble/BLE.h"
SandraK 0:6bb3a59b5028 3
SandraK 0:6bb3a59b5028 4 #include "ble/services/UARTService.h"
SandraK 0:6bb3a59b5028 5
SandraK 0:6bb3a59b5028 6 #include "log.h"
SandraK 0:6bb3a59b5028 7 /*
SandraK 0:6bb3a59b5028 8 This is an example of using the implemented functions of the bm019-library with an nrf51, acting as UART-Service.
SandraK 0:6bb3a59b5028 9 This code uses the spi version of the interface.
SandraK 0:6bb3a59b5028 10 */
SandraK 0:6bb3a59b5028 11 #include "bm019.h"
SandraK 0:6bb3a59b5028 12
SandraK 0:6bb3a59b5028 13 BLEDevice ble;
SandraK 0:6bb3a59b5028 14 UARTService *uartServicePtr;
SandraK 0:6bb3a59b5028 15
SandraK 0:6bb3a59b5028 16 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
SandraK 0:6bb3a59b5028 17 {
SandraK 0:6bb3a59b5028 18 DEBUG("Disconnected!\n\r");
SandraK 0:6bb3a59b5028 19 DEBUG("Restarting the advertising process\n\r");
SandraK 0:6bb3a59b5028 20 ble.startAdvertising();
SandraK 0:6bb3a59b5028 21 }
SandraK 0:6bb3a59b5028 22 char answer[512];
SandraK 0:6bb3a59b5028 23
SandraK 0:6bb3a59b5028 24 Ticker ticker;
SandraK 0:6bb3a59b5028 25 void timerCallback(void)
SandraK 0:6bb3a59b5028 26 {
SandraK 0:6bb3a59b5028 27 DEBUG("start timer callback");
SandraK 0:6bb3a59b5028 28 sprintf(answer,"+.!");
SandraK 0:6bb3a59b5028 29 DEBUG("writing beatpulse \"%s\" with len %d to ble\n",answer,strlen(answer));
SandraK 0:6bb3a59b5028 30 int l = strlen(answer);
SandraK 0:6bb3a59b5028 31 for(int i = 0; i*20 < strlen(answer); i++) {
SandraK 0:6bb3a59b5028 32 int len = 20 < l ? 20 : l;
SandraK 0:6bb3a59b5028 33 ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), (uint8_t *)&answer[i*20], len);
SandraK 0:6bb3a59b5028 34 l -= 20;
SandraK 0:6bb3a59b5028 35 }
SandraK 0:6bb3a59b5028 36 ticker.detach();
SandraK 0:6bb3a59b5028 37 }
SandraK 0:6bb3a59b5028 38 void onDataWritten(const GattWriteCallbackParams *params)
SandraK 0:6bb3a59b5028 39 {
SandraK 0:6bb3a59b5028 40 if ((uartServicePtr != NULL) && (params->handle == uartServicePtr->getTXCharacteristicHandle())) {
SandraK 0:6bb3a59b5028 41 uint16_t bytesRead = params->len;
SandraK 0:6bb3a59b5028 42 bool handled = false;
SandraK 0:6bb3a59b5028 43
SandraK 0:6bb3a59b5028 44
SandraK 0:6bb3a59b5028 45 for(int i = 0; !handled && i < bytesRead; i++) {
SandraK 0:6bb3a59b5028 46 switch(params->data[i]) {
SandraK 0:6bb3a59b5028 47 case '?': {
SandraK 0:6bb3a59b5028 48 DEBUG("Handle ?\n");
SandraK 0:6bb3a59b5028 49 switch(getStateBM019()) {
SandraK 0:6bb3a59b5028 50 case BM019_STATE_UNKNOWN:
SandraK 0:6bb3a59b5028 51 DEBUG("BM019 Status: unknown\n");
SandraK 0:6bb3a59b5028 52 sprintf(answer,"+?:0!");
SandraK 0:6bb3a59b5028 53 break;
SandraK 0:6bb3a59b5028 54 case BM019_STATE_ANSWERING:
SandraK 0:6bb3a59b5028 55 DEBUG("BM019 Status: answering\n");
SandraK 0:6bb3a59b5028 56 sprintf(answer,"+?:1!");
SandraK 0:6bb3a59b5028 57 break;
SandraK 0:6bb3a59b5028 58 case BM019_STATE_PROTOCOL:
SandraK 0:6bb3a59b5028 59 DEBUG("BM019 Status: protocol set\n");
SandraK 0:6bb3a59b5028 60 sprintf(answer,"+?:2!");
SandraK 0:6bb3a59b5028 61 break;
SandraK 0:6bb3a59b5028 62 default:
SandraK 0:6bb3a59b5028 63 sprintf(answer,"-?%d!",getStateBM019());
SandraK 0:6bb3a59b5028 64 DEBUG("BM019 Status: forgotten state\n");
SandraK 0:6bb3a59b5028 65 }
SandraK 0:6bb3a59b5028 66 handled = true;
SandraK 0:6bb3a59b5028 67 }
SandraK 0:6bb3a59b5028 68 break;
SandraK 0:6bb3a59b5028 69
SandraK 0:6bb3a59b5028 70 case 'b':
SandraK 0:6bb3a59b5028 71 case 'B':
SandraK 0:6bb3a59b5028 72 DEBUG("Handling b\n");
SandraK 0:6bb3a59b5028 73 if(i + 5 <= bytesRead) {
SandraK 0:6bb3a59b5028 74 sprintf(answer,"+b!");
SandraK 0:6bb3a59b5028 75 int adr = 0;
SandraK 0:6bb3a59b5028 76 char b[3];
SandraK 0:6bb3a59b5028 77 b[0] = params->data[i+4];
SandraK 0:6bb3a59b5028 78 b[1] = params->data[i+5];
SandraK 0:6bb3a59b5028 79 b[2] = 0;
SandraK 0:6bb3a59b5028 80 sscanf(b,"%x",&adr);
SandraK 0:6bb3a59b5028 81 DEBUG("beat in %d sec\n",adr);
SandraK 0:6bb3a59b5028 82 ticker.attach(timerCallback, adr);
SandraK 0:6bb3a59b5028 83 i+=5;
SandraK 0:6bb3a59b5028 84 handled=true;
SandraK 0:6bb3a59b5028 85 } else {
SandraK 0:6bb3a59b5028 86 sprintf(answer,"-b!");
SandraK 0:6bb3a59b5028 87 handled=true;
SandraK 0:6bb3a59b5028 88 }
SandraK 0:6bb3a59b5028 89
SandraK 0:6bb3a59b5028 90 break;
SandraK 0:6bb3a59b5028 91 case 'h':
SandraK 0:6bb3a59b5028 92 case 'H': {
SandraK 0:6bb3a59b5028 93 DEBUG("Handling h\n");
SandraK 0:6bb3a59b5028 94 if(hybernateBM019()) {
SandraK 0:6bb3a59b5028 95 sprintf(answer,"+h!");
SandraK 0:6bb3a59b5028 96 } else {
SandraK 0:6bb3a59b5028 97 DEBUG("BM019 did hybernate wake\n")
SandraK 0:6bb3a59b5028 98 sprintf(answer,"-h!");
SandraK 0:6bb3a59b5028 99 }
SandraK 0:6bb3a59b5028 100 handled=true;
SandraK 0:6bb3a59b5028 101
SandraK 0:6bb3a59b5028 102 }
SandraK 0:6bb3a59b5028 103 break;
SandraK 0:6bb3a59b5028 104
SandraK 0:6bb3a59b5028 105 case 'w':
SandraK 0:6bb3a59b5028 106 case 'W': {
SandraK 0:6bb3a59b5028 107 DEBUG("handle w\n")
SandraK 0:6bb3a59b5028 108
SandraK 0:6bb3a59b5028 109 if(wakeBM019(100)) {
SandraK 0:6bb3a59b5028 110 DEBUG("BM019 did wake\n")
SandraK 0:6bb3a59b5028 111 sprintf(answer,"+w!");
SandraK 0:6bb3a59b5028 112 } else {
SandraK 0:6bb3a59b5028 113 DEBUG("BM019 did NOT wake\n")
SandraK 0:6bb3a59b5028 114 sprintf(answer,"-w!");
SandraK 0:6bb3a59b5028 115 }
SandraK 0:6bb3a59b5028 116 handled = true;
SandraK 0:6bb3a59b5028 117 }
SandraK 0:6bb3a59b5028 118 break;
SandraK 0:6bb3a59b5028 119
SandraK 0:6bb3a59b5028 120 case 'i':
SandraK 0:6bb3a59b5028 121 case 'I': {
SandraK 0:6bb3a59b5028 122 DEBUG("handle i\n");
SandraK 0:6bb3a59b5028 123 BM019_IDN idn;
SandraK 0:6bb3a59b5028 124 if(idnBM019(&idn)) {
SandraK 0:6bb3a59b5028 125 sprintf(answer,"+i:");
SandraK 0:6bb3a59b5028 126 int i;
SandraK 0:6bb3a59b5028 127 for(i = 0; i < 13; i++) {
SandraK 0:6bb3a59b5028 128 sprintf(&answer[strlen(answer)],"%x",idn.deviceID[i]);
SandraK 0:6bb3a59b5028 129 }
SandraK 0:6bb3a59b5028 130 sprintf(&answer[strlen(answer)],":");
SandraK 0:6bb3a59b5028 131 sprintf(&answer[strlen(answer)],"%x%x!",idn.romCRC[0],idn.romCRC[1]);
SandraK 0:6bb3a59b5028 132 DEBUG("answered: %s",answer);
SandraK 0:6bb3a59b5028 133 } else {
SandraK 0:6bb3a59b5028 134 DEBUG("BM019 failed idn\n")
SandraK 0:6bb3a59b5028 135 sprintf(answer,"-i!");
SandraK 0:6bb3a59b5028 136 }
SandraK 0:6bb3a59b5028 137
SandraK 0:6bb3a59b5028 138 handled = true;
SandraK 0:6bb3a59b5028 139 }
SandraK 0:6bb3a59b5028 140 break;
SandraK 0:6bb3a59b5028 141
SandraK 0:6bb3a59b5028 142 case 'p':
SandraK 0:6bb3a59b5028 143 case 'P': {
SandraK 0:6bb3a59b5028 144 DEBUG("handle p\n");
SandraK 0:6bb3a59b5028 145 if(setProtocolISO_EIC_15693BM019((BM019_PROTOCOL_ISO_IEC_15693_BYTE_0)(
SandraK 0:6bb3a59b5028 146 BM019_PROTOCOL_ISO_IEC_15693_BYTE_0_0_CRC |
SandraK 0:6bb3a59b5028 147 BM019_PROTOCOL_ISO_IEC_15693_BYTE_0_1_SINGLE_SUBCARRIER |
SandraK 0:6bb3a59b5028 148 BM019_PROTOCOL_ISO_IEC_15693_BYTE_0_2_10_MODULATION |
SandraK 0:6bb3a59b5028 149 BM019_PROTOCOL_ISO_IEC_15693_BYTE_0_3_WAIT_FOR_SOF |
SandraK 0:6bb3a59b5028 150 BM019_PROTOCOL_ISO_IEC_15693_BYTE_0_45_26_KBPS)
SandraK 0:6bb3a59b5028 151 )) {
SandraK 0:6bb3a59b5028 152 DEBUG("BM019 proto\n")
SandraK 0:6bb3a59b5028 153 sprintf(answer,"+p!");
SandraK 0:6bb3a59b5028 154 } else {
SandraK 0:6bb3a59b5028 155 DEBUG("BM019 failed proto\n")
SandraK 0:6bb3a59b5028 156 sprintf(answer,"-p!");
SandraK 0:6bb3a59b5028 157 }
SandraK 0:6bb3a59b5028 158
SandraK 0:6bb3a59b5028 159 handled = true;
SandraK 0:6bb3a59b5028 160 }
SandraK 0:6bb3a59b5028 161 break;
SandraK 0:6bb3a59b5028 162
SandraK 0:6bb3a59b5028 163 case 'r':
SandraK 0:6bb3a59b5028 164 case 'R': {
SandraK 0:6bb3a59b5028 165 DEBUG("handle r\n");
SandraK 0:6bb3a59b5028 166 resetBM019();
SandraK 0:6bb3a59b5028 167 sprintf(answer,"+r!");
SandraK 0:6bb3a59b5028 168 handled = true;
SandraK 0:6bb3a59b5028 169 }
SandraK 0:6bb3a59b5028 170 break;
SandraK 0:6bb3a59b5028 171
SandraK 0:6bb3a59b5028 172 case 'e':
SandraK 0:6bb3a59b5028 173 case 'E': {
SandraK 0:6bb3a59b5028 174 DEBUG("handle e\n");
SandraK 0:6bb3a59b5028 175 if(echoBM019()) {
SandraK 0:6bb3a59b5028 176 DEBUG("BM019 sent echo\n");
SandraK 0:6bb3a59b5028 177 sprintf(answer,"+e!");
SandraK 0:6bb3a59b5028 178 } else {
SandraK 0:6bb3a59b5028 179 DEBUG("BM019 NOT sent echo\n");
SandraK 0:6bb3a59b5028 180 sprintf(answer,"-e!");
SandraK 0:6bb3a59b5028 181 }
SandraK 0:6bb3a59b5028 182 handled = true;
SandraK 0:6bb3a59b5028 183 }
SandraK 0:6bb3a59b5028 184 break;
SandraK 0:6bb3a59b5028 185
SandraK 0:6bb3a59b5028 186 case 't':
SandraK 0:6bb3a59b5028 187 case 'T': {
SandraK 0:6bb3a59b5028 188 DEBUG("handle t\n");
SandraK 0:6bb3a59b5028 189 BM019_TAG tag;
SandraK 0:6bb3a59b5028 190 if(inventoryISO_IES_15693BM019(&tag)) {
SandraK 0:6bb3a59b5028 191 DEBUG("BM019 answered inventory\n");
SandraK 0:6bb3a59b5028 192 sprintf(answer,"+t:");
SandraK 0:6bb3a59b5028 193 for(int i = 0; i < 8; i++) {
SandraK 0:6bb3a59b5028 194 sprintf(&answer[strlen(answer)],"%02x",tag.uid[i]);
SandraK 0:6bb3a59b5028 195 }
SandraK 0:6bb3a59b5028 196 sprintf(&answer[strlen(answer)],"!");
SandraK 0:6bb3a59b5028 197 } else {
SandraK 0:6bb3a59b5028 198 DEBUG("BM019 NOT answered inventory\n");
SandraK 0:6bb3a59b5028 199 sprintf(answer,"-t!");
SandraK 0:6bb3a59b5028 200 }
SandraK 0:6bb3a59b5028 201 handled = true;
SandraK 0:6bb3a59b5028 202 }
SandraK 0:6bb3a59b5028 203 break;
SandraK 0:6bb3a59b5028 204
SandraK 0:6bb3a59b5028 205 case 'd':
SandraK 0:6bb3a59b5028 206 case 'D': {
SandraK 0:6bb3a59b5028 207 DEBUG("handle d\n");
SandraK 0:6bb3a59b5028 208 if(i + 5 <= bytesRead) {
SandraK 0:6bb3a59b5028 209 int adr = 0;
SandraK 0:6bb3a59b5028 210 char b[3];
SandraK 0:6bb3a59b5028 211 b[0] = params->data[i+4];
SandraK 0:6bb3a59b5028 212 b[1] = params->data[i+5];
SandraK 0:6bb3a59b5028 213 b[2] = 0;
SandraK 0:6bb3a59b5028 214 sscanf(b,"%x",&adr);
SandraK 0:6bb3a59b5028 215 DEBUG("read from %#04x\n",adr);
SandraK 0:6bb3a59b5028 216 i+=5;
SandraK 0:6bb3a59b5028 217 uint8_t rb[256];
SandraK 0:6bb3a59b5028 218 int l = readBM019(adr,rb,256);
SandraK 0:6bb3a59b5028 219 if(l>0) {
SandraK 0:6bb3a59b5028 220 DEBUG("BM019 answered read\n");
SandraK 0:6bb3a59b5028 221 sprintf(answer,"+d:");
SandraK 0:6bb3a59b5028 222 for(int i = 0; i < l; i++) {
SandraK 0:6bb3a59b5028 223 sprintf(&answer[strlen(answer)],"%02x",rb[i]);
SandraK 0:6bb3a59b5028 224 }
SandraK 0:6bb3a59b5028 225 sprintf(&answer[strlen(answer)],"!");
SandraK 0:6bb3a59b5028 226 } else {
SandraK 0:6bb3a59b5028 227 DEBUG("BM019 NOT answered read\n");
SandraK 0:6bb3a59b5028 228 sprintf(answer,"-d!");
SandraK 0:6bb3a59b5028 229 }
SandraK 0:6bb3a59b5028 230 } else {
SandraK 0:6bb3a59b5028 231 DEBUG("BM019 NOT answered read, no adr given\n");
SandraK 0:6bb3a59b5028 232 sprintf(answer,"-d!");
SandraK 0:6bb3a59b5028 233 }
SandraK 0:6bb3a59b5028 234 handled = true;
SandraK 0:6bb3a59b5028 235 }
SandraK 0:6bb3a59b5028 236 break;
SandraK 0:6bb3a59b5028 237
SandraK 0:6bb3a59b5028 238 case 'm':
SandraK 0:6bb3a59b5028 239 case 'M': {
SandraK 0:6bb3a59b5028 240 DEBUG("handle multi d\n");
SandraK 0:6bb3a59b5028 241 if(i + 10 <= bytesRead) {
SandraK 0:6bb3a59b5028 242 int adr = 0;
SandraK 0:6bb3a59b5028 243 char b[3];
SandraK 0:6bb3a59b5028 244 b[0] = params->data[i+4];
SandraK 0:6bb3a59b5028 245 b[1] = params->data[i+5];
SandraK 0:6bb3a59b5028 246 b[2] = 0;
SandraK 0:6bb3a59b5028 247 sscanf(b,"%x",&adr);
SandraK 0:6bb3a59b5028 248
SandraK 0:6bb3a59b5028 249 int count = 0;
SandraK 0:6bb3a59b5028 250 b[0] = params->data[i+9];
SandraK 0:6bb3a59b5028 251 b[1] = params->data[i+10];
SandraK 0:6bb3a59b5028 252 b[2] = 0;
SandraK 0:6bb3a59b5028 253 sscanf(b,"%x",&count);
SandraK 0:6bb3a59b5028 254 DEBUG("read from %#04x for %d\n",adr,count);
SandraK 0:6bb3a59b5028 255 i+=10;
SandraK 0:6bb3a59b5028 256 uint8_t rb[256];
SandraK 0:6bb3a59b5028 257 int l = readMultiBM019(adr,count,rb,256);
SandraK 0:6bb3a59b5028 258 if(l>0) {
SandraK 0:6bb3a59b5028 259 DEBUG("BM019 answered multi\n");
SandraK 0:6bb3a59b5028 260 sprintf(answer,"+m:");
SandraK 0:6bb3a59b5028 261 for(int i = 0; i < l; i++) {
SandraK 0:6bb3a59b5028 262 sprintf(&answer[strlen(answer)],"%02x",rb[i]);
SandraK 0:6bb3a59b5028 263 }
SandraK 0:6bb3a59b5028 264 sprintf(&answer[strlen(answer)],"!");
SandraK 0:6bb3a59b5028 265 } else {
SandraK 0:6bb3a59b5028 266 DEBUG("BM019 NOT answered multi\n");
SandraK 0:6bb3a59b5028 267 sprintf(answer,"-m!");
SandraK 0:6bb3a59b5028 268 }
SandraK 0:6bb3a59b5028 269 } else {
SandraK 0:6bb3a59b5028 270 DEBUG("BM019 NOT answered read, no adr&count given\n");
SandraK 0:6bb3a59b5028 271 sprintf(answer,"-m!");
SandraK 0:6bb3a59b5028 272 }
SandraK 0:6bb3a59b5028 273 handled = true;
SandraK 0:6bb3a59b5028 274 }
SandraK 0:6bb3a59b5028 275 break;
SandraK 0:6bb3a59b5028 276 }
SandraK 0:6bb3a59b5028 277 }
SandraK 0:6bb3a59b5028 278
SandraK 0:6bb3a59b5028 279 if(handled) {
SandraK 0:6bb3a59b5028 280 DEBUG("writing \"%s\" with len %d to ble\n",answer,strlen(answer));
SandraK 0:6bb3a59b5028 281 int l = strlen(answer);
SandraK 0:6bb3a59b5028 282 for(int i = 0; i*20 < strlen(answer); i++) {
SandraK 0:6bb3a59b5028 283 int len = 20 < l ? 20 : l;
SandraK 0:6bb3a59b5028 284 ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), (uint8_t *)&answer[i*20], len);
SandraK 0:6bb3a59b5028 285 l -= 20;
SandraK 0:6bb3a59b5028 286 }
SandraK 0:6bb3a59b5028 287
SandraK 0:6bb3a59b5028 288 } else {
SandraK 0:6bb3a59b5028 289 DEBUG("received %u bytes.. nothing handled.. echo\n", bytesRead);
SandraK 0:6bb3a59b5028 290 ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), params->data, bytesRead);
SandraK 0:6bb3a59b5028 291 }
SandraK 0:6bb3a59b5028 292 }
SandraK 0:6bb3a59b5028 293 }
SandraK 0:6bb3a59b5028 294
SandraK 0:6bb3a59b5028 295 int main(void)
SandraK 0:6bb3a59b5028 296 {
SandraK 0:6bb3a59b5028 297 initBM019();
SandraK 0:6bb3a59b5028 298
SandraK 0:6bb3a59b5028 299 DEBUG("Initialising the nRF51822\n\r");
SandraK 0:6bb3a59b5028 300 ble.init();
SandraK 0:6bb3a59b5028 301 ble.onDisconnection(disconnectionCallback);
SandraK 0:6bb3a59b5028 302 ble.onDataWritten(onDataWritten);
SandraK 0:6bb3a59b5028 303
SandraK 0:6bb3a59b5028 304 /* setup advertising */
SandraK 0:6bb3a59b5028 305 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
SandraK 0:6bb3a59b5028 306 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
SandraK 0:6bb3a59b5028 307 //ble.setAdvertisingType(GapAdvertisingParams::ADV_SCANNABLE_UNDIRECTED);
SandraK 0:6bb3a59b5028 308 ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
SandraK 0:6bb3a59b5028 309 (const uint8_t *)"BLE UART2NFC", sizeof("BLE UART2NFC") - 1);
SandraK 0:6bb3a59b5028 310
SandraK 0:6bb3a59b5028 311
SandraK 0:6bb3a59b5028 312 /*ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
SandraK 0:6bb3a59b5028 313 (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
SandraK 0:6bb3a59b5028 314 */
SandraK 0:6bb3a59b5028 315
SandraK 0:6bb3a59b5028 316 ble.accumulateScanResponse(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
SandraK 0:6bb3a59b5028 317 (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
SandraK 0:6bb3a59b5028 318 ble.setAdvertisingInterval(1000); /* 1000ms; in multiples of 0.625ms. */
SandraK 0:6bb3a59b5028 319 //ble.setAdvertisingTimeout(0x1);
SandraK 0:6bb3a59b5028 320 ble.startAdvertising();
SandraK 0:6bb3a59b5028 321
SandraK 0:6bb3a59b5028 322 UARTService uartService(ble);
SandraK 0:6bb3a59b5028 323 uartServicePtr = &uartService;
SandraK 0:6bb3a59b5028 324
SandraK 0:6bb3a59b5028 325 while (true) {
SandraK 0:6bb3a59b5028 326 ble.waitForEvent();
SandraK 0:6bb3a59b5028 327 }
SandraK 0:6bb3a59b5028 328 }