?? mifare.c
字號(hào):
{
return ERR_POS_NOTBLCARD;
}
}
else
return ERR_POS_ERRORPARM;
// guDate.l_word = RTC_read_date();
// guTime.l_word = RTC_read_time();
// sprintf(gcASCDateTime, "%04d%02d%02d%02d%02d%02d", guDate.fields.year, guDate.fields.month, guDate.fields.day, guTime.fields.hour, guTime.fields.minute, guTime.fields.second);
getBCDDateTime(gcASCDateTime);
memcpy(gcNowTime, ASC2BCD(gcASCDateTime,14), 7);
for(i=0;i<3;i++)
gcHexNowTime[i] = (gcNowTime[i] >> 4) * 10 + (gcNowTime[i] & 0x0f);
i = CompareDate(gcNowTime, (unsigned char*)gstWorkCardInfomation.cLimitDate);
if (i == 2)
return ERR_POS_OUTOFLIMIT;
gcSector = gstWorkCardInfomation.stCardStruct.cPublicSector;
gcBlock = gcSector*4;
if(!AuthenCard(&lSerialNo, gcSector, MIF_READ)) return ERR_MIF_AUTEN;
for(k=0;k<3;k++)
if(CardMFCRead16Bytes(gcBlock, gcMifBuffer)==MI_OK) break;
if(k==3) return ERR_MIF_READ;
gcMifBuffer[6] = cNewCardFlag;
gcMifBuffer[15] = 0;
for(i=0;i<15;i++)
gcMifBuffer[15]^=gcMifBuffer[i];
for(k=0;k<3;k++)
if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)==MI_OK) break;
if(k==3) return ERR_MIF_WRITE;
for(i=0;i<16;i++)
gcMifBuffer[i]= 0xff - gcMifBuffer[i];
for(k=0;k<3;k++)
if(CardMFCWrite16Bytes(gcBlock+1, gcMifBuffer)==MI_OK) break;
if(k==3) return ERR_MIF_WRITE;
gstWorkCardInfomation.cBlackListFlag = cNewCardFlag;
gstWorkCardInfomation.cGetInfoFinished &= MASK_SECTOR_PUBLIC;
// GetCardInformation(lSerialNo, SECTOR_PUBLIC);
}
else
return ERR_POS_NOCARD;
}
return ST_OK;
}
//充值交易
//
//
unsigned char ChargeMoneyOrTimes(unsigned char Cmd, unsigned long lSerialNo, unsigned long lChargeMoney, unsigned char *cDate)
{
unsigned char i, j, k, tmpbuff[200];
unsigned long llSerialNo;
delay_n_ms(20);
// clr_scr();
// Dispbcd(0,0, &lSerialNo, 4);
// DispLong(0,2, lChargeMoney);
if(gcAuthenMode !=2) return ERR_POS_DEVICENOTAUTH;
glChargeMoney = lChargeMoney;
switch(Cmd)
{
case CMD_CHARGE_MONEY:
gcChargeMode = MODE_CHARGE_MONEY;
gcChargeMode2 = PICC_INCREMENT;
gcChargeType = CHARGETYPE_INCMONEY;
break;
case CMD_CHARGE_SMONEY:
gcChargeMode = MODE_CHARGE_TIMES;
gcChargeMode2 = PICC_INCREMENT;
gcChargeType = CHARGETYPE_INCTIMES;
memcpy(gcChargeTimesDate, cDate, 3);
break;
case CMD_CHARGE_MONEYN:
gcChargeMode = MODE_CHARGE_MONEY;
gcChargeMode2 = PICC_DECREMENT;
gcChargeType = CHARGETYPE_DECMONEY;
break;
case CMD_CHARGE_SMONEYN:
gcChargeMode = MODE_CHARGE_TIMES;
gcChargeMode2 = PICC_DECREMENT;
gcChargeType = CHARGETYPE_DECTIMES;
memcpy(gcChargeTimesDate, cDate, 3);
break;
case CMD_PURCHASE_MONEY:
gcChargeMode = MODE_PURCHASE_MONEY;
gcChargeMode2 = PICC_DECREMENT;
gcChargeType = CHARGETYPE_PURMONEY;
break;
case CMD_PURCHASE_TIMES:
gcChargeMode = MODE_PURCHASE_TIMES;
gcChargeMode2 = PICC_DECREMENT;
gcChargeType = CHARGETYPE_PURTIMES;
memcpy(gcChargeTimesDate, cDate, 3);
break;
}
SPT_set(2);
for(i = 3;i;)
{
if (!SPT_read())
{
SPT_set(2);
i --;
}
if(CardTypeARequest(PICC_REQIDL,gcATQ) == MI_OK)
break;
}
if(i!=0)
{
CardTypeAAnticollLevel1((unsigned char*)&llSerialNo);
CardTypeASelectLevel1((unsigned char*)&llSerialNo, gcATS);
if (lSerialNo != llSerialNo)
return ERR_POS_NOTSAMECARD;
if ((lSerialNo != gstWorkCardKey.lSerialNo)||(gcGetKeyFinished != 4))
{
GetCardKey(lSerialNo);
}
if (gstWorkCardInfomation.cGetInfoFinished != SECTOR_ALL)
if (GetCardInformation(lSerialNo, SECTOR_ALL)!=1)
return ERR_POS_GETCARDINFO;
// gstWorkCardInfomation.cGetInfoFinished = 0;
if(gstWorkCardInfomation.cCardType > 0x1f)
return ERR_POS_NOTCUMSCARD;
if(gstWorkCardInfomation.cBlackListFlag == 0x04)
return ERR_POS_BLCARD;
//for debug
// if(gstWorkCardInfomation.cUsageFlag != 2)
// return ERR_POS_CARDNOTSTART;
//for debug
memcpy(tmpbuff, gstWorkCardInfomation.cCityCode, 2);
memcpy(tmpbuff+2, gstWorkCardInfomation.cTradeCode, 2);
memcpy(tmpbuff+4, &gstWorkCardInfomation.lCardNo, 4);
if(findBlackList(tmpbuff)==ST_OK)
{
i = SetBlackListFlag(lSerialNo, 0x04);
if(i==ST_OK)
return ERR_POS_BLCARD;
else
return i;
}
guDate.l_word = RTC_read_date();
guTime.l_word = RTC_read_time();
sprintf(gcASCDateTime, "%04d%02d%02d%02d%02d%02d", guDate.fields.year, guDate.fields.month, guDate.fields.day, guTime.fields.hour, guTime.fields.minute, guTime.fields.second);
// getBCDDateTime(gcASCDateTime);
memcpy(gcNowTime, ASC2BCD(gcASCDateTime,14), 7);
for(i=0;i<3;i++)
gcHexNowTime[i] = (gcNowTime[i] >> 4) * 10 + (gcNowTime[i] & 0x0f);
/* clr_scr();
Dispbcd(0,0, gcASCDateTime, 14);
Dispbcd(0,4, gcNowTime, 7);
Dispbcd(0,6, gstWorkCardInfomation.cLimitDate, 4);
*/
if(gstWorkCardInfomation.cChargeStep==0x01) return ERR_POS_ERRORCARD;
i = CompareDate(gcNowTime, (unsigned char*)gstWorkCardInfomation.cLimitDate);
if (i == 2)
return ERR_POS_OUTOFLIMIT;
if(gcChargeMode2 == PICC_DECREMENT)
{
if((gcChargeType != CHARGETYPE_PURMONEY)&&(gcChargeType != CHARGETYPE_PURTIMES))
{
if(((gcChargeType == CHARGETYPE_DECMONEY)&&(gstWorkCardInfomation.cHistoryChargeType == CHARGETYPE_INCMONEY))||((gcChargeType == CHARGETYPE_DECTIMES)&&(gstWorkCardInfomation.cHistoryChargeType == CHARGETYPE_INCTIMES)))
{
if ((gstWorkCardInfomation.lHistoryChargeMoney != glChargeMoney)||(memcmp(gstWorkCardInfomation.cHistoryPSAMNo, gcPSAMNo, 4) != 0))
return ERR_CHG_CANNOTCHARGEN;
}
else
return ERR_CHG_CANNOTCHARGEN;
}
else
{
if((gcChargeMode == MODE_PURCHASE_MONEY)||(gcChargeMode == MODE_CHARGE_MONEY))
{
if(gstWorkCardInfomation.lMoney<glChargeMoney)
return ERR_POS_NOTENOUGHMONEY;
}
}
}
if (!WriteChargeStep(1)) return ERR_POS_WRITECHRSTEP;
if((gcChargeMode == MODE_PURCHASE_MONEY)||(gcChargeMode == MODE_CHARGE_MONEY))
{
gcSector = gstWorkCardInfomation.stCardStruct.cMoneySector;
gcBlock = gcSector * 4;
if(!ModifyMoney(gcChargeMode2, gcBlock + gcMoneyMarsterBlock + 1, glChargeMoney)) return ERR_POS_MODIFYMONEY;
if(!IsValidMoney(gcSector, gcBlock + 2 - gcMoneyMarsterBlock)) return ERR_POS_MODIFYMONEY;
if(gcChargeMode == MODE_CHARGE_MONEY)
{
if(CardMFCRead16Bytes(gcBlock, gcMifBuffer)!=MI_OK) return ERR_MIF_READ;
if (gcChargeMode2 == PICC_INCREMENT)
{
gstWorkCardInfomation.lMoneySum += glChargeMoney;
gstWorkCardInfomation.lCurMoney = gstWorkCardInfomation.lMoney + glChargeMoney;
}
else
{
gstWorkCardInfomation.lMoneySum -= glChargeMoney;
gstWorkCardInfomation.lCurMoney = gstWorkCardInfomation.lMoney - glChargeMoney;
}
// memcpy(gcMifBuffer, &gstWorkCardInfomation.lMoneySum, 4);
OverTurnString(gcMifBuffer, &gstWorkCardInfomation.lMoneySum, 4);
// memcpy(gcMifBuffer+4, &gstWorkCardInfomation.lCurMoney, 4);
OverTurnString(gcMifBuffer+4, &gstWorkCardInfomation.lCurMoney, 4);
memcpy(gcMifBuffer+8, gcPSAMNo, 4);
memset(gcMifBuffer+12, 0, 4);
for(i=0;i<15;i++)
gcMifBuffer[15] ^= gcMifBuffer[i];
for(k=0;k<3;k++)
if(CardMFCWrite16Bytes(gcBlock, gcMifBuffer)==MI_OK) break;
if(k==3) return ERR_MIF_WRITE;
}
if(!ModifyPoint()) return ERR_POS_WRITECHRPOINT;
if(!WriteChargeStep(0x02)) return ERR_POS_WRITECHRSTEP;
CopyBlock(gcSector, gcBlock, gcBlock+1, 1);
gcSector = gstWorkCardInfomation.stCardStruct.cMoneySector;
gcBlock = gcSector * 4;
AuthenCard(&lSerialNo, gcSector, MIF_READ);
if(!ModifyMoney(gcChargeMode2, gcBlock + 2 - gcMoneyMarsterBlock, 0)) return ERR_POS_MODIFYMONEY;
if(!IsValidMoney(gcSector, gcBlock + gcMoneyMarsterBlock + 1)) return ERR_POS_MODIFYMONEY;
}
if(BuildRecord()!=ST_OK) return ERR_POS_BUILDRECORD;
if((gcChargeMode == MODE_CHARGE_MONEY)||(gcChargeMode == MODE_PURCHASE_MONEY))
{
gstWorkCardInfomation.cGetInfoFinished &= (MASK_SECTOR_MONEY&MASK_SECTOR_HISTORY&MASK_SECTOR_PUBLIC);
// GetCardInformation(lSerialNo, SECTOR_MONEY|SECTOR_HISTORY|SECTOR_PUBLIC);
}
}
else
return ERR_POS_NOCARD;
return ST_OK;
}
//卡片恢復(fù)
unsigned char CardRestore(unsigned char cMode)
{
unsigned char cFlag1, cFlag2, i, k, cMarsterBlock, cOperMode;
unsigned long lMoney1, lMoney2;
for (k=0;k<2;k++)
{
if (k==0)
{
gcSector = gstWorkCardInfomation.stCardStruct.cMoneySector;
cMarsterBlock = gcMoneyMarsterBlock;
if ((gstWorkCardInfomation.cHistoryChargeType == CHARGETYPE_PURMONEY)||(gstWorkCardInfomation.cHistoryChargeType == CHARGETYPE_DECMONEY)||(gstWorkCardInfomation.cHistoryChargeType == CHARGETYPE_INCMONEY))
cOperMode = cMode;
else
cOperMode = 'B';
}
else
{
if(gstWorkCardInfomation.stCardStruct.cEveTimesSector!=0xff)
{
gcSector = gstWorkCardInfomation.stCardStruct.cEveTimesSector;
cMarsterBlock = gcTimesMarsterBlock;
if ((gstWorkCardInfomation.cHistoryChargeType == CHARGETYPE_PURTIMES)||(gstWorkCardInfomation.cHistoryChargeType == CHARGETYPE_DECTIMES)||(gstWorkCardInfomation.cHistoryChargeType == CHARGETYPE_INCTIMES))
cOperMode = cMode;
else
cOperMode = 'B';
}
else
break;
}
gcBlock = gcSector * 4;
switch(cOperMode)
{
case 'A':
// clr_scr();
// move_cursor(0,0);
// puts("Step A");
// getch();
if(!AuthenCard(&glSerialNo,gcSector,MIF_READ)) return 0;
switch(CompareBlock(gcSector, gcBlock+2-cMarsterBlock, gcBlock+cMarsterBlock+1, 0))
{
case 0:
return 0;
case 1:
cFlag2 = IsValidMoney(gcSector, gcBlock+2-cMarsterBlock);
if (!cFlag2) return 2;
if(!CopyBlock(gcSector, gcBlock+2-cMarsterBlock, gcBlock+cMarsterBlock+1, 0)) return 0;
default:
break;
}
gcSector = gstWorkCardInfomation.stCardStruct.cPublicSector;
gcBlock = gcSector * 4;
if(!AuthenCard(&glSerialNo,gcSector,MIF_READ)) return 0;
if(!CopyBlock(gcSector, gcBlock+1, gcBlock, 1)) return 0;
break;
case 'B':
// clr_scr();
// move_cursor(0,0);
// puts("Step B");
// getch();
if(!AuthenCard(&glSerialNo,gcSector,MIF_READ)) return 0;
cFlag1 = IsValidMoney(gcSector, gcBlock+cMarsterBlock+1);
if (!cFlag1) return 2;
switch(CompareBlock(gcSector, gcBlock+cMarsterBlock+1, gcBlock+2-cMarsterBlock, 0))
{
case 0:
return 0;
case 1:
if(!CopyBlock(gcSector, gcBlock+cMarsterBlock+1, gcBlock+2-cMarsterBlock, 0)) return 0;
default:
break;
}
gcSector = gstWorkCardInfomation.stCardStruct.cPublicSector;
gcBlock = gcSector * 4;
if(!AuthenCard(&glSerialNo,gcSector,MIF_READ)) return 0;
if(!CopyBlock(gcSector, gcBlock, gcBlock+1, 1)) return 0;
break;
case 'C':
// clr_scr();
// move_cursor(0,0);
// puts("Step C");
// getch();
if(!AuthenCard(&glSerialNo,gcSector,MIF_READ)) return 0;
cFlag1 = IsValidMoney(gcSector, gcBlock+cMarsterBlock+1);
cFlag2 = IsValidMoney(gcSector, gcBlock+2-cMarsterBlock);
if ((cFlag1)&&(cFlag2))
{
i = CompareBlock(gcSector, gcBlock+cMarsterBlock+1, gcBlock+2-cMarsterBlock, 0);
if (i==0)
return 0;
else if (i == 1)
goto StepD;
if(!CopyBlock(gcSector, gcBlock+2-cMarsterBlock, gcBlock+cMarsterBlock+1, 0)) return 0;
gcSector = gstWorkCardInfomation.stCardStruct.cPublicSector;
gcBlock = gcSector * 4;
if(!AuthenCard(&glSerialNo,gcSector,MIF_READ)) return 0;
if(!CopyBlock(gcSector, gcBlock+1, gcBlock, 1)) return 0;
}
else if((cFlag1)&&(!cFlag2))
{
CopyBlock(gcSector, gcBlock+cMarsterBlock+1, gcBlock+2-cMarsterBlock, 0);
}
else if((!cFlag1)&&(cFlag2))
{
CopyBlock(gcSector, gcBlock+2-cMarsterBlock, gcBlock+cMarsterBlock+1, 0);
}
else
{
return 2;
}
break;
case 'D':
StepD:
// clr_scr();
// move_cursor(0,0);
// puts("Step D");
// getch();
if(!AuthenCard(&glSerialNo, gcSector,MIF_READ)) return 0;
if(CardMFCRead16Bytes(gcBlock+cMarsterBlock+1,gcMifBuffer)!=MI_OK) return 0;
// memcpy(&lMoney2, gcMifBuffer, 4);
OverTurnString(&lMoney2, gcMifBuffer, 4);
if ((gstWorkCardInfomation.cHistoryChargeType== CHARGETYPE_INCMONEY)||(gstWorkCardInfomation.cHistoryChargeType== CHARGETYPE_INCTIMES))
{
lMoney1 -= gstWorkCardInfomation.lHistoryChargeMoney;
}
else if ((gstWorkCardInfomation.cHistoryChargeType== CHARGETYPE_DECMONEY)||(gstWorkCardInfomation.cHistoryChargeType== CHARGETYPE_DECTIMES)||(gstWorkCardInfomation.cHistoryChargeType== CHARGETYPE_PURMONEY)||(gstWorkCardInfomation.cHistoryChargeType== CHARGETYPE_PURTIMES))
{
lMoney1 += gstWorkCardInfomation.lHistoryChargeMoney;
}
if(CardMFCRead16Bytes(gcBlock+2-cMarsterBlock, gcMifBuffer)!=MI_OK) return 0;
// memcpy(&lMoney2, gcMifBuffer, 4);
OverTurnString(&lMoney2, gcMifBuffer, 4);
if(lMoney1 == lMoney2)
{
if (gstWorkCardInfomation.iMoneyTotleTimes>0)
gstWorkCardInfomation.iMoneyTotleTimes --;
else
gstWorkCardInfomation.iMoneyTotleTimes = 0xffff;
gcSector = gstWorkCardInfomation.stCardStruct.cPublicSector;
gcBlock = gcSector * 4;
if(!AuthenCard(&glSerialNo,gcSector,MIF_READ)) return 0;
if(CardMFCRead16Bytes(gcBlock,gcMifBuffer)!=MI_OK) return 0;
gcMifBuffer[0] = gstWorkCardInfomation.cHisCharge2;
// memcpy(gcMifBuffer+1, &gstWorkCardInfomation.iMoneyTotleTimes, 2);
OverTurnString(gcMifBuffer+1, &gstWorkCardInfomation.iMoneyTotleTimes, 2);
// memcpy(gcMifBuffer+4, &gstWorkCardInfomation.iTimesTotleTimes, 2);
OverTurnString(gcMifBuffer+4, &gstWorkCardInfomation.iTimesTotleTimes, 2);
if(CardMFCWrite16Bytes(gcBlock,gcMifBuffer)!=MI_OK) return 0;
if ((gstWorkCardInfomation.cHistoryChargeType == CHARGETYPE_PURMONEY)||(gstWorkCardInfomation.cHistoryChargeType == CHARGETYPE_DECMONEY)||(gstWorkCardInfomation.cHistoryChargeType == CHARGETYPE_INCMONEY))
{
gcSector = gstWorkCardInfomation.stCardStruct.cMoneySector;
cMarsterBlock = gcMoneyMarsterBlock;
}
else if ((gstWorkCardInfomation.cHistoryChargeType == CHARGETYPE_PURTIMES)||(gstWorkCardInfomation.cHistoryChargeType == CHARGETYPE_DECTIMES)||(gstWorkCardInfomation.cHistoryChargeType == CHARGETYPE_INCTIMES))
{
gcSector = gstWorkCardInfomation.stCardStruct.cEveTimesSector;
cMarsterBlock = gcTimesMarsterBlock;
}
else
return 1;
gcBlock = gcSector * 4;
if(!AuthenCard(&glSerialNo,gcSector,MIF_READ)) return 0;
if(!CopyBlock(gcSector, gcBlock+2-cMarsterBlock, gcBlock+cMarsterBlock+1, 0)) return 0;
}
else
return 2;
break;
}
gstWorkCardInfomation.cGetInfoFinished &= (MASK_SECTOR_PUBLIC&MASK_SECTOR_MONEY&MASK_SECTOR_HISTORY);
}
return 1;
}
//寫售卡標(biāo)志
unsigned char WriteSaleCardFlag(unsigned char Mode, unsigned char CardType)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -