![](/media/cache/group/ST_logo_2020_blue_V_cmyk.jpg.50x50_q85.jpg)
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:
- 7:cd34abf10350
- Parent:
- 6:01e1182e2320
- Child:
- 9:ed8eff7c4cf4
diff -r 01e1182e2320 -r cd34abf10350 main.cpp --- a/main.cpp Thu May 18 14:37:39 2017 +0000 +++ b/main.cpp Wed Jul 12 15:51:19 2017 +0000 @@ -1,6 +1,6 @@ /** ****************************************************************************** - * @file Sample_async.cpp + * @file main.cpp * @date 22/01/2016 * @brief Test the async comunication api ****************************************************************************** @@ -33,10 +33,12 @@ */ #include "mbed.h" - #include "XNucleoNFC01A1.h" +#include "ReadUriCallbacks.h" +#include "WriteUriCallbacks.h" #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; @@ -45,175 +47,15 @@ static volatile bool buttonPress=false; /** Nfc ISR called when the nfc component has a message ready*/ -static void nfc_interrupt_callback(){ +static void nfc_interrupt_callback() { nfcInterruptFlag=true; }//nfcInterruptCallback -static void set_button_press(){ +static void set_button_press() { 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 - */ -class WriteUriCallbacks : public NDefLib::NDefNfcTag::Callbacks{ - - DigitalOut &mOnOpenSession; - DigitalOut &mOnWrite; - DigitalOut &mOnCloseSession; - NDefLib::Message msg; - -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 - */ - WriteUriCallbacks(DigitalOut &onOpenSession,DigitalOut &onWrite, - DigitalOut &onCloseSession):mOnOpenSession(onOpenSession), - mOnWrite(onWrite),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 on_session_open(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; - - NDefLib::RecordURI rUri(NDefLib::RecordURI::HTTP_WWW,"http://www.st.com"); - msg.add_record(&rUri); - - tag->write(msg); - } - - /** - * 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 on_message_write(NDefLib::NDefNfcTag *tag,bool success, - const NDefLib::Message&){ - - if(!success) - printf("Error writing tag!\r\n"); - else{ - printf("Tag written!\r\n"); - mOnWrite=1; - }//if-else - tag->close_session(); - } - - /** - * switch on the led - * @param tag where the session is closed - * @param success true if the session is correctly close - */ - virtual void on_session_close(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 on_session_open(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 on_message_read(NDefLib::NDefNfcTag *tag,bool success, - const NDefLib::Message*){ - - if(!success) - printf("Error Reading tag!\r\n"); - else{ - const uint32_t nRecords =mMsg.get_N_records(); - printf("Read %d records!\r\n",nRecords); - for(uint32_t i=0;i<nRecords;i++){ - if(mMsg[i]->get_type()== NDefLib::Record::TYPE_URI){ - NDefLib::RecordURI *rUri = (NDefLib::RecordURI *)mMsg[i]; - printf("UriType: %x\r\nUriContent: %s\r\n", - rUri->get_uri_id(), - rUri->get_content().c_str()); - }//if - }//for - NDefLib::Message::remove_and_delete_all_record(mMsg); - mOnRead=1; - }//if-else - tag->close_session(); - } - - /** - * switch on the led - * @param tag where the session is closed - * @param success true if the session is correctly close - */ - virtual void on_session_close(NDefLib::NDefNfcTag*,bool success){ - if(success){ - printf("Session closed\r\n"); - mOnCloseSession=1; - }else - printf("Error opening the session\r\n"); - } - -}; - - -int main(int argc,char *args[]){ +int main(int argc,char *args[]) { (void)argc; (void)args; #if defined(TARGET_STM) @@ -225,9 +67,9 @@ I2C i2cChannel(XNucleoNFC01A1::DEFAULT_SDA_PIN,XNucleoNFC01A1::DEFAULT_SDL_PIN); XNucleoNFC01A1 *nfcNucleo = XNucleoNFC01A1::instance(i2cChannel,&nfc_interrupt_callback, - XNucleoNFC01A1::DEFAULT_GPO_PIN,XNucleoNFC01A1::DEFAULT_RF_DISABLE_PIN, - XNucleoNFC01A1::DEFAULT_LED1_PIN,XNucleoNFC01A1::DEFAULT_LED2_PIN, - XNucleoNFC01A1::DEFAULT_LED3_PIN); + XNucleoNFC01A1::DEFAULT_GPO_PIN,XNucleoNFC01A1::DEFAULT_RF_DISABLE_PIN, + XNucleoNFC01A1::DEFAULT_LED1_PIN,XNucleoNFC01A1::DEFAULT_LED2_PIN, + XNucleoNFC01A1::DEFAULT_LED3_PIN); //No call back needed since default behavior is sync nfcNucleo->get_M24SR().get_session(); @@ -243,15 +85,14 @@ tag.open_session(); //start the callback chain printf("Start Main Loop\n\r"); - while(true){ - if(nfcInterruptFlag){ + while(true) { + if (nfcInterruptFlag) { nfcInterruptFlag=false; //manage an async event from the nfc component nfcNucleo->get_M24SR().manage_event(); - }//if #if defined(TARGET_STM) - if(buttonPress){ + if (buttonPress) { buttonPress=false; printf("Pressed"); tag.set_callback(&NDefReadCallback); @@ -262,4 +103,4 @@ }//while //return 0; -} \ No newline at end of file +}