📄 pc_comm.c
字号:
0xD5,0xFD,0xD4,0xDA,0xB2,0xE9,0xD5,0xD2,0xBA,0xDA,0xC3,0xFB,0xB5,0xA5,0x21,0x00};
char code s2[]={ //正在查找白名单!
0xD5,0xFD,0xD4,0xDA,0xB2,0xE9,0xD5,0xD2,0xB0,0xD7,0xC3,0xFB,0xB5,0xA5,0x21,0x00};
byte code s3[]={ //黑白名单未生效!
0xBA,0xDA,0xB0,0xD7,0xC3,0xFB,0xB5,0xA5,0xCE,0xB4,0xC9,0xFA,0xD0,0xA7,0x21,0x00};
byte code s4[]={ //黑白名单已截止!
0xBA,0xDA,0xB0,0xD7,0xC3,0xFB,0xB5,0xA5,0xD2,0xD1,0xBD,0xD8,0xD6,0xB9,0x21,0x00};
if (IcCardData.IcCardState==40)
{ //需要查询黑白名单
if (CheckBlackWhite==0)
{ //还没有开始查询黑白名单
if (PCOffLine==0)
{
TypeOfCheckBW=0;
CheckBlackWhite=1; //联机状态下设置正在查找黑白名单的标志
if (IcCardData.IcCardType<0x0f)
Key_Display_TS(s1); //用户卡查找黑名单
else
Key_Display_TS(s2); //非用户卡查找白名单
}
else
{ //脱机状态则在本机查询黑/白名单
CheckBlackWhite=2; //不再检测黑名单
TypeOfCheckBW=1;
Load_BlackVerInfo(); //读入基础黑名单信息
if ((IcCardData.IcCardType<0x10) && (BlackVerInfo.Ver[0]==0) && (BlackVerInfo.Ver[1]==0))
{
Key_Display_TS("黑名单无效!");//用户卡查找黑名单
return; //黑名单无效
}
Get_Clock(Buffer); //获得当前时间
for (i=0;i<4;i++)
{
if (Buffer[i]>BlackVerInfo.ValidDate[i])
break;
else if (Buffer[i]<BlackVerInfo.ValidDate[i])
{ //当前日期还不到生效日期
Key_Display_TS(s3);
return;
}
}
for (i=0;i<4;i++)
{
if (BlackVerInfo.StopDate[i]>Buffer[i])
break;
else if (BlackVerInfo.StopDate[i]<Buffer[i])
{ //当前日期已过截止日期
Key_Display_TS(s4);
return;
}
}
if (IcCardData.IcCardType<0x10)
{ //用户卡查询黑名单
j=(IcCardData.CardNumber[3]<<4)&0xf0;//省代码高4位
j|=(IcCardData.CardNumber[4]>>4)&0x0f;//省代码低4位
// if (BlackVerInfo.ValidRegion[0]!=j)
if (StationVerInfo.Prov!=j)
{
Key_Display_TS("非本省用户卡!");//显示”非本省用户卡“
return;
}
Key_Display_TS(s1);//用户卡查找黑名单
//目前不判断此批名单生效时间
Load_DelBlackVerInfo(); //读入新删黑名单信息
i=DelBlackVerInfo.Number; //获得新删黑名单数量
if ((DelBlackVerInfo.Ver!=0) && (i!=0))
{ //版本号有效且名单数量不为0
if (Find_BlackWhite(DelBlackFS,i)==1)
{
IcCardData.BlackCardFlag=0;//在新删黑名单中
return;
}
}
Load_AddBlackVerInfo(); //读入新增黑名单信息
i=AddBlackVerInfo.Number; //获得新增黑名单数量
if ((AddBlackVerInfo.Ver!=0) && (i!=0))
{ //版本号有效且名单数量不为0
if (Find_BlackWhite(AddBlackFS,i)==1)
{
Save_BlackCard_Transaction();//查到是黑名单后生成交易
return; //在新增黑名单中
}
}
i=BlackVerInfo.Number; //获得基础黑名单数量
if (i!=0)
{ //名单数量不为0
if (Find_BlackWhite(BlackFS,i)==1)
{
Save_BlackCard_Transaction();//查到是黑名单后生成交易
return; //在新增黑名单中
}
else
IcCardData.BlackCardFlag=0;//不在黑名单中
}
else
IcCardData.BlackCardFlag=0; //不在黑名单中
}
else
{ //员工卡查询白名单
Load_WhiteVerInfo(); //读入白名单信息
i=WhiteVerInfo.Number; //获得白名单数量
if (WhiteVerInfo.Ver!=0)
{
if (i!=0)
{ //版本号有效且名单数量不为0
Key_Display_TS(s2); //非用户卡查找白名单
if (Find_BlackWhite(WhiteFS,i)==1)
IcCardData.BlackCardFlag=0;//在白名单中
else
Send_White_Card();
}
else
Send_White_Card();
}
else
Key_Display_TS("白名单无效!");
}
}
}
else if (CheckBlackWhite==1)
{ //正在通过PC查询黑/白名单
if (PCOffLine==1)
CheckBlackWhite=0; //已脱机准备在本机查询
}
}
else
CheckBlackWhite=0; //清除正在查找黑白名单的标志
}
//保存油品油价信息
Save_PriceVerInfo()
{
word i;
PriceVerInfo.CRC=CRC_16((byte *)&PriceVerInfo,LengthOfPriceVerInfo-2);//油站信息的CRC校验和
i=PriceFS; //要存储到的扇区号
i<<=8; //要存储到的地址
write_28sf040(i,LengthOfPriceVerInfo,(byte *)&PriceVerInfo);//向28SF040写入油品油价信息
write_28sf040(i+256,LengthOfPriceVerInfo,(byte *)&PriceVerInfo);//在相邻的扇区再保存一份
}
//清除油品油价信息
Clear_PriceVerInfo()
{
PriceVerInfo.Ver=0; //版本号为0
PriceVerInfo.FieldNum=0; //记录数为0
PriceVerInfo.ValidFlag=2; //无待生效的单价
Save_PriceVerInfo(); //存储油品油价信息
Send_Error_Information("油品油价初始化!");
}
//获得油品油价信息
Load_PriceVerInfo()
{
word i;
i=PriceFS; //要读取的扇区号
i<<=8; //要读取的地址
read_28sf040(i,LengthOfPriceVerInfo,(byte *)&PriceVerInfo1);//从28SF040中读出油品油价信息
if (PriceVerInfo1.CRC!=CRC_16((byte *)&PriceVerInfo1,LengthOfPriceVerInfo-2))
{ //28SF040中的油站通用信息不正确
read_28sf040(i+256,LengthOfPriceVerInfo,(byte *)&PriceVerInfo1);//从相邻扇区读出油品油价信息
if (PriceVerInfo1.CRC!=CRC_16((byte *)&PriceVerInfo1,LengthOfPriceVerInfo-2))
{ //相邻扇区中的数据也不正确
if (PriceVerInfo.CRC==CRC_16((byte *)&PriceVerInfo,LengthOfPriceVerInfo-2))
{ //SRAM中信息正确
write_28sf040(i,LengthOfPriceVerInfo,(byte *)&PriceVerInfo);//向28SF040写入油站通用信息
write_28sf040(i+256,LengthOfPriceVerInfo,(byte *)&PriceVerInfo);//向相邻扇区也写入油站通用信息
}
else
Clear_PriceVerInfo(); //没有油品油价信息,清除
}
else
write_28sf040(i,LengthOfPriceVerInfo,(byte *)&PriceVerInfo1);//向28SF040写入油站通用信息
}
read_28sf040(i,LengthOfPriceVerInfo,(byte *)&PriceVerInfo);//从28SF040中读出油站通用信息
OilNumber[0]=PriceVerInfo.GDP[0].O_TYPE[0];//保存上次的油品代码
OilNumber[1]=PriceVerInfo.GDP[0].O_TYPE[1];//保存上次的油品代码
}
//比较当前时间与油价生效时间
//若当前时间等于或晚于生效时间则返回1
Check_Price_Time()
{
byte i,j;
word k;
if ((PriceVerInfo.FieldNum!=0) && ((DataOfNozzle.Status==0) || (DataOfNozzle.Status==10)) &&
(PriceVerInfo.ValidFlag<2) && (TransactionRecord.NumberOfOfflineSave<(NumberOfTransactionRecord-2)))
{ //没有加油,有单价待生效且脱机数据少于1999笔
Get_Clock(Buffer); //获得当前时间
for (i=0,j=1;i<6;i++)
{
if (Buffer[i]>PriceVerInfo.V_DT[i])
break; //当前时间比生效时间晚
if (Buffer[i]<PriceVerInfo.V_DT[i])
{
j=0;
break; //当前时间比生效时间早
}
}
if (j==0)
{ //当前时间比生效时间早
if (PriceVerInfo.ValidFlag==0)
{ //当前油价还未生效
Save_TransactionRecord(8); //对油价信息的回应
k=PriceVerInfo.GDP[0].PRC[0]; //获得目前的油价
if (k!=0)
{ //油价不为0
if (Change_SKCPU_Price(k)==1) //向税控CPU 发送请求修改单价的命令
{
TimerOfSpeaker=6;
if (k!=DataOfSave.Price)
{ //油价不同
Set_Price(k); //修改单价
if (TransactionRecord.EMP!=0xff)
{ //单价改变需自动下班
Save_TransactionRecord(6);//存储下班数据
TransactionRecord.EMP=0xff;//无员工上班
Save_TransactionRecordInfo();//存储成交记录信息
pop_IC_card(); //下班弹卡
}
}
}
}
PriceVerInfo.ValidFlag=1; //设置当前油价已生效的标志
Save_PriceVerInfo(); //保存油品油价信息
}
}
if (j==1)
{ //当前时间与生效时间相同或比生效时间晚
Save_TransactionRecord(8); //对油价信息的回应
k=PriceVerInfo.NextGDP[0].PRC[0]; //获得新的油价
if (k!=0)
{ //油价不为0
if (Change_SKCPU_Price(k)==1) //向税控CPU 发送请求修改单价的命令
{
TimerOfSpeaker=6;
if (k!=DataOfSave.Price)
{ //油价不同
Set_Price(k); //修改单价
if (TransactionRecord.EMP!=0xff)
{ //单价改变需自动下班
Save_TransactionRecord(6);//存储下班数据
TransactionRecord.EMP=0xff;//无员工上班
Save_TransactionRecordInfo();//存储成交记录信息
pop_IC_card(); //下班弹卡
}
}
}
}
PriceVerInfo.GDP[0].PRC[0]=k;
PriceVerInfo.ValidFlag=2; //设置油价已生效的标志
Save_PriceVerInfo(); //保存油品油价信息
}
}
}
//存储下载的油品油价信息
Save_PriceInfo()
{
byte i,j;
byte xdata *px;
px=StartAddOfRFPC+11;
PriceVerInfo.Ver=*px++; //版本号
for (i=0;i<6;i++)
PriceVerInfo.V_DT[i]=*px++; //新油品油价生效时间
i=*px++; //总的记录数
if (i!=0)
{
PriceVerInfo.FieldNum=i;
OilNumber[0]=PriceVerInfo.GDP[0].O_TYPE[0];//保存上次的油品代码
OilNumber[1]=PriceVerInfo.GDP[0].O_TYPE[1];//保存上次的油品代码
PriceVerInfo.GDP[0].NZN=*px++;//枪号
PriceVerInfo.GDP[0].O_TYPE[0]=*px++;//油品代码的高字节
PriceVerInfo.GDP[0].O_TYPE[1]=*px++;//油品代码的低字节
PriceVerInfo.GDP[0].Den=HexToLong(px,4);//密度
px+=4;
j=*px++;
if (j>8)
j=8;
PriceVerInfo.GDP[0].PRC_N=j;//价格数目
for (i=0;i<j;i++)
{
Hex2.c[0]=*px++; //当前油品油价的高字节
Hex2.c[1]=*px++; //当前油品油价的低字节
PriceVerInfo.GDP[0].PRC[i]=Hex2.i;//当前油品油价
}
PriceVerInfo.NextGDP[0].NZN=*px++;//枪号
PriceVerInfo.NextGDP[0].O_TYPE[0]=*px++;//油品代码的高字节
PriceVerInfo.NextGDP[0].O_TYPE[1]=*px++;//油品代码的低字节
PriceVerInfo.NextGDP[0].Den=HexToLong(px,4);//密度
px+=4;
j=*px++;
if (j>8)
j=8;
PriceVerInfo.NextGDP[0].PRC_N=j;//价格数目
for (i=0;i<j;i++)
{
Hex2.c[0]=*px++; //新油品油价的高字节
Hex2.c[1]=*px++; //新油品油价的低字节
PriceVerInfo.NextGDP[0].PRC[i]=Hex2.i;//新油品油价
}
PriceVerInfo.ValidFlag=0; //油价还未生效
}
Save_PriceVerInfo(); //保存油品油价信息
DownLoadFlag=0; //清除正在下载白名单的标志
}
//根据枪号获得油品代码
//px-油品代码存储地址,NZN-枪号
Get_G_CODE(byte *px,byte NZN)
{
NZN=1;
*px++=PriceVerInfo.GDP[0].O_TYPE[0];//油品代码高字节
*px=PriceVerInfo.GDP[0].O_TYPE[1];//油品代码低字节
}
//根据枪号获得油品代码
//px-油品代码存储地址,NZN-枪号
Get_G_CODE1(byte *px,byte NZN,byte type)
{
byte code s[]={ //取油品油价时枪号错误!
0xC8,0xA1,0xD3,0xCD,0xC6,0xB7,0xD3,0xCD,0xBC,0xDB,0xCA,0xB1,
0xC7,0xB9,0xBA,0xC5,0xB4,0xED,0xCE,0xF3,0xA3,0xA1,0x00};
byte i,j;
i=PriceVerInfo.FieldNum;
for (j=0;j<i;j++)
{
if (NZN==PriceVerInfo.GDP[j].NZN) //break;//与油品油价中的枪号相同则退出
break;
}
if (j==i)
{ //枪号错误
Send_Error_Information(s);
}
else
{
if (type==6)
{
*px++=OilNumber[0];
*px=OilNumber[1];
OilNumber[0]=PriceVerInfo.GDP[0].O_TYPE[0];//保存上次的油品代码
OilNumber[1]=PriceVerInfo.GDP[0].O_TYPE[1];//保存上次的油品代码
}
else
{
*px++=PriceVerInfo.GDP[0].O_TYPE[0];//油品代码高字节
*px=PriceVerInfo.GDP[0].O_TYPE[1];//油品代码低字节
}
}
}
//检查是否已有油站通用信息及油品油价信息
byte Check_Info_Ver()
{
byte code s1[]={ //无油站通用信息!
0xCE,0xDE,0xD3,0xCD,0xD5,0xBE,0xCD,0xA8,0xD3,0xC3,0xD0,0xC5,0xCF,0xA2,0x21,0x00};
byte code s2[]={ //无油品油价信息!
0xCE,0xDE,0xD3,0xCD,0xC6,0xB7,0xD3,0xCD,0xBC,0xDB,0xD0,0xC5,0xCF,0xA2,0x21,0x00};
if (StationVerInfo.Ver==0)
{
Key_Display_TS1(s1);
return (0);
}
if (PriceVerInfo.Ver==0)
{
Key_Display_TS1(s2);
return (0);
}
return (1);
}
//保存油站通用信息
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -