⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 common.c

📁 m68k手持机的通讯相关源码
💻 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 + -