Generic library for working with PN532-like chips
Fork of PN532 by
NfcAdapter.cpp@9:85bfede025da, 2015-02-04 (annotated)
- Committer:
- r4z0r7o3
- Date:
- Wed Feb 04 16:24:30 2015 +0000
- Revision:
- 9:85bfede025da
- Parent:
- 5:51f820fbd18a
- Child:
- 10:f959b305a571
Fixed missing return statement
Who changed what in which revision?
User | Revision | Line number | New 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? |
icefeet | 5:51f820fbd18a | 37 | success = shield->readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, (uint8_t*)&uidLength,&ATQA,&SAK); |
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; |
icefeet | 5:51f820fbd18a | 93 | uint8_t type = guessTagType(); |
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 | { |
icefeet | 5:51f820fbd18a | 101 | DMSG("Ultralight Tag"); |
icefeet | 5:51f820fbd18a | 102 | MifareUltralight mifareUltralight = MifareUltralight(*shield); |
icefeet | 5:51f820fbd18a | 103 | success= mifareUltralight.write(ndefMessage, uid, uidLength); |
icefeet | 5:51f820fbd18a | 104 | //success = false; |
yihui | 3:4189a10038e6 | 105 | } |
yihui | 3:4189a10038e6 | 106 | return success; |
yihui | 3:4189a10038e6 | 107 | } |
yihui | 3:4189a10038e6 | 108 | |
yihui | 3:4189a10038e6 | 109 | // TODO this should return a Driver MifareClassic, MifareUltralight, Type 4, Unknown |
yihui | 3:4189a10038e6 | 110 | // Guess Tag Type by looking at the ATQA and SAK values |
yihui | 3:4189a10038e6 | 111 | // Need to follow spec for Card Identification. Maybe AN1303, AN1305 and ??? |
yihui | 3:4189a10038e6 | 112 | unsigned int NfcAdapter::guessTagType() |
yihui | 3:4189a10038e6 | 113 | { |
yihui | 3:4189a10038e6 | 114 | |
yihui | 3:4189a10038e6 | 115 | // 4 uint8_t id - Mifare Classic |
yihui | 3:4189a10038e6 | 116 | // - ATQA 0x4 && SAK 0x8 |
yihui | 3:4189a10038e6 | 117 | // 7 uint8_t id |
yihui | 3:4189a10038e6 | 118 | // - ATQA 0x44 && SAK 0x8 - Mifare Classic |
yihui | 3:4189a10038e6 | 119 | // - ATQA 0x44 && SAK 0x0 - Mifare Ultralight NFC Forum Type 2 |
yihui | 3:4189a10038e6 | 120 | // - ATQA 0x344 && SAK 0x20 - NFC Forum Type 4 |
icefeet | 5:51f820fbd18a | 121 | DMSG("Guess type"); |
icefeet | 5:51f820fbd18a | 122 | DMSG("ATQA: 0x"); DMSG_HEX(ATQA); |
icefeet | 5:51f820fbd18a | 123 | DMSG("SAK: 0x"); DMSG_HEX(SAK); |
icefeet | 5:51f820fbd18a | 124 | /*if (uidLength == 4) |
yihui | 3:4189a10038e6 | 125 | { |
yihui | 3:4189a10038e6 | 126 | return TAG_TYPE_MIFARE_CLASSIC; |
yihui | 3:4189a10038e6 | 127 | } |
yihui | 3:4189a10038e6 | 128 | else |
yihui | 3:4189a10038e6 | 129 | { |
yihui | 3:4189a10038e6 | 130 | return TAG_TYPE_2; |
icefeet | 5:51f820fbd18a | 131 | }*/ |
icefeet | 5:51f820fbd18a | 132 | if(ATQA==0x4&&SAK==0x8){ |
icefeet | 5:51f820fbd18a | 133 | return TAG_TYPE_MIFARE_CLASSIC; |
icefeet | 5:51f820fbd18a | 134 | } |
icefeet | 5:51f820fbd18a | 135 | if(ATQA==0x44&&SAK==0x0){ |
icefeet | 5:51f820fbd18a | 136 | return TAG_TYPE_2; |
yihui | 3:4189a10038e6 | 137 | } |
r4z0r7o3 | 9:85bfede025da | 138 | return TAG_TYPE_UNKNOWN; |
yihui | 3:4189a10038e6 | 139 | } |