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 .

Files at this revision

API Documentation at this revision

Comitter:
Davidroid
Date:
Thu Jul 13 12:46:03 2017 +0000
Parent:
17:d8d3d2088cac
Child:
19:de38cedf89d6
Commit message:
Aligning to ARM mbed coding style.

Changed in this revision

Samples/MyRecord.h Show annotated file Show diff for this revision Revisions of this file
Samples/SampleAsync_countClick.cpp Show annotated file Show diff for this revision Revisions of this file
Samples/SampleAsync_lockWriteTag.cpp Show annotated file Show diff for this revision Revisions of this file
Samples/SampleAsync_writeAndChangeAll.cpp Show annotated file Show diff for this revision Revisions of this file
Samples/SampleAsync_writeUrl.cpp Show annotated file Show diff for this revision Revisions of this file
Samples/SampleSync_countClick.cpp Show annotated file Show diff for this revision Revisions of this file
Samples/SampleSync_lockWriteTag.cpp Show annotated file Show diff for this revision Revisions of this file
Samples/SampleSync_writeAndChangeAll.cpp Show annotated file Show diff for this revision Revisions of this file
Samples/SampleSync_writeUrl.cpp Show annotated file Show diff for this revision Revisions of this file
Samples/Samples.h Show annotated file Show diff for this revision Revisions of this file
Samples/sampleAsync_lockWriteTag.cpp Show diff for this revision Revisions of this file
--- a/Samples/MyRecord.h	Thu Jul 13 09:41:01 2017 +0000
+++ b/Samples/MyRecord.h	Thu Jul 13 12:46:03 2017 +0000
@@ -1,6 +1,6 @@
 /**
   ******************************************************************************
-  * @file       MyRecord.cpp
+  * @file       MyRecord.h
   * @author     ST / Central Labs
   * @date       03 Dic 2015
   * @brief      Simple castom record used in the countClick demo
--- a/Samples/SampleAsync_countClick.cpp	Thu Jul 13 09:41:01 2017 +0000
+++ b/Samples/SampleAsync_countClick.cpp	Thu Jul 13 12:46:03 2017 +0000
@@ -1,6 +1,6 @@
 /**
   ******************************************************************************
-  * @file       Sample_countClick.cpp
+  * @file       SampleAsync_countClick.cpp
   * @author     ST / Central Labs
   * @date       03 Dic 2015
   * @brief      This demo define a custom record that contains the number of time the user
@@ -84,8 +84,9 @@
 		void update_message(){
 			if(mCommandFinish){
 				mNfcNucleo->get_M24SR().get_NDef_tag().open_session();
-			}else// if it is doing something remember this request
+			}else{// if it is doing something remember this request
 				mRequestRefresh=true;
+			}
 		}//updateMessage
 
 	private:
@@ -111,15 +112,17 @@
 		 */
 		virtual void on_message_write(NDefLib::NDefNfcTag *tag,bool success,
 				const NDefLib::Message&){
-			if(!success)
+			if(!success) {
 				return on_error();
+			}
 			mNfcNucleo->get_led2()=!mNfcNucleo->get_led2();
 			printf("Tag wrote\r\n");
 			if(mRequestRefresh){
 				mRequestRefresh=false;
 				tag->write(mMsg);
-			}else
+			}else {
 				tag->close_session();
+			}
 			//if-else
 
 		};
@@ -135,8 +138,9 @@
 			if(mRequestRefresh){
 				mRequestRefresh=false;
 				tag->open_session();
-			}else
+			}else {
 				mCommandFinish=true;
+			}
 			//if-else
 		};
 
@@ -177,8 +181,9 @@
     M24SR &nfcTag =nfcNucleo->get_M24SR();
 
    //No call back needed since default behavior is sync
-    if(nfcTag.get_session()==M24SR::M24SR_SUCCESS)
+    if(nfcTag.get_session()==M24SR::M24SR_SUCCESS) {
     	nfcTag.manage_I2C_GPO(M24SR::I2C_ANSWER_READY);//Set async mode
+	}
 
     //create the NDef message and record
     NDefLib::Message msg;
