📄 fingerpt.c
字号:
#pragma large
#include "fingerpt.h"
#if CARD_MODULE == 0
#include <reg52.h>
#include "Timer.h"
#include "Os.h"
/*---------------------- response----------------------*/
#define mRight 0x81
#define mReIn 0x82
#define mEot 0x83
#define mBusy 0x84
#define hRight 0x81
#define hReIn 0x82
#define hEot 0x83
/*---------------------- command----------------------*/
#define Reset 0x00
#define Status 0x01
#define Enroll 0x03
#define GenTzz 0x04
#define DownMb 0x05
#define DownTz 0x06
#define UpMb 0x07
#define UpTz 0x08
#define Store 0x09
#define LdBuf 0x0a
#define Verify 0x0b
#define QuickSearch 0x0c
#define Search 0x0d
#define EraseOne 0x0e
#define EraseAll 0x0f
#define GenImg 0x10
#define UpImg 0x11
#define SetAddr 0x12
#define Signature 0x13
#define SecuLevel 0x14
#define DeviceKey 0x15
#define Free 0x16
#define StorePage 0x17
#define LoadPage 0x18
#define SysLowSet 0x81
#define SysHighSet 0x82
#define SetPwd 0x02
#define GetInfo 0x20
/*--------------------PkgID----------------------*/
#define Cmd 0x1<<0
#define Data 0x1<<1
#define EndData 0x1<<3
/*指纹模块UART接收缓冲区*/
static UINT8 xdata FingerprintBuffer[256];
static UINT8 idata m_inCounter = 0; /*接收缓冲区数据导入指针*/
static UINT8 idata m_outCounter = 0; /*接收缓冲区数据导出指针*/
//static UINT8 idata m_sendFlag = 0; /* 发送标志位*/
SCMD xdata scmd; /*发送指纹数据包变量*/
CMD xdata cmd; /*接收指纹数据包变量*/
UINT8 xdata yanz[8]={0,0,0,0,0,0,0,0};
extern bit FGPT_SendChar;
/*
** define some command package sendding function*/
#define SensorReset() (SendCmdPkg(Reset))
#define SensorFree() (SendCmdPkg(Free))
#define SensorGenTzz() (SendCmdPkg(GenTzz))
#define SensorEnroll() (SendCmdPkg(Enroll))
#define SensorSearch() (SendCmdPkg(Search))
#define SensorQuickSearch() (SendCmdPkg(QuickSearch))
#define SensorVerify() (SendCmdPkg(Verify))
static void ClearComm(void);
static void ClearComm(void)
{
m_inCounter = 0;
m_outCounter = 0;
OSMemset(FingerprintBuffer,0, 256);
}
UINT8 SendCmdPkg(UINT8 command)
{
UINT8 xdata m_ret;
Sleep(10);
scmd.sPkgId = Cmd;
scmd.sPkgLen = 1;
scmd.sPkgCnt[0] = command;
m_ret = SendPackage(&scmd);
return m_ret;
}
/***************************************************************
** BOOL FingerprintInit(void)
****************************************************************
** Function:
** 指纹模块检测及初始化
** *************************************************************/
UINT8 FingerprintInit(void)
{
UINT8 data ret;
UINT8 data status0,status1;
scmd.sPkgId=EndData;
scmd.sAddress[0]=3;
scmd.sAddress[1]=3;
scmd.sPkgLen=2;
scmd.sPkgCnt[0]=0;
scmd.sPkgCnt[1]=1;
ret = SendPackage(&scmd);
if(ret == 1)
{
ret = SensorDeviceKey(yanz,yanz);
if(ret == 1)
{
Sleep(40);
/*等待结果包*/
ret = GetPackage(&cmd);
if(((cmd.PkgCnt[0]&0x03) != 3) && (ret == 1))
{
ret = 0;
}
}
}
/*//发送读状态包命令*/
ret = SensorStatus(&status0,&status1);
return ret;
}
/****************************************************************
** void FingerprintInt4() interrupt 4 using 3
*****************************************************************
** Function:
** 连接指纹模块的中断程序
** Inputs:
** None
** Outputs:
** None
** Returns:
** None
*****************************************************************/
void FingerprintInt4() interrupt 4 using 3
{
if(RI)
{
RI=0;
FingerprintBuffer[m_inCounter++] = SBUF;
}
if(TI)
{
TI = 0;
FGPT_SendChar = 0;
}
}
/******************************************************************
** UINT8 GetPkgByte(unsigned char *TranChar)
*******************************************************************
** Function:
** 向指纹UART端口获取一个接收的字节
** Inputs:
** TranChar 接收一个字节的数据指针
** Outputs:
** None
** Returns:
** 0 - fail 1-success
*******************************************************************/
UINT8 GetPkgByte(unsigned char *TranChar)
{
if(m_inCounter != m_outCounter)
{
*TranChar = FingerprintBuffer[m_outCounter++];
return 1;
}
return 0;
}
UINT8 SendPkgByte(unsigned char TranChar)
{
FGPT_SendChar = 1;
SBUF = TranChar;
while(FGPT_SendChar);
return 1;
}
UINT8 GetPackage(CMD *cmd)
{
UINT8 xdata i,RptTimes;
UINT16 idata jyh;
RptTimes=0;
hostReIn:
if( !GetPkgByte(&(cmd->PkgId )))
return 0;
if( !GetPkgByte(&(cmd->Address[0]) ) )
return 0;
if( !GetPkgByte(&(cmd->Address[1] ) ))
return 0;
if( !GetPkgByte(&(cmd->PkgLen)) )
return 0;
jyh = cmd->PkgId;
jyh += cmd->Address[0];
jyh += cmd->Address[1];
jyh += cmd->PkgLen;
for( i=0;i<cmd->PkgLen;i++ )
{
if( !GetPkgByte(&(cmd->PkgCnt[i] )) )
return 0;
jyh+=cmd->PkgCnt[i];
}
if( !GetPkgByte(&(cmd->Jyh[0] )) )
return 0;
if( !GetPkgByte(&(cmd->Jyh[1] )) )
return 0;
Sleep(1);
if( cmd->Jyh[0]!=(jyh&0xff00)>>8 || cmd->Jyh[1]!=(jyh&0xff) )
{
RptTimes++;
if( RptTimes>3 )
{
SendPkgByte(hEot);
Sleep(1);
SendPkgByte(hEot );
return 0;
}
SendPkgByte(hReIn );
Sleep(1);
SendPkgByte(hReIn );
ClearComm();
goto hostReIn;
}
SendPkgByte(hRight );
Sleep(1);
SendPkgByte(hRight );
return 1;
}
/***********************************************************
** UINT8 SendPackage(SCMD scmd)
************************************************************
** Function:
** 向指纹UART端口发送一个数据包
** Inputs:
** scmd
** Outputs:
** None
** Returns:
** status value
*************************************************************/
UINT8 SendPackage(SCMD *scmd)
{
UINT8 data i, ret;
UINT16 data jyh; //unsigned int
/*caculate chech sum*/
jyh=scmd->sPkgId+scmd->sAddress[0]+scmd->sAddress[1]+scmd->sPkgLen;
for( i=0;i<scmd->sPkgLen;i++ )
{
jyh += scmd->sPkgCnt[i];
}
scmd->sJyh[0] =(UINT8) ((jyh >> 8) & 0xFF);
scmd->sJyh[1]=(UINT8)(jyh & 0xff);
ModuleReIn:
ClearComm();
SendPkgByte(scmd->sPkgId);
SendPkgByte(scmd->sAddress[0]);
SendPkgByte(scmd->sAddress[1]);
SendPkgByte(scmd->sPkgLen);
for( i=0;i<scmd->sPkgLen;i++ )
{
SendPkgByte(scmd->sPkgCnt[i]);
}
SendPkgByte(scmd->sJyh[0] );
SendPkgByte(scmd->sJyh[1]);
Sleep(2);
if( !GetPkgByte(&ret ) )
return 0;
if( !GetPkgByte(&ret ) )
return 0;
if( ret == mReIn )
goto ModuleReIn;
if( ret == mRight )
return 1;
if( ret == mBusy )
return 2;
return 0;
}
UINT8 SensorDeviceKey(unsigned char OldPwd[8],unsigned char NewPwd[8])
{
int ret,i;
ret = SendCmdPkg(DeviceKey);
if( !ret )
return 0;
if( ret==2 )
return 2;
Sleep(3);
for( i=0;i<=7;i++ )
{
scmd.sPkgCnt[i]=OldPwd[i];
scmd.sPkgCnt[8+i]=NewPwd[i];
}
scmd.sPkgId=EndData;
scmd.sPkgLen=16;
return( SendPackage(&scmd) );
}
UINT8 SensorStatus(unsigned char* St0,unsigned char* St1)
{
UINT8 ret;
ret = SendCmdPkg(Status);
if( ret==2 )
return 2; //busy
if( ret==1 )
{
Sleep(30);
if( GetPackage(&cmd) )
{
*St0=cmd.PkgCnt[0];
*St1=cmd.PkgCnt[1];
return 1;
}
}
return 0;
}
UINT8 SensorDownMb(int nummb,TZDP mb[],int DampMbLock)
{
int i,ptr;
UINT8 ret;
ret = SendCmdPkg(DownMb);
if(ret != 1)
return ret;
Sleep(3);
for( i=0,ptr=0;i<nummb;i++ )
{
scmd.sPkgCnt[ptr++]=mb[i].hres;
scmd.sPkgCnt[ptr++]=mb[i].zres;
scmd.sPkgCnt[ptr++]=mb[i].flag+((mb[i].direct/256)<<7);
scmd.sPkgCnt[ptr++]=mb[i].direct%256;
}
//---add ----
if( DampMbLock<0 )
DampMbLock=0;
if( DampMbLock>7 )
DampMbLock=7;
scmd.sPkgCnt[ptr++]=DampMbLock;
scmd.sPkgId=EndData;
scmd.sPkgLen=ptr;
return( SendPackage(&scmd) );
}
UINT8 SensorDownTz(int numtzd,TZDP tzd[],int DampFinger)
{
int i,ptr;
UINT8 ret;
ret = SendCmdPkg(DownTz);
if(ret != 1)
return ret;
Sleep(1);
for( i=0,ptr=0;i<numtzd && i<=31;i++ )
{
scmd.sPkgCnt[ptr++]=tzd[i].hres;
scmd.sPkgCnt[ptr++]=tzd[i].zres;
scmd.sPkgCnt[ptr++]=tzd[i].flag+((tzd[i].direct/256)<<7);
scmd.sPkgCnt[ptr++]=tzd[i].direct%256;
}
if(numtzd>32)
scmd.sPkgId=Data;
else
{
scmd.sPkgId=EndData;
//---add---
scmd.sPkgCnt[ptr-2]=scmd.sPkgCnt[ptr-2]+DampFinger*16;
}
scmd.sPkgLen=ptr;
if( !SendPackage(&scmd) )
return 0;
if( numtzd<=32 )
return 1;
Sleep(3);
for( i=32,ptr=0;i<numtzd && i<=31+32;i++ )
{
scmd.sPkgCnt[ptr++]=tzd[i].hres;
scmd.sPkgCnt[ptr++]=tzd[i].zres;
scmd.sPkgCnt[ptr++]=tzd[i].flag+((tzd[i].direct/256)<<7);
scmd.sPkgCnt[ptr++]=tzd[i].direct%256;
}
//---add---
scmd.sPkgCnt[ptr-2]=scmd.sPkgCnt[ptr-2]+DampFinger*16;
scmd.sPkgId=EndData;
scmd.sPkgLen=ptr;
return( SendPackage(&scmd) );
}
UINT8 SensorUpMb(int* nummb,TZDP mb[],int* DampMbLock)
{
int i,ptr;
UINT8 ret;
ret = SendCmdPkg(UpMb);
if(ret != 1)
return ret;
if( !GetPackage(&cmd) )
return 0;
if( cmd.PkgId!=EndData )
return 0;
*nummb=cmd.PkgLen/4;
ptr=0;
for( i=0;i<*nummb;i++ )
{
mb[i].hres=cmd.PkgCnt[ptr++];
mb[i].zres=cmd.PkgCnt[ptr++];
mb[i].flag=cmd.PkgCnt[ptr++];
mb[i].direct=cmd.PkgCnt[ptr++];
if(mb[i].flag&0x80)
{
mb[i].direct+=256;
mb[i].flag&=0x7f;
}
}
//---add---
*DampMbLock=cmd.PkgCnt[ptr];
return 1;
}
UINT8 SensorUpTz(int *numtzd,TZDP tzd[],int* DampFinger)
{
int i,ptr;
UINT8 ret;
ret = SendCmdPkg(UpTz);
if(ret != 1)
return ret;
if( !GetPackage(&cmd) )
return 0;
if( cmd.PkgId!=EndData && cmd.PkgId!=Data )
return 0;
i=0;
*numtzd=0;
anothertzz:
*numtzd+=cmd.PkgLen/4;
ptr=0;
for( ;i<*numtzd;i++ )
{
tzd[i].hres=cmd.PkgCnt[ptr++];
tzd[i].zres=cmd.PkgCnt[ptr++];
tzd[i].flag=cmd.PkgCnt[ptr++];
tzd[i].direct=cmd.PkgCnt[ptr++];
if(tzd[i].flag&0x80)
{
tzd[i].direct+=256;
tzd[i].flag&=0x7f;
}
}
if( !(cmd.PkgId&EndData) )
{
i=*numtzd;
if( !GetPackage(&cmd) )
return 0;
else
{
if( cmd.PkgId!=EndData )
return 0;
}
goto anothertzz;
}
//---add---
*DampFinger=tzd[*numtzd-1].flag/16;
tzd[*numtzd-1].flag=tzd[*numtzd-1].flag&0x0f;
return 1;
}
UINT8 SensorGetInfo(UINT8 *info)
{
UINT8 data ret;
ret = SendCmdPkg(GetInfo);
if(ret != 1)
return ret;
if( GetPackage(&cmd) )
{
*info=cmd.PkgCnt[0];
return 1;
}
return 0;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -