Compare commits
3 commits
ade4c19d55
...
776a4e252f
Author | SHA1 | Date | |
---|---|---|---|
776a4e252f | |||
3ee09f284a | |||
2fd1939746 |
5 changed files with 30 additions and 8 deletions
|
@ -42,6 +42,7 @@ se synchroniser avec le firmware et potentiellement le mettre à jour.
|
|||
- [ ] Contrôle des modules
|
||||
- [x] RFID (base)
|
||||
- [x] RFID (avancé, écriture des tags)
|
||||
- [x] RFID (deux lecteurs)
|
||||
- [x] LCD (base)
|
||||
- [x] LCD (animations)
|
||||
- [ ] LCD (UI)
|
||||
|
@ -204,6 +205,7 @@ est un personnage (1) ou une année (0) sur le bit 6 et si la figurine a été p
|
|||
(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.
|
||||
**_Dû à un détail d'implémentation, l'identifiant 127 est invalide et réservé._**
|
||||
|
||||
#### Schéma
|
||||
```
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -20,6 +20,7 @@ namespace Com {
|
|||
usb_rawhid_send(buffer, 0);
|
||||
#else
|
||||
Serial.write((const char*)buffer);
|
||||
Serial.write('\n');
|
||||
#endif
|
||||
/* Clear the buffer. */
|
||||
memset(buffer, 0, sizeof(buffer));
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
20
src/main.cpp
20
src/main.cpp
|
@ -16,11 +16,13 @@ __attribute__((noreturn)) int main() {
|
|||
pinMode(pin_Audio_AMP_GAIN_EN, OUTPUT);
|
||||
|
||||
pinMode(pin_NFC1_RST, OUTPUT);
|
||||
pinMode(pin_NFC2_RST, OUTPUT);
|
||||
pinMode(pin_LCD_RST, OUTPUT);
|
||||
|
||||
/* Preemptively disable what we can before the regulator is ON. */
|
||||
digitalWrite(pin_Audio_Amp_enable, LOW);
|
||||
digitalWrite(pin_NFC1_RST, LOW);
|
||||
digitalWrite(pin_NFC2_RST, LOW);
|
||||
digitalWrite(pin_LCD_RST, LOW);
|
||||
|
||||
pinMode(pin_BAT_SNS, INPUT);
|
||||
|
@ -45,6 +47,11 @@ __attribute__((noreturn)) int main() {
|
|||
digitalWrite(pin_NFC1_RST, HIGH);
|
||||
rfid.init();
|
||||
|
||||
SPI1.setMISO(pin_SPI1_CIPO);
|
||||
RFID rfid2(pin_NFC2_CS, SPI1);
|
||||
digitalWrite(pin_NFC2_RST, HIGH);
|
||||
rfid2.init();
|
||||
|
||||
if (!SD.begin(BUILTIN_SDCARD))
|
||||
Com::sendComment("Could not use the SD Card.");
|
||||
|
||||
|
@ -66,8 +73,15 @@ __attribute__((noreturn)) int main() {
|
|||
lcd.checkAndDisplay();
|
||||
speaker.checkPlayingAndDisable();
|
||||
|
||||
/*
|
||||
* In the unlikely case where two changes happen in the same cycle, we
|
||||
* can check the second RFID reader on the next one.
|
||||
*/
|
||||
tagEvent = rfid.checkTags();
|
||||
if (tagEvent) {
|
||||
if (tagEvent == RFID::checkFail) {
|
||||
tagEvent = rfid2.checkTags();
|
||||
}
|
||||
if (tagEvent != RFID::checkFail) {
|
||||
Com::sendFigUpdate(tagEvent);
|
||||
/* Currently, we only play effects when placing a new figurine. */
|
||||
if (!isIdGone(tagEvent)) {
|
||||
|
@ -80,9 +94,11 @@ __attribute__((noreturn)) int main() {
|
|||
Com::ReceivedMessage message = Com::receiveMessage();
|
||||
if (message == Com::TAG_INFO_REQUEST) {
|
||||
uint8_t tagCount = rfid.gatherTagInfo(Com::getTagRecords());
|
||||
tagCount += rfid2.gatherTagInfo(Com::getTagRecords() + tagCount);
|
||||
Com::sendTagInfo(tagCount);
|
||||
} else if (message == Com::TAG_PROGRAMMING) {
|
||||
if (!rfid.programTag(Com::getTagRecords())) {
|
||||
if (!rfid.programTag(Com::getTagRecords()) &&
|
||||
!rfid2.programTag(Com::getTagRecords())) {
|
||||
Com::sendComment("Tag programming failed.");
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue