Skip to content

Commit b1c565b

Browse files
author
Michael Haberler
committed
make NfcAdapter use an MFRC522Extended instance
this is needed among others for Type 4 support
1 parent 4956c59 commit b1c565b

File tree

2 files changed

+73
-52
lines changed

2 files changed

+73
-52
lines changed

src/NfcAdapter.cpp

+49-30
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#include <NfcAdapter.h>
22

3-
NfcAdapter::NfcAdapter(MFRC522 *interface)
3+
NfcAdapter::NfcAdapter(MFRC522Extended *interface)
44
{
55
shield = interface;
66
}
@@ -24,13 +24,20 @@ bool NfcAdapter::tagPresent()
2424
// If tag has already been authenticated nothing else will work until we stop crypto (shouldn't hurt)
2525
shield->PCD_StopCrypto1();
2626

27-
if (!(shield->PICC_IsNewCardPresent() && shield->PICC_ReadCardSerial()))
27+
if(!(shield->PICC_IsNewCardPresent() && shield->PICC_ReadCardSerial()))
2828
{
2929
return false;
3030
}
3131

3232
MFRC522::PICC_Type piccType = shield->PICC_GetType(shield->uid.sak);
33-
return ((piccType == MFRC522Constants::PICC_TYPE_MIFARE_1K) || (piccType == MFRC522Constants::PICC_TYPE_MIFARE_UL));
33+
switch (piccType) {
34+
case PICC_Type::PICC_TYPE_MIFARE_1K:
35+
case PICC_Type::PICC_TYPE_MIFARE_UL:
36+
case PICC_Type::PICC_TYPE_ISO_14443_4:
37+
return true;
38+
default:;
39+
}
40+
return false;
3441
}
3542

3643
bool NfcAdapter::erase()
@@ -43,14 +50,14 @@ bool NfcAdapter::erase()
4350
bool NfcAdapter::format()
4451
{
4552
#ifdef NDEF_SUPPORT_MIFARE_CLASSIC
46-
if (shield->PICC_GetType(shield->uid.sak) == MFRC522Constants::PICC_TYPE_MIFARE_1K)
53+
if(shield->PICC_GetType(shield->uid.sak) == PICC_Type::PICC_TYPE_MIFARE_1K)
4754
{
4855
MifareClassic mifareClassic = MifareClassic(shield);
4956
return mifareClassic.formatNDEF();
5057
}
5158
else
5259
#endif
53-
if (shield->PICC_GetType(shield->uid.sak) == MFRC522Constants::PICC_TYPE_MIFARE_UL)
60+
if(shield->PICC_GetType(shield->uid.sak) == PICC_Type::PICC_TYPE_MIFARE_UL)
5461
{
5562
#ifdef NDEF_USE_SERIAL
5663
Serial.print(F("No need for formating a UL"));
@@ -73,30 +80,30 @@ bool NfcAdapter::clean()
7380
#ifdef NDEF_SUPPORT_MIFARE_CLASSIC
7481
if (type == NfcTag::TYPE_MIFARE_CLASSIC)
7582
{
76-
#ifdef NDEF_DEBUG
83+
#ifdef NDEF_DEBUG
7784
Serial.println(F("Cleaning Mifare Classic"));
78-
#endif
85+
#endif
7986
MifareClassic mifareClassic = MifareClassic(shield);
8087
return mifareClassic.formatMifare();
8188
}
8289
else
8390
#endif
84-
if (type == NfcTag::TYPE_2)
91+
if (type == NfcTag::TYPE_2)
8592
{
86-
#ifdef NDEF_DEBUG
93+
#ifdef NDEF_DEBUG
8794
Serial.println(F("Cleaning Mifare Ultralight"));
88-
#endif
95+
#endif
8996
MifareUltralight ultralight = MifareUltralight(shield);
9097
return ultralight.clean();
9198
}
9299
else
93100
{
94101
#ifdef NDEF_USE_SERIAL
95-
Serial.print(F("No driver for card type "));
96-
Serial.println(type);
102+
Serial.print(F("No driver for card type "));Serial.println(type);
97103
#endif
98104
return false;
99105
}
106+
100107
}
101108

102109
NfcTag NfcAdapter::read()
@@ -106,22 +113,31 @@ NfcTag NfcAdapter::read()
106113
#ifdef NDEF_SUPPORT_MIFARE_CLASSIC
107114
if (type == NfcTag::TYPE_MIFARE_CLASSIC)
108115
{
109-
#ifdef NDEF_DEBUG
116+
#ifdef NDEF_DEBUG
110117
Serial.println(F("Reading Mifare Classic"));
111-
#endif
118+
#endif
112119
MifareClassic mifareClassic = MifareClassic(shield);
113120
return mifareClassic.read();
114121
}
115122
else
116123
#endif
117-
if (type == NfcTag::TYPE_2)
124+
if (type == NfcTag::TYPE_2)
118125
{
119-
#ifdef NDEF_DEBUG
126+
#ifdef NDEF_DEBUG
120127
Serial.println(F("Reading Mifare Ultralight"));
121-
#endif
128+
#endif
122129
MifareUltralight ultralight = MifareUltralight(shield);
123130
return ultralight.read();
124131
}
132+
else if (type == NfcTag::TYPE_4)
133+
{
134+
#ifdef NDEF_DEBUG
135+
Serial.println(F("Reading Type4 tag"));
136+
#endif
137+
Type4Tag type4tag = Type4Tag(shield);
138+
return type4tag.read();
139+
// return NfcTag(shield->uid.uidByte, shield->uid.size, NfcTag::TYPE_4);
140+
}
125141
else if (type == NfcTag::TYPE_UNKNOWN)
126142
{
127143
#ifdef NDEF_USE_SERIAL
@@ -135,28 +151,29 @@ NfcTag NfcAdapter::read()
135151
// TODO should set type here
136152
return NfcTag(shield->uid.uidByte, shield->uid.size, NfcTag::TYPE_UNKNOWN);
137153
}
154+
138155
}
139156

