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:
Mon Feb 01 15:33:26 2016 +0000
Revision:
13:685d95525ec8
Child:
14:3b604972b89f
add sync and async demos

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 13:685d95525ec8 41 static bool buttonPress=false; /// true when the user press the message
giovannivisentini 13:685d95525ec8 42 static 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 13:685d95525ec8 47 /**
giovannivisentini 13:685d95525ec8 48 * Call back called when the user press the button.
giovannivisentini 13:685d95525ec8 49 */
giovannivisentini 13:685d95525ec8 50 static void setButtonPress(){
giovannivisentini 13:685d95525ec8 51 buttonPress=true;
giovannivisentini 13:685d95525ec8 52 }//if buttonPress
giovannivisentini 13:685d95525ec8 53
giovannivisentini 13:685d95525ec8 54 /**
giovannivisentini 13:685d95525ec8 55 * Class with the command chain needed for remove all the read/write password
giovannivisentini 13:685d95525ec8 56 */
giovannivisentini 13:685d95525ec8 57 class RemoveAllPasswordStatusCallback : public Nfc::Callback {
giovannivisentini 13:685d95525ec8 58
giovannivisentini 13:685d95525ec8 59 public:
giovannivisentini 13:685d95525ec8 60
giovannivisentini 13:685d95525ec8 61 RemoveAllPasswordStatusCallback():mIsComamndRunning(false){}
giovannivisentini 13:685d95525ec8 62
giovannivisentini 13:685d95525ec8 63 /**
giovannivisentini 13:685d95525ec8 64 * true when the command chain finish, and the the tag can now be read and write
giovannivisentini 13:685d95525ec8 65 * @return true if the command chain finish
giovannivisentini 13:685d95525ec8 66 */
giovannivisentini 13:685d95525ec8 67 bool isFinish(){
giovannivisentini 13:685d95525ec8 68 return !mIsComamndRunning;
giovannivisentini 13:685d95525ec8 69 }
giovannivisentini 13:685d95525ec8 70
giovannivisentini 13:685d95525ec8 71
giovannivisentini 13:685d95525ec8 72 private:
giovannivisentini 13:685d95525ec8 73 bool mIsComamndRunning; /// false when the command chain finish
giovannivisentini 13:685d95525ec8 74
giovannivisentini 13:685d95525ec8 75 /**
giovannivisentini 13:685d95525ec8 76 * end the command chain and print an error message
giovannivisentini 13:685d95525ec8 77 * @param status error code of the last command
giovannivisentini 13:685d95525ec8 78 */
giovannivisentini 13:685d95525ec8 79 void onError(const NFC_StatusTypeDef status){
giovannivisentini 13:685d95525ec8 80 mIsComamndRunning=false;
giovannivisentini 13:685d95525ec8 81 printf("Error Code: %X \r\n",status);
giovannivisentini 13:685d95525ec8 82 }
giovannivisentini 13:685d95525ec8 83
giovannivisentini 13:685d95525ec8 84 virtual void onSessionOpen(Nfc *tag,NFC_StatusTypeDef status){
giovannivisentini 13:685d95525ec8 85 if(status!=NFC_SUCCESS)
giovannivisentini 13:685d95525ec8 86 return onError(status);
giovannivisentini 13:685d95525ec8 87 mIsComamndRunning=true;
giovannivisentini 13:685d95525ec8 88
giovannivisentini 13:685d95525ec8 89 tag->SelectApplication();
giovannivisentini 13:685d95525ec8 90 }
giovannivisentini 13:685d95525ec8 91
giovannivisentini 13:685d95525ec8 92 virtual void onSelectedApplication(Nfc *tag,NFC_StatusTypeDef status){
giovannivisentini 13:685d95525ec8 93 if(status!=NFC_SUCCESS)
giovannivisentini 13:685d95525ec8 94 return onError(status);
giovannivisentini 13:685d95525ec8 95
giovannivisentini 13:685d95525ec8 96 tag->SelectNDEFfile(0x0001);
giovannivisentini 13:685d95525ec8 97 }
giovannivisentini 13:685d95525ec8 98
giovannivisentini 13:685d95525ec8 99 virtual void onSelectedNDEFFile(Nfc *tag,NFC_StatusTypeDef status){
giovannivisentini 13:685d95525ec8 100 if(status!=NFC_SUCCESS)
giovannivisentini 13:685d95525ec8 101 return onError(status);
giovannivisentini 13:685d95525ec8 102
giovannivisentini 13:685d95525ec8 103 tag->DisableAllPassword(M24SR::DEFAULT_PASSWORD);
giovannivisentini 13:685d95525ec8 104 }
giovannivisentini 13:685d95525ec8 105
giovannivisentini 13:685d95525ec8 106 virtual void onDisableAllPassword(Nfc *tag, NFC_StatusTypeDef status){
giovannivisentini 13:685d95525ec8 107 if(status!=NFC_SUCCESS)
giovannivisentini 13:685d95525ec8 108 return onError(status);
giovannivisentini 13:685d95525ec8 109
giovannivisentini 13:685d95525ec8 110 tag->Deselect();
giovannivisentini 13:685d95525ec8 111 }
giovannivisentini 13:685d95525ec8 112
giovannivisentini 13:685d95525ec8 113 virtual void onDeselect(Nfc *,NFC_StatusTypeDef status){
giovannivisentini 13:685d95525ec8 114 if(status!=NFC_SUCCESS)
giovannivisentini 13:685d95525ec8 115 return onError(status);
giovannivisentini 13:685d95525ec8 116 mIsComamndRunning=false;
giovannivisentini 13:685d95525ec8 117 }
giovannivisentini 13:685d95525ec8 118
giovannivisentini 13:685d95525ec8 119 };
giovannivisentini 13:685d95525ec8 120
giovannivisentini 13:685d95525ec8 121 /**
giovannivisentini 13:685d95525ec8 122 * Chain of call needed for change the tag status between read only and write/read
giovannivisentini 13:685d95525ec8 123 */
giovannivisentini 13:685d95525ec8 124 class ChangeTagStatusCallback : public Nfc::Callback {
giovannivisentini 13:685d95525ec8 125
giovannivisentini 13:685d95525ec8 126 M24SR &mNfcTag; /// object to change
giovannivisentini 13:685d95525ec8 127 DigitalOut& mReadOnlyLed; /// led to switch on when it is in read only mode
giovannivisentini 13:685d95525ec8 128 DigitalOut& mReadWriteWriteLed; /// led to switch on when is in read/write mode
giovannivisentini 13:685d95525ec8 129
giovannivisentini 13:685d95525ec8 130 bool mIsReadOnly; /// current tag status
giovannivisentini 13:685d95525ec8 131 bool mIsComamndRunning; /// true if the chain is running
giovannivisentini 13:685d95525ec8 132
giovannivisentini 13:685d95525ec8 133 public:
giovannivisentini 13:685d95525ec8 134
giovannivisentini 13:685d95525ec8 135 /**
giovannivisentini 13:685d95525ec8 136 * Build a chain of callback needed for change the tag status.
giovannivisentini 13:685d95525ec8 137 * @param nfcTag Tag to change.
giovannivisentini 13:685d95525ec8 138 * @param readLed Led to switch on when in read only mode.
giovannivisentini 13:685d95525ec8 139 * @param writeLed Led to switch on when in read/write mode.
giovannivisentini 13:685d95525ec8 140 */
giovannivisentini 13:685d95525ec8 141 ChangeTagStatusCallback(M24SR &nfcTag, DigitalOut& readLed, DigitalOut& writeLed):
giovannivisentini 13:685d95525ec8 142 mNfcTag(nfcTag),mReadOnlyLed(readLed),mReadWriteWriteLed(writeLed),mIsReadOnly(false),
giovannivisentini 13:685d95525ec8 143 mIsComamndRunning(false){
giovannivisentini 13:685d95525ec8 144 mReadOnlyLed=false;
giovannivisentini 13:685d95525ec8 145 mReadWriteWriteLed=true;
giovannivisentini 13:685d95525ec8 146 }
giovannivisentini 13:685d95525ec8 147
giovannivisentini 13:685d95525ec8 148 /**
giovannivisentini 13:685d95525ec8 149 * Change the tag status
giovannivisentini 13:685d95525ec8 150 */
giovannivisentini 13:685d95525ec8 151 void changeStatus(){
giovannivisentini 13:685d95525ec8 152 mIsReadOnly=!mIsReadOnly;
giovannivisentini 13:685d95525ec8 153 //if it is not running a previous command
giovannivisentini 13:685d95525ec8 154 if(!mIsComamndRunning){
giovannivisentini 13:685d95525ec8 155 mNfcTag.GetSession();
giovannivisentini 13:685d95525ec8 156 }//if
giovannivisentini 13:685d95525ec8 157 }//changeStatus;
giovannivisentini 13:685d95525ec8 158
giovannivisentini 13:685d95525ec8 159 private:
giovannivisentini 13:685d95525ec8 160
giovannivisentini 13:685d95525ec8 161 /**
giovannivisentini 13:685d95525ec8 162 * When an error happen switch on both the led and print the error code.
giovannivisentini 13:685d95525ec8 163 * @param status Error code.
giovannivisentini 13:685d95525ec8 164 */
giovannivisentini 13:685d95525ec8 165 void onError(const NFC_StatusTypeDef status){
giovannivisentini 13:685d95525ec8 166 mIsComamndRunning=false;
giovannivisentini 13:685d95525ec8 167 mReadOnlyLed=true;
giovannivisentini 13:685d95525ec8 168 mReadWriteWriteLed=true;
giovannivisentini 13:685d95525ec8 169 printf("Error %X changing the status\r\n",status);
giovannivisentini 13:685d95525ec8 170 }
giovannivisentini 13:685d95525ec8 171
giovannivisentini 13:685d95525ec8 172 virtual void onSessionOpen(Nfc *,NFC_StatusTypeDef status){
giovannivisentini 13:685d95525ec8 173 if(status!=NFC_SUCCESS)
giovannivisentini 13:685d95525ec8 174 return onError(status);
giovannivisentini 13:685d95525ec8 175 mNfcTag.SelectApplication();
giovannivisentini 13:685d95525ec8 176 }
giovannivisentini 13:685d95525ec8 177
giovannivisentini 13:685d95525ec8 178 virtual void onSelectedApplication(Nfc *,NFC_StatusTypeDef status){
giovannivisentini 13:685d95525ec8 179 if(status!=NFC_SUCCESS)
giovannivisentini 13:685d95525ec8 180 return onError(status);
giovannivisentini 13:685d95525ec8 181 mNfcTag.SelectNDEFfile(0x0001);
giovannivisentini 13:685d95525ec8 182 }
giovannivisentini 13:685d95525ec8 183
giovannivisentini 13:685d95525ec8 184 virtual void onSelectedNDEFFile(Nfc *,NFC_StatusTypeDef status){
giovannivisentini 13:685d95525ec8 185 if(status!=NFC_SUCCESS)
giovannivisentini 13:685d95525ec8 186 return onError(status);
giovannivisentini 13:685d95525ec8 187
giovannivisentini 13:685d95525ec8 188 if(mIsReadOnly){
giovannivisentini 13:685d95525ec8 189 mNfcTag.EnableReadOnly(M24SR::DEFAULT_PASSWORD);
giovannivisentini 13:685d95525ec8 190 }else
giovannivisentini 13:685d95525ec8 191 mNfcTag.DisableReadOnly(M24SR::DEFAULT_PASSWORD);
giovannivisentini 13:685d95525ec8 192 }
giovannivisentini 13:685d95525ec8 193
giovannivisentini 13:685d95525ec8 194
giovannivisentini 13:685d95525ec8 195 virtual void onEnableReadOnly(Nfc *,NFC_StatusTypeDef status){
giovannivisentini 13:685d95525ec8 196 if(status!=NFC_SUCCESS)
giovannivisentini 13:685d95525ec8 197 return onError(status);
giovannivisentini 13:685d95525ec8 198
giovannivisentini 13:685d95525ec8 199 if(!mIsReadOnly) //if in the meantime the status change
giovannivisentini 13:685d95525ec8 200 mNfcTag.DisableReadOnly(M24SR::DEFAULT_PASSWORD);
giovannivisentini 13:685d95525ec8 201 else{
giovannivisentini 13:685d95525ec8 202 mReadOnlyLed=true;
giovannivisentini 13:685d95525ec8 203 mReadWriteWriteLed=false;
giovannivisentini 13:685d95525ec8 204 mNfcTag.Deselect();
giovannivisentini 13:685d95525ec8 205 }
giovannivisentini 13:685d95525ec8 206 }
giovannivisentini 13:685d95525ec8 207
giovannivisentini 13:685d95525ec8 208 virtual void onDisableReadOnly(Nfc *,NFC_StatusTypeDef status){
giovannivisentini 13:685d95525ec8 209 if(status!=NFC_SUCCESS)
giovannivisentini 13:685d95525ec8 210 return onError(status);
giovannivisentini 13:685d95525ec8 211
giovannivisentini 13:685d95525ec8 212 if(mIsReadOnly) //if in the meantime the status change
giovannivisentini 13:685d95525ec8 213 mNfcTag.EnableReadOnly(M24SR::DEFAULT_PASSWORD);
giovannivisentini 13:685d95525ec8 214 else{
giovannivisentini 13:685d95525ec8 215 mReadOnlyLed=false;
giovannivisentini 13:685d95525ec8 216 mReadWriteWriteLed=true;
giovannivisentini 13:685d95525ec8 217 mNfcTag.Deselect();
giovannivisentini 13:685d95525ec8 218 }
giovannivisentini 13:685d95525ec8 219 }
giovannivisentini 13:685d95525ec8 220
giovannivisentini 13:685d95525ec8 221 virtual void onDeselect(Nfc *,NFC_StatusTypeDef status){
giovannivisentini 13:685d95525ec8 222 if(status!=NFC_SUCCESS)
giovannivisentini 13:685d95525ec8 223 return onError(status);
giovannivisentini 13:685d95525ec8 224 mIsComamndRunning=false;
giovannivisentini 13:685d95525ec8 225 }
giovannivisentini 13:685d95525ec8 226 };
giovannivisentini 13:685d95525ec8 227
giovannivisentini 13:685d95525ec8 228 /**
giovannivisentini 13:685d95525ec8 229 * When the user press the button enable/disable the tag write protection.
giovannivisentini 13:685d95525ec8 230 */
giovannivisentini 13:685d95525ec8 231 void sample_lockTagContent() {
giovannivisentini 13:685d95525ec8 232
giovannivisentini 13:685d95525ec8 233 //instance the board with the default parameters
giovannivisentini 13:685d95525ec8 234 I2C i2cChannel(X_NUCLEO_NFC01A1::DEFAULT_SDA_PIN,X_NUCLEO_NFC01A1::DEFAULT_SDL_PIN);
giovannivisentini 13:685d95525ec8 235 X_NUCLEO_NFC01A1 *nfcNucleo = X_NUCLEO_NFC01A1::Instance(i2cChannel,&setNfcEventCallback);
giovannivisentini 13:685d95525ec8 236
giovannivisentini 13:685d95525ec8 237 //when the user press the button set buttonPress to true
giovannivisentini 13:685d95525ec8 238 InterruptIn userButton(USER_BUTTON);
giovannivisentini 13:685d95525ec8 239 userButton.fall(setButtonPress);
giovannivisentini 13:685d95525ec8 240
giovannivisentini 13:685d95525ec8 241 M24SR &nfcTag =nfcNucleo->getM24SR();
giovannivisentini 13:685d95525ec8 242
giovannivisentini 13:685d95525ec8 243 //set async mode
giovannivisentini 13:685d95525ec8 244 if(nfcTag.GetSession()!=NFC_SUCCESS)
giovannivisentini 13:685d95525ec8 245 nfcTag.ManageI2CGPO(I2C_ANSWER_READY);
giovannivisentini 13:685d95525ec8 246
giovannivisentini 13:685d95525ec8 247
giovannivisentini 13:685d95525ec8 248 ChangeTagStatusCallback changeTagStatus(nfcTag,nfcNucleo->getLed2(),nfcNucleo->getLed3());
giovannivisentini 13:685d95525ec8 249 RemoveAllPasswordStatusCallback removeAllPasswordStatusCallback;
giovannivisentini 13:685d95525ec8 250
giovannivisentini 13:685d95525ec8 251 nfcTag.SetCallback(&removeAllPasswordStatusCallback);
giovannivisentini 13:685d95525ec8 252 nfcTag.GetSession();
giovannivisentini 13:685d95525ec8 253 nfcNucleo->getLed1()=true;
giovannivisentini 13:685d95525ec8 254
giovannivisentini 13:685d95525ec8 255 while(true){
giovannivisentini 13:685d95525ec8 256
giovannivisentini 13:685d95525ec8 257 if(buttonPress && removeAllPasswordStatusCallback.isFinish()){
giovannivisentini 13:685d95525ec8 258 buttonPress=false;
giovannivisentini 13:685d95525ec8 259 nfcTag.SetCallback(&changeTagStatus);
giovannivisentini 13:685d95525ec8 260 changeTagStatus.changeStatus();
giovannivisentini 13:685d95525ec8 261 }//if
giovannivisentini 13:685d95525ec8 262 if(nfcEvent){
giovannivisentini 13:685d95525ec8 263 nfcEvent=false;
giovannivisentini 13:685d95525ec8 264 nfcTag.ManageEvent();
giovannivisentini 13:685d95525ec8 265 }
giovannivisentini 13:685d95525ec8 266 //wait next event
giovannivisentini 13:685d95525ec8 267 __WFE();
giovannivisentini 13:685d95525ec8 268 }//while
giovannivisentini 13:685d95525ec8 269
giovannivisentini 13:685d95525ec8 270 }//sample_countClick