Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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 |
--- 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
