A simple mbed OS application providing an example of asynchronous access to the X-NUCLEO_NFC01A1 Dynamic NFC Tag board.

Dependencies:   NDefLib X_NUCLEO_NFC01A1

Fork of mbed-os-example-NFC01A1 by Nicola Capovilla

The application provides a simple example of asynchronous access to the X-NUCLEO-NFC01A1 Dynamic NFC Tag Expansion Board. It represents the multi-threaded mbed OS 5 version of the mbed classic HelloWorld_Async_NFC01A1 application.
The program writes a URI link to the M24SR dynamic tag using the asynchronous programming model. The URI can then be read and printed on the serial console by pressing the user button and/or via RF from an NFC enabled smartphone/tablet.

Files at this revision

API Documentation at this revision

Comitter:
nikapov
Date:
Thu Aug 10 16:59:44 2017 +0000
Child:
1:951cd8fbff34
Commit message:
First revision

Changed in this revision

.gitignore Show annotated file Show diff for this revision Revisions of this file
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-os.lib Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.gitignore	Thu Aug 10 16:59:44 2017 +0000
@@ -0,0 +1,4 @@
+.build
+.mbed
+projectfiles
+*.py*
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/NDefLib.lib	Thu Aug 10 16:59:44 2017 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/teams/ST/code/NDefLib/#31f727872290
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ReadUriCallbacks.h	Thu Aug 10 16:59:44 2017 +0000
@@ -0,0 +1,123 @@
+/**
+  ******************************************************************************
+  * @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;
+        mOnCloseSession=0;
+        
+        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;
+            mOnOpenSession=0;
+            mOnRead=0;
+        } else {
+            printf("Error opening the session\r\n");
+        }
+    }
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WriteUriCallbacks.h	Thu Aug 10 16:59:44 2017 +0000
@@ -0,0 +1,118 @@
+/**
+  ******************************************************************************
+  * @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;
+        mOnCloseSession=0;
+        
+        NDefLib::RecordURI *rUri = new NDefLib::RecordURI(NDefLib::RecordURI::HTTP_WWW,"http://www.st.com");
+		msg = new NDefLib::Message();
+        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
+			
+		NDefLib::Message::remove_and_delete_all_record(*msg);
+		delete msg;
+        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;
+            mOnOpenSession=0;
+            mOnWrite=0;
+        } else {
+            printf("Error closing the session\r\n");
+        }
+    }
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/X_NUCLEO_NFC01A1.lib	Thu Aug 10 16:59:44 2017 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/teams/ST/code/X_NUCLEO_NFC01A1/#059115ea6ece
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Aug 10 16:59:44 2017 +0000
@@ -0,0 +1,125 @@
+/**
+  ******************************************************************************
+  * @file       main.cpp
+  * @date       22/01/2016
+  * @brief      Test the async comunication api
+  ******************************************************************************
+  *
+  * COPYRIGHT(c) 2015 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 "XNucleoNFC01A1.h"
+#include "ReadUriCallbacks.h"
+#include "WriteUriCallbacks.h"
+#include "NDefNfcTagM24SR.h"
+#include "NDefLib/RecordType/RecordURI.h"
+
+Thread nfcReadThread;
+Thread nfcEventsThread;
+
+/** flag to signal an interrupt from the nfc component*/
+#define NFC_INTERRUPT_FLAG    0x1
+ 
+/** flag to signal user button pressure*/
+#define BUTTON_PRESSED_FLAG   0x2
+
+
+NDefLib::NDefNfcTag *tag;
+
+XNucleoNFC01A1 *nfcNucleo;
+ 
+/** Nfc ISR called when the nfc component has a message ready*/
+static void nfc_interrupt_callback() {
+    nfcEventsThread.signal_set(NFC_INTERRUPT_FLAG);
+}//nfcInterruptCallback
+ 
+static void set_button_press() {
+    nfcReadThread.signal_set(BUTTON_PRESSED_FLAG);    
+}//buttonPressed event
+
+
+void nfcEvents() {
+    
+    while (true) {
+        osEvent event = nfcEventsThread.signal_wait(NFC_INTERRUPT_FLAG); // wait for nfc event
+        printf("Got an NFC event!\n\r");  
+        nfcNucleo->get_M24SR().manage_event();
+    }
+}
+
+void readNfc() {
+    
+    ReadUriCallbacks NDefReadCallback(nfcNucleo->get_led1(),nfcNucleo->get_led2(),nfcNucleo->get_led3());
+    
+    while (true) {
+        osEvent event = nfcReadThread.signal_wait(BUTTON_PRESSED_FLAG); // wait for button pressed
+        printf("Button pressed! Reading the Tag.\n\r");
+        tag->set_callback(&NDefReadCallback);
+        tag->open_session();
+    }
+
+}
+ 
+int main() {
+    
+#if defined(TARGET_STM)
+    InterruptIn userButton(USER_BUTTON);    
+    userButton.fall(set_button_press);
+#endif
+ 
+    //create the nfc component
+    I2C i2cChannel(XNucleoNFC01A1::DEFAULT_SDA_PIN,XNucleoNFC01A1::DEFAULT_SDL_PIN);
+
+    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);
+ 
+    //No call back needed since default behavior is sync
+    nfcNucleo->get_M24SR().get_session();
+    nfcNucleo->get_M24SR().manage_I2C_GPO(M24SR::I2C_ANSWER_READY); //switch to async mode
+ 
+    *tag = nfcNucleo->get_M24SR().get_NDef_tag();
+    printf("System Init done! Starting the threads.\n\r");
+    
+     //Start the nfc event handling thread
+    nfcEventsThread.start(nfcEvents);
+    //Start the button pressed thread
+    nfcReadThread.start(readNfc);
+    
+    printf("Writing Tag\n\r");
+    //create the callback to write a tag
+    WriteUriCallbacks NDefWriteCallback(nfcNucleo->get_led1(),nfcNucleo->get_led2(),nfcNucleo->get_led3());
+    // write the tag
+    tag->open_session(); 
+    
+    while (true) {
+        __WFE();
+    }  
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-os.lib	Thu Aug 10 16:59:44 2017 +0000
@@ -0,0 +1,1 @@
+https://github.com/ARMmbed/mbed-os/#4c256f04596179699c4f14b6863b07cc024ca9be