@@ -207,4 +212,3 @@
     }//while
 
 }//sample_countClick
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Samples/SampleAsync_lockWriteTag.cpp	Thu Jul 13 12:46:03 2017 +0000
@@ -0,0 +1,297 @@
+/**
+  ******************************************************************************
+  * @file       SampleAsync_lockWriteTag.cpp
+  * @author     ST / Central Labs
+  * @date       03 Dic 2015
+  * @brief      This demo define a lock/unlock the tag content when the user press
+  *  the user button
+  ******************************************************************************
+  *
+  * COPYRIGHT(c) 2015 STMicroelectronics
+  *
+  * Redistribution and use in source and binary forms, with or without modification,
+  * are permitted provided that the following conditions are met:
+  *   1. Redistributions of source code must retain the above copyright notice,
+  *      this list of conditions and the following disclaimer.
+  *   2. Redistributions in binary form must reproduce the above copyright notice,
+  *      this list of conditions and the following disclaimer in the documentation
+  *      and/or other materials provided with the distribution.
+  *   3. Neither the name of STMicroelectronics nor the names of its contributors
+  *      may be used to endorse or promote products derived from this software
+  *      without specific prior written permission.
+  *
+  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+  *
+  ******************************************************************************
+  */
+
+#include "mbed.h"
+
+#include "XNucleoNFC01A1.h"
+
+static volatile bool buttonPress=false; /// true when the user press the message
+static volatile bool nfcEvent=false; /// true when the user press the message
+
+static void set_nfc_event_callback(){
+	nfcEvent=true;
+}//if buttonPress
+
+/**
+ * Call back called when the user press the button.
+ */
+static void set_button_press(){
+    buttonPress=true;
+}//if buttonPress
+
+/**
+ * Class with the command chain needed to remove all the read/write password
+ */
+class RemoveAllPasswordStatusCallback : public M24SR::Callbacks {
+
+public:
+
+	RemoveAllPasswordStatusCallback():mIsComamndRunning(false){}
+
+	/**
+	 * True when the command chain finish, and the tag can now be read and write
+	 * @return true if the command chain finish
+	 */
+	bool is_finish(){
+		return !mIsComamndRunning;
+	}
+
+
+private:
+	bool mIsComamndRunning; /// false when the command chain finish
+
+	/**
+	 * end the command chain and print an error message
+	 * @param status error code of the last command
+	 */
+	void on_error(const M24SR::StatusTypeDef status){
+		mIsComamndRunning=false;
+		printf("Error Code: %X \r\n",status);
+	}
+
+	virtual void on_session_open(M24SR *tag,M24SR::StatusTypeDef status){
+		if(status!=M24SR::M24SR_SUCCESS) {
+			return on_error(status);
+		}
+		mIsComamndRunning=true;
+		printf("Session Opened\r\n");
+		tag->select_application();
+	}
+
+	virtual void on_selected_application(M24SR *tag,M24SR::StatusTypeDef status){
+		if(status!=M24SR::M24SR_SUCCESS) {
+			return on_error(status);
+		}
+			
+		printf("Select application\r\n");
+		tag->select_NDEF_file(0x0001);
+	}
+
+	virtual void on_selected_NDEF_file(M24SR *tag,M24SR::StatusTypeDef status){
+		if(status!=M24SR::M24SR_SUCCESS) {
+			return on_error(status);
+		}
+
+		printf("Select NDef\r\n");
+		tag->disable_all_password(M24SR::DEFAULT_PASSWORD);
+	}
+
+	virtual void on_disable_all_password(M24SR *tag, M24SR::StatusTypeDef status){
+		if(status!=M24SR::M24SR_SUCCESS) {
+			return on_error(status);
+		}
+			
+		printf("Disable all Password\r\n");
+		tag->deselect();
+	}
+
+	virtual void on_deselect(M24SR *,M24SR::StatusTypeDef status){
+		if(status!=M24SR::M24SR_SUCCESS) {
+			return on_error(status);
+		}
+			
+		printf("Close Application\r\n");
+		mIsComamndRunning=false;
+	}
+
+};
+
+/**
+ * Chain of call needed to change the tag status between read only and write/read
+ */
+class ChangeTagStatusCallback : public M24SR::Callbacks {
+
+	M24SR &mNfcTag; /// object to change
+	DigitalOut& mReadOnlyLed; /// led to switch on when it is in read only mode
+	DigitalOut& mReadWriteWriteLed; /// led to switch on when is in read/write mode
+
+	bool mIsReadOnly; /// current tag status
+	bool mIsComamndRunning; /// true if the chain is running
+
+	public:
+
+		/**
+		 * Build a chain of callback needed to change the tag status.
+		 * @param nfcTag Tag to change.
+		 * @param readLed Led to switch on when in read only mode.
+		 * @param writeLed Led to switch on when in read/write mode.
+		 */
+		ChangeTagStatusCallback(M24SR &nfcTag, DigitalOut& readLed, DigitalOut& writeLed):
+			mNfcTag(nfcTag),mReadOnlyLed(readLed),mReadWriteWriteLed(writeLed),mIsReadOnly(false),
+			mIsComamndRunning(false){
+			mReadOnlyLed=false;
+			mReadWriteWriteLed=true;
+		}
+
+		/**
+		 * Change the tag status
+		 */
+		void change_status(){
+			mIsReadOnly=!mIsReadOnly;
+			//if it is not running a previous command
+			if(!mIsComamndRunning){
+				mNfcTag.get_session();
+			}//if
+		}//changeStatus;
+
+	private:
+
+		/**
+		 * When an error happen switch on both the led and print the error code.
+		 * @param status Error code.
+		 */
+		void on_error(const M24SR::StatusTypeDef status){
+			mIsComamndRunning=false;
+			mReadOnlyLed=true;
+			mReadWriteWriteLed=true;
+			printf("Error %X changing the status\r\n",status);
+		}
+
+		virtual void on_session_open(M24SR *,M24SR::StatusTypeDef status){
+			if(status!=M24SR::M24SR_SUCCESS) {
+				return on_error(status);
+			}
+			printf("Session Open\r\n");
+			mNfcTag.select_application();
+		}
+
+		virtual void on_selected_application(M24SR *,M24SR::StatusTypeDef status){
+			if(status!=M24SR::M24SR_SUCCESS) {
+				return on_error(status);
+			}
+	
+			printf("Select Application\r\n");
+			mNfcTag.select_NDEF_file(0x0001);
+		}
+
+		virtual void on_selected_NDEF_file(M24SR *,M24SR::StatusTypeDef status){
+			if(status!=M24SR::M24SR_SUCCESS) {
+				return on_error(status);
+			}
+			printf("Select NDef file\r\n");
+			if(mIsReadOnly){
+				mNfcTag.enable_read_only(M24SR::DEFAULT_PASSWORD);
+			}else{
+				mNfcTag.disable_read_only(M24SR::DEFAULT_PASSWORD);
+			}
+		}
+
+
+		virtual void on_enable_read_only(M24SR *,M24SR::StatusTypeDef status){
+			if(status!=M24SR::M24SR_SUCCESS) {
+				return on_error(status);
+			}
+			printf("Ready only Enabled\r\n");
+			if(!mIsReadOnly) {//if in the meantime the status change
+				mNfcTag.disable_read_only(M24SR::DEFAULT_PASSWORD);
+			} else {
+				mReadOnlyLed=true;
+				mReadWriteWriteLed=false;
+				mNfcTag.deselect();
+			}
+		}
+
+		virtual void on_disable_read_only(M24SR *,M24SR::StatusTypeDef status){
+			if(status!=M24SR::M24SR_SUCCESS) {
+				return on_error(status);
+			}
+			printf("Ready only Disabled\r\n");
+			if(mIsReadOnly) {//if in the meantime the status change
+				mNfcTag.enable_read_only(M24SR::DEFAULT_PASSWORD);
+			} else {
+				mReadOnlyLed=false;
+				mReadWriteWriteLed=true;
+				mNfcTag.deselect();
+			}
+		}
+
+		virtual void on_deselect(M24SR *,M24SR::StatusTypeDef status){
+			if(status!=M24SR::M24SR_SUCCESS) {
+				return on_error(status);
+			}
+			printf("Close Application\r\n");
+			mIsComamndRunning=false;
+		}
+};
+
+/**
+ * When the user press the button enable/disable the tag write protection.
+ */
+void sampleAsync_lockTagContent() {
+
+    //instance the board with the default parameters
+    I2C i2cChannel(XNucleoNFC01A1::DEFAULT_SDA_PIN,XNucleoNFC01A1::DEFAULT_SDL_PIN);
+    XNucleoNFC01A1 *nfcNucleo = XNucleoNFC01A1::instance(i2cChannel,&set_nfc_event_callback);
+	
+    //when the user press the button set buttonPress to true
+	#if defined(TARGET_STM)
+        InterruptIn userButton(USER_BUTTON);
+    #else
+        InterruptIn userButton(SW2);
+    #endif
+    userButton.fall(set_button_press);
+    
+    M24SR &nfcTag =nfcNucleo->get_M24SR();
+
+    //set async mode
+    if(nfcTag.get_session()==M24SR::M24SR_SUCCESS) {
+    	nfcTag.manage_I2C_GPO(M24SR::I2C_ANSWER_READY);
+	}
+
+
+    ChangeTagStatusCallback changeTagStatus(nfcTag,nfcNucleo->get_led2(),nfcNucleo->get_led3());
+    RemoveAllPasswordStatusCallback removeAllPasswordStatusCallback;
+
+    nfcTag.set_callback(&removeAllPasswordStatusCallback);
+    nfcTag.get_session();
+    nfcNucleo->get_led1()=true;
+
+    while(true){
+
+        if(buttonPress && removeAllPasswordStatusCallback.is_finish()){
+        	buttonPress=false;
+            nfcTag.set_callback(&changeTagStatus);
+        	changeTagStatus.change_status();
+        }//if
+        if(nfcEvent){
+        	nfcEvent=false;
+        	nfcTag.manage_event();
+        }
+        //wait next event
+        __WFE();
+    }//while
+
+}//sampleAsync_lockTagContent
--- a/Samples/SampleAsync_writeAndChangeAll.cpp	Thu Jul 13 09:41:01 2017 +0000
+++ b/Samples/SampleAsync_writeAndChangeAll.cpp	Thu Jul 13 12:46:03 2017 +0000
@@ -1,6 +1,6 @@
 /**
   ******************************************************************************
-  * @file       Sample_writeAndChangeAll.cpp
+  * @file       SampleAsync_writeAndChangeAll.cpp
   * @author     ST / Central Labs
   * @date       03 Dic 2015
   * @brief      This demo write an ndef message different records, when the user press the buttun
--- a/Samples/SampleAsync_writeUrl.cpp	Thu Jul 13 09:41:01 2017 +0000
+++ b/Samples/SampleAsync_writeUrl.cpp	Thu Jul 13 12:46:03 2017 +0000
@@ -1,6 +1,6 @@
 /**
   ******************************************************************************
-  * @file       Sample_writeUrl.cpp
+  * @file       SampleAsync_writeUrl.cpp
   * @author     ST / Central Labs
   * @date       03 Dic 2015
   * @brief      This demo write an ndef message with an url inside
@@ -90,9 +90,9 @@
 	virtual void on_message_write(NDefLib::NDefNfcTag *tag,bool success,
 			const NDefLib::Message&){
 
-		if(!success)
+		if(!success) {
 			printf("Error writing tag!\n\r");
-		else{
+		} else {
 			printf("Tag Wrote!\n\r");
 			mOnWrite=1;
 		}//if-else
@@ -105,11 +105,12 @@
 	 * @param success true if the session is correctly close
 	 */
 	virtual void on_session_close(NDefLib::NDefNfcTag*,bool success){
-		if(success){
+		if(success) {
 			printf("Session closed\n\r");
 			mOnCloseSession=1;
-		}else
+		} else {
 			printf("Error Session closed\n\r");
+		}
 	}
 
 };
@@ -132,8 +133,9 @@
     M24SR &nfcTag =nfcNucleo->get_M24SR();
 
     //No call back needed since default behavior is sync
-    if(nfcTag.get_session()==M24SR::M24SR_SUCCESS)
+    if(nfcTag.get_session()==M24SR::M24SR_SUCCESS) {
     	nfcTag.manage_I2C_GPO(M24SR::I2C_ANSWER_READY);//Set async mode
+	}
 
 	NDefLib::NDefNfcTag &tag = nfcNucleo->get_M24SR().get_NDef_tag();
 
--- a/Samples/SampleSync_countClick.cpp	Thu Jul 13 09:41:01 2017 +0000
+++ b/Samples/SampleSync_countClick.cpp	Thu Jul 13 12:46:03 2017 +0000
@@ -1,6 +1,6 @@
 /**
   ******************************************************************************
-  * @file       Sample_countClick.cpp
+  * @file       SampleSync_countClick.cpp
   * @author     ST / Central Labs
   * @date       03 Dic 2015
   * @brief      This demo define a custom record that contains the number of time the user
--- a/Samples/SampleSync_lockWriteTag.cpp	Thu Jul 13 09:41:01 2017 +0000
+++ b/Samples/SampleSync_lockWriteTag.cpp	Thu Jul 13 12:46:03 2017 +0000
@@ -1,6 +1,6 @@
 /**
   ******************************************************************************
-  * @file       Sample_lockWriteTag.cpp
+  * @file       SampleSync_lockWriteTag.cpp
   * @author     ST / Central Labs
   * @date       03 Dic 2015
   * @brief      This demo define a lock/unlock the tag content when the user press
@@ -148,15 +148,17 @@
         	if(tag.open_session()){
         		bool changeStatusResult;
 				printf("session open\r\n");
-				if(!tagIsLock)
+				if(!tagIsLock) {
 					changeStatusResult=enableReadOnly(nfcNucleo);
-				else
+				} else {
 					changeStatusResult=disableReadOnly(nfcNucleo);
+				}
 
-				if(changeStatusResult)
+				if(changeStatusResult) {
 					tagIsLock=!tagIsLock;
-				else
+				} else {
 					printf("Error change the tag status\r\n");
+				}
 				tag.close_session();
         	}else{
         		printf("Error opening the session, tag is in use\r\n");
--- a/Samples/SampleSync_writeAndChangeAll.cpp	Thu Jul 13 09:41:01 2017 +0000
+++ b/Samples/SampleSync_writeAndChangeAll.cpp	Thu Jul 13 12:46:03 2017 +0000
@@ -1,6 +1,6 @@
 /**
   ******************************************************************************
-  * @file       Sample_writeAndChangeAll.cpp
+  * @file       SampleSynch_writeAndChangeAll.cpp
   * @author     ST / Central Labs
   * @date       03 Dic 2015
   * @brief      This demo write an ndef message different records, when the user press the buttun
@@ -123,18 +123,21 @@
 
         closeStatus = tag.close_session();
 
-    }else
+    } else {
         printf("Error open Session\n\r");
+    }
 
-    if(writeStatus)
+    if (writeStatus) {
         printf("Write Done\n\r");
-    else
+    } else {
         printf("Write Fail\n\r");
+    }
 
-    if(closeStatus)
+    if (closeStatus) {
         printf("Close Done\n\r");
-    else
+    } else {
         printf("Close Fail\n\r");
+    }
 }
 
 /**
--- a/Samples/SampleSync_writeUrl.cpp	Thu Jul 13 09:41:01 2017 +0000
+++ b/Samples/SampleSync_writeUrl.cpp	Thu Jul 13 12:46:03 2017 +0000
@@ -1,6 +1,6 @@
 /**
   ******************************************************************************
-  * @file       Sample_writeUrl.cpp
+  * @file       SampleSync_writeUrl.cpp
   * @author     ST / Central Labs
   * @date       03 Dic 2015
   * @brief      This demo write an ndef message with an url inside
@@ -50,7 +50,7 @@
     NDefLib::NDefNfcTag& tag = nfcNucleo->get_M24SR().get_NDef_tag();
     printf("System Init done: !\r\n");
     //open the i2c session with the nfc chip
-    if(tag.open_session()){
+    if (tag.open_session()) {
         nfcNucleo->get_led1()=1;
         
         //create the NDef message and record
@@ -59,17 +59,19 @@
         msg.add_record(&rUri);
 
         //write the tag
-        if(tag.write(msg)){
+        if (tag.write(msg)) {
             printf("Tag writed \r\n");
             nfcNucleo->get_led2()=1;
         }
 
     
         //close the i2c session
-        if(!tag.close_session()){
+        if (!tag.close_session()) {
             printf("Error Closing the session\r\n");
-        }else
+        } else {
             nfcNucleo->get_led3()=1;
-    }else
+        }
+    } else {
         printf("Error open Session\r\n");
+    }
 }
--- a/Samples/Samples.h	Thu Jul 13 09:41:01 2017 +0000
+++ b/Samples/Samples.h	Thu Jul 13 12:46:03 2017 +0000
@@ -1,6 +1,6 @@
 /**
   ******************************************************************************
-  * @file       SamplesSync.h
+  * @file       Samples.h
   * @date       03/12/2015
   * @brief      This file contains definitions for the sample functions that are
   * that are using the nfc component in a sync way.
--- a/Samples/sampleAsync_lockWriteTag.cpp	Thu Jul 13 09:41:01 2017 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,284 +0,0 @@
-/**
-  ******************************************************************************
-  * @file       Sample_lockWriteTag.cpp
-  * @author     ST / Central Labs
-  * @date       03 Dic 2015
-  * @brief      This demo define a lock/unlock the tag content when the user press
-  *  the user button
-  ******************************************************************************
-  *
-  * COPYRIGHT(c) 2015 STMicroelectronics
-  *
-  * Redistribution and use in source and binary forms, with or without modification,
-  * are permitted provided that the following conditions are met:
-  *   1. Redistributions of source code must retain the above copyright notice,
-  *      this list of conditions and the following disclaimer.
-  *   2. Redistributions in binary form must reproduce the above copyright notice,
-  *      this list of conditions and the following disclaimer in the documentation
-  *      and/or other materials provided with the distribution.
-  *   3. Neither the name of STMicroelectronics nor the names of its contributors
-  *      may be used to endorse or promote products derived from this software
-  *      without specific prior written permission.
-  *
-  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-  *
-  ******************************************************************************
-  */
-
-#include "mbed.h"
-
-#include "XNucleoNFC01A1.h"
-
-static volatile bool buttonPress=false; /// true when the user press the message
-static volatile bool nfcEvent=false; /// true when the user press the message
-
-static void set_nfc_event_callback(){
-	nfcEvent=true;
-}//if buttonPress
-
-/**
- * Call back called when the user press the button.
- */
-static void set_button_press(){
-    buttonPress=true;
-}//if buttonPress
-
-/**
- * Class with the command chain needed to remove all the read/write password
- */
-class RemoveAllPasswordStatusCallback : public M24SR::Callbacks {
-
-public:
-
-	RemoveAllPasswordStatusCallback():mIsComamndRunning(false){}
-
-	/**
-	 * True when the command chain finish, and the tag can now be read and write
-	 * @return true if the command chain finish
-	 */
-	bool is_finish(){
-		return !mIsComamndRunning;
-	}
-
-
-private:
-	bool mIsComamndRunning; /// false when the command chain finish
-
-	/**
-	 * end the command chain and print an error message
-	 * @param status error code of the last command
-	 */
-	void on_error(const M24SR::StatusTypeDef status){
-		mIsComamndRunning=false;
-		printf("Error Code: %X \r\n",status);
-	}
-
-	virtual void on_session_open(M24SR *tag,M24SR::StatusTypeDef status){
-		if(status!=M24SR::M24SR_SUCCESS)
-			return on_error(status);
-		mIsComamndRunning=true;
-		printf("Session Opened\r\n");
-		tag->select_application();
-	}
-
-	virtual void on_selected_application(M24SR *tag,M24SR::StatusTypeDef status){
-		if(status!=M24SR::M24SR_SUCCESS)
-			return on_error(status);
-			
-		printf("Select application\r\n");
-		tag->select_NDEF_file(0x0001);
-	}
-
-	virtual void on_selected_NDEF_file(M24SR *tag,M24SR::StatusTypeDef status){
-		if(status!=M24SR::M24SR_SUCCESS)
-			return on_error(status);
-
-		printf("Select NDef\r\n");
-		tag->disable_all_password(M24SR::DEFAULT_PASSWORD);
-	}
-
-	virtual void on_disable_all_password(M24SR *tag, M24SR::StatusTypeDef status){
-		if(status!=M24SR::M24SR_SUCCESS)
-			return on_error(status);
-			
-		printf("Disable all Password\r\n");
-		tag->deselect();
-	}
-
-	virtual void on_deselect(M24SR *,M24SR::StatusTypeDef status){
-		if(status!=M24SR::M24SR_SUCCESS)
-			return on_error(status);
-			
-		printf("Close Application\r\n");
-		mIsComamndRunning=false;
-	}
-
-};
-
-/**
- * Chain of call needed to change the tag status between read only and write/read
- */
-class ChangeTagStatusCallback : public M24SR::Callbacks {
-
-	M24SR &mNfcTag; /// object to change
-	DigitalOut& mReadOnlyLed; /// led to switch on when it is in read only mode
-	DigitalOut& mReadWriteWriteLed; /// led to switch on when is in read/write mode
-
-	bool mIsReadOnly; /// current tag status
-	bool mIsComamndRunning; /// true if the chain is running
-
-	public:
-
-		/**
-		 * Build a chain of callback needed to change the tag status.
-		 * @param nfcTag Tag to change.
-		 * @param readLed Led to switch on when in read only mode.
-		 * @param writeLed Led to switch on when in read/write mode.
-		 */
-		ChangeTagStatusCallback(M24SR &nfcTag, DigitalOut& readLed, DigitalOut& writeLed):
-			mNfcTag(nfcTag),mReadOnlyLed(readLed),mReadWriteWriteLed(writeLed),mIsReadOnly(false),
-			mIsComamndRunning(false){
-			mReadOnlyLed=false;
-			mReadWriteWriteLed=true;
-		}
-
-		/**
-		 * Change the tag status
-		 */
-		void change_status(){
-			mIsReadOnly=!mIsReadOnly;
-			//if it is not running a previous command
-			if(!mIsComamndRunning){
-				mNfcTag.get_session();
-			}//if
-		}//changeStatus;
-
-	private:
-
-		/**
-		 * When an error happen switch on both the led and print the error code.
-		 * @param status Error code.
-		 */
-		void on_error(const M24SR::StatusTypeDef status){
-			mIsComamndRunning=false;
-			mReadOnlyLed=true;
-			mReadWriteWriteLed=true;
-			printf("Error %X changing the status\r\n",status);
-		}
-
-		virtual void on_session_open(M24SR *,M24SR::StatusTypeDef status){
-			if(status!=M24SR::M24SR_SUCCESS)
-				return on_error(status);
-			printf("Session Open\r\n");
-			mNfcTag.select_application();
-		}
-
-		virtual void on_selected_application(M24SR *,M24SR::StatusTypeDef status){
-			if(status!=M24SR::M24SR_SUCCESS)
-				return on_error(status);
-	
-			printf("Select Application\r\n");
-			mNfcTag.select_NDEF_file(0x0001);
-		}
-
-		virtual void on_selected_NDEF_file(M24SR *,M24SR::StatusTypeDef status){
-			if(status!=M24SR::M24SR_SUCCESS)
-				return on_error(status);
-			printf("Select NDef file\r\n");
-			if(mIsReadOnly){
-				mNfcTag.enable_read_only(M24SR::DEFAULT_PASSWORD);
-			}else
-				mNfcTag.disable_read_only(M24SR::DEFAULT_PASSWORD);
-		}
-
-
-		virtual void on_enable_read_only(M24SR *,M24SR::StatusTypeDef status){
-			if(status!=M24SR::M24SR_SUCCESS)
-				return on_error(status);
-			printf("Ready only Enabled\r\n");
-			if(!mIsReadOnly) //if in the meantime the status change
-				mNfcTag.disable_read_only(M24SR::DEFAULT_PASSWORD);
-			else{
-				mReadOnlyLed=true;
-				mReadWriteWriteLed=false;
-				mNfcTag.deselect();
-			}
-		}
-
-		virtual void on_disable_read_only(M24SR *,M24SR::StatusTypeDef status){
-			if(status!=M24SR::M24SR_SUCCESS)
-				return on_error(status);
-			printf("Ready only Disabled\r\n");
-			if(mIsReadOnly) //if in the meantime the status change
-				mNfcTag.enable_read_only(M24SR::DEFAULT_PASSWORD);
-			else{
-				mReadOnlyLed=false;
-				mReadWriteWriteLed=true;
-				mNfcTag.deselect();
-			}
-		}
-
-		virtual void on_deselect(M24SR *,M24SR::StatusTypeDef status){
-			if(status!=M24SR::M24SR_SUCCESS)
-				return on_error(status);
-			printf("Close Application\r\n");
-			mIsComamndRunning=false;
-		}
-};
-
-/**
- * When the user press the button enable/disable the tag write protection.
- */
-void sampleAsync_lockTagContent() {
-
-    //instance the board with the default parameters
-    I2C i2cChannel(XNucleoNFC01A1::DEFAULT_SDA_PIN,XNucleoNFC01A1::DEFAULT_SDL_PIN);
-    XNucleoNFC01A1 *nfcNucleo = XNucleoNFC01A1::instance(i2cChannel,&set_nfc_event_callback);
-	
-    //when the user press the button set buttonPress to true
-	#if defined(TARGET_STM)
-        InterruptIn userButton(USER_BUTTON);
-    #else
-        InterruptIn userButton(SW2);
-    #endif
-    userButton.fall(set_button_press);
-    
-    M24SR &nfcTag =nfcNucleo->get_M24SR();
-
-    //set async mode
-    if(nfcTag.get_session()==M24SR::M24SR_SUCCESS)
-    	nfcTag.manage_I2C_GPO(M24SR::I2C_ANSWER_READY);
-
-
-    ChangeTagStatusCallback changeTagStatus(nfcTag,nfcNucleo->get_led2(),nfcNucleo->get_led3());
-    RemoveAllPasswordStatusCallback removeAllPasswordStatusCallback;
-
-    nfcTag.set_callback(&removeAllPasswordStatusCallback);
-    nfcTag.get_session();
-    nfcNucleo->get_led1()=true;
-
-    while(true){
-
-        if(buttonPress && removeAllPasswordStatusCallback.is_finish()){
-        	buttonPress=false;
-            nfcTag.set_callback(&changeTagStatus);
-        	changeTagStatus.change_status();
-        }//if
-        if(nfcEvent){
-        	nfcEvent=false;
-        	nfcTag.manage_event();
-        }
-        //wait next event
-        __WFE();
-    }//while
-
-}//sampleAsync_lockTagContent