?? card.c
字號(hào):
#include "my_head.H"
#include "RfModuleFunc.H"
#include "DataFlash.H"
//#define _DEBUG
#ifdef _DEBUG
#include "Debug.h"
#endif
#define YES 1
#define NO 0
#define COMPANY_INFO_SECTOR 2 //公司信息
#define CARDHOLDER_INFO_SECTOR 3 //持卡人信息
#define PUBLIC_MONEY_SECTOR 4 //公共錢包
#define BUSINESS_INFO_SECTOR 5 //交易信息
#define TIME_COUNT_SECTOR 6 //計(jì)時(shí)信息
#define ORDER_DINNER_SECTOR 7 //訂餐信息
#define BUSINESS_LIMIT_INFO_SECTOR 8 //交易特別限制信息
#define SYSTEMCARD_SECTOR 0
#define SEEDCARD_SECTOR 1
#define MAKER_CODE_SECT 0
#define SYSTEM_SECT_1 1
#define SYSTEM_SECT_2 2
#define YSN_SYSPWD_SECT 3
#define SEED_CARD_SECT 4 //UNIT_INFO_SECT
#define OPUSER_CARD_SECT 5 //管理員或操作員
//UNIT(SEED) INFO
#define CARD_LEVEL_DDR 0
#define UNIT_CODE_ADDR 1 //1-3
#define UNIT_PWD_ADDR 4 //4-6
#define PUBLIC_SECTOR_ADDR 7
#define FUC_TYPE_ADDR 8 //子功能類型
#define FUC_SECTOR_ADDR 9 //子功能占用扇區(qū)
#define SEED_DATE_ADDR 10 //10-12
#define SEEDUSECOUNTS_ADDR 13 //13-14
//===============================================
//卡級(jí)別定義
#define CONUSER_CARD 3 //- 普通用戶卡,
#define MANAGE_CARD 6 //- 維護(hù)管理卡,
#define SEED_CARD 7 //- 系統(tǒng)子卡,
#define SYSTEM_CARD 8 //- 系統(tǒng)母卡,
#define EMPTYUSER_CARD 0x3f //- 單位白卡
unsigned char code Nkey_a[6] = {'Y', 's','n', 'O', 'y', 's'};
unsigned char code Nkey_b[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
sttCardholderInfo xdata stCardholderInfo; //持卡人信息
sttBusinessInfo xdata stBusinessInfo; //交易信息
unsigned char xdata CardSerialNo[4]; //作為最后一次操作的卡系列號(hào)存貯用(必須全局)
unsigned char xdata CardOperateStep; //卡操作步驟標(biāo)志(必須全局)
unsigned char xdata gcDateTime[7]; //全局時(shí)鐘
extern void ReadClock(unsigned char ClockData[]);
extern sttOtherTableInfo xdata stOtherTableInfo;
extern Equip_Addr pdata equip_addr;
//====================================================
void Count_Sector_PWD(unsigned char pbuf[],
unsigned char card_snr[4],
unsigned char sector)
{
memcpy(pbuf,Nkey_a,6);
pbuf[0] *= card_snr[0]+sector*1;
pbuf[1] *= card_snr[1]+sector*2;
pbuf[2] *= card_snr[2]+sector*3;
pbuf[3] *= card_snr[3]+sector*4;
pbuf[4] *= pbuf[0]+sector*5;
pbuf[5] *= pbuf[1]+sector*6;
}
//讀系統(tǒng)卡
BYTE GetSEEDCardTest(SeedCard_Info *card)
{
BYTE idata tt[2];
BYTE idata card_snr[4];
BYTE idata bankdata[16];
BYTE size,err;
int i=0;
//Init_Rfic();
mifs_reset(20);
for(i=45;--i;)
{
if(!mifs_request(ALL_CARD,tt))break;
}
if(!i)return(CARD_NO_FINED);
for(i=45;--i;)
{
if((mifs_request(IDLE_CARD,tt))!=MI_OK)continue;
if((mifs_anticoll(0,card_snr))!=MI_OK)continue;
if((mifs_select(card_snr,&size))!=MI_OK)continue;
break;
}
if(!i)return(CARD_ERR_CODE);//return(40+err);
Count_Sector_PWD(bankdata,card_snr,SEEDCARD_SECTOR);
err=mifs_load_key(KEYA,SEEDCARD_SECTOR,bankdata);
//err=mifs_load_key(KEYA,SEEDCARD_SECTOR,Nkey_b);
if(err!=MI_OK)return(50+err);
for(i=15;--i;)
{
if((mifs_authentication(KEYA,SEEDCARD_SECTOR))!=MI_OK)continue;
//if((mifs_authKey(KEYA,SEEDCARD_SECTOR,Nkey_b))!=MI_OK)continue;
if((mifs_read(SEED_CARD_SECT,bankdata))!=MI_OK)continue;
break;
}
if(!i)return(CARD_ERR_CODE);//return(40+err);
//do_buzzer(1);
mifs_halt();
//mifs_close();
if(bankdata[CARD_LEVEL_DDR] != SEED_CARD)
{
return(CARD_NO_SEED);
}
memcpy(card->unit_code,&bankdata[UNIT_CODE_ADDR],3);
memcpy(card->unit_password,&bankdata[UNIT_PWD_ADDR],3);
card->fuc_type=bankdata[FUC_TYPE_ADDR];
card->fuc_sector=bankdata[FUC_SECTOR_ADDR];
card->public_sector=bankdata[PUBLIC_SECTOR_ADDR];
memcpy(card->date,&bankdata[SEED_DATE_ADDR],3); //6
return(SUCCESS);
}
unsigned char Check_Card_Event(unsigned char cardmode)
{
unsigned char idata tt[2];
if(cardmode)
{
if(mifs_request(ALL_CARD,tt))return(1);
}
else
{
if(mifs_request(IDLE_CARD,tt))return(1);
}
Stop_Timer(DIS_CLOCKEVENT_Tevent);//must!
Stop_Timer(WAIT_CARD_Tevent);
PostMessage(FIND_CARD_EVENT,0);
return(0);
}
//===============================
char RfModule_Init()
{
unsigned char i,rst;
sttCardStruct xdata stCardStruct;
Rf_Init();
memset(&stCardStruct,0xFF,16);
stCardStruct.cCompanyInfoSector = COMPANY_INFO_SECTOR;
stCardStruct.cCardholderInfoSector = CARDHOLDER_INFO_SECTOR;
stCardStruct.cPublicMoneySector = PUBLIC_MONEY_SECTOR;
stCardStruct.cBusinessInfoSector = BUSINESS_INFO_SECTOR;
stCardStruct.cTimeCounterSector = TIME_COUNT_SECTOR;
stCardStruct.cOrderDinnerSector = ORDER_DINNER_SECTOR;
stCardStruct.cBusinessLimitInfoSector = BUSINESS_LIMIT_INFO_SECTOR;
i=10;
while(i--)
{
if((rst=SetCardApplicationSector(&stCardStruct))== MI_OK)
break;
#ifdef _DEBUG
DebugString("Set Card Application Sector Value Result:");
DebugData(1,1,&rst);
#endif
}
return rst;
}
//充值操作
char FillMoneyOrTime()
{
unsigned char result;
unsigned long idata lSerialNo;
unsigned char xdata Buffer[18];
unsigned int iOffSet;
sttFillPara xdata stFillPara; //充值信息表數(shù)據(jù)
sttFillLimitInfo xdata stFillLimitInfo;//充值限制信息
//讀取充值時(shí)間限制表
result = ReadFillLimitInfo(&stFillLimitInfo);
if(result != SUCCESS) return result;
#ifdef _DEBUG
DebugString("Read Fill Limit Info OK, the Data:");
DebugData(12,12,(unsigned char *)&stFillLimitInfo);
#endif
//讀系統(tǒng)時(shí)鐘
ReadClock(gcDateTime);
#ifdef _DEBUG
DebugString("Read Clock OK, the Data:");
DebugData(7,7,gcDateTime);
#endif
if(memcmp(stFillLimitInfo.cStartTime,gcDateTime,6) > 0)
return NO_IN_CONSUMETIME; //未到充值時(shí)間
if(memcmp(stFillLimitInfo.cEndTime,gcDateTime,6) < 0)
return NO_IN_CONSUMETIME; //已過充值時(shí)間
#ifdef _DEBUG
DebugString("\r\n\r\nBegin Order Dinner Operate \r\n");
#endif
//檢查是否有卡
result=mifs_anticoll(0,Buffer);
if(result != MI_OK) return FAILURE;
#ifdef _DEBUG
DebugString("Anticoll OK\r\n");
#endif
result=mifs_select(Buffer,&Buffer[4]);
if(result != MI_OK) return FAILURE;
#ifdef _DEBUG
DebugString("Select OK\r\n");
#endif
//判斷是否為最后操作的那張卡
if(memcmp(CardSerialNo,Buffer,4)!=0) //若不是同一張卡
{
CardOperateStep = 0; //清卡操作步驟,即另一張卡需重頭開始
memcpy(CardSerialNo,Buffer,4); //保存當(dāng)前卡系列號(hào)
#ifdef _DEBUG
DebugString("A New Card In\r\n");
#endif
}
#ifdef _DEBUG
else //若是同一張卡,則看上次完成操作的步驟
{
DebugString("Last Operation Card In\r\n");
}
#endif
//具體分步操作讀寫卡
switch(CardOperateStep)
{
case 0: //讀持卡人信息
#ifdef _DEBUG
DebugString("Read Cardholder Info...\r\n");
#endif
Count_Sector_PWD(Buffer,CardSerialNo,CARDHOLDER_INFO_SECTOR); //計(jì)算密鑰
//memset(Buffer,0xFF,6);
result=ReadCardholderInfo(CardSerialNo,KEYA,Buffer,&stCardholderInfo);
#ifdef _DEBUG
DebugString("Read Cardholder Info Result:");
DebugData(1,1,&result);
#endif
if(result != MI_OK) return FAILURE;
#ifdef _DEBUG
DebugString("Read Cardholder Info OK, the Data:");
DebugData(41,28,(unsigned char *)&stCardholderInfo);
#endif
CardOperateStep = 1;
case 1: //判斷卡狀態(tài)、啟用日期、有效期等
#ifdef _DEBUG
DebugString("Check Cardholder Info...\r\n");
#endif
//1、判斷卡狀態(tài)標(biāo)志
if(stCardholderInfo.cState) //無效卡
{
mifs_halt();
#ifdef _DEBUG
DebugString("Current Card Status is Invalid\r\n");
#endif
return CARD_LOSTED_CODE;
}
//2、檢查卡啟用日期、有效期
ReadClock(gcDateTime); //讀時(shí)鐘
#ifdef _DEBUG
DebugString("Read Clock OK, the Data:");
DebugData(7,7,gcDateTime);
#endif
if(memcmp(gcDateTime,stCardholderInfo.cActiveDate,3) < 0)
{
mifs_halt();
#ifdef _DEBUG
#endif
return CARD_OVERDUE_CODE; //未到啟用日期
}
if(memcmp(gcDateTime,stCardholderInfo.cInvalidDate,3) > 0)
{
mifs_halt();
#ifdef _DEBUG
DebugString("已過有效期\r\n");
#endif
return CARD_OVERDUE_CODE; //未已過有效日期
}
//3、檢查卡狀態(tài)表
memcpy(&lSerialNo,CardSerialNo,4);
result = FoundCardStatusTable(lSerialNo);
#ifdef _DEBUG
DebugString("Found Card Status Table Result:");
DebugData(1,1,&result);
#endif
switch(result)
{
case SUCCESS: //找到
result = SetCardState(CardSerialNo,KEYA,Buffer,2);
if(result==MI_OK)
return CARD_LOSTED_CODE;
else
return FAILURE;
case FAILURE: //未找到
CardOperateStep = 2;
break;
default:
return result;
}
case 2: //查找充值信息數(shù)據(jù)
#ifdef _DEBUG
DebugString("Read Fill Para Info...\r\n");
#endif
memcpy(stFillPara.CardIndex,stCardholderInfo.cSerialNo,3);
result = FoundFillPara(&stFillPara,&iOffSet);
#ifdef _DEBUG
DebugString("stFillPara Data:");
DebugData(8,8,(unsigned char *)&stFillPara);
#endif
if(result != SUCCESS) return result;
if(stFillPara.cCurrentStatus == 0)
return KQ_REPEAT_CODE; //已充過值
CardOperateStep = 3;
case 3: //讀卡上交易數(shù)據(jù)
#ifdef _DEBUG
DebugString("Read Cardholder Info...\r\n");
#endif
Count_Sector_PWD(&Buffer[0],CardSerialNo,PUBLIC_MONEY_SECTOR); //計(jì)算密鑰
Count_Sector_PWD(&Buffer[6],CardSerialNo,BUSINESS_INFO_SECTOR); //計(jì)算密鑰
Count_Sector_PWD(&Buffer[12],CardSerialNo,BUSINESS_LIMIT_INFO_SECTOR); //計(jì)算密鑰
//memset(Buffer,0xFF,18);
result=ReadBusinessInfo(CardSerialNo,KEYA,Buffer,&stBusinessInfo);
if(result != MI_OK) return FAILURE;
#ifdef _DEBUG
DebugString("Read Business Info OK, the Data:");
DebugData(44,44,(unsigned char *)&stBusinessInfo);
#endif
CardOperateStep = 4;
case 4: //判斷卡上充值記錄是否為當(dāng)前充值段內(nèi)
if(stFillPara.cCurrentStatus == stBusinessInfo.stFillInfo.cMode)
{
if(!((memcmp(stBusinessInfo.stFillInfo.cDateTime,stFillLimitInfo.cStartTime,6) < 0)
|| (memcmp(stBusinessInfo.stFillInfo.cDateTime,stFillLimitInfo.cEndTime,6) > 0)))
{
UpdateFillParaStatus(iOffSet); //補(bǔ)更新充值參數(shù)標(biāo)記
return KQ_REPEAT_CODE; //已充過值
}
}
CardOperateStep = 5;
case 5: //準(zhǔn)備充值數(shù)據(jù)
memcpy(stBusinessInfo.stFillInfo.cDateTime,gcDateTime,6); //充值日期時(shí)間,格式:YY MM DD HH MM SS
if(stFillPara.cCurrentStatus==FILL_MONEY) //充錢
{
stBusinessInfo.stFillInfo.lMoney=stFillPara.Value; //充值金額
stBusinessInfo.stFillInfo.iTimes=0; //充值次數(shù)
}else
if(stFillPara.cCurrentStatus==FILL_TIMES)//充次
{
stBusinessInfo.stFillInfo.lMoney=0; //充值金額
stBusinessInfo.stFillInfo.iTimes=stFillPara.Value; //充值次數(shù)
}
memcpy(stBusinessInfo.stFillInfo.cDeviceNo,(unsigned char*)&equip_addr.number_addr,2); //設(shè)備編號(hào)
stBusinessInfo.stFillInfo.cMode=stFillPara.cCurrentStatus; //充值類別
CardOperateStep = 6;
case 6: //進(jìn)行充值
result = Fill(CardSerialNo,&stBusinessInfo);
#ifdef _DEBUG
DebugString("Fill Result:");
DebugData(1,1,&result);
DebugString("Read Business Info OK, the Data:");
DebugData(44,44,(unsigned char *)&stBusinessInfo);
#endif
if(result ==ERROR_NO_COMPLITE) return 60;
if(result != MI_OK) return FAILURE;
mifs_halt();
CardOperateStep = 2; //若下次也是當(dāng)前這張卡,則直接跳到讀卡上訂餐數(shù)據(jù)
UpdateFillParaStatus(iOffSet);
}
return result;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -