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
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 .
Diff: Samples/SampleSync_lockWriteTag.cpp
- Revision:
- 14:3b604972b89f
- Parent:
- 13:685d95525ec8
- Child:
- 15:94c98d2aa235
--- 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
