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
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.
Record.h@1:a0eeb478a45a, 2015-11-24 (annotated)
- Committer:
- giovannivisentini
- Date:
- Tue Nov 24 14:33:06 2015 +0000
- Revision:
- 1:a0eeb478a45a
- Parent:
- 0:04b82ae7aa43
- Child:
- 2:760e36ba9c23
implement tag reading
Who changed what in which revision?
User | Revision | Line number | New 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 | 1:a0eeb478a45a | 104 | uint32_t getPlayloadLenght()const{ |
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 | 1:a0eeb478a45a | 112 | uint8_t getTypeLenght()const{ |
giovannivisentini | 1:a0eeb478a45a | 113 | return typeLenght; |
giovannivisentini | 1:a0eeb478a45a | 114 | } |
giovannivisentini | 1:a0eeb478a45a | 115 | |
giovannivisentini | 0:04b82ae7aa43 | 116 | uint16_t getRecordLength()const{ |
giovannivisentini | 0:04b82ae7aa43 | 117 | return (getSR() ? 3 : 6) + typeLenght+playloadLenght; |
giovannivisentini | 0:04b82ae7aa43 | 118 | } |
giovannivisentini | 0:04b82ae7aa43 | 119 | |
giovannivisentini | 0:04b82ae7aa43 | 120 | uint8_t writeHeader(uint8_t *outBuffer)const{ |
giovannivisentini | 0:04b82ae7aa43 | 121 | |
giovannivisentini | 0:04b82ae7aa43 | 122 | uint32_t index=0; |
giovannivisentini | 0:04b82ae7aa43 | 123 | |
giovannivisentini | 0:04b82ae7aa43 | 124 | outBuffer[index++]= headerFlags; |
giovannivisentini | 0:04b82ae7aa43 | 125 | outBuffer[index++]= typeLenght; |
giovannivisentini | 0:04b82ae7aa43 | 126 | if(getSR()){ |
giovannivisentini | 0:04b82ae7aa43 | 127 | outBuffer[index++]=(uint8_t) playloadLenght; |
giovannivisentini | 0:04b82ae7aa43 | 128 | }else{ |
giovannivisentini | 0:04b82ae7aa43 | 129 | outBuffer[index++]=(uint8_t) ((playloadLenght & 0xFF000000)>>24); |
giovannivisentini | 0:04b82ae7aa43 | 130 | outBuffer[index++]=(uint8_t) ((playloadLenght & 0x00FF0000)>>16); |
giovannivisentini | 0:04b82ae7aa43 | 131 | outBuffer[index++]=(uint8_t) ((playloadLenght & 0x0000FF00)>>8); |
giovannivisentini | 0:04b82ae7aa43 | 132 | outBuffer[index++]=(uint8_t) (playloadLenght & 0x000000FF); |
giovannivisentini | 0:04b82ae7aa43 | 133 | }//if-else |
giovannivisentini | 0:04b82ae7aa43 | 134 | return index; |
giovannivisentini | 0:04b82ae7aa43 | 135 | }//writeHeader |
giovannivisentini | 0:04b82ae7aa43 | 136 | |
giovannivisentini | 1:a0eeb478a45a | 137 | uint16_t loadHeader(const uint8_t *const buffer){ |
giovannivisentini | 0:04b82ae7aa43 | 138 | uint32_t index=0; |
giovannivisentini | 0:04b82ae7aa43 | 139 | headerFlags=buffer[index++]; |
giovannivisentini | 0:04b82ae7aa43 | 140 | typeLenght=buffer[index++]; |
giovannivisentini | 0:04b82ae7aa43 | 141 | if(getSR()){ |
giovannivisentini | 0:04b82ae7aa43 | 142 | playloadLenght=buffer[index++]; |
giovannivisentini | 0:04b82ae7aa43 | 143 | }else{ |
giovannivisentini | 0:04b82ae7aa43 | 144 | playloadLenght = (((uint32_t)buffer[index+0])<<24) | |
giovannivisentini | 0:04b82ae7aa43 | 145 | (((uint32_t)buffer[index+1])<<16) | |
giovannivisentini | 0:04b82ae7aa43 | 146 | (((uint32_t)buffer[index+2])<<8) | |
giovannivisentini | 0:04b82ae7aa43 | 147 | ((uint32_t)buffer[index+3]); |
giovannivisentini | 0:04b82ae7aa43 | 148 | index+=4; |
giovannivisentini | 0:04b82ae7aa43 | 149 | }//if-else |
giovannivisentini | 0:04b82ae7aa43 | 150 | return index; |
giovannivisentini | 0:04b82ae7aa43 | 151 | }//loadHeader |
giovannivisentini | 0:04b82ae7aa43 | 152 | |
giovannivisentini | 0:04b82ae7aa43 | 153 | private: |
giovannivisentini | 0:04b82ae7aa43 | 154 | uint8_t headerFlags; |
giovannivisentini | 0:04b82ae7aa43 | 155 | uint8_t typeLenght; |
giovannivisentini | 0:04b82ae7aa43 | 156 | uint32_t playloadLenght; |
giovannivisentini | 0:04b82ae7aa43 | 157 | |
giovannivisentini | 0:04b82ae7aa43 | 158 | }; |
giovannivisentini | 0:04b82ae7aa43 | 159 | |
giovannivisentini | 1:a0eeb478a45a | 160 | typedef enum { |
giovannivisentini | 1:a0eeb478a45a | 161 | TYPE_UNKNOWN, |
giovannivisentini | 1:a0eeb478a45a | 162 | TYPE_TEXT, |
giovannivisentini | 1:a0eeb478a45a | 163 | TYPE_AAR, |
giovannivisentini | 1:a0eeb478a45a | 164 | TYPE_MIME, |
giovannivisentini | 1:a0eeb478a45a | 165 | TYPE_URI, |
giovannivisentini | 1:a0eeb478a45a | 166 | TYPE_URI_MAIL, |
giovannivisentini | 1:a0eeb478a45a | 167 | TYPE_SMS, |
giovannivisentini | 1:a0eeb478a45a | 168 | TYPE_GEOLOCATION |
giovannivisentini | 1:a0eeb478a45a | 169 | }RecordType_t; |
giovannivisentini | 1:a0eeb478a45a | 170 | |
giovannivisentini | 0:04b82ae7aa43 | 171 | Record(){} |
giovannivisentini | 0:04b82ae7aa43 | 172 | |
giovannivisentini | 0:04b82ae7aa43 | 173 | void setAsFirstRecord(){ |
giovannivisentini | 0:04b82ae7aa43 | 174 | mRecordHeader.setMB(true); |
giovannivisentini | 0:04b82ae7aa43 | 175 | } |
giovannivisentini | 0:04b82ae7aa43 | 176 | |
giovannivisentini | 0:04b82ae7aa43 | 177 | void setAsLastRecord(){ |
giovannivisentini | 0:04b82ae7aa43 | 178 | mRecordHeader.setME(true); |
giovannivisentini | 0:04b82ae7aa43 | 179 | } |
giovannivisentini | 0:04b82ae7aa43 | 180 | |
giovannivisentini | 0:04b82ae7aa43 | 181 | bool isLastRecord()const{ |
giovannivisentini | 0:04b82ae7aa43 | 182 | return mRecordHeader.getME(); |
giovannivisentini | 0:04b82ae7aa43 | 183 | } |
giovannivisentini | 0:04b82ae7aa43 | 184 | |
giovannivisentini | 0:04b82ae7aa43 | 185 | void setAsMiddleRecord(){ |
giovannivisentini | 0:04b82ae7aa43 | 186 | mRecordHeader.setMB(false); |
giovannivisentini | 0:04b82ae7aa43 | 187 | mRecordHeader.setME(false); |
giovannivisentini | 0:04b82ae7aa43 | 188 | } |
giovannivisentini | 0:04b82ae7aa43 | 189 | |
giovannivisentini | 1:a0eeb478a45a | 190 | virtual RecordType_t getType()const{ |
giovannivisentini | 1:a0eeb478a45a | 191 | return TYPE_UNKNOWN; |
giovannivisentini | 1:a0eeb478a45a | 192 | }//getType |
giovannivisentini | 1:a0eeb478a45a | 193 | |
giovannivisentini | 0:04b82ae7aa43 | 194 | virtual uint16_t getByteLenght(){ |
giovannivisentini | 0:04b82ae7aa43 | 195 | return mRecordHeader.getRecordLength(); |
giovannivisentini | 0:04b82ae7aa43 | 196 | } |
giovannivisentini | 0:04b82ae7aa43 | 197 | |
giovannivisentini | 0:04b82ae7aa43 | 198 | virtual uint16_t write(uint8_t *buffer)=0; |
giovannivisentini | 0:04b82ae7aa43 | 199 | |
giovannivisentini | 0:04b82ae7aa43 | 200 | virtual ~Record(){}; |
giovannivisentini | 0:04b82ae7aa43 | 201 | |
giovannivisentini | 0:04b82ae7aa43 | 202 | protected: |
giovannivisentini | 0:04b82ae7aa43 | 203 | RecordHeader mRecordHeader; |
giovannivisentini | 0:04b82ae7aa43 | 204 | }; |
giovannivisentini | 0:04b82ae7aa43 | 205 | |
giovannivisentini | 0:04b82ae7aa43 | 206 | } /* namespace NDefLib */ |
giovannivisentini | 0:04b82ae7aa43 | 207 | |
giovannivisentini | 0:04b82ae7aa43 | 208 | #endif /* NDEFLIB_RECORD_H_ */ |