ongoing Development Project for interfacing a BM019 Module with nrf51-dk, acting as a nfc 2 ble bridge. Base project for opensource blueReader Device
Dependencies: BLE_API mbed nRF51822
main.cpp
- Committer:
- SandraK
- Date:
- 2016-04-21
- Revision:
- 1:e4e03060b32f
- Parent:
- 0:d156731c291b
File content as of revision 1:e4e03060b32f:
#include "mbed.h" #include "ble/BLE.h" #include "ble/services/UARTService.h" #include "log.h" /* This is an example of using the implemented functions of the bm019-library with an nrf51, acting as UART-Service. This code uses the spi version of the interface. */ #include "bm019.h" BLEDevice ble; UARTService *uartServicePtr; void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) { DEBUG("Disconnected!\n\r"); DEBUG("Restarting the advertising process\n\r"); ble.startAdvertising(); } char answer[512]; Ticker ticker; void timerCallback(void) { DEBUG("start timer callback"); sprintf(answer,"+.!"); DEBUG("writing beatpulse \"%s\" with len %d to ble\n",answer,strlen(answer)); int l = strlen(answer); for(int i = 0; i*20 < strlen(answer); i++) { int len = 20 < l ? 20 : l; ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), (uint8_t *)&answer[i*20], len); l -= 20; } ticker.detach(); } void onDataWritten(const GattWriteCallbackParams *params) { if ((uartServicePtr != NULL) && (params->handle == uartServicePtr->getTXCharacteristicHandle())) { uint16_t bytesRead = params->len; bool handled = false; for(int i = 0; !handled && i < bytesRead; i++) { switch(params->data[i]) { case '?': { DEBUG("Handle ?\n"); switch(getStateBM019()) { case BM019_STATE_UNKNOWN: DEBUG("BM019 Status: unknown\n"); sprintf(answer,"+?:0!"); break; case BM019_STATE_ANSWERING: DEBUG("BM019 Status: answering\n"); sprintf(answer,"+?:1!"); break; case BM019_STATE_PROTOCOL: DEBUG("BM019 Status: protocol set\n"); sprintf(answer,"+?:2!"); break; default: sprintf(answer,"-?%d!",getStateBM019()); DEBUG("BM019 Status: forgotten state\n"); } handled = true; } break; case 'b': case 'B': DEBUG("Handling b\n"); if(i + 5 <= bytesRead) { sprintf(answer,"+b!"); int adr = 0; char b[3]; b[0] = params->data[i+4]; b[1] = params->data[i+5]; b[2] = 0; sscanf(b,"%x",&adr); DEBUG("beat in %d sec\n",adr); ticker.attach(timerCallback, adr); i+=5; handled=true; } else { sprintf(answer,"-b!"); handled=true; } break; case 'h': case 'H': { DEBUG("Handling h\n"); if(hybernateBM019()) { sprintf(answer,"+h!"); } else { DEBUG("BM019 did hybernate wake\n") sprintf(answer,"-h!"); } handled=true; } break; case 'w': case 'W': { DEBUG("handle w\n") if(wakeBM019(100)) { DEBUG("BM019 did wake\n") sprintf(answer,"+w!"); } else { DEBUG("BM019 did NOT wake\n") sprintf(answer,"-w!"); } handled = true; } break; case 'i': case 'I': { DEBUG("handle i\n"); BM019_IDN idn; if(idnBM019(&idn)) { sprintf(answer,"+i:"); int i; for(i = 0; i < 13; i++) { sprintf(&answer[strlen(answer)],"%x",idn.deviceID[i]); } sprintf(&answer[strlen(answer)],":"); sprintf(&answer[strlen(answer)],"%x%x!",idn.romCRC[0],idn.romCRC[1]); DEBUG("answered: %s",answer); } else { DEBUG("BM019 failed idn\n") sprintf(answer,"-i!"); } handled = true; } break; case 'p': case 'P': { DEBUG("handle p\n"); if(setProtocolISO_EIC_15693BM019((BM019_PROTOCOL_ISO_IEC_15693_BYTE_0)( BM019_PROTOCOL_ISO_IEC_15693_BYTE_0_0_CRC | BM019_PROTOCOL_ISO_IEC_15693_BYTE_0_1_SINGLE_SUBCARRIER | BM019_PROTOCOL_ISO_IEC_15693_BYTE_0_2_10_MODULATION | BM019_PROTOCOL_ISO_IEC_15693_BYTE_0_3_WAIT_FOR_SOF | BM019_PROTOCOL_ISO_IEC_15693_BYTE_0_45_26_KBPS) )) { DEBUG("BM019 proto\n") sprintf(answer,"+p!"); } else { DEBUG("BM019 failed proto\n") sprintf(answer,"-p!"); } handled = true; } break; case 'r': case 'R': { DEBUG("handle r\n"); resetBM019(); sprintf(answer,"+r!"); handled = true; } break; case 'e': case 'E': { DEBUG("handle e\n"); if(echoBM019()) { DEBUG("BM019 sent echo\n"); sprintf(answer,"+e!"); } else { DEBUG("BM019 NOT sent echo\n"); sprintf(answer,"-e!"); } handled = true; } break; case 't': case 'T': { DEBUG("handle t\n"); BM019_TAG tag; if(inventoryISO_IES_15693BM019(&tag)) { DEBUG("BM019 answered inventory\n"); sprintf(answer,"+t:"); for(int i = 0; i < 8; i++) { sprintf(&answer[strlen(answer)],"%02x",tag.uid[i]); } sprintf(&answer[strlen(answer)],"!"); } else { DEBUG("BM019 NOT answered inventory\n"); sprintf(answer,"-t!"); } handled = true; } break; case 'd': case 'D': { DEBUG("handle d\n"); if(i + 5 <= bytesRead) { int adr = 0; char b[3]; b[0] = params->data[i+4]; b[1] = params->data[i+5]; b[2] = 0; sscanf(b,"%x",&adr); DEBUG("read from %#04x\n",adr); i+=5; uint8_t rb[256]; int l = readBM019(adr,rb,256); if(l>0) { DEBUG("BM019 answered read\n"); sprintf(answer,"+d:"); for(int i = 0; i < l; i++) { sprintf(&answer[strlen(answer)],"%02x",rb[i]); } sprintf(&answer[strlen(answer)],"!"); } else { DEBUG("BM019 NOT answered read\n"); sprintf(answer,"-d!"); } } else { DEBUG("BM019 NOT answered read, no adr given\n"); sprintf(answer,"-d!"); } handled = true; } break; case 'm': case 'M': { DEBUG("handle multi d\n"); if(i + 10 <= bytesRead) { int adr = 0; char b[3]; b[0] = params->data[i+4]; b[1] = params->data[i+5]; b[2] = 0; sscanf(b,"%x",&adr); int count = 0; b[0] = params->data[i+9]; b[1] = params->data[i+10]; b[2] = 0; sscanf(b,"%x",&count); DEBUG("read from %#04x for %d\n",adr,count); i+=10; uint8_t rb[256]; int l = readMultiBM019(adr,count,rb,256); if(l>0) { DEBUG("BM019 answered multi\n"); sprintf(answer,"+m:"); for(int i = 0; i < l; i++) { sprintf(&answer[strlen(answer)],"%02x",rb[i]); } sprintf(&answer[strlen(answer)],"!"); } else { DEBUG("BM019 NOT answered multi\n"); sprintf(answer,"-m!"); } } else { DEBUG("BM019 NOT answered read, no adr&count given\n"); sprintf(answer,"-m!"); } handled = true; } break; } } if(handled) { DEBUG("writing \"%s\" with len %d to ble\n",answer,strlen(answer)); int l = strlen(answer); for(int i = 0; i*20 < strlen(answer); i++) { int len = 20 < l ? 20 : l; ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), (uint8_t *)&answer[i*20], len); l -= 20; } } else { DEBUG("received %u bytes.. nothing handled.. echo\n", bytesRead); ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), params->data, bytesRead); } } } int main(void) { initBM019(); DEBUG("Initialising the nRF51822\n\r"); ble.init(); ble.onDisconnection(disconnectionCallback); ble.onDataWritten(onDataWritten); /* setup advertising */ ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED); ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); //ble.setAdvertisingType(GapAdvertisingParams::ADV_SCANNABLE_UNDIRECTED); ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME, (const uint8_t *)"BLE UART2NFC", sizeof("BLE UART2NFC") - 1); /*ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed)); */ ble.accumulateScanResponse(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed)); ble.setAdvertisingInterval(1000); /* 1000ms; in multiples of 0.625ms. */ //ble.setAdvertisingTimeout(0x1); ble.startAdvertising(); UARTService uartService(ble); uartServicePtr = &uartService; while (true) { ble.waitForEvent(); } }