LEER TAG

Dependents:   NFC_HTM_READ EMULAR_TAGS Escribir_tag NFC_HTM_READ-WRITE

Committer:
mauroar211
Date:
Fri Apr 24 19:02:44 2015 +0000
Revision:
1:a549ef8b142a
Parent:
0:b805b487fbef
SE RESTAURARON LOS ARCHIVO DE LA LIBRER?A;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mauroar211 0:b805b487fbef 1
mauroar211 0:b805b487fbef 2 #include <string>
mauroar211 0:b805b487fbef 3 #include <string.h>
mauroar211 0:b805b487fbef 4 #include <stdlib.h>
mauroar211 0:b805b487fbef 5
mauroar211 0:b805b487fbef 6 #include "NdefRecord.h"
mauroar211 0:b805b487fbef 7 #include "PN532_debug.h"
mauroar211 0:b805b487fbef 8
mauroar211 0:b805b487fbef 9 NdefRecord::NdefRecord()
mauroar211 0:b805b487fbef 10 {
mauroar211 0:b805b487fbef 11 //DMSG("NdefRecord Constructor 1");
mauroar211 0:b805b487fbef 12 _tnf = 0;
mauroar211 0:b805b487fbef 13 _typeLength = 0;
mauroar211 0:b805b487fbef 14 _payloadLength = 0;
mauroar211 0:b805b487fbef 15 _idLength = 0;
mauroar211 0:b805b487fbef 16 _type = (uint8_t *)NULL;
mauroar211 0:b805b487fbef 17 _payload = (uint8_t *)NULL;
mauroar211 0:b805b487fbef 18 _id = (uint8_t *)NULL;
mauroar211 0:b805b487fbef 19 }
mauroar211 0:b805b487fbef 20
mauroar211 0:b805b487fbef 21 NdefRecord::NdefRecord(const NdefRecord& rhs)
mauroar211 0:b805b487fbef 22 {
mauroar211 0:b805b487fbef 23 //DMSG("NdefRecord Constructor 2 (copy)");
mauroar211 0:b805b487fbef 24
mauroar211 0:b805b487fbef 25 _tnf = rhs._tnf;
mauroar211 0:b805b487fbef 26 _typeLength = rhs._typeLength;
mauroar211 0:b805b487fbef 27 _payloadLength = rhs._payloadLength;
mauroar211 0:b805b487fbef 28 _idLength = rhs._idLength;
mauroar211 0:b805b487fbef 29 _type = (uint8_t *)NULL;
mauroar211 0:b805b487fbef 30 _payload = (uint8_t *)NULL;
mauroar211 0:b805b487fbef 31 _id = (uint8_t *)NULL;
mauroar211 0:b805b487fbef 32
mauroar211 0:b805b487fbef 33 if (_typeLength)
mauroar211 0:b805b487fbef 34 {
mauroar211 0:b805b487fbef 35 _type = (uint8_t*)malloc(_typeLength);
mauroar211 0:b805b487fbef 36 memcpy(_type, rhs._type, _typeLength);
mauroar211 0:b805b487fbef 37 }
mauroar211 0:b805b487fbef 38
mauroar211 0:b805b487fbef 39 if (_payloadLength)
mauroar211 0:b805b487fbef 40 {
mauroar211 0:b805b487fbef 41 _payload = (uint8_t*)malloc(_payloadLength);
mauroar211 0:b805b487fbef 42 memcpy(_payload, rhs._payload, _payloadLength);
mauroar211 0:b805b487fbef 43 }
mauroar211 0:b805b487fbef 44
mauroar211 0:b805b487fbef 45 if (_idLength)
mauroar211 0:b805b487fbef 46 {
mauroar211 0:b805b487fbef 47 _id = (uint8_t*)malloc(_idLength);
mauroar211 0:b805b487fbef 48 memcpy(_id, rhs._id, _idLength);
mauroar211 0:b805b487fbef 49 }
mauroar211 0:b805b487fbef 50
mauroar211 0:b805b487fbef 51 }
mauroar211 0:b805b487fbef 52
mauroar211 0:b805b487fbef 53 // TODO NdefRecord::NdefRecord(tnf, type, payload, id)
mauroar211 0:b805b487fbef 54
mauroar211 0:b805b487fbef 55 NdefRecord::~NdefRecord()
mauroar211 0:b805b487fbef 56 {
mauroar211 0:b805b487fbef 57 //DMSG("NdefRecord Destructor");
mauroar211 0:b805b487fbef 58 if (_typeLength)
mauroar211 0:b805b487fbef 59 {
mauroar211 0:b805b487fbef 60 free(_type);
mauroar211 0:b805b487fbef 61 }
mauroar211 0:b805b487fbef 62
mauroar211 0:b805b487fbef 63 if (_payloadLength)
mauroar211 0:b805b487fbef 64 {
mauroar211 0:b805b487fbef 65 free(_payload);
mauroar211 0:b805b487fbef 66 }
mauroar211 0:b805b487fbef 67
mauroar211 0:b805b487fbef 68 if (_idLength)
mauroar211 0:b805b487fbef 69 {
mauroar211 0:b805b487fbef 70 free(_id);
mauroar211 0:b805b487fbef 71 }
mauroar211 0:b805b487fbef 72 }
mauroar211 0:b805b487fbef 73
mauroar211 0:b805b487fbef 74 NdefRecord& NdefRecord::operator=(const NdefRecord& rhs)
mauroar211 0:b805b487fbef 75 {
mauroar211 0:b805b487fbef 76 //DMSG("NdefRecord ASSIGN");
mauroar211 0:b805b487fbef 77
mauroar211 0:b805b487fbef 78 if (this != &rhs)
mauroar211 0:b805b487fbef 79 {
mauroar211 0:b805b487fbef 80 // free existing
mauroar211 0:b805b487fbef 81 if (_typeLength)
mauroar211 0:b805b487fbef 82 {
mauroar211 0:b805b487fbef 83 free(_type);
mauroar211 0:b805b487fbef 84 }
mauroar211 0:b805b487fbef 85
mauroar211 0:b805b487fbef 86 if (_payloadLength)
mauroar211 0:b805b487fbef 87 {
mauroar211 0:b805b487fbef 88 free(_payload);
mauroar211 0:b805b487fbef 89 }
mauroar211 0:b805b487fbef 90
mauroar211 0:b805b487fbef 91 if (_idLength)
mauroar211 0:b805b487fbef 92 {
mauroar211 0:b805b487fbef 93 free(_id);
mauroar211 0:b805b487fbef 94 }
mauroar211 0:b805b487fbef 95
mauroar211 0:b805b487fbef 96 _tnf = rhs._tnf;
mauroar211 0:b805b487fbef 97 _typeLength = rhs._typeLength;
mauroar211 0:b805b487fbef 98 _payloadLength = rhs._payloadLength;
mauroar211 0:b805b487fbef 99 _idLength = rhs._idLength;
mauroar211 0:b805b487fbef 100
mauroar211 0:b805b487fbef 101 if (_typeLength)
mauroar211 0:b805b487fbef 102 {
mauroar211 0:b805b487fbef 103 _type = (uint8_t*)malloc(_typeLength);
mauroar211 0:b805b487fbef 104 memcpy(_type, rhs._type, _typeLength);
mauroar211 0:b805b487fbef 105 }
mauroar211 0:b805b487fbef 106
mauroar211 0:b805b487fbef 107 if (_payloadLength)
mauroar211 0:b805b487fbef 108 {
mauroar211 0:b805b487fbef 109 _payload = (uint8_t*)malloc(_payloadLength);
mauroar211 0:b805b487fbef 110 memcpy(_payload, rhs._payload, _payloadLength);
mauroar211 0:b805b487fbef 111 }
mauroar211 0:b805b487fbef 112
mauroar211 0:b805b487fbef 113 if (_idLength)
mauroar211 0:b805b487fbef 114 {
mauroar211 0:b805b487fbef 115 _id = (uint8_t*)malloc(_idLength);
mauroar211 0:b805b487fbef 116 memcpy(_id, rhs._id, _idLength);
mauroar211 0:b805b487fbef 117 }
mauroar211 0:b805b487fbef 118 }
mauroar211 0:b805b487fbef 119 return *this;
mauroar211 0:b805b487fbef 120 }
mauroar211 0:b805b487fbef 121
mauroar211 0:b805b487fbef 122 // size of records in uint8_ts
mauroar211 0:b805b487fbef 123 int NdefRecord::getEncodedSize()
mauroar211 0:b805b487fbef 124 {
mauroar211 0:b805b487fbef 125 int size = 2; // tnf + typeLength
mauroar211 0:b805b487fbef 126 if (_payloadLength > 0xFF)
mauroar211 0:b805b487fbef 127 {
mauroar211 0:b805b487fbef 128 size += 4;
mauroar211 0:b805b487fbef 129 }
mauroar211 0:b805b487fbef 130 else
mauroar211 0:b805b487fbef 131 {
mauroar211 0:b805b487fbef 132 size += 1;
mauroar211 0:b805b487fbef 133 }
mauroar211 0:b805b487fbef 134
mauroar211 0:b805b487fbef 135 if (_idLength)
mauroar211 0:b805b487fbef 136 {
mauroar211 0:b805b487fbef 137 size += 1;
mauroar211 0:b805b487fbef 138 }
mauroar211 0:b805b487fbef 139
mauroar211 0:b805b487fbef 140 size += (_typeLength + _payloadLength + _idLength);
mauroar211 0:b805b487fbef 141
mauroar211 0:b805b487fbef 142 return size;
mauroar211 0:b805b487fbef 143 }
mauroar211 0:b805b487fbef 144
mauroar211 0:b805b487fbef 145 void NdefRecord::encode(uint8_t *data, bool firstRecord, bool lastRecord)
mauroar211 0:b805b487fbef 146 {
mauroar211 0:b805b487fbef 147 // assert data > getEncodedSize()
mauroar211 0:b805b487fbef 148
mauroar211 0:b805b487fbef 149 uint8_t* data_ptr = &data[0];
mauroar211 0:b805b487fbef 150
mauroar211 0:b805b487fbef 151 *data_ptr = getTnfuint8_t(firstRecord, lastRecord);
mauroar211 0:b805b487fbef 152 data_ptr += 1;
mauroar211 0:b805b487fbef 153
mauroar211 0:b805b487fbef 154 *data_ptr = _typeLength;
mauroar211 0:b805b487fbef 155 data_ptr += 1;
mauroar211 0:b805b487fbef 156
mauroar211 0:b805b487fbef 157 if (_payloadLength <= 0xFF) { // short record
mauroar211 0:b805b487fbef 158 *data_ptr = _payloadLength;
mauroar211 0:b805b487fbef 159 data_ptr += 1;
mauroar211 0:b805b487fbef 160 } else { // long format
mauroar211 0:b805b487fbef 161 // 4 uint8_ts but we store length as an int
mauroar211 0:b805b487fbef 162 data_ptr[0] = 0x0; // (_payloadLength >> 24) & 0xFF;
mauroar211 0:b805b487fbef 163 data_ptr[1] = 0x0; // (_payloadLength >> 16) & 0xFF;
mauroar211 0:b805b487fbef 164 data_ptr[2] = (_payloadLength >> 8) & 0xFF;
mauroar211 0:b805b487fbef 165 data_ptr[3] = _payloadLength & 0xFF;
mauroar211 0:b805b487fbef 166 data_ptr += 4;
mauroar211 0:b805b487fbef 167 }
mauroar211 0:b805b487fbef 168
mauroar211 0:b805b487fbef 169 if (_idLength)
mauroar211 0:b805b487fbef 170 {
mauroar211 0:b805b487fbef 171 *data_ptr = _idLength;
mauroar211 0:b805b487fbef 172 data_ptr += 1;
mauroar211 0:b805b487fbef 173 }
mauroar211 0:b805b487fbef 174
mauroar211 0:b805b487fbef 175 //DMSG(2);
mauroar211 0:b805b487fbef 176 memcpy(data_ptr, _type, _typeLength);
mauroar211 0:b805b487fbef 177 data_ptr += _typeLength;
mauroar211 0:b805b487fbef 178
mauroar211 0:b805b487fbef 179 memcpy(data_ptr, _payload, _payloadLength);
mauroar211 0:b805b487fbef 180 data_ptr += _payloadLength;
mauroar211 0:b805b487fbef 181
mauroar211 0:b805b487fbef 182 if (_idLength)
mauroar211 0:b805b487fbef 183 {
mauroar211 0:b805b487fbef 184 memcpy(data_ptr, _id, _idLength);
mauroar211 0:b805b487fbef 185 data_ptr += _idLength;
mauroar211 0:b805b487fbef 186 }
mauroar211 0:b805b487fbef 187 }
mauroar211 0:b805b487fbef 188
mauroar211 0:b805b487fbef 189 uint8_t NdefRecord::getTnfuint8_t(bool firstRecord, bool lastRecord)
mauroar211 0:b805b487fbef 190 {
mauroar211 0:b805b487fbef 191 int value = _tnf;
mauroar211 0:b805b487fbef 192
mauroar211 0:b805b487fbef 193 if (firstRecord) { // mb
mauroar211 0:b805b487fbef 194 value = value | 0x80;
mauroar211 0:b805b487fbef 195 }
mauroar211 0:b805b487fbef 196
mauroar211 0:b805b487fbef 197 if (lastRecord) { //
mauroar211 0:b805b487fbef 198 value = value | 0x40;
mauroar211 0:b805b487fbef 199 }
mauroar211 0:b805b487fbef 200
mauroar211 0:b805b487fbef 201 // chunked flag is always false for now
mauroar211 0:b805b487fbef 202 // if (cf) {
mauroar211 0:b805b487fbef 203 // value = value | 0x20;
mauroar211 0:b805b487fbef 204 // }
mauroar211 0:b805b487fbef 205
mauroar211 0:b805b487fbef 206 if (_payloadLength <= 0xFF) {
mauroar211 0:b805b487fbef 207 value = value | 0x10;
mauroar211 0:b805b487fbef 208 }
mauroar211 0:b805b487fbef 209
mauroar211 0:b805b487fbef 210 if (_idLength) {
mauroar211 0:b805b487fbef 211 value = value | 0x8;
mauroar211 0:b805b487fbef 212 }
mauroar211 0:b805b487fbef 213
mauroar211 0:b805b487fbef 214 return value;
mauroar211 0:b805b487fbef 215 }
mauroar211 0:b805b487fbef 216
mauroar211 0:b805b487fbef 217 uint8_t NdefRecord::getTnf()
mauroar211 0:b805b487fbef 218 {
mauroar211 0:b805b487fbef 219 return _tnf;
mauroar211 0:b805b487fbef 220 }
mauroar211 0:b805b487fbef 221
mauroar211 0:b805b487fbef 222 void NdefRecord::setTnf(uint8_t tnf)
mauroar211 0:b805b487fbef 223 {
mauroar211 0:b805b487fbef 224 _tnf = tnf;
mauroar211 0:b805b487fbef 225 }
mauroar211 0:b805b487fbef 226
mauroar211 0:b805b487fbef 227 unsigned int NdefRecord::getTypeLength()
mauroar211 0:b805b487fbef 228 {
mauroar211 0:b805b487fbef 229 return _typeLength;
mauroar211 0:b805b487fbef 230 }
mauroar211 0:b805b487fbef 231
mauroar211 0:b805b487fbef 232 int NdefRecord::getPayloadLength()
mauroar211 0:b805b487fbef 233 {
mauroar211 0:b805b487fbef 234 return _payloadLength;
mauroar211 0:b805b487fbef 235 }
mauroar211 0:b805b487fbef 236
mauroar211 0:b805b487fbef 237 unsigned int NdefRecord::getIdLength()
mauroar211 0:b805b487fbef 238 {
mauroar211 0:b805b487fbef 239 return _idLength;
mauroar211 0:b805b487fbef 240 }
mauroar211 0:b805b487fbef 241
mauroar211 0:b805b487fbef 242 string NdefRecord::getType()
mauroar211 0:b805b487fbef 243 {
mauroar211 0:b805b487fbef 244 char type[_typeLength + 1];
mauroar211 0:b805b487fbef 245 memcpy(type, _type, _typeLength);
mauroar211 0:b805b487fbef 246 type[_typeLength] = '\0'; // null terminate
mauroar211 0:b805b487fbef 247 return string(type);
mauroar211 0:b805b487fbef 248 }
mauroar211 0:b805b487fbef 249
mauroar211 0:b805b487fbef 250 // this assumes the caller created type correctly
mauroar211 0:b805b487fbef 251 void NdefRecord::getType(uint8_t* type)
mauroar211 0:b805b487fbef 252 {
mauroar211 0:b805b487fbef 253 memcpy(type, _type, _typeLength);
mauroar211 0:b805b487fbef 254 }
mauroar211 0:b805b487fbef 255
mauroar211 0:b805b487fbef 256 void NdefRecord::setType(const uint8_t * type, const unsigned int numuint8_ts)
mauroar211 0:b805b487fbef 257 {
mauroar211 0:b805b487fbef 258 if(_typeLength)
mauroar211 0:b805b487fbef 259 {
mauroar211 0:b805b487fbef 260 free(_type);
mauroar211 0:b805b487fbef 261 }
mauroar211 0:b805b487fbef 262
mauroar211 0:b805b487fbef 263 _type = (uint8_t*)malloc(numuint8_ts);
mauroar211 0:b805b487fbef 264 memcpy(_type, type, numuint8_ts);
mauroar211 0:b805b487fbef 265 _typeLength = numuint8_ts;
mauroar211 0:b805b487fbef 266 }
mauroar211 0:b805b487fbef 267
mauroar211 0:b805b487fbef 268 // assumes the caller sized payload properly
mauroar211 0:b805b487fbef 269 void NdefRecord::getPayload(uint8_t *payload)
mauroar211 0:b805b487fbef 270 {
mauroar211 0:b805b487fbef 271 memcpy(payload, _payload, _payloadLength);
mauroar211 0:b805b487fbef 272 }
mauroar211 0:b805b487fbef 273
mauroar211 0:b805b487fbef 274 void NdefRecord::setPayload(const uint8_t * payload, const int numuint8_ts)
mauroar211 0:b805b487fbef 275 {
mauroar211 0:b805b487fbef 276 if (_payloadLength)
mauroar211 0:b805b487fbef 277 {
mauroar211 0:b805b487fbef 278 free(_payload);
mauroar211 0:b805b487fbef 279 }
mauroar211 0:b805b487fbef 280
mauroar211 0:b805b487fbef 281 _payload = (uint8_t*)malloc(numuint8_ts);
mauroar211 0:b805b487fbef 282 memcpy(_payload, payload, numuint8_ts);
mauroar211 0:b805b487fbef 283 _payloadLength = numuint8_ts;
mauroar211 0:b805b487fbef 284 }
mauroar211 0:b805b487fbef 285
mauroar211 0:b805b487fbef 286 string NdefRecord::getId()
mauroar211 0:b805b487fbef 287 {
mauroar211 0:b805b487fbef 288 char id[_idLength + 1];
mauroar211 0:b805b487fbef 289 memcpy(id, _id, _idLength);
mauroar211 0:b805b487fbef 290 id[_idLength] = '\0'; // null terminate
mauroar211 0:b805b487fbef 291 return string(id);
mauroar211 0:b805b487fbef 292 }
mauroar211 0:b805b487fbef 293
mauroar211 0:b805b487fbef 294 void NdefRecord::getId(uint8_t *id)
mauroar211 0:b805b487fbef 295 {
mauroar211 0:b805b487fbef 296 memcpy(id, _id, _idLength);
mauroar211 0:b805b487fbef 297 }
mauroar211 0:b805b487fbef 298
mauroar211 0:b805b487fbef 299 void NdefRecord::setId(const uint8_t * id, const unsigned int numuint8_ts)
mauroar211 0:b805b487fbef 300 {
mauroar211 0:b805b487fbef 301 if (_idLength)
mauroar211 0:b805b487fbef 302 {
mauroar211 0:b805b487fbef 303 free(_id);
mauroar211 0:b805b487fbef 304 }
mauroar211 0:b805b487fbef 305
mauroar211 0:b805b487fbef 306 _id = (uint8_t*)malloc(numuint8_ts);
mauroar211 0:b805b487fbef 307 memcpy(_id, id, numuint8_ts);
mauroar211 0:b805b487fbef 308 _idLength = numuint8_ts;
mauroar211 0:b805b487fbef 309 }
mauroar211 0:b805b487fbef 310
mauroar211 0:b805b487fbef 311 void NdefRecord::print()
mauroar211 0:b805b487fbef 312 {
mauroar211 0:b805b487fbef 313 DMSG(" NDEF Record");
mauroar211 0:b805b487fbef 314 DMSG(" TNF 0x");
mauroar211 0:b805b487fbef 315 DMSG_HEX(_tnf);
mauroar211 0:b805b487fbef 316 DMSG(" ");
mauroar211 0:b805b487fbef 317 switch (_tnf) {
mauroar211 0:b805b487fbef 318 case TNF_EMPTY:
mauroar211 0:b805b487fbef 319 DMSG("Empty");
mauroar211 0:b805b487fbef 320 break;
mauroar211 0:b805b487fbef 321 case TNF_WELL_KNOWN:
mauroar211 0:b805b487fbef 322 DMSG("Well Known");
mauroar211 0:b805b487fbef 323 break;
mauroar211 0:b805b487fbef 324 case TNF_MIME_MEDIA:
mauroar211 0:b805b487fbef 325 DMSG("Mime Media");
mauroar211 0:b805b487fbef 326 break;
mauroar211 0:b805b487fbef 327 case TNF_ABSOLUTE_URI:
mauroar211 0:b805b487fbef 328 DMSG("Absolute URI");
mauroar211 0:b805b487fbef 329 break;
mauroar211 0:b805b487fbef 330 case TNF_EXTERNAL_TYPE:
mauroar211 0:b805b487fbef 331 DMSG("External");
mauroar211 0:b805b487fbef 332 break;
mauroar211 0:b805b487fbef 333 case TNF_UNKNOWN:
mauroar211 0:b805b487fbef 334 DMSG("Unknown");
mauroar211 0:b805b487fbef 335 break;
mauroar211 0:b805b487fbef 336 case TNF_UNCHANGED:
mauroar211 0:b805b487fbef 337 DMSG("Unchanged");
mauroar211 0:b805b487fbef 338 break;
mauroar211 0:b805b487fbef 339 case TNF_RESERVED:
mauroar211 0:b805b487fbef 340 DMSG("Reserved");
mauroar211 0:b805b487fbef 341 break;
mauroar211 0:b805b487fbef 342 default:
mauroar211 0:b805b487fbef 343 DMSG("\n");
mauroar211 0:b805b487fbef 344 }
mauroar211 0:b805b487fbef 345 DMSG(" Type Length 0x");
mauroar211 0:b805b487fbef 346 DMSG_HEX(_typeLength);
mauroar211 0:b805b487fbef 347 DMSG(" Payload Length 0x");
mauroar211 0:b805b487fbef 348 DMSG_HEX(_payloadLength);
mauroar211 0:b805b487fbef 349 if (_idLength)
mauroar211 0:b805b487fbef 350 {
mauroar211 0:b805b487fbef 351 DMSG(" Id Length 0x");
mauroar211 0:b805b487fbef 352 DMSG_HEX(_idLength);
mauroar211 0:b805b487fbef 353 }
mauroar211 0:b805b487fbef 354 DMSG(" Type ");PrintHexChar(_type, _typeLength);
mauroar211 0:b805b487fbef 355 // TODO chunk large payloads so this is readable
mauroar211 0:b805b487fbef 356 DMSG(" Payload ");PrintHexChar(_payload, _payloadLength);
mauroar211 0:b805b487fbef 357 if (_idLength)
mauroar211 0:b805b487fbef 358 {
mauroar211 0:b805b487fbef 359 DMSG(" Id ");PrintHexChar(_id, _idLength);
mauroar211 0:b805b487fbef 360 }
mauroar211 0:b805b487fbef 361 DMSG(" Record is ");
mauroar211 0:b805b487fbef 362 DMSG_INT(getEncodedSize());
mauroar211 0:b805b487fbef 363 }