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:
Davidroid
Date:
Wed Jul 12 15:51:19 2017 +0000
Parent:
6:01e1182e2320
Child:
8:d398c0ab9103
Commit message:
Updated to fit ARM mbed coding style.

Changed in this revision

NDefLib.lib Show annotated file Show diff for this revision Revisions of this file
ReadUriCallbacks.h Show annotated file Show diff for this revision Revisions of this file
WriteUriCallbacks.h Show annotated file Show diff for this revision Revisions of this file
X_NUCLEO_NFC01A1.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	Thu May 18 14:37:39 2017 +0000
+++ b/NDefLib.lib	Wed Jul 12 15:51:19 2017 +0000
@@ -1,1 +1,1 @@
-https://developer.mbed.org/teams/ST/code/NDefLib/#13d84b136a62
+https://developer.mbed.org/teams/ST/code/NDefLib/#31f727872290
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ReadUriCallbacks.h	Wed Jul 12 15:51:19 2017 +0000
@@ -0,0 +1,120 @@
+/**
+  ******************************************************************************
+  * @file       ReadUriCallbacks.cpp
+  * @date       12/07/2017
+  * @brief      Class to read and print a URI tag.
+  ******************************************************************************
+  *
+  * COPYRIGHT(c) 2017 STMicroelectronics
+  *
+  * Redistribution and use in source and binary forms, with or without modification,
+  * are permitted provided that the following conditions are met:
+  *   1. Redistributions of source code must retain the above copyright notice,
+  *      this list of conditions and the following disclaimer.
+  *   2. Redistributions in binary form must reproduce the above copyright notice,
+  *      this list of conditions and the following disclaimer in the documentation
+  *      and/or other materials provided with the distribution.
+  *   3. Neither the name of STMicroelectronics nor the names of its contributors
+  *      may be used to endorse or promote products derived from this software
+  *      without specific prior written permission.
+  *
+  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+  *
+  ******************************************************************************
+  */
+
+#include "mbed.h"
+#include "NDefLib/RecordType/RecordURI.h"
+
+/**
+ * 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");
+        }
+    }
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WriteUriCallbacks.h	Wed Jul 12 15:51:19 2017 +0000
@@ -0,0 +1,111 @@
+/**
+  ******************************************************************************
+  * @file       WriteUriCallbacks.h
+  * @date       12/07/2017
+  * @brief      Class to write a URI tag.
+  ******************************************************************************
+  *
+  * COPYRIGHT(c) 2017 STMicroelectronics
+  *
+  * Redistribution and use in source and binary forms, with or without modification,
+  * are permitted provided that the following conditions are met:
+  *   1. Redistributions of source code must retain the above copyright notice,
+  *      this list of conditions and the following disclaimer.
+  *   2. Redistributions in binary form must reproduce the above copyright notice,
+  *      this list of conditions and the following disclaimer in the documentation
+  *      and/or other materials provided with the distribution.
+  *   3. Neither the name of STMicroelectronics nor the names of its contributors
+  *      may be used to endorse or promote products derived from this software
+  *      without specific prior written permission.
+  *
+  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+  *
+  ******************************************************************************
+  */
+
+#include "mbed.h"
+#include "NDefLib/RecordType/RecordURI.h"
+ 
+/**
+ * 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");
+        }
+    }
+};
--- a/X_NUCLEO_NFC01A1.lib	Thu May 18 14:37:39 2017 +0000
+++ b/X_NUCLEO_NFC01A1.lib	Wed Jul 12 15:51:19 2017 +0000
@@ -1,1 +1,1 @@
-https://developer.mbed.org/teams/ST/code/X_NUCLEO_NFC01A1/#85fdf6fd3da5
+https://developer.mbed.org/teams/ST/code/X_NUCLEO_NFC01A1/#b76765d2cc68
--- 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
+}
--- a/mbed.bld	Thu May 18 14:37:39 2017 +0000
+++ b/mbed.bld	Wed Jul 12 15:51:19 2017 +0000
@@ -1,1 +1,1 @@
-https://mbed.org/users/mbed_official/code/mbed/builds/4eea097334d6
\ No newline at end of file
+https://mbed.org/users/mbed_official/code/mbed/builds/22da6e220af6
\ No newline at end of file