This application provides a set of demos with X-NUCLEO-NFC01A1 expansion board.

Dependencies:   NDefLib X_NUCLEO_NFC01A1 mbed

Fork of X-MBED-NFC1 by Giovanni Visentini

This application provides a set of demos with X-NUCLEO-NFC01A1 expansion board.

The available demos are:

  • SAMPLE_WRITE_URL: write a tag with the ST home page URL
  • SAMPLE_COUNT_CLICK: create a custom tag to count and report the user button clicks.
  • SAMPLE_WRITE_AND_CHANGE_ALL: write a tag with all the supported records and update the tag contents when the user button is pressed.
  • SAMPLE_LOCK_TAG_CONTENT: use the M24SR component API to set the NFC tag as read-only.

To enable the different demos comment/uncomment the SAMPLE_* macros provided in main.cpp .

Committer:
giovannivisentini
Date:
Thu Dec 03 13:44:40 2015 +0000
Revision:
4:f40b3505070c
Child:
5:3b300c8235b7
move the driver file in a separate library + split the sample in different files

Who changed what in which revision?

UserRevisionLine numberNew contents of line
giovannivisentini 4:f40b3505070c 1 #include "mbed.h"
giovannivisentini 4:f40b3505070c 2
giovannivisentini 4:f40b3505070c 3 #include "Type4NfcTagSTM24SR.h"
giovannivisentini 4:f40b3505070c 4
giovannivisentini 4:f40b3505070c 5 #include "NDefLib/RecordType/RecordAAR.h"
giovannivisentini 4:f40b3505070c 6 #include "NDefLib/RecordType/RecordSMS.h"
giovannivisentini 4:f40b3505070c 7 #include "NDefLib/RecordType/RecordGeo.h"
giovannivisentini 4:f40b3505070c 8 #include "NDefLib/RecordType/RecordURI.h"
giovannivisentini 4:f40b3505070c 9 #include "NDefLib/RecordType/RecordMail.h"
giovannivisentini 4:f40b3505070c 10 #include "NDefLib/RecordType/RecordText.h"
giovannivisentini 4:f40b3505070c 11 #include "NDefLib/RecordType/RecordMimeType.h"
giovannivisentini 4:f40b3505070c 12 #include "NDefLib/RecordType/RecordVCard.h"
giovannivisentini 4:f40b3505070c 13
giovannivisentini 4:f40b3505070c 14 #include "X_NUCLEO_NFC01A1.h"
giovannivisentini 4:f40b3505070c 15
giovannivisentini 4:f40b3505070c 16 static Serial pc(SERIAL_TX, SERIAL_RX);
giovannivisentini 4:f40b3505070c 17
giovannivisentini 4:f40b3505070c 18 static void shiftLed(DigitalOut &led1,DigitalOut &led2,DigitalOut &led3){
giovannivisentini 4:f40b3505070c 19 const uint8_t prevLed1=led1;
giovannivisentini 4:f40b3505070c 20 const uint8_t prevLed2=led2;
giovannivisentini 4:f40b3505070c 21 const uint8_t prevLed3=led3;
giovannivisentini 4:f40b3505070c 22 led1=prevLed3;
giovannivisentini 4:f40b3505070c 23 led2=prevLed1;
giovannivisentini 4:f40b3505070c 24 led3=prevLed2;
giovannivisentini 4:f40b3505070c 25 }
giovannivisentini 4:f40b3505070c 26
giovannivisentini 4:f40b3505070c 27 static void setNFCTag(NDefLib::Type4NfcTag &tag){
giovannivisentini 4:f40b3505070c 28
giovannivisentini 4:f40b3505070c 29 bool writeStatus,closeStatus;
giovannivisentini 4:f40b3505070c 30 if(tag.openSession()){
giovannivisentini 4:f40b3505070c 31 NDefLib::Message msg;
giovannivisentini 4:f40b3505070c 32
giovannivisentini 4:f40b3505070c 33 NDefLib::RecordAAR rAAR("com.st.BlueMS");
giovannivisentini 4:f40b3505070c 34 msg.addRecord(&rAAR);
giovannivisentini 4:f40b3505070c 35
giovannivisentini 4:f40b3505070c 36 NDefLib::RecordSMS rSMS("123456789","st.com.BlueMS");
giovannivisentini 4:f40b3505070c 37 msg.addRecord(&rSMS);
giovannivisentini 4:f40b3505070c 38
giovannivisentini 4:f40b3505070c 39 NDefLib::RecordGeo rGeo(123.123,-456.789);
giovannivisentini 4:f40b3505070c 40 msg.addRecord(&rGeo);
giovannivisentini 4:f40b3505070c 41
giovannivisentini 4:f40b3505070c 42 NDefLib::RecordURI rUri(NDefLib::RecordURI::HTTP_WWW,"http://www.st.com");
giovannivisentini 4:f40b3505070c 43 msg.addRecord(&rUri);
giovannivisentini 4:f40b3505070c 44
giovannivisentini 4:f40b3505070c 45 NDefLib::RecordMail rMail("mail@st.com","ciao","da nfc tag");
giovannivisentini 4:f40b3505070c 46 msg.addRecord(&rMail);
giovannivisentini 4:f40b3505070c 47
giovannivisentini 4:f40b3505070c 48 NDefLib::RecordMimeType rText1("text/plain",(const uint8_t*)"ciao",4);
giovannivisentini 4:f40b3505070c 49 msg.addRecord(&rText1);
giovannivisentini 4:f40b3505070c 50
giovannivisentini 4:f40b3505070c 51 NDefLib::RecordText rText3(NDefLib::RecordText::UTF8,"it","ciao");
giovannivisentini 4:f40b3505070c 52 msg.addRecord(&rText3);
giovannivisentini 4:f40b3505070c 53
giovannivisentini 4:f40b3505070c 54 NDefLib::RecordVCard::VCardInfo_t cardInfo;
giovannivisentini 4:f40b3505070c 55 cardInfo[NDefLib::RecordVCard::FORMATTED_NAME]="prova prova1";
giovannivisentini 4:f40b3505070c 56 cardInfo[NDefLib::RecordVCard::ADDRESS_HOME]=";;1 Main St.;Springfield;IL;12345;USA";
giovannivisentini 4:f40b3505070c 57 cardInfo[NDefLib::RecordVCard::ADDRESS_WORK]=";;2 Main St.;Springfield;IL;12345;USA";
giovannivisentini 4:f40b3505070c 58 cardInfo[NDefLib::RecordVCard::EMAIL_WORK]="workmail@st.com";
giovannivisentini 4:f40b3505070c 59 cardInfo[NDefLib::RecordVCard::EMAIL_HOME]="homemail@st.com";
giovannivisentini 4:f40b3505070c 60 cardInfo[NDefLib::RecordVCard::GEO]="39.95;-75.1667";
giovannivisentini 4:f40b3505070c 61 cardInfo[NDefLib::RecordVCard::IMPP]="aim:johndoe@aol.com";
giovannivisentini 4:f40b3505070c 62 cardInfo[NDefLib::RecordVCard::NAME]="prova2;prova3";
giovannivisentini 4:f40b3505070c 63 cardInfo[NDefLib::RecordVCard::NICKNAME]="test";
giovannivisentini 4:f40b3505070c 64 cardInfo[NDefLib::RecordVCard::NOTE]="A good test";
giovannivisentini 4:f40b3505070c 65 cardInfo[NDefLib::RecordVCard::ORGANIZATION]="STM";
giovannivisentini 4:f40b3505070c 66 cardInfo[NDefLib::RecordVCard::TEL_HOME]="123";
giovannivisentini 4:f40b3505070c 67 cardInfo[NDefLib::RecordVCard::TEL_MOBILE]="456";
giovannivisentini 4:f40b3505070c 68 cardInfo[NDefLib::RecordVCard::TEL_WORK]="789";
giovannivisentini 4:f40b3505070c 69 cardInfo[NDefLib::RecordVCard::TITLE]="King";
giovannivisentini 4:f40b3505070c 70 cardInfo[NDefLib::RecordVCard::URL]="www.st.com";
giovannivisentini 4:f40b3505070c 71 cardInfo[NDefLib::RecordVCard::PHOTO_URI]="http://www.st.com/st-web-ui/static/active/en/fragment/multimedia/image/picture/customer_focus.jpg";
giovannivisentini 4:f40b3505070c 72 NDefLib::RecordVCard rVCard(cardInfo);
giovannivisentini 4:f40b3505070c 73 msg.addRecord(&rVCard);
giovannivisentini 4:f40b3505070c 74
giovannivisentini 4:f40b3505070c 75 writeStatus = tag.write(msg);
giovannivisentini 4:f40b3505070c 76
giovannivisentini 4:f40b3505070c 77 closeStatus = tag.closeSession();
giovannivisentini 4:f40b3505070c 78
giovannivisentini 4:f40b3505070c 79 }else
giovannivisentini 4:f40b3505070c 80 pc.printf("Error open Session\n\r");
giovannivisentini 4:f40b3505070c 81
giovannivisentini 4:f40b3505070c 82 if(writeStatus)
giovannivisentini 4:f40b3505070c 83 pc.printf("writeOk\n\r");
giovannivisentini 4:f40b3505070c 84 else
giovannivisentini 4:f40b3505070c 85 pc.printf("writeFail\n\r");
giovannivisentini 4:f40b3505070c 86
giovannivisentini 4:f40b3505070c 87 if(closeStatus)
giovannivisentini 4:f40b3505070c 88 pc.printf("closeOk\n\r");
giovannivisentini 4:f40b3505070c 89 else
giovannivisentini 4:f40b3505070c 90 pc.printf("CloseFail\n\r");
giovannivisentini 4:f40b3505070c 91 }
giovannivisentini 4:f40b3505070c 92
giovannivisentini 4:f40b3505070c 93 static void printRecord(NDefLib::Record *r){
giovannivisentini 4:f40b3505070c 94 using namespace NDefLib;
giovannivisentini 4:f40b3505070c 95 switch(r->getType()){
giovannivisentini 4:f40b3505070c 96 case Record::TYPE_TEXT: {
giovannivisentini 4:f40b3505070c 97 RecordText *temp = (RecordText*)r;
giovannivisentini 4:f40b3505070c 98 pc.printf("Read Text: %s\r\n",temp->getText().c_str());
giovannivisentini 4:f40b3505070c 99 break; }
giovannivisentini 4:f40b3505070c 100 case Record::TYPE_AAR:{
giovannivisentini 4:f40b3505070c 101 RecordAAR *temp = (RecordAAR*)r;
giovannivisentini 4:f40b3505070c 102 pc.printf("Read ARR: %s\r\n",temp->getPackage().c_str());
giovannivisentini 4:f40b3505070c 103 break; }
giovannivisentini 4:f40b3505070c 104 case Record::TYPE_MIME:{
giovannivisentini 4:f40b3505070c 105 RecordMimeType *temp = (RecordMimeType*)r;
giovannivisentini 4:f40b3505070c 106 pc.printf("Read mimeType: %s\r\n",temp->getMimeType().c_str());
giovannivisentini 4:f40b3505070c 107 pc.printf("Read mimeData: %s\r\n",
giovannivisentini 4:f40b3505070c 108 std::string((const char*)temp->getMimeData(),
giovannivisentini 4:f40b3505070c 109 temp->getMimeDataLenght()).c_str());
giovannivisentini 4:f40b3505070c 110 break;}
giovannivisentini 4:f40b3505070c 111 case Record::TYPE_URI:{
giovannivisentini 4:f40b3505070c 112 RecordURI *temp = (RecordURI*)r;
giovannivisentini 4:f40b3505070c 113 pc.printf("Read uriId: %d\r\n",temp->getUriId());
giovannivisentini 4:f40b3505070c 114 pc.printf("Read uriType: %s\r\n",temp->getUriType().c_str());
giovannivisentini 4:f40b3505070c 115 pc.printf("Read uriContent: %s\r\n",temp->getContent().c_str());
giovannivisentini 4:f40b3505070c 116 break;}
giovannivisentini 4:f40b3505070c 117 case Record::TYPE_URI_MAIL:{
giovannivisentini 4:f40b3505070c 118 RecordMail *temp = (RecordMail*)r;
giovannivisentini 4:f40b3505070c 119 pc.printf("Read Dest: %s\r\n",temp->getToAddress().c_str());
giovannivisentini 4:f40b3505070c 120 pc.printf("Read Subject: %s\r\n",temp->getSubject().c_str());
giovannivisentini 4:f40b3505070c 121 pc.printf("Read Body: %s\r\n",temp->getBody().c_str());
giovannivisentini 4:f40b3505070c 122 break;}
giovannivisentini 4:f40b3505070c 123 case Record::TYPE_URI_SMS:{
giovannivisentini 4:f40b3505070c 124 RecordSMS *temp = (RecordSMS*)r;
giovannivisentini 4:f40b3505070c 125 pc.printf("Read number: %s\r\n",temp->getNumber().c_str());
giovannivisentini 4:f40b3505070c 126 pc.printf("Read message: %s\r\n",temp->getMessagge().c_str());
giovannivisentini 4:f40b3505070c 127 break;}
giovannivisentini 4:f40b3505070c 128 case Record::TYPE_URI_GEOLOCATION:{
giovannivisentini 4:f40b3505070c 129 RecordGeo *temp = (RecordGeo*)r;
giovannivisentini 4:f40b3505070c 130 pc.printf("Read lat: %f\r\n",temp->getLatitude());
giovannivisentini 4:f40b3505070c 131 pc.printf("Read long: %f\r\n",temp->getLongitude());
giovannivisentini 4:f40b3505070c 132 break;}
giovannivisentini 4:f40b3505070c 133 case Record::TYPE_MIME_VCARD:{
giovannivisentini 4:f40b3505070c 134 const RecordVCard *temp = (RecordVCard*)r;
giovannivisentini 4:f40b3505070c 135 pc.printf("Read Name: %s\r\n",(*temp)[RecordVCard::NAME].c_str());
giovannivisentini 4:f40b3505070c 136 pc.printf("Read Mail: %s\r\n",(*temp)[RecordVCard::EMAIL_WORK].c_str());
giovannivisentini 4:f40b3505070c 137 pc.printf("Read ORG: %s\r\n",(*temp)[RecordVCard::ORGANIZATION].c_str());
giovannivisentini 4:f40b3505070c 138 break;}
giovannivisentini 4:f40b3505070c 139 case Record::TYPE_UNKNOWN:{
giovannivisentini 4:f40b3505070c 140 pc.printf("Unknown record\r\n");
giovannivisentini 4:f40b3505070c 141 break;}
giovannivisentini 4:f40b3505070c 142 }//switch
giovannivisentini 4:f40b3505070c 143 }
giovannivisentini 4:f40b3505070c 144
giovannivisentini 4:f40b3505070c 145 static void changeRecord(NDefLib::Record *r){
giovannivisentini 4:f40b3505070c 146 using namespace NDefLib;
giovannivisentini 4:f40b3505070c 147 switch(r->getType()){
giovannivisentini 4:f40b3505070c 148 case Record::TYPE_TEXT: {
giovannivisentini 4:f40b3505070c 149 RecordText *temp = (RecordText*)r;
giovannivisentini 4:f40b3505070c 150 temp->setText("CIAOCiao");
giovannivisentini 4:f40b3505070c 151 break; }
giovannivisentini 4:f40b3505070c 152 case Record::TYPE_AAR:{
giovannivisentini 4:f40b3505070c 153 RecordAAR *temp = (RecordAAR*)r;
giovannivisentini 4:f40b3505070c 154 temp->setPackage("set Package Ok");
giovannivisentini 4:f40b3505070c 155 break; }
giovannivisentini 4:f40b3505070c 156 case Record::TYPE_MIME:{
giovannivisentini 4:f40b3505070c 157 RecordMimeType *temp = (RecordMimeType*)r;
giovannivisentini 4:f40b3505070c 158 temp->copyMimeData((const uint8_t *)"String2",sizeof("String2"));
giovannivisentini 4:f40b3505070c 159 break;}
giovannivisentini 4:f40b3505070c 160 case Record::TYPE_URI:{
giovannivisentini 4:f40b3505070c 161 RecordURI *temp = (RecordURI*)r;
giovannivisentini 4:f40b3505070c 162 temp->setContent("google.it");
giovannivisentini 4:f40b3505070c 163 break;}
giovannivisentini 4:f40b3505070c 164 case Record::TYPE_URI_MAIL:{
giovannivisentini 4:f40b3505070c 165 RecordMail *temp = (RecordMail*)r;
giovannivisentini 4:f40b3505070c 166 temp->setToAddress("newMail@st.com");
giovannivisentini 4:f40b3505070c 167 temp->setSubject("tag change");
giovannivisentini 4:f40b3505070c 168 temp->setBody("read/change Works!");
giovannivisentini 4:f40b3505070c 169 break;}
giovannivisentini 4:f40b3505070c 170 case Record::TYPE_URI_SMS:{
giovannivisentini 4:f40b3505070c 171 RecordSMS *temp = (RecordSMS*)r;
giovannivisentini 4:f40b3505070c 172 temp->setMessage("Message Change");
giovannivisentini 4:f40b3505070c 173 temp->setNumber("0987654321");
giovannivisentini 4:f40b3505070c 174 break;}
giovannivisentini 4:f40b3505070c 175 case Record::TYPE_URI_GEOLOCATION:{
giovannivisentini 4:f40b3505070c 176 RecordGeo *temp = (RecordGeo*)r;
giovannivisentini 4:f40b3505070c 177 temp->setLatitude(-temp->getLatitude());
giovannivisentini 4:f40b3505070c 178 temp->setLongitude(-temp->getLongitude());
giovannivisentini 4:f40b3505070c 179 break;}
giovannivisentini 4:f40b3505070c 180 case Record::TYPE_MIME_VCARD:{
giovannivisentini 4:f40b3505070c 181 RecordVCard *temp = (RecordVCard*)r;
giovannivisentini 4:f40b3505070c 182 (*temp)[RecordVCard::NAME]="name change";
giovannivisentini 4:f40b3505070c 183 (*temp)[RecordVCard::NICKNAME]="nic change";
giovannivisentini 4:f40b3505070c 184 break;}
giovannivisentini 4:f40b3505070c 185 case Record::TYPE_UNKNOWN:{
giovannivisentini 4:f40b3505070c 186 pc.printf("Unknown record\r\n");
giovannivisentini 4:f40b3505070c 187 break;}
giovannivisentini 4:f40b3505070c 188 }//switch
giovannivisentini 4:f40b3505070c 189 }
giovannivisentini 4:f40b3505070c 190
giovannivisentini 4:f40b3505070c 191 static void readNfcTag(NDefLib::Type4NfcTag &tag){
giovannivisentini 4:f40b3505070c 192 using namespace NDefLib;
giovannivisentini 4:f40b3505070c 193
giovannivisentini 4:f40b3505070c 194 if(tag.openSession()){
giovannivisentini 4:f40b3505070c 195 NDefLib::Message readMsg;
giovannivisentini 4:f40b3505070c 196
giovannivisentini 4:f40b3505070c 197 tag.read(&readMsg);
giovannivisentini 4:f40b3505070c 198
giovannivisentini 4:f40b3505070c 199 if(readMsg.getNRecords()==0){
giovannivisentini 4:f40b3505070c 200 pc.printf("Error Read\r\n");
giovannivisentini 4:f40b3505070c 201 }else{
giovannivisentini 4:f40b3505070c 202 for(uint32_t i=0;i<readMsg.getNRecords();i++){
giovannivisentini 4:f40b3505070c 203 Record *r = readMsg[i];
giovannivisentini 4:f40b3505070c 204 printRecord(r);
giovannivisentini 4:f40b3505070c 205 delete r;
giovannivisentini 4:f40b3505070c 206 }//for
giovannivisentini 4:f40b3505070c 207 }//if-else
giovannivisentini 4:f40b3505070c 208
giovannivisentini 4:f40b3505070c 209 tag.closeSession();
giovannivisentini 4:f40b3505070c 210 }else{
giovannivisentini 4:f40b3505070c 211 pc.printf("Error open read Session\n\r");
giovannivisentini 4:f40b3505070c 212 }
giovannivisentini 4:f40b3505070c 213 }
giovannivisentini 4:f40b3505070c 214
giovannivisentini 4:f40b3505070c 215
giovannivisentini 4:f40b3505070c 216 static void changeNfcTag(NDefLib::Type4NfcTag &tag){
giovannivisentini 4:f40b3505070c 217 using namespace NDefLib;
giovannivisentini 4:f40b3505070c 218
giovannivisentini 4:f40b3505070c 219 if(tag.openSession()){
giovannivisentini 4:f40b3505070c 220 NDefLib::Message readMsg;
giovannivisentini 4:f40b3505070c 221
giovannivisentini 4:f40b3505070c 222 tag.read(&readMsg);
giovannivisentini 4:f40b3505070c 223
giovannivisentini 4:f40b3505070c 224 if(readMsg.getNRecords()==0){
giovannivisentini 4:f40b3505070c 225 pc.printf("Error Read\r\n");
giovannivisentini 4:f40b3505070c 226 }else{
giovannivisentini 4:f40b3505070c 227 for(uint32_t i=0;i<readMsg.getNRecords();i++){
giovannivisentini 4:f40b3505070c 228 Record *r = readMsg[i];
giovannivisentini 4:f40b3505070c 229 changeRecord(r);
giovannivisentini 4:f40b3505070c 230 }//for
giovannivisentini 4:f40b3505070c 231 tag.write(readMsg);
giovannivisentini 4:f40b3505070c 232 }//if-else
giovannivisentini 4:f40b3505070c 233
giovannivisentini 4:f40b3505070c 234 tag.closeSession();
giovannivisentini 4:f40b3505070c 235 }else{
giovannivisentini 4:f40b3505070c 236 pc.printf("Error open SessionChange\n\r");
giovannivisentini 4:f40b3505070c 237 }
giovannivisentini 4:f40b3505070c 238 }
giovannivisentini 4:f40b3505070c 239
giovannivisentini 4:f40b3505070c 240 static volatile bool buttonPress=false;
giovannivisentini 4:f40b3505070c 241
giovannivisentini 4:f40b3505070c 242 static void setButtonPress(){
giovannivisentini 4:f40b3505070c 243 buttonPress=true;
giovannivisentini 4:f40b3505070c 244 }
giovannivisentini 4:f40b3505070c 245
giovannivisentini 4:f40b3505070c 246 void sample_writeAndChangeAll() {
giovannivisentini 4:f40b3505070c 247 I2C i2cChannel(X_NUCLEO_NFC01A1::DEFAULT_SDA_PIN,X_NUCLEO_NFC01A1::DEFAULT_SDL_PIN);
giovannivisentini 4:f40b3505070c 248 i2cChannel.frequency(400000);
giovannivisentini 4:f40b3505070c 249 DigitalOut nucleoLed(LED1);
giovannivisentini 4:f40b3505070c 250
giovannivisentini 4:f40b3505070c 251 X_NUCLEO_NFC01A1 *nfcNucleo = X_NUCLEO_NFC01A1::Instance(i2cChannel);
giovannivisentini 4:f40b3505070c 252 Type4NfcTagSTM24SR tag(nfcNucleo->getM24SR());
giovannivisentini 4:f40b3505070c 253 InterruptIn mybutton(USER_BUTTON);
giovannivisentini 4:f40b3505070c 254
giovannivisentini 4:f40b3505070c 255 nfcNucleo->getLed1()=1;
giovannivisentini 4:f40b3505070c 256 nfcNucleo->getLed2()=0;
giovannivisentini 4:f40b3505070c 257 nfcNucleo->getLed3()=0;
giovannivisentini 4:f40b3505070c 258
giovannivisentini 4:f40b3505070c 259 setNFCTag(tag);
giovannivisentini 4:f40b3505070c 260 readNfcTag(tag);
giovannivisentini 4:f40b3505070c 261
giovannivisentini 4:f40b3505070c 262 mybutton.fall(setButtonPress);
giovannivisentini 4:f40b3505070c 263
giovannivisentini 4:f40b3505070c 264 while(true) {
giovannivisentini 4:f40b3505070c 265 wait(1);
giovannivisentini 4:f40b3505070c 266 nucleoLed = !nucleoLed;
giovannivisentini 4:f40b3505070c 267 shiftLed(nfcNucleo->getLed1(),nfcNucleo->getLed2(),nfcNucleo->getLed3());
giovannivisentini 4:f40b3505070c 268 if(buttonPress){
giovannivisentini 4:f40b3505070c 269 changeNfcTag(tag);
giovannivisentini 4:f40b3505070c 270 readNfcTag(tag);
giovannivisentini 4:f40b3505070c 271 buttonPress=false;
giovannivisentini 4:f40b3505070c 272 }
giovannivisentini 4:f40b3505070c 273 }
giovannivisentini 4:f40b3505070c 274
giovannivisentini 4:f40b3505070c 275 }