Card.C
上传用户:shyuanyi
上传日期:2008-05-24
资源大小:69k
文件大小:11k
源码类别:

RFID编程

开发平台:

C/C++

  1. #include "my_head.H"
  2. #include "RfModuleFunc.H"
  3. #include "DataFlash.H"
  4. //#define _DEBUG
  5. #ifdef _DEBUG
  6. #include "Debug.h"
  7. #endif
  8. #define YES 1
  9. #define NO 0
  10. #define COMPANY_INFO_SECTOR 2 //公司信息
  11. #define CARDHOLDER_INFO_SECTOR 3 //持卡人信息
  12. #define PUBLIC_MONEY_SECTOR 4 //公共钱包
  13. #define BUSINESS_INFO_SECTOR 5 //交易信息
  14. #define TIME_COUNT_SECTOR 6 //计时信息
  15. #define ORDER_DINNER_SECTOR 7 //订餐信息
  16. #define BUSINESS_LIMIT_INFO_SECTOR 8 //交易特别限制信息
  17. #define   SYSTEMCARD_SECTOR   0
  18. #define   SEEDCARD_SECTOR     1
  19. #define   MAKER_CODE_SECT     0
  20. #define   SYSTEM_SECT_1       1
  21. #define   SYSTEM_SECT_2       2
  22. #define   YSN_SYSPWD_SECT     3
  23. #define   SEED_CARD_SECT      4   //UNIT_INFO_SECT
  24. #define   OPUSER_CARD_SECT    5   //管理员或操作员
  25. //UNIT(SEED) INFO
  26. #define   CARD_LEVEL_DDR      0
  27. #define   UNIT_CODE_ADDR      1   //1-3
  28. #define   UNIT_PWD_ADDR       4   //4-6
  29. #define   PUBLIC_SECTOR_ADDR  7
  30. #define   FUC_TYPE_ADDR       8   //子功能类型
  31. #define   FUC_SECTOR_ADDR     9   //子功能占用扇区
  32. #define   SEED_DATE_ADDR      10  //10-12
  33. #define   SEEDUSECOUNTS_ADDR  13  //13-14
  34. //===============================================
  35. //卡级别定义
  36. #define   CONUSER_CARD        3  //- 普通用户卡,
  37. #define   MANAGE_CARD         6  //- 维护管理卡,
  38. #define   SEED_CARD           7  //- 系统子卡,
  39. #define   SYSTEM_CARD         8  //- 系统母卡,
  40. #define   EMPTYUSER_CARD      0x3f //-  单位白卡
  41. unsigned char code Nkey_a[6] = {'Y', 's','n', 'O', 'y', 's'};
  42. unsigned char code Nkey_b[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
  43. sttCardholderInfo xdata stCardholderInfo; //持卡人信息
  44. sttBusinessInfo xdata stBusinessInfo; //交易信息
  45. unsigned char xdata CardSerialNo[4]; //作为最后一次操作的卡系列号存贮用(必须全局)
  46. unsigned char xdata CardOperateStep; //卡操作步骤标志(必须全局)
  47. unsigned char xdata gcDateTime[7]; //全局时钟
  48. extern void ReadClock(unsigned char ClockData[]);
  49. extern sttOtherTableInfo xdata stOtherTableInfo;
  50. extern Equip_Addr      pdata  equip_addr;
  51. //====================================================
  52. void  Count_Sector_PWD(unsigned char  pbuf[],
  53.    unsigned char card_snr[4],
  54.    unsigned char  sector)
  55. {
  56.    memcpy(pbuf,Nkey_a,6);
  57.    pbuf[0] *= card_snr[0]+sector*1;
  58.    pbuf[1] *= card_snr[1]+sector*2;
  59.    pbuf[2] *= card_snr[2]+sector*3;
  60.    pbuf[3] *= card_snr[3]+sector*4;
  61.    pbuf[4] *= pbuf[0]+sector*5;
  62.    pbuf[5] *= pbuf[1]+sector*6;
  63. }
  64. //读系统卡
  65. BYTE   GetSEEDCardTest(SeedCard_Info  *card)
  66. {
  67. BYTE  idata  tt[2];
  68. BYTE  idata  card_snr[4];
  69. BYTE  idata  bankdata[16];
  70. BYTE  size,err;
  71. int   i=0;
  72. //Init_Rfic();
  73.     mifs_reset(20);
  74. for(i=45;--i;)
  75.   {
  76.    if(!mifs_request(ALL_CARD,tt))break;
  77.   }
  78. if(!i)return(CARD_NO_FINED);
  79. for(i=45;--i;)
  80.   {
  81.    if((mifs_request(IDLE_CARD,tt))!=MI_OK)continue;
  82.    if((mifs_anticoll(0,card_snr))!=MI_OK)continue;
  83.    if((mifs_select(card_snr,&size))!=MI_OK)continue;
  84.    break;
  85.   }
  86. if(!i)return(CARD_ERR_CODE);//return(40+err);
  87.     Count_Sector_PWD(bankdata,card_snr,SEEDCARD_SECTOR);
  88. err=mifs_load_key(KEYA,SEEDCARD_SECTOR,bankdata);
  89.     //err=mifs_load_key(KEYA,SEEDCARD_SECTOR,Nkey_b);
  90. if(err!=MI_OK)return(50+err);
  91. for(i=15;--i;)
  92.   {
  93.    if((mifs_authentication(KEYA,SEEDCARD_SECTOR))!=MI_OK)continue;
  94.    //if((mifs_authKey(KEYA,SEEDCARD_SECTOR,Nkey_b))!=MI_OK)continue;
  95.    if((mifs_read(SEED_CARD_SECT,bankdata))!=MI_OK)continue;
  96.    break;
  97.   }
  98. if(!i)return(CARD_ERR_CODE);//return(40+err);
  99.     //do_buzzer(1);
  100.     mifs_halt();
  101. //mifs_close();
  102. if(bankdata[CARD_LEVEL_DDR] != SEED_CARD)
  103. {
  104.    return(CARD_NO_SEED);
  105. }
  106.     memcpy(card->unit_code,&bankdata[UNIT_CODE_ADDR],3);
  107.     memcpy(card->unit_password,&bankdata[UNIT_PWD_ADDR],3);
  108. card->fuc_type=bankdata[FUC_TYPE_ADDR];
  109. card->fuc_sector=bankdata[FUC_SECTOR_ADDR];
  110.     card->public_sector=bankdata[PUBLIC_SECTOR_ADDR];
  111.     memcpy(card->date,&bankdata[SEED_DATE_ADDR],3);  //6
  112. return(SUCCESS);
  113. }
  114. unsigned char  Check_Card_Event(unsigned char  cardmode)
  115. {
  116.     unsigned char  idata  tt[2];
  117. if(cardmode)
  118.   {
  119.    if(mifs_request(ALL_CARD,tt))return(1);
  120.   }
  121. else
  122.   {
  123.    if(mifs_request(IDLE_CARD,tt))return(1);
  124.   }
  125. Stop_Timer(DIS_CLOCKEVENT_Tevent);//must!
  126. Stop_Timer(WAIT_CARD_Tevent);
  127.     PostMessage(FIND_CARD_EVENT,0);
  128.     return(0);
  129. }
  130. //===============================
  131. char RfModule_Init()
  132. {
  133. unsigned char i,rst;
  134. sttCardStruct xdata stCardStruct;
  135. Rf_Init();
  136. memset(&stCardStruct,0xFF,16);
  137. stCardStruct.cCompanyInfoSector = COMPANY_INFO_SECTOR;
  138. stCardStruct.cCardholderInfoSector = CARDHOLDER_INFO_SECTOR;
  139. stCardStruct.cPublicMoneySector = PUBLIC_MONEY_SECTOR;
  140. stCardStruct.cBusinessInfoSector = BUSINESS_INFO_SECTOR;
  141. stCardStruct.cTimeCounterSector = TIME_COUNT_SECTOR;
  142. stCardStruct.cOrderDinnerSector = ORDER_DINNER_SECTOR;
  143. stCardStruct.cBusinessLimitInfoSector = BUSINESS_LIMIT_INFO_SECTOR;
  144. i=10;
  145. while(i--)
  146. {
  147. if((rst=SetCardApplicationSector(&stCardStruct))== MI_OK) 
  148. break;
  149. #ifdef _DEBUG
  150. DebugString("Set Card Application Sector Value Result:");
  151. DebugData(1,1,&rst);
  152. #endif
  153. }
  154. return rst;
  155. }
  156. //充值操作
  157. char FillMoneyOrTime()
  158. {
  159. unsigned char result;
  160. unsigned long idata lSerialNo;
  161. unsigned char xdata Buffer[18];
  162. unsigned int  iOffSet;
  163. sttFillPara xdata stFillPara; //充值信息表数据
  164. sttFillLimitInfo xdata stFillLimitInfo;//充值限制信息
  165. //读取充值时间限制表
  166. result = ReadFillLimitInfo(&stFillLimitInfo);
  167. if(result != SUCCESS) return result;
  168. #ifdef _DEBUG
  169. DebugString("Read Fill Limit Info OK, the Data:");
  170. DebugData(12,12,(unsigned char *)&stFillLimitInfo);
  171. #endif
  172. //读系统时钟
  173. ReadClock(gcDateTime);
  174. #ifdef _DEBUG
  175. DebugString("Read Clock OK, the Data:");
  176. DebugData(7,7,gcDateTime);
  177. #endif
  178. if(memcmp(stFillLimitInfo.cStartTime,gcDateTime,6) > 0)
  179. return NO_IN_CONSUMETIME; //未到充值时间
  180. if(memcmp(stFillLimitInfo.cEndTime,gcDateTime,6) < 0)
  181. return NO_IN_CONSUMETIME; //已过充值时间
  182. #ifdef _DEBUG
  183. DebugString("rnrnBegin Order Dinner Operate rn");
  184. #endif
  185. //检查是否有卡
  186. result=mifs_anticoll(0,Buffer);
  187. if(result != MI_OK) return FAILURE;
  188. #ifdef _DEBUG
  189. DebugString("Anticoll OKrn");
  190. #endif
  191. result=mifs_select(Buffer,&Buffer[4]);
  192. if(result != MI_OK) return FAILURE;
  193. #ifdef _DEBUG
  194. DebugString("Select OKrn");
  195. #endif
  196. //判断是否为最后操作的那张卡
  197. if(memcmp(CardSerialNo,Buffer,4)!=0) //若不是同一张卡
  198. {
  199. CardOperateStep = 0; //清卡操作步骤,即另一张卡需重头开始
  200. memcpy(CardSerialNo,Buffer,4); //保存当前卡系列号
  201. #ifdef _DEBUG
  202. DebugString("A New Card Inrn");
  203. #endif
  204. #ifdef _DEBUG
  205. else //若是同一张卡,则看上次完成操作的步骤
  206. {
  207. DebugString("Last Operation Card Inrn");
  208. }
  209. #endif
  210. //具体分步操作读写卡
  211. switch(CardOperateStep)
  212. {
  213. case 0: //读持卡人信息
  214. #ifdef _DEBUG
  215. DebugString("Read Cardholder Info...rn");
  216. #endif
  217. Count_Sector_PWD(Buffer,CardSerialNo,CARDHOLDER_INFO_SECTOR); //计算密钥
  218. //memset(Buffer,0xFF,6);
  219. result=ReadCardholderInfo(CardSerialNo,KEYA,Buffer,&stCardholderInfo);
  220. #ifdef _DEBUG
  221. DebugString("Read Cardholder Info Result:");
  222. DebugData(1,1,&result);
  223. #endif
  224. if(result != MI_OK) return FAILURE;
  225. #ifdef _DEBUG
  226. DebugString("Read Cardholder Info OK, the Data:");
  227. DebugData(41,28,(unsigned char *)&stCardholderInfo);
  228. #endif
  229. CardOperateStep = 1;
  230. case 1: //判断卡状态、启用日期、有效期等
  231. #ifdef _DEBUG
  232. DebugString("Check Cardholder Info...rn");
  233. #endif
  234. //1、判断卡状态标志
  235. if(stCardholderInfo.cState) //无效卡
  236. {
  237. mifs_halt();
  238. #ifdef _DEBUG
  239. DebugString("Current Card Status is Invalidrn");
  240. #endif
  241. return CARD_LOSTED_CODE;
  242. }
  243. //2、检查卡启用日期、有效期
  244. ReadClock(gcDateTime); //读时钟
  245. #ifdef _DEBUG
  246. DebugString("Read Clock OK, the Data:");
  247. DebugData(7,7,gcDateTime);
  248. #endif
  249. if(memcmp(gcDateTime,stCardholderInfo.cActiveDate,3) < 0)
  250. {
  251. mifs_halt();
  252. #ifdef _DEBUG
  253. DebugString("未到使用期rn");
  254. #endif
  255. return CARD_OVERDUE_CODE; //未到启用日期
  256. }
  257. if(memcmp(gcDateTime,stCardholderInfo.cInvalidDate,3) > 0)
  258. {
  259. mifs_halt();
  260. #ifdef _DEBUG
  261. DebugString("已过有效期rn");
  262. #endif
  263. return CARD_OVERDUE_CODE; //未已过有效日期
  264. }
  265. //3、检查卡状态表
  266. memcpy(&lSerialNo,CardSerialNo,4);
  267. result = FoundCardStatusTable(lSerialNo);
  268. #ifdef _DEBUG
  269. DebugString("Found Card Status Table Result:");
  270. DebugData(1,1,&result);
  271. #endif
  272. switch(result)
  273. {
  274. case SUCCESS: //找到
  275. result = SetCardState(CardSerialNo,KEYA,Buffer,2);
  276. if(result==MI_OK)
  277. return CARD_LOSTED_CODE;
  278. else
  279. return FAILURE;
  280. case FAILURE: //未找到
  281. CardOperateStep = 2;
  282. break;
  283. default:
  284. return result;
  285. }
  286. case 2: //查找充值信息数据
  287. #ifdef _DEBUG
  288. DebugString("Read Fill Para Info...rn");
  289. #endif
  290. memcpy(stFillPara.CardIndex,stCardholderInfo.cSerialNo,3);
  291. result = FoundFillPara(&stFillPara,&iOffSet);
  292. #ifdef _DEBUG
  293. DebugString("stFillPara Data:");
  294. DebugData(8,8,(unsigned char *)&stFillPara);
  295. #endif
  296. if(result != SUCCESS) return result;
  297. if(stFillPara.cCurrentStatus == 0)
  298. return KQ_REPEAT_CODE; //已充过值
  299. CardOperateStep = 3;
  300. case 3: //读卡上交易数据
  301. #ifdef _DEBUG
  302. DebugString("Read Cardholder Info...rn");
  303. #endif
  304. Count_Sector_PWD(&Buffer[0],CardSerialNo,PUBLIC_MONEY_SECTOR); //计算密钥
  305. Count_Sector_PWD(&Buffer[6],CardSerialNo,BUSINESS_INFO_SECTOR); //计算密钥
  306. Count_Sector_PWD(&Buffer[12],CardSerialNo,BUSINESS_LIMIT_INFO_SECTOR); //计算密钥
  307. //memset(Buffer,0xFF,18);
  308. result=ReadBusinessInfo(CardSerialNo,KEYA,Buffer,&stBusinessInfo);
  309. if(result != MI_OK) return FAILURE;
  310. #ifdef _DEBUG
  311. DebugString("Read Business Info OK, the Data:");
  312. DebugData(44,44,(unsigned char *)&stBusinessInfo);
  313. #endif
  314. CardOperateStep = 4;
  315. case 4: //判断卡上充值记录是否为当前充值段内
  316. if(stFillPara.cCurrentStatus == stBusinessInfo.stFillInfo.cMode)
  317. {
  318. if(!((memcmp(stBusinessInfo.stFillInfo.cDateTime,stFillLimitInfo.cStartTime,6) < 0)
  319. || (memcmp(stBusinessInfo.stFillInfo.cDateTime,stFillLimitInfo.cEndTime,6) > 0)))
  320. {
  321. UpdateFillParaStatus(iOffSet); //补更新充值参数标记
  322. return KQ_REPEAT_CODE; //已充过值
  323. }
  324. }
  325. CardOperateStep = 5;
  326. case 5: //准备充值数据
  327. memcpy(stBusinessInfo.stFillInfo.cDateTime,gcDateTime,6); //充值日期时间,格式:YY MM DD HH MM SS
  328. if(stFillPara.cCurrentStatus==FILL_MONEY) //充钱
  329. {
  330. stBusinessInfo.stFillInfo.lMoney=stFillPara.Value; //充值金额
  331. stBusinessInfo.stFillInfo.iTimes=0; //充值次数
  332. }else 
  333. if(stFillPara.cCurrentStatus==FILL_TIMES)//充次
  334. {
  335. stBusinessInfo.stFillInfo.lMoney=0; //充值金额
  336. stBusinessInfo.stFillInfo.iTimes=stFillPara.Value; //充值次数
  337. }
  338. memcpy(stBusinessInfo.stFillInfo.cDeviceNo,(unsigned char*)&equip_addr.number_addr,2); //设备编号
  339. stBusinessInfo.stFillInfo.cMode=stFillPara.cCurrentStatus; //充值类别
  340. CardOperateStep = 6;
  341. case 6: //进行充值
  342. result = Fill(CardSerialNo,&stBusinessInfo);
  343. #ifdef _DEBUG
  344. DebugString("Fill Result:");
  345. DebugData(1,1,&result);
  346. DebugString("Read Business Info OK, the Data:");
  347. DebugData(44,44,(unsigned char *)&stBusinessInfo);
  348. #endif
  349. if(result ==ERROR_NO_COMPLITE) return 60;
  350. if(result != MI_OK) return FAILURE;
  351. mifs_halt();
  352. CardOperateStep = 2; //若下次也是当前这张卡,则直接跳到读卡上订餐数据
  353. UpdateFillParaStatus(iOffSet);
  354. }
  355. return result;
  356. }