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:
giovannivisentini
Date:
Wed Aug 31 13:06:13 2016 +0000
Parent:
13:685d95525ec8
Child:
15:94c98d2aa235
Commit message:
update libs

Changed in this revision

NDefLib.lib 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_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_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/sampleAsync_lockWriteTag.cpp Show annotated file Show diff for this revision Revisions of this file
X_NUCLEO_NFC01A1.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/NDefLib.lib	Mon Feb 01 15:33:26 2016 +0000
+++ b/NDefLib.lib	Wed Aug 31 13:06:13 2016 +0000
@@ -1,1 +1,1 @@
-http://developer.mbed.org/users/giovannivisentini/code/NDefLib/#01fc5a4b8366
+http://developer.mbed.org/users/giovannivisentini/code/NDefLib/#46899fa3d9f2
--- a/Samples/SampleAsync_countClick.cpp	Mon Feb 01 15:33:26 2016 +0000
+++ b/Samples/SampleAsync_countClick.cpp	Wed Aug 31 13:06:13 2016 +0000
@@ -44,7 +44,7 @@
 /**
  * class with the callback needed to update the record in the tag
  */
-class WriteMyRecordCallback : public NDefLib::NDefNfcTag::Callback {
+class WriteMyRecordCallback : public NDefLib::NDefNfcTag::Callbacks {
 
 	/**
 	 * board where change the led status
@@ -106,7 +106,7 @@
 		}
 
 		/**
-		 * if the user ask for update the value it write again the message, otherwise close the session
+		 * if the user ask to update the value it write again the message, otherwise close the session
 		 */
 		virtual void onMessageWrite(NDefLib::NDefNfcTag *tag,bool success,
 				const NDefLib::Message&){
@@ -123,7 +123,7 @@
 		};
 
 		/**
-		 * if the user ask for update the value it open a new session
+		 * if the user ask to update the value it open a new session
 		 */
 		virtual void onSessionClose(NDefLib::NDefNfcTag *tag,bool success){
 			if(!success)
--- a/Samples/SampleAsync_writeAndChangeAll.cpp	Mon Feb 01 15:33:26 2016 +0000
+++ b/Samples/SampleAsync_writeAndChangeAll.cpp	Wed Aug 31 13:06:13 2016 +0000
@@ -126,7 +126,7 @@
     switch(r->getType()){
         case Record::TYPE_TEXT: {
             RecordText *temp = (RecordText*)r;
-            temp->setText("CIAOCiao");
+            temp->setText("Hello");
             break; }
         case Record::TYPE_AAR:{
             RecordAAR *temp = (RecordAAR*)r;
@@ -172,7 +172,7 @@
  * Class that print read a message and print it on console,
  * and enable the user button when it finish
  */
-class ReadMessageCallback : public NDefLib::NDefNfcTag::Callback{
+class ReadMessageCallback : public NDefLib::NDefNfcTag::Callbacks{
 
 	NDefLib::Message *mMsg; /// Message where read
 	bool *mDisableButton; /// enable the user button
@@ -235,7 +235,7 @@
 /**
  * Read the message, change some data and write it back
  */
-class ChangeMessageCallback : public NDefLib::NDefNfcTag::Callback{
+class ChangeMessageCallback : public NDefLib::NDefNfcTag::Callbacks{
 
 	ReadMessageCallback* mReadMessage;
 	NDefLib::Message *mMsg;
@@ -263,7 +263,7 @@
 public:
 
 	/**
-	 * @param readCallback Callback needed for print the tag content after the change
+	 * @param readCallback Callback needed to print the tag content after the change
 	 */
 	ChangeMessageCallback(ReadMessageCallback* readCallback):
 		mReadMessage(readCallback),mMsg(NULL){}
@@ -323,7 +323,7 @@
 /**
  * Create and write a message in a nfc tag
  */
-class WriteMessageCallback : public NDefLib::NDefNfcTag::Callback{
+class WriteMessageCallback : public NDefLib::NDefNfcTag::Callbacks{
 
 	ReadMessageCallback* mReadMessage;
 
@@ -363,7 +363,7 @@
 		NDefLib::RecordMail rMail("mail@st.com","ciao","da nfc tag");
 		msg.addRecord(&rMail);
 
-		NDefLib::RecordMimeType rText1("text/plain",(const uint8_t*)"ciao",4);
+		NDefLib::RecordMimeType rText1("text/plain",(const uint8_t*)"Ciao",4);
 		msg.addRecord(&rText1);
 
 		NDefLib::RecordText rText3(NDefLib::RecordText::UTF8,"it","ciao");
@@ -407,7 +407,7 @@
 	}
 
 	/**
-	 * Set the callback for print the tag content and open a new session
+	 * Set the callback to print the tag content and open a new session
 	 */
 	virtual void onSessionClose(NDefLib::NDefNfcTag *tag,bool success){
 		if(success){
@@ -421,7 +421,7 @@
 };
 
 
-static bool buttonPress=false; /// true when the user press the message
+static volatile bool buttonPress=false; /// true when the user press the message
 
 /**
  * Call back called when the user press the button
@@ -430,7 +430,7 @@
     buttonPress=true;
 }//if buttonPress
 
-static bool nfcEvent=false; /// true if there is an nfc interrupt
+static volatile bool nfcEvent=false; /// true if there is an nfc interrupt
 
 /**
  * Call back called when the user press the button
--- a/Samples/SampleAsync_writeUrl.cpp	Mon Feb 01 15:33:26 2016 +0000
+++ b/Samples/SampleAsync_writeUrl.cpp	Wed Aug 31 13:06:13 2016 +0000
@@ -43,7 +43,7 @@
  * Chain of callback that will crate a Uri record and write it.
  * After each operation the class will switch on a led
  */
-class WriteUriCallbacks : public NDefLib::NDefNfcTag::Callback{
+class WriteUriCallbacks : public NDefLib::NDefNfcTag::Callbacks{
 
 	DigitalOut &mOnOpenSession;
 	DigitalOut &mOnWrite;
@@ -116,7 +116,7 @@
 
 
 /** variable set to true when we receive an interrupt from the nfc component*/
-static bool nfcInterruptFlag;
+static volatile bool nfcInterruptFlag;
 
 /** Nfc ISR called when the nfc component has a message ready*/
 static void nfcInterruptCallback(){
--- a/Samples/SampleSync_lockWriteTag.cpp	Mon Feb 01 15:33:26 2016 +0000
+++ b/Samples/SampleSync_lockWriteTag.cpp	Wed Aug 31 13:06:13 2016 +0000
@@ -38,231 +38,107 @@
 
 #include "X_NUCLEO_NFC01A1.h"
 
-static bool buttonPress=false; /// true when the user press the message
-static bool nfcEvent=false; /// true when the user press the message
+static volatile bool buttonPress=false;
 
-static void setNfcEventCallback(){
-	nfcEvent=true;
-}//if buttonPress
-/**
- * Call back called when the user press the button.
- */
 static void setButtonPress(){
     buttonPress=true;
 }//if buttonPress
 
 /**
- * Class with the command chain needed for remove all the read/write password
+ * return the led that tell if the tag is read only
+ * @param nfcNucleo board where the lead lives
+ * @return let to switch on if the tag is read only
  */
-class RemoveAllPasswordStatusCallback : public Nfc::Callback {
-
-public:
-
-	RemoveAllPasswordStatusCallback():mIsComamndRunning(false){}
-
-	/**
-	 * true when the command chain finish, and the the tag can now be read and write
-	 * @return true if the command chain finish
-	 */
-	bool isFinish(){
-		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 onError(const NFC_StatusTypeDef status){
-		mIsComamndRunning=false;
-		printf("Error Code: %X \r\n",status);
-	}
+static inline DigitalOut& getReadOnlyLed(X_NUCLEO_NFC01A1 *nfcNucleo){
+	return nfcNucleo->getLed2();
+}
 
-	virtual void onSessionOpen(Nfc *tag,NFC_StatusTypeDef status){
-		if(status!=NFC_SUCCESS)
-			return onError(status);
-		mIsComamndRunning=true;
-
-		tag->SelectApplication();
-	}
-
-	virtual void onSelectedApplication(Nfc *tag,NFC_StatusTypeDef status){
-		if(status!=NFC_SUCCESS)
-			return onError(status);
-
-		tag->SelectNDEFfile(0x0001);
-	}
-
-	virtual void onSelectedNDEFFile(Nfc *tag,NFC_StatusTypeDef status){
-		if(status!=NFC_SUCCESS)
-			return onError(status);
-
-		tag->DisableAllPassword(M24SR::DEFAULT_PASSWORD);
-	}
-
-	virtual void onDisableAllPassword(Nfc *tag, NFC_StatusTypeDef status){
-		if(status!=NFC_SUCCESS)
-			return onError(status);
-
-		tag->Deselect();
-	}
-
-	virtual void onDeselect(Nfc *,NFC_StatusTypeDef status){
-		if(status!=NFC_SUCCESS)
-			return onError(status);
-		mIsComamndRunning=false;
-	}
-
-};
+/**
+ * return the led that tell if the tag is write only
+ * @param nfcNucleo board where the lead lives
+ * @return let to switch on if the tag is write only
+ */
+static inline DigitalOut& getWriteableLed(X_NUCLEO_NFC01A1 *nfcNucleo){
+	return nfcNucleo->getLed3();
+}
 
 /**
- * Chain of call needed for change the tag status between read only and write/read
+ * set the tag as read only and switch the led on
+ * @param nfcNucleo board where the lead lives
+ * @param tag helper class to manage the nfc tag
+ * @return true if the change has effect
  */
-class ChangeTagStatusCallback : public Nfc::Callback {
-
-	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 for 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 changeStatus(){
-			mIsReadOnly=!mIsReadOnly;
-			//if it is not running a previous command
-			if(!mIsComamndRunning){
-				mNfcTag.GetSession();
-			}//if
-		}//changeStatus;
-
-	private:
-
-		/**
-		 * When an error happen switch on both the led and print the error code.
-		 * @param status Error code.
-		 */
-		void onError(const NFC_StatusTypeDef status){
-			mIsComamndRunning=false;
-			mReadOnlyLed=true;
-			mReadWriteWriteLed=true;
-			printf("Error %X changing the status\r\n",status);
-		}
+bool enableReadOnly( X_NUCLEO_NFC01A1 *nfcNucleo){
 
-		virtual void onSessionOpen(Nfc *,NFC_StatusTypeDef status){
-			if(status!=NFC_SUCCESS)
-				return onError(status);
-			mNfcTag.SelectApplication();
-		}
-
-		virtual void onSelectedApplication(Nfc *,NFC_StatusTypeDef status){
-			if(status!=NFC_SUCCESS)
-				return onError(status);
-			mNfcTag.SelectNDEFfile(0x0001);
-		}
-
-		virtual void onSelectedNDEFFile(Nfc *,NFC_StatusTypeDef status){
-			if(status!=NFC_SUCCESS)
-				return onError(status);
-
-			if(mIsReadOnly){
-				mNfcTag.EnableReadOnly(M24SR::DEFAULT_PASSWORD);
-			}else
-				mNfcTag.DisableReadOnly(M24SR::DEFAULT_PASSWORD);
-		}
-
-
-		virtual void onEnableReadOnly(Nfc *,NFC_StatusTypeDef status){
-			if(status!=NFC_SUCCESS)
-				return onError(status);
-
-			if(!mIsReadOnly) //if in the meantime the status change
-				mNfcTag.DisableReadOnly(M24SR::DEFAULT_PASSWORD);
-			else{
-				mReadOnlyLed=true;
-				mReadWriteWriteLed=false;
-				mNfcTag.Deselect();
-			}
-		}
-
-		virtual void onDisableReadOnly(Nfc *,NFC_StatusTypeDef status){
-			if(status!=NFC_SUCCESS)
-				return onError(status);
-
-			if(mIsReadOnly) //if in the meantime the status change
-				mNfcTag.EnableReadOnly(M24SR::DEFAULT_PASSWORD);
-			else{
-				mReadOnlyLed=false;
-				mReadWriteWriteLed=true;
-				mNfcTag.Deselect();
-			}
-		}
-
-		virtual void onDeselect(Nfc *,NFC_StatusTypeDef status){
-			if(status!=NFC_SUCCESS)
-				return onError(status);
-			mIsComamndRunning=false;
-		}
-};
+	if(nfcNucleo->getM24SR().EnableReadOnly(M24SR::DEFAULT_PASSWORD)){
+		getReadOnlyLed(nfcNucleo)=true;
+		getWriteableLed(nfcNucleo)=false;
+		return true;
+	}else
+		return false;
+}
 
 /**
- * When the user press the button enable/disable the tag write protection.
+ * set the tag as read/write and switch the led on
+ * @param nfcNucleo board where the lead lives
+ * @param tag helper class to manage the nfc tag
+ * @return true if the change has effect
  */
-void sample_lockTagContent() {
+bool disableReadOnly( X_NUCLEO_NFC01A1 *nfcNucleo){
 
-    //instance the board with the default parameters
+	if(nfcNucleo->getM24SR().DisableReadOnly(M24SR::DEFAULT_PASSWORD)){
+		getReadOnlyLed(nfcNucleo)=false;
+		getWriteableLed(nfcNucleo)=true;
+		return true;
+	}else
+		return false;
+}
+
+void sampleSync_lockTagContent() {
+	Serial console(SERIAL_TX, SERIAL_RX);
+
     I2C i2cChannel(X_NUCLEO_NFC01A1::DEFAULT_SDA_PIN,X_NUCLEO_NFC01A1::DEFAULT_SDL_PIN);
-    X_NUCLEO_NFC01A1 *nfcNucleo = X_NUCLEO_NFC01A1::Instance(i2cChannel,&setNfcEventCallback);
-	
+    i2cChannel.frequency(400000);
+
+    X_NUCLEO_NFC01A1 *nfcNucleo = X_NUCLEO_NFC01A1::Instance(i2cChannel);
+    
+    NDefLib::NDefNfcTag &tag = nfcNucleo->getM24SR().getNDefTag();
+
     //when the user press the button set buttonPress to true
     InterruptIn userButton(USER_BUTTON);
     userButton.fall(setButtonPress);
-    
-    M24SR &nfcTag =nfcNucleo->getM24SR();
-
-    //set async mode
-    if(nfcTag.GetSession()!=NFC_SUCCESS)
-    	nfcTag.ManageI2CGPO(I2C_ANSWER_READY);
-
 
-    ChangeTagStatusCallback changeTagStatus(nfcTag,nfcNucleo->getLed2(),nfcNucleo->getLed3());
-    RemoveAllPasswordStatusCallback removeAllPasswordStatusCallback;
+    //restore the board as read/write
+    tag.openSession(true);
+    nfcNucleo->getM24SR().DisableAllPassword(M24SR::DEFAULT_PASSWORD);
+    tag.closeSession();
+    getReadOnlyLed(nfcNucleo)=false;
+    getWriteableLed(nfcNucleo)=true;
+    bool tagIsLock=false;
 
-    nfcTag.SetCallback(&removeAllPasswordStatusCallback);
-    nfcTag.GetSession();
-    nfcNucleo->getLed1()=true;
-
+	nfcNucleo->getLed1()=true;
     while(true){
 
-        if(buttonPress && removeAllPasswordStatusCallback.isFinish()){
+        if(buttonPress){
+        	if(tag.openSession()){
+        		bool changeStatusResult;
+
+				if(tagIsLock)
+					changeStatusResult=enableReadOnly(nfcNucleo);
+				else
+					changeStatusResult=disableReadOnly(nfcNucleo);
+
+				if(changeStatusResult)
+					tagIsLock=!tagIsLock;
+				else
+					console.printf("Error change the tag status");
+				tag.closeSession();
+        	}else{
+        		console.printf("Error opening the session, tag is in use");
+        	}
         	buttonPress=false;
-            nfcTag.SetCallback(&changeTagStatus);
-        	changeTagStatus.changeStatus();
         }//if
-        if(nfcEvent){
-        	nfcEvent=false;
-        	nfcTag.ManageEvent();
-        }
+
         //wait next event
         __WFE();
     }//while
--- a/Samples/SampleSync_writeAndChangeAll.cpp	Mon Feb 01 15:33:26 2016 +0000
+++ b/Samples/SampleSync_writeAndChangeAll.cpp	Wed Aug 31 13:06:13 2016 +0000
@@ -196,7 +196,7 @@
     switch(r->getType()){
         case Record::TYPE_TEXT: {
             RecordText *temp = (RecordText*)r;
-            temp->setText("CIAOCiao");
+            temp->setText("Hello");
             break; }
         case Record::TYPE_AAR:{
             RecordAAR *temp = (RecordAAR*)r;
@@ -208,7 +208,7 @@
             break;}
         case Record::TYPE_URI:{
             RecordURI *temp = (RecordURI*)r;
-            temp->setContent("google.it");
+            temp->setContent("mbed.com");
             break;}
         case Record::TYPE_URI_MAIL:{
             RecordMail *temp = (RecordMail*)r;
--- a/Samples/sampleAsync_lockWriteTag.cpp	Mon Feb 01 15:33:26 2016 +0000
+++ b/Samples/sampleAsync_lockWriteTag.cpp	Wed Aug 31 13:06:13 2016 +0000
@@ -38,12 +38,13 @@
 
 #include "X_NUCLEO_NFC01A1.h"
 
-static bool buttonPress=false; /// true when the user press the message
-static bool nfcEvent=false; /// true when the user press the message
+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 setNfcEventCallback(){
 	nfcEvent=true;
 }//if buttonPress
+
 /**
  * Call back called when the user press the button.
  */
@@ -52,16 +53,16 @@
 }//if buttonPress
 
 /**
- * Class with the command chain needed for remove all the read/write password
+ * Class with the command chain needed to remove all the read/write password
  */
-class RemoveAllPasswordStatusCallback : public Nfc::Callback {
+class RemoveAllPasswordStatusCallback : public Nfc::Callbacks {
 
 public:
 
 	RemoveAllPasswordStatusCallback():mIsComamndRunning(false){}
 
 	/**
-	 * true when the command chain finish, and the the tag can now be read and write
+	 * True when the command chain finish, and the tag can now be read and write
 	 * @return true if the command chain finish
 	 */
 	bool isFinish(){
@@ -119,9 +120,9 @@
 };
 
 /**
- * Chain of call needed for change the tag status between read only and write/read
+ * Chain of call needed to change the tag status between read only and write/read
  */
-class ChangeTagStatusCallback : public Nfc::Callback {
+class ChangeTagStatusCallback : public Nfc::Callbacks {
 
 	M24SR &mNfcTag; /// object to change
 	DigitalOut& mReadOnlyLed; /// led to switch on when it is in read only mode
@@ -133,7 +134,7 @@
 	public:
 
 		/**
-		 * Build a chain of callback needed for change the tag status.
+		 * 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.
--- a/X_NUCLEO_NFC01A1.lib	Mon Feb 01 15:33:26 2016 +0000
+++ b/X_NUCLEO_NFC01A1.lib	Wed Aug 31 13:06:13 2016 +0000
@@ -1,1 +1,1 @@
-http://developer.mbed.org/users/giovannivisentini/code/X_NUCLEO_NFC01A1/#d07138541feb
+http://developer.mbed.org/users/giovannivisentini/code/X_NUCLEO_NFC01A1/#2090378b0b51
--- a/main.cpp	Mon Feb 01 15:33:26 2016 +0000
+++ b/main.cpp	Wed Aug 31 13:06:13 2016 +0000
@@ -31,14 +31,16 @@
   ******************************************************************************
   */
 
-//#define SYNC_MODE
+#include "Samples/Samples.h"
 
-#include "Samples/Samples.h"
- 
-//#define SAMPLE_WRITE_URL
+//choose the demo to compile
+#define SAMPLE_WRITE_URL
 //#define SAMPLE_COUNT_CLICK
 //#define SAMPLE_WRITE_AND_CHANGE_ALL
-#define SAMPLE_LOCK_TAG_CONTENT
+//#define SAMPLE_LOCK_TAG_CONTENT
+
+//uncomment for the async example
+#define SYNC_MODE
  
 int main(void)
 {