AppNearMe µNFC stack for the NXP PN532 chip License: You can use the stack free of charge to prototype with mbed; if you want to use the stack with your commercial product, get in touch!

Dependents:   IOT_sensor_nfc AppNearMe_MuNFC_PN532_Test p2p_nfc_test NFCMoodLamp ... more

License

You can use the stack free of charge to prototype with mbed; if you want to use the stack with your commercial product, get in touch!

Committer:
AppNearMe
Date:
Tue Aug 07 21:55:12 2012 +0000
Revision:
3:0b949b2d3b55
Parent:
1:1074716d0111
Versioning -> Hg

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AppNearMe 3:0b949b2d3b55 1 /*
AppNearMe 3:0b949b2d3b55 2 TLVList.cpp
AppNearMe 3:0b949b2d3b55 3 Copyright (c) Donatien Garnier 2012
AppNearMe 3:0b949b2d3b55 4 donatien.garnier@appnearme.com
AppNearMe 3:0b949b2d3b55 5 http://www.appnearme.com/
AppNearMe 3:0b949b2d3b55 6 */
AppNearMe 3:0b949b2d3b55 7
AppNearMe 3:0b949b2d3b55 8 #include "TLVList.h"
AppNearMe 3:0b949b2d3b55 9
AppNearMe 3:0b949b2d3b55 10 #include "munfc/core/fwk.h"
AppNearMe 3:0b949b2d3b55 11 #include "munfc/ndef/appnearme_ndef_tlv.h"
AppNearMe 3:0b949b2d3b55 12
AppNearMe 3:0b949b2d3b55 13 #include <cstring> //For memcpy, strlen
AppNearMe 3:0b949b2d3b55 14 using std::memcpy;
AppNearMe 3:0b949b2d3b55 15 using std::strlen;
AppNearMe 3:0b949b2d3b55 16
AppNearMe 3:0b949b2d3b55 17 TLVList::TLVList() : m_tlvList(NULL)
AppNearMe 3:0b949b2d3b55 18 {
AppNearMe 3:0b949b2d3b55 19
AppNearMe 3:0b949b2d3b55 20 }
AppNearMe 3:0b949b2d3b55 21
AppNearMe 3:0b949b2d3b55 22 void TLVList::wrap(tlv_list* payload)
AppNearMe 3:0b949b2d3b55 23 {
AppNearMe 3:0b949b2d3b55 24 m_tlvList = payload;
AppNearMe 3:0b949b2d3b55 25 m_space = true;
AppNearMe 3:0b949b2d3b55 26 m_type = NONE;
AppNearMe 3:0b949b2d3b55 27 }
AppNearMe 3:0b949b2d3b55 28
AppNearMe 3:0b949b2d3b55 29
AppNearMe 3:0b949b2d3b55 30
AppNearMe 3:0b949b2d3b55 31 /* Getters */
AppNearMe 3:0b949b2d3b55 32
AppNearMe 3:0b949b2d3b55 33 /** Iterate to next item
AppNearMe 3:0b949b2d3b55 34 * @return type if next item exists, NONE otherwise
AppNearMe 3:0b949b2d3b55 35 */
AppNearMe 3:0b949b2d3b55 36 TLVList::TLVType TLVList::getNext()
AppNearMe 3:0b949b2d3b55 37 {
AppNearMe 3:0b949b2d3b55 38 if(!m_tlvList)
AppNearMe 3:0b949b2d3b55 39 {
AppNearMe 3:0b949b2d3b55 40 return NONE;
AppNearMe 3:0b949b2d3b55 41 }
AppNearMe 3:0b949b2d3b55 42
AppNearMe 3:0b949b2d3b55 43 m_type = (TLVList::TLVType) appnearme_ndef_tlv_next_type(m_tlvList); //Explicit cast, this is the same enum
AppNearMe 3:0b949b2d3b55 44 switch(m_type)
AppNearMe 3:0b949b2d3b55 45 {
AppNearMe 3:0b949b2d3b55 46 case UINT8:
AppNearMe 3:0b949b2d3b55 47 m_arrayLen = 0;
AppNearMe 3:0b949b2d3b55 48 m_uint8 = appnearme_ndef_tlv_get_uint8(m_tlvList);
AppNearMe 3:0b949b2d3b55 49 break;
AppNearMe 3:0b949b2d3b55 50 case UINT32:
AppNearMe 3:0b949b2d3b55 51 m_arrayLen = 0;
AppNearMe 3:0b949b2d3b55 52 m_uint32 = appnearme_ndef_tlv_get_uint32(m_tlvList);
AppNearMe 3:0b949b2d3b55 53 break;
AppNearMe 3:0b949b2d3b55 54 case UINT8_ARRAY:
AppNearMe 3:0b949b2d3b55 55 //In this order, otherwise would break state-machine
AppNearMe 3:0b949b2d3b55 56 m_arrayLen = appnearme_ndef_tlv_get_array_length(m_tlvList);
AppNearMe 3:0b949b2d3b55 57 m_array = appnearme_ndef_tlv_get_array(m_tlvList);
AppNearMe 3:0b949b2d3b55 58 break;
AppNearMe 3:0b949b2d3b55 59 case STRING:
AppNearMe 3:0b949b2d3b55 60 //In this order, otherwise would break state-machine
AppNearMe 3:0b949b2d3b55 61 m_strLen = appnearme_ndef_tlv_get_string_length(m_tlvList);
AppNearMe 3:0b949b2d3b55 62 m_str = appnearme_ndef_tlv_get_string(m_tlvList);
AppNearMe 3:0b949b2d3b55 63 break;
AppNearMe 3:0b949b2d3b55 64 }
AppNearMe 3:0b949b2d3b55 65 return m_type;
AppNearMe 3:0b949b2d3b55 66 }
AppNearMe 3:0b949b2d3b55 67
AppNearMe 3:0b949b2d3b55 68 /** Get uint8_t value
AppNearMe 3:0b949b2d3b55 69 * If the current item's type is uint32_t, the value will be masked with 0xFF
AppNearMe 3:0b949b2d3b55 70 * @return uint8_t value OR 0 if the type is incompatible
AppNearMe 3:0b949b2d3b55 71 */
AppNearMe 3:0b949b2d3b55 72 uint8_t TLVList::getUInt8()
AppNearMe 3:0b949b2d3b55 73 {
AppNearMe 3:0b949b2d3b55 74 switch(m_type)
AppNearMe 3:0b949b2d3b55 75 {
AppNearMe 3:0b949b2d3b55 76 case UINT8:
AppNearMe 3:0b949b2d3b55 77 return m_uint8;
AppNearMe 3:0b949b2d3b55 78 case UINT32:
AppNearMe 3:0b949b2d3b55 79 return m_uint32 & 0xFF;
AppNearMe 3:0b949b2d3b55 80 default:
AppNearMe 3:0b949b2d3b55 81 return 0;
AppNearMe 3:0b949b2d3b55 82 }
AppNearMe 3:0b949b2d3b55 83 }
AppNearMe 3:0b949b2d3b55 84
AppNearMe 3:0b949b2d3b55 85 /** Get uint32_t value
AppNearMe 3:0b949b2d3b55 86 * If the current item's type is uint8_t, the value will be casted to uint32_t
AppNearMe 3:0b949b2d3b55 87 * @return uint32_t value OR 0 if the type is incompatible
AppNearMe 3:0b949b2d3b55 88 */
AppNearMe 3:0b949b2d3b55 89 uint32_t TLVList::getUInt32()
AppNearMe 3:0b949b2d3b55 90 {
AppNearMe 3:0b949b2d3b55 91 switch(m_type)
AppNearMe 3:0b949b2d3b55 92 {
AppNearMe 3:0b949b2d3b55 93 case UINT32:
AppNearMe 3:0b949b2d3b55 94 return m_uint32;
AppNearMe 3:0b949b2d3b55 95 case UINT8:
AppNearMe 3:0b949b2d3b55 96 return m_uint8 & 0xFF;
AppNearMe 3:0b949b2d3b55 97 default:
AppNearMe 3:0b949b2d3b55 98 return 0;
AppNearMe 3:0b949b2d3b55 99 }
AppNearMe 3:0b949b2d3b55 100 }
AppNearMe 3:0b949b2d3b55 101
AppNearMe 3:0b949b2d3b55 102 /** Get array length
AppNearMe 3:0b949b2d3b55 103 * @return bytes array length
AppNearMe 3:0b949b2d3b55 104 */
AppNearMe 3:0b949b2d3b55 105 size_t TLVList::getArrayLength()
AppNearMe 3:0b949b2d3b55 106 {
AppNearMe 3:0b949b2d3b55 107 switch(m_type)
AppNearMe 3:0b949b2d3b55 108 {
AppNearMe 3:0b949b2d3b55 109 case UINT8_ARRAY:
AppNearMe 3:0b949b2d3b55 110 return m_arrayLen;
AppNearMe 3:0b949b2d3b55 111 default:
AppNearMe 3:0b949b2d3b55 112 return 0;
AppNearMe 3:0b949b2d3b55 113 }
AppNearMe 3:0b949b2d3b55 114 }
AppNearMe 3:0b949b2d3b55 115
AppNearMe 3:0b949b2d3b55 116 /** Get array
AppNearMe 3:0b949b2d3b55 117 * @param buf pointer to buffer's start
AppNearMe 3:0b949b2d3b55 118 * @param maxLen maximum number of bytes to copy
AppNearMe 3:0b949b2d3b55 119 * @return number of copied bytes
AppNearMe 3:0b949b2d3b55 120 */
AppNearMe 3:0b949b2d3b55 121 size_t TLVList::getArray(uint8_t* buf, size_t maxLen)
AppNearMe 3:0b949b2d3b55 122 {
AppNearMe 3:0b949b2d3b55 123 if(m_type != UINT8_ARRAY)
AppNearMe 3:0b949b2d3b55 124 {
AppNearMe 3:0b949b2d3b55 125 return 0;
AppNearMe 3:0b949b2d3b55 126 }
AppNearMe 3:0b949b2d3b55 127 size_t len = MIN(maxLen, m_arrayLen);
AppNearMe 3:0b949b2d3b55 128 memcpy(buf, m_array, len);
AppNearMe 3:0b949b2d3b55 129 return len;
AppNearMe 3:0b949b2d3b55 130 }
AppNearMe 3:0b949b2d3b55 131
AppNearMe 3:0b949b2d3b55 132 /** Get string length
AppNearMe 3:0b949b2d3b55 133 * @return string length
AppNearMe 3:0b949b2d3b55 134 */
AppNearMe 3:0b949b2d3b55 135 size_t TLVList::getStringLength()
AppNearMe 3:0b949b2d3b55 136 {
AppNearMe 3:0b949b2d3b55 137 switch(m_type)
AppNearMe 3:0b949b2d3b55 138 {
AppNearMe 3:0b949b2d3b55 139 case STRING:
AppNearMe 3:0b949b2d3b55 140 return m_strLen;
AppNearMe 3:0b949b2d3b55 141 default:
AppNearMe 3:0b949b2d3b55 142 return 0;
AppNearMe 3:0b949b2d3b55 143 }
AppNearMe 3:0b949b2d3b55 144 }
AppNearMe 3:0b949b2d3b55 145
AppNearMe 3:0b949b2d3b55 146
AppNearMe 3:0b949b2d3b55 147 /** Get string
AppNearMe 3:0b949b2d3b55 148 * Copy string to buffer (including null-terminating char)
AppNearMe 3:0b949b2d3b55 149 * @param str pointer to string's start
AppNearMe 3:0b949b2d3b55 150 * @param maxLen maximum number of chars to copy (not including null-terminating char)
AppNearMe 3:0b949b2d3b55 151 * @return number of copied chars
AppNearMe 3:0b949b2d3b55 152 */
AppNearMe 3:0b949b2d3b55 153 size_t TLVList::getString(char* str, size_t maxLen)
AppNearMe 3:0b949b2d3b55 154 {
AppNearMe 3:0b949b2d3b55 155 if(m_type != STRING)
AppNearMe 3:0b949b2d3b55 156 {
AppNearMe 3:0b949b2d3b55 157 return 0;
AppNearMe 3:0b949b2d3b55 158 }
AppNearMe 3:0b949b2d3b55 159 size_t len = MIN(maxLen, m_strLen);
AppNearMe 3:0b949b2d3b55 160 memcpy(str, m_str, len);
AppNearMe 3:0b949b2d3b55 161 str[len] = '\0'; //Add null-terminating char
AppNearMe 3:0b949b2d3b55 162 return len;
AppNearMe 3:0b949b2d3b55 163 }
AppNearMe 3:0b949b2d3b55 164
AppNearMe 3:0b949b2d3b55 165 /* Setters */
AppNearMe 3:0b949b2d3b55 166
AppNearMe 3:0b949b2d3b55 167 /** Check whether there is space left in list
AppNearMe 3:0b949b2d3b55 168 * @return true if there is space left, false otherwise
AppNearMe 3:0b949b2d3b55 169 */
AppNearMe 3:0b949b2d3b55 170 bool TLVList::isSpace()
AppNearMe 3:0b949b2d3b55 171 {
AppNearMe 3:0b949b2d3b55 172 return m_space;
AppNearMe 3:0b949b2d3b55 173 }
AppNearMe 3:0b949b2d3b55 174
AppNearMe 3:0b949b2d3b55 175 /** Put uint8_t value
AppNearMe 3:0b949b2d3b55 176 * @param value uint8_t value
AppNearMe 3:0b949b2d3b55 177 * @return true on success, false if there is not enough space in buffer
AppNearMe 3:0b949b2d3b55 178 */
AppNearMe 3:0b949b2d3b55 179 bool TLVList::putUInt8(uint8_t value)
AppNearMe 3:0b949b2d3b55 180 {
AppNearMe 3:0b949b2d3b55 181 int res = appnearme_ndef_tlv_put_uint8(m_tlvList, value);
AppNearMe 3:0b949b2d3b55 182 if( !res )
AppNearMe 3:0b949b2d3b55 183 {
AppNearMe 3:0b949b2d3b55 184 m_space = false;
AppNearMe 3:0b949b2d3b55 185 return false;
AppNearMe 3:0b949b2d3b55 186 }
AppNearMe 3:0b949b2d3b55 187 return true;
AppNearMe 3:0b949b2d3b55 188 }
AppNearMe 3:0b949b2d3b55 189
AppNearMe 3:0b949b2d3b55 190 /** Put uint32_t value
AppNearMe 3:0b949b2d3b55 191 * @param value uint32_t value
AppNearMe 3:0b949b2d3b55 192 * @return true on success, false if there is not enough space in buffer
AppNearMe 3:0b949b2d3b55 193 */
AppNearMe 3:0b949b2d3b55 194 bool TLVList::putUInt32(uint32_t value)
AppNearMe 3:0b949b2d3b55 195 {
AppNearMe 3:0b949b2d3b55 196 int res = appnearme_ndef_tlv_put_uint32(m_tlvList, value);
AppNearMe 3:0b949b2d3b55 197 if( !res )
AppNearMe 3:0b949b2d3b55 198 {
AppNearMe 3:0b949b2d3b55 199 m_space = false;
AppNearMe 3:0b949b2d3b55 200 return false;
AppNearMe 3:0b949b2d3b55 201 }
AppNearMe 3:0b949b2d3b55 202 return true;
AppNearMe 3:0b949b2d3b55 203 }
AppNearMe 3:0b949b2d3b55 204
AppNearMe 3:0b949b2d3b55 205 /** Put array
AppNearMe 3:0b949b2d3b55 206 * @param buf pointer to buffer's start
AppNearMe 3:0b949b2d3b55 207 * @param len number of bytes to copy
AppNearMe 3:0b949b2d3b55 208 * @return number of copied bytes
AppNearMe 3:0b949b2d3b55 209 */
AppNearMe 3:0b949b2d3b55 210 size_t TLVList::putArray(uint8_t* buf, size_t len)
AppNearMe 3:0b949b2d3b55 211 {
AppNearMe 3:0b949b2d3b55 212 int res = appnearme_ndef_tlv_put_array(m_tlvList, buf, len);
AppNearMe 3:0b949b2d3b55 213 if( !res )
AppNearMe 3:0b949b2d3b55 214 {
AppNearMe 3:0b949b2d3b55 215 m_space = false;
AppNearMe 3:0b949b2d3b55 216 return 0;
AppNearMe 3:0b949b2d3b55 217 }
AppNearMe 3:0b949b2d3b55 218 return len;
AppNearMe 3:0b949b2d3b55 219 }
AppNearMe 3:0b949b2d3b55 220
AppNearMe 3:0b949b2d3b55 221 /** Put string
AppNearMe 3:0b949b2d3b55 222 * @param str pointer to null-terminated string's start
AppNearMe 3:0b949b2d3b55 223 * @return number of copied bytes
AppNearMe 3:0b949b2d3b55 224 */
AppNearMe 3:0b949b2d3b55 225 size_t TLVList::putString(char* str)
AppNearMe 3:0b949b2d3b55 226 {
AppNearMe 3:0b949b2d3b55 227 int res = appnearme_ndef_tlv_put_string(m_tlvList, str);
AppNearMe 3:0b949b2d3b55 228 if( !res )
AppNearMe 3:0b949b2d3b55 229 {
AppNearMe 3:0b949b2d3b55 230 m_space = false;
AppNearMe 3:0b949b2d3b55 231 return 0;
AppNearMe 3:0b949b2d3b55 232 }
AppNearMe 3:0b949b2d3b55 233 return strlen(str);
AppNearMe 3:0b949b2d3b55 234 }
AppNearMe 3:0b949b2d3b55 235