Proyecto ABInBev para la tarjeta Guaria 1/2.

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers New_GT521Fx.cpp Source File

New_GT521Fx.cpp

Go to the documentation of this file.
00001 /**
00002  * @file New_GT521Fx.cpp
00003  * @author Felícito Manzano (felicito.manzano@detektor.com.sv)
00004  * @brief 
00005  * @version 0.1
00006  * @date 2021-02-13
00007  * 
00008  * @copyright Copyright (c) 2021
00009  * 
00010  */
00011 
00012 #include "New_GT521Fx.hpp "
00013 #include "BufferedSerial.h"
00014 #include "eeprom.h"
00015 #include "flash_eeprom.h"
00016 #include "teltonika_fmu130.hpp "
00017 #include "USBSerial.h"
00018 #include "flash_ee_exe.hpp "
00019 #include "eeprom_exe.hpp"
00020 #include <ctype.h>
00021 
00022 extern BufferedSerial   fingerprint;
00023 extern BufferedSerial   avl_uart;
00024 extern DigitalOut       out1_fingerprint;
00025 extern USBSerial        myPC_debug;
00026 extern uint16_t         VirtAddVarTab[];
00027 extern uint16_t         VarDataTab[];
00028 extern uint32_t         eprom_AddressArray[];
00029 extern bool             functionality_fingerprint_reader;
00030 extern bool             fingerprint_flag_poweroff;
00031 extern EEPROM           ep;
00032 extern const bool       external_eeprom;
00033 
00034 unsigned long   return_para;   
00035 unsigned short  return_ack;
00036 const char        TCA_ID_FP_FAILURE[]   = "TCA|157|0";
00037 const char      TCA_ID_FP_DISABLE[]   = "TCA|111|0";
00038 const char      GT521_ENGINE_UNLOCK[] = "setdigout 1?? ? ? ? ? ? ?";
00039 char                  error_buffer[64];
00040 
00041 COMMAND_PACKAGE_STRUCTURE command_package;     
00042 DATA_PACKAGE_STRUCTURE    data_package;
00043 #define NEW_GT521FX_CPP
00044 
00045 void SendCommand(unsigned char *ucData, unsigned int length) {
00046    unsigned int i;
00047    for(i = 0; i < length; i++)
00048       fingerprint.putc(*(ucData + i));
00049 }
00050 
00051 void SendData(unsigned char *ucData, unsigned int length) {
00052   unsigned int i;
00053   for(i = 0; i < length; i++)
00054       fingerprint.putc(*(ucData + i));
00055 }
00056 
00057 void ReceiveCommand(unsigned char *ucData,unsigned int length) {
00058     unsigned int i=0,time_out=0;
00059     do {
00060         if(fingerprint.readable()>0) {
00061             time_out = 0;
00062             if(i < length) {
00063                 *(ucData + i) = (uint8_t)fingerprint.getc();
00064                 i++;  //write command package from RX
00065             }
00066         } else {
00067             wait_us(1000); 
00068             time_out++;
00069             if(time_out==5001) {
00070               if (!(fingerprint_flag_poweroff)) {
00071                 #ifdef NEW_GT521FX_CPP
00072                   myPC_debug.printf("ERROR - GT521Fx no responde\r\n"); 
00073                 #endif
00074                 functionality_fingerprint_reader = false;
00075                 if (external_eeprom) {
00076                   //ep.write(eprom_AddressArray[EE_Address_FINGERPRINT], ((uint16_t) false));
00077                 } else {
00078                   //EE_WriteVariable(VirtAddVarTab[AP_FINGERPRINT], ((uint16_t) false));
00079                 }
00080                 memset(error_buffer, '\0', sizeof(error_buffer));
00081                 sprintf(error_buffer, "%s", TCA_ID_FP_FAILURE);
00082                 tx_fmu130_message (error_buffer, &avl_uart);
00083                 wait_us(1000000);
00084 
00085                 memset(error_buffer, '\0', sizeof(error_buffer));
00086                 sprintf(error_buffer, "%s", TCA_ID_FP_DISABLE);
00087                 tx_fmu130_message (error_buffer, &avl_uart);
00088                 wait_us(1000000);
00089 
00090                 tx_fmu130_command(GT521_ENGINE_UNLOCK, &avl_uart);
00091                 out1_fingerprint = 1;
00092                 wait_us(1000000);
00093                 out1_fingerprint = 0;
00094                 NVIC_SystemReset();
00095               }
00096             }
00097         }
00098     } while(i<length);  //check whether bytes
00099 }
00100 
00101 void ReceiveData(unsigned char *ucData,unsigned int length) {
00102     unsigned int i=0,time_out=0;
00103     do {
00104         if(fingerprint.readable()>0) {
00105             if(i < length) {
00106                 *(ucData + i) = (uint8_t)fingerprint.getc();
00107                 i++;  //write command package from RX
00108             }
00109         } else {
00110             wait_us(100000);    
00111             time_out++;
00112             if(time_out==5000) {
00113               #ifdef NEW_GT521FX_CPP
00114                 myPC_debug.printf("ERROR - No fingerprint module!\n"); 
00115               #endif
00116             }
00117         }
00118     } while(i<length);  //check whether bytes
00119 }
00120 
00121 
00122 unsigned short CalcChkSumOfCmdAckPkt(COMMAND_PACKAGE_STRUCTURE *pPkt)
00123 {
00124    unsigned short wChkSum = 0;
00125    unsigned char *pBuf = (unsigned char*)pPkt;
00126    int i;
00127     
00128    for(i=0;i<(sizeof(COMMAND_PACKAGE_STRUCTURE)-2);i++)
00129       wChkSum += pBuf[i];
00130 
00131    return wChkSum;
00132 }
00133 
00134 unsigned short CalcChkSumOfDataPkt(DATA_PACKAGE_STRUCTURE *pPkt)
00135 {
00136    unsigned short wChkSum = 0;
00137    unsigned char *pBuf = (unsigned char*)pPkt;
00138    int i;
00139     
00140    for(i=0;i<(sizeof(DATA_PACKAGE_STRUCTURE)-2);i++)
00141       wChkSum += pBuf[i];
00142 
00143    return wChkSum;
00144 }
00145 
00146 
00147 void send_receive_command() {
00148    SendCommand(&command_package.Head1,COMMAND_PACKAGE_LENGTH);   
00149    ReceiveCommand(&command_package.Head1,COMMAND_PACKAGE_LENGTH);  
00150   
00151    return_para=command_package.nParam;                 
00152    return_ack=command_package.wCmd;
00153 }
00154 
00155 
00156 void send_NO_receive_command() {
00157    SendCommand(&command_package.Head1,COMMAND_PACKAGE_LENGTH);   
00158    //ReceiveCommand(&command_package.Head1,COMMAND_PACKAGE_LENGTH);  
00159    //return_para=command_package.nParam;                 
00160    //return_ack=command_package.wCmd;
00161 }
00162 
00163 
00164 void send_receive_data() {
00165    SendData(&data_package.DHead1,DATA_FP_PACKAGE_LENGTH);   
00166    ReceiveCommand(&command_package.Head1,COMMAND_PACKAGE_LENGTH);  
00167   
00168    return_para=command_package.nParam;                 
00169    return_ack=command_package.wCmd;
00170 }
00171 
00172 int FP_Open() {
00173   int i;
00174   unsigned int zero = 0x00;
00175 
00176   for (i=0; i < CEROS_INICIO; i++) {
00177     fingerprint.putc(zero);
00178   }
00179   wait_us(TIEMPO_ESPERA);
00180   FP_Flush();
00181   
00182   int unsigned first_cmd[] = {0x55, 0xAA, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02,  0x01};
00183   
00184   for (i=0; i < COMMAND_PACKAGE_LENGTH; i++){ 
00185     fingerprint.putc(first_cmd[i]);
00186   }
00187   /*
00188   command_package.Head1=COMMAND_START_CODE1;  
00189   command_package.Head2=COMMAND_START_CODE2;
00190   command_package.wDevId=DEVICE_ID;
00191   command_package.nParam=0x00000000;    //didn't get information
00192   command_package.wCmd=OPEN;
00193   command_package.wChkSum=CalcChkSumOfCmdAckPkt(&command_package);
00194   SendCommand(&command_package.Head1,COMMAND_PACKAGE_LENGTH);*/
00195   wait_us(TIEMPO_ESPERA);
00196   FP_Flush();
00197   
00198   command_package.Head1=COMMAND_START_CODE1;  
00199   command_package.Head2=COMMAND_START_CODE2;
00200   command_package.wDevId=DEVICE_ID;
00201   command_package.nParam=0x00000000;    //didn't get information
00202   command_package.wCmd=UNKNOW;
00203   command_package.wChkSum=CalcChkSumOfCmdAckPkt(&command_package);
00204   SendCommand(&command_package.Head1,COMMAND_PACKAGE_LENGTH);   
00205   wait_us(TIEMPO_ESPERA);
00206   FP_Flush();
00207 
00208   //send_receive_command();
00209   //if(return_ack == FP_ACK) {
00210     return  0;
00211   //} else {
00212   //  return -1;
00213   //}
00214 }
00215 
00216 void FP_Close() {
00217   command_package.Head1=COMMAND_START_CODE1;  
00218   command_package.Head2=COMMAND_START_CODE2;
00219   command_package.wDevId=DEVICE_ID;
00220   command_package.nParam=0x00000000;    //didn't get information
00221   command_package.wCmd=CLOSE;
00222   command_package.wChkSum=CalcChkSumOfCmdAckPkt(&command_package);
00223   send_NO_receive_command();
00224   wait_us(200000);
00225   FP_Flush();
00226 
00227   command_package.Head1=COMMAND_START_CODE1;  
00228   command_package.Head2=COMMAND_START_CODE2;
00229   command_package.wDevId=DEVICE_ID;
00230   command_package.nParam=9600;    //didn't get information
00231   command_package.wCmd=CHANGE_BAUD;
00232   command_package.wChkSum=CalcChkSumOfCmdAckPkt(&command_package);
00233   send_NO_receive_command();
00234   wait_us(200000);
00235   FP_Flush();
00236 }
00237 
00238 
00239 int FP_LED_open() {
00240   command_package.Head1=COMMAND_START_CODE1;  
00241   command_package.Head2=COMMAND_START_CODE2;
00242   command_package.wDevId=DEVICE_ID;
00243   command_package.nParam=0x00000001; //open LED
00244   command_package.wCmd=CMOSLED;
00245   command_package.wChkSum=CalcChkSumOfCmdAckPkt(&command_package);
00246   
00247   send_receive_command();
00248   if(return_ack == FP_ACK) {
00249     return  0;
00250   } else {
00251     return -1;
00252   }
00253 }
00254 
00255 int FP_LED_close() {
00256   command_package.Head1=COMMAND_START_CODE1;  
00257   command_package.Head2=COMMAND_START_CODE2;
00258   command_package.wDevId=DEVICE_ID;
00259   command_package.nParam=0x00000000; //close LED
00260   command_package.wCmd=CMOSLED;
00261   command_package.wChkSum=CalcChkSumOfCmdAckPkt(&command_package);
00262   
00263   send_receive_command();
00264   if(return_ack == FP_ACK) {
00265     return  0;
00266   } else {
00267     return -1;
00268   }
00269 }
00270 
00271 int FP_GetEnrollCount() {
00272   command_package.Head1=COMMAND_START_CODE1;  
00273   command_package.Head2=COMMAND_START_CODE2;
00274   command_package.wDevId=DEVICE_ID;
00275   command_package.nParam=0x00000000; 
00276   command_package.wCmd=GETENROLLCOUNT;
00277   command_package.wChkSum=CalcChkSumOfCmdAckPkt(&command_package);
00278   
00279   send_receive_command();
00280   if(return_ack == FP_ACK) {
00281     return  ((int) return_para);
00282   } else {
00283     return -1;
00284   }
00285 }
00286 
00287 int FP_CheckEnrolled(int thisID) {
00288   command_package.Head1=COMMAND_START_CODE1;  
00289   command_package.Head2=COMMAND_START_CODE2;
00290   command_package.wDevId=DEVICE_ID;
00291   command_package.nParam=thisID; 
00292   command_package.wCmd=CHECK_ENROLLED;
00293   command_package.wChkSum=CalcChkSumOfCmdAckPkt(&command_package);
00294   
00295   send_receive_command();
00296   if(return_ack == FP_ACK) {
00297     return  1; // Segun definicion TCA
00298   } else {
00299     return 0;
00300   }
00301 }
00302 
00303 void FP_EnrollStart(int specify_ID)
00304 {
00305   command_package.Head1=COMMAND_START_CODE1;  
00306   command_package.Head2=COMMAND_START_CODE2;
00307   command_package.wDevId=DEVICE_ID;
00308   command_package.nParam=specify_ID; 
00309   command_package.wCmd=ENROLLSTART;
00310   command_package.wChkSum=CalcChkSumOfCmdAckPkt(&command_package);
00311   
00312   send_receive_command(); 
00313 }  
00314 
00315 void FP_Enroll(int Enroll_define)
00316 {
00317   unsigned short Enroll_command;
00318   
00319   switch(Enroll_define)
00320     {
00321       case 1:
00322              Enroll_command=ENROLL1;
00323              break;
00324       case 2:
00325              Enroll_command=ENROLL2;
00326              break;
00327       case 3:
00328              Enroll_command=ENROLL3;
00329              break;      
00330     }
00331   command_package.Head1=COMMAND_START_CODE1;  
00332   command_package.Head2=COMMAND_START_CODE2;
00333   command_package.wDevId=DEVICE_ID;
00334   command_package.nParam=0x00000000;
00335   command_package.wCmd=Enroll_command;
00336   command_package.wChkSum=CalcChkSumOfCmdAckPkt(&command_package);
00337   
00338   send_receive_command(); 
00339 }
00340 
00341 int FP_IsPressFinger() {
00342   command_package.Head1=COMMAND_START_CODE1;  
00343   command_package.Head2=COMMAND_START_CODE2;
00344   command_package.wDevId=DEVICE_ID;
00345   command_package.nParam=0x00000000; 
00346   command_package.wCmd=ISPRESSFINGER;
00347   command_package.wChkSum=CalcChkSumOfCmdAckPkt(&command_package);
00348   
00349   send_receive_command();
00350   if(return_ack == FP_ACK) {
00351     return  ((int) return_para);
00352   } else {
00353     return -1;
00354   }
00355 } 
00356 
00357 void FP_CaptureFinger(unsigned long picture_quality) { //0:normal picture, 1:best picture
00358   command_package.Head1=COMMAND_START_CODE1;  
00359   command_package.Head2=COMMAND_START_CODE2;
00360   command_package.wDevId=DEVICE_ID;
00361   command_package.nParam=picture_quality; 
00362   command_package.wCmd=CAPTURE_FINGER;
00363   command_package.wChkSum=CalcChkSumOfCmdAckPkt(&command_package);
00364   
00365   send_receive_command();  
00366 }
00367 
00368 int FP_DeleteAll() {
00369   command_package.Head1=COMMAND_START_CODE1;  
00370   command_package.Head2=COMMAND_START_CODE2;
00371   command_package.wDevId=DEVICE_ID;
00372   command_package.nParam=0x00000000; 
00373   command_package.wCmd=DELETEALL;
00374   command_package.wChkSum=CalcChkSumOfCmdAckPkt(&command_package);
00375   
00376   send_receive_command();
00377   if(return_ack == FP_ACK) {
00378     return  0;
00379   } else {
00380     return -1;
00381   }
00382 }
00383 
00384 int FP_DeleteID(int thisID) {
00385   command_package.Head1=COMMAND_START_CODE1;  
00386   command_package.Head2=COMMAND_START_CODE2;
00387   command_package.wDevId=DEVICE_ID;
00388   command_package.nParam=thisID; 
00389   command_package.wCmd=DELETEID;
00390   command_package.wChkSum=CalcChkSumOfCmdAckPkt(&command_package);
00391   
00392   send_receive_command();
00393   if(return_ack == FP_ACK) {
00394     return  0;
00395   } else {
00396     return -1;
00397   }
00398 }
00399 
00400 int FP_Identify() {
00401   command_package.Head1=COMMAND_START_CODE1;  
00402   command_package.Head2=COMMAND_START_CODE2;
00403   command_package.wDevId=DEVICE_ID;
00404   command_package.nParam=0x00000000; 
00405   command_package.wCmd=IDENTIFY;
00406   command_package.wChkSum=CalcChkSumOfCmdAckPkt(&command_package);
00407   
00408   send_receive_command();
00409   if(return_ack == FP_ACK) {
00410     return  ((int) return_para);
00411   } else {
00412     return -1;
00413   }
00414 }
00415 
00416 void FP_Sleep() {
00417   command_package.Head1=COMMAND_START_CODE1;  
00418   command_package.Head2=COMMAND_START_CODE2;
00419   command_package.wDevId=DEVICE_ID;
00420   command_package.nParam=0x00000000; 
00421   command_package.wCmd=STANDBY_MODE;
00422   command_package.wChkSum=CalcChkSumOfCmdAckPkt(&command_package);
00423   
00424   send_receive_command();
00425 }
00426 
00427 int FP_SetTemplate(int thisID, char * fingerData) {
00428     
00429     unsigned char thisData_package[504];
00430     unsigned int thisSend_checksum = 0;
00431     int xyz;
00432     command_package.Head1=COMMAND_START_CODE1;  
00433     command_package.Head2=COMMAND_START_CODE2;
00434     command_package.wDevId=DEVICE_ID;
00435     command_package.nParam=thisID; 
00436     command_package.wCmd=SETTEMPLATE;
00437     command_package.wChkSum=CalcChkSumOfCmdAckPkt(&command_package);
00438     
00439     send_receive_command();
00440     if (return_ack != FP_ACK) {
00441         return -1;
00442     }
00443 
00444       thisData_package[0] = DATA_START_CODE1;
00445     thisData_package[1] = DATA_START_CODE2;
00446     thisData_package[2] = 0x01;
00447     thisData_package[3] = 0x00;
00448     for (xyz = 4; xyz <= 501; xyz++) {
00449         thisData_package[xyz] = fingerData[xyz -4];
00450     }
00451     for (xyz = 0; xyz < 502; xyz++) {
00452         thisSend_checksum = thisSend_checksum + thisData_package[xyz];
00453     }
00454     thisData_package[502] = thisSend_checksum&0x00FF;
00455     thisData_package[503] = thisSend_checksum>>8;
00456 
00457     for(xyz = 0; xyz < 504; xyz++) {
00458         fingerprint.putc(thisData_package[xyz]);
00459     }
00460     
00461     ReceiveCommand(&command_package.Head1,COMMAND_PACKAGE_LENGTH);        
00462     return_ack=command_package.wCmd;
00463 
00464    if(return_ack == FP_ACK) {
00465     return  0;
00466   } else {
00467     return -1;
00468   }
00469 }
00470 
00471 void FP_Flush() {
00472     if(fingerprint.readable()) {
00473         while(fingerprint.readable()){
00474             fingerprint.getc();
00475         }
00476     }
00477 }