📄 pc_comm.c
字号:
TransactionData.AMN[i]=0;
}
TransactionData.CTC[0]=0;
TransactionData.CTC[1]=0;
}
else
{
for (i=0;i<3;i++)
TransactionData.AMN[i]=IcCardData.BussinesMoney[i+1];//数额
TransactionData.CTC[0]=IcCardData.CTC[0];//卡交易序号高字节
TransactionData.CTC[1]=IcCardData.CTC[1];//卡交易序号低字节
}
if ((j>4) && (j!=9))
{
for (i=0;i<4;i++)
TransactionData.TAC[i]=0;
}
else
{
if (j==1)
{ //逃卡
for (i=0;i<4;i++)
TransactionData.TAC[i]=IcCardData.GTAC[i];//逃卡时为GTAC
}
else
{
for (i=0;i<4;i++)
TransactionData.TAC[i]=IcCardData.TAC[i];
}
}
if ((j==1) || (j==2))
{
for (i=0;i<4;i++)
TransactionData.GMAC[i]=IcCardData.GMAC[i];//解灰认证码
for (i=0;i<4;i++)
TransactionData.PSAM_TAC[i]=IcCardData.SAMTAC[i];//灰锁签名
}
else
{
for (i=0;i<4;i++)
TransactionData.GMAC[i]=0;
for (i=0;i<4;i++)
TransactionData.PSAM_TAC[i]=0;
}
if (j>4)
{
for (i=0;i<10;i++)
TransactionData.PSAM_ASN[i]=0;//PSAM应用号
for (i=0;i<6;i++)
TransactionData.PSAM_TID[i]=0;//PSAM编号
for (i=0;i<4;i++)
TransactionData.PSAM_TTC[i]=0;//PSAM-TTC
TransactionData.DS=0;//扣款来源
}
else
{
for (i=0;i<10;i++)
TransactionData.PSAM_ASN[i]=IcCardData.PsamCardNumber[i];//PSAM应用号
for (i=0;i<6;i++)
TransactionData.PSAM_TID[i]=IcCardData.PSAMTID[i];//PSAM编号
for (i=0;i<4;i++)
TransactionData.PSAM_TTC[i]=IcCardData.PsamTTC[i];//PSAM-TTC
TransactionData.DS=Convert_DS(IcCardData.DecMoneyType);//扣款来源
}
if (j>2)
{
TransactionData.UNIT=0;
TransactionData.C_TYPE=0;
}
else
{
if (Get_Card_Type()<0x10)
TransactionData.UNIT=TransactionData.DS;//用户卡结算方式
else
{
if (IcCardData.DsChangeFlag[1]>5)
IcCardData.DsChangeFlag[1]=0;
TransactionData.UNIT=IcCardData.DsChangeFlag[1]<<4;//员工卡结算方式
}
TransactionData.C_TYPE=0; //卡类
}
if (j>4)
TransactionData.VER=0;
else
{
i=IcCardData.PsamPasWodIndex<<4; //卡密钥索引号
i&=0xf0;
i|=IcCardData.IcCardPasWodVer&0x0f; //卡密钥版本号
TransactionData.VER=i; //版本
}
TransactionData.NZN=StationVerInfo.NZN[0];//枪号
if ((j<3) || ((j>4) && (j<8)))
{
Get_G_CODE1((byte *)&TransactionData.G_CODE,TransactionData.NZN,j);//获得油品代码
}
else
{
TransactionData.G_CODE[0]=0;
TransactionData.G_CODE[1]=0;
}
if (j<3)
{
LongToHex(Get_Current_Litre(),TransactionData.VOL,3);//加油数额
TransactionData.PRC[0]=DataOfNozzle.Price>>8;//成交价格高字节
TransactionData.PRC[1]=DataOfNozzle.Price;//成交价格低字节
}
else
{
if (j==7)
{
LongToHex(DataOfSave.NoCardLitre,TransactionData.VOL,3);//加油数额
Hex2.i=Get_Average_Price(); //计算出平均单价
TransactionData.PRC[0]=Hex2.c[0]; //成交价格高字节
TransactionData.PRC[1]=Hex2.c[1]; //成交价格低字节
}
else
{
for (i=0;i<3;i++)
TransactionData.VOL[i]=0;
TransactionData.PRC[0]=0;
TransactionData.PRC[1]=0;
}
}
if ((j==3) || (j==4) || (j>7))
{
for (i=0;i<4;i++)
TransactionData.V_TOT[i]=0;
}
else
{
if (j<3)
LongToHex(DataOfSave.TotalLitre+Get_Current_Litre(),TransactionData.V_TOT,4);//本次加油后的升总累计
else
LongToHex(DataOfSave.TotalLitre,TransactionData.V_TOT,4);//本次加油后的升总累计
}
if (j==8)
TransactionData.EMP=0;
else
TransactionData.EMP=TransactionRecord.EMP;//员工号
for (i=0;i<11;i++)
TransactionData.RFU[i]=0; //备用
Get_T_MAC(); //计算T_MAC
TransactionData.CRC=CRC_16((byte *)&TransactionData.POS_TTC,LengthOfTransactionData-2);
}
//向28SF040中写入交易数据(包括灰记录)
//type:0-交易数据、1-灰记录
//返回值为1 则写入成功
byte Save_TransactionData(byte type,word Num)
{
dword i;
switch (type)
{
case 0:
i=TransactionDataFS; //交易记录数据存储的首扇区号
break;
case 1:
i=GrayRecordDataFS; //灰记录数据存储的首扇区号
break;
default:
return (0);
}
i+=Num/2; //待写入的灰记录数据存储的扇区号
i<<=8; //要存储到的扇区的地址
if ((Num%2)==1)
i+=128; //每扇区存储2 条数据
for (;;)
{
Clear_WatchDog();
write_28sf040(i,LengthOfTransactionData,(byte *)&TransactionData.CRC);//向28SF040写入交易数据
read_28sf040(i,LengthOfTransactionData,(byte *)&TransactionData1.CRC);//从28SF040读出交易数据
if ((TransactionData1.CRC==TransactionData.CRC) &&
(TransactionData1.CRC==CRC_16((byte *)&TransactionData1.POS_TTC,LengthOfTransactionData-2)))
break;
}
return (1);
}
//从28SF040中读取交易数据(包括灰记录)
//type:0-交易数据、1-灰记录
//返回值为1 则读取的数据有效
byte Load_TransactionData(byte type,word Num)
{
dword i;
switch (type)
{
case 0:
i=TransactionDataFS; //交易记录数据存储的首扇区号
break;
case 1:
i=GrayRecordDataFS; //灰记录数据存储的首扇区号
break;
default:
return (0);
}
i+=Num/2; //待读取的灰记录数据存储的扇区号
i<<=8; //要读取的扇区地址
if ((Num%2)==1)
i+=128; //每扇区存储2 条数据
read_28sf040(i,LengthOfTransactionData,(byte *)&TransactionData.CRC);//从28SF040中读出交易数据
if (TransactionData.CRC==CRC_16((byte *)&TransactionData.POS_TTC,LengthOfTransactionData-2))
return (1); //读出的数据有效
// TransactionData.POS_TTC=0;
return (0); //无效
}
//解灰前查找匹配的灰记录
//返回值小于NumberOfGrayDataRecord 则为匹配的灰记录号
byte Find_GrayRecord()
{
byte i,j,k;
k=TransactionRecord.NumberOfGrayRecord;
if (k==0)
return (NumberOfGrayDataRecord);
for (i=0;i<k;i++)
{
Clear_WatchDog();
Load_TransactionData(1,i); //读取第i 条灰记录
for (j=0;j<10;j++)
if (TransactionData.ASN[j]!=IcCardData.CardNumber[j])
break; //卡应用号不同则退出
if (j!=10) continue;
for (j=0;j<4;j++)
if (TransactionData.BAL[j]!=IcCardData.IcBackBlanceBuf[j])
break; //余额不同则退出
if (j!=4) continue;
for (j=0;j<2;j++)
if (TransactionData.CTC[j]!=IcCardData.CTC[j])
break; //CTC不同则退出
if (j!=2) continue;
if (TransactionData.DS!=Convert_DS(IcCardData.DecMoneyType))
continue; //扣款来源不同则退出
for (j=0;j<7;j++)
if (TransactionData.TIME[j]!=IcCardData.CurrentTimer[j])
break; //日期和时间不同则退出
if (j==7) break;
}
if (i==k)
return (NumberOfGrayDataRecord);
return (i);
}
//解扣后查找匹配的灰记录
//返回值小于NumberOfGrayDataRecord 则为匹配的灰记录号
byte Find1_GrayRecord()
{
byte i,j;
for (i=0;i<NumberOfGrayDataRecord;i++)
{
Clear_WatchDog();
Load_TransactionData(1,i); //读取第i 条灰记录
for (j=0;j<10;j++)
if (TransactionData.ASN[j]!=GrayData.ASN[j])
break; //卡应用号不同则退出
if (j!=10) continue;
for (j=0;j<4;j++)
if (TransactionData.BAL[j]!=GrayData.BAL[j])
break; //余额不同则退出
if (j!=4) continue;
for (j=0;j<3;j++)
if (TransactionData.AMN[j]!=GrayData.AMN[j])
break; //交易额不同则退出
if (j!=3) continue;
for (j=0;j<2;j++)
if (TransactionData.CTC[j]!=GrayData.CTC[j])
break; //CTC不同则退出
if (j!=2) continue;
if (TransactionData.DS!=GrayData.DS)
continue; //扣款来源不同则退出
for (j=0;j<7;j++)
if (TransactionData.TIME[j]!=GrayData.TIME[j])
break; //日期和时间不同则退出
if (j!=7) continue;
for (j=0;j<4;j++)
if (TransactionData.GMAC[j]!=GrayData.GMAC[j])
break; //解灰认证码不同则退出
if (j!=4) continue;
for (j=0;j<6;j++)
if (TransactionData.PSAM_TID[j]!=GrayData.PSAM_TID[j])
break; //PSAM应用编号不同则退出
if (j!=6) continue;
for (j=0;j<4;j++)
if (TransactionData.PSAM_TTC[j]!=GrayData.PSAM_TTC[j])
break; //PSAM的TTC不同则退出
if (j==4) break;
}
return (i);
}
//查找最早的一条灰记录
//返回值为该条灰记录的位置
byte Find_First_GrayRecord()
{
byte i,j,k;
k=0;
Load_TransactionData(1,0); //读取第一条灰记录
for (j=0;j<7;j++)
Buffer[j]=TransactionData.TIME[j];
for (i=1;i<NumberOfGrayDataRecord;i++)
{
Load_TransactionData(1,i); //读取下面的灰记录
for (j=0;j<7;j++)
{
if (Buffer[j]>TransactionData.TIME[j])
{
k=i; //当前灰记录为最早的
for (j=0;j<7;j++)
Buffer[j]=TransactionData.TIME[j];
break;
}
if (Buffer[j]<TransactionData.TIME[j])
break; //当前灰记录为较新的
}
}
return (k); //返回最早的灰记录的位置
}
//存储成交记录
Save_TransactionRecord(byte Type)
{
byte i;
Load_TransactionRecordInfo(); //读取成交记录信息
Clear_WatchDog();
if (TransactionRecord.NumberOfOfflineSave<NumberOfTransactionRecord)
{ //脱机数据没有2000笔
TransactionRecord.POS_TTC++; //终端交易号加一
if (Type==9)
Type|=0x80; //卡错
if ((Type<5) && (IcCardData.TACReadSuccessFlag==1))
Type|=0x10; //扣款签名有效
if ((Type!=7) && (Type!=8) && (TypeOfCheckBW==1))
Type|=0x40; //使用油机内黑/白名单
Clear_WatchDog();
Make_TransactionRecord(Type); //产生成交数据
Save_TransactionData(0,TransactionRecord.SaveAddress);//存储交易数据
Clear_WatchDog();
if ((Type&0x0f)==1)
{ //加油中逃卡
if (TransactionRecord.NumberOfGrayRecord<NumberOfGrayDataRecord)
{
Save_TransactionData(1,TransactionRecord.NumberOfGrayRecord);//存储灰记录数据
TransactionRecord.NumberOfGrayRecord++;//灰记录数量增加1
}
else
{ //灰记录已经有NumberOfGrayDataRecord笔,则替换掉最早的一笔
i=Find_First_GrayRecord(); //获得最早的灰记录的位置
Load_TransactionData(0,TransactionRecord.SaveAddress);//读取最后一笔成交数据
Save_TransactionData(1,i); //存储灰记录数据
}
}
else if ((Type&0x0f)==3)
{ //补扣
if (TransactionRecord.NumberOfGrayRecord!=0)
{ //有灰记录
i=Find1_GrayRecord(); //查找匹配的灰记录
if (i!=NumberOfGrayDataRecord)
{ //i 就是匹配的灰记录号
TransactionRecord.NumberOfGrayRecord--;//灰记录数量减一
if (TransactionRecord.NumberOfGrayRecord!=i)
{
Load_TransactionData(1,TransactionRecord.NumberOfGrayRecord);//读取最后一条灰记录
Save_TransactionData(1,i); //存储到刚刚删除的灰记录处
}
}
}
}
TransactionRecord.SaveAddress++; //交易数据存储位置加一
if (TransactionRecord.SaveAddress>=NumberOfTransactionRecord)
Transac
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -