Proyecto ABInBev para la tarjeta Guaria 1/2.

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