Firmware library for the X-NUCLEO-NFC01A1 Dynamic NFC Tag board.

Dependencies:   M24SR

Dependents:   NFC M2M_2016_STM32 MyongjiElec_capstone1 IDW01M1_Cloud_IBM ... more

Fork of X_NUCLEO_NFC01A1 by ST Expansion SW Team

X-NUCLEO-NFC01A1 Dynamic NFC Tag Expansion Board Firmware Package

Introduction

This firmware package includes Components Device Drivers, Board Support Package and example applications for STMicroelectronics X-NUCLEO-NFC01A1 Dynamic NFC Tag Expansion Board based on M24SR.

Firmware Library

Class X_NUCLEO_NFC01A1 is intended to represent the Dynamic NFC Tag Expansion Board with the same name.
It provides an API to access to the M24SR component and to the three onboard LEDs.
It is intentionally implemented as a singleton because only one X_NUCLEO_NFC01A1 at a time might be deployed in a HW component stack.
The library also provides an implementation of the NDEF library API for M24SR, providing an simple way to read/write NDEF formatted messages from/to the M24SR dynamic NFC tag.

Example applications

1. Hello World
2. Asynchronous Hello World

Committer:
giovannivisentini
Date:
Thu Jan 28 14:01:18 2016 +0000
Revision:
19:0b65a5813059
Parent:
12:d1f5eaa85deb
Child:
23:d07138541feb
add async api

Who changed what in which revision?

