📄 common.c
字号:
//*********************************************************************************************
//File : common.c
//Function: some common function
//*********************************************************************************************
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <api.h>
#include <database.h>
#include <stdarg.h>
#include <ExEH0218.h>
extern unsigned int ac_time;
extern unsigned char g_hd_pwd[9];
unsigned char con_line_buff[2048];
#define SUCCESSFUL 0
#define FAILURE -1
#define DEBUG_MODE
unsigned long get_days(int year,int month,int date);
void u_puts(char *lb) {
while (*(lb)) {
while(Disp_write_char(*lb));
lb++;
}
}
short TRACE(char * fmt, ...)
{
static int line = 0;
#ifdef DEBUG_MODE
Disp_set_font_attribute(DISP_FONT_TYPE_5x7_ENG);
goto_xy(0,line++);
{
va_list ap;
va_start(ap, fmt);
vsprintf(con_line_buff, fmt, ap);
u_puts(con_line_buff);
}
#endif
if(line>=8) line = 0;
}
short getch()
{
char testKey;
char ch;
unsigned char str_dsp[30];
while(1)
{
testKey = KEY_read();
if(testKey!=-1)
{
return ch;
clr_scr();
goto_xy(0,0);
sprintf(str_dsp,"%d pressed",ch);
Disp_write_str(str_dsp);
}
}
}
//======================================================================
// 返回值 == 0 正确输入
// == 1 输入空字符
// == -1 事件退出
// qEvent == EXIT_KEY_F1 按F1退出键
// qEvent == EXIT_KEY_F2 按F2退出键
// qEvent == EXIT_KEY_POWER 按POWER退出键
// qEvent == EXIT_CARD_GONE 拔卡退出
// qEvent == EXIT_KEY_POWER 插卡退出
// qEvent == EXIT_AUTO_QUIT 无按健退出
void dump_memory(unsigned char * buf,short int cnt,short line)
{
unsigned short cntr;
unsigned char stmp[30];
for (cntr = 0; cntr < cnt; cntr ++) {
sprintf( stmp+2*cntr,"%02X", buf[cntr]);
}
stmp[cnt*2] = 0;
ClearLine(line,DISP_5x7);
DispStr_E(0,line,stmp,DISP_POSITION|DISP_5x7);
}
// 公共函数0: ASCII码转BCD码
int code_BCD(char *bcdbuf,char *retbuf,int bcdnum)
{
int i;
for (i=0;i<bcdnum;i++) if (!isxdigit(bcdbuf[i])) return ((i+1)&0xff)|((bcdbuf[i]<<8)&0xff00);
strupr(bcdbuf);
for (i=0;i<(bcdnum/2);i++)
{
if (bcdbuf[i*2]>'9')
retbuf[i]=(bcdbuf[i*2]-'A'+10)<<4;
else
retbuf[i]=(bcdbuf[i*2]-'0')<<4;
if (bcdbuf[i*2+1]>'9')
retbuf[i]|=(bcdbuf[i*2+1]-'A'+10)&0xf;
else
retbuf[i]|=(bcdbuf[i*2+1]-'0')&0xf;
}
if (bcdnum%2)
{
if (bcdbuf[i*2]>'9')
retbuf[i]=(bcdbuf[i*2]-'A'+10)<<4;
else
retbuf[i]=(bcdbuf[i*2]-'0')<<4;
}
return 0;
}
// 公共函数1: BCD码转ASCII码
void decode_BCD(char *bcdbuf,char *retbuf,int bcdnum)
{
int i;
for (i=0;i<bcdnum;i++)
{
if (((bcdbuf[i]>>4)&0xf)<10)
retbuf[i*2]=((bcdbuf[i]>>4)&0xf)+'0';
else
retbuf[i*2]=((bcdbuf[i]>>4)&0xf)-10+'A';
if ((bcdbuf[i]&0xf)<10)
retbuf[i*2+1]=(bcdbuf[i]&0xf)+'0';
else
retbuf[i*2+1]=(bcdbuf[i]&0xf)-10+'A';
}
}
void delay_n_ms(int n)
{
while(n--)
{
delay_1ms();
}
}
//display three items
//Input:start_item
// sel_line,
// line_num
//
//Output:
short disp_menu_item(unsigned char *menu,int start_item,int start_line,int sel_line,int line_num)
{
unsigned char str_tmp[17*4];
int i;
if((line_num>4)||(sel_line>4)||(sel_line>line_num)||(sel_line<=0)||(line_num<=0)) return -1;
memset(str_tmp,0,sizeof(str_tmp));
for(i=0;i<line_num;i++)
{
memcpy(str_tmp+i*17,menu+(start_item+i)*16,16);
if(i == (sel_line-1))
DispStr_CE( 0, start_line+i*2,str_tmp+i*17, DISP_POSITION|DISP_REVERSE|DISP_CLRLINE );
else
DispStr_CE( 0, start_line+i*2,str_tmp+i*17, DISP_POSITION|DISP_CLRLINE );
}
return SUCCESSFUL;
}
short browse_menu(int startline,unsigned char *p_menu,int *p_cPtr,int *p_lPtr )
{
BROWINFO bi;
short ret;
if(startline>3) startline = 0;
bi.startLine = startline; //在画面中显示的起始地址,第一行为0
bi.dispLines = 4 - startline;
bi.iStr = p_menu;
bi.mInt = strlen(p_menu)/16;
bi.lineMax = 16;
bi.sFont = 0;
bi.numEnable = 0; // 允许键盘‘2’‘8’代替拨轮上下
bi.qEvent = EXIT_AUTO_QUIT|EXIT_KEY_ALL; // 按[F3]和[电源]键退出
bi.autoexit = ac_time; // 30秒无操作自动关机
bi.cPtr = *p_cPtr; // 当前行 相对于画面来说的,起点为画面的第一行为0
bi.lPtr = *p_lPtr; // lPtr:相对于菜单来说的,在菜单中所处的位置
ret = brow_select( &bi ); // 显示主菜单
*p_cPtr = bi.cPtr;
*p_lPtr = bi.lPtr;
if(bi.qEvent==EXIT_KEY_POWER||bi.qEvent==EXIT_AUTO_QUIT) return -1;
if(bi.qEvent==EXIT_KEY_F1) return -2;
if(bi.qEvent==EXIT_KEY_F2) return -3;
if(bi.qEvent==EXIT_KEY_F3) return -4;
if(bi.qEvent==EXIT_KEY_COMM) return -5;
if(bi.qEvent==EXIT_KEY_1) return 0;
if(bi.qEvent==EXIT_KEY_2) return 1;
if(bi.qEvent==EXIT_KEY_3) return 2;
if(bi.qEvent==EXIT_KEY_4) return 3;
if(bi.qEvent==EXIT_KEY_5) return 4;
if(bi.qEvent==EXIT_KEY_6) return 5;
if(bi.qEvent==EXIT_KEY_7) return 6;
if(bi.qEvent==EXIT_KEY_8) return 7;
if(bi.qEvent==EXIT_KEY_9) return 8;
return ret;
}
short sure(int x,int y,unsigned char *str_sel1,unsigned char *str_sel2)
{
SELE_INLINE sss;
short ret;
sss.count = 2;
sss.line = y;
sss.qEvent = EXIT_KEY_F1|EXIT_KEY_F3|EXIT_KEY_POWER|EXIT_AUTO_QUIT;
sss.enable46 = 0;
sss.flagch = 0;
sss.defsele = 0;
sss.selepstr[0].xx = 18;
sss.autoexit = ac_time;
strcpy( sss.selepstr[0].pstr, str_sel1 );
sss.selepstr[1].xx = 60;
strcpy( sss.selepstr[1].pstr, str_sel2 );
ret = select_in_line( &sss );
if(ret==0||ret==1) return ret;
else{
if ( sss.qEvent==EXIT_KEY_POWER ) return -1;
if ( sss.qEvent==EXIT_AUTO_QUIT ) return -1;
if ( sss.qEvent==EXIT_KEY_F1 ) return -2;
if ( sss.qEvent==EXIT_KEY_F2 ) return -3;
if ( sss.qEvent==EXIT_KEY_F3 ) return -4;
return -5;
}
}
short verify_pwd()
{
GETSTR_PARAM gs;
char mima_1[10];
DispStr_CE(0,0,"请输入密码:",DISP_POSITION|DISP_CLRSCR);
gs.qx = 0;
gs.qy = 2;
gs.sFont = 0;
gs.alpha = 0;
gs.nullEnable = 1;
gs.pPrompt = "";
gs.csChar = '_';
gs.pwChar = '*';
gs.spChar = 0;
gs.maxNum = 8;
gs.minNum = 3;
gs.minValue = -1;
gs.maxValue = -1;
gs.pStr = mima_1;
gs.retNum = 0;
gs.autoexit = 5;
gs.qEvent = EXIT_KEY_F1|EXIT_AUTO_QUIT;
if (huGetStr_E(&gs)<0) return FAILURE;
if(!strcmp(mima_1,"246423"))
{
return SUCCESSFUL;
}
}
void change_passwd(void)
{
GETSTR_PARAM gs;
char mima_1[10],mima_2[10];
DispStr_CE(0,0,"请输入新密码:",DISP_POSITION|DISP_CLRSCR);
gs.qx = 0;
gs.qy = 2;
gs.sFont = 0;
gs.alpha = 0;
gs.nullEnable = 1;
gs.pPrompt = "";
gs.csChar = '_';
gs.pwChar = '*';
gs.spChar = 0;
gs.maxNum = 8;
gs.minNum = 3;
gs.minValue = -1;
gs.maxValue = -1;
gs.pStr = mima_1;
gs.retNum = 0;
gs.qEvent = EXIT_KEY_F1;
if (huGetStr_E(&gs)<0) return;
DispStr_CE(0,4,"请再次输入:",DISP_POSITION);
gs.qx = 0;
gs.qy = 6;
/* gs.sFont = 0;
gs.alpha = 0;
gs.nullEnable = 1;
gs.pPrompt = "";
gs.csChar = '_';
gs.pwChar = '*';
gs.spChar = 0;
gs.maxNum = 8;
gs.minNum = 3;
gs.minValue = -1;
gs.maxValue = -1; */
gs.pStr = mima_2;
gs.retNum = 0;
gs.qEvent = EXIT_KEY_F1;
if (huGetStr_E(&gs)<0) return;
if (strcmp(mima_1,mima_2))
{
DispStr_C(0,2,"两次输入不一样",DISP_CENTER|DISP_CLRSCR);
DispStr_C(0,4,"密码未更改",DISP_CENTER);
}
else
{
DispStr_C(0,3,"密码更改成功!",DISP_CENTER|DISP_CLRSCR);
}
delay_and_wait_key( 2, EXIT_KEY_ALL, 0 );
return;
}
typedef struct
{
unsigned int year :16;
unsigned int month :8;
unsigned int date :8;
unsigned int hour :8;
unsigned int minute :8;
unsigned int second :8;
} DATE_TIME;
long diff_time(DATE_TIME *s_time,DATE_TIME *e_time)
{
//unsigned char strbuf1[30],strbuf2[30],strbuf3[30];
long seconds,days;
int s_year,s_month,s_date,e_year,e_month,e_date;
int s_hour,s_minute,s_second,e_hour,e_minute,e_second;
s_year=s_time->year; s_month=s_time->month; s_date=s_time->date;
e_year=e_time->year; e_month=e_time->month; e_date=e_time->date;
s_hour=s_time->hour; s_minute=s_time->minute; s_second=s_time->second;
e_hour=e_time->hour; e_minute=e_time->minute; e_second=e_time->second;
days=get_days(e_year,e_month,e_date)-get_days(s_year,s_month,s_date);
/*
sprintf(strbuf1,"%d,%d,%d,%d,%d,%d",s_year,s_month,s_date,s_hour,s_minute,s_second);
sprintf(strbuf2,"%d,%d,%d,%d,%d,%d",e_year,e_month,e_date,e_hour,e_minute,e_second);
sprintf(strbuf3,"%ld,%ld,%ld",get_days(e_year,e_month,e_date),get_days(s_year,s_month,s_date),days);
DispStr_CE(0,2,strbuf1,DISP_POSITION|DISP_5x7|DISP_CLRSCR);
DispStr_CE(0,3,strbuf2,DISP_POSITION|DISP_5x7);
DispStr_CE(0,4,strbuf3,DISP_POSITION|DISP_5x7);
delay_and_wait_key(0,EXIT_KEY_F1,0);
*/
seconds=days*24*60*60+((e_hour*60+e_minute)*60+e_second)-((s_hour*60+s_minute)*60+s_second);
return seconds;
}
//从1990年为基数,得到天数
unsigned long get_days(int year,int month,int date)
{
int i,leap;
long days=0;
for(i=1990;i<year;i++)
{
if((i % 4==0 &&i %100!=0)||(i %400==0))
{
leap=1;
days+=366;
}
else
{
leap=0;
days+=365;
}
}
year=i;
for(i=1;i<month;i++)
{
switch(i)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days+=31;
break;
case 2:
if((year % 4==0 &&year %100!=0)||(year %400==0)) days+=29;
else days+=28;
break;
case 4:
case 6:
case 9:
case 11:
days+=30;
break;
}
}
days+=date;
return days;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -