Rescan tokens that can have unstable identifiers to make sure that the ID of the token presented is stable

This commit is contained in:
Laura Hausmann 2023-04-20 15:42:55 +02:00
parent 21ddf79ca9
commit d36d3d0ca1
Signed by: zotan
GPG key ID: D044E84C5BE01605
5 changed files with 66 additions and 7 deletions

View file

@ -5,8 +5,10 @@
class CardReader {
public:
virtual bool canHaveUnstableIdentifier() = 0;
virtual bool isNewCardPresent() = 0;
virtual String getCardUid() = 0;
virtual void reset() = 0;
};
class MFRC522CardReader : public CardReader {
@ -14,8 +16,10 @@ private:
MFRC522* iReader;
public:
explicit MFRC522CardReader(MFRC522* reader);
bool canHaveUnstableIdentifier() override;
bool isNewCardPresent() override;
String getCardUid() override;
void reset() override;
};
class RDM6300CardReader : public CardReader {
@ -23,6 +27,8 @@ private:
Rdm6300* iReader;
public:
explicit RDM6300CardReader(Rdm6300* reader);
bool canHaveUnstableIdentifier() override;
bool isNewCardPresent() override;
String getCardUid() override;
void reset() override;
};

View file

@ -13,7 +13,8 @@ enum e_state {
STATE_IDLE,
STATE_TRANSACT_CARDSCAN,
STATE_TRANSACT_VERIFY,
STATE_LINK_CARDSCAN,
STATE_LINK_CARD_SCAN,
STATE_LINK_CARD_RESCAN,
STATE_LINK_VERIFY,
STATE_BALANCE_CARDSCAN,
STATE_BALANCE_VERIFY,

View file

@ -16,6 +16,16 @@ String MFRC522CardReader::getCardUid() {
return byteArrayAsHexString(iReader->uid.uidByte, iReader->uid.size);
}
void MFRC522CardReader::reset() {
iReader->PCD_AntennaOff();
iReader->PCD_Init();
iReader->PCD_AntennaOn();
}
inline bool MFRC522CardReader::canHaveUnstableIdentifier() {
return true;
}
RDM6300CardReader::RDM6300CardReader(Rdm6300* reader) {
iReader = reader;
}
@ -30,3 +40,15 @@ String RDM6300CardReader::getCardUid() {
sprintf(buf, "%010u", uid);
return {buf};
}
void RDM6300CardReader::reset() {
/*
* We don't need to do anything here
* RDM6300 readers don't report a new card as present til the old card is removed and re-presented
*/
}
inline bool RDM6300CardReader::canHaveUnstableIdentifier() {
// As far as I am aware, there are no 125khz tags with unstable identifiers
return false;
}

View file

@ -33,6 +33,7 @@ String apiUrl = "";
const int gTimeout = 5000;
const int scanTimeout = 15000;
CardReader* scannedCardReader;
String scannedCardId = "";
String lastStatusText = "";
@ -52,7 +53,7 @@ void IRAM_ATTR LinkInterruptHandler() {
return;
}
interruptFired = true;
state = STATE_LINK_CARDSCAN;
state = STATE_LINK_CARD_SCAN;
}
void IRAM_ATTR BalanceInterruptHandler() {
@ -139,6 +140,7 @@ void loop() {
if (reader->isNewCardPresent()) {
scannedCardId = reader->getCardUid();
lastStatusText = "Card #" + scannedCardId;
scannedCardReader = reader;
state = STATE_TRANSACT_VERIFY;
return;
}
@ -164,19 +166,46 @@ void loop() {
lastStatusText = lastStatusText.substring(2);
timer = millis();
return;
case STATE_LINK_CARDSCAN:
case STATE_LINK_CARD_SCAN:
for (CardReader* reader : readers) {
if (reader->isNewCardPresent()) {
scannedCardReader = reader;
scannedCardId = reader->getCardUid();
lastStatusText = "Card #" + scannedCardId;
state = STATE_LINK_VERIFY;
return;
if (reader->canHaveUnstableIdentifier()) {
lastStatusText = "Link - rescan";
reader->reset();
timer = millis();
state = STATE_LINK_CARD_RESCAN;
return;
}
else {
lastStatusText = "Card #" + scannedCardId;
state = STATE_LINK_VERIFY;
return;
}
}
}
if (!cooldownCheck(scanTimeout)) {
updateOLED(u8g2, state, "Link", String(cooldownSecondsRemaining(scanTimeout, timer)));
}
break;
case STATE_LINK_CARD_RESCAN:
if (scannedCardReader->isNewCardPresent()) {
if (scannedCardId == scannedCardReader->getCardUid()) {
lastStatusText = "Card #" + scannedCardId;
state = STATE_LINK_VERIFY;
return;
}
else {
lastStatusText = "Unstable identifier";
state = STATE_RESULT_FAILURE;
return;
}
}
if (!cooldownCheck(scanTimeout)) {
updateOLED(u8g2, state, "Link - rescan", String(cooldownSecondsRemaining(scanTimeout, timer)));
}
break;
case STATE_LINK_VERIFY:
updateOLED(u8g2, state, lastStatusText);
tone(PIN_BUZZER, NOTE_A5, 25);

View file

@ -100,7 +100,8 @@ void updateOLED(U8G2 u8g2, e_state state, const String& statusText, const String
break;
case STATE_TRANSACT_CARDSCAN:
case STATE_BALANCE_CARDSCAN:
case STATE_LINK_CARDSCAN:
case STATE_LINK_CARD_SCAN:
case STATE_LINK_CARD_RESCAN:
drawLogo(u8g2, LOGO_CONTACTLESS);
break;
case STATE_RESULT_SUCCESS: