![](/media/cache/group/ST_logo_2020_blue_V_cmyk.jpg.50x50_q85.jpg)
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