PN532 customized
Fork of PN532 by
Diff: NfcAdapter.cpp
- Revision:
- 7:a26fa6ef10eb
- Parent:
- 3:4189a10038e6
--- a/NfcAdapter.cpp Tue Mar 25 16:48:10 2014 +0000 +++ b/NfcAdapter.cpp Tue Feb 09 16:16:11 2016 +0000 @@ -34,7 +34,7 @@ uidLength = 0; // TODO is cast of uidLength OK? - success = shield->readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, (uint8_t*)&uidLength); + success = shield->readPassiveTarget(PN532_MIFARE_ISO14443A, uid, (uint8_t*)&uidLength, &sak); // if (success) // { @@ -51,25 +51,26 @@ NfcTag NfcAdapter::read() { - uint8_t type = guessTagType(); + uint8_t type = getTagType(); // TODO need an abstraction of Driver - if (type == TAG_TYPE_MIFARE_CLASSIC) + if (type == TAG_TYPE_MIFARE_UL) + { + #ifdef NDEF_DEBUG + printf("Reading Mifare Ultralight"); + #endif + MifareUltralight ultralight = MifareUltralight(*shield); + return ultralight.read(uid, uidLength); + } + else if (type >= TAG_TYPE_MIFARE_MINI && type <= TAG_TYPE_MIFARE_PLUS_4K) { #ifdef NDEF_DEBUG DMSG("Reading Mifare Classic"); #endif - MifareClassic mifareClassic = MifareClassic(*shield); + MifareClassic mifareClassic = MifareClassic(*shield, type); return mifareClassic.read(uid, uidLength); } - else if (type == TAG_TYPE_2) - { - #ifdef NDEF_DEBUG - DMSG("Reading Mifare Ultralight"); - #endif - MifareUltralight ultralight = MifareUltralight(*shield); - return ultralight.read(uid, uidLength); - } + else if (type == TAG_TYPE_UNKNOWN) { DMSG("Can not determine tag type"); @@ -93,7 +94,7 @@ if (uidLength == 4) { - MifareClassic mifareClassic = MifareClassic(*shield); + MifareClassic mifareClassic = MifareClassic(*shield, 0); success = mifareClassic.write(ndefMessage, uid, uidLength); } else @@ -109,7 +110,6 @@ // Need to follow spec for Card Identification. Maybe AN1303, AN1305 and ??? unsigned int NfcAdapter::guessTagType() { - // 4 uint8_t id - Mifare Classic // - ATQA 0x4 && SAK 0x8 // 7 uint8_t id @@ -119,10 +119,33 @@ if (uidLength == 4) { - return TAG_TYPE_MIFARE_CLASSIC; + return TAG_TYPE_MIFARE_1K; } else { return TAG_TYPE_2; } } +unsigned int NfcAdapter::getTagType(){ + if((sak & 0b00011011) == 0b00001001){ + return TAG_TYPE_MIFARE_MINI; + } + else if((sak & 0b00011011) == 0b00001000){ + return TAG_TYPE_MIFARE_1K; + } + else if((sak & 0b00011010) == 0b00011000){ + return TAG_TYPE_MIFARE_4K; + } + else if((sak & 0b00111010) == 0){ + return TAG_TYPE_MIFARE_UL; + } + else if((sak & 0b00111010) == 0b00100000){ + return TAG_TYPE_14443; + } + else if((sak & 0b00011011) == 0b00010000){ + return TAG_TYPE_MIFARE_PLUS_2K; + } + else if((sak & 0b00011011) == 0b00010001){ + return TAG_TYPE_MIFARE_4K; + } +} \ No newline at end of file