123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248 |
- #include "ndef.h"
- #include <string.h>
- #include "nfcForum.h"
- #include "rtdTypes.h"
- #include "NT3H.h"
- typedef uint8_t (*composeRtdPtr)(const NDEFDataStr *ndef, NDEFRecordStr *ndefRecord, uint8_t *I2CMsg);
- static composeRtdPtr composeRtd[] = {composeRtdText,composeRtdUri};
- int16_t firstRecord(UncompletePageStr *page, const NDEFDataStr *data, RecordPosEnu rtdPosition) {
-
- NDEFRecordStr record;
- NDEFHeaderStr header;
- uint8_t typeFunct=0;
- switch (data->rtdType){
- case RTD_TEXT:
- typeFunct =0;
- break;
- case RTD_URI:
- typeFunct = 1;
- break;
- default:
- return -1;
- break;
- }
-
- memset(&record,0,sizeof(NDEFRecordStr));
- memset(nfcPageBuffer, 0, NFC_PAGE_SIZE);
-
- nfcPageBuffer[0] = NDEF_START_BYTE;
- composeNDEFMBME(true, true, &record);
- uint8_t recordLength;
-
- if(data->rtdPayloadlength>248){
- recordLength = composeRtd[typeFunct](data, &record, &nfcPageBuffer[4]);
- header.payloadLength = data->rtdPayloadlength + recordLength;
- }
- else{
- recordLength = composeRtd[typeFunct](data, &record, &nfcPageBuffer[2]);
- header.payloadLength = data->rtdPayloadlength + recordLength;
-
- }
- if(header.payloadLength>255){
- nfcPageBuffer[1] = 0xff;
- nfcPageBuffer[2] = header.payloadLength/256;
- nfcPageBuffer[3] = header.payloadLength%256;
- return 4+recordLength;
- }
- nfcPageBuffer[1] = header.payloadLength;
- return 2+recordLength;
- }
- int16_t addRecord(UncompletePageStr *pageToUse, const NDEFDataStr *data, RecordPosEnu rtdPosition) {
- NDEFRecordStr record;
- NDEFHeaderStr header={0};
- uint8_t newRecordPtr, mbMe;
- bool ret = true;
- uint8_t tmpBuffer[NFC_PAGE_SIZE];
- uint8_t typeFunct=0;
- switch (data->rtdType){
- case RTD_TEXT:
- typeFunct =0;
- break;
- case RTD_URI:
- typeFunct = 1;
- break;
- default:
- return -1;
- break;
- }
-
- NT3HReadHeaderNfc(&newRecordPtr, &mbMe);
- record.header = mbMe;
- composeNDEFMBME(true, false, &record);
- mbMe = record.header;
- memset(&record,0,sizeof(NDEFRecordStr));
- memset(tmpBuffer,0,NFC_PAGE_SIZE);
-
- uint8_t recordLength = composeRtd[typeFunct](data, &record, tmpBuffer);
- if (rtdPosition == NDEFMiddlePos) {
-
- composeNDEFMBME(false, false, &record);
- } else if (rtdPosition == NDEFLastPos){
-
- composeNDEFMBME(false, true, &record);
- }
- tmpBuffer[0] = record.header;
- header.payloadLength += data->rtdPayloadlength + recordLength;
-
- NT3HWriteHeaderNfc((newRecordPtr+header.payloadLength), mbMe);
-
- NT3HReadUserData(pageToUse->page);
- if (pageToUse->usedBytes+recordLength< NFC_PAGE_SIZE) {
- memcpy(&nfcPageBuffer[pageToUse->usedBytes], tmpBuffer, recordLength);
- return recordLength+pageToUse->usedBytes;
- } else {
- uint8_t byteToCopy = NFC_PAGE_SIZE-pageToUse->usedBytes;
- memcpy(&nfcPageBuffer[pageToUse->usedBytes], tmpBuffer, byteToCopy);
- NT3HWriteUserData(pageToUse->page, nfcPageBuffer);
-
- pageToUse->page++;
- pageToUse->usedBytes=recordLength-byteToCopy;
-
- memcpy(nfcPageBuffer, &tmpBuffer[byteToCopy], pageToUse->usedBytes);
- return pageToUse->usedBytes;
- }
- }
- static bool writeUserPayload(int16_t payloadPtr, const NDEFDataStr *data, UncompletePageStr *addPage){
- uint16_t addedPayload;
- bool ret=false;
- uint8_t finish=payloadPtr+data->rtdPayloadlength;
- bool endRecord = false;
- uint8_t copyByte=0;
-
- if (NFC_PAGE_SIZE>payloadPtr) {
- if (data->rtdPayloadlength > NFC_PAGE_SIZE-payloadPtr)
- copyByte = NFC_PAGE_SIZE-payloadPtr;
- else
- copyByte = data->rtdPayloadlength;
- }
-
- memcpy(&nfcPageBuffer[payloadPtr], data->rtdPayload, copyByte);
- addedPayload = copyByte;
-
- if ((addedPayload >= data->rtdPayloadlength)&&((payloadPtr+copyByte) < NFC_PAGE_SIZE)) {
- nfcPageBuffer[(payloadPtr+copyByte)] = NDEF_END_BYTE;
- endRecord = true;
- }
- ret = NT3HWriteUserData(addPage->page, nfcPageBuffer);
- while (!endRecord) {
- addPage->page++;
- memset(nfcPageBuffer,0,NFC_PAGE_SIZE);
-
- if (addedPayload == data->rtdPayloadlength) {
- nfcPageBuffer[0] = NDEF_END_BYTE;
- ret = NT3HWriteUserData(addPage->page, nfcPageBuffer);
- endRecord = true;
- if (ret == false) {
- errNo = NT3HERROR_WRITE_NDEF_TEXT;
- }
- goto end;
- }
- if (addedPayload < data->rtdPayloadlength) {
-
- if ((data->rtdPayloadlength-addedPayload) < NFC_PAGE_SIZE){
- memcpy(nfcPageBuffer, &data->rtdPayload[addedPayload], (data->rtdPayloadlength-addedPayload));
- nfcPageBuffer[(data->rtdPayloadlength-addedPayload)] = NDEF_END_BYTE;
- } else {
- memcpy(nfcPageBuffer, &data->rtdPayload[addedPayload], NFC_PAGE_SIZE);
- }
- addedPayload += NFC_PAGE_SIZE;
- ret = NT3HWriteUserData(addPage->page, nfcPageBuffer);
- if (ret == false) {
- errNo = NT3HERROR_WRITE_NDEF_TEXT;
- goto end;
- }
- } else {
- endRecord = true;
- }
- }
- end:
- return ret;
- }
- typedef int16_t (*addFunct_T) (UncompletePageStr *page, const NDEFDataStr *data, RecordPosEnu rtdPosition);
- static addFunct_T addFunct[] = {firstRecord, addRecord, addRecord};
- bool NT3HwriteRecord(const NDEFDataStr *data) {
- uint8_t recordLength=0, mbMe;
- UncompletePageStr addPage;
- addPage.page = 0;
-
- if (data->ndefPosition != NDEFFirstPos ) {
- NT3HReadHeaderNfc(&recordLength, &mbMe);
- addPage.page = (recordLength+sizeof(NDEFHeaderStr)+1)/NFC_PAGE_SIZE;
-
- addPage.usedBytes = (recordLength+sizeof(NDEFHeaderStr)+1)%NFC_PAGE_SIZE - 1;
- }
-
-
- int16_t payloadPtr = addFunct[data->ndefPosition](&addPage, data, data->ndefPosition);
- if (payloadPtr == -1) {
- errNo = NT3HERROR_TYPE_NOT_SUPPORTED;
- return false;
- }
- return writeUserPayload(payloadPtr, data, &addPage);
- }
|