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:
Thu Jul 13 09:41:01 2017 +0000
Revision:
17:d8d3d2088cac
Parent:
15:94c98d2aa235
use the new X-NUCLEO-NFC01A1 api; 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 17:d8d3d2088cac 39 #include "XNucleoNFC01A1.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 17:d8d3d2088cac 44 static void set_nfc_event_callback(){
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 17:d8d3d2088cac 51 static void set_button_press(){
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 17:d8d3d2088cac 58 class RemoveAllPasswordStatusCallback : public M24SR::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 17:d8d3d2088cac 68 bool is_finish(){
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 17:d8d3d2088cac 80 void on_error(const M24SR::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 17:d8d3d2088cac 85 virtual void on_session_open(M24SR *tag,M24SR::StatusTypeDef status){
giovannivisentini 17:d8d3d2088cac 86 if(status!=M24SR::M24SR_SUCCESS)
giovannivisentini 17:d8d3d2088cac 87 return on_error(status);
giovannivisentini 13:685d95525ec8 88 mIsComamndRunning=true;
giovannivisentini 15:94c98d2aa235 89 printf("Session Opened\r\n");
giovannivisentini 17:d8d3d2088cac 90 tag->select_application();
giovannivisentini 13:685d95525ec8 91 }
giovannivisentini 13:685d95525ec8 92
giovannivisentini 17:d8d3d2088cac 93 virtual void on_selected_application(M24SR *tag,M24SR::StatusTypeDef status){
giovannivisentini 17:d8d3d2088cac 94 if(status!=M24SR::M24SR_SUCCESS)
giovannivisentini 17:d8d3d2088cac 95 return on_error(status);
giovannivisentini 15:94c98d2aa235 96
giovannivisentini 15:94c98d2aa235 97 printf("Select application\r\n");
giovannivisentini 17:d8d3d2088cac 98 tag->select_NDEF_file(0x0001);
giovannivisentini 13:685d95525ec8 99 }
giovannivisentini 13:685d95525ec8 100
giovannivisentini 17:d8d3d2088cac 101 virtual void on_selected_NDEF_file(M24SR *tag,M24SR::StatusTypeDef status){
giovannivisentini 17:d8d3d2088cac 102 if(status!=M24SR::M24SR_SUCCESS)
giovannivisentini 17:d8d3d2088cac 103 return on_error(status);
giovannivisentini 13:685d95525ec8 104
giovannivisentini 15:94c98d2aa235 105 printf("Select NDef\r\n");
giovannivisentini 17:d8d3d2088cac 106 tag->disable_all_password(M24SR::DEFAULT_PASSWORD);
giovannivisentini 13:685d95525ec8 107 }
giovannivisentini 13:685d95525ec8 108
giovannivisentini 17:d8d3d2088cac 109 virtual void on_disable_all_password(M24SR *tag, M24SR::StatusTypeDef status){
giovannivisentini 17:d8d3d2088cac 110 if(status!=M24SR::M24SR_SUCCESS)
giovannivisentini 17:d8d3d2088cac 111 return on_error(status);
giovannivisentini 15:94c98d2aa235 112
giovannivisentini 15:94c98d2aa235 113 printf("Disable all Password\r\n");
giovannivisentini 17:d8d3d2088cac 114 tag->deselect();
giovannivisentini 13:685d95525ec8 115 }
giovannivisentini 13:685d95525ec8 116
giovannivisentini 17:d8d3d2088cac 117 virtual void on_deselect(M24SR *,M24SR::StatusTypeDef status){
giovannivisentini 17:d8d3d2088cac 118 if(status!=M24SR::M24SR_SUCCESS)
giovannivisentini 17:d8d3d2088cac 119 return on_error(status);
giovannivisentini 15:94c98d2aa235 120
giovannivisentini 15:94c98d2aa235 121 printf("Close Application\r\n");
giovannivisentini 13:685d95525ec8 122 mIsComamndRunning=false;
giovannivisentini 13:685d95525ec8 123 }
giovannivisentini 13:685d95525ec8 124
giovannivisentini 13:685d95525ec8 125 };
giovannivisentini 13:685d95525ec8 126
giovannivisentini 13:685d95525ec8 127 /**
giovannivisentini 14:3b604972b89f 128 * Chain of call needed to change the tag status between read only and write/read
giovannivisentini 13:685d95525ec8 129 */
giovannivisentini 17:d8d3d2088cac 130 class ChangeTagStatusCallback : public M24SR::Callbacks {
giovannivisentini 13:685d95525ec8 131
giovannivisentini 13:685d95525ec8 132 M24SR &mNfcTag; /// object to change
giovannivisentini 13:685d95525ec8 133 DigitalOut& mReadOnlyLed; /// led to switch on when it is in read only mode
giovannivisentini 13:685d95525ec8 134 DigitalOut& mReadWriteWriteLed; /// led to switch on when is in read/write mode
giovannivisentini 13:685d95525ec8 135
giovannivisentini 13:685d95525ec8 136 bool mIsReadOnly; /// current tag status
giovannivisentini 13:685d95525ec8 137 bool mIsComamndRunning; /// true if the chain is running
giovannivisentini 13:685d95525ec8 138
giovannivisentini 13:685d95525ec8 139 public:
giovannivisentini 13:685d95525ec8 140
giovannivisentini 13:685d95525ec8 141 /**
giovannivisentini 14:3b604972b89f 142 * Build a chain of callback needed to change the tag status.
giovannivisentini 13:685d95525ec8 143 * @param nfcTag Tag to change.
giovannivisentini 13:685d95525ec8 144 * @param readLed Led to switch on when in read only mode.
giovannivisentini 13:685d95525ec8 145 * @param writeLed Led to switch on when in read/write mode.
giovannivisentini 13:685d95525ec8 146 */
giovannivisentini 13:685d95525ec8 147 ChangeTagStatusCallback(M24SR &nfcTag, DigitalOut& readLed, DigitalOut& writeLed):
giovannivisentini 13:685d95525ec8 148 mNfcTag(nfcTag),mReadOnlyLed(readLed),mReadWriteWriteLed(writeLed),mIsReadOnly(false),
giovannivisentini 13:685d95525ec8 149 mIsComamndRunning(false){
giovannivisentini 13:685d95525ec8 150 mReadOnlyLed=false;
giovannivisentini 13:685d95525ec8 151 mReadWriteWriteLed=true;
giovannivisentini 13:685d95525ec8 152 }
giovannivisentini 13:685d95525ec8 153
giovannivisentini 13:685d95525ec8 154 /**
giovannivisentini 13:685d95525ec8 155 * Change the tag status
giovannivisentini 13:685d95525ec8 156 */
giovannivisentini 17:d8d3d2088cac 157 void change_status(){
giovannivisentini 13:685d95525ec8 158 mIsReadOnly=!mIsReadOnly;
giovannivisentini 13:685d95525ec8 159 //if it is not running a previous command
giovannivisentini 13:685d95525ec8 160 if(!mIsComamndRunning){
giovannivisentini 17:d8d3d2088cac 161 mNfcTag.get_session();
giovannivisentini 13:685d95525ec8 162 }//if
giovannivisentini 13:685d95525ec8 163 }//changeStatus;
giovannivisentini 13:685d95525ec8 164
giovannivisentini 13:685d95525ec8 165 private:
giovannivisentini 13:685d95525ec8 166
giovannivisentini 13:685d95525ec8 167 /**
giovannivisentini 13:685d95525ec8 168 * When an error happen switch on both the led and print the error code.
giovannivisentini 13:685d95525ec8 169 * @param status Error code.
giovannivisentini 13:685d95525ec8 170 */
giovannivisentini 17:d8d3d2088cac 171 void on_error(const M24SR::StatusTypeDef status){
giovannivisentini 13:685d95525ec8 172 mIsComamndRunning=false;
giovannivisentini 13:685d95525ec8 173 mReadOnlyLed=true;
giovannivisentini 13:685d95525ec8 174 mReadWriteWriteLed=true;
giovannivisentini 13:685d95525ec8 175 printf("Error %X changing the status\r\n",status);
giovannivisentini 13:685d95525ec8 176 }
giovannivisentini 13:685d95525ec8 177
giovannivisentini 17:d8d3d2088cac 178 virtual void on_session_open(M24SR *,M24SR::StatusTypeDef status){
giovannivisentini 17:d8d3d2088cac 179 if(status!=M24SR::M24SR_SUCCESS)
giovannivisentini 17:d8d3d2088cac 180 return on_error(status);
giovannivisentini 15:94c98d2aa235 181 printf("Session Open\r\n");
giovannivisentini 17:d8d3d2088cac 182 mNfcTag.select_application();
giovannivisentini 13:685d95525ec8 183 }
giovannivisentini 13:685d95525ec8 184
giovannivisentini 17:d8d3d2088cac 185 virtual void on_selected_application(M24SR *,M24SR::StatusTypeDef status){
giovannivisentini 17:d8d3d2088cac 186 if(status!=M24SR::M24SR_SUCCESS)
giovannivisentini 17:d8d3d2088cac 187 return on_error(status);
giovannivisentini 15:94c98d2aa235 188
giovannivisentini 15:94c98d2aa235 189 printf("Select Application\r\n");
giovannivisentini 17:d8d3d2088cac 190 mNfcTag.select_NDEF_file(0x0001);
giovannivisentini 13:685d95525ec8 191 }
giovannivisentini 13:685d95525ec8 192
giovannivisentini 17:d8d3d2088cac 193 virtual void on_selected_NDEF_file(M24SR *,M24SR::StatusTypeDef status){
giovannivisentini 17:d8d3d2088cac 194 if(status!=M24SR::M24SR_SUCCESS)
giovannivisentini 17:d8d3d2088cac 195 return on_error(status);
giovannivisentini 15:94c98d2aa235 196 printf("Select NDef file\r\n");
giovannivisentini 13:685d95525ec8 197 if(mIsReadOnly){
giovannivisentini 17:d8d3d2088cac 198 mNfcTag.enable_read_only(M24SR::DEFAULT_PASSWORD);
giovannivisentini 13:685d95525ec8 199 }else
giovannivisentini 17:d8d3d2088cac 200 mNfcTag.disable_read_only(M24SR::DEFAULT_PASSWORD);
giovannivisentini 13:685d95525ec8 201 }
giovannivisentini 13:685d95525ec8 202
giovannivisentini 13:685d95525ec8 203
giovannivisentini 17:d8d3d2088cac 204 virtual void on_enable_read_only(M24SR *,M24SR::StatusTypeDef status){
giovannivisentini 17:d8d3d2088cac 205 if(status!=M24SR::M24SR_SUCCESS)
giovannivisentini 17:d8d3d2088cac 206 return on_error(status);
giovannivisentini 15:94c98d2aa235 207 printf("Ready only Enabled\r\n");
giovannivisentini 13:685d95525ec8 208 if(!mIsReadOnly) //if in the meantime the status change
giovannivisentini 17:d8d3d2088cac 209 mNfcTag.disable_read_only(M24SR::DEFAULT_PASSWORD);
giovannivisentini 13:685d95525ec8 210 else{
giovannivisentini 13:685d95525ec8 211 mReadOnlyLed=true;
giovannivisentini 13:685d95525ec8 212 mReadWriteWriteLed=false;
giovannivisentini 17:d8d3d2088cac 213 mNfcTag.deselect();
giovannivisentini 13:685d95525ec8 214 }
giovannivisentini 13:685d95525ec8 215 }
giovannivisentini 13:685d95525ec8 216
giovannivisentini 17:d8d3d2088cac 217 virtual void on_disable_read_only(M24SR *,M24SR::StatusTypeDef status){
giovannivisentini 17:d8d3d2088cac 218 if(status!=M24SR::M24SR_SUCCESS)
giovannivisentini 17:d8d3d2088cac 219 return on_error(status);
giovannivisentini 15:94c98d2aa235 220 printf("Ready only Disabled\r\n");
giovannivisentini 13:685d95525ec8 221 if(mIsReadOnly) //if in the meantime the status change
giovannivisentini 17:d8d3d2088cac 222 mNfcTag.enable_read_only(M24SR::DEFAULT_PASSWORD);
giovannivisentini 13:685d95525ec8 223 else{
giovannivisentini 13:685d95525ec8 224 mReadOnlyLed=false;
giovannivisentini 13:685d95525ec8 225 mReadWriteWriteLed=true;
giovannivisentini 17:d8d3d2088cac 226 mNfcTag.deselect();
giovannivisentini 13:685d95525ec8 227 }
giovannivisentini 13:685d95525ec8 228 }
giovannivisentini 13:685d95525ec8 229
giovannivisentini 17:d8d3d2088cac 230 virtual void on_deselect(M24SR *,M24SR::StatusTypeDef status){
giovannivisentini 17:d8d3d2088cac 231 if(status!=M24SR::M24SR_SUCCESS)
giovannivisentini 17:d8d3d2088cac 232 return on_error(status);
giovannivisentini 15:94c98d2aa235 233 printf("Close Application\r\n");
giovannivisentini 13:685d95525ec8 234 mIsComamndRunning=false;
giovannivisentini 13:685d95525ec8 235 }
giovannivisentini 13:685d95525ec8 236 };
giovannivisentini 13:685d95525ec8 237
giovannivisentini 13:685d95525ec8 238 /**
giovannivisentini 13:685d95525ec8 239 * When the user press the button enable/disable the tag write protection.
giovannivisentini 13:685d95525ec8 240 */
giovannivisentini 13:685d95525ec8 241 void sampleAsync_lockTagContent() {
giovannivisentini 13:685d95525ec8 242
giovannivisentini 13:685d95525ec8 243 //instance the board with the default parameters
giovannivisentini 17:d8d3d2088cac 244 I2C i2cChannel(XNucleoNFC01A1::DEFAULT_SDA_PIN,XNucleoNFC01A1::DEFAULT_SDL_PIN);
giovannivisentini 17:d8d3d2088cac 245 XNucleoNFC01A1 *nfcNucleo = XNucleoNFC01A1::instance(i2cChannel,&set_nfc_event_callback);
giovannivisentini 13:685d95525ec8 246
giovannivisentini 13:685d95525ec8 247 //when the user press the button set buttonPress to true
giovannivisentini 17:d8d3d2088cac 248 #if defined(TARGET_STM)
giovannivisentini 17:d8d3d2088cac 249 InterruptIn userButton(USER_BUTTON);
giovannivisentini 17:d8d3d2088cac 250 #else
giovannivisentini 17:d8d3d2088cac 251 InterruptIn userButton(SW2);
giovannivisentini 17:d8d3d2088cac 252 #endif
giovannivisentini 17:d8d3d2088cac 253 userButton.fall(set_button_press);
giovannivisentini 13:685d95525ec8 254
giovannivisentini 17:d8d3d2088cac 255 M24SR &nfcTag =nfcNucleo->get_M24SR();
giovannivisentini 13:685d95525ec8 256
giovannivisentini 13:685d95525ec8 257 //set async mode
giovannivisentini 17:d8d3d2088cac 258 if(nfcTag.get_session()==M24SR::M24SR_SUCCESS)
giovannivisentini 17:d8d3d2088cac 259 nfcTag.manage_I2C_GPO(M24SR::I2C_ANSWER_READY);
giovannivisentini 13:685d95525ec8 260
giovannivisentini 13:685d95525ec8 261
giovannivisentini 17:d8d3d2088cac 262 ChangeTagStatusCallback changeTagStatus(nfcTag,nfcNucleo->get_led2(),nfcNucleo->get_led3());
giovannivisentini 13:685d95525ec8 263 RemoveAllPasswordStatusCallback removeAllPasswordStatusCallback;
giovannivisentini 13:685d95525ec8 264
giovannivisentini 17:d8d3d2088cac 265 nfcTag.set_callback(&removeAllPasswordStatusCallback);
giovannivisentini 17:d8d3d2088cac 266 nfcTag.get_session();
giovannivisentini 17:d8d3d2088cac 267 nfcNucleo->get_led1()=true;
giovannivisentini 13:685d95525ec8 268
giovannivisentini 13:685d95525ec8 269 while(true){
giovannivisentini 13:685d95525ec8 270
giovannivisentini 17:d8d3d2088cac 271 if(buttonPress && removeAllPasswordStatusCallback.is_finish()){
giovannivisentini 13:685d95525ec8 272 buttonPress=false;
giovannivisentini 17:d8d3d2088cac 273 nfcTag.set_callback(&changeTagStatus);
giovannivisentini 17:d8d3d2088cac 274 changeTagStatus.change_status();
giovannivisentini 13:685d95525ec8 275 }//if
giovannivisentini 13:685d95525ec8 276 if(nfcEvent){
giovannivisentini 13:685d95525ec8 277 nfcEvent=false;
giovannivisentini 17:d8d3d2088cac 278 nfcTag.manage_event();
giovannivisentini 13:685d95525ec8 279 }
giovannivisentini 13:685d95525ec8 280 //wait next event
giovannivisentini 13:685d95525ec8 281 __WFE();
giovannivisentini 13:685d95525ec8 282 }//while
giovannivisentini 13:685d95525ec8 283
giovannivisentini 17:d8d3d2088cac 284 }//sampleAsync_lockTagContent