Utility library to read and write Ndef messages from/to a Type4 NFC tag

Dependents:   NFC M2M_2016_STM32 MyongjiElec_capstone1 IDW01M1_Cloud_IBM ... more

Fork of NDefLib by ST Expansion SW Team

NDEF NFC library

This library provides an abstract API to create NDEF formatted messages and records and to read/write them from/to a Type4 NFC Tag.

Implementations

At the moment, the NDEF API is implemented by X_NUCLEO_NFC01A1 and X_NUCLEO_NFC02A1 Dynamic NFC Tag libraries respectively driving the X-NUCLEO-NFC01A1 and X-NUCLEO-NFC02A1 boards.

Committer:
giovannivisentini
Date:
Thu Nov 19 08:49:47 2015 +0000
Revision:
0:04b82ae7aa43
Child:
1:a0eeb478a45a
First Version, the tag is only write

Who changed what in which revision?

UserRevisionLine numberNew contents of line
giovannivisentini 0:04b82ae7aa43 1 /*
giovannivisentini 0:04b82ae7aa43 2 * Record.h
giovannivisentini 0:04b82ae7aa43 3 *
giovannivisentini 0:04b82ae7aa43 4 * Created on: Nov 6, 2015
giovannivisentini 0:04b82ae7aa43 5 * Author: giovanni visentini
giovannivisentini 0:04b82ae7aa43 6 */
giovannivisentini 0:04b82ae7aa43 7
giovannivisentini 0:04b82ae7aa43 8 #ifndef NDEFLIB_RECORD_H_
giovannivisentini 0:04b82ae7aa43 9 #define NDEFLIB_RECORD_H_
giovannivisentini 0:04b82ae7aa43 10 #include <stdint.h>
giovannivisentini 0:04b82ae7aa43 11
giovannivisentini 0:04b82ae7aa43 12 namespace NDefLib {
giovannivisentini 0:04b82ae7aa43 13
giovannivisentini 0:04b82ae7aa43 14 class Record {
giovannivisentini 0:04b82ae7aa43 15 public:
giovannivisentini 0:04b82ae7aa43 16 class RecordHeader{
giovannivisentini 0:04b82ae7aa43 17
giovannivisentini 0:04b82ae7aa43 18 public:
giovannivisentini 0:04b82ae7aa43 19 typedef enum TypeNameFormat{
giovannivisentini 0:04b82ae7aa43 20 Empty=0x00,
giovannivisentini 0:04b82ae7aa43 21 NFC_well_known=0x01,
giovannivisentini 0:04b82ae7aa43 22 Mime_media_type=0x02,
giovannivisentini 0:04b82ae7aa43 23 Absolute_URI=0x03,
giovannivisentini 0:04b82ae7aa43 24 NFC_external=0x04,
giovannivisentini 0:04b82ae7aa43 25 Unknown=0x05,
giovannivisentini 0:04b82ae7aa43 26 Unchanged=0x06,
giovannivisentini 0:04b82ae7aa43 27 Reserved=0x07
giovannivisentini 0:04b82ae7aa43 28 }TypeNameFormat_t;
giovannivisentini 0:04b82ae7aa43 29
giovannivisentini 0:04b82ae7aa43 30 RecordHeader():headerFlags(0),
giovannivisentini 0:04b82ae7aa43 31 typeLenght(0),playloadLenght(0){}
giovannivisentini 0:04b82ae7aa43 32
giovannivisentini 0:04b82ae7aa43 33 void setMB(bool value){
giovannivisentini 0:04b82ae7aa43 34 if(value)
giovannivisentini 0:04b82ae7aa43 35 headerFlags |= 0x80;
giovannivisentini 0:04b82ae7aa43 36 else
giovannivisentini 0:04b82ae7aa43 37 headerFlags &= 0x7F;
giovannivisentini 0:04b82ae7aa43 38 }
giovannivisentini 0:04b82ae7aa43 39
giovannivisentini 0:04b82ae7aa43 40 bool getMB() const {
giovannivisentini 0:04b82ae7aa43 41 return (headerFlags & 0x80)!=0;
giovannivisentini 0:04b82ae7aa43 42 }
giovannivisentini 0:04b82ae7aa43 43
giovannivisentini 0:04b82ae7aa43 44 void setME(bool value){
giovannivisentini 0:04b82ae7aa43 45 if(value)
giovannivisentini 0:04b82ae7aa43 46 headerFlags |= 0x40;
giovannivisentini 0:04b82ae7aa43 47 else
giovannivisentini 0:04b82ae7aa43 48 headerFlags &= 0xBF;
giovannivisentini 0:04b82ae7aa43 49 }
giovannivisentini 0:04b82ae7aa43 50
giovannivisentini 0:04b82ae7aa43 51 bool getME() const {
giovannivisentini 0:04b82ae7aa43 52 return (headerFlags & 0x40)!=0;
giovannivisentini 0:04b82ae7aa43 53 }
giovannivisentini 0:04b82ae7aa43 54
giovannivisentini 0:04b82ae7aa43 55 void setCF(bool value){
giovannivisentini 0:04b82ae7aa43 56 if(value)
giovannivisentini 0:04b82ae7aa43 57 headerFlags |= 0x20;
giovannivisentini 0:04b82ae7aa43 58 else
giovannivisentini 0:04b82ae7aa43 59 headerFlags &= 0xDF;
giovannivisentini 0:04b82ae7aa43 60 }
giovannivisentini 0:04b82ae7aa43 61
giovannivisentini 0:04b82ae7aa43 62 bool getCF() const {
giovannivisentini 0:04b82ae7aa43 63 return (headerFlags & 0x20)!=0;
giovannivisentini 0:04b82ae7aa43 64 }
giovannivisentini 0:04b82ae7aa43 65
giovannivisentini 0:04b82ae7aa43 66 void setSR(bool value){
giovannivisentini 0:04b82ae7aa43 67 if(value)
giovannivisentini 0:04b82ae7aa43 68 headerFlags |= 0x10;
giovannivisentini 0:04b82ae7aa43 69 else
giovannivisentini 0:04b82ae7aa43 70 headerFlags &= 0xCF;
giovannivisentini 0:04b82ae7aa43 71 }
giovannivisentini 0:04b82ae7aa43 72
giovannivisentini 0:04b82ae7aa43 73 bool getSR() const {
giovannivisentini 0:04b82ae7aa43 74 return (headerFlags & 0x10)!=0;
giovannivisentini 0:04b82ae7aa43 75 }
giovannivisentini 0:04b82ae7aa43 76
giovannivisentini 0:04b82ae7aa43 77 void setIL(bool value){
giovannivisentini 0:04b82ae7aa43 78 if(value)
giovannivisentini 0:04b82ae7aa43 79 headerFlags |= 0x08;
giovannivisentini 0:04b82ae7aa43 80 else
giovannivisentini 0:04b82ae7aa43 81 headerFlags &= 0xAF;
giovannivisentini 0:04b82ae7aa43 82 }
giovannivisentini 0:04b82ae7aa43 83
giovannivisentini 0:04b82ae7aa43 84 bool getIL() const {
giovannivisentini 0:04b82ae7aa43 85 return (headerFlags & 0x08)!=0;
giovannivisentini 0:04b82ae7aa43 86 }
giovannivisentini 0:04b82ae7aa43 87
giovannivisentini 0:04b82ae7aa43 88 void setFNT(const TypeNameFormat_t value){
giovannivisentini 0:04b82ae7aa43 89 uint8_t temp = (uint8_t)value;
giovannivisentini 0:04b82ae7aa43 90 temp &= 0x07; //keep the first 3 bits
giovannivisentini 0:04b82ae7aa43 91 headerFlags &= 0xF8; //clean the fist 3 bits
giovannivisentini 0:04b82ae7aa43 92 headerFlags |=temp; //set the fist 3 bits
giovannivisentini 0:04b82ae7aa43 93 }
giovannivisentini 0:04b82ae7aa43 94
giovannivisentini 0:04b82ae7aa43 95 TypeNameFormat_t getFNT() const {
giovannivisentini 0:04b82ae7aa43 96 return (TypeNameFormat_t)(headerFlags & 0x07);
giovannivisentini 0:04b82ae7aa43 97 }
giovannivisentini 0:04b82ae7aa43 98
giovannivisentini 0:04b82ae7aa43 99 void setPlayloadLenght(uint32_t lenght){
giovannivisentini 0:04b82ae7aa43 100 playloadLenght=lenght;
giovannivisentini 0:04b82ae7aa43 101 setSR(playloadLenght<=255);
giovannivisentini 0:04b82ae7aa43 102 }
giovannivisentini 0:04b82ae7aa43 103
giovannivisentini 0:04b82ae7aa43 104 uint32_t getPlayloadLenght(){
giovannivisentini 0:04b82ae7aa43 105 return playloadLenght;
giovannivisentini 0:04b82ae7aa43 106 }
giovannivisentini 0:04b82ae7aa43 107
giovannivisentini 0:04b82ae7aa43 108 void setTypeLength(uint8_t size){
giovannivisentini 0:04b82ae7aa43 109 typeLenght=size;
giovannivisentini 0:04b82ae7aa43 110 }
giovannivisentini 0:04b82ae7aa43 111
giovannivisentini 0:04b82ae7aa43 112 uint16_t getRecordLength()const{
giovannivisentini 0:04b82ae7aa43 113 return (getSR() ? 3 : 6) + typeLenght+playloadLenght;
giovannivisentini 0:04b82ae7aa43 114 }
giovannivisentini 0:04b82ae7aa43 115
giovannivisentini 0:04b82ae7aa43 116 uint8_t writeHeader(uint8_t *outBuffer)const{
giovannivisentini 0:04b82ae7aa43 117
giovannivisentini 0:04b82ae7aa43 118 uint32_t index=0;
giovannivisentini 0:04b82ae7aa43 119
giovannivisentini 0:04b82ae7aa43 120 outBuffer[index++]= headerFlags;
giovannivisentini 0:04b82ae7aa43 121 outBuffer[index++]= typeLenght;
giovannivisentini 0:04b82ae7aa43 122 if(getSR()){
giovannivisentini 0:04b82ae7aa43 123 outBuffer[index++]=(uint8_t) playloadLenght;
giovannivisentini 0:04b82ae7aa43 124 }else{
giovannivisentini 0:04b82ae7aa43 125 outBuffer[index++]=(uint8_t) ((playloadLenght & 0xFF000000)>>24);
giovannivisentini 0:04b82ae7aa43 126 outBuffer[index++]=(uint8_t) ((playloadLenght & 0x00FF0000)>>16);
giovannivisentini 0:04b82ae7aa43 127 outBuffer[index++]=(uint8_t) ((playloadLenght & 0x0000FF00)>>8);
giovannivisentini 0:04b82ae7aa43 128 outBuffer[index++]=(uint8_t) (playloadLenght & 0x000000FF);
giovannivisentini 0:04b82ae7aa43 129 }//if-else
giovannivisentini 0:04b82ae7aa43 130 return index;
giovannivisentini 0:04b82ae7aa43 131 }//writeHeader
giovannivisentini 0:04b82ae7aa43 132
giovannivisentini 0:04b82ae7aa43 133 uint16_t loadHeader(uint8_t *buffer){
giovannivisentini 0:04b82ae7aa43 134 uint32_t index=0;
giovannivisentini 0:04b82ae7aa43 135 headerFlags=buffer[index++];
giovannivisentini 0:04b82ae7aa43 136 typeLenght=buffer[index++];
giovannivisentini 0:04b82ae7aa43 137 if(getSR()){
giovannivisentini 0:04b82ae7aa43 138 playloadLenght=buffer[index++];
giovannivisentini 0:04b82ae7aa43 139 }else{
giovannivisentini 0:04b82ae7aa43 140 playloadLenght = (((uint32_t)buffer[index+0])<<24) |
giovannivisentini 0:04b82ae7aa43 141 (((uint32_t)buffer[index+1])<<16) |
giovannivisentini 0:04b82ae7aa43 142 (((uint32_t)buffer[index+2])<<8) |
giovannivisentini 0:04b82ae7aa43 143 ((uint32_t)buffer[index+3]);
giovannivisentini 0:04b82ae7aa43 144 index+=4;
giovannivisentini 0:04b82ae7aa43 145 }//if-else
giovannivisentini 0:04b82ae7aa43 146 return index;
giovannivisentini 0:04b82ae7aa43 147 }//loadHeader
giovannivisentini 0:04b82ae7aa43 148
giovannivisentini 0:04b82ae7aa43 149 private:
giovannivisentini 0:04b82ae7aa43 150 uint8_t headerFlags;
giovannivisentini 0:04b82ae7aa43 151 uint8_t typeLenght;
giovannivisentini 0:04b82ae7aa43 152 uint32_t playloadLenght;
giovannivisentini 0:04b82ae7aa43 153
giovannivisentini 0:04b82ae7aa43 154 };
giovannivisentini 0:04b82ae7aa43 155
giovannivisentini 0:04b82ae7aa43 156 Record(){}
giovannivisentini 0:04b82ae7aa43 157
giovannivisentini 0:04b82ae7aa43 158 void setAsFirstRecord(){
giovannivisentini 0:04b82ae7aa43 159 mRecordHeader.setMB(true);
giovannivisentini 0:04b82ae7aa43 160 }
giovannivisentini 0:04b82ae7aa43 161
giovannivisentini 0:04b82ae7aa43 162 void setAsLastRecord(){
giovannivisentini 0:04b82ae7aa43 163 mRecordHeader.setME(true);
giovannivisentini 0:04b82ae7aa43 164 }
giovannivisentini 0:04b82ae7aa43 165
giovannivisentini 0:04b82ae7aa43 166 bool isLastRecord()const{
giovannivisentini 0:04b82ae7aa43 167 return mRecordHeader.getME();
giovannivisentini 0:04b82ae7aa43 168 }
giovannivisentini 0:04b82ae7aa43 169
giovannivisentini 0:04b82ae7aa43 170 void setAsMiddleRecord(){
giovannivisentini 0:04b82ae7aa43 171 mRecordHeader.setMB(false);
giovannivisentini 0:04b82ae7aa43 172 mRecordHeader.setME(false);
giovannivisentini 0:04b82ae7aa43 173 }
giovannivisentini 0:04b82ae7aa43 174
giovannivisentini 0:04b82ae7aa43 175 virtual uint16_t getByteLenght(){
giovannivisentini 0:04b82ae7aa43 176 return mRecordHeader.getRecordLength();
giovannivisentini 0:04b82ae7aa43 177 }
giovannivisentini 0:04b82ae7aa43 178
giovannivisentini 0:04b82ae7aa43 179 virtual uint16_t write(uint8_t *buffer)=0;
giovannivisentini 0:04b82ae7aa43 180
giovannivisentini 0:04b82ae7aa43 181 virtual ~Record(){};
giovannivisentini 0:04b82ae7aa43 182
giovannivisentini 0:04b82ae7aa43 183 protected:
giovannivisentini 0:04b82ae7aa43 184 RecordHeader mRecordHeader;
giovannivisentini 0:04b82ae7aa43 185 };
giovannivisentini 0:04b82ae7aa43 186
giovannivisentini 0:04b82ae7aa43 187 } /* namespace NDefLib */
giovannivisentini 0:04b82ae7aa43 188
giovannivisentini 0:04b82ae7aa43 189 #endif /* NDEFLIB_RECORD_H_ */