Felícito Manzano
/
DTK_Guaria2_ABInBev
Proyecto ABInBev para la tarjeta Guaria 1/2.
GT521Fx/New_GT521Fx.cpp
- Committer:
- fmanzano_dtk
- Date:
- 2022-07-07
- Revision:
- 18:522f706f03b1
- Parent:
- 17:c53ea16f75c0
- Child:
- 19:5580a9a54ad5
File content as of revision 18:522f706f03b1:
/** * @file New_GT521Fx.cpp * @author Felícito Manzano (felicito.manzano@detektor.com.sv) * @brief * @version 0.1 * @date 2021-02-13 * * @copyright Copyright (c) 2021 * */ #include "New_GT521Fx.hpp" #include "BufferedSerial.h" #include "eeprom.h" #include "flash_eeprom.h" #include "teltonika_fmu130.hpp" #include "USBSerial.h" #include "flash_ee_exe.hpp" #include "eeprom_exe.hpp" #include <ctype.h> extern BufferedSerial fingerprint; extern BufferedSerial avl_uart; extern DigitalOut out1_fingerprint; extern USBSerial myPC_debug; extern uint16_t VirtAddVarTab[]; extern uint16_t VarDataTab[]; extern uint32_t eprom_AddressArray[]; extern bool functionality_fingerprint_reader; extern bool fingerprint_flag_poweroff; extern EEPROM ep; extern const bool external_eeprom; unsigned long return_para; unsigned short return_ack; const char TCA_ID_FP_FAILURE[] = "TCA|157|0"; const char TCA_ID_FP_DISABLE[] = "TCA|111|0"; const char GT521_ENGINE_UNLOCK[] = "setdigout 1?? ? ? ? ? ? ?"; char error_buffer[64]; COMMAND_PACKAGE_STRUCTURE command_package; DATA_PACKAGE_STRUCTURE data_package; #define NEW_GT521FX_CPP void SendCommand(unsigned char *ucData, unsigned int length) { unsigned int i; for(i = 0; i < length; i++) fingerprint.putc(*(ucData + i)); } void SendData(unsigned char *ucData, unsigned int length) { unsigned int i; for(i = 0; i < length; i++) fingerprint.putc(*(ucData + i)); } void ReceiveCommand(unsigned char *ucData,unsigned int length) { unsigned int i=0,time_out=0; do { if(fingerprint.readable()>0) { time_out = 0; if(i < length) { *(ucData + i) = (uint8_t)fingerprint.getc(); i++; //write command package from RX } } else { wait_us(1000); time_out++; if(time_out==5001) { if (!(fingerprint_flag_poweroff)) { #ifdef NEW_GT521FX_CPP myPC_debug.printf("ERROR - GT521Fx no responde\r\n"); #endif functionality_fingerprint_reader = false; if (external_eeprom) { //ep.write(eprom_AddressArray[EE_Address_FINGERPRINT], ((uint16_t) false)); } else { //EE_WriteVariable(VirtAddVarTab[AP_FINGERPRINT], ((uint16_t) false)); } memset(error_buffer, '\0', sizeof(error_buffer)); sprintf(error_buffer, "%s", TCA_ID_FP_FAILURE); tx_fmu130_message(error_buffer, &avl_uart); wait_us(1000000); memset(error_buffer, '\0', sizeof(error_buffer)); sprintf(error_buffer, "%s", TCA_ID_FP_DISABLE); tx_fmu130_message(error_buffer, &avl_uart); wait_us(1000000); tx_fmu130_command(GT521_ENGINE_UNLOCK, &avl_uart); out1_fingerprint = 1; wait_us(1000000); out1_fingerprint = 0; NVIC_SystemReset(); } } } } while(i<length); //check whether bytes } void ReceiveData(unsigned char *ucData,unsigned int length) { unsigned int i=0,time_out=0; do { if(fingerprint.readable()>0) { if(i < length) { *(ucData + i) = (uint8_t)fingerprint.getc(); i++; //write command package from RX } } else { wait_us(100000); time_out++; if(time_out==5000) { #ifdef NEW_GT521FX_CPP myPC_debug.printf("ERROR - No fingerprint module!\n"); #endif } } } while(i<length); //check whether bytes } unsigned short CalcChkSumOfCmdAckPkt(COMMAND_PACKAGE_STRUCTURE *pPkt) { unsigned short wChkSum = 0; unsigned char *pBuf = (unsigned char*)pPkt; int i; for(i=0;i<(sizeof(COMMAND_PACKAGE_STRUCTURE)-2);i++) wChkSum += pBuf[i]; return wChkSum; } unsigned short CalcChkSumOfDataPkt(DATA_PACKAGE_STRUCTURE *pPkt) { unsigned short wChkSum = 0; unsigned char *pBuf = (unsigned char*)pPkt; int i; for(i=0;i<(sizeof(DATA_PACKAGE_STRUCTURE)-2);i++) wChkSum += pBuf[i]; return wChkSum; } void send_receive_command() { SendCommand(&command_package.Head1,COMMAND_PACKAGE_LENGTH); ReceiveCommand(&command_package.Head1,COMMAND_PACKAGE_LENGTH); return_para=command_package.nParam; return_ack=command_package.wCmd; } void send_NO_receive_command() { SendCommand(&command_package.Head1,COMMAND_PACKAGE_LENGTH); //ReceiveCommand(&command_package.Head1,COMMAND_PACKAGE_LENGTH); //return_para=command_package.nParam; //return_ack=command_package.wCmd; } void send_receive_data() { SendData(&data_package.DHead1,DATA_FP_PACKAGE_LENGTH); ReceiveCommand(&command_package.Head1,COMMAND_PACKAGE_LENGTH); return_para=command_package.nParam; return_ack=command_package.wCmd; } int FP_Open() { int i; unsigned int zero = 0x00; for (i=0; i < CEROS_INICIO; i++) { fingerprint.putc(zero); } wait_us(TIEMPO_ESPERA); FP_Flush(); int unsigned first_cmd[] = {0x55, 0xAA, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x01}; for (i=0; i < COMMAND_PACKAGE_LENGTH; i++){ fingerprint.putc(first_cmd[i]); } /* command_package.Head1=COMMAND_START_CODE1; command_package.Head2=COMMAND_START_CODE2; command_package.wDevId=DEVICE_ID; command_package.nParam=0x00000000; //didn't get information command_package.wCmd=OPEN; command_package.wChkSum=CalcChkSumOfCmdAckPkt(&command_package); SendCommand(&command_package.Head1,COMMAND_PACKAGE_LENGTH);*/ wait_us(TIEMPO_ESPERA); FP_Flush(); command_package.Head1=COMMAND_START_CODE1; command_package.Head2=COMMAND_START_CODE2; command_package.wDevId=DEVICE_ID; command_package.nParam=0x00000000; //didn't get information command_package.wCmd=UNKNOW; command_package.wChkSum=CalcChkSumOfCmdAckPkt(&command_package); SendCommand(&command_package.Head1,COMMAND_PACKAGE_LENGTH); wait_us(TIEMPO_ESPERA); FP_Flush(); //send_receive_command(); //if(return_ack == FP_ACK) { return 0; //} else { // return -1; //} } void FP_Close() { command_package.Head1=COMMAND_START_CODE1; command_package.Head2=COMMAND_START_CODE2; command_package.wDevId=DEVICE_ID; command_package.nParam=0x00000000; //didn't get information command_package.wCmd=CLOSE; command_package.wChkSum=CalcChkSumOfCmdAckPkt(&command_package); send_NO_receive_command(); wait_us(200000); FP_Flush(); command_package.Head1=COMMAND_START_CODE1; command_package.Head2=COMMAND_START_CODE2; command_package.wDevId=DEVICE_ID; command_package.nParam=9600; //didn't get information command_package.wCmd=CHANGE_BAUD; command_package.wChkSum=CalcChkSumOfCmdAckPkt(&command_package); send_NO_receive_command(); wait_us(200000); FP_Flush(); } int FP_LED_open() { command_package.Head1=COMMAND_START_CODE1; command_package.Head2=COMMAND_START_CODE2; command_package.wDevId=DEVICE_ID; command_package.nParam=0x00000001; //open LED command_package.wCmd=CMOSLED; command_package.wChkSum=CalcChkSumOfCmdAckPkt(&command_package); send_receive_command(); if(return_ack == FP_ACK) { return 0; } else { return -1; } } int FP_LED_close() { command_package.Head1=COMMAND_START_CODE1; command_package.Head2=COMMAND_START_CODE2; command_package.wDevId=DEVICE_ID; command_package.nParam=0x00000000; //close LED command_package.wCmd=CMOSLED; command_package.wChkSum=CalcChkSumOfCmdAckPkt(&command_package); send_receive_command(); if(return_ack == FP_ACK) { return 0; } else { return -1; } } int FP_GetEnrollCount() { command_package.Head1=COMMAND_START_CODE1; command_package.Head2=COMMAND_START_CODE2; command_package.wDevId=DEVICE_ID; command_package.nParam=0x00000000; command_package.wCmd=GETENROLLCOUNT; command_package.wChkSum=CalcChkSumOfCmdAckPkt(&command_package); send_receive_command(); if(return_ack == FP_ACK) { return ((int) return_para); } else { return -1; } } int FP_CheckEnrolled(int thisID) { command_package.Head1=COMMAND_START_CODE1; command_package.Head2=COMMAND_START_CODE2; command_package.wDevId=DEVICE_ID; command_package.nParam=thisID; command_package.wCmd=CHECK_ENROLLED; command_package.wChkSum=CalcChkSumOfCmdAckPkt(&command_package); send_receive_command(); if(return_ack == FP_ACK) { return 1; // Segun definicion TCA } else { return 0; } } void FP_EnrollStart(int specify_ID) { command_package.Head1=COMMAND_START_CODE1; command_package.Head2=COMMAND_START_CODE2; command_package.wDevId=DEVICE_ID; command_package.nParam=specify_ID; command_package.wCmd=ENROLLSTART; command_package.wChkSum=CalcChkSumOfCmdAckPkt(&command_package); send_receive_command(); } void FP_Enroll(int Enroll_define) { unsigned short Enroll_command; switch(Enroll_define) { case 1: Enroll_command=ENROLL1; break; case 2: Enroll_command=ENROLL2; break; case 3: Enroll_command=ENROLL3; break; } command_package.Head1=COMMAND_START_CODE1; command_package.Head2=COMMAND_START_CODE2; command_package.wDevId=DEVICE_ID; command_package.nParam=0x00000000; command_package.wCmd=Enroll_command; command_package.wChkSum=CalcChkSumOfCmdAckPkt(&command_package); send_receive_command(); } int FP_IsPressFinger() { command_package.Head1=COMMAND_START_CODE1; command_package.Head2=COMMAND_START_CODE2; command_package.wDevId=DEVICE_ID; command_package.nParam=0x00000000; command_package.wCmd=ISPRESSFINGER; command_package.wChkSum=CalcChkSumOfCmdAckPkt(&command_package); send_receive_command(); if(return_ack == FP_ACK) { return ((int) return_para); } else { return -1; } } void FP_CaptureFinger(unsigned long picture_quality) { //0:normal picture, 1:best picture command_package.Head1=COMMAND_START_CODE1; command_package.Head2=COMMAND_START_CODE2; command_package.wDevId=DEVICE_ID; command_package.nParam=picture_quality; command_package.wCmd=CAPTURE_FINGER; command_package.wChkSum=CalcChkSumOfCmdAckPkt(&command_package); send_receive_command(); } int FP_DeleteAll() { command_package.Head1=COMMAND_START_CODE1; command_package.Head2=COMMAND_START_CODE2; command_package.wDevId=DEVICE_ID; command_package.nParam=0x00000000; command_package.wCmd=DELETEALL; command_package.wChkSum=CalcChkSumOfCmdAckPkt(&command_package); send_receive_command(); if(return_ack == FP_ACK) { return 0; } else { return -1; } } int FP_DeleteID(int thisID) { command_package.Head1=COMMAND_START_CODE1; command_package.Head2=COMMAND_START_CODE2; command_package.wDevId=DEVICE_ID; command_package.nParam=thisID; command_package.wCmd=DELETEID; command_package.wChkSum=CalcChkSumOfCmdAckPkt(&command_package); send_receive_command(); if(return_ack == FP_ACK) { return 0; } else { return -1; } } int FP_Identify() { command_package.Head1=COMMAND_START_CODE1; command_package.Head2=COMMAND_START_CODE2; command_package.wDevId=DEVICE_ID; command_package.nParam=0x00000000; command_package.wCmd=IDENTIFY; command_package.wChkSum=CalcChkSumOfCmdAckPkt(&command_package); send_receive_command(); if(return_ack == FP_ACK) { return ((int) return_para); } else { return -1; } } void FP_Sleep() { command_package.Head1=COMMAND_START_CODE1; command_package.Head2=COMMAND_START_CODE2; command_package.wDevId=DEVICE_ID; command_package.nParam=0x00000000; command_package.wCmd=STANDBY_MODE; command_package.wChkSum=CalcChkSumOfCmdAckPkt(&command_package); send_receive_command(); } int FP_SetTemplate(int thisID, char * fingerData) { unsigned char thisData_package[504]; unsigned int thisSend_checksum = 0; int xyz; command_package.Head1=COMMAND_START_CODE1; command_package.Head2=COMMAND_START_CODE2; command_package.wDevId=DEVICE_ID; command_package.nParam=thisID; command_package.wCmd=SETTEMPLATE; command_package.wChkSum=CalcChkSumOfCmdAckPkt(&command_package); send_receive_command(); if (return_ack != FP_ACK) { return -1; } thisData_package[0] = DATA_START_CODE1; thisData_package[1] = DATA_START_CODE2; thisData_package[2] = 0x01; thisData_package[3] = 0x00; for (xyz = 4; xyz <= 501; xyz++) { thisData_package[xyz] = fingerData[xyz -4]; } for (xyz = 0; xyz < 502; xyz++) { thisSend_checksum = thisSend_checksum + thisData_package[xyz]; } thisData_package[502] = thisSend_checksum&0x00FF; thisData_package[503] = thisSend_checksum>>8; for(xyz = 0; xyz < 504; xyz++) { fingerprint.putc(thisData_package[xyz]); } ReceiveCommand(&command_package.Head1,COMMAND_PACKAGE_LENGTH); return_ack=command_package.wCmd; if(return_ack == FP_ACK) { return 0; } else { return -1; } } void FP_Flush() { if(fingerprint.readable()) { while(fingerprint.readable()){ fingerprint.getc(); } } }