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:
- 13:685d95525ec8
- Child:
- 14:3b604972b89f
diff -r c4a778f52d8a -r 685d95525ec8 Samples/SampleSync_lockWriteTag.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Samples/SampleSync_lockWriteTag.cpp Mon Feb 01 15:33:26 2016 +0000 @@ -0,0 +1,270 @@ +/** + ****************************************************************************** + * @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 "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 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 + */ +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); + } + + 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; + } + +}; + +/** + * Chain of call needed for change the tag status between read only and write/read + */ +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); + } + + 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; + } +}; + +/** + * When the user press the button enable/disable the tag write protection. + */ +void sample_lockTagContent() { + + //instance the board with the default parameters + I2C i2cChannel(X_NUCLEO_NFC01A1::DEFAULT_SDA_PIN,X_NUCLEO_NFC01A1::DEFAULT_SDL_PIN); + X_NUCLEO_NFC01A1 *nfcNucleo = X_NUCLEO_NFC01A1::Instance(i2cChannel,&setNfcEventCallback); + + //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; + + nfcTag.SetCallback(&removeAllPasswordStatusCallback); + nfcTag.GetSession(); + nfcNucleo->getLed1()=true; + + while(true){ + + if(buttonPress && removeAllPasswordStatusCallback.isFinish()){ + buttonPress=false; + nfcTag.SetCallback(&changeTagStatus); + changeTagStatus.changeStatus(); + }//if + if(nfcEvent){ + nfcEvent=false; + nfcTag.ManageEvent(); + } + //wait next event + __WFE(); + }//while + +}//sample_countClick \ No newline at end of file