📄 common.c
字号:
//=================================================================
void BIEFToDCB(SBIEF_1 *sBIEFBaseInfo,SBIEF_2 *sBIEFTrainInfo,SBIEF_3 *sBIEFTimeInfo,struct StruDCB *spDCB)
{
_WORD i;
spDCB->dwCardID = sBIEFBaseInfo->dwCardID; // 填充持卡人编号
for (i=0;i<128;i++) // 填充持卡人名称
spDCB->cpName[i] = sBIEFBaseInfo->cpName[i];
spDCB->cYear = gsClock.cYear; // 取当前日期-年月日时分
spDCB->cMonth = gsClock.cMonth;
spDCB->cDay = gsClock.cDay;
spDCB->cHour = gsClock.cHour;
spDCB->cMinter= gsClock.cMinter;
spDCB->wBuyTime = sBIEFTimeInfo->wBuyTime; // 买钟时间信息
spDCB->wBuyDayRoadTime = sBIEFTimeInfo->wBuyDayRoadTime;
spDCB->wBuyDayFieldTime = sBIEFTimeInfo->wBuyDayFieldTime;
spDCB->wBuyNightRoadTime = sBIEFTimeInfo->wBuyNightRoadTime;
spDCB->wBuyNightFieldTime = sBIEFTimeInfo->wBuyNightFieldTime;
spDCB->wDayRoadValidTime = 0; // 日路训有效时间
spDCB->dwDayRoadValidMile = 0; // 日路训有效里程
spDCB->wNightRoadValidTime = 0; // 夜路训有效时间
spDCB->dwNightRoadValidMile = 0; // 夜路训有效里程
spDCB->wDayFieldValidTime = 0; // 日场训有效时间
spDCB->dwDayFieldValidMile = 0; // 日场训有效里程
spDCB->wNightFieldValidTime = 0; // 夜场训有效时间
spDCB->dwNightFieldValidMile = 0; // 夜场训有效里程
spDCB->wDayRoadCurTime = 0; // 日路训当前时间
spDCB->dwDayRoadCurMile = 0; // 日路训当前里程
spDCB->wNightRoadCurTime = 0; // 夜路训当前时间
spDCB->dwNightRoadCurMile = 0; // 夜路训当前里程
spDCB->wDayFieldCurTime = 0; // 日场训当前时间
spDCB->dwDayFieldCurMile = 0; // 日场训当前里程
spDCB->wNightFieldCurTime = 0; // 夜场训当前时间
spDCB->dwNightFieldCurMile = 0; // 夜场训当前里程
spDCB->cCycleSecond = 0; // 未区分训练类型的时间(秒)
spDCB->wCyclePluse = 0; // 未区分训练类型的脉冲数
spDCB->cCycleStopTime = 0; // 在未区分训练类型时间内的停止次数
spDCB->cCycleMaxRunTime = 0; // 在未区分训练类型时间内连续运行的最大时间
spDCB->wCycleMaxRunPluse = 0; // 在未区分训练类型时间内连续运行的最大脉冲数
spDCB->cTrainType = UNCERTAINED; // 训练类型
spDCB->cFingerScore1 = sBIEFBaseInfo->cFingerScore1; // 指纹模板1,评分
spDCB->cFingerScore2 = sBIEFBaseInfo->cFingerScore2; // 指纹模板2,评分
spDCB->wFingerLength1 = sBIEFBaseInfo->wFingerLength1; // 指纹模板1,长度
spDCB->wFingerLength2 = sBIEFBaseInfo->wFingerLength2; // 指纹模板2,长度
}
//=================================================================
// 检查是否有一个空闲的DCB表项,返回空闲的DCB表项的序号(0)
// 如果分配成功,
// cDCBItem返回分配的DCB表项的序号;
// 函数返回C_OK
// 如果分配失败,函数返回C_INDEXFULL
//=================================================================
_BYTE CheckUsableDBC(_BYTE *cDCBItem)
{
_BYTE i;
_BYTE j,cSeq;
_BYTE cMode;
_BYTE cCh,cRetCode;
_BYTE cpDATBuf[5];
cSeq=0;
cRetCode = FlashReadWriteDAT(cpDATBuf,ICREAD);
if (cRetCode!=C_OK) return(cRetCode);
for (i=0;i<LENOFDCBT/8;i++) {
cCh = cpDATBuf[i];
cMode = 0x80;
for (j=0;j<8;j++)
if ((cCh & cMode)==0) {
*cDCBItem = cSeq;
return(C_OK);
}
else {
cSeq++;
cMode =cMode >> 1 ;
}
}
return(C_INDEXFULL);
}
//=================================================================
// 功能: 分配或释放一个空闲的DCB表项
// 参数:
// cDCBSeq: DCB表项的序号
// cTag:分配或释放标记
// 设置DCB项的使用标记为0/1
//=================================================================
_BYTE AllocateOrFreeDCB(_BYTE cDCBSeq,_BYTE cTag)
{
_BYTE i,j,cCh,cRetCode;
_BYTE cpDATBuf[5];
cRetCode = FlashReadWriteDAT(cpDATBuf,ICREAD);
if (cRetCode!=C_OK) return(cRetCode);
i = cDCBSeq / 8;
j = cDCBSeq % 8;
if (cTag==1) // 分配
cpDATBuf[i] |= (0x80>>j);
else {
cCh = (0x80>>j);
cCh = ~cCh;
cpDATBuf[i] &= cCh;
}
cRetCode = FlashReadWriteDAT(cpDATBuf,ICWRITE);
return(cRetCode);
}
//=================================================================
// 功能: 教练签到
// 检查教练卡的合法性(检查卡号),验证指纹
// 参数: 教练员BIEF文件的信息
// 返回: 成功,返回C_OK, 失败返回错误码
//=================================================================
_BYTE CoachLogin(SBIEF_1 *sBIEFBaseInfo,SBIEF_2 *sBIEFTrainInfo,SBIEF_3 *sBIEFTimeInfo)
{
_BYTE cRetCode;
_BYTE cDCBSeq;
//cRetCode = CheckUsableDBC(&cDCBSeq); // 检查可用DCB项,将教练员的信息写入DCBT表的第一项
//if (cRetCode!=C_OK) return(cRetCode);
cDCBSeq = 0;
BIEFToDCB(sBIEFBaseInfo,sBIEFTrainInfo,sBIEFTimeInfo,&DCBT[cDCBSeq]); // 根据BIEF信息生成DCB信息
DCBT[cDCBSeq].cFlag = 1;
cRetCode = FlashReadWriteDCB(cDCBSeq,&DCBT[cDCBSeq],ICWRITE);
if (cRetCode!=C_OK) {
DCBT[cDCBSeq].cFlag = 0;
DisplayMessage(M_ERROR,6,1,WAITDISP,RECOVERYDISP); // 操作错误
return(cRetCode);
}
cRetCode = AllocateOrFreeDCB(cDCBSeq,1); // 分配DCB,为DCB赋值,将DCB写入FLASH
if (cRetCode!=C_OK) return(cRetCode);
return(C_OK);
}
//=================================================================
// 函数: 教练签退
// 检查教练卡的合法性(检查卡号),验证指纹
// 教练签退(写学员信息到教练的IC卡,更新教练IC卡中的信息)
// 参数: 教练员IC卡的BIEF信息
// 返回: 成功,返回C_OK, 失败返回错误码
//=================================================================
_BYTE CoachLogout(SBIEF_1 *sBIEFBaseInfo,SBIEF_2 *sBIEFTrainInfo,SBIEF_3 *sBIEFTimeInfo)
{
_BYTE cDCBSeq,cRetCode;
_DWORD dwCardID;
//struct StruLOGPOOL cpLogBuf[4];
cDCBSeq = 0; // 教练DCB标号
dwCardID = sBIEFBaseInfo->dwCardID; // 取卡中的卡号
if (dwCardID!=DCBT[cDCBSeq].dwCardID) {
DisplayMessage(C_CANCELED,6,1,WAITDISP,RECOVERYDISP); // 操作被取消
return(C_ICCHANGED); // 教练卡不正确
}
// 有未签退的学员
cRetCode = AskForCoachLogout(COACHLOGOUT,0); // 确认是否签到
if (cRetCode!=C_OK) {
DisplayMessage(C_CANCELED,6,1,WAITDISP,RECOVERYDISP); // 操作被取消
return(C_CANCELED);
}
DisplayRecoveryMessage(6,SAVEDISP);
DisplayMessage(M_WAIT,6,1,NOTWAITDISP,NOTRECOVERYDISP); // 请等待
// 为未签退的学员生成日志信息;
/*cRetCode = BuildLogInfoFromDCB(C_COACH,cDCBSeq,0,cpLogBuf);
if (cRetCode!=C_OK) {
DisplayRecoveryMessage(6,1);
DisplayMessage(M_MEMERROR,6,1,WAITDISP,RECOVERYDISP); // 操作被取消
return(cRetCode);
}*/
// 将日志信息写入IC卡中
cRetCode = WriteLogToCoachIC(sBIEFBaseInfo,sBIEFTrainInfo,sBIEFTimeInfo);
if (cRetCode!=C_OK) {
DisplayRecoveryMessage(6,RECOVERYDISP);
DisplayMessage(M_ICERROR,6,1,WAITDISP,RECOVERYDISP); // 操作被取消
return(cRetCode);
}
DisplayRecoveryMessage(6,RECOVERYDISP);
cRetCode = AllocateOrFreeDCB(cDCBSeq,0); // 分配DCB,为DCB赋值,将DCB写入FLASH
if (cRetCode!=C_OK) return(cRetCode);
return(C_OK);
}
//=================================================================
// 函数: 学员签到
// 功能: 检查学员卡的合法性(检查卡号),验证指纹
// 学员签到(为学员分配DCB,生成学员的DCB,设置本学员为当前学员)
// 参数: 学员BIEF文件的信息
//=================================================================
_BYTE DriverLogin(SBIEF_1 *sBIEFBaseInfo,SBIEF_2 *sBIEFTrainInfo,SBIEF_3 *sBIEFTimeInfo)
{
_BYTE cRetCode;
_BYTE cDCBSeq;
cRetCode = CheckUsableDBC(&cDCBSeq); // 检查可用DCB项,将教练员的信息写入DCBT表的第一项
if (cRetCode!=C_OK) {
DisplayMessage(cRetCode,6,1,WAITDISP,RECOVERYDISP); // 显示出错信息
return(cRetCode);
}
BIEFToDCB(sBIEFBaseInfo,sBIEFTrainInfo,sBIEFTimeInfo,&DCBT[cDCBSeq]); // 根据BIEF信息生成DCB信息
DisplayRecoveryMessage(6,SAVEDISP);
DCBT[cDCBSeq].cFlag = 1;
cRetCode = FlashReadWriteDCB(cDCBSeq,&DCBT[cDCBSeq],ICWRITE);
if (cRetCode!=C_OK) {
DCBT[cDCBSeq].cFlag = 0;
DisplayRecoveryMessage(6,RECOVERYDISP);
DisplayMessage(M_ERROR,6,1,WAITDISP,RECOVERYDISP); // 操作错误
return(cRetCode);
}
cRetCode = AllocateOrFreeDCB(cDCBSeq,1); // 分配DCB,为DCB赋值,将DCB写入FLASH
if (cRetCode!=C_OK) return(cRetCode);
// 如果处在训练状态,保存前一个学员信息
if (CSI.cStatus==S_TRAINING){
GetCDTI(CSI.cCurDCB);
cRetCode = FlashReadWriteDCB(CSI.cCurDCB,&DCBT[CSI.cCurDCB],ICWRITE);
if (cRetCode!=C_OK) return(cRetCode);
}
DisplayRecoveryMessage(6,RECOVERYDISP);
// 签到学员位当前学员,修改DLS中的当前训练信息栏
CSI.cCurDCB = cDCBSeq; // 设置当前DCB
SetCDTI(CSI.cCurDCB); // 根据DCB信息生成CDIT信息
return(C_OK);
}
//=================================================================
//函数: 学员签退
//功能: 检查学员卡的合法性(检查卡号),验证指纹
// 学员签退(写学员信息到学员的IC卡)
// 调用该函数前,首先检查该学员是否签到,如果已经签到才调用该函数
//=================================================================
_BYTE DriverLogout(SBIEF_1 *sBIEFBaseInfo,SBIEF_2 *sBIEFTrainInfo,SBIEF_3 *sBIEFTimeInfo)
{
_BYTE cRetCode,i,cEst;
_BYTE cDCBSeq;
_DWORD dwCardID;
struct StruLOGPOOL cpLogBuf[4];
// 存放生成的日志信息,最多四条
// 初始化变量
for (i=0;i<4;i++) cpLogBuf[i].cFlag = 0; // 日志信息的最后一个字节是标记
cDCBSeq=0xff;
dwCardID = sBIEFBaseInfo->dwCardID; // 取卡中的卡号
for (i=1;i<LENOFDCBT;i++){ // 取驾驶员信息在DCBT的序号
if (dwCardID==DCBT[i].dwCardID) {
cDCBSeq = i;
break;
}
}
if (cDCBSeq==0xff) {
DisplayMessage(C_ICCHANGED,6,1,WAITDISP,RECOVERYDISP); // 卡不匹配
return(C_ICCHANGED); // 该找到该学员
}
cRetCode=AskForCoachLogout(DRIVERLOGOUT,cDCBSeq);
if (cRetCode!=C_OK) {
DisplayMessage(C_CANCELED,6,1,WAITDISP,RECOVERYDISP); // 操作被取消
return(C_CANCELED);
}
// 如果当前签退学员没有训练信息
if (CheckDCB(cDCBSeq)!=C_OK) {
if (CSI.cCurDCB==cDCBSeq) { // 如果本学员是当前正在训练的学员,CDIT->DCB
CSI.cCurDCB=0xff; // 进入临时签退状态
}
cRetCode = AllocateOrFreeDCB(cDCBSeq,0); // 释放DCB
if (cRetCode!=C_OK) return(cRetCode);
DCBT[cDCBSeq].cFlag = 0;
return(C_OK);
}
DisplayRecoveryMessage(6,SAVEDISP);
// 指纹验证成功,合并有效训练信息和当前训练信息
if (CSI.cCurDCB==cDCBSeq) { // 如果本学员是当前正在训练的学员,CDIT->DCB
GetCDTI(CSI.cCurDCB);
MergeDCBTrainInfo(CSI.cCurDCB); // 合并有效训练信息和当前训练信息
SetCDTI(CSI.cCurDCB);
}
else {
MergeDCBTrainInfo(cDCBSeq); // 合并有效训练信息和当前训练信息
}
cEst=Estimantation(); // 输入对教练的评价
// 为签退的学员生成日志信息;
cRetCode = BuildLogInfoFromDCB(C_DRIVER,cDCBSeq,cEst,cpLogBuf);
if (cRetCode!=C_OK) {
if (CSI.cCurDCB!=cDCBSeq)
cRetCode = FlashReadWriteDCB(cDCBSeq,&DCBT[cDCBSeq],ICWRITE);
DisplayRecoveryMessage(6,RECOVERYDISP);
DisplayMessage(M_MEMERROR,6,1,WAITDISP,RECOVERYDISP); // 显示操作出错
return(cRetCode);
}
DisplayRecoveryMessage(6,RECOVERYDISP);
// 将日志信息写入IC卡中
cRetCode = WriteLogToDriverIC(sBIEFBaseInfo,sBIEFTrainInfo,sBIEFTimeInfo,cDCBSeq,cpLogBuf);
if (cRetCode!=C_OK) {
if (CSI.cCurDCB!=cDCBSeq)
FlashReadWriteDCB(cDCBSeq,&DCBT[cDCBSeq],ICWRITE);
if (cRetCode==C_ICCHANGED)
DisplayMessage(C_ICCHANGED,6,1,WAITDISP,RECOVERYDISP); // 显示操作出错
else
DisplayMessage(M_ICERROR,6,1,WAITDISP,RECOVERYDISP); // 显示操作出错
return(cRetCode);
}
if (CSI.cCurDCB==cDCBSeq) { // 如果本学员是当前正在训练的学员,CDIT->DCB
CSI.cCurDCB=0xff; // 进入临时签退状态
}
cRetCode = AllocateOrFreeDCB(cDCBSeq,0); // 释放DCB
if (cRetCode!=C_OK) return(cRetCode);
DCBT[cDCBSeq].cFlag = 0;
return(C_OK);
}
//=================================================================
// 函数: 学员临时签退
// 功能: 将CDIT的信息写入到DCB,同时写FLASH
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -