Utility library to read and write Ndef messages from/to a Type4 NFC tag

Dependents:   NFC M2M_2016_STM32 MyongjiElec_capstone1 IDW01M1_Cloud_IBM ... more

Fork of NDefLib by ST Expansion SW Team

NDEF NFC library

This library provides an abstract API to create NDEF formatted messages and records and to read/write them from/to a Type4 NFC Tag.

Implementations

At the moment, the NDEF API is implemented by X_NUCLEO_NFC01A1 and X_NUCLEO_NFC02A1 Dynamic NFC Tag libraries respectively driving the X-NUCLEO-NFC01A1 and X-NUCLEO-NFC02A1 boards.

Committer:
giovannivisentini
Date:
Thu Dec 03 14:56:01 2015 +0000
Revision:
6:739e3211749d
Parent:
4:eaf6c49a86e4
Child:
7:1ebd6049fa57
Add License

Who changed what in which revision?

UserRevisionLine numberNew contents of line
giovannivisentini 6:739e3211749d 1 /**
giovannivisentini 6:739e3211749d 2 ******************************************************************************
giovannivisentini 6:739e3211749d 3 * @file RecordHeader.h
giovannivisentini 6:739e3211749d 4 * @author ST / CentralLabs
giovannivisentini 6:739e3211749d 5 * @version V1.0.0
giovannivisentini 6:739e3211749d 6 * @date 30 Nov 2015
giovannivisentini 6:739e3211749d 7 * @brief Record header class
giovannivisentini 6:739e3211749d 8 ******************************************************************************
giovannivisentini 6:739e3211749d 9 * @attention
giovannivisentini 6:739e3211749d 10 *
giovannivisentini 6:739e3211749d 11 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
giovannivisentini 4:eaf6c49a86e4 12 *
giovannivisentini 6:739e3211749d 13 * Redistribution and use in source and binary forms, with or without modification,
giovannivisentini 6:739e3211749d 14 * are permitted provided that the following conditions are met:
giovannivisentini 6:739e3211749d 15 * 1. Redistributions of source code must retain the above copyright notice,
giovannivisentini 6:739e3211749d 16 * this list of conditions and the following disclaimer.
giovannivisentini 6:739e3211749d 17 * 2. Redistributions in binary form must reproduce the above copyright notice,
giovannivisentini 6:739e3211749d 18 * this list of conditions and the following disclaimer in the documentation
giovannivisentini 6:739e3211749d 19 * and/or other materials provided with the distribution.
giovannivisentini 6:739e3211749d 20 * 3. Neither the name of STMicroelectronics nor the names of its contributors
giovannivisentini 6:739e3211749d 21 * may be used to endorse or promote products derived from this software
giovannivisentini 6:739e3211749d 22 * without specific prior written permission.
giovannivisentini 6:739e3211749d 23 *
giovannivisentini 6:739e3211749d 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
giovannivisentini 6:739e3211749d 25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
giovannivisentini 6:739e3211749d 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
giovannivisentini 6:739e3211749d 27 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
giovannivisentini 6:739e3211749d 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
giovannivisentini 6:739e3211749d 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
giovannivisentini 6:739e3211749d 30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
giovannivisentini 6:739e3211749d 31 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
giovannivisentini 6:739e3211749d 32 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
giovannivisentini 6:739e3211749d 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
giovannivisentini 6:739e3211749d 34 *
giovannivisentini 6:739e3211749d 35 ******************************************************************************
giovannivisentini 4:eaf6c49a86e4 36 */
giovannivisentini 4:eaf6c49a86e4 37
giovannivisentini 4:eaf6c49a86e4 38 #ifndef NDEFLIB_RECORDHEADER_H_
giovannivisentini 4:eaf6c49a86e4 39 #define NDEFLIB_RECORDHEADER_H_
giovannivisentini 4:eaf6c49a86e4 40
giovannivisentini 4:eaf6c49a86e4 41 #include <stdint.h>
giovannivisentini 4:eaf6c49a86e4 42
giovannivisentini 4:eaf6c49a86e4 43 namespace NDefLib {
giovannivisentini 4:eaf6c49a86e4 44
giovannivisentini 4:eaf6c49a86e4 45 /**
giovannivisentini 4:eaf6c49a86e4 46 * Record header class
giovannivisentini 4:eaf6c49a86e4 47 * @see NFC Data Exchange Format (NDEF) Technical Specification NDEF 1.0
giovannivisentini 4:eaf6c49a86e4 48 */
giovannivisentini 4:eaf6c49a86e4 49 class RecordHeader {
giovannivisentini 4:eaf6c49a86e4 50
giovannivisentini 4:eaf6c49a86e4 51 public:
giovannivisentini 4:eaf6c49a86e4 52
giovannivisentini 4:eaf6c49a86e4 53 /**
giovannivisentini 4:eaf6c49a86e4 54 * record type format
giovannivisentini 4:eaf6c49a86e4 55 */
giovannivisentini 4:eaf6c49a86e4 56 typedef enum TypeNameFormat {
giovannivisentini 4:eaf6c49a86e4 57 Empty = 0x00, //!< Empty
giovannivisentini 4:eaf6c49a86e4 58 NFC_well_known = 0x01, //!< NFC_well_known
giovannivisentini 4:eaf6c49a86e4 59 Mime_media_type = 0x02,//!< Mime_media_type
giovannivisentini 4:eaf6c49a86e4 60 Absolute_URI = 0x03, //!< Absolute_URI
giovannivisentini 4:eaf6c49a86e4 61 NFC_external = 0x04, //!< NFC_external
giovannivisentini 4:eaf6c49a86e4 62 Unknown = 0x05, //!< Unknown
giovannivisentini 4:eaf6c49a86e4 63 Unchanged = 0x06, //!< Unchanged
giovannivisentini 4:eaf6c49a86e4 64 Reserved = 0x07 //!< Reserved
giovannivisentini 4:eaf6c49a86e4 65 } TypeNameFormat_t;
giovannivisentini 4:eaf6c49a86e4 66
giovannivisentini 4:eaf6c49a86e4 67
giovannivisentini 4:eaf6c49a86e4 68 RecordHeader() :
giovannivisentini 4:eaf6c49a86e4 69 headerFlags(0), typeLength(0), playloadLength(0) {
giovannivisentini 4:eaf6c49a86e4 70 }
giovannivisentini 4:eaf6c49a86e4 71
giovannivisentini 4:eaf6c49a86e4 72 /**
giovannivisentini 4:eaf6c49a86e4 73 * set the message begin flag
giovannivisentini 4:eaf6c49a86e4 74 * @param value true if the record is the first of the message
giovannivisentini 4:eaf6c49a86e4 75 */
giovannivisentini 4:eaf6c49a86e4 76 void setMB(bool value) {
giovannivisentini 4:eaf6c49a86e4 77 if (value)
giovannivisentini 4:eaf6c49a86e4 78 headerFlags |= 0x80;
giovannivisentini 4:eaf6c49a86e4 79 else
giovannivisentini 4:eaf6c49a86e4 80 headerFlags &= 0x7F;
giovannivisentini 4:eaf6c49a86e4 81 }//setMB
giovannivisentini 4:eaf6c49a86e4 82
giovannivisentini 4:eaf6c49a86e4 83 /**
giovannivisentini 4:eaf6c49a86e4 84 * get the message being flag
giovannivisentini 4:eaf6c49a86e4 85 * @return true if it is the first record in the message
giovannivisentini 4:eaf6c49a86e4 86 */
giovannivisentini 4:eaf6c49a86e4 87 bool getMB() const {
giovannivisentini 4:eaf6c49a86e4 88 return (headerFlags & 0x80) != 0;
giovannivisentini 4:eaf6c49a86e4 89 }//getMB
giovannivisentini 4:eaf6c49a86e4 90
giovannivisentini 4:eaf6c49a86e4 91 /**
giovannivisentini 4:eaf6c49a86e4 92 * set the message end flag
giovannivisentini 4:eaf6c49a86e4 93 * @param value true if it is the last record in the message
giovannivisentini 4:eaf6c49a86e4 94 */
giovannivisentini 4:eaf6c49a86e4 95 void setME(bool value) {
giovannivisentini 4:eaf6c49a86e4 96 if (value)
giovannivisentini 4:eaf6c49a86e4 97 headerFlags |= 0x40;
giovannivisentini 4:eaf6c49a86e4 98 else
giovannivisentini 4:eaf6c49a86e4 99 headerFlags &= 0xBF;
giovannivisentini 4:eaf6c49a86e4 100 }//setME
giovannivisentini 4:eaf6c49a86e4 101
giovannivisentini 4:eaf6c49a86e4 102 /**
giovannivisentini 4:eaf6c49a86e4 103 * get the message end flag
giovannivisentini 4:eaf6c49a86e4 104 * @return true if it is the last record in the message
giovannivisentini 4:eaf6c49a86e4 105 */
giovannivisentini 4:eaf6c49a86e4 106 bool getME() const {
giovannivisentini 4:eaf6c49a86e4 107 return (headerFlags & 0x40) != 0;
giovannivisentini 4:eaf6c49a86e4 108 }//getME
giovannivisentini 4:eaf6c49a86e4 109
giovannivisentini 4:eaf6c49a86e4 110 /**
giovannivisentini 4:eaf6c49a86e4 111 * set the Chunk flag
giovannivisentini 4:eaf6c49a86e4 112 * @param value true if the record is in the first record chunk or a middle record
giovannivisentini 4:eaf6c49a86e4 113 * chunk of a chunked payload
giovannivisentini 4:eaf6c49a86e4 114 */
giovannivisentini 4:eaf6c49a86e4 115 void setCF(bool value) {
giovannivisentini 4:eaf6c49a86e4 116 if (value)
giovannivisentini 4:eaf6c49a86e4 117 headerFlags |= 0x20;
giovannivisentini 4:eaf6c49a86e4 118 else
giovannivisentini 4:eaf6c49a86e4 119 headerFlags &= 0xDF;
giovannivisentini 4:eaf6c49a86e4 120 }//getCF
giovannivisentini 4:eaf6c49a86e4 121
giovannivisentini 4:eaf6c49a86e4 122 /**
giovannivisentini 4:eaf6c49a86e4 123 * get the Chunk flag value
giovannivisentini 4:eaf6c49a86e4 124 * @return true if the record is in the first record chunk or a middle record
giovannivisentini 4:eaf6c49a86e4 125 * chunk of a chunked payload
giovannivisentini 4:eaf6c49a86e4 126 */
giovannivisentini 4:eaf6c49a86e4 127 bool getCF() const {
giovannivisentini 4:eaf6c49a86e4 128 return (headerFlags & 0x20) != 0;
giovannivisentini 4:eaf6c49a86e4 129 }//getCF
giovannivisentini 4:eaf6c49a86e4 130
giovannivisentini 4:eaf6c49a86e4 131 /**
giovannivisentini 4:eaf6c49a86e4 132 * set the short record flag value
giovannivisentini 4:eaf6c49a86e4 133 * @param value true if the record size can be encoded with 8 bits
giovannivisentini 4:eaf6c49a86e4 134 */
giovannivisentini 4:eaf6c49a86e4 135 void setSR(bool value) {
giovannivisentini 4:eaf6c49a86e4 136 if (value)
giovannivisentini 4:eaf6c49a86e4 137 headerFlags |= 0x10;
giovannivisentini 4:eaf6c49a86e4 138 else
giovannivisentini 4:eaf6c49a86e4 139 headerFlags &= 0xCF;
giovannivisentini 4:eaf6c49a86e4 140 }//setSR
giovannivisentini 4:eaf6c49a86e4 141
giovannivisentini 4:eaf6c49a86e4 142 /**
giovannivisentini 4:eaf6c49a86e4 143 * get the Short record flag
giovannivisentini 4:eaf6c49a86e4 144 * @return true if we are using the short range header format
giovannivisentini 4:eaf6c49a86e4 145 */
giovannivisentini 4:eaf6c49a86e4 146 bool getSR() const {
giovannivisentini 4:eaf6c49a86e4 147 return (headerFlags & 0x10) != 0;
giovannivisentini 4:eaf6c49a86e4 148 }//getSR
giovannivisentini 4:eaf6c49a86e4 149
giovannivisentini 4:eaf6c49a86e4 150 /**
giovannivisentini 4:eaf6c49a86e4 151 * set the ID length flag
giovannivisentini 4:eaf6c49a86e4 152 * @param value true if we will use the id length value in the record
giovannivisentini 4:eaf6c49a86e4 153 */
giovannivisentini 4:eaf6c49a86e4 154 void setIL(bool value) {
giovannivisentini 4:eaf6c49a86e4 155 if (value)
giovannivisentini 4:eaf6c49a86e4 156 headerFlags |= 0x08;
giovannivisentini 4:eaf6c49a86e4 157 else
giovannivisentini 4:eaf6c49a86e4 158 headerFlags &= 0xAF;
giovannivisentini 4:eaf6c49a86e4 159 }//setIL
giovannivisentini 4:eaf6c49a86e4 160
giovannivisentini 4:eaf6c49a86e4 161 /**
giovannivisentini 4:eaf6c49a86e4 162 * get the ID length flag
giovannivisentini 4:eaf6c49a86e4 163 * @param value true if we will use the id length value in the record
giovannivisentini 4:eaf6c49a86e4 164 */
giovannivisentini 4:eaf6c49a86e4 165 bool getIL() const {
giovannivisentini 4:eaf6c49a86e4 166 return (headerFlags & 0x08) != 0;
giovannivisentini 4:eaf6c49a86e4 167 }//getIL
giovannivisentini 4:eaf6c49a86e4 168
giovannivisentini 4:eaf6c49a86e4 169 /**
giovannivisentini 4:eaf6c49a86e4 170 * set the type name format field
giovannivisentini 4:eaf6c49a86e4 171 * @param value record type name format
giovannivisentini 4:eaf6c49a86e4 172 */
giovannivisentini 4:eaf6c49a86e4 173 void setFNT(const TypeNameFormat_t value) {
giovannivisentini 4:eaf6c49a86e4 174 uint8_t temp = (uint8_t) value;
giovannivisentini 4:eaf6c49a86e4 175 temp &= 0x07; //keep the first 3 bits
giovannivisentini 4:eaf6c49a86e4 176 headerFlags &= 0xF8; //clean the fist 3 bits
giovannivisentini 4:eaf6c49a86e4 177 headerFlags |= temp; //set the fist 3 bits
giovannivisentini 4:eaf6c49a86e4 178 }//setFNT
giovannivisentini 4:eaf6c49a86e4 179
giovannivisentini 4:eaf6c49a86e4 180 /**
giovannivisentini 4:eaf6c49a86e4 181 * get the record type name
giovannivisentini 4:eaf6c49a86e4 182 * @return type name format of the record
giovannivisentini 4:eaf6c49a86e4 183 */
giovannivisentini 4:eaf6c49a86e4 184 TypeNameFormat_t getFNT() const {
giovannivisentini 4:eaf6c49a86e4 185 return (TypeNameFormat_t) (headerFlags & 0x07);
giovannivisentini 4:eaf6c49a86e4 186 }
giovannivisentini 4:eaf6c49a86e4 187
giovannivisentini 4:eaf6c49a86e4 188 /**
giovannivisentini 4:eaf6c49a86e4 189 * set the record playload length
giovannivisentini 4:eaf6c49a86e4 190 * @par this function will update the SR field as needed
giovannivisentini 4:eaf6c49a86e4 191 * @param length playload length
giovannivisentini 4:eaf6c49a86e4 192 */
giovannivisentini 4:eaf6c49a86e4 193 void setPlayloadLength(uint32_t length) {
giovannivisentini 4:eaf6c49a86e4 194 playloadLength = length;
giovannivisentini 4:eaf6c49a86e4 195 setSR(playloadLength <= 255);
giovannivisentini 4:eaf6c49a86e4 196 }
giovannivisentini 4:eaf6c49a86e4 197
giovannivisentini 4:eaf6c49a86e4 198 /**
giovannivisentini 4:eaf6c49a86e4 199 * get the playload length
giovannivisentini 4:eaf6c49a86e4 200 * @return playload length
giovannivisentini 4:eaf6c49a86e4 201 */
giovannivisentini 4:eaf6c49a86e4 202 uint32_t getPlayloadLength() const {
giovannivisentini 4:eaf6c49a86e4 203 return playloadLength;
giovannivisentini 4:eaf6c49a86e4 204 }
giovannivisentini 4:eaf6c49a86e4 205
giovannivisentini 4:eaf6c49a86e4 206 /**
giovannivisentini 4:eaf6c49a86e4 207 * set the type length
giovannivisentini 4:eaf6c49a86e4 208 * @param size
giovannivisentini 4:eaf6c49a86e4 209 */
giovannivisentini 4:eaf6c49a86e4 210 void setTypeLength(uint8_t size) {
giovannivisentini 4:eaf6c49a86e4 211 typeLength = size;
giovannivisentini 4:eaf6c49a86e4 212 }
giovannivisentini 4:eaf6c49a86e4 213
giovannivisentini 4:eaf6c49a86e4 214 /**
giovannivisentini 4:eaf6c49a86e4 215 * get the type length
giovannivisentini 4:eaf6c49a86e4 216 * @return
giovannivisentini 4:eaf6c49a86e4 217 */
giovannivisentini 4:eaf6c49a86e4 218 uint8_t getTypeLength() const {
giovannivisentini 4:eaf6c49a86e4 219 return typeLength;
giovannivisentini 4:eaf6c49a86e4 220 }
giovannivisentini 4:eaf6c49a86e4 221
giovannivisentini 4:eaf6c49a86e4 222 /**
giovannivisentini 4:eaf6c49a86e4 223 * get the number of byte needed for store this record
giovannivisentini 4:eaf6c49a86e4 224 * @return 3 or 6
giovannivisentini 4:eaf6c49a86e4 225 */
giovannivisentini 4:eaf6c49a86e4 226 uint16_t getRecordLength() const {
giovannivisentini 4:eaf6c49a86e4 227 return (getSR() ? 3 : 6) + typeLength + playloadLength;
giovannivisentini 4:eaf6c49a86e4 228 }
giovannivisentini 4:eaf6c49a86e4 229
giovannivisentini 4:eaf6c49a86e4 230 /**
giovannivisentini 4:eaf6c49a86e4 231 * store the header information in the buffer
giovannivisentini 4:eaf6c49a86e4 232 * @param[out] outBuffer buffer where write the header
giovannivisentini 4:eaf6c49a86e4 233 * @return number of write bytes
giovannivisentini 4:eaf6c49a86e4 234 */
giovannivisentini 4:eaf6c49a86e4 235 uint8_t writeHeader(uint8_t *outBuffer) const {
giovannivisentini 4:eaf6c49a86e4 236
giovannivisentini 4:eaf6c49a86e4 237 uint32_t index = 0;
giovannivisentini 4:eaf6c49a86e4 238
giovannivisentini 4:eaf6c49a86e4 239 outBuffer[index++] = headerFlags;
giovannivisentini 4:eaf6c49a86e4 240 outBuffer[index++] = typeLength;
giovannivisentini 4:eaf6c49a86e4 241 if (getSR()) {
giovannivisentini 4:eaf6c49a86e4 242 outBuffer[index++] = (uint8_t) playloadLength;
giovannivisentini 4:eaf6c49a86e4 243 } else {
giovannivisentini 4:eaf6c49a86e4 244 outBuffer[index++] = (uint8_t) ((playloadLength & 0xFF000000)
giovannivisentini 4:eaf6c49a86e4 245 >> 24);
giovannivisentini 4:eaf6c49a86e4 246 outBuffer[index++] = (uint8_t) ((playloadLength & 0x00FF0000)
giovannivisentini 4:eaf6c49a86e4 247 >> 16);
giovannivisentini 4:eaf6c49a86e4 248 outBuffer[index++] = (uint8_t) ((playloadLength & 0x0000FF00)
giovannivisentini 4:eaf6c49a86e4 249 >> 8);
giovannivisentini 4:eaf6c49a86e4 250 outBuffer[index++] = (uint8_t) (playloadLength & 0x000000FF);
giovannivisentini 4:eaf6c49a86e4 251 } //if-else
giovannivisentini 4:eaf6c49a86e4 252 return index;
giovannivisentini 4:eaf6c49a86e4 253 } //writeHeader
giovannivisentini 4:eaf6c49a86e4 254
giovannivisentini 4:eaf6c49a86e4 255 /**
giovannivisentini 4:eaf6c49a86e4 256 * load an header from a buffer
giovannivisentini 4:eaf6c49a86e4 257 * @param buffer buffer where read the header
giovannivisentini 4:eaf6c49a86e4 258 * @return number of read bytes
giovannivisentini 4:eaf6c49a86e4 259 */
giovannivisentini 4:eaf6c49a86e4 260 uint16_t loadHeader(const uint8_t * const buffer) {
giovannivisentini 4:eaf6c49a86e4 261 uint32_t index = 0;
giovannivisentini 4:eaf6c49a86e4 262 headerFlags = buffer[index++];
giovannivisentini 4:eaf6c49a86e4 263 typeLength = buffer[index++];
giovannivisentini 4:eaf6c49a86e4 264 if (getSR()) {
giovannivisentini 4:eaf6c49a86e4 265 playloadLength = buffer[index++];
giovannivisentini 4:eaf6c49a86e4 266 } else {
giovannivisentini 4:eaf6c49a86e4 267 playloadLength = (((uint32_t) buffer[index + 0]) << 24)
giovannivisentini 4:eaf6c49a86e4 268 | (((uint32_t) buffer[index + 1]) << 16)
giovannivisentini 4:eaf6c49a86e4 269 | (((uint32_t) buffer[index + 2]) << 8)
giovannivisentini 4:eaf6c49a86e4 270 | ((uint32_t) buffer[index + 3]);
giovannivisentini 4:eaf6c49a86e4 271 index += 4;
giovannivisentini 4:eaf6c49a86e4 272 } //if-else
giovannivisentini 4:eaf6c49a86e4 273 return index;
giovannivisentini 4:eaf6c49a86e4 274 } //loadHeader
giovannivisentini 4:eaf6c49a86e4 275
giovannivisentini 4:eaf6c49a86e4 276
giovannivisentini 4:eaf6c49a86e4 277 private:
giovannivisentini 4:eaf6c49a86e4 278 uint8_t headerFlags;
giovannivisentini 4:eaf6c49a86e4 279 uint8_t typeLength;
giovannivisentini 4:eaf6c49a86e4 280 uint32_t playloadLength;
giovannivisentini 4:eaf6c49a86e4 281 };
giovannivisentini 4:eaf6c49a86e4 282
giovannivisentini 4:eaf6c49a86e4 283 } /* namespace NDefLib */
giovannivisentini 4:eaf6c49a86e4 284
giovannivisentini 4:eaf6c49a86e4 285 #endif /* NDEFLIB_RECORDHEADER_H_ */