Proyecto ABInBev para la tarjeta Guaria 1/2.

GT521Fx/New_GT521Fx.cpp

Committer:
fmanzano_dtk
Date:
2022-07-07
Revision:
15:6033d2f3d819
Parent:
12:5881f350b4da
Child:
16:772ea817ec43

File content as of revision 15:6033d2f3d819:

/**
 * @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_eeprom.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();
		}
	}
}