📄 pc_comm.c
字号:
read_28sf040(i,LengthOfAddBlackVerInfo,(byte *)&AddBlackVerInfo1);//从28SF040中读出新增黑名单信息
if (AddBlackVerInfo1.CRC!=CRC_16((byte *)&AddBlackVerInfo1,LengthOfAddBlackVerInfo-2))
{ //28SF040中的新增黑名单信息不正确
Read_2402(AddressOfAddBlackVerInfo,(byte *)&AddBlackVerInfo1,LengthOfAddBlackVerInfo);//从2402中读取新增黑名单信息
if (AddBlackVerInfo1.CRC!=CRC_16((byte *)&AddBlackVerInfo1,LengthOfAddBlackVerInfo-2))
{ //2402中的新增黑名单信息也不正确
if (AddBlackVerInfo.CRC==CRC_16((byte *)&AddBlackVerInfo,LengthOfAddBlackVerInfo-2))
{ //SRAM中信息正确
write_28sf040(i,LengthOfAddBlackVerInfo,(byte *)&AddBlackVerInfo);//向28SF040写入新增黑名单
Write_2402(AddressOfAddBlackVerInfo,(byte *)&AddBlackVerInfo,LengthOfAddBlackVerInfo);//保存新增黑名单信息
}
else
{
Clear_AddBlackVerInfo(); //没有新增黑名单信息,清除信息
Send_Error_Information("新增黑名单初始化!");
}
}
else
write_28sf040(i,LengthOfAddBlackVerInfo,(byte *)&AddBlackVerInfo1);//向28SF040写入新增黑名单
}
read_28sf040(i,LengthOfAddBlackVerInfo,(byte *)&AddBlackVerInfo);//从28SF040中读出新增黑名单信息
}
//存储新增黑名单信息
Save_AddBlackList_Info()
{
DownLoadFlag=0; //清除正在下载新增黑名单的标志
AddBlackVerInfo.Ver=InfoList[1]; //版本号
AddBlackVerInfo.Number=InfoList[15]; //名单数量
Save_AddBlackVerInfo(); //保存新增黑名单版本信息
}
//存储新增黑名单
Save_AddBlackList()
{
byte i;
word j;
if (ApplyDownLoad==2)
{ //下载数据为新增黑名单信息
for (i=0;i<16;i++)
InfoList[i]=XBYTE[StartAddOfRFPC+11+i];//暂存新增黑名单信息
if (DLTotalLength==16)
Save_AddBlackList_Info(); //数据全部下载完毕
else
{
Clear_AddBlackVerInfo(); //清除新增黑名单版本号
DLSector=1; //继续下载的数据存储在第二个扇区中
}
}
else
{
i=ValidLengthOfRFPC-5; //下载数据的实际长度
Save_BLackWhite_List(i,DLSector+AddBlackFS);//存储到28SF040中
j=(DLSector-1)*240;
j+=i+16; //得到实际已经下载的数据的长度
if (j>=DLTotalLength)
Save_AddBlackList_Info(); //数据全部下载完毕
else
DLSector++; //要写入的扇区号加一,继续下载
}
}
//保存新删黑名单的版本信息
Save_DelBlackVerInfo()
{
word i;
DelBlackVerInfo.CRC=CRC_16((byte *)&DelBlackVerInfo,LengthOfDelBlackVerInfo-2);//新删黑名单的CRC校验和
i=DelBlackFS; //要存储到的扇区号
i<<=8; //要存储到的地址
write_28sf040(i,LengthOfDelBlackVerInfo,(byte *)&DelBlackVerInfo);//向28SF040写入新删黑名单
Write_2402(AddressOfDelBlackVerInfo,(byte *)&DelBlackVerInfo,LengthOfDelBlackVerInfo);//保存新删黑名单信息
}
//清除新删黑名单的版本信息
Clear_DelBlackVerInfo()
{
DelBlackVerInfo.Ver=0; //版本号为0
DelBlackVerInfo.Number=0; //名单数量为0
Save_DelBlackVerInfo(); //存储新删黑名单
}
//获得新删黑名单的版本信息
Load_DelBlackVerInfo()
{
word i;
i=DelBlackFS; //要读取的扇区号
i<<=8; //要读取的地址
read_28sf040(i,LengthOfDelBlackVerInfo,(byte *)&DelBlackVerInfo1);//从28SF040中读出新删黑名单信息
if (DelBlackVerInfo1.CRC!=CRC_16((byte *)&DelBlackVerInfo1,LengthOfDelBlackVerInfo-2))
{ //28SF040中的新删黑名单信息不正确
Read_2402(AddressOfDelBlackVerInfo,(byte *)&DelBlackVerInfo1,LengthOfDelBlackVerInfo);//从2402中读取新删黑名单信息
if (DelBlackVerInfo1.CRC!=CRC_16((byte *)&DelBlackVerInfo1,LengthOfDelBlackVerInfo-2))
{ //2402中的新删黑名单信息也不正确
if (DelBlackVerInfo.CRC==CRC_16((byte *)&DelBlackVerInfo,LengthOfDelBlackVerInfo-2))
{ //SRAM中信息正确
write_28sf040(i,LengthOfDelBlackVerInfo,(byte *)&DelBlackVerInfo);//向28SF040写入新删黑名单
Write_2402(AddressOfDelBlackVerInfo,(byte *)&DelBlackVerInfo,LengthOfDelBlackVerInfo);//保存新删黑名单信息
}
else
{
Clear_DelBlackVerInfo(); //没有新删黑名单信息,清除信息
Send_Error_Information("新删黑名单初始化!");
}
}
else
write_28sf040(i,LengthOfDelBlackVerInfo,(byte *)&DelBlackVerInfo1);//向28SF040写入新删黑名单
}
read_28sf040(i,LengthOfDelBlackVerInfo,(byte *)&DelBlackVerInfo);//从28SF040中读出新删黑名单信息
}
//存储新删黑名单信息
Save_DelBlackList_Info()
{
DownLoadFlag=0; //清除正在下载新删黑名单的标志
DelBlackVerInfo.Ver=InfoList[1]; //版本号
DelBlackVerInfo.Number=InfoList[15]; //名单数量
Save_DelBlackVerInfo(); //保存新删黑名单版本信息
}
//存储新删黑名单
Save_DelBlackList()
{
byte i;
word j;
if (ApplyDownLoad==3)
{ //下载数据为新删黑名单信息
for (i=0;i<16;i++)
InfoList[i]=XBYTE[StartAddOfRFPC+11+i];//暂存新删黑名单信息
if (DLTotalLength==16)
Save_DelBlackList_Info(); //数据全部下载完毕
else
{
Clear_DelBlackVerInfo(); //清除新删黑名单版本号
DLSector=1; //继续下载的数据存储在第二个扇区中
}
}
else
{
i=ValidLengthOfRFPC-5; //下载数据的实际长度
Save_BLackWhite_List(i,DLSector+DelBlackFS);//存储到28SF040中
j=(DLSector-1)*240;
j+=i+16; //得到实际已经下载的数据的长度
if (j>=DLTotalLength)
Save_DelBlackList_Info(); //数据全部下载完毕
else
DLSector++; //要写入的扇区号加一,继续下载
}
}
//保存白名单的版本信息
Save_WhiteVerInfo()
{
word i;
WhiteVerInfo.CRC=CRC_16((byte *)&WhiteVerInfo,LengthOfWhiteVerInfo-2);//白名单的CRC校验和
i=WhiteFS; //要存储到的扇区号
i<<=8; //要存储到的地址
write_28sf040(i,LengthOfWhiteVerInfo,(byte *)&WhiteVerInfo);//向28SF040写入白名单
Write_2402(AddressOfWhiteVerInfo,(byte *)&WhiteVerInfo,LengthOfWhiteVerInfo);//保存白名单信息
}
//清除白名单的版本信息
Clear_WhiteVerInfo()
{
WhiteVerInfo.Ver=0; //版本号为0
WhiteVerInfo.Number=0; //名单数量为0
Save_WhiteVerInfo(); //存储白名单
}
//获得白名单的版本信息
Load_WhiteVerInfo()
{
word i;
i=WhiteFS; //要读取的扇区号
i<<=8; //要读取的地址
read_28sf040(i,LengthOfWhiteVerInfo,(byte *)&WhiteVerInfo1);//从28SF040中读出白名单信息
if (WhiteVerInfo1.CRC!=CRC_16((byte *)&WhiteVerInfo1,LengthOfWhiteVerInfo-2))
{ //28SF040中的白名单信息不正确
Read_2402(AddressOfWhiteVerInfo,(byte *)&WhiteVerInfo1,LengthOfWhiteVerInfo);//从2402中读取白名单信息
if (WhiteVerInfo1.CRC!=CRC_16((byte *)&WhiteVerInfo1,LengthOfWhiteVerInfo-2))
{ //2402中的白名单信息也不正确
if (WhiteVerInfo.CRC==CRC_16((byte *)&WhiteVerInfo,LengthOfWhiteVerInfo-2))
{ //SRAM中信息正确
write_28sf040(i,LengthOfWhiteVerInfo,(byte *)&WhiteVerInfo);//向28SF040写入白名单
Write_2402(AddressOfWhiteVerInfo,(byte *)&WhiteVerInfo,LengthOfWhiteVerInfo);//保存白名单信息
}
else
{
Clear_WhiteVerInfo(); //没有白名单信息,清除信息
Send_Error_Information("白名单初始化!");
}
}
else
write_28sf040(i,LengthOfWhiteVerInfo,(byte *)&WhiteVerInfo1);//向28SF040写入白名单
}
read_28sf040(i,LengthOfWhiteVerInfo,(byte *)&WhiteVerInfo);//从28SF040中读出白名单信息
}
//存储白名单
Save_WhiteList_Info()
{
DownLoadFlag=0; //清除正在下载白名单的标志
WhiteVerInfo.Ver=InfoList[1]; //版本号
WhiteVerInfo.Number=InfoList[15]; //名单数量
Save_WhiteVerInfo(); //保存白名单版本信息
}
//存储白名单
Save_WhiteList()
{
byte i;
word j;
if (ApplyDownLoad==4)
{ //下载数据为白名单信息
for (i=0;i<16;i++)
InfoList[i]=XBYTE[StartAddOfRFPC+11+i];//暂存白名单信息
if (DLTotalLength==16)
Save_WhiteList_Info(); //数据全部下载完毕
else
{
Clear_WhiteVerInfo(); //清除白名单版本号
DLSector=1; //继续下载的数据存储在第二个扇区中
}
}
else
{
i=ValidLengthOfRFPC-5; //下载数据的实际长度
Save_BLackWhite_List(i,DLSector+WhiteFS);//存储到28SF040中
j=(DLSector-1)*240;
j+=i+16; //得到实际已经下载的数据的长度
if (j>=DLTotalLength)
Save_WhiteList_Info(); //数据全部下载完毕
else
DLSector++; //要写入的扇区号加一,继续下载
}
}
//比较待查的卡应用号与将要读出的卡应用号是否一致
//一致则返回1、若待查大于读出则返回2、小于则返回3
byte Compare_CardNumber(word Sector,word Num)
{
byte i,j,k;
dword l;
Num--;
l=Num/24; //该记录所在扇区的偏移量
l+=Sector+1; //绝对扇区号
l<<=8; //扇区的首地址
i=Num%24; //该记录在扇区内的偏移量
i*=10;
i++;
l+=i; //该记录所在的地址
read_28sf040(l,10,Buffer); //从28SF040中读出卡应用号
for (i=0;i<10;i++)
{
j=Buffer[i];
k=IcCardData.CardNumber[i];
if (k>j)
return (2); //大于
if (k<j)
return (3); //小于
}
return (1); //一致
}
//用二分法查找升序排列的黑/白名单
//Sector:名单所在的第一个扇区号、Number:名单的数量
//找到匹配的名单则返回1
byte Find_BlackWhite(word Sector,word Number)
{
byte i,i1;
word j,j1,j2;
if (Number==1)
return (Compare_CardNumber(Sector,1));//只有唯一的名单直接从第一个扇区中取数
else
{
for (i=2,j=2;i<16;i++) //先计算需要查找的次数
{
if (Number<=(j+1)) break;
j*=2;
}
j++; //i为要查找的最大次数,j为补齐后的最大名单数
j1=1; //查找范围为j1-j
for (;i>0;i--)
{
Clear_WatchDog();
j2=j-j1;
if (j2==1)
{ //已经是最后一次查找
i1=Compare_CardNumber(Sector,j1);
if (i1==1)
return (1); //找到匹配的记录
i1=Compare_CardNumber(Sector,j);
if (i1==1)
return (1); //找到匹配的记录
return (0); //没有找到匹配的记录
}
j2/=2;
j2+=j1; //查找中间的记录
i1=Compare_CardNumber(Sector,j2);
switch (i1)
{
case 1:
return (1); //找到匹配的记录
case 2:
{ //卡号比刚刚读出的卡号大,则向后查找
j1=j2;
for (;;)
{
j2=j-j1;
j2/=2;
j2+=j1;
if (j2>Number)
{ //已超出范围
j=j2; //前向查找
i--; //查找次数减少一次
}
else
break;
}
} break;
case 3:
{ //卡号比刚刚读出的卡号小,则向前查找
j=j2;
}
}
}
}
return (0); //不匹配
}
//查到是黑名单后生成交易
Save_BlackCard_Transaction()
{
IcCardData.TAC[0]=0;
IcCardData.TAC[1]=1;
Save_TransactionRecord(9);
Key_Display_TS1("已挂失卡!"); //显示“已挂失卡”
lock_pin();//黑名单卡锁密码
}
Send_White_Card()
{
byte code s1[]={ //非本站管理卡!
0xB7,0xC7,0xB1,0xBE,0xD5,0xBE,0xB9,0xDC,0xC0,0xED,0xBF,0xA8,0x21,0x00};
byte code s2[]={ //非本站员工卡!
0xB7,0xC7,0xB1,0xBE,0xD5,0xBE,0xD4,0xB1,0xB9,0xA4,0xBF,0xA8,0x21,0x00};
byte code s3[]={ //非本站验泵卡!
0xB7,0xC7,0xB1,0xBE,0xD5,0xBE,0xD1,0xE9,0xB1,0xC3,0xBF,0xA8,0x21,0x00};
byte code s4[]={ //非本站维修卡!
0xB7,0xC7,0xB1,0xBE,0xD5,0xBE,0xCE,0xAC,0xD0,0xDE,0xBF,0xA8,0x21,0x00};
switch (IcCardData.CardNumber[2])
{
case 0x02:
Key_Display_TS(s1); //显示“非本站管理卡”
break;
case 0x04:
Key_Display_TS(s2); //显示“非本站员工卡”
break;
case 0x05:
Key_Display_TS(s3); //显示“非本站验泵卡”
break;
case 0x06:
Key_Display_TS(s4); //显示“非本站维修卡”
break;
}
}
//查找黑白名单
Check_BlackWhiteList()
{
word i;
byte j;
char code s1[]={ //正在查找黑名单!
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -