A simple application providing an example of asynchronous access to the X-NUCLEO_NFC01A1 Dynamic NFC Tag board.
Dependencies: NDefLib X_NUCLEO_NFC01A1 mbed
Fork of HelloWord_Async_NFC01A1 by
X-NUCLEO-NFC01A1 Dynamic NFC Tag Expansion Board Firmware Package
Introduction
This firmware package includes Components Device Drivers, Board Support Package and example applications for STMicroelectronics X-NUCLEO-NFC01A1 Dynamic NFC Tag Expansion Board based on M24SR.
Example Application
The application provides a simple example of asynchronous access to the X-NUCLEO-NFC01A1 Dynamic NFC Tag Expansion Board. The program writes a URI link to the M24SR dynamic tag using the asynchronous programming model. The URI can then be retrieved from an NFC enabled smartphone/tablet.
A simpler example providing synchronous access to the tag is also available.
Diff: main.cpp
- Revision:
- 4:416db8919ca4
- Parent:
- 2:48e58c5086e8
- Child:
- 5:adf7d29c9431
diff -r 27f21d756e9f -r 416db8919ca4 main.cpp
--- a/main.cpp Wed Feb 03 10:21:48 2016 +0000
+++ b/main.cpp Wed Aug 31 11:18:55 2016 +0000
@@ -38,6 +38,21 @@
#include "m24sr/NDefNfcTagM24SR.h"
#include "NDefLib/RecordType/RecordURI.h"
+/** variable set to true when we receive an interrupt from the nfc component*/
+static volatile bool nfcInterruptFlag=false;
+
+/** variable set to true when the user press the board user button*/
+static volatile bool buttonPress=false;
+
+/** Nfc ISR called when the nfc component has a message ready*/
+static void nfcInterruptCallback(){
+ nfcInterruptFlag=true;
+}//nfcInterruptCallback
+
+static void setButtonPress(){
+ buttonPress=true;
+}//if buttonPress
+
/**
* Chain of callback that will crate a Uri record and write it.
* After each operation the class will switch on a led
@@ -47,6 +62,7 @@
DigitalOut &mOnOpenSession;
DigitalOut &mOnWrite;
DigitalOut &mOnCloseSession;
+ NDefLib::Message msg;
public:
@@ -72,8 +88,7 @@
printf("Session opened\r\n");
//ask to have an interrupt when the command finish
mOnOpenSession=1;
- NDefLib::Message msg;
-
+
NDefLib::RecordURI rUri(NDefLib::RecordURI::HTTP_WWW,"http://www.st.com");
msg.addRecord(&rUri);
@@ -105,7 +120,91 @@
*/
virtual void onSessionClose(NDefLib::NDefNfcTag*,bool success){
if(success){
+ printf("Session closed\r\n");
+ mOnCloseSession=1;
+ }else
printf("Error closing the session\r\n");
+ }
+
+};
+
+/**
+ * Chain of callback that will read a NDef Message and print all the
+ * record of type URI.
+ * After each operation the class will switch on a led
+ */
+class ReadUriCallbacks : public NDefLib::NDefNfcTag::Callbacks{
+
+ DigitalOut &mOnOpenSession;
+ DigitalOut &mOnRead;
+ DigitalOut &mOnCloseSession;
+
+ NDefLib::Message mMsg;
+
+public:
+
+ /**
+ * create the callback chain
+ * @param onOpenSession led to switch on when the session open
+ * @param onWrite led to switch on when the write end
+ * @param onCloseSession led to switch on when the session end
+ */
+ ReadUriCallbacks(DigitalOut &onOpenSession,DigitalOut &onRead,
+ DigitalOut &onCloseSession):mOnOpenSession(onOpenSession),
+ mOnRead(onRead),mOnCloseSession(onCloseSession){};
+
+ /**
+ * crate the new message and write it
+ * @param tag tag where write the message
+ * @param success true if the session correctly open
+ */
+ virtual void onSessionOpen(NDefLib::NDefNfcTag *tag,bool success){
+ if(!success){
+ printf("Error opening the session\r\n");
+ }//else
+ printf("Session opened\r\n");
+ //ask to have an interrupt when the command finish
+ mOnOpenSession=1;
+
+ tag->read(&mMsg);
+ }
+
+ /**
+ * request to close the session
+ * @param tag tag where close the session
+ * @param success true if the message is correctly wrote
+ * @param message wrote
+ */
+ virtual void onMessageRead(NDefLib::NDefNfcTag *tag,bool success,
+ const NDefLib::Message*){
+
+ if(!success)
+ printf("Error Reading tag!\r\n");
+ else{
+ const uint32_t nRecords =mMsg.getNRecords();
+ printf("Read %d records!\r\n",nRecords);
+ for(uint32_t i=0;i<nRecords;i++){
+ if(mMsg[i]->getType()== NDefLib::Record::TYPE_URI){
+ NDefLib::RecordURI *rUri = (NDefLib::RecordURI *)mMsg[i];
+ printf("UriType: %x\r\nUriContent: %s\r\n",
+ rUri->getUriId(),
+ rUri->getContent().c_str());
+ }//if
+ }//for
+ NDefLib::Message::removeAndDeleteAllRecord(mMsg);
+ mOnRead=1;
+ }//if-else
+ tag->closeSession();
+ }
+
+ /**
+ * switch on the led
+ * @param tag where the session is closed
+ * @param success true if the session is correctly close
+ */
+ virtual void onSessionClose(NDefLib::NDefNfcTag*,bool success){
+ if(success){
+ printf("Session closed\r\n");
mOnCloseSession=1;
}else
printf("Error opening the session\r\n");
@@ -113,17 +212,16 @@
};
-/** variable set to true when we receive an interrupt from the nfc component*/
-static bool nfcInterruptFlag;
-/** Nfc ISR called when the nfc component has a message ready*/
-static void nfcInterruptCallback(){
- nfcInterruptFlag=true;
-}//nfcInterruptCallback
int main(int argc,char *args[]){
(void)argc; (void)args;
+#if defined(TARGET_STM)
+ InterruptIn userButton(USER_BUTTON);
+ userButton.fall(setButtonPress);
+#endif
+
//create the nfc component
I2C i2cChannel(X_NUCLEO_NFC01A1::DEFAULT_SDA_PIN,X_NUCLEO_NFC01A1::DEFAULT_SDL_PIN);
X_NUCLEO_NFC01A1 *nfcNucleo = X_NUCLEO_NFC01A1::Instance(i2cChannel,&nfcInterruptCallback,
@@ -139,8 +237,9 @@
printf("System Init done!\n\r");
//crate the callback to use for write a tag
- WriteUriCallbacks NDefCallback(nfcNucleo->getLed1(),nfcNucleo->getLed2(),nfcNucleo->getLed3());
- tag.setCallback(&NDefCallback); //set the callback
+ WriteUriCallbacks NDefWriteCallback(nfcNucleo->getLed1(),nfcNucleo->getLed2(),nfcNucleo->getLed3());
+ ReadUriCallbacks NDefReadCallback(nfcNucleo->getLed1(),nfcNucleo->getLed2(),nfcNucleo->getLed3());
+ tag.setCallback(&NDefWriteCallback); //set the callback
tag.openSession(); //start the callback chain
printf("Start Main Loop\n\r");
@@ -151,6 +250,14 @@
nfcNucleo->getM24SR().ManageEvent();
}//if
+#if defined(TARGET_STM)
+ if(buttonPress){
+ buttonPress=false;
+ printf("Pressed");
+ tag.setCallback(&NDefReadCallback);
+ tag.openSession();
+ }
+#endif
__WFE();
}//while
