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

📄 comm.c.svn-base

📁 keilC底层软件,能够结合硬件产生加解密密文,具有安全保护功能.
💻 SVN-BASE
📖 第 1 页 / 共 3 页
字号:
						}
						else
						{
							countera=ReadOneXByte(0,(ucharx *)sfsyqfgn);
							if(countera==0xff)countera=1;

							countera=2;
							for(counter=0;counter<countera;counter++)
							{
								person=comm_pwd[counter+2].person_no;
								tempint=ConfigFileAdd+FirstPersonAdd+(2*16+person)*OnePersonLength;
								if(person==0xff)
								{
									SendBuff[4]=0x5d+counter*6;				//  
									pwd_type=0;
									break;
								}				

								if((ReadOneXByte(ConfigFilePage,(ucharx *)tempint)!=0x55)||(person==0xff))
								{
									SendBuff[4]=0x5d+counter*6;		//无此人员
									break;
								}

								//检查人员对该帐号是否有权限,AccountNum帐号代码,返回1有 0无
								pwd_flag=IsAccountPermit(2,person,counter1,0,(ucharx *)0);

								//person  no permit
								if(!pwd_flag)		
								{
									SendBuff[4]=0x5c+counter*6;				
									break;
								}

								//授权金额判断
								if(IsMoreThenPermit(&NowMM.BcdMoney[0],person))
								{
									//   >  sqy money
									SendBuff[4]=0x5e+counter*6;				
									pwd_type=0;
									break;
								}

								if(DPFnCerAutCP(person, &NowMM.BcdMoney[0],&(comm_pwd[counter+2].person_pwd[0]) ) != SUCCESS)
								{
									//   >  sqy money
									SendBuff[4]=0x5a+counter*6;				
									pwd_type=0;
									break;
								}

							}
						}
					}

					if(SendBuff[4])
					{
						pwd_type=0;
						break;
					}

					pwd_type=0;
					NowMM.AccountNum=counter1;


					temp=GetMM();
					ControlStatus=ControlStatus&_Bit_SSX_Rst;
					ChangeStatus();
					SendBuff[4]=temp;//Temp110char[62] start=0x5c+62
					if(temp!=0)
					{
						break;
					}
					temp=WriteOneBillToBuffer(0xff,0x55);
					MoveOneToHistory(temp);
					SendBuff[5]=0xff;
					SendBuff[6]=0xff;
					memcpy(&SendBuff[7],&(NowMM.BcdPayCode[0]),8);
					break;
				}

				case PasswordCheck:
				{
					LenH=0;           //length MSB
					LenL=1;           //length LSB

					SendBuff[4]=0;
					memcpy(&TempAccx[0],&ReceiveBuff[4],15);
					XramBCD_ASIIC(15,&TempAccx[0],&TempAccx1[0]);
					for(counter=0;counter<3;counter++)
					{
						comm_pwd[counter].person_no=TempAccx[counter*5];
						if(comm_pwd[counter].person_no!=0xff) 
							comm_pwd[counter].person_no&=0x0f;
						memcpy(	(ucharx *)&(comm_pwd[counter].person_pwd[0]),
								(ucharx *)&TempAccx1[counter*10+2],8);
					}
					pwd_type=0x01;
					break;	
				}

				//passwordcheck 2
				case 0x65:
				{
					LenH=0;           //length MSB
					LenL=1;           //length LSB

					SendBuff[4]=0;
					memcpy((ucharx *)&TempAccx[0],(ucharx *)&ReceiveBuff[4],56);
					XramBCD_ASIIC(56,&TempAccx[0],&TempAccx1[0]);
					for(counter=0;counter<2;counter++)
					{
						comm_pwd[counter].person_no=TempAccx[counter*4];
						if(comm_pwd[counter].person_no!=0xff) comm_pwd[counter].person_no&=0x0f;
						memcpy(	(ucharx *) &(comm_pwd[counter].person_pwd[0]),
								(ucharx *)&TempAccx1[counter*8+2],8);
					}
					for(counter=2;counter<10;counter++)
					{
						comm_pwd[counter].person_no=TempAccx[8+(counter-2)*6];
						if(comm_pwd[counter].person_no!=0xff) 
							comm_pwd[counter].person_no&=0x0f;
						memcpy(	(ucharx *)&(comm_pwd[counter].person_pwd[0]),
								(ucharx *)&TempAccx1[16+(counter-2)*12+4],8);
					}
					pwd_type=2;
					break;	
				}

				case 0xff:				
				{
					CommandType=counter;
					break;			
				}

				default:
					break;
				}
				
				flag=0;
			}
			
			///////////////////////////////////////////////////////////
			else
			{
				if(PacketFlag!=0) 
				{	
					flag=2;				//不重新组包标志
					memcpy(SendBuff,OldBuff,(OldBuff[3]+6));
				}
			}
		} 

		if(flag==0)
		{
			SendBuff[0]=ReceiveBuff[0];
			SendBuff[1]=CommandType;
			SendBuff[2]=LenH;
			SendBuff[3]=LenL;
			memcpy(OldBuff,SendBuff,(SendBuff[3]+6));
		}			
		CommDispString(SendBuff[4],SendBuff[1],Tpointer);
		CombFrame(SendBuff);
	}

	DBYTE[0x0d]=100;
	ControlStatus=ControlStatus|Bit_SSX_Rst;
	ChangeStatus();
}


//OUT: 0x22:账号已满,0x63:未开户,else 返回可写的帐号序号(Kind=0)或返回当前帐号数目(Kind=1)
//整理账号,并对其人员权限进行整理
void LineAcct(void)
{
	ucharx TempBuffer[4*1024];

	//用于保存要删除的账号序号
	ucharx DeleteBuff[AccontNumber];
	uchar DeleteAccNum;
	uchar counter;
	uchar counter1;
	uchar counter2;
	uchar counter3;
	uint Address;

	//清除标志数组
	for(counter=0;counter<AccontNumber;counter++)
	{
		DeleteBuff[counter]=0xff;				
	}
	
	Address=AccountAddress;
	
	//read in all unlock code
	YJHReadFlashToExterMem(AccountPage,
		10,
		(ucharx *)AccountAreaAdd,
		(ucharx *)(&TempBuffer[0]));
	counter2=0;
	DeleteAccNum=0;

	//保存要删除的账号序号
	for(counter=0;counter<AccontNumber;counter++)
	{
		ZDHReadFlashToInterMem(AccountPage,1,Address,(ucharx *)(&counter1));
		if((counter1!=0x55)&&(counter1!=0xff))
		{
			DeleteBuff[DeleteAccNum]=counter;		
			DeleteAccNum++;
		}
		else
		{
			//read in account
			YJHReadFlashToExterMem(AccountPage,
				OneCountLength,
				(ucharx *)Address,
				(ucharx *)(&TempBuffer[counter2*OneCountLength+10]));
			counter2++;
		}
		Address+=OneCountLength;
	}
	
	if(DeleteAccNum!=0)
	{
		FlashWriteEnable=Enable;
		EraseBlock(AccountPage,(uchar)(AccountAreaAdd>>12));

		//修改账号区
		YJHExternalWriteFlash(AccountPage,
			counter2*OneCountLength+10,
			(ucharx *)(&TempBuffer[0]),
			AccountAreaAdd);
		
		FlashWriteEnable=Enable;
		EraseBlock(AccountPage,(uchar)(AccountBakAdd>>12));

		//修改账号备份区
		YJHExternalWriteFlash(AccountPage,
			counter2*OneCountLength+10,
			(ucharx *)(&TempBuffer[0]),
			AccountBakAdd);
		
		//read in all person
		YJHReadFlashToExterMem(ConfigFilePage,
			OnePersonLength*(PersonTotalNum*3+1),
			(ucharx *)FirstPersonAdd,
			(ucharx *)(&TempBuffer[0]));
		
		//修改人员权限
		for(counter=0;counter<DeleteAccNum;counter++)				
		{
			Address=0;
			
			//所有人员(签发、审核、授权、主管)
			for(counter1=0;counter1<(PersonTotalNum*3+1);counter1++)
			{
				//整理所有人员区域
				if(TempBuffer[Address]==0x55)				
				{
					for(counter2=0;counter2<AccontNumber;counter2++)
					{
						if(DeleteBuff[counter]!=counter2) 
							continue;
						for(counter3=counter2;counter3<(AccontNumber-1);counter3++)
						{
							TempBuffer[Address+15+counter3]=TempBuffer[Address+15+counter3+1];
						}
						TempBuffer[Address+AccontNumber+15-1]=0xff;

						//人员加校验和
						AddCheckSum((ucharx *)(&TempBuffer[Address+2]),OnePersonLength-3);
					}
				}
				Address+=OnePersonLength;
			}
		}
		
		ZDHWriteFlash(ConfigFilePage,
			OnePersonLength*(PersonTotalNum*3+1),
			(ucharx *)(&TempBuffer[0]),
			FirstPersonAdd);

		//读取打印表设置信息
		YJHReadFlashToExterMem(PRTCFG_ORI_PAGE,
			100,
			(ucharx *)ACD_PRTCFG_ORI_ADDR,
			(ucharx *)(&TempBuffer[0]));

		//修改打印区设置信息
		for(counter=0;counter<DeleteAccNum;counter++)
		{
			for(counter1=0;counter1<AccontNumber;counter1++)
			{
				if(DeleteBuff[counter]!=counter1) 
					continue;

				for(counter2=counter1*5;counter2<(AccontNumber-1)*5;counter2++)
				{
					TempBuffer[counter2]=TempBuffer[counter2+5];
				}
				
				for(;counter2<AccontNumber*5;counter2++)
				{
					TempBuffer[counter2]=0xff;
				}
			}	
		}
		
		ZDHWriteFlash(PRTCFG_ORI_PAGE,
			100,
			(ucharx *)(&TempBuffer[0]),
			ACD_PRTCFG_ORI_ADDR);
		
		return;
	}
}

//对flash内的一段数据计算校验值,并写入随后的位置。
void ZdhFlashChecksum(uchar Page,uint StartAdd,uchar Length)
{
	ucharx TempBuffer[4*1024];
	YJHReadFlashToExterMem(Page,
		Length,
		(ucharx *)StartAdd,
		(ucharx *)(&TempBuffer[0]));

	//数据块加校验和
	AddCheckSum((ucharx *)(&TempBuffer[0]),Length);
	ZDHWriteFlash(Page,
		Length+1,
		(ucharx *)(&TempBuffer[0]),
		StartAdd);
}

//发行机具后对FLASH中的信息进行初始化
void ClearSomeData(void)
{
	ucharx TempBuffer[4*1024];
	ucharx UnlockCode[10];
	uchar Counter;
	uint Address;

	//解锁口令
	YJHReadFlashToExterMem(AccountPage,
		10,
		(ucharx *)AccountAreaAdd,
		(ucharx *)(&UnlockCode[0]));

	//打印设置区
	YJHReadFlashToExterMem(AccountPage,
		4*1024,
		(ucharx *)0xf000,
		(ucharx *)(&TempBuffer[0]));

	//擦除历史记录区、账号备份区、账号区
	for(Counter=0;Counter<16;Counter++)
	{
		FlashWriteEnable=Enable;
		EraseBlock(HistoryPage,(HistoryRecordAdd>>12)+Counter);
	}

	//恢复打印设置区
	YJHExternalWriteFlash(AccountPage,
		4*1024,
		(ucharx *)(&TempBuffer[0]),
		0xf000);

	//配置表
	YJHReadFlashToExterMem(ConfigFilePage,
		128,
		(ucharx *)ConfigBakAdd,
		(ucharx *)(&TempBuffer[0]));

	//计算器参数区
	YJHReadFlashToExterMem(ConfigFilePage,
		13*16+1,
		(ucharx *)0xbb8,
		(ucharx *)(&TempBuffer[300]));
	
	FlashWriteEnable=Enable;
	//清除配置表
	EraseBlock(ConfigFilePage,ConfigFileAdd);
	//读取配置表备份区
	YJHReadFlashToExterMem(ConfigFilePage,
		0x1000,
		(ucharx *)ConfigBakAdd,
		(ucharx *)(&TempBuffer[0]));
	//恢复配置表区
	YJHExternalWriteFlash(ConfigFilePage,
		0x1000,
		(ucharx *)(&TempBuffer[0]),
		ConfigFileAdd);	

	Address=ConfigBakAdd+FirstPersonAdd+OnePersonLength*(PersonTotalNum*3);
	YJHReadFlashToExterMem(ConfigFilePage,
		OnePersonLength,
		(ucharx *)Address,
		(ucharx *)(&TempBuffer[0]));
	Address=Address-ConfigBakAdd;
	//恢复主关
	YJHExternalWriteFlash(ConfigFilePage,
		OnePersonLength,
		(ucharx *)(&TempBuffer[0]),
		Address);

	FlashWriteEnable=Enable;
	//清除电话本
	EraseBlock(PhoneBookPage,(uchar)(PhoneBookAddress>>12));
	FlashWriteEnable=Enable;
	//清除批量处理缓冲区
	EraseBlock(BatchBufferPage,(uchar)(BatchBufferAdd>>12));
	//清除清除关机保护区
	for(Counter=1;Counter<9;Counter++)
	{
		FlashWriteEnable=Enable;
		EraseBlock(PhoneBookPage,(uchar)(SystemBakBufAdd>>12));	
	}
	//主管解锁口令
	for(Counter=0;Counter<10;Counter++)
	{
		TempBuffer[Counter]=UnlockCode[Counter];
	}
	//开户
	YJHExternalWriteFlash(AccountPage,
		10,
		(ucharx *)(&TempBuffer[0]),
		AccountAreaAdd);
	//备份区开户
	YJHExternalWriteFlash(AccountPage,
		10,
		(ucharx *)(&TempBuffer[0]),
		AccountBakAdd); 

	//默认状态有一个签发员
	TempBuffer[0]=0x55;
	TempBuffer[1]=0xff;
	TempBuffer[2]=0x00;
	TempBuffer[3]=0xc7;
	TempBuffer[4]=0xa9;
	TempBuffer[5]=0xb7;
	TempBuffer[6]=0xa2;						//姓名
	TempBuffer[7]=0xd4;						//姓名
	TempBuffer[8]=0xb1;						//姓名
	TempBuffer[9]=0x30;						//姓名
	TempBuffer[10]=0x31						//姓名

	//口令
	for(Counter=11;Counter<15;Counter++)
	{
		TempBuffer[Counter]=0x11;
	}
	//账号权限
	for(Counter=15;Counter<35;Counter++)
	{
		TempBuffer[Counter]=0xff;				
	}
	//数据块加校验和
	AddCheckSum((ucharx *)(&TempBuffer[2]),OnePersonLength-3);	
	//写入默认的签发员
	YJHExternalWriteFlash(ConfigFilePage,
		OnePersonLength,
		(ucharx *)(&TempBuffer[0]),
		FirstPersonAdd);
	//根据当前账号设置权限
	//LineAcct();
}

//给操作员增加一条账号的权限
uchar AddPersonAcc(uchar Personkind,uchar PersonID,uchar AccNo)		
{
	uint Address;
	uchar TempByte;
	ucharx TempBuffer[OnePersonLength];
	Address=Personkind*PersonTotalNum;
	Address=Address+PersonID;
	Address=Address*OnePersonLength;
	Address=Address+FirstPersonAdd;
	//Address=FirstPersonAdd+(Personkind*PersonTotalNum+PersonID)*OnePersonLength;
	YJHReadFlashToExterMem(ConfigFilePage,
		OnePersonLength,
		(ucharx *)Address,
		(ucharx *)(&TempBuffer[0]));
	TempBuffer[15+AccNo]=0x55;
	
	//数据块加校验和
	AddCheckSum((ucharx *)(&TempBuffer[2]),OnePersonLength-3);	
	TempByte=ZDHWriteFlash(ConfigFilePage,
		OnePersonLength,
		(ucharx *)(&TempBuffer[0]),
		Address);
	return(TempByte);
}

void	CommDispString(uchar ErrorFlag,uchar CommandType,CommStruct xdata *Pointer)
{
	uint Address;
	uchar Counter;
	uchar DisplayYAdd;
	uchar DisplayLine;
	ucharx RecordBuffer[sizeof(CommInf)];
	ucharc CommandTypeList[]={	READ_SN,
								GEN_KEYPAIR,
								LOAD_AK,
								DEL_ACCU,
								ADD_SIG,
								UNLOCK,
								DIST_MACH,
								CONN_CALU,PSDCHECK};	
	ucharx UndefineCommand[]={"不可识别命令"};
	
	if(CommandType==0x65) 
		CommandType=PSDCHECK;
	
	if(Pointer->ValidItem==0) 
		YJHClearWindow(Pointer->X1+1,Pointer->Y1+1,Pointer->X2-1,Pointer->Y2-1,0x04);

	//要显示的有效记录条数
	Pointer->ValidItem++;
	DisplayLine=((Pointer->Y2)-(Pointer->Y1)+1)/(12+(Pointer->LineInterval));
	if((Pointer->ValidItem)>DisplayLine)
	{
		Pointer->ValidItem=DisplayLine;
		for(Counter=0;Counter<DisplayLine;Counter++)
		{
			Pointer->CommOneInfDat[Counter].ErrorFlag=\
				Pointer->CommOneInfDat[Counter+1].ErrorFlag;
			Pointer->CommOneInfDat[Counter].StrLength=\
				Pointer->CommOneInfDat[Counter+1].StrLength;
			memcpy(	&(Pointer->CommOneInfDat[Counter].Comminformation[0]),
					&(Pointer->CommOneInfDat[Counter+1].Comminformation[0]),20);
		}
		YJHClearWindow(Pointer->X1+1,Pointer->Y1+1,Pointer->X2-1,Pointer->Y2-1,0x04);
	}
	
	for(Counter=0;Counter<(sizeof(CommandTypeList));Counter++)
	{
		if(CommandTypeList[Counter]==CommandType) 
			break;
	}
	
	if(Counter>=(sizeof(CommandTypeList)))
	{
		memcpy(	&(Pointer->CommOneInfDat[Pointer->ValidItem-1].Comminformation[0]),
				&UndefineCommand[0],
				sizeof(UndefineCommand)-1);
		Pointer->CommOneInfDat[Pointer->ValidItem-1].ErrorFlag=1;
		Pointer->CommOneInfDat[Pointer->ValidItem-1].StrLength=6;	//不可识别命令
	}
	else
	{
		memcpy(&RecordBuffer[0],&CommData[0]+Counter,sizeof(CommInf));
		memcpy(&(Pointer->CommOneInfDat[Pointer->ValidItem-1].Comminformation[0]),
			(ucharc *)((RecordBuffer[5]<<8)|RecordBuffer[6]),RecordBuffer[4]);
		Pointer->CommOneInfDat[Pointer->ValidItem-1].ErrorFlag=\
			ErrorFlag;
		Pointer->CommOneInfDat[Pointer->ValidItem-1].StrLength=\
			get_textlen((ucharx *)(&(Pointer->CommOneInfDat[Pointer->ValidItem-1].Comminformation[0])),
			RecordBuffer[4]);
	}
	DisplayYAdd=Pointer->Y1+2;
	for(Counter=0;Counter<(Pointer->ValidItem);Counter++)
	{
		YJHStringDisplay(Pointer->X1+4,
			DisplayYAdd,
			RecordBuffer[2],
			RecordBuffer[3],
			(ucharx *)(&Pointer->CommOneInfDat[Counter].Comminformation[0]),
			Pointer->CommOneInfDat[Counter].StrLength);
		
		if(Pointer->CommOneInfDat[Counter].ErrorFlag==0) 
			Address=ACCOUNTSELECT;
		else 
			Address=ACCOUNTNOSELECT;

		//正确错误标志
		BMPDisplay(Pointer->X2-19,DisplayYAdd,(ucharx *)(Address));	
		DisplayYAdd=DisplayYAdd+12+Pointer->LineInterval;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -