Rescan tokens that can have unstable identifiers to make sure that the ID of the token presented is stable
This commit is contained in:
parent
21ddf79ca9
commit
d36d3d0ca1
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in a new issue