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 .
Revision 18:d596eb3f575f, committed 2017-07-13
- 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
--- 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
