PN532 NFC library for Seeed Studio's NFC Shield

Fork of PN532 by Yihui Xiong

Committer:
r4z0r7o3
Date:
Wed Feb 04 16:24:30 2015 +0000
Revision:
9:85bfede025da
Parent:
3:4189a10038e6
Fixed missing return statement

Who changed what in which revision?

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