📄 main.c
字号:
/**************************************
函数名称: setup_first
函数功能: 第一次进行初始化全局变量
函数参数: 无
函数返回: 无
**************************************/
void setup_first(void)
{
upload_flag='-' ;
/*默认 上传标志为未上传*/
print_flag=YES ;
/*默认 刷卡后不立即进打印*/
offline_flag=NO ;
/*默认 联机交易,刷卡后数据立即上传*/
strcpy(SET_OPER,"99");
/*操作员:99,密码:000000*/
strcpy(SET_PWD,"000000");
/*可以在系统维护中修改*/
}
/**************************************
函数名称: kq_setPassword
函数功能: 设置管理员密码
函数参数: 无
函数返回: 无
**************************************/
int kq_setPassword(void)
{
int i ;
char buffer[9],buffer1[9];
memset(buffer,0,sizeof(buffer));
memset(buffer1,0,sizeof(buffer1));
cls();
display(1,"请输新密码:");
keyoff();
do
{
i=getnstr(2,buffer);
}
while((i!=0)&&(i!=6));
keyon();
cls();
display(1,"请再输一次:");
keyoff();
do
{
i=getnstr(2,buffer1);
}
while((i!=0)&&(i!=6));
keyon();
if(memcmp(buffer,buffer1,6)!=0)
{
cls();
display_inv(1,"两次密码不一致");
delay(1);
return(FAIL);
}
if(i==6)
{
sprintf(SET_PWD,"%s",buffer);
}
cls();
display_inv(1,"恭喜 恭喜");
display_inv(2,"请牢记新密码");
delay(1);
return(SUCC);
}
/**************************************
函数名称:kq_dispNow
函数功能:显示当前日期与时间
函数参数 无:
函数返回:无
**************************************/
void kq_dispNow(void)
{
kq_getDateTime();
display(3," 20%2.2s年%2.2s月%2.2s日",kq_date,kq_date+2,kq_date+4);
display(4," %2.2s:%2.2s:%2.2s",kq_time,kq_time+2,kq_time+4);
}
/**************************************
函数名称:kq_getDateTime
函数功能:获取当前的日期和时间
函数参数 无
函数返回:kq_date,kq_time
**************************************/
int kq_getDateTime(void)
{
get_date(kq_date);
get_time(kq_time);
return(SUCC);
}
/**************************************
函数名称: kq_displogo
函数功能: 显示启动介面及第一次进入维护
函数参数: 无
函数返回: SUCC/FAIL
**************************************/
int kq_displogo(void)
{
int j,ret ;
char i ;
char buffer[9];
cls();
display_inv(1,"实达外设考勤");
display_cen(2,"按清除键进入维护");
display_cen(3,"2005/10/01");
display_cen(4,"V0.5");
/* 清除键的键为CANCEL */
if(inkey(3)==CANCEL)
{
do
{
cls();
display(1,"1.交易模式");
display(2,"2.时间设定");
display(3,"3.数据上传");
display(4,"4.打印流水");
i=inkey(0);
if(i=='1'||i=='2'||i=='3'||i=='4')break ;
if(i==CANCEL)return(FAIL);
if(i==ENTER)
{
cls();
display(1,"5.重设管理员密码");
display(2,"6.划卡后立即打印");
display(3,"7.清除已上传数据");
display(4,"8.从主机下载卡号");
}
i=inkey(0);
if(i==CANCEL)return(FAIL);
if(i=='5'||i=='6'||i=='7'||i=='8')break ;
}
while(1);
/* 密码有三次机会 */
j=1 ;
memset(buffer,0,sizeof(buffer));
while(j<=3)
{
cls();
display(1,"请输密码(6位):");
keyoff();
ret=getnstr(2,buffer);
keyon();
if((ret==1)&&(buffer[0]==0xff))continue ;
if(memcmp(buffer,SET_PWD,6)==0)break ;
j++;
display_inv(2,"密码错误");
delay(1);
}
if(j>3)return(FAIL);
else
{
/* 身份确认成功,进行相应操作。 */
switch(i)
{
case '1' :
cls();
if(offline_flag==YES)
{
offline_flag=NO ;
display_inv(2,"开始联机交易");
display_inv(3,"立即上传数据");
}
else
{
offline_flag=YES ;
display_inv(2,"开始脱机交易");
display_inv(3,"暂不上传数据");
}
delay(2);
break ;
case '2' :
/* 设定时间 */
kq_setDateTime();
break ;
case '3' :
/* 联机交易时,上传全部数据 */
if(offline_flag==NO)
{
kq_dataUpload_all();
}
else
{
cls();
display_inv(1,"实达外设考勤");
display_inv(3,"未联机不能上传");
delay(2);
}
break ;
case '4' :
/* 打印流水文件中的全部数据 */
kq_dataPrint_all();
break ;
case '5' :
/* 重设管理员密码 */
kq_setPassword();
break ;
case '6' :
/* 划卡后立即打印 */
cls();
if(print_flag==YES)
{
print_flag=NO ;
display_inv(2,"刷卡后不立即打印");
display_inv(3,"可在维护时再打印");
}
else
{
print_flag=YES ;
display_inv(2,"刷卡后立即打印");
display_inv(3,"请先装好打印纸");
}
delay(2);
break ;
case '7' :
/* 清空已上传数据 */
kq_dataClear();
break ;
case '8' :
/* 从主机下载 */
kq_downCardno();
break ;
default :
break ;
}
;
}
}
return SUCC ;
}
/**************************************
函数名称: kq_dataClear()
函数功能: 清空已上传数据
函数参数: 无
函数返回: SUCC/FAIL
**************************************/
int kq_dataClear(void)
{
char fd,ret ;
int i ;
struct KQ_REC kqRec ;
fd=pfopen("water",'R');
if(fd==0||fd=='E')
{
cls();
display_inv(1,"实达外设考勤");
display_cen(3,"流水文件无数据");
delay(1);
return(FAIL);
}
for(i=1;;i++)
{
ret=pfread(fd,i,1,(char*)&kqRec);
if(ret==0)
{
display_clear(3);
display_cen(3,"数据已经删完");
systemsound(500);
delay(1);
break ;
}
if(kqRec.upload_flag=='+')
if(pfdelrec(fd,i)==0)
{
display_clear(3);
display_cen(3,"删除已上传记录");
i--;
/*由于是顺序文件,删除一个记录后,后续的记录号也会变更
所以,要对记录号进行修正。*/
}
}
return(SUCC);
}
/**************************************
函数名称: kq_setDateTime
函数功能: 获取当前日期和时间
函数参数: 无
函数返回: 全局变量,kq_date,kq_time
**************************************/
int kq_setDateTime(void)
{
char datestr[9],timestr[9];
int ret=0 ;
memset(datestr,0,sizeof(datestr));
memset(timestr,0,sizeof(timestr));
cls();
display(1,"输入日期yymmdd:");
ret=getnstr(2,datestr);
if(!(ret==1&&datestr[0]==0xff))
set_date(datestr);
display(1,"输入时间hhmmss:");
ret=getnstr(2,timestr);
if(!(ret==1&×tr[0]==0xff))
set_time(timestr);
return(SUCC);
}
/*********************************************
函数名称: display_inv
函数功能: 在指定行中央反白显示指定字符串
函数参数: (int)lineno: 指定行
(char *)lg: 指定字符串
函数返回: (int)SUCC
**********************************************/
int display_inv(int lineno,char*str)
{
set_inverse(1);
display_cen(lineno,str);
set_inverse(0);
return(SUCC);
}
/*******************************************
函数名称: display_cen
函数功能: 在指定行中央显示指定字符串
函数参数: (int)lineno: 指定行
(char *)lg: 指定字符串
函数返回: (int)SUCC
**********************************************/
int display_cen(int lineno,char*str)
{
int j ;
char buffer[20];
memset(buffer,0,sizeof(buffer));
if(strlen(str)>=16)
{
j=0 ;
}
else
{
j=(16-strlen(str))/2 ;
}
if(j)
{
memset(buffer,' ',j);
strcpy(buffer+j,str);
display(lineno,buffer);
}
else
{
display(lineno,str);
}
return(SUCC);
}
/*********************************************
函数名称: dispaly_clear
函数功能: 清空屏幕某一行
函数参数: (int)lineno: 指定行数
函数返回: (int)SUCC
**********************************************/
int display_clear(int lineno)
{
display(lineno," ");
return(SUCC);
}
/**************************************
函数名称:handshake_to_host
函数功能:与后台握手
函数参数: 无
函数返回: SUCC/FAIL
**************************************/
int handshake_to_host(void)
{
int failtime=0 ;
char h_char ;
/* 与主机进行握手, 5 次重试机会 */
do
{
h_char=0x05 ;
/*
* 发送 ENQ 0x05
*/
sendrs232(1,&h_char);
/*
* 读 0x06,表示握手成功
*/
if(kq_result()==SUCC)return(SUCC);
/*
* 检测重试次数
*/
}
while(failtime++<=5);
return(FAIL);
}
/**************************************
函数名称:send_to_host
函数功能:发送到后台
函数参数:
pack_len:包长
pack_str:数据包
函数返回: SUCC/FAIL
**************************************/
int send_to_host(int pack_len,char*pack_str)
{
int p_len ;
char buffer[31];
/* 数据包的结构 STX + LENGTH + DATA + ETX ,buffer(1)(2)以8421码表示数据的长度 */
memset(buffer,0,sizeof(buffer));
p_len=pack_len ;
/*
* 添加 STX 0x02
*/
buffer[0]=0x02 ;
/*
* 计算长度 (8421)
*/
buffer[1]=(p_len/100)+(p_len/100)/10*6 ;
buffer[2]=(p_len%100)+(p_len%100)/10*6 ;
memcpy(buffer+3,pack_str,pack_len);
/*
* 添加 ETX 0x03
*/
buffer[1+2+pack_len]=0x03 ;
/*
* 计算LRC,一个字节,附加在最后
for ( lrc = 0 , i = 1 ; i <= 2 + pack_len+1 ; i ++ )
lrc ^= buffer [ i ] ;
buffer [ 1 + 2 + pack_len + 1 ] = lrc ;
*/
sendrs232(1+2+pack_len+1,buffer);
return(SUCC);
}
/**************************************
函数名称:read_from_host
函数功能:从后台读数据
函数参数: 无
函数返回: SUCC/FAIL
**************************************/
int read_from_host()
{
int failtime,len ;
char h_char ;
char buffer[2];
// int ret;
/* readstr 不包括 STX 0x02 , ETX 0x03 */
/* 读取 STX 0x02 直到超时 */
failtime=0 ;
do
{
readrs232(&h_char,1,1);
if(h_char==0x02)break ;
}
while(failtime++<10);
if(failtime>=10)
{
display_clear(4);
display_cen(4,"接收STX超时");
delay(1);
return(FAIL);
}
/* 计算长度 */
readrs232( buffer, 3 ,2 ) ;
readlen = ( buffer [ 0 ] >> 4 ) * 1000 + ( buffer [ 0 ] & 0x0f )
* 100 + ( buffer [ 1 ] >> 4 ) * 10 + ( buffer [ 1 ] & 0x0f ) ;
// readlen=18 ;
/* STX+C********N******V*+ETX
* 包括 ETX 0x03 ,所以数据总长度要加2,10秒内读完
*/
len=readrs232(readstr,3,readlen+1);
/* readlen=有效数据的长度,1=ETX */
if(len!=readlen+1)
{
display_clear(4);
display_inv(4,"数据长度错");
delay(1);
return(FAIL);
}
/* 检查 0x03 */
if(readstr[readlen]!=0x03)
{
display_clear(4);
display_inv(4,"数据包结束错");
delay(1);
return(FAIL);
}
/* buffer[0],buffer[1],现在放的是长度
检查LRC 校验时,是带着长度一起算的
lrc = 0 ;
lrc ^= buffer [ 0 ] ;
lrc ^= buffer [ 1 ] ;
for ( i = 0 ; i < readlen + 1 ; i ++ )
lrc ^= buf [ i ] ;
if ( buf [ readlen + 1 ] != lrc ) {
display_clear(4);
display ( 4 , "LRC校验错" ) ;
delay ( 2 ) ;
return ( FAIL ) ;
}
*/
/* 置为'\0',作为串结束符 */
readstr[readlen]=0x0 ;
return(SUCC);
}
/*************************************
函数名字: KQ_RESULT
函数功能:读入返回码
函数返回:SUCC,FAIL
函数参数: VOID
*************************************/
int kq_result(void)
{
char result ;
int ret,failtime=0 ;
/* 返回结果的格式 ACK */
do
{
ret=readrs232(&result,1,1);
if(ret==1)
if(result==0x06)return(SUCC);
}
while(failtime++<2);
return(FAIL);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -