📄 buffer.c
字号:
/*
描述:
该文件为缓冲模式下C程序处理文件,完成读序列号,读块及块状态,读系统时间功能;
上位机可通过串口进行系统配置;读取模式为序列号,块及块状态,系统时间的各种组合,如下:
系统时间 块及块状态 序列号
0 0 1
0 1 0
0 1 1
1 0 1
1 1 0
1 1 1
buffer[512]的数据格式:buffer[0] 为读到卡的次数,buffer[0].....buffer[511]为
读到卡的数据,重复迭放
增加级连读取功能。
............................
. .
. .
reader1 reader2 reader3
. . . .
. . . .
.............. ..........
作者:luoliyu
时间:200506
*/
#include "typedef.h"
#include "f2407regs_c.h"
#include "global.h"
#include "common.h"
void periodReadBuffer(void);
static void bufferComPro(void);
static void readDataBuffInfor(void);
static void readBufferData(void);
static void clearBufferData(void);
static void initializeBuffer(void);
static void bufferModeSelect(void);
static void serialNumDb(void);
static void serialNum(void);
static void serialNumTimer(void);
static void serialDbTimer(void);
static void db(void);
static void dbTimer();
void getBufferTime();
extern uchar Day,Hour,Minute,Second;
extern uchar buffer[BuffLen];
extern uchar viccdata[256];
extern uchar labeldata[350];
extern uint cfgdata[128];
extern uchar status_rx;
extern uchar pcdata[Len];
extern uchar ISOMode;
extern uchar ISOModeSys;
extern uchar ISOFlagsSys;
extern uchar globalLevel;
extern uchar bReadTag;
static uchar c_tr_data = 0;
static uchar c_db_adr = 0;
static uchar c_db_n = 0;
static uchar c_tr_id = 0;
static uchar c_valid_time = 0;
static uchar c_read = 0;
static uchar c_sync = 0;
static uchar c_sync_timeout = 0;
static uchar RFoffFlag = 0;
static uchar masterFirst = 0;
uchar syncTimeoutCounter = 0;
uchar syncTimeoutFlag = 0;
uchar syncTimeoutCounter_out = 0;
uchar syncTimeoutFlag_out = 0;
static uchar timeOutCome = 0;
static uchar bufferInitFlag = 0;
static uchar bufferClrFlag = 0;
static uchar bufferReadFlag = 0;
extern uchar globalErrFlag;
extern uchar deviceAddr;
void readCfg11( )
{
uint i;
c_tr_data = (cfgdata[88]>>8) & 0x23;
c_db_adr = cfgdata[88]&0x1f;
c_db_n = (cfgdata[89] >> 8)&0x0f;
c_tr_id = cfgdata[89]&0x9f;
c_valid_time = cfgdata[90];
c_read = (cfgdata[91]>>8) & 0x8f;
c_sync = cfgdata[91]&0xff;
c_sync_timeout = cfgdata[92]&0xff;
if((c_tr_data==0x00) || (c_tr_data==0x20)){c_tr_data = 0x01;} //default
if(c_db_adr >= 32) c_db_adr = 0;
if(c_db_n >= 16) c_db_n = 1;
if(c_valid_time>=80)c_valid_time = 0x0a; //default 1s
pcdata[1] = 0xaa;
initializeBuffer(); //init to clr buffer
}
static void bufferComPro( )
{
feedWatchDog();
switch (pcdata[2])
{
case 0x52: {Detec_Baud_pro(); break;} //Baud Rate Detection
case 0x63: {CPU_reset(); break;} //cpu reset
case 0x65: {Get_DevInf_pro(); break;} //Get Reader Information
case 0x69: {Reset_RF_pro(); break;} //RF Reset
case 0x6A: {RF_OnOff_pro(); break;} //RF ON/OFF
case 0x6d: {getNoiseLevel(); break;} //get noise level
case 0x6e: {readerDiagnostic(); break;} //reader diagnostic
case 0x71: {setOutput(); break;} //set output
case 0x74: {getInput(); break;} //get input
case 0x80: {Read_Cfg_pro(); break;} //Read Configuration
case 0x81: {Write_Cfg_pro(); break;} //Write Configuration
case 0x83: {Sdefault_Cfg_pro(); break;} //Set Default Configuration
case 0x85: {Wr_Rtc_pro(); break;}
case 0x86: {Rd_Rtc_pro(); break;}
case 0x88: {readIsoModeFalg(); break;}
case 0x21: {readBufferData(); break;} // buffer read mode,read buffer
case 0x31: {readDataBuffInfor();break;}
case 0x32: {clearBufferData( ); break;} // buffer read mode,clear buffer
case 0x33: {initializeBuffer(); break;};
default: {default_pro(); break;} //Unknown Command
}
}
void periodReadBuffer()
{
uint i;
uchar addrType;
uchar slaveLast=0, slaveCurrent=0, slaveUpEdge=0;
uchar masterLast=0,masterCurrent=0,masterUpEdge=0;
globalErrFlag = 0x00; // clear iso error flag
if(status_rx==2)
{
addrType = verifyType();
if(addrType)bufferComPro( );
status_rx = 0;
}
if( (c_sync&0x03) == 0x01 ) //cascaded synchronization
{
if( (c_sync&0x04) == 0x04 ) // master mode
{
syncTimeoutFlag_out = 1;
if(masterFirst == 0xaa) // second time access
{
masterCurrent = OpticInput3()&0x01;
if( (masterCurrent != masterLast)&&(masterCurrent == 0x01)||(timeOutCome == 0xaa) )
{
syncTimeoutFlag_out = 0;
masterUpEdge = 0xaa; //up edge come
timeOutCome = 0x00;
//if( RFoffFlag == 0xaa )
{
RFoffFlag = 0x00;
adjustX9c503(1,globalLevel); // open RF
}
}
if( (masterUpEdge == 0xaa) || (timeOutCome == 0xaa) )
{
timeOutCome = 0x00;
if(buffer[0] <= 5)
bufferModeSelect();
if(buffer[0] >= 1) // tag read
{
OptOutput1(1); //opt ouput high
masterUpEdge = 0x00; //clear master up edge flag
if( (c_sync&0x80) == 0x80 ) //RFOFF
{
setX9c503ToLowest(); // close RF
RFoffFlag = 0xaa;
}
syncTimeoutFlag = 0x01;
}
}
masterLast = masterCurrent;
}
else // first time access
{
if(buffer[0] <= 5)
bufferModeSelect();
if(buffer[0] >= 1) // tag read
{
OptOutput1(1); //opt ouput high
masterFirst = 0xaa;
if( (c_sync&0x80) == 0x80 ) //RFOFF
{
setX9c503ToLowest(); // close RF
RFoffFlag = 0xaa;
}
syncTimeoutFlag = 0x01;
}
}
}
else // slave mode
{
syncTimeoutFlag_out = 1;
slaveCurrent = OpticInput3()&0x01;
if( (slaveCurrent != slaveLast)&&(slaveCurrent == 0x01)||(timeOutCome == 0xaa) )
{
syncTimeoutFlag_out = 0;
slaveUpEdge = 0xaa; //up edge come
timeOutCome = 0x00;
//if( RFoffFlag == 0xaa )
{
RFoffFlag = 0x00;
adjustX9c503(1,globalLevel); // open RF
}
}
if( (slaveUpEdge == 0xaa) || (timeOutCome == 0xaa) )
{
timeOutCome = 0x00;
if(buffer[0] <= 5)
bufferModeSelect();
if(buffer[0] >= 1) // tag read
{
OptOutput1(1); //opt ouput high
slaveUpEdge = 0x00; //clear slave up edge flag
if( (c_sync&0x80) == 0x80 ) //RFOFF
{
setX9c503ToLowest(); // close RF
RFoffFlag = 0xaa;
}
syncTimeoutFlag = 0x01;
}
}
slaveLast = slaveCurrent;
}
if( (syncTimeoutCounter>=1) && (syncTimeoutFlag == 1) )
{
syncTimeoutFlag = 0x00;
syncTimeoutCounter = 0x00;
OptOutput1(0); //opt ouput low
}
if( (syncTimeoutCounter_out >= c_sync_timeout) && (syncTimeoutFlag_out == 1) )
{
syncTimeoutCounter_out = 0;
syncTimeoutFlag_out = 0;
timeOutCome = 0xaa;
pcdata[1] = 0xaa;
initializeBuffer(); //init to clr buffer
}
}
else
{
bufferModeSelect();
}
}
uchar bufferReadCouner = 0;
static void bufferModeSelect()
{
if( bufferReadCouner >= c_valid_time)
{
switch(c_tr_data)
{
case 0x01:{serialNum( ); break;} // serial number
case 0x02:{db(); break;}
case 0x03:{serialNumDb(); break;} // serial number,datablock
case 0x21:{serialNumTimer();break;} // timer,serial number
case 0x22:{dbTimer(); break;}
case 0x23:{serialDbTimer(); break;} // datablock,serial number,timer
default: {serialNum(); break;}
}
bufferReadCouner = 0;
}
}
static void readDataBuffInfor( )
{
if(pcdata[1] == deviceAddr)
{
pcdata[0] = 12;
pcdata[1] = deviceAddr;
pcdata[2] = 0x31;
pcdata[3] = OK;
pcdata[4] = 0x04;
pcdata[5] = 0x3c;
pcdata[6] = 0x00;
pcdata[7] = 0x01;
pcdata[8] = 0x00;
pcdata[9] = 0x01;
wr_crc_resp();
}
}
static void initializeBuffer()
{
uint i;
bufferInitFlag = 1;
bufferClrFlag = 0;
bufferReadFlag = 0;
for(i=0;i<BuffLen;i++)buffer[i]=0; //init to clr buffer
if(pcdata[1] == deviceAddr)
{
pcdata[0] = 6;
pcdata[1] = deviceAddr;
pcdata[2] = 0x33;
pcdata[3] = OK;
wr_crc_resp();
}
}
static void readBufferData()
{
uint i;
uchar len;
if(pcdata[1] == deviceAddr)
{
if( (bufferInitFlag == 1) && (bufferClrFlag == 0) )
{
bufferReadFlag = 1;
if(buffer[0] == 0x00)
{
pcdata[0] = 6;
pcdata[1] = deviceAddr;
pcdata[2] = 0x21;
pcdata[3] = 0x01; //no tag
wr_crc_resp();
}
else
{
switch(c_tr_data)
{
case 0x01:
{
pcdata[0] = 6+buffer[0]*9+2;
pcdata[1] = deviceAddr;
pcdata[2] = 0x21;
pcdata[3] = OK;
pcdata[4] = c_tr_data;
pcdata[5] = buffer[0];
for(i=0;i<buffer[0]*9;i++)
{
pcdata[6+i] = buffer[1+i];
}
wr_crc_resp();
}
break;
case 0x02:
{
len = buffer[0]*(2+(c_db_n+1)*5)+6+2;
pcdata[0] = 6+buffer[0]*(2+(c_db_n+1)*5)+2;
pcdata[1] = deviceAddr;
pcdata[2] = 0x21;
if(len<=0xff)pcdata[3] = OK;
else pcdata[3] = 0x94;
pcdata[4] = c_tr_data;
pcdata[5] = buffer[0];
for(i=0;i<buffer[0]*(2+(c_db_n+1)*5);i++)
{
pcdata[6+i] = buffer[1+i];
}
wr_crc_resp();
}
break;
case 0x03:
{
len = buffer[0]*(1+8+2+(c_db_n+1)*5)+6+2;
pcdata[0] = 6+buffer[0]*(9+2+(c_db_n+1)*5)+2;
pcdata[1] = deviceAddr;
pcdata[2] = 0x21;
if(len<=0xff)pcdata[3] = OK;
else pcdata[3] = 0x94;
pcdata[4] = c_tr_data;
pcdata[5] = buffer[0];
for(i=0;i<buffer[0]*(9+2+(c_db_n+1)*5);i++)
{
pcdata[6+i] = buffer[1+i];
}
wr_crc_resp();
}
break;
case 0x21:
{
pcdata[0] = 6+buffer[0]*(9+4)+2;
pcdata[1] = deviceAddr;
pcdata[2] = 0x21;
pcdata[3] = OK;
pcdata[4] = c_tr_data;
pcdata[5] = buffer[0];
for(i=0;i<buffer[0]*(9+4);i++)
{
pcdata[6+i] = buffer[1+i];
}
wr_crc_resp();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -