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 26 09:04:44 2015 +0000
Revision:
2:760e36ba9c23
Parent:
1:a0eeb478a45a
Child:
4:eaf6c49a86e4
implement the VCard record

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 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 2:760e36ba9c23 168 TYPE_GEOLOCATION,
giovannivisentini 2:760e36ba9c23 169 TYPE_MIME_VCARD
giovannivisentini 1:a0eeb478a45a 170 }RecordType_t;
giovannivisentini 1:a0eeb478a45a 171
giovannivisentini 0:04b82ae7aa43 172 Record(){}
giovannivisentini 0:04b82ae7aa43 173
giovannivisentini 0:04b82ae7aa43 174 void setAsFirstRecord(){
giovannivisentini 0:04b82ae7aa43 175 mRecordHeader.setMB(true);
giovannivisentini 0:04b82ae7aa43 176 }
giovannivisentini 0:04b82ae7aa43 177
giovannivisentini 0:04b82ae7aa43 178 void setAsLastRecord(){
giovannivisentini 0:04b82ae7aa43 179 mRecordHeader.setME(true);
giovannivisentini 0:04b82ae7aa43 180 }
giovannivisentini 0:04b82ae7aa43 181
giovannivisentini 0:04b82ae7aa43 182 bool isLastRecord()const{
giovannivisentini 0:04b82ae7aa43 183 return mRecordHeader.getME();
giovannivisentini 0:04b82ae7aa43 184 }
giovannivisentini 0:04b82ae7aa43 185
giovannivisentini 0:04b82ae7aa43 186 void setAsMiddleRecord(){
giovannivisentini 0:04b82ae7aa43 187 mRecordHeader.setMB(false);
giovannivisentini 0:04b82ae7aa43 188 mRecordHeader.setME(false);
giovannivisentini 0:04b82ae7aa43 189 }
giovannivisentini 0:04b82ae7aa43 190
giovannivisentini 1:a0eeb478a45a 191 virtual RecordType_t getType()const{
giovannivisentini 1:a0eeb478a45a 192 return TYPE_UNKNOWN;
giovannivisentini 1:a0eeb478a45a 193 }//getType
giovannivisentini 1:a0eeb478a45a 194
giovannivisentini 0:04b82ae7aa43 195 virtual uint16_t getByteLenght(){
giovannivisentini 0:04b82ae7aa43 196 return mRecordHeader.getRecordLength();
giovannivisentini 0:04b82ae7aa43 197 }
giovannivisentini 0:04b82ae7aa43 198
giovannivisentini 0:04b82ae7aa43 199 virtual uint16_t write(uint8_t *buffer)=0;
giovannivisentini 0:04b82ae7aa43 200
giovannivisentini 0:04b82ae7aa43 201 virtual ~Record(){};
giovannivisentini 0:04b82ae7aa43 202
giovannivisentini 0:04b82ae7aa43 203 protected:
giovannivisentini 0:04b82ae7aa43 204 RecordHeader mRecordHeader;
giovannivisentini 0:04b82ae7aa43 205 };
giovannivisentini 0:04b82ae7aa43 206
giovannivisentini 0:04b82ae7aa43 207 } /* namespace NDefLib */
giovannivisentini 0:04b82ae7aa43 208
giovannivisentini 0:04b82ae7aa43 209 #endif /* NDEFLIB_RECORD_H_ */