PN532 NFC library for Seeed Studio's NFC Shield

Fork of PN532 by Yihui Xiong

Committer:
yihui
Date:
Thu Nov 21 04:30:49 2013 +0000
Revision:
3:4189a10038e6
Child:
5:51f820fbd18a
sync with https://github.com/Seeed-Studio/PN532/releases/tag/v0.9.

Who changed what in which revision?

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