?? 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 + -