IRQ based tag polling

This commit is contained in:
2022-03-10 22:25:35 +01:00
parent b01caeda28
commit 97aa264b54
5 changed files with 448 additions and 112 deletions

View File

@ -14,7 +14,8 @@ public:
static constexpr uint8_t LEN = 3; // Buffer length error
static constexpr uint8_t COLLISION = 4; // Chip collision
static constexpr uint8_t CRC = 5; // CRC incorrect collision
static constexpr uint8_t ERR = 6; // General error
static constexpr uint8_t BUSY = 6; // System is busy
static constexpr uint8_t ERR = 7; // General error
// Command words
static constexpr uint8_t IDLE = 0x00; // NO action; Cancel the current command
@ -132,13 +133,32 @@ public:
// The PICC_CMD_MF_READ and PICC_CMD_MF_WRITE can also be used for MIFARE Ultralight.
static constexpr uint8_t PICC_CMD_UL_WRITE = 0xA2; // Writes one 4 byte page to the PICC
typedef struct
class Uid
{
public:
uint8_t size; // Number of bytes in the UID. 4, 7 or 10.
uint8_t uidByte[10];
uint8_t sak; // The SAK (Select acknowledge) byte returned from the PICC after successful selection.
} Uid;
bool operator==(Uid& in)
{
if(size != in.size)
return false;
for(uint8_t i = 0; i < size; ++i)
{
if(uidByte[i] != in.uidByte[i])
return false;
}
return true;
}
bool operator!=(Uid& in)
{
return !operator==(in);
}
};
// Modes
static constexpr uint8_t MODE_IDLE = 0;
static constexpr uint8_t MODE_TRANSCEIVE = 1;
private:
ShiftReg<NFC_PORTS>* _csReg;
@ -146,44 +166,70 @@ private:
uint8_t _csPin;
void (*_tagEnterdCb)(Mfrc522*, void*);
void* _userData;
void (*_transceiveCb)(uint8_t ret, Mfrc522* reader, uint8_t* response, uint8_t responseLen, void* userData);
void* _transceiveUserData;
static constexpr uint8_t reponseBufferLen = 16;
static uint8_t reponseBuffer[reponseBufferLen];
volatile uint8_t mode = MODE_IDLE;
volatile bool irqDetect = false;
void setupTransceive(uint8_t *sendData, uint8_t sendLen, uint8_t validBits = 0, uint8_t rxAlign = 0);
uint8_t transceiveAsync(void (*transceiveCb)(uint8_t, Mfrc522*, uint8_t*, uint8_t, void*), void* userData, uint8_t *sendData,
uint8_t sendLen, uint8_t validBits = 0, uint8_t rxAlign = 0);
void transceiveAsyncFinish(uint8_t irq);
uint8_t transceive(uint8_t *sendData, uint8_t sendLen, uint8_t *recvData, uint8_t *recvLen,
uint8_t validBits= 0, uint8_t rxAlign = 0, uint8_t *rxValidBits = nullptr);
static void detectAsyncCb(uint8_t ret, Mfrc522* reader, uint8_t* response, uint8_t responseLen, void* userData);
public:
uint8_t read(uint8_t addr);
void read(uint8_t addr, uint8_t* data, uint8_t datalen, uint8_t rxAlign = 0);
void write(uint8_t addr, uint8_t data);
void write(uint8_t addr, uint8_t* data, uint8_t datalen);
void updateBit(uint8_t addr, uint8_t bit, bool value);
void (*_tagEnterdCb)(Mfrc522*, void*);
void* _userData;
public:
static Serial* serial;
inline static Serial* serial = nullptr;
Mfrc522(SpiMaster* spi, ShiftReg<NFC_PORTS>* csReg, uint8_t csPin,
void (*tagEnterdCb)(Mfrc522*, void*) = nullptr, void* userData = nullptr);
Mfrc522(SpiMaster* spi, ShiftReg<NFC_PORTS>* csReg, uint8_t csPin);
uint8_t calculateCrc(uint8_t *data, uint8_t length, uint16_t *result);
uint8_t commuicateWithTag(uint8_t command, uint8_t waitIrq,
uint8_t *sendData, uint8_t sendLen,
uint8_t *recvData, uint8_t *recvLen,
uint8_t validBits = 0, uint8_t rxAlign = 0,
uint8_t *rxValidBits = nullptr);
uint8_t transceive(uint8_t *sendData, uint8_t sendLen, uint8_t *recvData, uint8_t *recvLen,
uint8_t validBits = 0, uint8_t rxAlign = 0, uint8_t *rxValidBits = nullptr);
uint8_t wakeupTag(uint8_t* bufferATQA, uint8_t *bufferLen);
uint8_t selectTag(Uid *uid);
uint8_t getUid(Uid *uid);
void irq();
void setRf(bool on);
bool detectAsync(void (*tagEnterdCb)(Mfrc522*, void*) = nullptr, void* userData = nullptr);
void stopAsync();
bool cardPresent();
bool testFifo();
bool checkIrq(uint8_t *irq)
{
write(ComIrqReg, 0b01111111);
if(read(Status1Reg) & (1 << 4))
{
*irq = read(ComIrqReg);
return true;
}
return false;
}
static bool probe(SpiMaster* spi, ShiftReg<NFC_PORTS>* csReg, uint8_t csPin);
};