M2M im2ag M2PGI
Dependencies: mbed X_NUCLEO_NFC01A1 NDefLib
Revision 9:3e718f4a0fbc, committed 2016-03-22
- Comitter:
- Bayle38
- Date:
- Tue Mar 22 14:26:10 2016 +0000
- Parent:
- 8:ccf083f26f3a
- Commit message:
- Asynchronous !!!!
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r ccf083f26f3a -r 3e718f4a0fbc main.cpp --- 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