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:
Fri Sep 30 12:33:20 2016 +0000
Revision:
27:3881985097bb
Parent:
24:9f98eafa2d39
Child:
29:7a2dfd06cb29
use ST_INTERFACES instead of internal Nfc_class.h

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 27:3881985097bb 5 * @version V1.1.0
giovannivisentini 27:3881985097bb 6 * @date 30 Set 2016
giovannivisentini 24:9f98eafa2d39 7 * @brief Wrapper class of the NDefLib library to write/read NDEF messages
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 27:3881985097bb 54 void NDefNfcTagM24SR::OpenSessionCallBack::onSessionOpen(M24SR *nfc,
giovannivisentini 27:3881985097bb 55 M24SR::StatusTypeDef status){
giovannivisentini 27:3881985097bb 56 if(status==M24SR::M24SR_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 27:3881985097bb 63 void NDefNfcTagM24SR::OpenSessionCallBack::onSelectedApplication(M24SR *nfc,
giovannivisentini 27:3881985097bb 64 M24SR::StatusTypeDef status){
giovannivisentini 27:3881985097bb 65 if(status==M24SR::M24SR_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 27:3881985097bb 77 void NDefNfcTagM24SR::OpenSessionCallBack::onSelectedCCFile(M24SR *nfc,
giovannivisentini 27:3881985097bb 78 M24SR::StatusTypeDef status){
giovannivisentini 27:3881985097bb 79 if(status==M24SR::M24SR_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 27:3881985097bb 86 void NDefNfcTagM24SR::OpenSessionCallBack::onReadByte(M24SR *nfc,
giovannivisentini 27:3881985097bb 87 M24SR::StatusTypeDef status,uint16_t offset,uint8_t *readByte, uint16_t nReadByte){
giovannivisentini 19:0b65a5813059 88 (void)offset;
giovannivisentini 27:3881985097bb 89 if(status!=M24SR::M24SR_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 27:3881985097bb 98 void NDefNfcTagM24SR::OpenSessionCallBack::onSelectedNDEFFile(M24SR *nfc,
giovannivisentini 27:3881985097bb 99 M24SR::StatusTypeDef status){
giovannivisentini 19:0b65a5813059 100 (void)nfc;
giovannivisentini 27:3881985097bb 101
giovannivisentini 27:3881985097bb 102 mSender.mIsSessionOpen = status==M24SR::M24SR_SUCCESS;
giovannivisentini 19:0b65a5813059 103 mSender.mCallBack->onSessionOpen(&mSender,mSender.mIsSessionOpen);
giovannivisentini 19:0b65a5813059 104 }
giovannivisentini 19:0b65a5813059 105 ////////////////////////////END OpenSessionCallBack/////////////////////////
giovannivisentini 6:96389fb79676 106
giovannivisentini 6:96389fb79676 107 bool NDefNfcTagM24SR::openSession(bool force) {
giovannivisentini 6:96389fb79676 108
giovannivisentini 19:0b65a5813059 109 if (isSessionOpen()){
giovannivisentini 19:0b65a5813059 110 mCallBack->onSessionOpen(this,true);
giovannivisentini 6:96389fb79676 111 return true;
giovannivisentini 6:96389fb79676 112 }
giovannivisentini 6:96389fb79676 113
giovannivisentini 21:ccc4f3fed4b3 114 mDevice.SetCallback(&mOpenSessionCallback);
giovannivisentini 19:0b65a5813059 115 if(force)
giovannivisentini 27:3881985097bb 116 return mDevice.ForceGetSession() == M24SR::M24SR_SUCCESS;
giovannivisentini 19:0b65a5813059 117 else
giovannivisentini 27:3881985097bb 118 return mDevice.GetSession() == M24SR::M24SR_SUCCESS;
giovannivisentini 6:96389fb79676 119
giovannivisentini 6:96389fb79676 120
giovannivisentini 6:96389fb79676 121 }
giovannivisentini 6:96389fb79676 122
giovannivisentini 6:96389fb79676 123 bool NDefNfcTagM24SR::closeSession() {
giovannivisentini 21:ccc4f3fed4b3 124 mDevice.SetCallback(&mCloseSessionCallback);
giovannivisentini 27:3881985097bb 125 return mDevice.Deselect() == M24SR::M24SR_SUCCESS;
giovannivisentini 6:96389fb79676 126 }
giovannivisentini 6:96389fb79676 127
giovannivisentini 27:3881985097bb 128 void NDefNfcTagM24SR::WriteByteCallback::onUpdatedBinary(M24SR *nfc,
giovannivisentini 27:3881985097bb 129 M24SR::StatusTypeDef status,uint16_t startOffset, uint8_t *writeByte,uint16_t nWriteByte){
giovannivisentini 6:96389fb79676 130
giovannivisentini 27:3881985097bb 131 if(status!=M24SR::M24SR_SUCCESS){ // error -> finish to write
giovannivisentini 19:0b65a5813059 132 mCallback(mCallbackParam,false,mByteToWrite,mNByteToWrite);
giovannivisentini 19:0b65a5813059 133 return;
giovannivisentini 19:0b65a5813059 134 }//else
giovannivisentini 6:96389fb79676 135
giovannivisentini 19:0b65a5813059 136 mByteWrote+=nWriteByte;
giovannivisentini 19:0b65a5813059 137 if(mByteWrote==mNByteToWrite){ //write all -> finish
giovannivisentini 19:0b65a5813059 138 mCallback(mCallbackParam,true,mByteToWrite,mNByteToWrite);
giovannivisentini 19:0b65a5813059 139 }else{ //else write another slice
giovannivisentini 19:0b65a5813059 140 uint16_t tempLenght = std::min(mSender.mMaxWriteBytes,
giovannivisentini 19:0b65a5813059 141 (uint16_t)(mNByteToWrite-mByteWrote));
giovannivisentini 19:0b65a5813059 142 nfc->UpdateBinary(startOffset+nWriteByte,tempLenght,writeByte+nWriteByte);
giovannivisentini 19:0b65a5813059 143 }//if-else
giovannivisentini 19:0b65a5813059 144 }
giovannivisentini 19:0b65a5813059 145
giovannivisentini 19:0b65a5813059 146 bool NDefNfcTagM24SR::writeByte(const uint8_t *buffer, uint16_t length,uint16_t offset,
giovannivisentini 19:0b65a5813059 147 byteOperationCallback_t callback,CallbackStatus_t *callbackStatus){
giovannivisentini 19:0b65a5813059 148 if(!isSessionOpen())
giovannivisentini 19:0b65a5813059 149 callback(callbackStatus,false,buffer,length);
giovannivisentini 19:0b65a5813059 150 //else
giovannivisentini 19:0b65a5813059 151 mWriteByteCallback.setTask(buffer,length,callback,callbackStatus);
giovannivisentini 21:ccc4f3fed4b3 152 mDevice.SetCallback(&mWriteByteCallback);
giovannivisentini 6:96389fb79676 153
giovannivisentini 6:96389fb79676 154 if (length > mMaxWriteBytes) {
giovannivisentini 27:3881985097bb 155 return mDevice.UpdateBinary(offset, mMaxWriteBytes,(uint8_t*) buffer) == M24SR::M24SR_SUCCESS;
giovannivisentini 19:0b65a5813059 156 }else{
giovannivisentini 27:3881985097bb 157 return mDevice.UpdateBinary(offset,length,(uint8_t*)buffer) == M24SR::M24SR_SUCCESS;
giovannivisentini 19:0b65a5813059 158 }//if-else
giovannivisentini 6:96389fb79676 159
giovannivisentini 6:96389fb79676 160 }
giovannivisentini 6:96389fb79676 161
giovannivisentini 27:3881985097bb 162 void NDefNfcTagM24SR::ReadByteCallback::onReadByte(M24SR *nfc,
giovannivisentini 27:3881985097bb 163 M24SR::StatusTypeDef status,uint16_t startOffset, uint8_t *readBffer,uint16_t nReadByte){
giovannivisentini 19:0b65a5813059 164
giovannivisentini 27:3881985097bb 165 if(status!=M24SR::M24SR_SUCCESS){ // error -> finish to write
giovannivisentini 19:0b65a5813059 166 mCallback(mCallbackParam,false,mBuffer,mNByteToRead);
giovannivisentini 19:0b65a5813059 167 return;
giovannivisentini 19:0b65a5813059 168 }//else
giovannivisentini 6:96389fb79676 169
giovannivisentini 19:0b65a5813059 170 mByteRead += nReadByte;
giovannivisentini 19:0b65a5813059 171 if(mByteRead==mNByteToRead){ //read all -> finish
giovannivisentini 19:0b65a5813059 172 mCallback(mCallbackParam,true,mBuffer,mNByteToRead);
giovannivisentini 19:0b65a5813059 173 }else{ //else write another slice
giovannivisentini 19:0b65a5813059 174 uint16_t tempLenght = std::min(mSender.mMaxReadBytes,
giovannivisentini 19:0b65a5813059 175 (uint16_t)(mNByteToRead-mByteRead));
giovannivisentini 19:0b65a5813059 176 nfc->ReadBinary(startOffset+nReadByte,tempLenght,readBffer+nReadByte);
giovannivisentini 19:0b65a5813059 177 }//if-else
giovannivisentini 19:0b65a5813059 178
giovannivisentini 6:96389fb79676 179 }
giovannivisentini 6:96389fb79676 180
giovannivisentini 19:0b65a5813059 181 bool NDefNfcTagM24SR::readByte(const uint16_t byteOffset, const uint16_t length,
giovannivisentini 19:0b65a5813059 182 uint8_t *buffer, byteOperationCallback_t callback,CallbackStatus_t *callbackStatus){
giovannivisentini 19:0b65a5813059 183 if(!isSessionOpen()){
giovannivisentini 19:0b65a5813059 184 return callback(callbackStatus,false,buffer,length);
giovannivisentini 19:0b65a5813059 185 }
giovannivisentini 19:0b65a5813059 186 //else
giovannivisentini 19:0b65a5813059 187 mReadByteCallback.setTask(buffer,length,callback,callbackStatus);
giovannivisentini 21:ccc4f3fed4b3 188 mDevice.SetCallback(&mReadByteCallback);
giovannivisentini 19:0b65a5813059 189
giovannivisentini 19:0b65a5813059 190 if (length > mMaxReadBytes) {
giovannivisentini 27:3881985097bb 191 return mDevice.ReadBinary(byteOffset, mMaxReadBytes,buffer)== M24SR::M24SR_SUCCESS;;
giovannivisentini 19:0b65a5813059 192 }else{
giovannivisentini 27:3881985097bb 193 return mDevice.ReadBinary(byteOffset,length,buffer)== M24SR::M24SR_SUCCESS;;
giovannivisentini 19:0b65a5813059 194 }//if-else
giovannivisentini 19:0b65a5813059 195
giovannivisentini 19:0b65a5813059 196 }