LEER TAG

Dependents:   NFC_HTM_READ EMULAR_TAGS Escribir_tag NFC_HTM_READ-WRITE

Committer:
mauroar211
Date:
Fri Apr 24 19:02:44 2015 +0000
Revision:
1:a549ef8b142a
SE RESTAURARON LOS ARCHIVO DE LA LIBRER?A;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mauroar211 1:a549ef8b142a 1 #include <NfcAdapter.h>
mauroar211 1:a549ef8b142a 2 #include <PN532_debug.h>
mauroar211 1:a549ef8b142a 3
mauroar211 1:a549ef8b142a 4 NfcAdapter::NfcAdapter(PN532Interface &interface)
mauroar211 1:a549ef8b142a 5 {
mauroar211 1:a549ef8b142a 6 shield = new PN532(interface);
mauroar211 1:a549ef8b142a 7 }
mauroar211 1:a549ef8b142a 8
mauroar211 1:a549ef8b142a 9 NfcAdapter::~NfcAdapter(void)
mauroar211 1:a549ef8b142a 10 {
mauroar211 1:a549ef8b142a 11 delete shield;
mauroar211 1:a549ef8b142a 12 }
mauroar211 1:a549ef8b142a 13
mauroar211 1:a549ef8b142a 14 void NfcAdapter::begin()
mauroar211 1:a549ef8b142a 15 {
mauroar211 1:a549ef8b142a 16 shield->begin();
mauroar211 1:a549ef8b142a 17
mauroar211 1:a549ef8b142a 18 uint32_t versiondata = shield->getFirmwareVersion();
mauroar211 1:a549ef8b142a 19 if (! versiondata) {
mauroar211 1:a549ef8b142a 20 printf("no se encuentra el chip PN532");
mauroar211 1:a549ef8b142a 21 while (1); // halt
mauroar211 1:a549ef8b142a 22 }
mauroar211 1:a549ef8b142a 23
mauroar211 1:a549ef8b142a 24 printf("\r chip encontrado PN5%2X\r\n", versiondata >> 24);
mauroar211 1:a549ef8b142a 25 printf("\r Firmware V%d.%d\r\n", (versiondata >> 16) & 0xFF, (versiondata >> 8) & 0xFF);
mauroar211 1:a549ef8b142a 26
mauroar211 1:a549ef8b142a 27 // configure board to read RFID tags
mauroar211 1:a549ef8b142a 28 shield->SAMConfig();
mauroar211 1:a549ef8b142a 29 }
mauroar211 1:a549ef8b142a 30
mauroar211 1:a549ef8b142a 31 bool NfcAdapter::tagPresent()
mauroar211 1:a549ef8b142a 32 {
mauroar211 1:a549ef8b142a 33 uint8_t success;
mauroar211 1:a549ef8b142a 34 uidLength = 0;
mauroar211 1:a549ef8b142a 35
mauroar211 1:a549ef8b142a 36 // TODO is cast of uidLength OK?
mauroar211 1:a549ef8b142a 37 success = shield->readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, (uint8_t*)&uidLength);
mauroar211 1:a549ef8b142a 38
mauroar211 1:a549ef8b142a 39 // if (success)
mauroar211 1:a549ef8b142a 40 // {
mauroar211 1:a549ef8b142a 41 // DMSG("Found an ISO14443A card");
mauroar211 1:a549ef8b142a 42 // DMSG(" UID Length: ");Serial.print(uidLength, DEC);DMSG(" uint8_ts");
mauroar211 1:a549ef8b142a 43 // DMSG(" UID Value: ");
mauroar211 1:a549ef8b142a 44 // shield->PrintHex(uid, uidLength);
mauroar211 1:a549ef8b142a 45 // DMSG("");
mauroar211 1:a549ef8b142a 46 // }
mauroar211 1:a549ef8b142a 47
mauroar211 1:a549ef8b142a 48 return success;
mauroar211 1:a549ef8b142a 49 }
mauroar211 1:a549ef8b142a 50
mauroar211 1:a549ef8b142a 51 NfcTag NfcAdapter::read()
mauroar211 1:a549ef8b142a 52 {
mauroar211 1:a549ef8b142a 53
mauroar211 1:a549ef8b142a 54 uint8_t type = guessTagType();
mauroar211 1:a549ef8b142a 55
mauroar211 1:a549ef8b142a 56 // TODO need an abstraction of Driver
mauroar211 1:a549ef8b142a 57 if (type == TAG_TYPE_MIFARE_CLASSIC)
mauroar211 1:a549ef8b142a 58 {
mauroar211 1:a549ef8b142a 59
mauroar211 1:a549ef8b142a 60 printf("\r Es un Tag Mifare Classic \n\r");
mauroar211 1:a549ef8b142a 61
mauroar211 1:a549ef8b142a 62 MifareClassic mifareClassic = MifareClassic(*shield);
mauroar211 1:a549ef8b142a 63 return mifareClassic.read(uid, uidLength);
mauroar211 1:a549ef8b142a 64 }
mauroar211 1:a549ef8b142a 65 else if (type == TAG_TYPE_2)
mauroar211 1:a549ef8b142a 66 {
mauroar211 1:a549ef8b142a 67
mauroar211 1:a549ef8b142a 68 printf("\r Es un Tag Mifare Ultralight \n\r");
mauroar211 1:a549ef8b142a 69
mauroar211 1:a549ef8b142a 70 MifareUltralight ultralight = MifareUltralight(*shield);
mauroar211 1:a549ef8b142a 71 return ultralight.read(uid, uidLength);
mauroar211 1:a549ef8b142a 72 }
mauroar211 1:a549ef8b142a 73 else if (type == TAG_TYPE_UNKNOWN)
mauroar211 1:a549ef8b142a 74 {
mauroar211 1:a549ef8b142a 75 printf("\r tipo de Tag no deteminado \n\r");
mauroar211 1:a549ef8b142a 76 //DMSG("Can not determine tag type for ATQA 0x");
mauroar211 1:a549ef8b142a 77 //Serial.print(atqa, HEX);DMSG(" SAK 0x");DMSG(sak, HEX);
mauroar211 1:a549ef8b142a 78 return NfcTag(uid, uidLength);
mauroar211 1:a549ef8b142a 79 }
mauroar211 1:a549ef8b142a 80 else
mauroar211 1:a549ef8b142a 81 {
mauroar211 1:a549ef8b142a 82 DMSG("No driver for card type ");
mauroar211 1:a549ef8b142a 83 DMSG_INT(type);
mauroar211 1:a549ef8b142a 84 // TODO should set type here
mauroar211 1:a549ef8b142a 85 return NfcTag(uid, uidLength);
mauroar211 1:a549ef8b142a 86 }
mauroar211 1:a549ef8b142a 87
mauroar211 1:a549ef8b142a 88 }
mauroar211 1:a549ef8b142a 89
mauroar211 1:a549ef8b142a 90 bool NfcAdapter::write(NdefMessage& ndefMessage)
mauroar211 1:a549ef8b142a 91 {
mauroar211 1:a549ef8b142a 92 bool success;
mauroar211 1:a549ef8b142a 93
mauroar211 1:a549ef8b142a 94 if (uidLength == 4)
mauroar211 1:a549ef8b142a 95 {
mauroar211 1:a549ef8b142a 96 MifareClassic mifareClassic = MifareClassic(*shield);
mauroar211 1:a549ef8b142a 97 success = mifareClassic.write(ndefMessage, uid, uidLength);
mauroar211 1:a549ef8b142a 98 }
mauroar211 1:a549ef8b142a 99 else
mauroar211 1:a549ef8b142a 100 {
mauroar211 1:a549ef8b142a 101 DMSG("Unsupported Tag");
mauroar211 1:a549ef8b142a 102 success = false;
mauroar211 1:a549ef8b142a 103 }
mauroar211 1:a549ef8b142a 104 return success;
mauroar211 1:a549ef8b142a 105 }
mauroar211 1:a549ef8b142a 106
mauroar211 1:a549ef8b142a 107 // TODO this should return a Driver MifareClassic, MifareUltralight, Type 4, Unknown
mauroar211 1:a549ef8b142a 108 // Guess Tag Type by looking at the ATQA and SAK values
mauroar211 1:a549ef8b142a 109 // Need to follow spec for Card Identification. Maybe AN1303, AN1305 and ???
mauroar211 1:a549ef8b142a 110 unsigned int NfcAdapter::guessTagType()
mauroar211 1:a549ef8b142a 111 {
mauroar211 1:a549ef8b142a 112
mauroar211 1:a549ef8b142a 113 // 4 uint8_t id - Mifare Classic
mauroar211 1:a549ef8b142a 114 // - ATQA 0x4 && SAK 0x8
mauroar211 1:a549ef8b142a 115 // 7 uint8_t id
mauroar211 1:a549ef8b142a 116 // - ATQA 0x44 && SAK 0x8 - Mifare Classic
mauroar211 1:a549ef8b142a 117 // - ATQA 0x44 && SAK 0x0 - Mifare Ultralight NFC Forum Type 2
mauroar211 1:a549ef8b142a 118 // - ATQA 0x344 && SAK 0x20 - NFC Forum Type 4
mauroar211 1:a549ef8b142a 119
mauroar211 1:a549ef8b142a 120 if (uidLength == 4)
mauroar211 1:a549ef8b142a 121 {
mauroar211 1:a549ef8b142a 122 return TAG_TYPE_MIFARE_CLASSIC;
mauroar211 1:a549ef8b142a 123 }
mauroar211 1:a549ef8b142a 124 else
mauroar211 1:a549ef8b142a 125 {
mauroar211 1:a549ef8b142a 126 return TAG_TYPE_2;
mauroar211 1:a549ef8b142a 127 }
mauroar211 1:a549ef8b142a 128 }