⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 common.c

📁 AT91fr40162的FLASH读写程序
💻 C
📖 第 1 页 / 共 3 页
字号:
//=================================================================
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 + -