Skip to content

Commit

Permalink
updated mfrc522
Browse files Browse the repository at this point in the history
  • Loading branch information
vidura2 authored Oct 9, 2024
1 parent d304be2 commit 2f58077
Showing 1 changed file with 120 additions and 0 deletions.
120 changes: 120 additions & 0 deletions src/MFRC522Extended.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
/**
* Library extends MFRC522.h to support RATS for ISO-14443-4 PICC.
* RATS - Request for Answer To Select.
* @author JPG-Consulting
*/
#ifndef MFRC522Extended_h
#define MFRC522Extended_h

#include <Arduino.h>
#include "MFRC522.h"

class MFRC522Extended : public MFRC522 {

public:
// ISO/IEC 14443-4 bit rates
enum TagBitRates : byte {
BITRATE_106KBITS = 0x00,
BITRATE_212KBITS = 0x01,
BITRATE_424KBITS = 0x02,
BITRATE_848KBITS = 0x03
};

// Structure to store ISO/IEC 14443-4 ATS
typedef struct {
byte size;
byte fsc; // Frame size for proximity card

struct {
bool transmitted;
bool sameD; // Only the same D for both directions supported
TagBitRates ds; // Send D
TagBitRates dr; // Receive D
} ta1;

struct {
bool transmitted;
byte fwi; // Frame waiting time integer
byte sfgi; // Start-up frame guard time integer
} tb1;

struct {
bool transmitted;
bool supportsCID;
bool supportsNAD;
} tc1;

// Raw data from ATS
byte data[FIFO_SIZE - 2]; // ATS cannot be bigger than FSD - 2 bytes (CRC), according to ISO 14443-4 5.2.2
} Ats;

// A struct used for passing the PICC information
typedef struct {
uint16_t atqa;
Uid uid;
Ats ats;

// For Block PCB
bool blockNumber;
} TagInfo;

// A struct used for passing PCB Block
typedef struct {
struct {
byte pcb;
byte cid;
byte nad;
} prologue;
struct {
byte size;
byte *data;
} inf;
} PcbBlock;

// Member variables
TagInfo tag;

/////////////////////////////////////////////////////////////////////////////////////
// Contructors
/////////////////////////////////////////////////////////////////////////////////////
MFRC522Extended() : MFRC522() {};
MFRC522Extended(uint8_t rst) : MFRC522(rst) {};
MFRC522Extended(uint8_t ss, uint8_t rst) : MFRC522(ss, rst) {};

/////////////////////////////////////////////////////////////////////////////////////
// Functions for communicating with PICCs
/////////////////////////////////////////////////////////////////////////////////////
StatusCode PICC_Select(Uid *uid, byte validBits = 0) override; // overrride
StatusCode PICC_RequestATS(Ats *ats);
StatusCode PICC_PPS(); // PPS command without bitrate parameter
StatusCode PICC_PPS(TagBitRates sendBitRate, TagBitRates receiveBitRate); // Different D values

/////////////////////////////////////////////////////////////////////////////////////
// Functions for communicating with ISO/IEC 14433-4 cards
/////////////////////////////////////////////////////////////////////////////////////
StatusCode TCL_Transceive(PcbBlock *send, PcbBlock *back);
StatusCode TCL_Transceive(TagInfo * tag, byte *sendData, byte sendLen, byte *backData = NULL, byte *backLen = NULL);
StatusCode TCL_TransceiveRBlock(TagInfo *tag, bool ack, byte *backData = NULL, byte *backLen = NULL);
StatusCode TCL_Deselect(TagInfo *tag);

/////////////////////////////////////////////////////////////////////////////////////
// Support functions
/////////////////////////////////////////////////////////////////////////////////////
static PICC_Type PICC_GetType(TagInfo *tag);
using MFRC522::PICC_GetType;// // make old PICC_GetType(byte sak) available, otherwise would be hidden by PICC_GetType(TagInfo *tag)

// Support functions for debuging
void PICC_DumpToSerial(TagInfo *tag);
using MFRC522::PICC_DumpToSerial; // make old PICC_DumpToSerial(Uid *uid) available, otherwise would be hidden by PICC_DumpToSerial(TagInfo *tag)
void PICC_DumpDetailsToSerial(TagInfo *tag);
using MFRC522::PICC_DumpDetailsToSerial; // make old PICC_DumpDetailsToSerial(Uid *uid) available, otherwise would be hidden by PICC_DumpDetailsToSerial(TagInfo *tag)
void PICC_DumpISO14443_4(TagInfo *tag);

/////////////////////////////////////////////////////////////////////////////////////
// Convenience functions - does not add extra functionality
/////////////////////////////////////////////////////////////////////////////////////
bool PICC_IsNewCardPresent() override; // overrride
bool PICC_ReadCardSerial() override; // overrride
};

#endif

0 comments on commit 2f58077

Please sign in to comment.