PN532 customized

Fork of PN532 by Components

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