Felícito Manzano
/
DTK_Guaria2_ABInBev
Proyecto ABInBev para la tarjeta Guaria 1/2.
Diff: GT521Fx/New_GT521Fx.cpp
- Revision:
- 1:9e821e640117
- Child:
- 5:07720e3f99d2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/GT521Fx/New_GT521Fx.cpp Fri Jul 01 12:45:55 2022 -0600 @@ -0,0 +1,471 @@ +/** + * @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 "teltonika_fmu130.hpp" +#include "USBSerial.h" +#include "eeprom.h" +#include "flash_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; + +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; + ep.write(eprom_AddressArray[EE_Address_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 == 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 == 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 == 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 == 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 == 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 == 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 == 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 == 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 == 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 != 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 == ACK) { + return 0; + } else { + return -1; + } +} + +void FP_Flush() { + if(fingerprint.readable()) { + while(fingerprint.readable()){ + fingerprint.getc(); + } + } +} \ No newline at end of file