101 lines
2.1 KiB
C++
101 lines
2.1 KiB
C++
#include <Arduino.h>
|
|
#include "utils.h"
|
|
#include "readers.h"
|
|
#include "vars.h"
|
|
|
|
volatile int PN532Reader::irq = 0;
|
|
volatile bool PN532Reader::toggleMode = false;
|
|
uint8_t PN532Reader::mode = 0;
|
|
|
|
|
|
PN532Reader::PN532Reader(uint8_t ss) {
|
|
pn532 = new Adafruit_PN532(ss, new SPIClass(HSPI));
|
|
}
|
|
|
|
void PN532Reader::begin() {
|
|
pn532->begin();
|
|
irq = 0;
|
|
mode = PN532_MIFARE_ISO14443A;
|
|
pn532->startPassiveTargetIDDetection(mode);
|
|
}
|
|
|
|
void PN532Reader::beginKeepMode() {
|
|
pn532->begin();
|
|
irq = 0;
|
|
pn532->startPassiveTargetIDDetection(mode);
|
|
}
|
|
|
|
void PN532Reader::cycleMode() {
|
|
this->end();
|
|
pn532->begin();
|
|
irq = 0;
|
|
|
|
if (mode == PN532_MIFARE_ISO14443A) {
|
|
mode = PN532_FELICA_424;
|
|
Serial.println("Mode is now FELICA");
|
|
}
|
|
else {
|
|
mode = PN532_MIFARE_ISO14443A;
|
|
Serial.println("Mode is now NFC-A");
|
|
}
|
|
|
|
pn532->startPassiveTargetIDDetection(mode);
|
|
}
|
|
|
|
void PN532Reader::end() {
|
|
pn532->sendCommandCheckAck(new byte[1]{PN532_COMMAND_POWERDOWN}, 1, 1);
|
|
}
|
|
|
|
bool PN532Reader::isNewCardPresent() {
|
|
if (irq > 1)
|
|
return true;
|
|
|
|
if (toggleMode) {
|
|
if (millis() - timer > 500) {
|
|
cycleMode();
|
|
timer = millis();
|
|
}
|
|
|
|
toggleMode = false;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
String PN532Reader::getCardUid() {
|
|
if (mode == PN532_MIFARE_ISO14443A) {
|
|
Serial.println("Reading NFC-A UID");
|
|
pn532->readDetectedPassiveTargetID(uid, &uidLength);
|
|
}
|
|
else {
|
|
Serial.println("Reading FeliCa IDm");
|
|
pn532->readDetectedPassiveTargetIDFeliCa(uid, &uidLength);
|
|
}
|
|
|
|
Serial.println(uidLength);
|
|
Serial.println(byteArrayAsHexString(uid, uidLength));
|
|
return byteArrayAsHexString(uid, uidLength);
|
|
}
|
|
|
|
void PN532Reader::reset() {
|
|
this->end();
|
|
this->beginKeepMode();
|
|
}
|
|
|
|
inline bool PN532Reader::canHaveUnstableIdentifier() {
|
|
return true;
|
|
}
|
|
|
|
void PN532Reader::init() {
|
|
pn532->begin();
|
|
uint32_t version = pn532->getFirmwareVersion();
|
|
if (!version) {
|
|
Serial.print("Couldn't find PN53x board");
|
|
return;
|
|
//esp_restart();
|
|
}
|
|
|
|
Serial.print("Found chip PN5"); Serial.println((version>>24) & 0xFF, HEX);
|
|
Serial.print("Firmware ver. "); Serial.print((version>>16) & 0xFF, DEC);
|
|
Serial.print('.'); Serial.println((version>>8) & 0xFF, DEC);
|
|
}
|