This application provides a set of demos with X-NUCLEO-NFC01A1 expansion board.

Dependencies:   NDefLib X_NUCLEO_NFC01A1 mbed

Fork of X-MBED-NFC1 by Giovanni Visentini

This application provides a set of demos with X-NUCLEO-NFC01A1 expansion board.

The available demos are:

  • SAMPLE_WRITE_URL: write a tag with the ST home page URL
  • SAMPLE_COUNT_CLICK: create a custom tag to count and report the user button clicks.
  • SAMPLE_WRITE_AND_CHANGE_ALL: write a tag with all the supported records and update the tag contents when the user button is pressed.
  • SAMPLE_LOCK_TAG_CONTENT: use the M24SR component API to set the NFC tag as read-only.

To enable the different demos comment/uncomment the SAMPLE_* macros provided in main.cpp .

Committer:
giovannivisentini
Date:
Wed Aug 31 13:06:13 2016 +0000
Revision:
14:3b604972b89f
Parent:
13:685d95525ec8
Child:
15:94c98d2aa235
update libs

Who changed what in which revision?

UserRevisionLine numberNew contents of line
giovannivisentini 13:685d95525ec8 1 /**
giovannivisentini 13:685d95525ec8 2 ******************************************************************************
giovannivisentini 13:685d95525ec8 3 * @file Sample_lockWriteTag.cpp
giovannivisentini 13:685d95525ec8 4 * @author ST / Central Labs
giovannivisentini 13:685d95525ec8 5 * @date 03 Dic 2015
giovannivisentini 13:685d95525ec8 6 * @brief This demo define a lock/unlock the tag content when the user press
giovannivisentini 13:685d95525ec8 7 * the user button
giovannivisentini 13:685d95525ec8 8 ******************************************************************************
giovannivisentini 13:685d95525ec8 9 *
giovannivisentini 13:685d95525ec8 10 * COPYRIGHT(c) 2015 STMicroelectronics
giovannivisentini 13:685d95525ec8 11 *
giovannivisentini 13:685d95525ec8 12 * Redistribution and use in source and binary forms, with or without modification,
giovannivisentini 13:685d95525ec8 13 * are permitted provided that the following conditions are met:
giovannivisentini 13:685d95525ec8 14 * 1. Redistributions of source code must retain the above copyright notice,
giovannivisentini 13:685d95525ec8 15 * this list of conditions and the following disclaimer.
giovannivisentini 13:685d95525ec8 16 * 2. Redistributions in binary form must reproduce the above copyright notice,
giovannivisentini 13:685d95525ec8 17 * this list of conditions and the following disclaimer in the documentation
giovannivisentini 13:685d95525ec8 18 * and/or other materials provided with the distribution.
giovannivisentini 13:685d95525ec8 19 * 3. Neither the name of STMicroelectronics nor the names of its contributors
giovannivisentini 13:685d95525ec8 20 * may be used to endorse or promote products derived from this software
giovannivisentini 13:685d95525ec8 21 * without specific prior written permission.
giovannivisentini 13:685d95525ec8 22 *
giovannivisentini 13:685d95525ec8 23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
giovannivisentini 13:685d95525ec8 24 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
giovannivisentini 13:685d95525ec8 25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
giovannivisentini 13:685d95525ec8 26 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
giovannivisentini 13:685d95525ec8 27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
giovannivisentini 13:685d95525ec8 28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
giovannivisentini 13:685d95525ec8 29 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
giovannivisentini 13:685d95525ec8 30 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
giovannivisentini 13:685d95525ec8 31 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
giovannivisentini 13:685d95525ec8 32 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
giovannivisentini 13:685d95525ec8 33 *
giovannivisentini 13:685d95525ec8 34 ******************************************************************************
giovannivisentini 13:685d95525ec8 35 */
giovannivisentini 13:685d95525ec8 36
giovannivisentini 13:685d95525ec8 37 #include "mbed.h"
giovannivisentini 13:685d95525ec8 38
giovannivisentini 13:685d95525ec8 39 #include "X_NUCLEO_NFC01A1.h"
giovannivisentini 13:685d95525ec8 40
giovannivisentini 14:3b604972b89f 41 static volatile bool buttonPress=false; /// true when the user press the message
giovannivisentini 14:3b604972b89f 42 static volatile bool nfcEvent=false; /// true when the user press the message
giovannivisentini 13:685d95525ec8 43
giovannivisentini 13:685d95525ec8 44 static void setNfcEventCallback(){
giovannivisentini 13:685d95525ec8 45 nfcEvent=true;
giovannivisentini 13:685d95525ec8 46 }//if buttonPress
giovannivisentini 14:3b604972b89f 47
giovannivisentini 13:685d95525ec8 48 /**
giovannivisentini 13:685d95525ec8 49 * Call back called when the user press the button.
giovannivisentini 13:685d95525ec8 50 */
giovannivisentini 13:685d95525ec8 51 static void setButtonPress(){
giovannivisentini 13:685d95525ec8 52 buttonPress=true;
giovannivisentini 13:685d95525ec8 53 }//if buttonPress
giovannivisentini 13:685d95525ec8 54
giovannivisentini 13:685d95525ec8 55 /**
giovannivisentini 14:3b604972b89f 56 * Class with the command chain needed to remove all the read/write password
giovannivisentini 13:685d95525ec8 57 */
giovannivisentini 14:3b604972b89f 58 class RemoveAllPasswordStatusCallback : public Nfc::Callbacks {
giovannivisentini 13:685d95525ec8 59
giovannivisentini 13:685d95525ec8 60 public:
giovannivisentini 13:685d95525ec8 61
giovannivisentini 13:685d95525ec8 62 RemoveAllPasswordStatusCallback():mIsComamndRunning(false){}
giovannivisentini 13:685d95525ec8 63
giovannivisentini 13:685d95525ec8 64 /**
giovannivisentini 14:3b604972b89f 65 * True when the command chain finish, and the tag can now be read and write
giovannivisentini 13:685d95525ec8 66 * @return true if the command chain finish
giovannivisentini 13:685d95525ec8 67 */
giovannivisentini 13:685d95525ec8 68 bool isFinish(){
giovannivisentini 13:685d95525ec8 69 return !mIsComamndRunning;
giovannivisentini 13:685d95525ec8 70 }
giovannivisentini 13:685d95525ec8 71
giovannivisentini 13:685d95525ec8 72
giovannivisentini 13:685d95525ec8 73 private:
giovannivisentini 13:685d95525ec8 74 bool mIsComamndRunning; /// false when the command chain finish
giovannivisentini 13:685d95525ec8 75
giovannivisentini 13:685d95525ec8 76 /**
giovannivisentini 13:685d95525ec8 77 * end the command chain and print an error message
giovannivisentini 13:685d95525ec8 78 * @param status error code of the last command
giovannivisentini 13:685d95525ec8 79 */
giovannivisentini 13:685d95525ec8 80 void onError(const NFC_StatusTypeDef status){
giovannivisentini 13:685d95525ec8 81 mIsComamndRunning=false;
giovannivisentini 13:685d95525ec8 82 printf("Error Code: %X \r\n",status);
giovannivisentini 13:685d95525ec8 83 }
giovannivisentini 13:685d95525ec8 84
giovannivisentini 13:685d95525ec8 85 virtual void onSessionOpen(Nfc *tag,NFC_StatusTypeDef status){
giovannivisentini 13:685d95525ec8 86 if(status!=NFC_SUCCESS)
giovannivisentini 13:685d95525ec8 87 return onError(status);
giovannivisentini 13:685d95525ec8 88 mIsComamndRunning=true;
giovannivisentini 13:685d95525ec8 89
giovannivisentini 13:685d95525ec8 90 tag->SelectApplication();
giovannivisentini 13:685d95525ec8 91 }
giovannivisentini 13:685d95525ec8 92
giovannivisentini 13:685d95525ec8 93 virtual void onSelectedApplication(Nfc *tag,NFC_StatusTypeDef status){
giovannivisentini 13:685d95525ec8 94 if(status!=NFC_SUCCESS)
giovannivisentini 13:685d95525ec8 95 return onError(status);
giovannivisentini 13:685d95525ec8 96
giovannivisentini 13:685d95525ec8 97 tag->SelectNDEFfile(0x0001);
giovannivisentini 13:685d95525ec8 98 }
giovannivisentini 13:685d95525ec8 99
giovannivisentini 13:685d95525ec8 100 virtual void onSelectedNDEFFile(Nfc *tag,NFC_StatusTypeDef status){
giovannivisentini 13:685d95525ec8 101 if(status!=NFC_SUCCESS)
giovannivisentini 13:685d95525ec8 102 return onError(status);
giovannivisentini 13:685d95525ec8 103
giovannivisentini 13:685d95525ec8 104 tag->DisableAllPassword(M24SR::DEFAULT_PASSWORD);
giovannivisentini 13:685d95525ec8 105 }
giovannivisentini 13:685d95525ec8 106
giovannivisentini 13:685d95525ec8 107 virtual void onDisableAllPassword(Nfc *tag, NFC_StatusTypeDef status){
giovannivisentini 13:685d95525ec8 108 if(status!=NFC_SUCCESS)
giovannivisentini 13:685d95525ec8 109 return onError(status);
giovannivisentini 13:685d95525ec8 110
giovannivisentini 13:685d95525ec8 111 tag->Deselect();
giovannivisentini 13:685d95525ec8 112 }
giovannivisentini 13:685d95525ec8 113
giovannivisentini 13:685d95525ec8 114 virtual void onDeselect(Nfc *,NFC_StatusTypeDef status){
giovannivisentini 13:685d95525ec8 115 if(status!=NFC_SUCCESS)
giovannivisentini 13:685d95525ec8 116 return onError(status);
giovannivisentini 13:685d95525ec8 117 mIsComamndRunning=false;
giovannivisentini 13:685d95525ec8 118 }
giovannivisentini 13:685d95525ec8 119
giovannivisentini 13:685d95525ec8 120 };
giovannivisentini 13:685d95525ec8 121
giovannivisentini 13:685d95525ec8 122 /**
giovannivisentini 14:3b604972b89f 123 * Chain of call needed to change the tag status between read only and write/read
giovannivisentini 13:685d95525ec8 124 */
giovannivisentini 14:3b604972b89f 125 class ChangeTagStatusCallback : public Nfc::Callbacks {
giovannivisentini 13:685d95525ec8 126
giovannivisentini 13:685d95525ec8 127 M24SR &mNfcTag; /// object to change
giovannivisentini 13:685d95525ec8 128 DigitalOut& mReadOnlyLed; /// led to switch on when it is in read only mode
giovannivisentini 13:685d95525ec8 129 DigitalOut& mReadWriteWriteLed; /// led to switch on when is in read/write mode
giovannivisentini 13:685d95525ec8 130
giovannivisentini 13:685d95525ec8 131 bool mIsReadOnly; /// current tag status
giovannivisentini 13:685d95525ec8 132 bool mIsComamndRunning; /// true if the chain is running
giovannivisentini 13:685d95525ec8 133
giovannivisentini 13:685d95525ec8 134 public:
giovannivisentini 13:685d95525ec8 135
giovannivisentini 13:685d95525ec8 136 /**
giovannivisentini 14:3b604972b89f 137 * Build a chain of callback needed to change the tag status.
giovannivisentini 13:685d95525ec8 138 * @param nfcTag Tag to change.
giovannivisentini 13:685d95525ec8 139 * @param readLed Led to switch on when in read only mode.
giovannivisentini 13:685d95525ec8 140 * @param writeLed Led to switch on when in read/write mode.
giovannivisentini 13:685d95525ec8 141 */
giovannivisentini 13:685d95525ec8 142 ChangeTagStatusCallback(M24SR &nfcTag, DigitalOut& readLed, DigitalOut& writeLed):
giovannivisentini 13:685d95525ec8 143 mNfcTag(nfcTag),mReadOnlyLed(readLed),mReadWriteWriteLed(writeLed),mIsReadOnly(false),
giovannivisentini 13:685d95525ec8 144 mIsComamndRunning(false){
giovannivisentini 13:685d95525ec8 145 mReadOnlyLed=false;
giovannivisentini 13:685d95525ec8 146 mReadWriteWriteLed=true;
giovannivisentini 13:685d95525ec8 147 }
giovannivisentini 13:685d95525ec8 148
giovannivisentini 13:685d95525ec8 149 /**
giovannivisentini 13:685d95525ec8 150 * Change the tag status
giovannivisentini 13:685d95525ec8 151 */
giovannivisentini 13:685d95525ec8 152 void changeStatus(){
giovannivisentini 13:685d95525ec8 153 mIsReadOnly=!mIsReadOnly;
giovannivisentini 13:685d95525ec8 154 //if it is not running a previous command
giovannivisentini 13:685d95525ec8 155 if(!mIsComamndRunning){
giovannivisentini 13:685d95525ec8 156 mNfcTag.GetSession();
giovannivisentini 13:685d95525ec8 157 }//if
giovannivisentini 13:685d95525ec8 158 }//changeStatus;
giovannivisentini 13:685d95525ec8 159
giovannivisentini 13:685d95525ec8 160 private:
giovannivisentini 13:685d95525ec8 161
giovannivisentini 13:685d95525ec8 162 /**
giovannivisentini 13:685d95525ec8 163 * When an error happen switch on both the led and print the error code.
giovannivisentini 13:685d95525ec8 164 * @param status Error code.
giovannivisentini 13:685d95525ec8 165 */
giovannivisentini 13:685d95525ec8 166 void onError(const NFC_StatusTypeDef status){
giovannivisentini 13:685d95525ec8 167 mIsComamndRunning=false;
giovannivisentini 13:685d95525ec8 168 mReadOnlyLed=true;
giovannivisentini 13:685d95525ec8 169 mReadWriteWriteLed=true;
giovannivisentini 13:685d95525ec8 170 printf("Error %X changing the status\r\n",status);
giovannivisentini 13:685d95525ec8 171 }
giovannivisentini 13:685d95525ec8 172
giovannivisentini 13:685d95525ec8 173 virtual void onSessionOpen(Nfc *,NFC_StatusTypeDef status){
giovannivisentini 13:685d95525ec8 174 if(status!=NFC_SUCCESS)
giovannivisentini 13:685d95525ec8 175 return onError(status);
giovannivisentini 13:685d95525ec8 176 mNfcTag.SelectApplication();
giovannivisentini 13:685d95525ec8 177 }
giovannivisentini 13:685d95525ec8 178
giovannivisentini 13:685d95525ec8 179 virtual void onSelectedApplication(Nfc *,NFC_StatusTypeDef status){
giovannivisentini 13:685d95525ec8 180 if(status!=NFC_SUCCESS)
giovannivisentini 13:685d95525ec8 181 return onError(status);
giovannivisentini 13:685d95525ec8 182 mNfcTag.SelectNDEFfile(0x0001);
giovannivisentini 13:685d95525ec8 183 }
giovannivisentini 13:685d95525ec8 184
giovannivisentini 13:685d95525ec8 185 virtual void onSelectedNDEFFile(Nfc *,NFC_StatusTypeDef status){
giovannivisentini 13:685d95525ec8 186 if(status!=NFC_SUCCESS)
giovannivisentini 13:685d95525ec8 187 return onError(status);
giovannivisentini 13:685d95525ec8 188
giovannivisentini 13:685d95525ec8 189 if(mIsReadOnly){
giovannivisentini 13:685d95525ec8 190 mNfcTag.EnableReadOnly(M24SR::DEFAULT_PASSWORD);
giovannivisentini 13:685d95525ec8 191 }else
giovannivisentini 13:685d95525ec8 192 mNfcTag.DisableReadOnly(M24SR::DEFAULT_PASSWORD);
giovannivisentini 13:685d95525ec8 193 }
giovannivisentini 13:685d95525ec8 194
giovannivisentini 13:685d95525ec8 195
giovannivisentini 13:685d95525ec8 196 virtual void onEnableReadOnly(Nfc *,NFC_StatusTypeDef status){
giovannivisentini 13:685d95525ec8 197 if(status!=NFC_SUCCESS)
giovannivisentini 13:685d95525ec8 198 return onError(status);
giovannivisentini 13:685d95525ec8 199
giovannivisentini 13:685d95525ec8 200 if(!mIsReadOnly) //if in the meantime the status change
giovannivisentini 13:685d95525ec8 201 mNfcTag.DisableReadOnly(M24SR::DEFAULT_PASSWORD);
giovannivisentini 13:685d95525ec8 202 else{
giovannivisentini 13:685d95525ec8 203 mReadOnlyLed=true;
giovannivisentini 13:685d95525ec8 204 mReadWriteWriteLed=false;
giovannivisentini 13:685d95525ec8 205 mNfcTag.Deselect();
giovannivisentini 13:685d95525ec8 206 }
giovannivisentini 13:685d95525ec8 207 }
giovannivisentini 13:685d95525ec8 208
giovannivisentini 13:685d95525ec8 209 virtual void onDisableReadOnly(Nfc *,NFC_StatusTypeDef status){
giovannivisentini 13:685d95525ec8 210 if(status!=NFC_SUCCESS)
giovannivisentini 13:685d95525ec8 211 return onError(status);
giovannivisentini 13:685d95525ec8 212
giovannivisentini 13:685d95525ec8 213 if(mIsReadOnly) //if in the meantime the status change
giovannivisentini 13:685d95525ec8 214 mNfcTag.EnableReadOnly(M24SR::DEFAULT_PASSWORD);
giovannivisentini 13:685d95525ec8 215 else{
giovannivisentini 13:685d95525ec8 216 mReadOnlyLed=false;
giovannivisentini 13:685d95525ec8 217 mReadWriteWriteLed=true;
giovannivisentini 13:685d95525ec8 218 mNfcTag.Deselect();
giovannivisentini 13:685d95525ec8 219 }
giovannivisentini 13:685d95525ec8 220 }
giovannivisentini 13:685d95525ec8 221
giovannivisentini 13:685d95525ec8 222 virtual void onDeselect(Nfc *,NFC_StatusTypeDef status){
giovannivisentini 13:685d95525ec8 223 if(status!=NFC_SUCCESS)
giovannivisentini 13:685d95525ec8 224 return onError(status);
giovannivisentini 13:685d95525ec8 225 mIsComamndRunning=false;
giovannivisentini 13:685d95525ec8 226 }
giovannivisentini 13:685d95525ec8 227 };
giovannivisentini 13:685d95525ec8 228
giovannivisentini 13:685d95525ec8 229 /**
giovannivisentini 13:685d95525ec8 230 * When the user press the button enable/disable the tag write protection.
giovannivisentini 13:685d95525ec8 231 */
giovannivisentini 13:685d95525ec8 232 void sampleAsync_lockTagContent() {
giovannivisentini 13:685d95525ec8 233
giovannivisentini 13:685d95525ec8 234 //instance the board with the default parameters
giovannivisentini 13:685d95525ec8 235 I2C i2cChannel(X_NUCLEO_NFC01A1::DEFAULT_SDA_PIN,X_NUCLEO_NFC01A1::DEFAULT_SDL_PIN);
giovannivisentini 13:685d95525ec8 236 X_NUCLEO_NFC01A1 *nfcNucleo = X_NUCLEO_NFC01A1::Instance(i2cChannel,&setNfcEventCallback);
giovannivisentini 13:685d95525ec8 237
giovannivisentini 13:685d95525ec8 238 //when the user press the button set buttonPress to true
giovannivisentini 13:685d95525ec8 239 InterruptIn userButton(USER_BUTTON);
giovannivisentini 13:685d95525ec8 240 userButton.fall(setButtonPress);
giovannivisentini 13:685d95525ec8 241
giovannivisentini 13:685d95525ec8 242 M24SR &nfcTag =nfcNucleo->getM24SR();
giovannivisentini 13:685d95525ec8 243
giovannivisentini 13:685d95525ec8 244 //set async mode
giovannivisentini 13:685d95525ec8 245 if(nfcTag.GetSession()!=NFC_SUCCESS)
giovannivisentini 13:685d95525ec8 246 nfcTag.ManageI2CGPO(I2C_ANSWER_READY);
giovannivisentini 13:685d95525ec8 247
giovannivisentini 13:685d95525ec8 248
giovannivisentini 13:685d95525ec8 249 ChangeTagStatusCallback changeTagStatus(nfcTag,nfcNucleo->getLed2(),nfcNucleo->getLed3());
giovannivisentini 13:685d95525ec8 250 RemoveAllPasswordStatusCallback removeAllPasswordStatusCallback;
giovannivisentini 13:685d95525ec8 251
giovannivisentini 13:685d95525ec8 252 nfcTag.SetCallback(&removeAllPasswordStatusCallback);
giovannivisentini 13:685d95525ec8 253 nfcTag.GetSession();
giovannivisentini 13:685d95525ec8 254 nfcNucleo->getLed1()=true;
giovannivisentini 13:685d95525ec8 255
giovannivisentini 13:685d95525ec8 256 while(true){
giovannivisentini 13:685d95525ec8 257
giovannivisentini 13:685d95525ec8 258 if(buttonPress && removeAllPasswordStatusCallback.isFinish()){
giovannivisentini 13:685d95525ec8 259 buttonPress=false;
giovannivisentini 13:685d95525ec8 260 nfcTag.SetCallback(&changeTagStatus);
giovannivisentini 13:685d95525ec8 261 changeTagStatus.changeStatus();
giovannivisentini 13:685d95525ec8 262 }//if
giovannivisentini 13:685d95525ec8 263 if(nfcEvent){
giovannivisentini 13:685d95525ec8 264 nfcEvent=false;
giovannivisentini 13:685d95525ec8 265 nfcTag.ManageEvent();
giovannivisentini 13:685d95525ec8 266 }
giovannivisentini 13:685d95525ec8 267 //wait next event
giovannivisentini 13:685d95525ec8 268 __WFE();
giovannivisentini 13:685d95525ec8 269 }//while
giovannivisentini 13:685d95525ec8 270
giovannivisentini 13:685d95525ec8 271 }//sampleAsync_lockTagContent