📄 main0.c
字号:
/*Fstk.C*//*Fstk's C file*/
/* last update: 2005-04-30 */
#include<v51rx2.h>
#include<reg52.h>
#include<string.h>
#include<stimer.h>
#include<uart.h>
#include<icc.h>
#include<icccmd.h>
#include<command.h>
#include<comm.h>
#include<ascii.h>
#include<posutils.h>
#include<mfrc500.h>
//#include<sst89x5xxRD2.h>
//#include<des.h>
#include"wdt.h"
#include"rx2flash.h"
//#define DEBUGMAIN
static unsigned char code ver[] = "HD: 1.0, SF: 2.3.e564, update: 2007-03-15";
static unsigned char code sysinfo[] = "Icc Reader, Designed by Liu lixun";
static unsigned char code pcbinfo[] = "ECG/LT 7.827.155A(MAIN) ECG/LT 7.827.156(ANTENNA)";
// 按照8086的格式(低位在前,高位在后)进行转换
long buftolong86(char *buf);
void longtobuf86(long val, char *buf);
// 按照8051的格式(高位在前,低位在后)进行转换
long buftolong51(char *buf);
void longtobuf51(long val, char *buf);
// 探测射频卡
bit rfcardtest(char *snr);
// build APDU cmd pack
bit BuildAPDU(unsigned char *buf, unsigned char len, ICCCMD *cmd);
// test if to enter isp
// uchar xdata fisp[4];
static unsigned int RfConfirmTime = 500;
void main(void)
{
unsigned char i;
unsigned int len; // 通讯报文长度
unsigned char buf[316]; // 通讯、操作用临时数据缓冲
unsigned int rsplen;
// var for smartcard
ICCCMD icccmd; // SAM卡命令结构
ICCRSP iccrsp; // SAM卡命令响应的结构
unsigned char lastsam; // last sam icc
unsigned char termsn[6]; // term number for hefei cmb
unsigned char terminf[8]; // term info for hefei cmb
// var for m1 card
unsigned char m1sector; // m1卡命令针对的扇区
unsigned char m1block; // m1卡命令针对的块号
long epvalue;
long oldepvalue;
unsigned char snr[4];
unsigned char oldsnr[4];
bit fkeypassed = 0;
uchar epstatus = 0x03;
unsigned char m1keys[16][6]; // save 16 keys max
unsigned char m1keystatus[16]; // sector id and a/b flag
unsigned char m1keycnt = 0;
unsigned char m1keyidx = 0xff;
unsigned char code m1keycntmax = 16;
// var for mcu
unsigned char mode = BEEP_ON_CARD_INOUT | NOTIFY_ON_CARD_INOUT;
bit cardin = 0;
bit rfcardin = 0;
unsigned int starttime = 0;
unsigned int rfrstms = 0;
unsigned char rfrstmin = 0;
bit fwaitcmd = 0;
unsigned int waitcmdtime = 0;
unsigned int resendtime = 0;
InitTimer(1843200);
ComOpen(1843200, 9600);
ComSetTimeOut(500, 500);
IccInit(248);
IccSetTimeout(1200);
#ifdef BUZZEROUT
buzzer(0, 50);
#endif
#ifdef LED
led(50);
#endif
if(MI_OK == M500PcdInit())
mode |= AUTO_SEARCH_RFCARD | OFTEN_RESET_RF_IC;
else if(MI_OK == M500PcdInit()) // try again
mode |= AUTO_SEARCH_RFCARD | OFTEN_RESET_RF_IC;
M500PcdMfOutSelect(2);
lastsam = 0xff;
#ifdef WATCHDOG
EnableWDT(255-15);
#endif
////////////////////// debug
//IccOpen(0, buf);
//memcpy(buf, "\xaa\x55\xa5\x5a", 4);
//IccWrite(buf, 4);
while(1)
{
// timeout(30 seconds) no communication, eject card
//if(cardin || rfcardin)
// if(GetTickCount() - starttime >= 30000)
// {
//IccUserEject();
// starttime = GetTickCount();
// }
//IccWrite("aa", 2);
#ifdef WATCHDOG
ResetWDT();
#endif
// reset rfic(rc500) once an hour when idle
if(mode & OFTEN_RESET_RF_IC)
{
if(!rfcardin)
{
if(GetTickCount() - rfrstms >= 60000)
{
rfrstms = GetTickCount();
rfrstmin ++;
if(rfrstmin >= 10)
{
rfrstmin = 0;
M500PcdInit();
}
}
}
}
// if to resend message to host
// if the host do not send command to me some time
// after I send message to host, I should change the
// status to no card and eject card. 050523
if((cardin || rfcardin) && fwaitcmd)
{
if(GetTickCount() - waitcmdtime >= 10000) // 050613
{
if(cardin)
IccUserEject();
rfcardin = 0;
cardin = 0;
fwaitcmd = 0;
led(50);
}
else if(GetTickCount() - resendtime >= 1000)
{
resendtime = GetTickCount();
rfcardin = 0;
cardin = 0;
fwaitcmd = 0;
led(50);
}
}
// 射频卡侦听
if(mode & AUTO_SEARCH_RFCARD)
{
if(rfcardtest(snr))
{
if(!rfcardin)
{
rfcardin = 1;
starttime = GetTickCount();
#ifdef BUZZEROUT
if(mode & BEEP_ON_CARD_INOUT)
buzzer(0, 20);
#endif
#ifdef LED
if(cardin)
led(0xff);
else
led(10);
#endif
if(memcmp(snr, oldsnr, 4)) // 不相等
{
memcpy(oldsnr, snr, 4);
m1keycnt = 0;
}
// 通知主机有卡
if(mode & NOTIFY_ON_CARD_INOUT)
{
buf[0] = HASCARD;
buf[1] = cardin;
buf[2] = rfcardin;
#if 1
CommSendNotWaitAck(buf, 3);
waitcmdtime = GetTickCount();
resendtime = waitcmdtime;
fwaitcmd = 1;
#else
if(!CommSend(buf, 3))
{
rfcardin = 0;
#ifdef LED
if(cardin)
led(20);
else
led(50);
#endif
}
#endif
}
}
rfrstmin = 0; // 050511 disable reset rc500
}
else
{
if(rfcardin)
{
rfcardin = 0;
#ifdef BUZZEROUT
if(mode & BEEP_ON_CARD_INOUT)
buzzer(0, 20);
#endif
#ifdef LED
if(cardin)
led(20);
else
led(50);
#endif
if(mode & NOTIFY_ON_CARD_INOUT)
{
buf[0] = HASCARD;
buf[1] = cardin;
buf[2] = rfcardin;
#if 1
CommSendNotWaitAck(buf, 3); /////////////////////////////////////
#else
CommSend(buf, 3);
#endif
}
// reset rf chip
if(mode & OFTEN_RESET_RF_IC)
{
M500PcdInit();
rfrstmin = 0; // restart timer of reset rf ic
}
}
}
}
// 行程开关测试
if(IccUserTest())
{
if(!cardin)
{
cardin = 1;
starttime = GetTickCount();
#ifdef BUZZEROUT
if(mode & BEEP_ON_CARD_INOUT)
buzzer(0, 20);
#endif
#ifdef LED
if(rfcardin)
led(0xff);
else
led(20);
#endif
// 通知主机有卡
if(mode & NOTIFY_ON_CARD_INOUT)
{
buf[0] = HASCARD;
buf[1] = cardin;
buf[2] = rfcardin;
#if 1
CommSendNotWaitAck(buf, 3); ///////////////////////////////////////////
waitcmdtime = GetTickCount();
fwaitcmd = 1;
#else
if(!CommSend(buf, 3))
{
cardin = 0;
#ifdef LED
if(rfcardin)
led(10);
else
led(50);
#endif
IccUserEject();
}
#endif
}
}
}
else
{
if(cardin)
{
cardin = 0;
#ifdef BUZZEROUT
if(mode & BEEP_ON_CARD_INOUT)
buzzer(0, 20);
#endif
#ifdef LED
if(rfcardin)
led(10);
else
led(50);
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -