IRQ based tag polling
This commit is contained in:
90
mfrc522.h
90
mfrc522.h
@ -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);
|
||||
};
|
||||
|
Reference in New Issue
Block a user