UserRevisionLine numberNew contents of line
giovannivisentini 6:96389fb79676 1 /**
giovannivisentini 6:96389fb79676 2 ******************************************************************************
giovannivisentini 6:96389fb79676 3 * @file Type4NfcTagM24SR.h
giovannivisentini 6:96389fb79676 4 * @author ST Central Labs
giovannivisentini 9:9f2e2e68d695 5 * @version V1.0.0
giovannivisentini 6:96389fb79676 6 * @date 05 Nov 2015
giovannivisentini 9:9f2e2e68d695 7 * @brief M24SR specific NDefLib derived class
giovannivisentini 6:96389fb79676 8 ******************************************************************************
giovannivisentini 9:9f2e2e68d695 9 * @attention
giovannivisentini 6:96389fb79676 10 *
giovannivisentini 9:9f2e2e68d695 11 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
giovannivisentini 6:96389fb79676 12 *
giovannivisentini 6:96389fb79676 13 * Redistribution and use in source and binary forms, with or without modification,
giovannivisentini 6:96389fb79676 14 * are permitted provided that the following conditions are met:
giovannivisentini 6:96389fb79676 15 * 1. Redistributions of source code must retain the above copyright notice,
giovannivisentini 6:96389fb79676 16 * this list of conditions and the following disclaimer.
giovannivisentini 6:96389fb79676 17 * 2. Redistributions in binary form must reproduce the above copyright notice,
giovannivisentini 6:96389fb79676 18 * this list of conditions and the following disclaimer in the documentation
giovannivisentini 6:96389fb79676 19 * and/or other materials provided with the distribution.
giovannivisentini 6:96389fb79676 20 * 3. Neither the name of STMicroelectronics nor the names of its contributors
giovannivisentini 6:96389fb79676 21 * may be used to endorse or promote products derived from this software
giovannivisentini 6:96389fb79676 22 * without specific prior written permission.
giovannivisentini 6:96389fb79676 23 *
giovannivisentini 6:96389fb79676 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
giovannivisentini 6:96389fb79676 25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
giovannivisentini 6:96389fb79676 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
giovannivisentini 6:96389fb79676 27 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
giovannivisentini 6:96389fb79676 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
giovannivisentini 6:96389fb79676 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
giovannivisentini 6:96389fb79676 30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
giovannivisentini 6:96389fb79676 31 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
giovannivisentini 6:96389fb79676 32 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
giovannivisentini 6:96389fb79676 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
giovannivisentini 6:96389fb79676 34 *
giovannivisentini 6:96389fb79676 35 ******************************************************************************
giovannivisentini 6:96389fb79676 36 */
giovannivisentini 6:96389fb79676 37
giovannivisentini 19:0b65a5813059 38 #ifndef X_NUCLEO_NFC01A1_M24SR_NDEFNFCTAGM24SR_H_
giovannivisentini 19:0b65a5813059 39 #define X_NUCLEO_NFC01A1_M24SR_NDEFNFCTAGM24SR_H_
giovannivisentini 19:0b65a5813059 40
giovannivisentini 19:0b65a5813059 41 #include <cstdlib>
giovannivisentini 6:96389fb79676 42 #include <stdint.h>
giovannivisentini 6:96389fb79676 43
giovannivisentini 6:96389fb79676 44 #include "NDefLib/NDefNfcTag.h"
giovannivisentini 6:96389fb79676 45
giovannivisentini 12:d1f5eaa85deb 46 #include "Nfc_class.h"
giovannivisentini 6:96389fb79676 47
giovannivisentini 6:96389fb79676 48 /**
giovannivisentini 19:0b65a5813059 49 * Helper class to use the NDefLib
giovannivisentini 19:0b65a5813059 50 */
giovannivisentini 6:96389fb79676 51 class NDefNfcTagM24SR: public NDefLib::NDefNfcTag {
giovannivisentini 6:96389fb79676 52
giovannivisentini 6:96389fb79676 53 public:
giovannivisentini 19:0b65a5813059 54
giovannivisentini 6:96389fb79676 55 /**
giovannivisentini 19:0b65a5813059 56 *
giovannivisentini 19:0b65a5813059 57 * @param device device to use
giovannivisentini 6:96389fb79676 58 */
giovannivisentini 12:d1f5eaa85deb 59 NDefNfcTagM24SR(Nfc &device) :
giovannivisentini 19:0b65a5813059 60 NDefLib::NDefNfcTag(),
giovannivisentini 19:0b65a5813059 61 mDevice(device),mIsSessionOpen(false),
giovannivisentini 19:0b65a5813059 62 mMaxReadBytes(0xFF), mMaxWriteBytes(0xFF),
giovannivisentini 19:0b65a5813059 63 mOpenSessionCallback(*this),
giovannivisentini 19:0b65a5813059 64 mCloseSessionCallback(*this),
giovannivisentini 19:0b65a5813059 65 mWriteByteCallback(*this),
giovannivisentini 19:0b65a5813059 66 mReadByteCallback(*this){}
giovannivisentini 19:0b65a5813059 67
giovannivisentini 19:0b65a5813059 68 virtual bool openSession(bool force = false);
giovannivisentini 19:0b65a5813059 69
giovannivisentini 19:0b65a5813059 70 virtual bool closeSession();
giovannivisentini 19:0b65a5813059 71
giovannivisentini 19:0b65a5813059 72 virtual bool isSessionOpen(){
giovannivisentini 19:0b65a5813059 73 return mIsSessionOpen;
giovannivisentini 6:96389fb79676 74 }
giovannivisentini 6:96389fb79676 75
giovannivisentini 8:5e637c71cbb3 76 /**
giovannivisentini 19:0b65a5813059 77 * Close the open session.
giovannivisentini 19:0b65a5813059 78 */
giovannivisentini 19:0b65a5813059 79 virtual ~NDefNfcTagM24SR(){
giovannivisentini 6:96389fb79676 80 if(isSessionOpen())
giovannivisentini 6:96389fb79676 81 closeSession();
giovannivisentini 19:0b65a5813059 82 }//~NDefNfcTagM24SR
giovannivisentini 19:0b65a5813059 83
giovannivisentini 19:0b65a5813059 84 protected:
giovannivisentini 19:0b65a5813059 85
giovannivisentini 19:0b65a5813059 86 virtual bool writeByte(const uint8_t *buffer, uint16_t length,uint16_t offset,
giovannivisentini 19:0b65a5813059 87 byteOperationCallback_t callback,CallbackStatus_t *callbackStatus);
giovannivisentini 19:0b65a5813059 88
giovannivisentini 19:0b65a5813059 89 virtual bool readByte(const uint16_t byteOffset, const uint16_t byteLength,
giovannivisentini 19:0b65a5813059 90 uint8_t *buffer, byteOperationCallback_t callback,CallbackStatus_t *callbackStatus);
giovannivisentini 19:0b65a5813059 91
giovannivisentini 19:0b65a5813059 92 private:
giovannivisentini 19:0b65a5813059 93
giovannivisentini 19:0b65a5813059 94 Nfc &mDevice;
giovannivisentini 19:0b65a5813059 95
giovannivisentini 19:0b65a5813059 96 /**
giovannivisentini 19:0b65a5813059 97 * true if the session is open
giovannivisentini 19:0b65a5813059 98 */
giovannivisentini 19:0b65a5813059 99 bool mIsSessionOpen;
giovannivisentini 19:0b65a5813059 100
giovannivisentini 19:0b65a5813059 101 /**
giovannivisentini 19:0b65a5813059 102 * Max length for a read operation
giovannivisentini 19:0b65a5813059 103 */
giovannivisentini 19:0b65a5813059 104 uint16_t mMaxReadBytes;
giovannivisentini 19:0b65a5813059 105
giovannivisentini 19:0b65a5813059 106 /**
giovannivisentini 19:0b65a5813059 107 * Max length for a write operation
giovannivisentini 19:0b65a5813059 108 */
giovannivisentini 19:0b65a5813059 109 uint16_t mMaxWriteBytes;
giovannivisentini 19:0b65a5813059 110
giovannivisentini 19:0b65a5813059 111 /**
giovannivisentini 19:0b65a5813059 112 * Class containing the callback needed to open a session and read the max
giovannivisentini 19:0b65a5813059 113 * read/write size
giovannivisentini 19:0b65a5813059 114 */
giovannivisentini 19:0b65a5813059 115 class OpenSessionCallBack: public Nfc::Callback{
giovannivisentini 19:0b65a5813059 116 public:
giovannivisentini 19:0b65a5813059 117 OpenSessionCallBack(NDefNfcTagM24SR &sender);
giovannivisentini 19:0b65a5813059 118 virtual void onSessionOpen(Nfc *nfc,NFC_StatusTypeDef status);
giovannivisentini 19:0b65a5813059 119 virtual void onSelectedApplication(Nfc *nfc,NFC_StatusTypeDef status);
giovannivisentini 19:0b65a5813059 120 virtual void onSelectedCCFile(Nfc *nfc,NFC_StatusTypeDef status);
giovannivisentini 19:0b65a5813059 121 virtual void onReadByte(Nfc *nfc,NFC_StatusTypeDef status,uint16_t offset,
giovannivisentini 19:0b65a5813059 122 uint8_t *readByte, uint16_t nReadByte);
giovannivisentini 19:0b65a5813059 123 virtual void onSelectedNDEFFile(Nfc *nfc,NFC_StatusTypeDef status);
giovannivisentini 6:96389fb79676 124
giovannivisentini 19:0b65a5813059 125 private:
giovannivisentini 19:0b65a5813059 126 NDefNfcTagM24SR &mSender;
giovannivisentini 19:0b65a5813059 127 uint32_t mNTrials;
giovannivisentini 19:0b65a5813059 128 uint8_t CCFile[15];
giovannivisentini 19:0b65a5813059 129 };
giovannivisentini 19:0b65a5813059 130
giovannivisentini 19:0b65a5813059 131 OpenSessionCallBack mOpenSessionCallback;
giovannivisentini 19:0b65a5813059 132
giovannivisentini 19:0b65a5813059 133 /**
giovannivisentini 19:0b65a5813059 134 * Class containing the callback needed to close a session
giovannivisentini 19:0b65a5813059 135 */
giovannivisentini 19:0b65a5813059 136 class CloseSessionCallBack : public Nfc::Callback{
giovannivisentini 19:0b65a5813059 137 public:
giovannivisentini 19:0b65a5813059 138 CloseSessionCallBack(NDefNfcTagM24SR &sender):
giovannivisentini 19:0b65a5813059 139 mSender(sender){}
giovannivisentini 19:0b65a5813059 140
giovannivisentini 19:0b65a5813059 141 virtual void onDeselect(Nfc *nfc,NFC_StatusTypeDef status){
giovannivisentini 19:0b65a5813059 142 (void)nfc;
giovannivisentini 19:0b65a5813059 143 if(status==NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 144 mSender.mIsSessionOpen=false;
giovannivisentini 19:0b65a5813059 145 mSender.mCallBack->onSessionClose(&mSender,true);
giovannivisentini 19:0b65a5813059 146 }else{
giovannivisentini 19:0b65a5813059 147 mSender.mCallBack->onSessionClose(&mSender,false);
giovannivisentini 19:0b65a5813059 148 }//if-else
giovannivisentini 19:0b65a5813059 149 }
giovannivisentini 19:0b65a5813059 150 private:
giovannivisentini 19:0b65a5813059 151 NDefNfcTagM24SR &mSender;
giovannivisentini 19:0b65a5813059 152 };
giovannivisentini 19:0b65a5813059 153
giovannivisentini 19:0b65a5813059 154 CloseSessionCallBack mCloseSessionCallback;
giovannivisentini 19:0b65a5813059 155
giovannivisentini 19:0b65a5813059 156 /**
giovannivisentini 19:0b65a5813059 157 * Class containing the callback needed to write a buffer
giovannivisentini 19:0b65a5813059 158 */
giovannivisentini 19:0b65a5813059 159 class WriteByteCallback : public Nfc::Callback{
giovannivisentini 19:0b65a5813059 160 public:
giovannivisentini 19:0b65a5813059 161
giovannivisentini 19:0b65a5813059 162 /**
giovannivisentini 19:0b65a5813059 163 *
giovannivisentini 19:0b65a5813059 164 * @param sender tag where write the buffer
giovannivisentini 19:0b65a5813059 165 */
giovannivisentini 19:0b65a5813059 166 WriteByteCallback(NDefNfcTagM24SR &sender):
giovannivisentini 19:0b65a5813059 167 mByteToWrite(NULL),
giovannivisentini 19:0b65a5813059 168 mNByteToWrite(0),
giovannivisentini 19:0b65a5813059 169 mByteWrote(0),
giovannivisentini 19:0b65a5813059 170 mCallback(NULL),
giovannivisentini 19:0b65a5813059 171 mCallbackParam(NULL),
giovannivisentini 19:0b65a5813059 172 mSender(sender){}
giovannivisentini 6:96389fb79676 173
giovannivisentini 19:0b65a5813059 174 /**
giovannivisentini 19:0b65a5813059 175 * Set the buffer to write and the function to call when finish
giovannivisentini 19:0b65a5813059 176 * @param buffer buffer to write
giovannivisentini 19:0b65a5813059 177 * @param nByte number of bytes to write
giovannivisentini 19:0b65a5813059 178 * @param callback function to call when the write ends
giovannivisentini 19:0b65a5813059 179 * @param param parameter to pass to the callback function
giovannivisentini 19:0b65a5813059 180 */
giovannivisentini 19:0b65a5813059 181 void setTask(const uint8_t *buffer,uint16_t nByte,
giovannivisentini 19:0b65a5813059 182 byteOperationCallback_t callback,CallbackStatus_t *param){
giovannivisentini 19:0b65a5813059 183 mByteToWrite=buffer;
giovannivisentini 19:0b65a5813059 184 mNByteToWrite=nByte;
giovannivisentini 19:0b65a5813059 185 mByteWrote=0;
giovannivisentini 19:0b65a5813059 186 mCallback = callback;
giovannivisentini 19:0b65a5813059 187 mCallbackParam = param;
giovannivisentini 19:0b65a5813059 188 }
giovannivisentini 19:0b65a5813059 189
giovannivisentini 19:0b65a5813059 190 virtual void onUpdatedBinary(Nfc *nfc,NFC_StatusTypeDef status,
giovannivisentini 19:0b65a5813059 191 uint16_t startOffset,uint8_t *writeByte,uint16_t nWriteByte);
giovannivisentini 19:0b65a5813059 192
giovannivisentini 19:0b65a5813059 193
giovannivisentini 19:0b65a5813059 194 private:
giovannivisentini 19:0b65a5813059 195 /** buffer to write */
giovannivisentini 19:0b65a5813059 196 const uint8_t *mByteToWrite;
giovannivisentini 19:0b65a5813059 197 /** length of the buffer */
giovannivisentini 19:0b65a5813059 198 uint16_t mNByteToWrite;
giovannivisentini 19:0b65a5813059 199 /** number of byte already wrote */
giovannivisentini 19:0b65a5813059 200 uint16_t mByteWrote;
giovannivisentini 19:0b65a5813059 201
giovannivisentini 19:0b65a5813059 202 /** function to call when all the bytes are write */
giovannivisentini 19:0b65a5813059 203 byteOperationCallback_t mCallback;
giovannivisentini 19:0b65a5813059 204 /** parameter to pass to the callback function*/
giovannivisentini 19:0b65a5813059 205 CallbackStatus_t* mCallbackParam;
giovannivisentini 19:0b65a5813059 206
giovannivisentini 19:0b65a5813059 207 /** tag where write the buffer*/
giovannivisentini 19:0b65a5813059 208 NDefNfcTagM24SR &mSender;
giovannivisentini 19:0b65a5813059 209 };
giovannivisentini 19:0b65a5813059 210
giovannivisentini 19:0b65a5813059 211 WriteByteCallback mWriteByteCallback;
giovannivisentini 19:0b65a5813059 212
giovannivisentini 19:0b65a5813059 213 /**
giovannivisentini 19:0b65a5813059 214 * Class containing the callback needed to read a buffer
giovannivisentini 19:0b65a5813059 215 */
giovannivisentini 19:0b65a5813059 216 class ReadByteCallback : public Nfc::Callback{
giovannivisentini 19:0b65a5813059 217 public:
giovannivisentini 19:0b65a5813059 218
giovannivisentini 19:0b65a5813059 219 /**
giovannivisentini 19:0b65a5813059 220 *
giovannivisentini 19:0b65a5813059 221 * @param Sender tag where read the buffer
giovannivisentini 19:0b65a5813059 222 */
giovannivisentini 19:0b65a5813059 223 ReadByteCallback(NDefNfcTagM24SR &sender):
giovannivisentini 19:0b65a5813059 224 mBuffer(NULL),
giovannivisentini 19:0b65a5813059 225 mNByteToRead(0),
giovannivisentini 19:0b65a5813059 226 mByteRead(0),
giovannivisentini 19:0b65a5813059 227 mCallback(NULL),
giovannivisentini 19:0b65a5813059 228 mCallbackParam(NULL),
giovannivisentini 19:0b65a5813059 229 mSender(sender){}
giovannivisentini 6:96389fb79676 230
giovannivisentini 19:0b65a5813059 231 /**
giovannivisentini 19:0b65a5813059 232 * Set the buffer where read the data and the function to call when finish
giovannivisentini 19:0b65a5813059 233 * @param buffer Buffer read
giovannivisentini 19:0b65a5813059 234 * @param nByte Number of bytes to read
giovannivisentini 19:0b65a5813059 235 * @param callback Function to call when the read ends
giovannivisentini 19:0b65a5813059 236 * @param param Parameter to pass to the callback function
giovannivisentini 19:0b65a5813059 237 */
giovannivisentini 19:0b65a5813059 238 void setTask(uint8_t *buffer,uint16_t nByte,
giovannivisentini 19:0b65a5813059 239 byteOperationCallback_t callback,CallbackStatus_t *param){
giovannivisentini 19:0b65a5813059 240 mBuffer=buffer;
giovannivisentini 19:0b65a5813059 241 mNByteToRead=nByte;
giovannivisentini 19:0b65a5813059 242 mByteRead=0;
giovannivisentini 19:0b65a5813059 243 mCallback = callback;
giovannivisentini 19:0b65a5813059 244 mCallbackParam = param;
giovannivisentini 19:0b65a5813059 245 }
giovannivisentini 6:96389fb79676 246
giovannivisentini 19:0b65a5813059 247 virtual void onReadByte(Nfc *nfc,NFC_StatusTypeDef status,
giovannivisentini 19:0b65a5813059 248 uint16_t offset,uint8_t *readByte, uint16_t nReadByte);
giovannivisentini 19:0b65a5813059 249
giovannivisentini 19:0b65a5813059 250
giovannivisentini 19:0b65a5813059 251 private:
giovannivisentini 19:0b65a5813059 252
giovannivisentini 19:0b65a5813059 253 /**
giovannivisentini 19:0b65a5813059 254 * Buffer where read the data
giovannivisentini 19:0b65a5813059 255 */
giovannivisentini 19:0b65a5813059 256 uint8_t *mBuffer;
giovannivisentini 6:96389fb79676 257
giovannivisentini 19:0b65a5813059 258 /**
giovannivisentini 19:0b65a5813059 259 * Number of bytes to read
giovannivisentini 19:0b65a5813059 260 */
giovannivisentini 19:0b65a5813059 261 uint16_t mNByteToRead;
giovannivisentini 19:0b65a5813059 262
giovannivisentini 19:0b65a5813059 263 /**
giovannivisentini 19:0b65a5813059 264 * Number of bytes already read
giovannivisentini 19:0b65a5813059 265 */
giovannivisentini 19:0b65a5813059 266 uint16_t mByteRead;
giovannivisentini 19:0b65a5813059 267
giovannivisentini 19:0b65a5813059 268 /**
giovannivisentini 19:0b65a5813059 269 * Function to call when all the bytes are read
giovannivisentini 19:0b65a5813059 270 */
giovannivisentini 19:0b65a5813059 271 byteOperationCallback_t mCallback;
giovannivisentini 6:96389fb79676 272
giovannivisentini 19:0b65a5813059 273 /**
giovannivisentini 19:0b65a5813059 274 * Parameter to pass to the callback function
giovannivisentini 19:0b65a5813059 275 */
giovannivisentini 19:0b65a5813059 276 CallbackStatus_t* mCallbackParam;
giovannivisentini 19:0b65a5813059 277
giovannivisentini 19:0b65a5813059 278 /**
giovannivisentini 19:0b65a5813059 279 * Tag where the data are read
giovannivisentini 19:0b65a5813059 280 */
giovannivisentini 19:0b65a5813059 281 NDefNfcTagM24SR &mSender;
giovannivisentini 19:0b65a5813059 282 };
giovannivisentini 19:0b65a5813059 283
giovannivisentini 19:0b65a5813059 284 ReadByteCallback mReadByteCallback;
giovannivisentini 19:0b65a5813059 285
giovannivisentini 19:0b65a5813059 286
giovannivisentini 6:96389fb79676 287 };
giovannivisentini 6:96389fb79676 288
giovannivisentini 19:0b65a5813059 289 #endif /* X_NUCLEO_NFC01A1_M24SR_NDEFNFCTAGM24SR_H_ */