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 Aug 21 12:12:30 2017 +0000
Revision:
20:ba95e0dc5975
Parent:
18:d596eb3f575f
update NDefLib and mbed libs

Who changed what in which revision?

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