1
0
Fork 0

RFID: Change the checkTag fail return

Previously, checkTag() returned 0 when it failed or when there was no changes.
This is fine if we are only expecting already programmed tags, but as tags
arrive new with blocks zeroed out, which conflicts with the 0 return value.

Introduce a new constant to RFID for the return error, -1, and use it
instead of 0 everywhere.
Update comments and README to highlight this new reserved ID.
This commit is contained in:
Teo-CD 2024-03-07 23:05:14 +00:00
parent 2fd1939746
commit 3ee09f284a
4 changed files with 11 additions and 7 deletions

View file

@ -203,7 +203,8 @@ Il contient l'ID de la figurine sur les bits 0-5 de l'octet, si la figurine
est un personnage (1) ou une année (0) sur le bit 6 et si la figurine a été posée
(0) ou retirée (1) sur le bit 7.
Ainsi, si on interprète l'octet comme un nombre signé, si le nombre est négatif
on sait que la figurine a été retirée.
on sait que la figurine a été retirée.
**_Dû à un détail d'implémentation, l'identifiant 127 est invalide et réservé._**
#### Schéma
```

View file

@ -32,6 +32,8 @@ struct uidNode {
class RFID {
public:
static constexpr int maxTags = 2;
/* Error value returned when checking for new or gone tags. */
static constexpr int8_t checkFail = -1;
/***
* Use the main SPI port and NFC chip select by default, but allow choosing
@ -48,7 +50,8 @@ public:
* at a time, another call would be needed to get eventual concurrent events.
* This updates the respective lists and returns the ID with the direction
* of the change.
* @return 0 if no change, ID if new tag detected, ID & sign bit if the tag left.
* @return ID if new tag detected, ID & sign bit if the tag left
* @return RFID::checkFail if no change or error.
*/
int8_t checkTags();

View file

@ -52,21 +52,21 @@ int8_t RFID::checkTags() {
if ( currentActiveTags >= maxTags ||
!mfrc.PICC_IsNewCardPresent() ||
!mfrc.PICC_ReadCardSerial()) {
return 0;
return checkFail;
}
// Assume we have a new tag.
uidNode* newTag = addActiveTag(mfrc.uid);
// Tag ID is put in a specific block, which can be read after from comData.
if ( !newTag ) {
return 0;
return checkFail;
}
// If the read fails, we cannot use this tag anyway so remove it from the list.
if (!readBlock(newTag->uid, tagIdBlock) ) {
removeActiveTag(newTag, nullptr);
return 0;
return checkFail;
}
// Don' t check the ID, otherwise we cannot program the tag.
// Don't check the ID, otherwise we cannot program the tag.
newTag->tag_ID = comData[0];
return newTag->tag_ID;
}

View file

@ -67,7 +67,7 @@ __attribute__((noreturn)) int main() {
speaker.checkPlayingAndDisable();
tagEvent = rfid.checkTags();
if (tagEvent) {
if (tagEvent != RFID::checkFail) {
Com::sendFigUpdate(tagEvent);
/* Currently, we only play effects when placing a new figurine. */
if (!isIdGone(tagEvent)) {