📄 comm.c.svn-base
字号:
}
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 + -