Commitb936739a by gitsynctest1

Automatically converted all submodules to files and commited them to the repository.

parent 5d0c4b02
[submodule "ufr-lib"]
path = lib
url = https://git.d-logic.com/nfc-rfid-reader-sdk/ufr-lib.git
lib@d51268e4
Subproject commit d51268e44fcbed7906bf6f213997734b0b05139a
# uFR Series libraries
Scope of this project are libraries used with uFR Series devices and SDK examples.
Libraries are supported at following platforms:
Windows 32 and 64 bit (static and dynamic)
Windows ARM
Linux 32 and 64 bit (dynamic only)
Linux ARM and ARM-HF (dynamic only)
Mac OSX 32 and 64 bit (dynamic only)
iOS 64位(静态)
## Getting Started
Download project, choose appropriate architecture and place a library in appropriate directory.
Consult documentation for API reference. For quick insight and functions' prototypes, check /include/ufCoder.h header file.
### Prerequisites
在这里Series reader.
## License
This project is licensed under the ..... License - see the[在这里_library_license.md](/license/uFR_library_license.md)文件详细信息
## Acknowledgments
*库仅针对提到的硬件and some other hardware might have different approach, please bear that in mind.
#include "uFR.h"
#ifdef ESP32
HardwareSerial*在这里::Packet::serial;
#else
SoftwareSerial*在这里::Packet::serial;
#endif
在这里::CommonPacket::CommonPacket(PacketTypetype,uint8_tcommand){
data=newuint8_t[PACKET_LENGTH];
errorCode=read(data);
if(errorCode==0)errorCode=validate(data,type,command);
}
在这里::CommonPacket::~CommonPacket(){
delete[]data;
}
在这里::EXTPacket::EXTPacket(uint8_tlength){
data=newuint8_t[length];
errorCode=read(data,length);
}
在这里::EXTPacket::~EXTPacket(){
delete[]data;
}
uint8_t在这里::Packet::checksum(uint8_t*packet,uint8_tsize){
uint8_tresult=packet[0];
// XOR size bytes
for(uint8_ti=1;i<size;i++)
result^=packet[i];
returnresult+0x07;
}
uint8_t在这里::CommonPacket::validate(uint8_tpacket[PACKET_LENGTH],PacketTypetype,uint8_tcommand){
if(checksum(packet)!=packet[CHKSUM_BYTE])returnCHKSUM_ERROR_RESPONSE;
if(packet[HEADER_BYTE]==ERR_HEADER){
if(packet[TRAILER_BYTE]==ERR_TRAILER)returnpacket[CMD_BYTE];
returnCOMMUNICATION_ERROR;
}
if(packet[HEADER_BYTE]!=type||packet[CMD_BYTE]!=command)returnCOMMUNICATION_ERROR;
switch(type){
casePACKET_ACK:
if(packet[TRAILER_BYTE]!=ACK_TRAILER)returnCOMMUNICATION_ERROR;
break;
casePACKET_RSP:
if(packet[TRAILER_BYTE]!=RESPONSE_TRAILER)returnCOMMUNICATION_ERROR;
break;
default:
returnCOMMUNICATION_ERROR;
}
return0;
}
uint8_t在这里::CommonPacket::read(uint8_tresponse[PACKET_LENGTH]){
unsignedlongtime=millis();
uint8_tincoming=0;
// Read bytes until header found
while(incoming!=ACK_HEADER&&incoming!=ERR_HEADER&&incoming!=RESPONSE_HEADER){
if((unsignedlong)(millis()-time)>TIMEOUT_MS)returnCOMMUNICATION_TIMEOUT;
if(serial->available()>0)incoming=serial->read();
}
// Read remaining bytes (PACKET_LENGTH - 1)
while(serial->available()<6)
if((unsignedlong)(millis()-time)>TIMEOUT_MS)returnCOMMUNICATION_TIMEOUT;
// Store bytes
response[0]=incoming;
for(uint8_ti=1;i<PACKET_LENGTH;i++)
response[i]=serial->read();
return0;
}
uint8_t在这里::EXTPacket::read(uint8_t*response,uint8_tlength){
unsignedlongtime=millis();
uint8_ti=0;
intb;
// Read length bytes
while(i<length){
if((unsignedlong)(millis()-time)>TIMEOUT_MS)returnCOMMUNICATION_TIMEOUT_EXT;
b=serial->read();
if(b!=-1){
response[i]=b;
i++;
}
}
// Read and check checksum byte (length + 1)
while(serial->available()<1)
if((unsignedlong)(millis()-time)>TIMEOUT_MS)returnCOMMUNICATION_TIMEOUT_EXT;
if(serial->read()!=checksum(response,length))returnCHKSUM_ERROR_EXT;
return0;
}
void在这里::Packet::copyData(uint8_t*array,uint16_tstart,uint16_tlength){
for(uint16_ti=0;i<length;i++)
array[i+start]=data[i];
}
void在这里::Packet::copyDataReverse(uint8_t*array,uint16_tstart,uint16_tlength){
for(uint16_ti=0;i<length;i++)
array[i+start]=data[length-i-1];
}
\ No newline at end of file
#######################################
# Syntax Coloring Map For uFR
#######################################
#######################################
# Datatypes (KEYWORD1)
#######################################
在这里KEYWORD1
#######################################
# Methods and Functions (KEYWORD2)
#######################################
hardReset KEYWORD2
setRedLED KEYWORD2
getReaderType KEYWORD2
getReaderSerial KEYWORD2
setReaderKey KEYWORD2
getUserData KEYWORD2
setUserData KEYWORD2
softReset KEYWORD2
getCardIDSimple KEYWORD2
getCardID KEYWORD2
getCardTypeDLogic KEYWORD2
TypeDLogicToString KEYWORD2
#######################################
# Constants (LITERAL1)
#######################################
\ No newline at end of file
#include "uFR.h"
# define PROCESS_EXT(length) \
EXTPacket extPacket(length); \
if (extPacket.getErrorCode() != 0) return extPacket.getErrorCode()
# define PROCESS_ACK(command) \
CommonPacket ackPacket(PACKET_ACK, command); \
if (ackPacket.getErrorCode() != 0) return ackPacket.getErrorCode()
# define PROCESS_RSP(command) \
CommonPacket rspPacket(PACKET_RSP, command); \
if (rspPacket.getErrorCode() != 0) return rspPacket.getErrorCode()
#ifdef ESP32
在这里::在这里(uint8_tuart):readerSerial(HardwareSerial(uart)){
setPacketSerial();
}
在这里::在这里(uint8_tuart,uint8_trx_pin,uint8_ttx_pin):readerSerial(HardwareSerial(uart)){
esp32_rx_pin=rx_pin;
esp32_tx_pin=tx_pin;
setPacketSerial();
}
在这里::在这里(uint8_tuart,uint8_treset):readerSerial(HardwareSerial(uart)){
pinMode(reset,OUTPUT);
digitalWrite(reset,HIGH);
resetPin=reset;
setPacketSerial();
}
在这里::在这里(uint8_tuart,uint8_treset,uint8_trx_pin,uint8_ttx_pin):readerSerial(HardwareSerial(uart)){
pinMode(reset,OUTPUT);
digitalWrite(reset,HIGH);
resetPin=reset;
esp32_rx_pin=rx_pin;
esp32_tx_pin=tx_pin;
setPacketSerial();
}
#else
在这里::在这里(uint8_trx,uint8_ttx):readerSerial(SoftwareSerial(rx,tx)){
setPacketSerial();
}
在这里::在这里(uint8_trx,uint8_ttx,uint8_treset):readerSerial(SoftwareSerial(rx,tx)){
pinMode(reset,OUTPUT);
digitalWrite(reset,HIGH);
resetPin=reset;
setPacketSerial();
}
#endif
void在这里::setPacketSerial(){
Packet::serial=&readerSerial;
}
void在这里::begin(unsignedlongbaud){
if(resetPin!=0){
delay(10);
digitalWrite(resetPin,LOW);
}
#ifdef ESP32
if(esp32_rx_pin!=0&&esp32_tx_pin!=0){
readerSerial.begin(baud,SERIAL_8N1,esp32_rx_pin,esp32_tx_pin);
}
else
{
readerSerial.begin(baud);
}
#else
readerSerial.begin(baud);
#endif
}
void在这里::hardReset(){
if(resetPin!=0){
digitalWrite(resetPin,HIGH);
delay(10);
digitalWrite(resetPin,LOW);
}
}
void在这里::flushSerial(){
while(readerSerial.available()>0)
readerSerial.read();
}
void在这里::sendPacketCMD(uint8_tcommand,uint8_tEXTlength,uint8_tpar0,uint8_tpar1){
uint8_tpacket[PACKET_LENGTH]={
CMD_HEADER,
command,
CMD_TRAILER,
EXTlength,
par0,
par1,
Packet::checksum(packet)
};
readerSerial.write(packet,PACKET_LENGTH);
}
void在这里::sendPacketEXT(uint8_t*packet,uint8_tlength){
readerSerial.write(packet,length);
readerSerial.write(Packet::checksum(packet,length));
}
// ========================================================================================
uint8_t在这里::setRedLED(boolstate){
flushSerial();
sendPacketCMD(RED_LIGHT_CONTROL,0,state);
PROCESS_RSP(RED_LIGHT_CONTROL);
return0;
}
uint8_t在这里::setUserInterfaceSignal(uint8_tlight_signal_mode,uint8_tbeep_signal_mode){
flushSerial();
sendPacketCMD(USER_INTERFACE_SIGNAL,0,light_signal_mode,beep_signal_mode);
PROCESS_RSP(USER_INTERFACE_SIGNAL);
return0;
}
uint8_t在这里::setGreenLightBlinking(boolstate){
flushSerial();
sendPacketCMD(SET_LED_CONFIG,0,state);
PROCESS_RSP(SET_LED_CONFIG);
return0;
}
uint8_t在这里::getReaderType(uint8_treaderType[READER_TYPE_SIZE]){
flushSerial();
sendPacketCMD(GET_READER_TYPE);
PROCESS_RSP(GET_READER_TYPE);
PROCESS_EXT(READER_TYPE_SIZE);
extPacket.copyDataReverse(readerType,0,READER_TYPE_SIZE);
return0;
}
uint8_t在这里::getReaderSerial(uint8_treaderSerialNumber[READER_SERIAL_SIZE]){
flushSerial();
sendPacketCMD(GET_READER_SERIAL);
PROCESS_RSP(GET_READER_SERIAL);
PROCESS_EXT(READER_SERIAL_SIZE);
extPacket.copyDataReverse(readerSerialNumber,0,READER_SERIAL_SIZE);
return0;
}
uint8_t在这里::setReaderKey(uint8_tkey[READER_KEY_SIZE],uint8_tindex){
flushSerial();
sendPacketCMD(READER_KEY_WRITE,READER_KEY_SIZE+1,index);
PROCESS_ACK(READER_KEY_WRITE);
sendPacketEXT(key,READER_KEY_SIZE);
PROCESS_RSP(READER_KEY_WRITE);
return0;
}
uint8_t在这里::getUserData(uint8_tdata[USER_DATA_SIZE]){
flushSerial();
sendPacketCMD(USER_DATA_READ);
PROCESS_RSP(USER_DATA_READ);
PROCESS_EXT(USER_DATA_SIZE);
extPacket.copyData(data,0,USER_DATA_SIZE);
return0;
}
uint8_t在这里::setUserData(uint8_tdata[USER_DATA_SIZE]){
flushSerial();
sendPacketCMD(USER_DATA_WRITE,USER_DATA_SIZE+1);
PROCESS_ACK(USER_DATA_WRITE);
sendPacketEXT(data,USER_DATA_SIZE);
PROCESS_RSP(USER_DATA_WRITE);
return0;
}
uint8_t在这里::softReset(){
flushSerial();
sendPacketCMD(SELF_RESET);
PROCESS_RSP(SELF_RESET);
return0;
}
uint8_t在这里::getCardIDSimple(uint8_tcardID[CARD_ID_SIZE],uint8_t*cardType){
flushSerial();
sendPacketCMD(GET_CARD_ID);
PROCESS_RSP(GET_CARD_ID);
PROCESS_EXT(CARD_ID_SIZE);
extPacket.copyDataReverse(cardID,0,CARD_ID_SIZE);
if(cardType)*cardType=rspPacket[PAR0_BYTE];
return0;
}
uint8_t在这里::getCardID(uint8_tcardID[CARD_ID_EX_SIZE],uint8_t*length,uint8_t*cardType){
flushSerial();
sendPacketCMD(GET_CARD_ID_EX);
PROCESS_RSP(GET_CARD_ID_EX);
PROCESS_EXT(CARD_ID_EX_SIZE);
//extPacket.copyDataReverse(cardID, 0, rspPacket[PAR1_BYTE]);
//extPacket.copyData is used to make the order of bytes of cardID as on the card
extPacket.copyData(cardID,0,rspPacket[PAR1_BYTE]);
if(cardType)*cardType=rspPacket[PAR0_BYTE];
if(length)*length=rspPacket[PAR1_BYTE];
return0;
}
uint8_t在这里::getDesfireUID(uint8_tcardID[CARD_ID_EX_SIZE],uint8_t*length,uint8_tInternalAESKeyIndexReader,uint32_tAID,uint8_tkey_number_in_application){
uint8_tdesfire_uid_size=7;//as I can see in protocol, there are no length definitions. UID is always 7B.
*length=desfire_uid_size;
uint8_tdata_to_send[22];
memset(data_to_send,0,22);
data_to_send[0]=1;
data_to_send[1]=InternalAESKeyIndexReader;
data_to_send[18]=*((uint8_t*)&AID);
data_to_send[19]=*((uint8_t*)&AID+1);
data_to_send[20]=*((uint8_t*)&AID+2);
data_to_send[21]=key_number_in_application;
/*
Serial.print("data_to_send = ");
for(int i;i<22;i++)
{
Serial.print(data_to_send[i], HEX);
Serial.print(" ");
}
Serial.print("\n");
*/
flushSerial();
sendPacketCMD(GET_DESFIRE_UID,23);
PROCESS_ACK(GET_DESFIRE_UID);
sendPacketEXT(data_to_send,22);
PROCESS_RSP(GET_DESFIRE_UID);
/*
Serial.print("RSP:");
for(int i;i<7;++i)
{
Serial.print(rspPacket[i], HEX);
Serial.print(" ");
}
Serial.print("\n");
*/
if(rspPacket[3]!=12)
{
returnPARAMETERS_ERROR;
}
PROCESS_EXT(11);
extPacket.copyData(cardID,0,desfire_uid_size);
return0;
}
uint8_t在这里::getDesfireUIDPK(uint8_tcardID[CARD_ID_EX_SIZE],uint8_t*length,uint8_t*AESKey,uint32_tAID,uint8_tkey_number_in_application){
uint8_tdesfire_uid_size=7;//as I can see in protocol, there are no length definitions. UID is always 7B.
*length=desfire_uid_size;
uint8_tdata_to_send[22];
memset(data_to_send,0,22);
data_to_send[0]=0;
data_to_send[1]=0;
memcpy(&data_to_send[2],AESKey,16);
data_to_send[18]=*((uint8_t*)&AID);
data_to_send[19]=*((uint8_t*)&AID+1);
data_to_send[20]=*((uint8_t*)&AID+2);
data_to_send[21]=key_number_in_application;
/*
Serial.print("data_to_send = ");
for(int i;i<22;i++)
{
Serial.print(data_to_send[i], HEX);
Serial.print(" ");
}
Serial.print("\n");
*/
flushSerial();
sendPacketCMD(GET_DESFIRE_UID,23);
PROCESS_ACK(GET_DESFIRE_UID);
sendPacketEXT(data_to_send,22);
PROCESS_RSP(GET_DESFIRE_UID);
/*
Serial.print("RSP:");
for(int i;i<7;++i)
{
Serial.print(rspPacket[i], HEX);
Serial.print(" ");
}
Serial.print("\n");
*/
if(rspPacket[3]!=12)
{
returnPARAMETERS_ERROR;
}
PROCESS_EXT(11);
extPacket.copyData(cardID,0,desfire_uid_size);
return0;
}
uint8_t在这里::getCardTypeDLogic(uint8_t*cardType){
flushSerial();
sendPacketCMD(GET_DLOGIC_CARD_TYPE);
PROCESS_RSP(GET_DLOGIC_CARD_TYPE);
*cardType=rspPacket[PAR0_BYTE];
return0;
}
// ========================================================================================
// Needs beautifying
constchar*TypeDLogicToString(uint8_ttype){
switch(type){
case0x00:return"TAG_UNKNOWN";break;
case0x01:return"DL_MIFARE_ULTRALIGHT";break;
case0x02:return"DL_MIFARE_ULTRALIGHT_EV1_11";break;
case0x03:return"DL_MIFARE_ULTRALIGHT_EV1_21";break;
case0x04:return"DL_MIFARE_ULTRALIGHT_C";break;
case0x05:return"DL_NTAG_203";break;
case0x06:return"DL_NTAG_210";break;
case0x07:return"DL_NTAG_212";break;
case(:return"DL_NTAG_213";break;
case0 x09:return"DL_NTAG_215";break;
case0x0A:return"DL_NTAG_216";break;
case0x0B:return"DL_MIKRON_MIK640D";break;
case0x0C:return"NFC_T2T_GENERIC";break;
case0x20:return"DL_MIFARE_MINI";break;
case0x21:return"DL_MIFARE_CLASSIC_1K";break;
case0x22:return"DL_MIFARE_CLASSIC_4K";break;
case0x23:return"DL_MIFARE_PLUS_S_2K";break;
case0x24:return"DL_MIFARE_PLUS_S_4K";break;
case0x25:return"DL_MIFARE_PLUS_X_2K";break;
case0x26:return"DL_MIFARE_PLUS_X_4K";break;
case0x27:return"DL_MIFARE_DESFIRE";break;
case0x28:return"DL_MIFARE_DESFIRE_EV1_2K";break;
case0x29:return"DL_MIFARE_DESFIRE_EV1_4K";break;
case0x2A:return"DL_MIFARE_DESFIRE_EV1_8K";break;
case0x2B:return"DL_MIFARE_DESFIRE_EV2_2K";break;
case0x2C:return"DL_MIFARE_DESFIRE_EV2_4K";break;
case0x2D:return"DL_MIFARE_DESFIRE_EV2_8K";break;
case0x40:return"DL_GENERIC_ISO14443_4";break;
case0x41:return"DL_GENERIC_ISO14443_TYPE_B";break;
case0x80:return"DL_IMEI_UID";break;
default:return"TYPE_ERROR";
}
}
/// Digital Logic uFR NFC card reader library for Arduino
///
/// Based on IS21 DLogic serial communication protocol
///
/// Version: 1.0.0
/// 2018 Marko Djordjevic
#include
#ifdef ESP32
#include
#else
#include
#endif
# define TIMEOUT_MS 100 // Debugging
// Communication constants
# define MAX_PACKET_LENGTH 64
# define HEADER_BYTE 0
# define CMD_BYTE 1
# define TRAILER_BYTE 2
# define EXT_LENGTH_BYTE 3
# define PAR0_BYTE 4
# define PAR1_BYTE 5
# define CHKSUM_BYTE 6
# define PACKET_LENGTH 7
# define CMD_HEADER 0x55
# define ACK_HEADER 0xAC
# define RESPONSE_HEADER 0xDE
# define ERR_HEADER 0xEC
# define CMD_TRAILER 0xAA
# define ACK_TRAILER 0xCA
# define RESPONSE_TRAILER 0xED
# define ERR_TRAILER 0xCE
// CMD codes
# define GET_READER_TYPE 0x10
# define GET_READER_SERIAL 0x11
# define READER_KEY_WRITE 0x12
# define GET_CARD_ID 0x13
# define LINEAR_READ 0x14
# define LINEAR_WRITE 0x15
# define BLOCK_READ 0x16
# define BLOCK_WRITE 0x17
# define BLOCK_IN_SECTOR_READ 0x18
# define BLOCK_IN_SECTOR_WRITE 0x19
# define SECTOR_TRAILER_WRITE 0X1A
# define USER_DATA_READ 0x1B
# define USER_DATA_WRITE 0x1C
# define VALUE_BLOCK_READ 0x1D
# define VALUE_BLOCK_WRITE 0x1E
# define VALUE_BLOCK_IN_SECTOR_READ 0x1F
# define VALUE_BLOCK_IN_SECTOR_WRITE 0x20
# define VALUE_BLOCK_INC 0x21
# define VALUE_BLOCK_DEC 0x22
# define VALUE_BLOCK_IN_SECTOR_INC 0x23
# define VALUE_BLOCK_IN_SECTOR_DEC 0x24
# define LINEAR_FORMAT_CARD 0x25
# define USER_INTERFACE_SIGNAL 0x26
# define GET_CARD_ID_EX 0x2C
# define SECTOR_TRAILER_WRITE_UNSAFE 0x2F
# define SELF_RESET 0x30
# define GET_DLOGIC_CARD_TYPE 0x3C
# define SET_CARD_ID_SEND_CONF 0x3D
# define GET_CARD_ID_SEND_CONF 0x3E
# define SET_LED_CONFIG 0x6E
# define SET_UART_SPEED 0x70
# define RED_LIGHT_CONTROL 0x71
# define GET_DESFIRE_UID 0x80
// ERR codes
# define OK 0x00
# define COMMUNICATION_ERROR 0x01
# define COMMUNICATION_TIMEOUT 0x50
# define COMMUNICATION_TIMEOUT_EXT 0x51
# define CHKSUM_ERROR 0x02
# define CHKSUM_ERROR_RESPONSE 0x52
# define CHKSUM_ERROR_EXT 0x53
# define READING_ERROR 0x03
# define WRITING_ERROR 0x04
# define BUFFER_OVERFLOW 0x05
# define MAX_ADDRESS_EXCEEDED 0x06
# define MAX_KEY_INDEX_EXCEEDED 0x07
# define NO_CARD 0x08
# define COMMAND_NOT_SUPPORTED 0x09
# define FORBIDEN_DIRECT_WRITE_IN_SECTOR_TRAILER 0x0A
# define ADDRESSED_BLOCK_IS_NOT_SECTOR_TRAILER 0x0B
# define WRONG_ADDRESS_MODE 0x0C
# define WRONG_ACCESS_BITS_VALUES 0x0D
# define AUTH_ERROR 0x0E
# define PARAMETERS_ERROR 0x0F
# define WRITE_VERIFICATION_ERROR 0x70
# define BUFFER_SIZE_EXCEEDED 0x71
# define VALUE_BLOCK_INVALID 0x72
# define VALUE_BLOCK_ADDR_INVALID 0x73
# define VALUE_BLOCK_MANIPULATION_ERROR 0x74
// MIFARE CLASSIC type id's:
# define MIFARE_CLASSIC_1k 0x08
# define MF1ICS50 0x08
# define SLE66R35 0x88 // Infineon = Mifare Classic 1k
# define MIFARE_CLASSIC_4k 0x18
# define MF1ICS70 0x18
# define MIFARE_CLASSIC_MINI 0x09
# define MF1ICS20 0x09
// DLOGIC CARD TYPE
# define TAG_UNKNOWN 0
# define DL_MIFARE_ULTRALIGHT 0x01
# define DL_MIFARE_ULTRALIGHT_EV1_11 0x02
# define DL_MIFARE_ULTRALIGHT_EV1_21 0x03
# define DL_MIFARE_ULTRALIGHT_C 0x04
# define DL_NTAG_203 0x05
# define DL_NTAG_210 0x06
# define DL_NTAG_212 0x07
# define DL_NTAG_213 0x08
# define DL_NTAG_215 0x09
# define DL_NTAG_216 0x0A
# define DL_MIKRON_MIK640D 0x0B
# define NFC_T2T_GENERIC 0x0C
# define DL_MIFARE_MINI 0x20
# define DL_MIFARE_CLASSIC_1K 0x21
# define DL_MIFARE_CLASSIC_4K 0x22
# define DL_MIFARE_PLUS_S_2K 0x23
# define DL_MIFARE_PLUS_S_4K 0x24
# define DL_MIFARE_PLUS_X_2K 0x25
# define DL_MIFARE_PLUS_X_4K 0x26
# define DL_MIFARE_DESFIRE 0x27
# define DL_MIFARE_DESFIRE_EV1_2K 0x28
# define DL_MIFARE_DESFIRE_EV1_4K 0x29
# define DL_MIFARE_DESFIRE_EV1_8K 0x2A
# define DL_MIFARE_DESFIRE_EV2_2K 0x2B
# define DL_MIFARE_DESFIRE_EV2_4K 0x2C
# define DL_MIFARE_DESFIRE_EV2_8K 0x2D
//#define DL_UNKNOWN_ISO_14443_4 0x40
# define DL_GENERIC_ISO14443_4 0x40
# define DL_GENERIC_ISO14443_TYPE_B 0x41
# define DL_IMEI_UID 0x80
// Function return sizes in bytes
# define READER_TYPE_SIZE 4
# define READER_SERIAL_SIZE 4
# define READER_KEY_SIZE 6
# define USER_DATA_SIZE 16
# define CARD_ID_SIZE 4
# define CARD_ID_EX_SIZE 10
// USER_INTERFACE_SIGNAL
# define NONE 0
# define LONG_GREEN 1
# define SHORT_BEEP 1
# define LONG_RED 2
# define LONG_BEEP 2
# define ALTERNATNG_LIGHT 3
# define DOUBLE_SHORT_BEEP 3
# define FLASH_LIGHT 4
# define TRIPLE_SHORT_BEEP 4
# define TRIPLET_MELODY 5
enumPacketType{
PACKET_ACK=ACK_HEADER,
PACKET_ERR=ERR_HEADER,
PACKET_RSP=RESPONSE_HEADER
};
class在这里{
public:
#ifdef ESP32
在这里(uint8_tuart);
在这里(uint8_tuart,uint8_treset);
在这里(uint8_tuart,uint8_trx_pin,uint8_ttx_pin);
在这里(uint8_tuart,uint8_treset,uint8_trx_pin,uint8_ttx_pin);
#else
在这里(uint8_trx,uint8_ttx);
在这里(uint8_trx,uint8_ttx,uint8_treset);
#endif
voidbegin(unsignedlongbaud=115200);// Resets the reader if reset pin is used; make sure to add delay!
inlinevoidend(){readerSerial.end();}
// Resets through reset pin (if declared)
voidhardReset();// Make sure to add delay!
/ /所有函数tions return error codes after execution
// If 0 is returned, the function has executed normally
// Controls the reader's red LED. Green LED stops flashing while red LED is on
uint8_tsetRedLED(boolstate);
uint8_tsetUserInterfaceSignal(uint8_tlight_signal_mode=0,uint8_tbeep_signal_mode=0);
uint8_tsetGreenLightBlinking(boolstate);
uint8_tgetReaderType(uint8_treaderType[READER_TYPE_SIZE]);
uint8_tgetReaderSerial(uint8_treaderSerialNumber[READER_SERIAL_SIZE]);
// Writes MIFARE key into reader EEPROM, at index location (0-31)
uint8_tsetReaderKey(uint8_tkey[READER_KEY_SIZE],uint8_tindex);
// User data are 16 bytes form internal EEPROM
uint8_tgetUserData(uint8_tdata[USER_DATA_SIZE]);
uint8_tsetUserData(uint8_tdata[USER_DATA_SIZE]);
// Sends reset command (add 2s delay!)
uint8_tsoftReset();
// Gets card UID that is present in reader's RF field. Obsolete
uint8_tgetCardIDSimple(uint8_tcardID[CARD_ID_SIZE],uint8_t*cardType=nullptr);
// Length - UID size in bytes (4, 7 or 10)
uint8_tgetCardID(uint8_tcardID[CARD_ID_EX_SIZE],uint8_t*length=nullptr,uint8_t*cardType=nullptr);
// Gets Desfire UID
uint8_tgetDesfireUID(uint8_tcardID[CARD_ID_EX_SIZE],uint8_t*length=nullptr,uint8_tInternalAESKeyIndexReader=0,uint32_tAID=0,uint8_tkey_number_in_application=0);
// Gets Desfire UID with provided AES key
uint8_tgetDesfireUIDPK(uint8_tcardID[CARD_ID_EX_SIZE],uint8_t*length,uint8_t*AESKey=nullptr,uint32_tAID=0,uint8_tkey_number_in_application=0);
// Card type per DLogic enumeration
uint8_tgetCardTypeDLogic(uint8_t*cardType);
// -------------------------------------------------------------
staticconstchar*TypeDLogicToString(uint8_ttype);
private:
#ifdef ESP32
HardwareSerialreaderSerial;
uint8_tesp32_rx_pin=0;
uint8_tesp32_tx_pin=0;
#else
SoftwareSerialreaderSerial;
#endif
uint8_tresetPin=0;
voidflushSerial();// Flush serial input buffer
voidsendPacketCMD(uint8_tcommand,uint8_tEXTlength=0,uint8_tpar0=0,uint8_tpar1=0);
voidsendPacketEXT(uint8_t*packet,uint8_tlength);
voidsetPacketSerial();// Sets static protected packet serial pointer
classPacket{
public:
staticuint8_tchecksum(uint8_t*packet,uint8_tsize=PACKET_LENGTH-1);
inlineuint8_tgetErrorCode(){returnerrorCode;}
inlineuint8_tgetLength(){returnlength;}
voidcopyData(uint8_t*array,uint16_tstart,uint16_tlength);
voidcopyDataReverse(uint8_t*array,uint16_tstart,uint16_tlength);
inlineuint8_toperator[](uint8_ti){returndata[i];}
friendvoid在这里::setPacketSerial();
protected:
#ifdef ESP32
staticHardwareSerial*serial;
#else
staticSoftwareSerial*serial;
#endif
uint8_terrorCode=0;
uint8_tlength=PACKET_LENGTH;
uint8_t*data;
};
classCommonPacket:publicPacket{
// Returns error code
uint8_tread(uint8_tresponse[PACKET_LENGTH]);
uint8_tvalidate(uint8_tpacket[PACKET_LENGTH],PacketTypetype,uint8_tcommand);
public:
CommonPacket(PacketTypetype,uint8_tcommand);
~CommonPacket();
};
classEXTPacket:publicPacket{
// Returns error code, reads AND validates
uint8_tread(uint8_t*response,uint8_tlength);
public:
EXTPacket(uint8_tlength);
~EXTPacket();
};
};
idf_component_register(INCLUDE_DIRS"include")
SET(CMAKE_C_FLAGS"${CMAKE_C_FLAGS}-Wno-pragmas -Wno-unused-variable -Wno-maybe-uninitialized -Wno-implicit-function-declaration -mlongcalls -Wno-type-limits -Wno-implicit-fallthrough -Wno-format-overflow -Wno-comment -Wno-format-truncation -Wno-array-bounds -DDEBUG_PRINT=0 -D_NO_FTDI=1 -DESP_PLATFORM=1")
target_link_libraries(${COMPONENT_LIB}INTERFACE"-L${CMAKE_CURRENT_LIST_DIR}/lib")
target_link_libraries(${COMPONENT_LIB}INTERFACE ufcoder)
\ No newline at end of file
COMPONENT_ADD_INCLUDEDIRS := include
CFLAGS := -Wno-pragmas -Wno-unused-variable -Wno-maybe-uninitialized -Wno-implicit-function-declaration -mlongcalls -DDEBUG_PRINT=0 -D_NO_FTDI=1
COMPONENT_ADD_LDFLAGS += $(COMPONENT_PATH)/lib/libufcoder.a
\ No newline at end of file
This source diff could not be displayed because it is too large. You canview the blobinstead.
This source diff could not be displayed because it is too large. You canview the blobinstead.
When you use uFCoder static library, you must define DL_USE_STATIC_LIB macro before include uFCoder.h
Also you must setup linking FTDI d2xx library in your project. FTDI distribute their library on its website http://www.ftdichip.com/Drivers/D2XX.htm
They stated in ftd2xx.h:
// Static D2XX depends on these Windows libs:
#pragma comment(lib, "setupapi.lib")
#pragma comment(lib, "advapi32.lib")
#pragma comment(lib, "user32.lib")
After uFR-library version 4.4.1 an additional library [ws2_32.lib] must be included to support UDP transfer protocol
#pragma comment(lib, "ws2_32.lib")
When you use uFCoder static library, you must define DL_USE_STATIC_LIB macro before include uFCoder.h
Also you must setup linking FTDI d2xx library in your project. FTDI distribute their library on its website http://www.ftdichip.com/Drivers/D2XX.htm
They stated in ftd2xx.h:
// Static D2XX depends on these Windows libs:
#pragma comment(lib, "setupapi.lib")
#pragma comment(lib, "advapi32.lib")
#pragma comment(lib, "user32.lib")
After uFR-library version 4.4.1 an additional library [ws2_32.lib] must be included to support UDP transfer protocol
#pragma comment(lib, "ws2_32.lib")
# New Feature - COM wrapper for uFCoder library
Implemented Component Object Model wrapper for uFCoder library.
```
COMuFCoder-x86.dll
```
## How to register COM library
```
regasm COMuFCoder-x86.dll /codebase
```
response:
```
Microsoft .NET Framework Assembly Registration Utility version 4.7.3056.0
for Microsoft .NET Framework version 4.7.3056.0
Copyright (C) Microsoft Corporation. All rights reserved.
Types registered successfully
```
This source diff could not be displayed because it is too large. You canview the blobinstead.
    Markdownis supported
    0%or
    You are about to add0peopleto the discussion. Proceed with caution.
    Finish editing this message first!
    Pleaseregisterorto comment
    Baidu
    map