to colorize a colorful pixel with a simple touch using nfc technology

Dependencies:   Chainable_RGB_LED mbed

use Arch, NFC Shield and Grove - Chainable RGB LED to DIY a touch pixel. Then use an Android with NFC support to colorize it.

The project is on https://github.com/Seeed-Studio/TouchPixel

Committer:
yihui
Date:
Fri Dec 27 01:46:32 2013 +0000
Revision:
0:88960f3eeb2c
initial

Who changed what in which revision?

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