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:
Mon Aug 21 12:02:31 2017 +0000
Revision:
21:72c86cbd49be
Parent:
20:31f727872290
change on_message_write callback; the message parameter was unused and it pointed to an invalid object

Who changed what in which revision?

UserRevisionLine numberNew contents of line
giovannivisentini 6:739e3211749d 1 /**
giovannivisentini 6:739e3211749d 2 ******************************************************************************
giovannivisentini 6:739e3211749d 3 * @file Message.h
giovannivisentini 8:473f6e0b03df 4 * @author ST / Central Labs
giovannivisentini 19:13d84b136a62 5 * @version V2.0.0
giovannivisentini 19:13d84b136a62 6 * @date 28 Apr 2017
giovannivisentini 6:739e3211749d 7 * @brief NDef Message 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 0:04b82ae7aa43 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 0:04b82ae7aa43 36 */
giovannivisentini 0:04b82ae7aa43 37
giovannivisentini 0:04b82ae7aa43 38 #ifndef NDEFLIB_MESSAGE_H_
giovannivisentini 0:04b82ae7aa43 39 #define NDEFLIB_MESSAGE_H_
giovannivisentini 0:04b82ae7aa43 40
giovannivisentini 17:46899fa3d9f2 41 #include <algorithm>
giovannivisentini 0:04b82ae7aa43 42 #include <vector>
giovannivisentini 0:04b82ae7aa43 43
giovannivisentini 0:04b82ae7aa43 44 #include "Record.h"
giovannivisentini 0:04b82ae7aa43 45
giovannivisentini 0:04b82ae7aa43 46 namespace NDefLib {
giovannivisentini 0:04b82ae7aa43 47
giovannivisentini 4:eaf6c49a86e4 48 /**
giovannivisentini 12:ed4d9b8d1410 49 * Class containing a list of {@link Record}
giovannivisentini 4:eaf6c49a86e4 50 */
giovannivisentini 0:04b82ae7aa43 51 class Message {
giovannivisentini 0:04b82ae7aa43 52 public:
giovannivisentini 4:eaf6c49a86e4 53
giovannivisentini 4:eaf6c49a86e4 54 /**
giovannivisentini 12:ed4d9b8d1410 55 * Add a ndef record to this message.
giovannivisentini 12:ed4d9b8d1410 56 * @param r Record to add
giovannivisentini 4:eaf6c49a86e4 57 */
giovannivisentini 19:13d84b136a62 58 void add_record(Record *r) {
giovannivisentini 0:04b82ae7aa43 59 mRecords.push_back(r);
giovannivisentini 0:04b82ae7aa43 60 }
giovannivisentini 0:04b82ae7aa43 61
giovannivisentini 4:eaf6c49a86e4 62 /**
giovannivisentini 17:46899fa3d9f2 63 * Remove a ndef record to this message
giovannivisentini 17:46899fa3d9f2 64 * @param r record to remove
giovannivisentini 17:46899fa3d9f2 65 */
giovannivisentini 19:13d84b136a62 66 void remove_record(Record *r){
Davidroid 20:31f727872290 67 mRecords.erase( std::remove( mRecords.begin(), mRecords.end(), r ), mRecords.end() );
giovannivisentini 17:46899fa3d9f2 68 }
giovannivisentini 17:46899fa3d9f2 69
giovannivisentini 17:46899fa3d9f2 70
giovannivisentini 17:46899fa3d9f2 71 /**
giovannivisentini 12:ed4d9b8d1410 72 * Add all the records in the list to this message.
giovannivisentini 12:ed4d9b8d1410 73 * @param addList List of records to add.
giovannivisentini 4:eaf6c49a86e4 74 */
giovannivisentini 19:13d84b136a62 75 void add_records(const std::vector<Record*> &addList) {
giovannivisentini 4:eaf6c49a86e4 76 mRecords.insert(mRecords.end(), addList.begin(), addList.end());
giovannivisentini 1:a0eeb478a45a 77 }
giovannivisentini 1:a0eeb478a45a 78
giovannivisentini 4:eaf6c49a86e4 79 /**
giovannivisentini 12:ed4d9b8d1410 80 * Get the specific record contained by this message, NULL if not a valid index.
giovannivisentini 12:ed4d9b8d1410 81 * @param index Record index.
giovannivisentini 12:ed4d9b8d1410 82 * @return a Record object if present, otherwise NULL
giovannivisentini 4:eaf6c49a86e4 83 */
giovannivisentini 15:01fc5a4b8366 84 Record* operator[](const uint32_t index)const{
Davidroid 20:31f727872290 85 if (index >= mRecords.size()) {
giovannivisentini 1:a0eeb478a45a 86 return NULL;
Davidroid 20:31f727872290 87 }
Davidroid 20:31f727872290 88
giovannivisentini 1:a0eeb478a45a 89 return mRecords[index];
giovannivisentini 1:a0eeb478a45a 90 }
giovannivisentini 1:a0eeb478a45a 91
giovannivisentini 4:eaf6c49a86e4 92 /**
giovannivisentini 12:ed4d9b8d1410 93 * Get the number of records in this message.
giovannivisentini 12:ed4d9b8d1410 94 * @return number of records in this message
giovannivisentini 4:eaf6c49a86e4 95 */
giovannivisentini 19:13d84b136a62 96 uint32_t get_N_records() const {
giovannivisentini 1:a0eeb478a45a 97 return mRecords.size();
giovannivisentini 1:a0eeb478a45a 98 }
giovannivisentini 1:a0eeb478a45a 99
giovannivisentini 4:eaf6c49a86e4 100 /**
giovannivisentini 12:ed4d9b8d1410 101 * Length in bytes needed to write this message.
giovannivisentini 12:ed4d9b8d1410 102 * @return number of bytes needed to write this message
giovannivisentini 4:eaf6c49a86e4 103 */
giovannivisentini 19:13d84b136a62 104 uint16_t get_byte_length() const;
giovannivisentini 4:eaf6c49a86e4 105
giovannivisentini 4:eaf6c49a86e4 106 /**
giovannivisentini 12:ed4d9b8d1410 107 * Write message in the provided buffer
giovannivisentini 12:ed4d9b8d1410 108 * @par The first 2 bytes contain the NDEF message length.
giovannivisentini 12:ed4d9b8d1410 109 * @param[out] buffer Buffer the message must be written into.
giovannivisentini 12:ed4d9b8d1410 110 * @return number of bytes written
giovannivisentini 4:eaf6c49a86e4 111 */
giovannivisentini 4:eaf6c49a86e4 112 uint16_t write(uint8_t *buffer) const;
giovannivisentini 0:04b82ae7aa43 113
giovannivisentini 4:eaf6c49a86e4 114 /**
giovannivisentini 12:ed4d9b8d1410 115 * Create a set of records from a raw buffer adding them to a message object.
giovannivisentini 12:ed4d9b8d1410 116 * @par Message buffer must NOT contain the buffer length in the first two bytes.
giovannivisentini 12:ed4d9b8d1410 117 * @param buffer Buffer containing the message record.
giovannivisentini 12:ed4d9b8d1410 118 * @param bufferLength Buffer length.
giovannivisentini 12:ed4d9b8d1410 119 * @param[in,out] Message message that will contain the new records.
giovannivisentini 4:eaf6c49a86e4 120 */
giovannivisentini 19:13d84b136a62 121 static void parse_message(const uint8_t * const buffer,
Davidroid 20:31f727872290 122 const uint16_t bufferLength, Message *message);
giovannivisentini 0:04b82ae7aa43 123
giovannivisentini 17:46899fa3d9f2 124 /**
giovannivisentini 17:46899fa3d9f2 125 * Remove all the recrods from the mesasge and delete it
giovannivisentini 17:46899fa3d9f2 126 * @param msg Message with the records to delete
giovannivisentini 17:46899fa3d9f2 127 */
giovannivisentini 19:13d84b136a62 128 static void remove_and_delete_all_record(Message &msg);
giovannivisentini 17:46899fa3d9f2 129
giovannivisentini 4:eaf6c49a86e4 130 virtual ~Message() {
giovannivisentini 4:eaf6c49a86e4 131 }
giovannivisentini 4:eaf6c49a86e4 132
giovannivisentini 0:04b82ae7aa43 133 private:
giovannivisentini 4:eaf6c49a86e4 134 /**
giovannivisentini 12:ed4d9b8d1410 135 * List of records contained by this message.
giovannivisentini 4:eaf6c49a86e4 136 */
giovannivisentini 0:04b82ae7aa43 137 std::vector<Record*> mRecords;
giovannivisentini 0:04b82ae7aa43 138 };
giovannivisentini 0:04b82ae7aa43 139
giovannivisentini 0:04b82ae7aa43 140 } /* namespace NDefLib */
giovannivisentini 0:04b82ae7aa43 141
giovannivisentini 0:04b82ae7aa43 142 #endif /* NDEFLIB_MESSAGE_H_ */