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
--- 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