LEER TAG

Dependents:   NFC_HTM_READ EMULAR_TAGS Escribir_tag NFC_HTM_READ-WRITE

Committer:
mauroar211
Date:
Fri Apr 24 18:17:09 2015 +0000
Revision:
0:b805b487fbef
LEER TAG

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mauroar211 0:b805b487fbef 1 #include "NdefMessage.h"
mauroar211 0:b805b487fbef 2 #include "PN532_debug.h"
mauroar211 0:b805b487fbef 3
mauroar211 0:b805b487fbef 4 NdefMessage::NdefMessage(void)
mauroar211 0:b805b487fbef 5 {
mauroar211 0:b805b487fbef 6 _recordCount = 0;
mauroar211 0:b805b487fbef 7 }
mauroar211 0:b805b487fbef 8
mauroar211 0:b805b487fbef 9 NdefMessage::NdefMessage(const uint8_t * data, const int numuint8_ts)
mauroar211 0:b805b487fbef 10 {
mauroar211 0:b805b487fbef 11 #ifdef NDEF_DEBUG
mauroar211 0:b805b487fbef 12 DMSG("Decoding "));Serial.print(numuint8_ts);DMSG(F(" uint8_ts");
mauroar211 0:b805b487fbef 13 PrintHexChar(data, numuint8_ts);
mauroar211 0:b805b487fbef 14 //DumpHex(data, numuint8_ts, 16);
mauroar211 0:b805b487fbef 15 #endif
mauroar211 0:b805b487fbef 16
mauroar211 0:b805b487fbef 17 _recordCount = 0;
mauroar211 0:b805b487fbef 18
mauroar211 0:b805b487fbef 19 int index = 0;
mauroar211 0:b805b487fbef 20
mauroar211 0:b805b487fbef 21 while (index <= numuint8_ts)
mauroar211 0:b805b487fbef 22 {
mauroar211 0:b805b487fbef 23
mauroar211 0:b805b487fbef 24 // decode tnf - first uint8_t is tnf with bit flags
mauroar211 0:b805b487fbef 25 // see the NFDEF spec for more info
mauroar211 0:b805b487fbef 26 uint8_t tnf_uint8_t = data[index];
mauroar211 0:b805b487fbef 27 //bool mb = (tnf_uint8_t & 0x80) != 0;
mauroar211 0:b805b487fbef 28 bool me = (tnf_uint8_t & 0x40) != 0;
mauroar211 0:b805b487fbef 29 //bool cf = (tnf_uint8_t & 0x20) != 0;
mauroar211 0:b805b487fbef 30 bool sr = (tnf_uint8_t & 0x10) != 0;
mauroar211 0:b805b487fbef 31 bool il = (tnf_uint8_t & 0x8) != 0;
mauroar211 0:b805b487fbef 32 uint8_t tnf = (tnf_uint8_t & 0x7);
mauroar211 0:b805b487fbef 33
mauroar211 0:b805b487fbef 34 NdefRecord record = NdefRecord();
mauroar211 0:b805b487fbef 35 record.setTnf(tnf);
mauroar211 0:b805b487fbef 36
mauroar211 0:b805b487fbef 37 index++;
mauroar211 0:b805b487fbef 38 int typeLength = data[index];
mauroar211 0:b805b487fbef 39
mauroar211 0:b805b487fbef 40 int payloadLength = 0;
mauroar211 0:b805b487fbef 41 if (sr)
mauroar211 0:b805b487fbef 42 {
mauroar211 0:b805b487fbef 43 index++;
mauroar211 0:b805b487fbef 44 payloadLength = data[index];
mauroar211 0:b805b487fbef 45 }
mauroar211 0:b805b487fbef 46 else
mauroar211 0:b805b487fbef 47 {
mauroar211 0:b805b487fbef 48 payloadLength = ((0xFF & data[++index]) << 24) | ((0xFF & data[++index]) << 26) |
mauroar211 0:b805b487fbef 49 ((0xFF & data[++index]) << 8) | (0xFF & data[++index]);
mauroar211 0:b805b487fbef 50 }
mauroar211 0:b805b487fbef 51
mauroar211 0:b805b487fbef 52 int idLength = 0;
mauroar211 0:b805b487fbef 53 if (il)
mauroar211 0:b805b487fbef 54 {
mauroar211 0:b805b487fbef 55 index++;
mauroar211 0:b805b487fbef 56 idLength = data[index];
mauroar211 0:b805b487fbef 57 }
mauroar211 0:b805b487fbef 58
mauroar211 0:b805b487fbef 59 index++;
mauroar211 0:b805b487fbef 60 record.setType(&data[index], typeLength);
mauroar211 0:b805b487fbef 61 index += typeLength;
mauroar211 0:b805b487fbef 62
mauroar211 0:b805b487fbef 63 if (il)
mauroar211 0:b805b487fbef 64 {
mauroar211 0:b805b487fbef 65 record.setId(&data[index], idLength);
mauroar211 0:b805b487fbef 66 index += idLength;
mauroar211 0:b805b487fbef 67 }
mauroar211 0:b805b487fbef 68
mauroar211 0:b805b487fbef 69 record.setPayload(&data[index], payloadLength);
mauroar211 0:b805b487fbef 70 index += payloadLength;
mauroar211 0:b805b487fbef 71
mauroar211 0:b805b487fbef 72 addRecord(record);
mauroar211 0:b805b487fbef 73
mauroar211 0:b805b487fbef 74 if (me) break; // last message
mauroar211 0:b805b487fbef 75 }
mauroar211 0:b805b487fbef 76
mauroar211 0:b805b487fbef 77 }
mauroar211 0:b805b487fbef 78
mauroar211 0:b805b487fbef 79 NdefMessage::NdefMessage(const NdefMessage& rhs)
mauroar211 0:b805b487fbef 80 {
mauroar211 0:b805b487fbef 81
mauroar211 0:b805b487fbef 82 _recordCount = rhs._recordCount;
mauroar211 0:b805b487fbef 83 for (int i = 0; i < _recordCount; i++)
mauroar211 0:b805b487fbef 84 {
mauroar211 0:b805b487fbef 85 _records[i] = rhs._records[i];
mauroar211 0:b805b487fbef 86 }
mauroar211 0:b805b487fbef 87
mauroar211 0:b805b487fbef 88 }
mauroar211 0:b805b487fbef 89
mauroar211 0:b805b487fbef 90 NdefMessage::~NdefMessage()
mauroar211 0:b805b487fbef 91 {
mauroar211 0:b805b487fbef 92 }
mauroar211 0:b805b487fbef 93
mauroar211 0:b805b487fbef 94 NdefMessage& NdefMessage::operator=(const NdefMessage& rhs)
mauroar211 0:b805b487fbef 95 {
mauroar211 0:b805b487fbef 96
mauroar211 0:b805b487fbef 97 if (this != &rhs)
mauroar211 0:b805b487fbef 98 {
mauroar211 0:b805b487fbef 99
mauroar211 0:b805b487fbef 100 // delete existing records
mauroar211 0:b805b487fbef 101 for (int i = 0; i < _recordCount; i++)
mauroar211 0:b805b487fbef 102 {
mauroar211 0:b805b487fbef 103 // TODO Dave: is this the right way to delete existing records?
mauroar211 0:b805b487fbef 104 _records[i] = NdefRecord();
mauroar211 0:b805b487fbef 105 }
mauroar211 0:b805b487fbef 106
mauroar211 0:b805b487fbef 107 _recordCount = rhs._recordCount;
mauroar211 0:b805b487fbef 108 for (int i = 0; i < _recordCount; i++)
mauroar211 0:b805b487fbef 109 {
mauroar211 0:b805b487fbef 110 _records[i] = rhs._records[i];
mauroar211 0:b805b487fbef 111 }
mauroar211 0:b805b487fbef 112 }
mauroar211 0:b805b487fbef 113 return *this;
mauroar211 0:b805b487fbef 114 }
mauroar211 0:b805b487fbef 115
mauroar211 0:b805b487fbef 116 unsigned int NdefMessage::getRecordCount()
mauroar211 0:b805b487fbef 117 {
mauroar211 0:b805b487fbef 118 return _recordCount;
mauroar211 0:b805b487fbef 119 }
mauroar211 0:b805b487fbef 120
mauroar211 0:b805b487fbef 121 int NdefMessage::getEncodedSize()
mauroar211 0:b805b487fbef 122 {
mauroar211 0:b805b487fbef 123 int size = 0;
mauroar211 0:b805b487fbef 124 for (int i = 0; i < _recordCount; i++)
mauroar211 0:b805b487fbef 125 {
mauroar211 0:b805b487fbef 126 size += _records[i].getEncodedSize();
mauroar211 0:b805b487fbef 127 }
mauroar211 0:b805b487fbef 128 return size;
mauroar211 0:b805b487fbef 129 }
mauroar211 0:b805b487fbef 130
mauroar211 0:b805b487fbef 131 // TODO change this to return uint8_t*
mauroar211 0:b805b487fbef 132 void NdefMessage::encode(uint8_t* data)
mauroar211 0:b805b487fbef 133 {
mauroar211 0:b805b487fbef 134 // assert sizeof(data) >= getEncodedSize()
mauroar211 0:b805b487fbef 135 uint8_t* data_ptr = &data[0];
mauroar211 0:b805b487fbef 136
mauroar211 0:b805b487fbef 137 for (int i = 0; i < _recordCount; i++)
mauroar211 0:b805b487fbef 138 {
mauroar211 0:b805b487fbef 139 _records[i].encode(data_ptr, i == 0, (i + 1) == _recordCount);
mauroar211 0:b805b487fbef 140 // TODO can NdefRecord.encode return the record size?
mauroar211 0:b805b487fbef 141 data_ptr += _records[i].getEncodedSize();
mauroar211 0:b805b487fbef 142 }
mauroar211 0:b805b487fbef 143
mauroar211 0:b805b487fbef 144 }
mauroar211 0:b805b487fbef 145
mauroar211 0:b805b487fbef 146 bool NdefMessage::addRecord(NdefRecord& record)
mauroar211 0:b805b487fbef 147 {
mauroar211 0:b805b487fbef 148
mauroar211 0:b805b487fbef 149 if (_recordCount < MAX_NDEF_RECORDS)
mauroar211 0:b805b487fbef 150 {
mauroar211 0:b805b487fbef 151 _records[_recordCount] = record;
mauroar211 0:b805b487fbef 152 _recordCount++;
mauroar211 0:b805b487fbef 153 return true;
mauroar211 0:b805b487fbef 154 }
mauroar211 0:b805b487fbef 155 else
mauroar211 0:b805b487fbef 156 {
mauroar211 0:b805b487fbef 157 DMSG("WARNING: Too many records. Increase MAX_NDEF_RECORDS.");
mauroar211 0:b805b487fbef 158 return false;
mauroar211 0:b805b487fbef 159 }
mauroar211 0:b805b487fbef 160 }
mauroar211 0:b805b487fbef 161
mauroar211 0:b805b487fbef 162 void NdefMessage::addMimeMediaRecord(string mimeType, string payload)
mauroar211 0:b805b487fbef 163 {
mauroar211 0:b805b487fbef 164
mauroar211 0:b805b487fbef 165 uint8_t payloaduint8_ts[payload.length() + 1];
mauroar211 0:b805b487fbef 166 payload.copy((char*)payloaduint8_ts, sizeof(payloaduint8_ts));
mauroar211 0:b805b487fbef 167
mauroar211 0:b805b487fbef 168 addMimeMediaRecord(mimeType, payloaduint8_ts, payload.length());
mauroar211 0:b805b487fbef 169 }
mauroar211 0:b805b487fbef 170
mauroar211 0:b805b487fbef 171 void NdefMessage::addMimeMediaRecord(string mimeType, uint8_t* payload, int payloadLength)
mauroar211 0:b805b487fbef 172 {
mauroar211 0:b805b487fbef 173 NdefRecord r = NdefRecord();
mauroar211 0:b805b487fbef 174 r.setTnf(TNF_MIME_MEDIA);
mauroar211 0:b805b487fbef 175
mauroar211 0:b805b487fbef 176 uint8_t type[mimeType.length() + 1];
mauroar211 0:b805b487fbef 177 mimeType.copy((char*)type, sizeof(type));
mauroar211 0:b805b487fbef 178 r.setType(type, mimeType.length());
mauroar211 0:b805b487fbef 179
mauroar211 0:b805b487fbef 180 r.setPayload(payload, payloadLength);
mauroar211 0:b805b487fbef 181
mauroar211 0:b805b487fbef 182 addRecord(r);
mauroar211 0:b805b487fbef 183 }
mauroar211 0:b805b487fbef 184
mauroar211 0:b805b487fbef 185 void NdefMessage::addTextRecord(string text)
mauroar211 0:b805b487fbef 186 {
mauroar211 0:b805b487fbef 187 addTextRecord(text, "en");
mauroar211 0:b805b487fbef 188 }
mauroar211 0:b805b487fbef 189
mauroar211 0:b805b487fbef 190 void NdefMessage::addTextRecord(string text, string encoding)
mauroar211 0:b805b487fbef 191 {
mauroar211 0:b805b487fbef 192 NdefRecord r = NdefRecord();
mauroar211 0:b805b487fbef 193 r.setTnf(TNF_WELL_KNOWN);
mauroar211 0:b805b487fbef 194
mauroar211 0:b805b487fbef 195 uint8_t RTD_TEXT[1] = { 0x54 }; // TODO this should be a constant or preprocessor
mauroar211 0:b805b487fbef 196 r.setType(RTD_TEXT, sizeof(RTD_TEXT));
mauroar211 0:b805b487fbef 197
mauroar211 0:b805b487fbef 198 // X is a placeholder for encoding length
mauroar211 0:b805b487fbef 199 // TODO is it more efficient to build w/o string concatenation?
mauroar211 0:b805b487fbef 200 string payloadString = "X" + encoding + text;
mauroar211 0:b805b487fbef 201
mauroar211 0:b805b487fbef 202 uint8_t payload[payloadString.length() + 1];
mauroar211 0:b805b487fbef 203 payloadString.copy((char*)payload, sizeof(payload));
mauroar211 0:b805b487fbef 204
mauroar211 0:b805b487fbef 205 // replace X with the real encoding length
mauroar211 0:b805b487fbef 206 payload[0] = encoding.length();
mauroar211 0:b805b487fbef 207
mauroar211 0:b805b487fbef 208 r.setPayload(payload, payloadString.length());
mauroar211 0:b805b487fbef 209
mauroar211 0:b805b487fbef 210 addRecord(r);
mauroar211 0:b805b487fbef 211 }
mauroar211 0:b805b487fbef 212
mauroar211 0:b805b487fbef 213 void NdefMessage::addUriRecord(string uri)
mauroar211 0:b805b487fbef 214 {
mauroar211 0:b805b487fbef 215 NdefRecord* r = new NdefRecord();
mauroar211 0:b805b487fbef 216 r->setTnf(TNF_WELL_KNOWN);
mauroar211 0:b805b487fbef 217
mauroar211 0:b805b487fbef 218 uint8_t RTD_URI[1] = { 0x55 }; // TODO this should be a constant or preprocessor
mauroar211 0:b805b487fbef 219 r->setType(RTD_URI, sizeof(RTD_URI));
mauroar211 0:b805b487fbef 220
mauroar211 0:b805b487fbef 221 // X is a placeholder for identifier code
mauroar211 0:b805b487fbef 222 string payloadString = "X" + uri;
mauroar211 0:b805b487fbef 223
mauroar211 0:b805b487fbef 224 uint8_t payload[payloadString.length() + 1];
mauroar211 0:b805b487fbef 225 payloadString.copy((char*)payload, sizeof(payload));
mauroar211 0:b805b487fbef 226
mauroar211 0:b805b487fbef 227 // add identifier code 0x0, meaning no prefix substitution
mauroar211 0:b805b487fbef 228 payload[0] = 0x0;
mauroar211 0:b805b487fbef 229
mauroar211 0:b805b487fbef 230 r->setPayload(payload, payloadString.length());
mauroar211 0:b805b487fbef 231
mauroar211 0:b805b487fbef 232 addRecord(*r);
mauroar211 0:b805b487fbef 233 delete(r);
mauroar211 0:b805b487fbef 234 }
mauroar211 0:b805b487fbef 235
mauroar211 0:b805b487fbef 236 void NdefMessage::addEmptyRecord()
mauroar211 0:b805b487fbef 237 {
mauroar211 0:b805b487fbef 238 NdefRecord* r = new NdefRecord();
mauroar211 0:b805b487fbef 239 r->setTnf(TNF_EMPTY);
mauroar211 0:b805b487fbef 240 addRecord(*r);
mauroar211 0:b805b487fbef 241 delete(r);
mauroar211 0:b805b487fbef 242 }
mauroar211 0:b805b487fbef 243
mauroar211 0:b805b487fbef 244 NdefRecord NdefMessage::getRecord(int index)
mauroar211 0:b805b487fbef 245 {
mauroar211 0:b805b487fbef 246 if (index > -1 && index < _recordCount)
mauroar211 0:b805b487fbef 247 {
mauroar211 0:b805b487fbef 248 return _records[index];
mauroar211 0:b805b487fbef 249 }
mauroar211 0:b805b487fbef 250 else
mauroar211 0:b805b487fbef 251 {
mauroar211 0:b805b487fbef 252 return NdefRecord(); // would rather return NULL
mauroar211 0:b805b487fbef 253 }
mauroar211 0:b805b487fbef 254 }
mauroar211 0:b805b487fbef 255
mauroar211 0:b805b487fbef 256 NdefRecord NdefMessage::operator[](int index)
mauroar211 0:b805b487fbef 257 {
mauroar211 0:b805b487fbef 258 return getRecord(index);
mauroar211 0:b805b487fbef 259 }
mauroar211 0:b805b487fbef 260
mauroar211 0:b805b487fbef 261 void NdefMessage::print()
mauroar211 0:b805b487fbef 262 {
mauroar211 0:b805b487fbef 263 DMSG("\nNDEF Message ");
mauroar211 0:b805b487fbef 264 DMSG_INT(_recordCount);
mauroar211 0:b805b487fbef 265 DMSG(" record");
mauroar211 0:b805b487fbef 266 if (_recordCount == 1) {
mauroar211 0:b805b487fbef 267 DMSG(", ");
mauroar211 0:b805b487fbef 268 } else {
mauroar211 0:b805b487fbef 269 DMSG("s, ");
mauroar211 0:b805b487fbef 270 }
mauroar211 0:b805b487fbef 271 DMSG_INT(getEncodedSize());
mauroar211 0:b805b487fbef 272
mauroar211 0:b805b487fbef 273 int i;
mauroar211 0:b805b487fbef 274 for (i = 0; i < _recordCount; i++)
mauroar211 0:b805b487fbef 275 {
mauroar211 0:b805b487fbef 276 _records[i].print();
mauroar211 0:b805b487fbef 277 }
mauroar211 0:b805b487fbef 278 }