140-
bool NfcAdapter::write(NdefMessage &ndefMessage)
157+
bool NfcAdapter::write(NdefMessage& ndefMessage)
141158
{
142159
uint8_t type = guessTagType();
143160

144161
#ifdef NDEF_SUPPORT_MIFARE_CLASSIC
145162
if (type == NfcTag::TYPE_MIFARE_CLASSIC)
146163
{
147-
#ifdef NDEF_DEBUG
164+
#ifdef NDEF_DEBUG
148165
Serial.println(F("Writing Mifare Classic"));
149-
#endif
166+
#endif
150167
MifareClassic mifareClassic = MifareClassic(shield);
151168
return mifareClassic.write(ndefMessage);
152169
}
153170
else
154171
#endif
155-
if (type == NfcTag::TYPE_2)
172+
if (type == NfcTag::TYPE_2)
156173
{
157-
#ifdef NDEF_DEBUG
174+
#ifdef NDEF_DEBUG
158175
Serial.println(F("Writing Mifare Ultralight"));
159-
#endif
176+
#endif
160177
MifareUltralight mifareUltralight = MifareUltralight(shield);
161178
return mifareUltralight.write(ndefMessage);
162179
}
@@ -170,16 +187,14 @@ bool NfcAdapter::write(NdefMessage &ndefMessage)
170187
else
171188
{
172189
#ifdef NDEF_USE_SERIAL
173-
Serial.print(F("No driver for card type "));
174-
Serial.println(type);
190+
Serial.print(F("No driver for card type "));Serial.println(type);
175191
#endif
176192
return false;
177193
}
178194
}
179195

180196
// Current tag will not be "visible" until removed from the RFID field
181-
void NfcAdapter::haltTag()
182-
{
197+
void NfcAdapter::haltTag() {
183198
shield->PICC_HaltA();
184199
shield->PCD_StopCrypto1();
185200
}
@@ -189,14 +204,18 @@ NfcTag::TagType NfcAdapter::guessTagType()
189204

190205
MFRC522::PICC_Type piccType = shield->PICC_GetType(shield->uid.sak);
191206

192-
if (piccType == MFRC522Constants::PICC_TYPE_MIFARE_1K)
207+
if (piccType == PICC_Type::PICC_TYPE_MIFARE_1K)
193208
{
194209
return NfcTag::TYPE_MIFARE_CLASSIC;
195-
}
196-
else if (piccType == MFRC522Constants::PICC_TYPE_MIFARE_UL)
210+
}
211+
else if (piccType == PICC_Type::PICC_TYPE_MIFARE_UL)
197212
{
198213
return NfcTag::TYPE_2;
199214
}
215+
else if (piccType == PICC_Type::PICC_TYPE_ISO_14443_4)
216+
{
217+
return NfcTag::TYPE_4;
218+
}
200219
else
201220
{
202221
return NfcTag::TYPE_UNKNOWN;

src/NfcAdapter.h

+24-22
Original file line numberDiff line numberDiff line change
@@ -2,37 +2,39 @@
22
#define NfcAdapter_h
33

44
#include <MFRC522v2.h>
5-
#include <MFRC522Debug.h>
5+
#include <MFRC522Extended.h>
66
#include <NfcTag.h>
77
#include <Ndef.h>
88

99
// Drivers
1010
#include <MifareClassic.h>
1111
#include <MifareUltralight.h>
12+
#include <Type4Tag.h>
1213

13-
#define NDEF_DEBUG 1
14+
//#define NDEF_DEBUG 1
1415

15-
class NfcAdapter
16-
{
17-
public:
18-
NfcAdapter(MFRC522 *interface);
16+
class NfcAdapter {
17+
using StatusCode = MFRC522Constants::StatusCode;
18+
using PICC_Command = MFRC522Constants::PICC_Command;
19+
using PICC_Type = MFRC522Constants::PICC_Type;
20+
public:
21+
NfcAdapter(MFRC522Extended *interface);
1922

20-
~NfcAdapter(void);
21-
void begin(bool verbose = true);
22-
bool tagPresent(); // tagAvailable
23-
NfcTag read();
24-
bool write(NdefMessage &ndefMessage);
25-
// erase tag by writing an empty NDEF record
26-
bool erase();
27-
// format a tag as NDEF
28-
bool format();
29-
// reset tag back to factory state
30-
bool clean();
31-
void haltTag();
32-
33-
private:
34-
MFRC522 *shield;
35-
NfcTag::TagType guessTagType();
23+
~NfcAdapter(void);
24+
void begin(bool verbose=true);
25+
bool tagPresent(); // tagAvailable
26+
NfcTag read();
27+
bool write(NdefMessage& ndefMessage);
28+
// erase tag by writing an empty NDEF record
29+
bool erase();
30+
// format a tag as NDEF
31+
bool format();
32+
// reset tag back to factory state
33+
bool clean();
34+
void haltTag();
35+
private:
36+
MFRC522Extended* shield;
37+
NfcTag::TagType guessTagType();
3638
};
3739

3840
#endif

0 commit comments

Comments
 (0)