📄 pc_comm.c
字号:
Save_StationVerInfo()
{
word i;
StationVerInfo.CRC=CRC_16((byte *)&StationVerInfo,LengthOfStationVerInfo-2);//油站信息的CRC校验和
i=StationFS; //要存储到的扇区号
i<<=8; //要存储到的地址
write_28sf040(i,LengthOfStationVerInfo,(byte *)&StationVerInfo);//向28SF040写入油站通用
Write_2402(AddressOfStationVerInfo,(byte *)&StationVerInfo,LengthOfStationVerInfo);//保存油站信息
}
//清除油站通用信息
Clear_StationVerInfo()
{
StationVerInfo.Ver=0; //版本号为0
StationVerInfo.POS_P=0xff; //初始通讯终端逻辑编号
Save_StationVerInfo(); //存储油站通用信息
Send_Error_Information("油站通用信息初始化!");
}
//获得油站通用信息
Load_StationVerInfo()
{
word i;
i=StationFS; //要读取的扇区号
i<<=8; //要读取的地址
read_28sf040(i,LengthOfStationVerInfo,(byte *)&StationVerInfo1);//从28SF040中读出油站通用信息
if (StationVerInfo1.CRC!=CRC_16((byte *)&StationVerInfo1,LengthOfStationVerInfo-2))
{ //28SF040中的油站通用信息不正确
Read_2402(AddressOfStationVerInfo,(byte *)&StationVerInfo1,LengthOfStationVerInfo);//从2402中读取油站通用信息
if (StationVerInfo1.CRC!=CRC_16((byte *)&StationVerInfo1,LengthOfStationVerInfo-2))
{ //2402中的油站通用信息也不正确
if (StationVerInfo.CRC==CRC_16((byte *)&StationVerInfo,LengthOfStationVerInfo-2))
{ //SRAM中信息正确
write_28sf040(i,LengthOfStationVerInfo,(byte *)&StationVerInfo);//向28SF040写入油站通用信息
Write_2402(AddressOfStationVerInfo,(byte *)&StationVerInfo,LengthOfStationVerInfo);//保存油站通用信息
}
else
Clear_StationVerInfo(); //没有油站通用信息,清除信息
}
else
write_28sf040(i,LengthOfStationVerInfo,(byte *)&StationVerInfo1);//向28SF040写入油站通用信息
}
read_28sf040(i,LengthOfStationVerInfo,(byte *)&StationVerInfo);//从28SF040中读出油站通用信息
}
//存储下载的油站通用信息
Save_StationInfo()
{
byte i,j;
byte xdata *px;
px=StartAddOfRFPC+11;
StationVerInfo.Ver=*px++; //版本号
StationVerInfo.Prov=*px++; //省代码
StationVerInfo.City=*px++; //地市代码
for (i=0;i<4;i++)
StationVerInfo.Superior[i]=*px++; //上级单位代码
for (i=0;i<4;i++)
StationVerInfo.S_ID[i]=*px++; //加油站ID
StationVerInfo.POS_P=*px++; //通讯终端逻辑编号
j=*px++; //枪数
StationVerInfo.GUN_N=j;
for (i=0;i<j;i++)
StationVerInfo.NZN[i]=*px++; //枪号
Save_StationVerInfo(); //保存油站通用信息
DownLoadFlag=0; //清除正在下载白名单的标志
}
//检测员工是否上班
//返回值为1 则员工已上班
byte Test_Employee_On_Duty()
{
if (TransactionRecord.EMP==0xff)
return (0); //无员工上班
return (1);
}
//下班操作前检查员工号是否一致
//一致则返回1
byte Check_Employee_Number()
{
if (TransactionRecord.EMP==IcCardData.EmployeeNumber[0])
{ //员工号一致
return (1);
}
else
{
Key_Display_TS("员工号不一致, 不能下班!");
return (0);
}
}
//员工上下班
//下班成功则返回1
byte Employee_On_Or_Off_Duty(byte *px)
{
byte i,j,k;
for (i=0,k=1;i<2;i++)
{
j=IcCardData.EmployeePassWord[i];
if ((j>>4)!=px[k]) break; //密码不同则退出
k++;
j&=0x0f;
if ((j&0x0f)!=px[k]) break;//密码不同则退出
k++;
}
if ((px[0]==4) && (k==5))
{ //输入的密码正确
if (TransactionRecord.EMP==0xff)
{ //上班
TransactionRecord.EMP=IcCardData.EmployeeNumber[0];//员工号
for (i=0;i<10;i++)
TransactionRecord.CardNumber[i]=IcCardData.CardNumber[i];//保存上班时的员工卡号
TransactionRecord.PassWord[0]=IcCardData.EmployeePassWord[0];//密码
TransactionRecord.PassWord[1]=IcCardData.EmployeePassWord[1];//密码
Save_TransactionRecordInfo();//存储成交记录信息
Save_TransactionRecord(5);//存储上班数据
}
else
{ //下班
Save_TransactionRecord(6);//存储下班数据
TransactionRecord.EMP=0xff;//无员工上班
Save_TransactionRecordInfo();//存储成交记录信息
pop_IC_card(); //下班弹卡
}
return (1);
}
return (0);
}
//检查脱机数据是否已存满
byte Test_Offline_Data()
{
if (TransactionRecord.NumberOfOfflineSave==NumberOfTransactionRecord)
return (1); //已存满
return (0);
}
//保存成交记录信息
Save_TransactionRecordInfo()
{
TransactionRecord.CRC=CRC_16((byte *)&TransactionRecord,LengthOfTransactionRecord-2);//成交记录信息的CRC校验和
Write_2402(AddressOfTransactionRecord1,(byte *)&TransactionRecord,LengthOfTransactionRecord);//保存成交记录信息
Write_2402(AddressOfTransactionRecord2,(byte *)&TransactionRecord,LengthOfTransactionRecord);//保存成交记录信息
}
//清除成交记录信息
Clear_TransactionRecordInfo(byte flag)
{
byte code s[]={ //成交数据已清除!
0xB3,0xC9,0xBD,0xBB,0xCA,0xFD,0xBE,0xDD,0xD2,0xD1,0xC7,0xE5,0xB3,0xFD,0x21,0x00};
if (flag==1)
{
Key_Display_TS1(s);
TransactionRecord.POS_TTC=0; //终端交易号初始化为0
TransactionRecord.SaveAddress=0; //交易数据存储位置为0
TransactionRecord.NumberOfOfflineSave=0;//脱机交易数据数量为0
TransactionRecord.NumberOfTotalSave=0;//总的交易数据数量为0
TransactionRecord.EMP=0xff; //员工号为0xff
TransactionRecord.NumberOfGrayRecord=0;//灰记录数量为0
}
if (flag==1)
{
Save_TransactionRecordInfo(); //存储成交记录信息
Send_Error_Information("成交记录信息初始化!");
}
}
//获得成交记录信息
Load_TransactionRecordInfo()
{
Read_2402(AddressOfTransactionRecord1,(byte *)&TransactionRecord1,LengthOfTransactionRecord);//从2402中读取成交记录信息
if ((TransactionRecord1.CRC!=CRC_16((byte *)&TransactionRecord1,LengthOfTransactionRecord-2))
|| (TransactionRecord1.NumberOfOfflineSave>NumberOfTransactionRecord)
|| (TransactionRecord1.NumberOfGrayRecord>NumberOfGrayDataRecord))
{ //2402中的成交记录信息不正确
Read_2402(AddressOfTransactionRecord2,(byte *)&TransactionRecord1,LengthOfTransactionRecord);//从2402中读取成交记录信息
if ((TransactionRecord1.CRC!=CRC_16((byte *)&TransactionRecord1,LengthOfTransactionRecord-2))
|| (TransactionRecord1.NumberOfOfflineSave>NumberOfTransactionRecord)
|| (TransactionRecord1.NumberOfGrayRecord>NumberOfGrayDataRecord))
{ //2402中的成交记录信息也不正确
if ((TransactionRecord.CRC==CRC_16((byte *)&TransactionRecord,LengthOfTransactionRecord-2))
&& (TransactionRecord.NumberOfOfflineSave<=NumberOfTransactionRecord)
&& (TransactionRecord.NumberOfGrayRecord<=NumberOfGrayDataRecord))
Save_TransactionRecordInfo(); //SRAM中信息正确
else
Clear_TransactionRecordInfo(1);//没有成交记录信息,清除信息
}
else
Write_2402(AddressOfTransactionRecord1,(byte *)&TransactionRecord,LengthOfTransactionRecord);//保存成交记录信息
}
Read_2402(AddressOfTransactionRecord1,(byte *)&TransactionRecord,LengthOfTransactionRecord);
}
//未成交的记录数减一
Dec_TransactionRecord()
{
Load_TransactionRecordInfo();
if (TransactionRecord.NumberOfOfflineSave!=0)
{
TransactionRecord.NumberOfOfflineSave--;//脱机交易数据数量减一
Save_TransactionRecordInfo(); //存储成交记录信息
}
}
//转换扣款来源
byte Convert_DS(byte i)
{
switch (i)
{
case 0x80:
i=0;
break;
case 0x81:
i=2;
break;
case 0x82:
i=3;
break;
case 0x83:
i=1;
}
return (i);
}
byte Re_Convert_DS(byte i)
{
switch (i)
{
case 0:
i=0x80;
break;
case 1:
i=0x83;
break;
case 2:
i=0x81;
break;
case 3:
i=0x82;
}
return (i);
}
//获得T_MAC
Get_T_MAC()
{
byte i;
TransactionData.T_MAC[0]=0x80;
for (i=1;i<5;i++)
TransactionData.T_MAC[i]=0;
for (i=0;i<6;i++)
TransactionData.INIT[i]=0;
TransactionData.CRC=0;
Clear_WatchDog();
if(account_des()==0) //计算T_MAC
EA=1;
ET0=1;
IcCardData.DisBuf[30]=0;
for (i=0;i<4;i++)
TransactionData.T_MAC[i]=IcCardData.T_MAC[i];
}
//计算非卡加油时的平均单价
word Get_Average_Price()
{
dword i,j;
i=DataOfSave.NoCardMoney; //非卡加油的金额
i*=100; //两位小数
j=DataOfSave.NoCardLitre; //非卡加油的油量
i+=j/2; //4舍5入
i/=j;
return (i);
}
//存储非卡成交数据
NoCard_Transaction()
{
byte i;
Read_Last_Transaction(); //读取最后一笔成交数据
for (i=0;i<4;i++)
Hex4.c[i]=TransactionData.V_TOT[i];
if (Hex4.i!=DataOfSave.TotalLitre)
Save_TransactionRecord(7); //还未上送非卡交易数据则存储
DataOfSave.NoCardMoney=0;
DataOfSave.NoCardLitre=0;
Save_Data();
}
//试图加油
Attempt_Refueling()
{
IcCardData.TAC[0]=0x10;
IcCardData.TAC[1]=5;
IcCardData.TAC[2]=0;
IcCardData.TAC[3]=0;
Save_TransactionRecord(9); //存储试图加油数据
pop_IC_card();
}
//加油结束后生成成交记录
Make_TransactionRecord(byte Type)
{
byte i,j;
j=Type&0x0f;
TransactionData.POS_TTC=TransactionRecord.POS_TTC;
TransactionData.T_TYPE=Type; //交易类型
if ((j>4) && (j<9))
{
Get_Clock(Buffer); //获得当前时间
for (i=0;i<7;i++)
TransactionData.TIME[i]=Buffer[i];//日期及时间
}
else
{
for (i=0;i<7;i++)
TransactionData.TIME[i]=IcCardData.CurrentTimer[i];//日期及时间
}
if ((j==7) || (j==8))
{
for (i=0;i<10;i++)
TransactionData.ASN[i]=0; //卡应用号填0
}
else
{
if (j==6)
{ //下班
for (i=0;i<10;i++)
TransactionData.ASN[i]=TransactionRecord.CardNumber[i];//卡应用号
}
else
{
for (i=0;i<10;i++)
TransactionData.ASN[i]=IcCardData.CardNumber[i];//卡应用号
}
}
if (j>6)
{
for (i=0;i<4;i++)
TransactionData.BAL[i]=0; //卡余额填0
}
else
{
if (j==6)
{ //下班
for (i=0;i<10;i++)
if (TransactionRecord.CardNumber[i]!=IcCardData.CardNumber[i])
break; //上班时的员工卡号与下班时不相同
if (i!=10)
{ //上班时的员工卡号与下班时不相同
for (i=0;i<4;i++)
TransactionData.BAL[i]=0; //卡余额填0
}
else
{ //卡号相同
for (i=0;i<4;i++)
TransactionData.BAL[i]=IcCardData.IcBackBlanceBuf[i];//卡余额
}
}
else
{
for (i=0;i<4;i++)
TransactionData.BAL[i]=IcCardData.IcBackBlanceBuf[i];//卡余额
}
}
if (j>4)
{
if (j==7)
LongToHex(DataOfSave.NoCardMoney,TransactionData.AMN,3);//非卡交易金额
else
{
for (i=0;i<3;i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -