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 16:38:30 2016 +0000
Revision:
20:aad5727cb8c6
Parent:
19:0b65a5813059
Child:
21:ccc4f3fed4b3
fix reading and password managment

Who changed what in which revision?

UserRevisionLine numberNew contents of line
giovannivisentini 6:96389fb79676 1 /**
giovannivisentini 6:96389fb79676 2 ******************************************************************************
giovannivisentini 6:96389fb79676 3 * @file NdefNfcTagSTM24SR.cpp
giovannivisentini 6:96389fb79676 4 * @author ST Central Labs
giovannivisentini 19:0b65a5813059 5 * @version V1.0.0
giovannivisentini 6:96389fb79676 6 * @date 05 Nov 2015
giovannivisentini 6:96389fb79676 7 * @brief wrapper class for use the NDefLib library for write/read ndef message
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 19:0b65a5813059 37
giovannivisentini 19:0b65a5813059 38 #include <cmath>
giovannivisentini 6:96389fb79676 39
giovannivisentini 6:96389fb79676 40 #include "NDefNfcTagM24SR.h"
giovannivisentini 12:d1f5eaa85deb 41
giovannivisentini 19:0b65a5813059 42
giovannivisentini 6:96389fb79676 43 /* wait 1sec, driver is configured to let 200ms for command to complete */
giovannivisentini 6:96389fb79676 44 /* which is enough for all commands except GetSession if RF session is already opened */
giovannivisentini 9:9f2e2e68d695 45 /* Smartphone generally releases the session within the second, anyway the user can modify this value */
giovannivisentini 6:96389fb79676 46 #define OPENSESSION_NTRIALS 5
giovannivisentini 6:96389fb79676 47
giovannivisentini 6:96389fb79676 48 #define CC_FILE_LENGTH_BYTE 15
giovannivisentini 19:0b65a5813059 49 ////////////////////////////START OpenSessionCallBack/////////////////////////
giovannivisentini 19:0b65a5813059 50 NDefNfcTagM24SR::OpenSessionCallBack::
giovannivisentini 19:0b65a5813059 51 OpenSessionCallBack(NDefNfcTagM24SR& sender):
giovannivisentini 19:0b65a5813059 52 mSender(sender),mNTrials(OPENSESSION_NTRIALS){}
giovannivisentini 19:0b65a5813059 53
giovannivisentini 19:0b65a5813059 54 void NDefNfcTagM24SR::OpenSessionCallBack::onSessionOpen(Nfc *nfc,
giovannivisentini 19:0b65a5813059 55 NFC_StatusTypeDef status){
giovannivisentini 19:0b65a5813059 56 if(status==NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 57 nfc->SelectApplication();
giovannivisentini 19:0b65a5813059 58 }else{
giovannivisentini 19:0b65a5813059 59 mSender.mCallBack->onSessionOpen(&mSender,false);
giovannivisentini 19:0b65a5813059 60 }
giovannivisentini 19:0b65a5813059 61 }
giovannivisentini 19:0b65a5813059 62
giovannivisentini 19:0b65a5813059 63 void NDefNfcTagM24SR::OpenSessionCallBack::onSelectedApplication(Nfc *nfc,
giovannivisentini 19:0b65a5813059 64 NFC_StatusTypeDef status){
giovannivisentini 19:0b65a5813059 65 if(status==NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 66 nfc->SelectCCfile();
giovannivisentini 19:0b65a5813059 67 }else{
giovannivisentini 19:0b65a5813059 68 if(mNTrials==0)
giovannivisentini 19:0b65a5813059 69 mSender.mCallBack->onSessionOpen(&mSender,false);
giovannivisentini 19:0b65a5813059 70 else{
giovannivisentini 19:0b65a5813059 71 mNTrials--;
giovannivisentini 19:0b65a5813059 72 nfc->SelectApplication();
giovannivisentini 19:0b65a5813059 73 }//if-else
giovannivisentini 19:0b65a5813059 74 }//if-else
giovannivisentini 19:0b65a5813059 75 }
giovannivisentini 19:0b65a5813059 76
giovannivisentini 19:0b65a5813059 77 void NDefNfcTagM24SR::OpenSessionCallBack::onSelectedCCFile(Nfc *nfc,
giovannivisentini 19:0b65a5813059 78 NFC_StatusTypeDef status){
giovannivisentini 19:0b65a5813059 79 if(status==NFC_SUCCESS){
giovannivisentini 19:0b65a5813059 80 nfc->ReadBinary(0x0000, CC_FILE_LENGTH_BYTE, CCFile);
giovannivisentini 19:0b65a5813059 81 }else{
giovannivisentini 19:0b65a5813059 82 mSender.mCallBack->onSessionOpen(&mSender,false);
giovannivisentini 19:0b65a5813059 83 }
giovannivisentini 19:0b65a5813059 84 }
giovannivisentini 19:0b65a5813059 85
giovannivisentini 19:0b65a5813059 86 void NDefNfcTagM24SR::OpenSessionCallBack::onReadByte(Nfc *nfc,
giovannivisentini 19:0b65a5813059 87 NFC_StatusTypeDef status,uint16_t offset,uint8_t *readByte, uint16_t nReadByte){
giovannivisentini 19:0b65a5813059 88 (void)offset;
giovannivisentini 19:0b65a5813059 89 if(status!=NFC_SUCCESS || nReadByte!=CC_FILE_LENGTH_BYTE){
giovannivisentini 19:0b65a5813059 90 return mSender.mCallBack->onSessionOpen(&mSender,false);
giovannivisentini 19:0b65a5813059 91 }//else
giovannivisentini 19:0b65a5813059 92 uint16_t NDefFileId = (uint16_t) ((readByte[0x09] << 8) | readByte[0x0A]);
giovannivisentini 19:0b65a5813059 93 mSender.mMaxReadBytes = (uint16_t) ((readByte[0x03] << 8) | readByte[0x04]);
giovannivisentini 19:0b65a5813059 94 mSender.mMaxWriteBytes = (uint16_t) ((readByte[0x05] << 8) | readByte[0x06]);
giovannivisentini 19:0b65a5813059 95 nfc->SelectNDEFfile(NDefFileId);
giovannivisentini 19:0b65a5813059 96 }
giovannivisentini 19:0b65a5813059 97
giovannivisentini 19:0b65a5813059 98 void NDefNfcTagM24SR::OpenSessionCallBack::onSelectedNDEFFile(Nfc *nfc,
giovannivisentini 19:0b65a5813059 99 NFC_StatusTypeDef status){
giovannivisentini 19:0b65a5813059 100 (void)nfc;
giovannivisentini 19:0b65a5813059 101 mSender.mIsSessionOpen = status==NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 102 mSender.mCallBack->onSessionOpen(&mSender,mSender.mIsSessionOpen);
giovannivisentini 19:0b65a5813059 103 }
giovannivisentini 19:0b65a5813059 104 ////////////////////////////END OpenSessionCallBack/////////////////////////
giovannivisentini 6:96389fb79676 105
giovannivisentini 6:96389fb79676 106 bool NDefNfcTagM24SR::openSession(bool force) {
giovannivisentini 6:96389fb79676 107
giovannivisentini 19:0b65a5813059 108 if (isSessionOpen()){
giovannivisentini 19:0b65a5813059 109 mCallBack->onSessionOpen(this,true);
giovannivisentini 6:96389fb79676 110 return true;
giovannivisentini 6:96389fb79676 111 }
giovannivisentini 6:96389fb79676 112
giovannivisentini 19:0b65a5813059 113 mDevice.SetCallBack(&mOpenSessionCallback);
giovannivisentini 19:0b65a5813059 114 if(force)
giovannivisentini 19:0b65a5813059 115 return mDevice.KillSession() == NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 116 else
giovannivisentini 19:0b65a5813059 117 return mDevice.GetSession() == NFC_SUCCESS;
giovannivisentini 6:96389fb79676 118
giovannivisentini 6:96389fb79676 119
giovannivisentini 6:96389fb79676 120 }
giovannivisentini 6:96389fb79676 121
giovannivisentini 6:96389fb79676 122 bool NDefNfcTagM24SR::closeSession() {
giovannivisentini 19:0b65a5813059 123 mDevice.SetCallBack(&mCloseSessionCallback);
giovannivisentini 19:0b65a5813059 124 return mDevice.Deselect() == NFC_SUCCESS;
giovannivisentini 6:96389fb79676 125 }
giovannivisentini 6:96389fb79676 126
giovannivisentini 19:0b65a5813059 127 void NDefNfcTagM24SR::WriteByteCallback::onUpdatedBinary(Nfc *nfc,
giovannivisentini 19:0b65a5813059 128 NFC_StatusTypeDef status,uint16_t startOffset, uint8_t *writeByte,uint16_t nWriteByte){
giovannivisentini 6:96389fb79676 129
giovannivisentini 19:0b65a5813059 130 if(status!=NFC_SUCCESS){ // error -> finish to write
giovannivisentini 19:0b65a5813059 131 mCallback(mCallbackParam,false,mByteToWrite,mNByteToWrite);
giovannivisentini 19:0b65a5813059 132 return;
giovannivisentini 19:0b65a5813059 133 }//else
giovannivisentini 6:96389fb79676 134
giovannivisentini 19:0b65a5813059 135 mByteWrote+=nWriteByte;
giovannivisentini 19:0b65a5813059 136 if(mByteWrote==mNByteToWrite){ //write all -> finish
giovannivisentini 19:0b65a5813059 137 mCallback(mCallbackParam,true,mByteToWrite,mNByteToWrite);
giovannivisentini 19:0b65a5813059 138 }else{ //else write another slice
giovannivisentini 19:0b65a5813059 139 uint16_t tempLenght = std::min(mSender.mMaxWriteBytes,
giovannivisentini 19:0b65a5813059 140 (uint16_t)(mNByteToWrite-mByteWrote));
giovannivisentini 19:0b65a5813059 141 nfc->UpdateBinary(startOffset+nWriteByte,tempLenght,writeByte+nWriteByte);
giovannivisentini 19:0b65a5813059 142 }//if-else
giovannivisentini 19:0b65a5813059 143 }
giovannivisentini 19:0b65a5813059 144
giovannivisentini 19:0b65a5813059 145 bool NDefNfcTagM24SR::writeByte(const uint8_t *buffer, uint16_t length,uint16_t offset,
giovannivisentini 19:0b65a5813059 146 byteOperationCallback_t callback,CallbackStatus_t *callbackStatus){
giovannivisentini 19:0b65a5813059 147 if(!isSessionOpen())
giovannivisentini 19:0b65a5813059 148 callback(callbackStatus,false,buffer,length);
giovannivisentini 19:0b65a5813059 149 //else
giovannivisentini 19:0b65a5813059 150 mWriteByteCallback.setTask(buffer,length,callback,callbackStatus);
giovannivisentini 19:0b65a5813059 151 mDevice.SetCallBack(&mWriteByteCallback);
giovannivisentini 6:96389fb79676 152
giovannivisentini 6:96389fb79676 153 if (length > mMaxWriteBytes) {
giovannivisentini 19:0b65a5813059 154 return mDevice.UpdateBinary(offset, mMaxWriteBytes,(uint8_t*) buffer) == NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 155 }else{
giovannivisentini 19:0b65a5813059 156 return mDevice.UpdateBinary(offset,length,(uint8_t*)buffer) == NFC_SUCCESS;
giovannivisentini 19:0b65a5813059 157 }//if-else
giovannivisentini 6:96389fb79676 158
giovannivisentini 6:96389fb79676 159 }
giovannivisentini 6:96389fb79676 160
giovannivisentini 19:0b65a5813059 161 void NDefNfcTagM24SR::ReadByteCallback::onReadByte(Nfc *nfc,
giovannivisentini 19:0b65a5813059 162 NFC_StatusTypeDef status,uint16_t startOffset, uint8_t *readBffer,uint16_t nReadByte){
giovannivisentini 19:0b65a5813059 163
giovannivisentini 19:0b65a5813059 164 if(status!=NFC_SUCCESS){ // error -> finish to write
giovannivisentini 19:0b65a5813059 165 mCallback(mCallbackParam,false,mBuffer,mNByteToRead);
giovannivisentini 19:0b65a5813059 166 return;
giovannivisentini 19:0b65a5813059 167 }//else
giovannivisentini 6:96389fb79676 168
giovannivisentini 19:0b65a5813059 169 mByteRead += nReadByte;
giovannivisentini 19:0b65a5813059 170 if(mByteRead==mNByteToRead){ //read all -> finish
giovannivisentini 19:0b65a5813059 171 mCallback(mCallbackParam,true,mBuffer,mNByteToRead);
giovannivisentini 19:0b65a5813059 172 }else{ //else write another slice
giovannivisentini 19:0b65a5813059 173 uint16_t tempLenght = std::min(mSender.mMaxReadBytes,
giovannivisentini 19:0b65a5813059 174 (uint16_t)(mNByteToRead-mByteRead));
giovannivisentini 19:0b65a5813059 175 nfc->ReadBinary(startOffset+nReadByte,tempLenght,readBffer+nReadByte);
giovannivisentini 19:0b65a5813059 176 }//if-else
giovannivisentini 19:0b65a5813059 177
giovannivisentini 6:96389fb79676 178 }
giovannivisentini 6:96389fb79676 179
giovannivisentini 19:0b65a5813059 180 bool NDefNfcTagM24SR::readByte(const uint16_t byteOffset, const uint16_t length,
giovannivisentini 19:0b65a5813059 181 uint8_t *buffer, byteOperationCallback_t callback,CallbackStatus_t *callbackStatus){
giovannivisentini 19:0b65a5813059 182 if(!isSessionOpen()){
giovannivisentini 19:0b65a5813059 183 return callback(callbackStatus,false,buffer,length);
giovannivisentini 19:0b65a5813059 184 }
giovannivisentini 19:0b65a5813059 185 //else
giovannivisentini 19:0b65a5813059 186 mReadByteCallback.setTask(buffer,length,callback,callbackStatus);
giovannivisentini 19:0b65a5813059 187 mDevice.SetCallBack(&mReadByteCallback);
giovannivisentini 19:0b65a5813059 188
giovannivisentini 19:0b65a5813059 189 if (length > mMaxReadBytes) {
giovannivisentini 19:0b65a5813059 190 return mDevice.ReadBinary(byteOffset, mMaxReadBytes,buffer)== NFC_SUCCESS;;
giovannivisentini 19:0b65a5813059 191 }else{
giovannivisentini 19:0b65a5813059 192 return mDevice.ReadBinary(byteOffset,length,buffer)== NFC_SUCCESS;;
giovannivisentini 19:0b65a5813059 193 }//if-else
giovannivisentini 19:0b65a5813059 194
giovannivisentini 19:0b65a5813059 195 }