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
main.cpp@0:6bb3a59b5028, 2016-04-22 (annotated)
- 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?
User | Revision | Line number | New 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 | } |