Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of PN532 by
NfcAdapter.cpp
- Committer:
- yihui
- Date:
- 2013-11-21
- Revision:
- 3:4189a10038e6
- Child:
- 7:a26fa6ef10eb
File content as of revision 3:4189a10038e6:
#include <NfcAdapter.h> #include <PN532_debug.h> NfcAdapter::NfcAdapter(PN532Interface &interface) { shield = new PN532(interface); } NfcAdapter::~NfcAdapter(void) { delete shield; } void NfcAdapter::begin() { shield->begin(); uint32_t versiondata = shield->getFirmwareVersion(); if (! versiondata) { DMSG("Didn't find PN53x board"); while (1); // halt } DMSG("Found chip PN5%2X\r\n", versiondata >> 24); DMSG("Firmware V%d.%d\r\n", (versiondata >> 16) & 0xFF, (versiondata >> 8) & 0xFF); // configure board to read RFID tags shield->SAMConfig(); } bool NfcAdapter::tagPresent() { uint8_t success; uidLength = 0; // TODO is cast of uidLength OK? success = shield->readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, (uint8_t*)&uidLength); // if (success) // { // DMSG("Found an ISO14443A card"); // DMSG(" UID Length: ");Serial.print(uidLength, DEC);DMSG(" uint8_ts"); // DMSG(" UID Value: "); // shield->PrintHex(uid, uidLength); // DMSG(""); // } return success; } NfcTag NfcAdapter::read() { uint8_t type = guessTagType(); // TODO need an abstraction of Driver if (type == TAG_TYPE_MIFARE_CLASSIC) { #ifdef NDEF_DEBUG DMSG("Reading Mifare Classic"); #endif MifareClassic mifareClassic = MifareClassic(*shield); 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"); //DMSG("Can not determine tag type for ATQA 0x"); //Serial.print(atqa, HEX);DMSG(" SAK 0x");DMSG(sak, HEX); return NfcTag(uid, uidLength); } else { DMSG("No driver for card type "); DMSG_INT(type); // TODO should set type here return NfcTag(uid, uidLength); } } bool NfcAdapter::write(NdefMessage& ndefMessage) { bool success; if (uidLength == 4) { MifareClassic mifareClassic = MifareClassic(*shield); success = mifareClassic.write(ndefMessage, uid, uidLength); } else { DMSG("Unsupported Tag"); success = false; } return success; } // TODO this should return a Driver MifareClassic, MifareUltralight, Type 4, Unknown // Guess Tag Type by looking at the ATQA and SAK values // 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 // - ATQA 0x44 && SAK 0x8 - Mifare Classic // - ATQA 0x44 && SAK 0x0 - Mifare Ultralight NFC Forum Type 2 // - ATQA 0x344 && SAK 0x20 - NFC Forum Type 4 if (uidLength == 4) { return TAG_TYPE_MIFARE_CLASSIC; } else { return TAG_TYPE_2; } }