M2M im2ag M2PGI

Dependencies:   mbed X_NUCLEO_NFC01A1 NDefLib

Revision:
9:3e718f4a0fbc
Parent:
8:ccf083f26f3a
--- a/main.cpp	Tue Mar 22 14:19:59 2016 +0000
+++ b/main.cpp	Tue Mar 22 14:26:10 2016 +0000
@@ -11,6 +11,87 @@
 /**
  * Write a Ndef URI message linking to st.com site.
  */
+ 
+ 
+class WriteUriCallbacks : public NDefLib::NDefNfcTag::Callbacks{
+ 
+    DigitalOut &mOnOpenSession;
+    DigitalOut &mOnWrite;
+    DigitalOut &mOnCloseSession;
+ 
+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 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;
+        NDefLib::Message msg;
+ 
+        NDefLib::RecordURI rUri(NDefLib::RecordURI::HTTP_WWW,"http://www.st.com");
+        msg.addRecord(&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 onMessageWrite(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->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("Error closing the session\r\n");
+            mOnCloseSession=1;
+        }else
+            printf("Error opening the session\r\n");
+    }
+ 
+};
+ 
+/** 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
+ 
 void init(){
     pc.baud(115200);
     pc.format(8,SerialBase::None, 1);
@@ -19,70 +100,38 @@
 void tagDetect(){
     pc.printf("Detected !!! \n");
 } 
-
-int main(void){
-    init();
-    pc.printf("System Init now !\n");
-    myled = 0; // LED is OFF
-    
-    //use default board pinout
+int main(int argc,char *args[]){
+    (void)argc; (void)args;
+ 
+    //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,NULL,
+    X_NUCLEO_NFC01A1 *nfcNucleo = X_NUCLEO_NFC01A1::Instance(i2cChannel,&nfcInterruptCallback,
             X_NUCLEO_NFC01A1::DEFAULT_GPO_PIN,X_NUCLEO_NFC01A1::DEFAULT_RF_DISABLE_PIN,
             X_NUCLEO_NFC01A1::DEFAULT_LED1_PIN,X_NUCLEO_NFC01A1::DEFAULT_LED2_PIN,
             X_NUCLEO_NFC01A1::DEFAULT_LED3_PIN);
-    nfcNucleo->getLed1()=0;
-    nfcNucleo->getM24SR().ManageI2CGPO(I2C_ANSWER_READY);
-    
-    //retrieve the NdefLib interface
-    NDefLib::NDefNfcTag& tag =nfcNucleo->getM24SR().getNDefTag();
-    printf("System Init done: !\n");
-    
-    //open the i2c session with the nfc chip
-    if(tag.openSession()){
-        printf("Session opened\n");
-        interrupt.fall(&tagDetect);
-
-        nfcNucleo->getLed1()=1;
-        
-        //create the NDef message and record
-        NDefLib::Message msg;
-        NDefLib::RecordURI rUri(NDefLib::RecordURI::HTTP_WWW,"st.com");
-        msg.addRecord(&rUri);
-
-        //write the tag
-        if(tag.write(msg)){
-            printf("Tag written\n");
-            nfcNucleo->getLed2()=1;
-            
-        }else{
-            printf("Error writing \n");
-        }//if-else
-        NDefLib::Message message;
-        while(!tag.read(&message)){
-        }
-        
-        
-        uint8_t buffer[64];
-        buffer[0]=0;
-        buffer[1]=3;
-        
-        message.write(buffer);
-        buffer[63]=0;
-        for(int i=0; i< 63; i++){
-            printf("%c",buffer[i]);
-        }
-        printf("\n");
-        //close the i2c session
-        if(tag.closeSession()){
-           myled = 1; // LED is ON
-           printf("Session closed\n");
-           nfcNucleo->getLed3()=1;
-        }else{
-           printf("Error closing the session\n");
-        }//if-else
-            
-    }else
-        printf("Error opening the session\n");
-    
+ 
+    //No call back needed since default behavior is sync
+    nfcNucleo->getM24SR().GetSession();
+    nfcNucleo->getM24SR().ManageI2CGPO(I2C_ANSWER_READY); //switch to async mode
+ 
+    NDefLib::NDefNfcTag &tag = nfcNucleo->getM24SR().getNDefTag();
+    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
+    tag.openSession(); //start the callback chain
+ 
+    printf("Start Main Loop\n\r");
+    while(true){
+        if(nfcInterruptFlag){
+            nfcInterruptFlag=false;
+            //manage an async event from the nfc component
+            nfcNucleo->getM24SR().ManageEvent();
+ 
+        }//if
+        __WFE();
+    }//while
+ 
+    //return 0;
 }
\ No newline at end of file