📄 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>
//-----------mifare------
#include <ExEH0218.h>
#include <contactless.h>
//--------------
#include "common.h"
#include "db.h"
#include "ExEH0218.h"
#include "hd_dt_wl.h"
extern unsigned char g_desk_NO[4+1];
extern unsigned char g_person_num;
extern unsigned char g_waiter_NO[4+1];
extern unsigned char g_waiter_PWD[4+1];
extern unsigned int ac_time;
extern unsigned char g_hd_pwd[9];
extern unsigned long append_count_count1;
extern int g_flag_login; //0:没有登陆 1:登陆
short sure(int x,int y,unsigned char *str_sel1,unsigned char *str_sel2);
//***********************mifare卡*******************
unsigned char dummy_key[6] = "\xFF\xFF\xFF\xFF\xFF\xFF";
unsigned char g_sector = 1; //operation sector
int read_sector( int sec_num,unsigned char *rdata);
int input_data();/////////////
char MyCardAccessMultiBlocks( unsigned char auth_mode,
unsigned char WR_mode,
unsigned char sector,
unsigned char Block,
unsigned char BlockCnt,
unsigned char* rdata,
unsigned char* wdata );
const char mifare_Menu[8*16+2] = "1.余额查询 2.结账 3.输入测试 \0";
void mifare_operate();
void select_balance();
//*************************mifare卡***********************end
unsigned char con_line_buff[2048];
#define DEBUG_MODE
void u_puts(char *lb) {
while (*(lb)) {
while(Disp_write_char(*lb));
lb++;
}
}
short TRACE(char * fmt, ...)
{
#ifdef DEBUG_MODE
static int line = 0;
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);
}
if(line>=8) line = 0;
#endif
}
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);
}
}
}
//给一个十六字节的第十六个字节修改为'+',
int add_puls(unsigned char *pStr)
{
int num,i;
if(*(pStr+15)<(unsigned char)0xa0) //最后一个字节不是汉字
*(pStr+15)='+';
else {
for(i=0,num=0;i<15;i++)
{
if(*(pStr+i)>(unsigned char)0xa0) num++;
}
if(num%2) //最后一个字节字节为同前一个字节为一个汉字
memcpy(pStr+14," +",2);
else //最后一个字节字节为同后一个字节为一个汉字
*(pStr+15)='+';
}
}
//======================================================================
// 返回值 == 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:
// menu - buff
// start_item - 开始显示的起始条数,0起始,为在menu中的位置
// start_line - 在哪一行显示,以显示画面为坐标 1-4
// sel_line - 哪一行需要被选中,以显示画面为坐标 1-4
// line_num - 显示的行数,1-4
//
//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;
}
//这个函数用来判断我们选择的行//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
//startline; //在画面中显示的起始地址,第一行为0
//p_menu 我们要显示的菜单
//p_cPtr; // 当前行 相对于画面来说的,起点为画面的第一行为0
// lPtr: 相对于菜单来说的,在菜单中所处的位置
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;
if(bi.qEvent==EXIT_KEY_0) return -6;//新加--08-06-10--lzm
return ret;
}
//------------------------------------------------------------------------
//mInts 显示的行数
short browse_menu2(int startline,unsigned char *p_menu,int *p_cPtr,int *p_lPtr, unsigned long mInts ) //********=====***
{
BROWINFO bi;
short ret;
//unsigned long mIntss;
/*if(strlen(p_menu)/16>mInts&&mInts!=0)
mIntss=mInts;
else mIntss=strlen(p_menu)/16;*/
if(startline>3) startline = 0;
bi.startLine = startline; //在画面中显示的起始地址,第一行为0
bi.dispLines = 4 - startline;
bi.iStr = p_menu;
bi.mInt = mInts;
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;
if(bi.qEvent==EXIT_KEY_0) return -6;//新加--08-06-10--lzm
return ret;
}
//-------------------------------------------------------------------------------------
//startline; //在画面中显示的起始地址,第一行为0
//p_cPtr; // 当前行 相对于画面来说的,起点为画面的第一行为0
// lPtr: 相对于菜单来说的,在菜单中所处的位置
//------------------------------------------------------------------------------------------
short browse_menu1(int startline,unsigned char *p_menu,int *p_cPtr,int *p_lPtr,int *event)
{
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_F3|EXIT_KEY_POWER|EXIT_KEY_F1|EXIT_KEY_COMM|EXIT_KEY_F2;// 按[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)
{
*event = EXIT_KEY_F1;
return -2;
}
if(bi.qEvent==EXIT_KEY_F3||bi.qEvent==EXIT_KEY_F2||bi.qEvent==EXIT_KEY_COMM)
{
*event = bi.qEvent;
return bi.eventSele;
}
*event = EXIT_KEY_ENTER;
return ret;
}
int browse_str(unsigned char *pstr)
{
BROWINFO bi;
int ret;
bi.iStr = pstr;
bi.mInt = strlen(pstr)/16;
bi.lineMax = 16;
bi.sFont = 0;
bi.qEvent = EXIT_KEY_F1;
ret = brow_info(&bi);
}
short input_desk_NO(int x, int y,unsigned char *pDesk_NO,unsigned char *pPrompt)
{
GETSTR_PARAM gs;
short ret;
char tmpstr[20] ,*p;
if(pPrompt<-1) memcpy(tmpstr,pPrompt,sizeof(pPrompt));
for(p=pPrompt;*p;p++)
{
if(*p==' ')
strcpy(p,p+1);
puts(tmpstr);
}
memcpy(tmpstr,0,20);
gs.qx = x;
gs.qy = y;
gs.sFont = 0;
gs.alpha = 0;
gs.pPrompt = pPrompt;
gs.nullEnable = 0;
gs.csChar = '_';
gs.pwChar = 0;
gs.spChar = 0;
gs.pStr = pDesk_NO;
gs.maxNum = 6;
gs.minNum = 1;
gs.minValue = -1;
gs.maxValue = -1;
gs.autoexit = ac_time;
gs.retNum = 0 - strlen(pDesk_NO);
gs.qEvent = EXIT_KEY_POWER|EXIT_AUTO_QUIT|EXIT_KEY_F1;
ret = huGetStr_E(&gs);
if (ret==0)
{
//strupr(pDesk_NO);
//strcat( pDesk_NO, " " );
strcpy(tmpstr,pPrompt);
strcat( tmpstr, pDesk_NO );
memcpy(g_desk_NO,pDesk_NO,4);
DispStr_CE( x, y, tmpstr, DISP_POSITION|DISP_CLRLINE );
return SUCCESSFUL;
}else{
if ( gs.qEvent==EXIT_KEY_POWER ) return -1;
if ( gs.qEvent==EXIT_AUTO_QUIT ) return -1;
if ( gs.qEvent==EXIT_KEY_F1 ) return -2;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -