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