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
|
- [ ] Contrôle des modules
|
||||||
- [x] RFID (base)
|
- [x] RFID (base)
|
||||||
- [x] RFID (avancé, écriture des tags)
|
- [x] RFID (avancé, écriture des tags)
|
||||||
|
- [x] RFID (deux lecteurs)
|
||||||
- [x] LCD (base)
|
- [x] LCD (base)
|
||||||
- [x] LCD (animations)
|
- [x] LCD (animations)
|
||||||
- [ ] LCD (UI)
|
- [ ] 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.
|
(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
|
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
|
#### Schéma
|
||||||
```
|
```
|
||||||
|
|
|
@ -32,6 +32,8 @@ struct uidNode {
|
||||||
class RFID {
|
class RFID {
|
||||||
public:
|
public:
|
||||||
static constexpr int maxTags = 2;
|
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
|
* 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.
|
* 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
|
* This updates the respective lists and returns the ID with the direction
|
||||||
* of the change.
|
* 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();
|
int8_t checkTags();
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,7 @@ namespace Com {
|
||||||
usb_rawhid_send(buffer, 0);
|
usb_rawhid_send(buffer, 0);
|
||||||
#else
|
#else
|
||||||
Serial.write((const char*)buffer);
|
Serial.write((const char*)buffer);
|
||||||
|
Serial.write('\n');
|
||||||
#endif
|
#endif
|
||||||
/* Clear the buffer. */
|
/* Clear the buffer. */
|
||||||
memset(buffer, 0, sizeof(buffer));
|
memset(buffer, 0, sizeof(buffer));
|
||||||
|
|
|
@ -52,21 +52,21 @@ int8_t RFID::checkTags() {
|
||||||
if ( currentActiveTags >= maxTags ||
|
if ( currentActiveTags >= maxTags ||
|
||||||
!mfrc.PICC_IsNewCardPresent() ||
|
!mfrc.PICC_IsNewCardPresent() ||
|
||||||
!mfrc.PICC_ReadCardSerial()) {
|
!mfrc.PICC_ReadCardSerial()) {
|
||||||
return 0;
|
return checkFail;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Assume we have a new tag.
|
// Assume we have a new tag.
|
||||||
uidNode* newTag = addActiveTag(mfrc.uid);
|
uidNode* newTag = addActiveTag(mfrc.uid);
|
||||||
// Tag ID is put in a specific block, which can be read after from comData.
|
// Tag ID is put in a specific block, which can be read after from comData.
|
||||||
if ( !newTag ) {
|
if ( !newTag ) {
|
||||||
return 0;
|
return checkFail;
|
||||||
}
|
}
|
||||||
// If the read fails, we cannot use this tag anyway so remove it from the list.
|
// If the read fails, we cannot use this tag anyway so remove it from the list.
|
||||||
if (!readBlock(newTag->uid, tagIdBlock) ) {
|
if (!readBlock(newTag->uid, tagIdBlock) ) {
|
||||||
removeActiveTag(newTag, nullptr);
|
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];
|
newTag->tag_ID = comData[0];
|
||||||
return newTag->tag_ID;
|
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_Audio_AMP_GAIN_EN, OUTPUT);
|
||||||
|
|
||||||
pinMode(pin_NFC1_RST, OUTPUT);
|
pinMode(pin_NFC1_RST, OUTPUT);
|
||||||
|
pinMode(pin_NFC2_RST, OUTPUT);
|
||||||
pinMode(pin_LCD_RST, OUTPUT);
|
pinMode(pin_LCD_RST, OUTPUT);
|
||||||
|
|
||||||
/* Preemptively disable what we can before the regulator is ON. */
|
/* Preemptively disable what we can before the regulator is ON. */
|
||||||
digitalWrite(pin_Audio_Amp_enable, LOW);
|
digitalWrite(pin_Audio_Amp_enable, LOW);
|
||||||
digitalWrite(pin_NFC1_RST, LOW);
|
digitalWrite(pin_NFC1_RST, LOW);
|
||||||
|
digitalWrite(pin_NFC2_RST, LOW);
|
||||||
digitalWrite(pin_LCD_RST, LOW);
|
digitalWrite(pin_LCD_RST, LOW);
|
||||||
|
|
||||||
pinMode(pin_BAT_SNS, INPUT);
|
pinMode(pin_BAT_SNS, INPUT);
|
||||||
|
@ -45,6 +47,11 @@ __attribute__((noreturn)) int main() {
|
||||||
digitalWrite(pin_NFC1_RST, HIGH);
|
digitalWrite(pin_NFC1_RST, HIGH);
|
||||||
rfid.init();
|
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))
|
if (!SD.begin(BUILTIN_SDCARD))
|
||||||
Com::sendComment("Could not use the SD Card.");
|
Com::sendComment("Could not use the SD Card.");
|
||||||
|
|
||||||
|
@ -66,8 +73,15 @@ __attribute__((noreturn)) int main() {
|
||||||
lcd.checkAndDisplay();
|
lcd.checkAndDisplay();
|
||||||
speaker.checkPlayingAndDisable();
|
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();
|
tagEvent = rfid.checkTags();
|
||||||
if (tagEvent) {
|
if (tagEvent == RFID::checkFail) {
|
||||||
|
tagEvent = rfid2.checkTags();
|
||||||
|
}
|
||||||
|
if (tagEvent != RFID::checkFail) {
|
||||||
Com::sendFigUpdate(tagEvent);
|
Com::sendFigUpdate(tagEvent);
|
||||||
/* Currently, we only play effects when placing a new figurine. */
|
/* Currently, we only play effects when placing a new figurine. */
|
||||||
if (!isIdGone(tagEvent)) {
|
if (!isIdGone(tagEvent)) {
|
||||||
|
@ -80,9 +94,11 @@ __attribute__((noreturn)) int main() {
|
||||||
Com::ReceivedMessage message = Com::receiveMessage();
|
Com::ReceivedMessage message = Com::receiveMessage();
|
||||||
if (message == Com::TAG_INFO_REQUEST) {
|
if (message == Com::TAG_INFO_REQUEST) {
|
||||||
uint8_t tagCount = rfid.gatherTagInfo(Com::getTagRecords());
|
uint8_t tagCount = rfid.gatherTagInfo(Com::getTagRecords());
|
||||||
|
tagCount += rfid2.gatherTagInfo(Com::getTagRecords() + tagCount);
|
||||||
Com::sendTagInfo(tagCount);
|
Com::sendTagInfo(tagCount);
|
||||||
} else if (message == Com::TAG_PROGRAMMING) {
|
} 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.");
|
Com::sendComment("Tag programming failed.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue