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

📄 asix_kb.c

📁 基于东南大学开发的SEP3203的ARM7中的所有驱动
💻 C
📖 第 1 页 / 共 4 页
字号:
/*************************************************************************
*
* Copyright  2000 National ASIC Center, All right Reserved
*
* FILE NAME:			asix_kb.c
* PROGRAMMER:			Lingming
* Date of Creation:		2001/02/07
* 
* DESCRIPTION: 			The asix keyboard control implementation. this 
*						file defines the control related infomation. 
*
* NOTE:			 		The asixwin.c MUST include this file 
*						
*
* FUNCTIONS LIST:
* fun1(arg1,arg2)		description of func1
* fun2(arg1,arg2,arg3)	description of func2
*
* GLOBAL VARS LIST:
* 
*
**************************************************************************
* MODIFICATION HISTORY
*
* 2001/02/07	by Lingming		Creation of this file
* 2001/11/27	by Lingming		add param checking in kb_msgproc() for msg filtering							
*							
*************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

#include "asixwin.h"
#include "asixapp.h"
#include "asixwin\disp.h"
#include "resource\bitmap.h"

#include "asixwin\asix_kb.h"
#include "asixwin\kb_data.h"//the map used in this file
#include "asixwin\asix_wn.h"
#include "resource\dialpan.h"//the map used in this file is left right

//#include <hw.h>

#define SOLIVE

/* The input mode */
#define NOINPUT		0x0
#define SHOUXIE		0x01
#define FUHAO		0x02
#define SHUZI		0x04
#define PINYING		0x08
#define YINGWEN_U	0x10
#define YINGWEN_L	0x20
#define BOHAO		0x40
#define ALLINPUT	0x3f	/*If use call openinput with allow as ALLINPUT, all keyboard can be opened*/

#ifdef LCD_WIDTH160
/* Each key width and hight*/
#define EKEY_WIDTH	14	/*for U&L case of english  keyboard*/
#define EKEY_HEIGHT	15
#define FKEY_WIDTH	14	/*for simbol keyboard*/
#define FKEY_HEIGHT	19
#define NKEY_WIDTH	20	/*for number keyboard*/
#define NKEY_HEIGHT	25

#define CONTROL_ICON_WIDTH	14	/*For control icon*/
#define CONTROL_ICON_HEIGHT	15
#elif LCD_WIDTH240
/* Each key width and hight*/
#define EKEY_WIDTH	20	/*for U&L case of english  keyboard*/
#define EKEY_HEIGHT	20
#define FKEY_WIDTH	20	/*for simbol keyboard*/
#define FKEY_HEIGHT	25
#define NKEY_WIDTH	28	/*for number keyboard*/
#define NKEY_HEIGHT	33

#define CONTROL_ICON_WIDTH	20	/*For control icon*/
#define CONTROL_ICON_HEIGHT	20

#endif
/* The keyboard bitmap ,defined in kb_data.c*/
extern const U8 ukb_bitmap[];
extern const U8 lkb_bitmap[];
extern const U8 fkb_bitmap[];
extern const U8 nkb_bitmap[];
extern const U8 hkb_bitmap[];
extern const unsigned char fish9[];

/*The Control icon bitmap,defined in kb_data.c*/
extern const U8 sx_bitmap[];
extern const U8 fh_bitmap[];
extern const U8 sz_bitmap[];
extern const U8 py_bitmap[];
extern const U8 da_bitmap[];
extern const U8 xiao_bitmap[];

/*the dial pad key bitmap, defiend in kb_data.c*/
extern const U8 num_0[];
extern const U8 num_1[];
extern const U8 num_2[];
extern const U8 num_3[];
extern const U8 num_4[];
extern const U8 num_5[];
extern const U8 num_6[];
extern const U8 num_7[];
extern const U8 num_8[];
extern const U8 num_9[];
extern const U8 num_as[]; // *
extern const U8 num_pd[]; // #

//extern U16	HandWriteRecognizeType;
//extern U16	HandWriteRecognizeNum;

struct icon_list {
	U8		icon_name;
	const P_U8	icon_bmp;
};


	
static const struct icon_list IconList[]={
	SHOUXIE,	(const P_U8)sx_bitmap,			
	FUHAO,		(const P_U8)fh_bitmap,	
	SHUZI,		(const P_U8)sz_bitmap,	
	YINGWEN_U,	(const P_U8)da_bitmap,	
	YINGWEN_L,	(const P_U8)xiao_bitmap,	
	PINYING,	(const P_U8)py_bitmap,	
};

static const struct icon_list BohaoList[]={
	0x31,		(const P_U8)zi_num1,
	0x32,		(const P_U8)zi_num2,
	0x33,		(const P_U8)zi_num3,
	0x34,		(const P_U8)zi_num4,
	0x35,		(const P_U8)zi_num5,
	0x36,		(const P_U8)zi_num6,
	0x37,		(const P_U8)zi_num7,
	0x38,		(const P_U8)zi_num8,
	0x39,		(const P_U8)zi_num9,
	0x2a,		(const P_U8)zi_asterisk, // *
	0x30,		(const P_U8)zi_num0,
	0x23,		(const P_U8)zi_well, // #
};	

#ifdef SANBAO
const U16 HW_NumReturnVal[]={
0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037,0x0038,0x0039,0x0030,0x003a,0x0028,0x0029
};
#endif

static U8 openinput(U16 y,U8 mode, U8 allow, struct kbd_ctrl *kbctrl);
static void closeinput(struct kbd_ctrl *kbctrl);
//static STATUS AsixOpenInputPad(U16 xPos, U16 yPos, U16 numRow, U16 numCol, 
//			U16 areaWidth, U16 areaHeight, U16 echoCol, U16 echoWidth,
//			U32 timeOut, U16 samplingRate, U8 areaClean, U16 stackSize);
//static STATUS AsixRecoverInputPad();
STATUS SysOpenSoftKey(U32 pGC,P_U32 areaId,U16 xPos,U16 yPos,U16 keyWidth,U16 keyHeight,U16 numCol,U16 numRow,P_U16 keyMap,P_U8 bitMap);			
STATUS SysCloseSoftKey ( DWORD areaId );    
PUBLIC STATUS kbd_repaint( void *ctrl_str, U32 lparam);

extern char *py_ime( char *strInput_py_str, unsigned char *num );

static U8 openinput(U16 y,U8 mode, U8 allow, struct kbd_ctrl *kbctrl) {
	
	register U16	xSrc,ySrc;
	register U8		i,j;
	register U16	position_temp=0;
	U16 xSrc1;
	WORD Len1; 
	U16				rv;	
	ASIX_WINDOW		*CurWindow;			  //add by dsa 2002/04/17
	DWORD			bmp;
	CurWindow =(ASIX_WINDOW *)GetCurWindow();//add by dsa 2002/04/17

	if (kbctrl == NULL) return NOINPUT;
	
	kbctrl->allowed_btm = allow;
	kbctrl->cur_y = y;
	
	if ((mode & kbctrl->allowed_btm) == 0) {
		
		return kbctrl->cur_mode;
	}
	
	if (kbctrl->cur_mode!=NOINPUT) closeinput(kbctrl);
	
	if ( mode == BOHAO ) {
//	if ( (mode == BOHAO) && (y > LCD_HEIGHT - 180) ) {
		//kbctrl->cur_y = LCD_HEIGHT-180;
	} else if (y > LCD_HEIGHT-76) {
		kbctrl->cur_y = LCD_HEIGHT-76;//here from 75 to 76,modified by dsa 2002/04/25
	}		
	
	ySrc = kbctrl->cur_y;
	
	//if (mode==SHOUXIE)
	//	kbctrl->cur_x=1+3*CONTROL_ICON_WIDTH;
	//else if( mode != BOHAO )
#ifdef LCD_WIDTH160
	kbctrl->cur_x=(LCD_WIDTH-154)/2;
#elif LCD_WIDTH240
	kbctrl->cur_x=(LCD_WIDTH-214)/2;
#endif

	xSrc = kbctrl->cur_x;
		
	for(i=0;(i<5) && (mode != BOHAO) ;i++) {
		for(j=0;j<6;j++) {
			if (mode!=IconList[j].icon_name && kbctrl->icon_select_map[j]==UNSELECTED) {
				kbctrl->CtrlIcon[i].icon_name=IconList[j].icon_name;
					
				if ( (kbctrl->CtrlIcon[i].icon_name & kbctrl->allowed_btm)!=0 ){
					position_temp=ySrc+i*CONTROL_ICON_HEIGHT;
					ActiveAreaEnable( (P_U32)&( kbctrl->CtrlIcon[i].icon_id ), ICON_AREA,\
					CONTINUOUS_MODE, xSrc, position_temp, xSrc+CONTROL_ICON_WIDTH,\
					position_temp+CONTROL_ICON_HEIGHT,kbctrl->wndid );
//modified by dsa 2002/04/17
//					switchonetotwo(IconList[j].icon_bmp, xSrc, position_temp,\
//					CONTROL_ICON_WIDTH, CONTROL_ICON_HEIGHT);
//					SysDrawMonoImage(kbctrl->pGC,IconList[j].icon_bmp,xSrc,position_temp,\
//						CONTROL_ICON_WIDTH,CONTROL_ICON_HEIGHT,GPC_BLACK,GPC_WHITE);
					bmp=LoadBitmap(IconList[j].icon_bmp, NULL );
					DisplayBMP(kbctrl->pGC,xSrc, position_temp,bmp);
					FreeBitmap(bmp);
				} else {
//modified by dsa 2002/04/17
//					Advswitchonetotwo(IconList[j].icon_bmp, xSrc, ySrc+i*CONTROL_ICON_HEIGHT,\
//					CONTROL_ICON_WIDTH, CONTROL_ICON_HEIGHT, BLACK_TO_DARKGREY, WHITE_TO_WHITE);
//					SysDrawMonoImage(kbctrl->pGC,IconList[j].icon_bmp,xSrc,ySrc+i*CONTROL_ICON_HEIGHT,\
//						CONTROL_ICON_WIDTH,CONTROL_ICON_HEIGHT,GPC_WHITE,GPC_BLACK);
					bmp=LoadBitmap(IconList[j].icon_bmp, NULL );
					DisplayBMP(kbctrl->pGC,xSrc,ySrc+i*CONTROL_ICON_HEIGHT,bmp);
					FreeBitmap(bmp);
				}
				kbctrl->icon_select_map[j] = BEENSELECTED;
				break;
			}
		}
	}			
	
	for (i=0; (i<5) && (mode != BOHAO) ;i++) {
		position_temp =	ySrc+(i+1)*CONTROL_ICON_HEIGHT;
		DrawLine(kbctrl->pGC,WHITE,xSrc,position_temp,xSrc+CONTROL_ICON_WIDTH,\
		position_temp, GPC_SOLID_LINE,REPLACE_STYLE);//modified 0 with GPC_SOLID_LINE
	}	
	
	
	if( mode != BOHAO )
		xSrc += CONTROL_ICON_WIDTH;
	
	switch (mode)
	{
		case YINGWEN_L:
			if (SysOpenSoftKey(kbctrl->pGC,&kbctrl->areaId,xSrc,ySrc,EKEY_WIDTH,EKEY_HEIGHT,10,5,(const P_U16)l_keyboard,(const P_U8)lkb_bitmap)!=PPSM_OK) kbctrl->cur_mode=NOINPUT;
			else{ 
				
				kbctrl->cur_mode=YINGWEN_L;
			}	
			break; 
		case YINGWEN_U:
			if (SysOpenSoftKey(kbctrl->pGC,&kbctrl->areaId,xSrc,ySrc,EKEY_WIDTH,EKEY_HEIGHT,10,5,(const P_U16)u_keyboard,(const P_U8)ukb_bitmap)!=PPSM_OK) kbctrl->cur_mode=NOINPUT;
			else{ 
				
				kbctrl->cur_mode=YINGWEN_U;
			}
			break; 
		case SHUZI:
			if (SysOpenSoftKey(kbctrl->pGC,&kbctrl->areaId,xSrc,ySrc,NKEY_WIDTH,NKEY_HEIGHT,7,3,(const P_U16)n_keyboard,(const P_U8)nkb_bitmap)!=PPSM_OK) kbctrl->cur_mode=NOINPUT;
			else{ 
				
				kbctrl->cur_mode=SHUZI;
			}	
			break;
		case FUHAO:
			if (SysOpenSoftKey(kbctrl->pGC,&kbctrl->areaId,xSrc,ySrc,FKEY_WIDTH,FKEY_HEIGHT,10,4,(const P_U16)f_keyboard,(const P_U8)fkb_bitmap)!=PPSM_OK) kbctrl->cur_mode=NOINPUT;
			else kbctrl->cur_mode=FUHAO;
			break;
		case PINYING:
			kbctrl->cur_mode=PINYING;
			kbctrl->Pycb = (struct py_control_block *)Lcalloc( sizeof(struct py_control_block) );
			if ( kbctrl->Pycb == NULL) 
			{
				kbctrl->cur_mode=NOINPUT;
				break;
			}
			if (( kbctrl->PY_Icon = Lcalloc( 7*sizeof(struct data_icon)))==NULL)
			{
				kbctrl->cur_mode=NOINPUT;
				break;
			}
			
			if (SysOpenSoftKey(kbctrl->pGC,&kbctrl->areaId,xSrc,ySrc,EKEY_WIDTH,EKEY_HEIGHT,10,5,(const P_U16)l_keyboard,(const P_U8)lkb_bitmap)!=PPSM_OK){
				 kbctrl->cur_mode=NOINPUT;
				 break;
			}
			
			for (i=0;i<7;i++) {
				position_temp = (LCD_WIDTH-CHAR_WIDTH*7)/2+i*CHAR_WIDTH;
				if ( ActiveAreaEnable((P_U32)&(kbctrl->PY_Icon[i].icon_id),ICON_AREA,CONTINUOUS_MODE,\
				position_temp, ySrc-CHAR_WIDTH-1,position_temp+CHAR_WIDTH-1,ySrc-2,kbctrl->wndid) !=PPSM_OK) {
					kbctrl->cur_mode=NOINPUT;
					break;
				}
				else
					ActiveAreaSuspend(kbctrl->PY_Icon[i].icon_id,AREA_SUSPEND);
			}
			DrawRec(kbctrl->pGC,GPC_BLACK,(LCD_WIDTH-CHAR_WIDTH*7)/2-1,ySrc-CHAR_WIDTH-2,(LCD_WIDTH-CHAR_WIDTH*7)/2+CHAR_WIDTH*7,ySrc-1,GPC_SOLID_LINE,GPC_REPLACE_STYLE);
//			DrawRec(kbctrl->pGC,GPC_BLACK,24,ySrc-18,136,ySrc,GPC_SOLID_LINE,GPC_XOR_STYLE);
			
			if( ActiveAreaEnable((P_U32)&(kbctrl->PY_LeftButtonId),ICON_AREA,CONTINUOUS_MODE,
			(LCD_WIDTH-CHAR_WIDTH*7)/2-10, ySrc-CHAR_WIDTH-2,(LCD_WIDTH-CHAR_WIDTH*7)/2-3,ySrc-1,kbctrl->wndid) != PPSM_OK) 
			{
				kbctrl->cur_mode=NOINPUT;
				break;
			}
			else
			{
				ActiveAreaSuspend(kbctrl->PY_LeftButtonId,AREA_SUSPEND);
			}
			if( ActiveAreaEnable((P_U32)&(kbctrl->PY_RightButtonId),ICON_AREA,CONTINUOUS_MODE,
			(LCD_WIDTH-CHAR_WIDTH*7)/2+CHAR_WIDTH*7+2, ySrc-CHAR_WIDTH-2,(LCD_WIDTH-CHAR_WIDTH*7)/2+CHAR_WIDTH*7+9,ySrc-1,kbctrl->wndid) !=PPSM_OK)
			{
				kbctrl->cur_mode=NOINPUT;
				break;	
			}
			else
			{
				ActiveAreaSuspend(kbctrl->PY_RightButtonId,AREA_SUSPEND);
			}
//			PutRec(kbctrl->pGC,left,(LCD_WIDTH-CHAR_WIDTH*7)/2-10, ySrc-CHAR_WIDTH-2,CHAR_WIDTH/2+2,CHAR_WIDTH+2,GPC_REPLACE_STYLE,0);
//			PutRec(kbctrl->pGC,right,(LCD_WIDTH-CHAR_WIDTH*7)/2+CHAR_WIDTH*7+2, ySrc-CHAR_WIDTH-2,CHAR_WIDTH/2+2,CHAR_WIDTH+2,GPC_REPLACE_STYLE,0);
			{
				U32	palette[] = { GPC_BLACK,GPC_WHITE};

				bmp=LoadBitmap(left, palette);
//				SetBMPPalette( bmp, palette, NULL );
				DisplayBMP(kbctrl->pGC,(LCD_WIDTH-CHAR_WIDTH*7)/2-10,ySrc-CHAR_WIDTH-2,bmp);
				FreeBitmap(bmp);
				bmp=LoadBitmap(right, palette);
//				SetBMPPalette( bmp, palette, NULL );
				DisplayBMP(kbctrl->pGC,(LCD_WIDTH-CHAR_WIDTH*7)/2+CHAR_WIDTH*7+2,ySrc-CHAR_WIDTH-2,bmp);
				FreeBitmap(bmp);
			}
			break;
			
		case SHOUXIE:
			kbctrl->cur_mode=SHOUXIE;
		
		#ifdef SOLIVE
//			HandWriteRecognizeNum = 7;
//			HandWriteRecognizeType = ALC_CHINESE_COMMON | ALC_CHINESE_RARE;
			
			if (( kbctrl->HW_Icon1 = Lcalloc( 10*sizeof(struct data_icon)))==NULL)
			{
				kbctrl->cur_mode=NOINPUT;
				break;
			}
//			if (( kbctrl->HW_Icon2 = Lcalloc( 9*sizeof(struct data_icon)))==NULL)
//			{
//				kbctrl->cur_mode=NOINPUT;
//				break;
//			}
		#endif

        #ifdef LCD_WIDTH160
			xSrc1 = xSrc + 125;
			Len1 = 130;
        #elif LCD_WIDTH240
			xSrc1 = xSrc + 180;
			Len1 = 190;
		#endif

			if (SysOpenSoftKey(kbctrl->pGC,&kbctrl->areaId,xSrc1,ySrc,EKEY_WIDTH,EKEY_HEIGHT,1,5,(const P_U16)h_keyboard,(const P_U8)hkb_bitmap)!=PPSM_OK)
			{
				kbctrl->cur_mode=NOINPUT;
				break;
			}
			//AppSwap(TRUE);
//modified by dsa 2002/04.18			
//			rv = AdvOpenInputPad(xSrc,ySrc,1,2,65,75,BLACK,2,800, 50,1,2048);
			rv = SysAdvOpenInputPad( &( kbctrl->areaId1 ),kbctrl->wndid,xSrc,ySrc,1,1,Len1,75,GPC_WHITE,GPC_NORM_WIDTH);
			if ( rv != PPSM_OK )
			{
				#ifdef ASIX_DEBUG
				
					Disp16String("Error@",1,1);
				
				#endif
				
				kbctrl->cur_mode=NOINPUT;
				break;
			}
			
			kbctrl->inputpad_x = xSrc;
			kbctrl->inputpad_y = ySrc;
			/* we set the status bit in the parent win*/
			CurWindow->status |= WST_HANDWRITE;
			/* the inputpad can not overlap other activearea, so we must suspent the
			parent window's client area */
			ActiveAreaSuspend( ( (struct wn_ctrl *)CurWindow->ctrl_str )->clientid, AREA_SUSPEND);
			//ActiveAreaPosition( ((struct wn_ctrl *)CurWindow->ctrl_str)->clientid, );

		#ifdef SOLIVE
			for (i=0;i<10;i++){
				position_temp = (LCD_WIDTH-CHAR_WIDTH*10)/2+i*CHAR_WIDTH;
				if ( ActiveAreaEnable((P_U32)&(kbctrl->HW_Icon1[i].icon_id), ICON_AREA, CONTINUOUS_MODE,\
				position_temp, ySrc-CHAR_WIDTH-1, position_temp+CHAR_WIDTH-1, ySrc-2,kbctrl->wndid) !=PPSM_OK) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -