📄 comm.c.svn-base
字号:
//======================================================================//
void CommunityPcMma(void)
{
uchar x,y;
uchar i;
ucharx TempBuffer[50];
x=0;
//以标题栏下划线为坐标基准
y=15;
YJHClearWindow(0,0,127,80,0x04);
YJHDrawLine(0,15,127,15,1); //灰1级线
YJHDrawLine(0,16,127,16,1); //灰1级线
YJHReadFlashToExterMem(MessagePage,
sizeof(Zztx)-1,
(ucharx *)(&Zztx[0]),
(ucharx *)(&TempBuffer[0]));
YJHStringDisplay(0xff, 1, 0x45, 0x3, &TempBuffer[0],0x8b);
BMPDisplay(15,19,(ucharx *)AddrPcBmp);
BMPDisplay(95,23,(ucharx *)AddrMmqBmp);
for(i=x;i<128;i++)
{
if(i%2==0)
DrawPixel(i, y+30, 3);
else
DrawPixel(i, y+30, 1);
}
YJHDrawLine(38,15+24,66,15+24,1); //灰1级线
YJHDrawLine(66,15+11,66,15+24,1); //灰1级线
YJHDrawLine(66,15+11,95,15+11,1); //灰1级线
DrawPixel(66, 15+11, 0);
DrawPixel(66, 15+24, 0);
DrawPixel(65, 15+23, 1);
DrawPixel(67, 15+12, 1);
DrawPixel(66, 15+17, 3);
DrawPixel(65, 15+19, 3);
DrawPixel(66, 15+18, 3);
DrawPixel(67, 15+19, 3);
DrawPixel(66, 15+19, 3);
YJHReadFlashToExterMem(MessagePage,
sizeof(FlashVersion)-1,
(ucharx *)(&FlashVersion[0]),
(ucharx *)(&TempBuffer[0]));
//软件版本:
YJHStringDisplay(2,70,0x45,0x03,(ucharx *)(&TempBuffer[0]),15);
YJHReadFlashToExterMem(ConfigFilePage,
sizeof(EQID)-1,
(ucharx *)(&EQID),
(ucharx *)(&TempBuffer[0]));
YJHReadFlashToExterMem(ConfigFilePage,
5,
(ucharx *)(ConfigFileAdd+8),
(ucharx *)&(TempBuffer[sizeof(TempBuffer)-5]));
XramBCD_ASIIC(5,
(ucharx *)(&TempBuffer[sizeof(TempBuffer)-5]),
(ucharx *)(&TempBuffer[10]));
//机具编号:
YJHStringDisplay(2,90,0x45,0x03,(ucharx *)(&TempBuffer[0]),15);
}
uchar ZDHCalCheckSum(uchar Page,uchar IniCheckSum,uint Length,ucharx *SourcePoint)
{
uchar CheckSum;
PublicVariable1=(uint)SourcePoint>>8;
PublicVariable2=(uchar)SourcePoint;
CheckSum=CalCheckSum(Page,IniCheckSum,Length);
return(CheckSum);
}
//======================================================================//
//程序校验->参数设置区校验->账号信息备份校验->账号区校验->批量处理缓冲区校验->历史纪录校验
//======================================================================//
void CheckSumExamine(uchar Flag) //函数校验和检测
{
ucharx TempBuffer[4*1024];
uint Address,Address1;
uchar TempByte,counter1,counter2,CheckSum,ErrorFlag;
//-------------加密芯片自检-------------//
//TempByte=EncryptorSelfCheck();
//if(TempByte!=0) ZDHDisplayString(MessagePage,1,(CommInfx *)(&CommData[23]));//加密芯片校验错
//-------------程序校验-------------//
CheckSum=ZDHCalCheckSum(UserProPage,CheckSumIniValu,14*4*1024,(ucharx *)UserProAdd1);
TempByte=ZDHCalCheckSum(UserProPage,CheckSumIniValu,16*4*1024,(ucharx *)0);
counter1=ZDHCalCheckSum(3,CheckSumIniValu,0x8000,(ucharx *)0); //校验页面数据区
if((CheckSum!=0)||(TempByte!=0)||(counter1!=0))
{
ZDHDisplayString(MessagePage,1,(CommInfx *)(&CommData[9]));//程序校验错
GetChar(60,1); //wait key for 3'
ShutPower(); //shut power
}
//--------------配置表校验--------------//
ErrorFlag=0;
ZDHReadFlashToInterMem(ConfigFilePage,1,ConfigFileAdd,(ucharx *)(&TempByte));
if(TempByte!=0x55)
{
ZDHDisplayString(MessagePage,1,(CommInfx *)(&CommData[11]));//无配置表
GetChar(60,1); //wait key for 3'
ShutPower(); //shut power
}
//配置表校验
else
{
CheckSum=ZDHCalCheckSum(ConfigFilePage,CheckSumIniValu,127,(ucharx *)(ConfigFileAdd+1));
if(CheckSum!=0) ErrorFlag=1;
}
ZDHReadFlashToInterMem(ConfigFilePage,1,ConfigBakAdd,(ucharx *)(&TempByte));
//配置表备份区校验
if(TempByte==0x55)
{
CheckSum=ZDHCalCheckSum(ConfigFilePage,CheckSumIniValu,127,(ucharx *)(ConfigBakAdd+1));
if(CheckSum==0)
{
//如果配置表校验错则恢复配置表备份区
if(ErrorFlag==1)
{
YJHReadFlashToExterMem(ConfigFilePage,128,(ucharx *)ConfigBakAdd,(ucharx *)(&TempBuffer[0]));
ZDHWriteFlash(ConfigFilePage,128,(ucharx *)(&TempBuffer[0]),ConfigFileAdd);
}
}
else
{
if(ErrorFlag==1)
{
//配置表校验错
ZDHDisplayString(MessagePage,1,(CommInfx *)(&CommData[12]));
//请交银行处理
ZDHDisplayString(MessagePage,0,(CommInfx *)(&CommData[10]));
//wait key for 3'
GetChar(60,1);
//配置表校验错,关机
ShutPower();
}
//配置表正确,配置表备份错
else
{
YJHReadFlashToExterMem(ConfigFilePage,
128,
(ucharx *)ConfigFileAdd,
(ucharx *)(&TempBuffer[0]));
ZDHWriteFlash(ConfigFilePage,
128,
(ucharx *)(&TempBuffer[0]),
ConfigBakAdd);
}
}
}
else
{
//配置表校验错并且配置表备份区不存在
if(ErrorFlag==1)
{
//配置表校验错
ZDHDisplayString(MessagePage,1,(CommInfx *)(&CommData[12]));
//wait key for 3'
GetChar(60,1);
ShutPower();
}
}
//-------------主管口令校验------------//
Address=FirstPersonAdd+PersonTotalNum*3*OnePersonLength;
CheckSum=ZDHCalCheckSum(ConfigFilePage,
CheckSumIniValu,
OnePersonLength-2,
(ucharx *)(Address+2));
//主管口令校验错
if(CheckSum!=0)
{
ZDHDisplayString(MessagePage,1,(CommInfx *)(&CommData[14]));
}
//--------------口令区校验-------------//
ErrorFlag=0;
Address=FirstPersonAdd;
//口令区校验
for(counter2=0;counter2<49;counter2++)
{
ZDHReadFlashToInterMem(ConfigFilePage,1,Address,(ucharx *)(&TempByte));
if(TempByte==0x55)
{
CheckSum=ZDHCalCheckSum(ConfigFilePage,
CheckSumIniValu,
OnePersonLength-2,
(ucharx *)(Address+2));
if(CheckSum!=0)
{
//口令校验错误标志
ErrorFlag=1;
CheckSum=0;
ZDHInternalWriteFlash(ConfigFilePage,1,(ucharx *)(&CheckSum),Address);
}
}
Address+=OnePersonLength;
}
//口令校验错
if(ErrorFlag==1)
ZDHDisplayString(MessagePage,1,(CommInfx *)(&CommData[17]));
//-------------授权金额校验------------//
ErrorFlag=0;
//授权金额地址
Address=AuthorMoneyAdd;
//授权员地址
Address1=AuthorMoneyAdd-PersonTotalNum*OnePersonLength;
for(counter1=0;counter1<PersonTotalNum;counter1++)
{
//检查授权员是否存在
ZDHReadFlashToInterMem(ConfigFilePage,1,Address1,(ucharx *)(&TempByte));
//当前授权员存在?
if(TempByte==0x55)
{
CheckSum=ZDHCalCheckSum(ConfigFilePage,CheckSumIniValu,9,(ucharx *)Address);
if(CheckSum!=0)
{
//金额校验错误标志
ErrorFlag=1;
CheckSum=0;
ZDHInternalWriteFlash(ConfigFilePage,1,(ucharx *)(&CheckSum),Address1);
}
//授权金额地址递增
Address+=9;
//授权员地址递增
Address1+=OnePersonLength;
}
}
//授权金额校验错
if(ErrorFlag==1)
ZDHDisplayString(MessagePage,1,(CommInfx *)(&CommData[15]));
//------------授权员动态口令区校验-------------//
ErrorFlag=0;
//动态口令地址
Address=DynamicPassAdd;
//授权员动态口令区校验
for(counter1=0;counter1<PersonTotalNum;counter1++)
{
counter2=0;
//检查动态口令区是否存在
ZDHReadFlashToInterMem(ConfigFilePage,1,Address,(ucharx *)(&TempByte));
//动态口令区存在?
if(TempByte==0x55)
{
CheckSum=ZDHCalCheckSum(ConfigFilePage,CheckSumIniValu,15,(ucharx *)(Address+1));
if(CheckSum!=0) counter2=1;
TempByte=ZDHCalCheckSum(ConfigFilePage,CheckSumIniValu,50,(ucharx *)(Address+16));
CheckSum=ZDHCalCheckSum(ConfigFilePage,CheckSumIniValu,50,(ucharx *)(Address+66));
if((TempByte!=CheckSum)||counter2==1)
{
ErrorFlag=1;
CheckSum=0;
//校验和错删除该记录
ZDHInternalWriteFlash(ConfigFilePage,1,(ucharx *)(&CheckSum),Address);
}
}
Address+=116;
}
if(ErrorFlag==1)
//动态口令区校验错
ZDHDisplayString(MessagePage,1,(CommInfx *)(&CommData[16]));
//----------账号备份信息校验和账号信息校验------------//
//校验账号区
TempByte=AccountCheck(0,AccountAreaAdd);
//校验账号备份区
ErrorFlag=AccountCheck(0,AccountBakAdd);
if(TempByte!=0)
{
if(ErrorFlag!=0)
{
switch(TempByte)
{
//机具未发行
case NoInitial:
{
//账号区未初始化
TempByte=20;
break;
}
//解锁口令错
case UnlockError:
{
//解锁口令错
TempByte=21;
break;
}
//校验错
case 1:
{
//账号区校验错
TempByte=22;
break;
}
//系统无账号
case 2:
{
TempByte=24;
break;
}
}
//错误提示
ZDHDisplayString(MessagePage,3,(CommInfx *)(&CommData[TempByte]));
if(Flag==0)
{
//请交银行处理
ZDHDisplayString(MessagePage,0,(CommInfx *)(&CommData[10]));
//wait key for 3'
GetChar(60,1);
//系统无账号,关机
ShutPower();
}
else
{
if(TempByte==22)
{
//校验账号区
TempByte=AccountCheck(1,AccountAreaAdd);
//校验账号备份区
TempByte=AccountCheck(1,AccountBakAdd);
}
}
}
//恢复账号备份区
else
{
YJHReadFlashToExterMem(AccountPage,
4*1024,
(ucharx *)AccountBakAdd,
(ucharx *)(&TempBuffer[0]));
ZDHWriteFlash(AccountPage,
4*1024,
(ucharx *)(&TempBuffer[0]),
AccountAreaAdd);
}
}
else
{
//账号区覆盖账号备份区
if(ErrorFlag!=0)
{
YJHReadFlashToExterMem(AccountPage,4*1024,(ucharx *)AccountAreaAdd,(ucharx *)(&TempBuffer[0]));
ZDHWriteFlash(AccountPage,4*1024,(ucharx *)(&TempBuffer[0]),AccountBakAdd);
}
}
//---------------历史记录区校验--------------//
ErrorFlag=0;
//历史记录缓冲区11个扇区
for(counter2=0;counter2<11;counter2++)
{
Address=HistoryRecordAdd+counter2*4*1024;
//历史记录区校验
for(counter1=0;counter1<RecordOnePage;counter1++)
{
ZDHReadFlashToInterMem(HistoryPage,1,Address,(ucharx *)(&TempByte));
//历史记录是否存在
if(TempByte==0x55)
{
CheckSum=ZDHCalCheckSum(HistoryPage,
CheckSumIniValu,
OneHisRecordLen-1,
(ucharx *)(Address+1));
if(CheckSum!=0)
{
//校验错误标志
ErrorFlag=1;
CheckSum=0;
//删除标志
ZDHInternalWriteFlash(HistoryPage,1,(ucharx *)(&CheckSum),Address);
}
}
Address+=OneHisRecordLen;
}
}
//历史记录区校验错
if(ErrorFlag==1)
ZDHDisplayString(MessagePage,1,(CommInfx *)(&CommData[19]));
}
void ZDHDisplayString(uchar Page,uchar ClearFlag,CommInfx *StringPointer)
{
ucharx DislayBuffer[sizeof(CommInf)];
uint Address;
YJHReadFlashToExterMem(Page,7,
(ucharx *)(&StringPointer->X),
(ucharx *)(&DislayBuffer[0]));
if((ClearFlag==1)||(ClearFlag==3))
ClearLCD(0,0);
Address=(DislayBuffer[5]<<8)|DislayBuffer[6];
YJHReadFlashToExterMem(Page,
DislayBuffer[4],
(ucharx *)Address,
(ucharx *)(&DislayBuffer[7]));
DislayBuffer[4]=get_textlen((ucharx *)(&DislayBuffer[7]),DislayBuffer[4]);
YJHStringDisplay( DislayBuffer[0],
DislayBuffer[1],
DislayBuffer[2],
DislayBuffer[3],
(ucharx *)(&DislayBuffer[7]),DislayBuffer[4]);
//wait key for 2'
if((ClearFlag==0)||(ClearFlag==1))
GetChar(40,1);
}
//======================================================================//
// FlashCheckSum() 计算校验和的长度必须小于16K
//======================================================================//
/*
uchar FlashCheckSum(uchar Page,uchar IniCheckSum,ucharx *Pointer,uint Length)//FLASH数据块校验
{
ucharx TempBuffer[16*1024]; //外部16K缓冲区
uchar CheckSum=IniCheckSum;
uint Counter,Counter1;
if(Length==0) return(0);
do
{
if(Length>=(16*1024))
{
Counter1=16*1024;
Length-=16*1024;
}
else
{
Counter1=Length;
Length=0;
}
YJHReadFlashToExterMem(Page,Counter1,Pointer,(ucharx *)(&TempBuffer[0]));
for(Counter=0;Counter<Counter1;Counter++)
{
CheckSum^=TempBuffer[Counter];
}
}while(Length!=0);
return(CheckSum);
}
*/
//======================================================================//
//返回:0:正确,0xfb:解锁口令错,0xfb:未初始化,其它:错误
//======================================================================//
uchar AccountCheck(uchar Flag,uint StartAdd) //账号区和账号备份区校验
{
uchar ErrorFlag;
uchar TempByte;
uchar counter;
ZDHReadFlashToInterMem(AccountPage,1,StartAdd,(ucharx *)(&TempByte));//检查是否开户
if(TempByte!=0x55)
return(NoInitial);
else
{
TempByte=ZDHCalCheckSum(AccountPage,CheckSumIniValu,9,(ucharx *)(StartAdd+1));
//返回解锁口令错
if(TempByte!=0)
return(UnlockError);
}
//获取账号总数
TempByte=GetFreeAcctStart(0x01);
//系统无账号
if(TempByte==0)
return(2);
ErrorFlag=0;
//指向账号
StartAdd+=10;
//账号信息校验
for(counter=0;counter<AccontNumber;counter++)
{
ZDHReadFlashToInterMem(AccountPage,1,StartAdd,(ucharx *)(&TempByte));
if(TempByte==0x55)
{
TempByte=ZDHCalCheckSum(AccountPage,
CheckSumIniValu,
83,
(ucharx *)(StartAdd+1));
if(TempByte!=0)
{
ErrorFlag=1;
//如果开机不进入通讯并且账号校验错,则删除错误的账号
if(Flag==1)
{
TempByte=0;
ZDHWriteFlash(AccountPage,1,(ucharx *)&TempByte,StartAdd);
}
}
StartAdd+=128;
}
}
if((ErrorFlag==1)&&(Flag==1))
{
//如果重新整理了账号,则修改权限
LineAcct();
FlashWriteEnable=Enable;
//删除批量处理缓冲区
EraseBlock(BatchBufferPage,TempRecordAdd/0x1000);
FlashWriteEnable=Enable;
//关机备份缓冲区
EraseBlock(SystemBakBufPage,0xf000/0x1000);
}
return(ErrorFlag);
}
//去除非数字数据
void RemoveNoNumber(ucharx *point)
{
uchar k,j=0;
uchar m;
for(k=0;k<32;k++)
{
if((k%2)==0)
m=*(point+15-(k/2))&0x0F;
else
m=(*(point+15-(k/2))&0xF0)>>4;
if((m+0x30)<0x3a)
{
if((j%2)==0)
( *(point+15-(j/2)))&=0xF0;
else
{
(*(point+15-(j/2)))&=0x0F;
m=m<<4;
}
(*(point+15-(j/2)))^=m;
j++;
}
}
for(;j<32;j++)
{
if((j%2)==0)
(*(point+15-(j/2)))&=0xF0;
else
(*(point+15-(j/2)))&=0x0F;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -