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.

Files at this revision

API Documentation at this revision

Comitter:
giovannivisentini
Date:
Wed Aug 31 11:18:55 2016 +0000
Parent:
3:27f21d756e9f
Child:
5:adf7d29c9431
Commit message:
add a read example

Changed in this revision

NDefLib.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- a/NDefLib.lib	Wed Feb 03 10:21:48 2016 +0000
+++ b/NDefLib.lib	Wed Aug 31 11:18:55 2016 +0000
@@ -1,1 +1,1 @@
-https://developer.mbed.org/teams/ST/code/NDefLib/#030e7ffdf512
+https://developer.mbed.org/teams/ST/code/NDefLib/#46899fa3d9f2
--- 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
 
--- a/mbed.bld	Wed Feb 03 10:21:48 2016 +0000
+++ b/mbed.bld	Wed Aug 31 11:18:55 2016 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/mbed_official/code/mbed/builds/6f327212ef96
\ No newline at end of file
+http://mbed.org/users/mbed_official/code/mbed/builds/2241e3a39974
\ No newline at end of file