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 ST Expansion SW Team

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.

Revision:
7:cd34abf10350
Parent:
6:01e1182e2320
Child:
9:ed8eff7c4cf4
--- 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
+}