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

📄 mmi_touchpanel.c

📁 嵌入式展讯mmi层kernel的c 源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*****************************************************************************
** File Name:      mmi_touchpanel.c                                          *
** Author:                                                                   *
** Date:           11/2005                                                   *
** Copyright:      Shenzhen Radio Communication Co.,Ltd. All Rights Reserved.*
** Description:    This file is used to touch panel                          *
******************************************************************************
**                         Important Edit History                            *
** --------------------------------------------------------------------------*
** DATE           NAME             DESCRIPTION                               *
** 2005-11-19     liukaizan        Create
******************************************************************************/

/**--------------------------------------------------------------------------*
 **                         Include Files                                    *
 **--------------------------------------------------------------------------*/
#include "mmk_app.h"
#include "mmi_nv.h"
#include "window_parse.h"
#include "dal_lcd.h"
#include "guicommon.h"
#include "cmddef.h"
#include "mmidisplay_data.h"
#include "mmi_touchpanel.h"
#include "mmi_text.h"
#include "HWTP_manage_FS.h"
#include "HW_recog_FS.h"
#include "mmi_sysinfo.h"
#include "guifont.h"

#define TP_DELTA_VALUE				50
#define LCD_DELTA_VALUE				20
	
#define TP_SCALE_VALUE				1024

#define TP_CALIBRATEION_OFFSET_X	30
#define TP_CALIBRATEION_OFFSET_Y	30
#define TP_CALIBRATEION_LEFT		TP_CALIBRATEION_OFFSET_X
#define TP_CALIBRATEION_TOP			TP_CALIBRATEION_OFFSET_Y

#define ABS(v)	(((int32)(v)) < 0 ? -((int32)(v)) : ((int32)(v)))

void MMI_ProcessMsg();
BOOLEAN TP_SendPoint(int16, int16, uint8);
void TPSampleCallBackSet(BOOLEAN (*callback)(int16, int16, uint8));
void TPSetCalibration(int32 x0, int32 y0, int32 dX, int32 dY, int32 scale);

/**--------------------------------------------------------------------------*
			                         GLOBAL DEFINITION
 **--------------------------------------------------------------------------*/

/*---------------------------------------------------------------------------*/
/*                          LOCAL FUNCTION DECLARE                           */
/*---------------------------------------------------------------------------*/
/*****************************************************************************/
// 	Description : 取Touch Panel校准值
//	Global resource dependence : 
//  Author: liukaizan
//	Note:
/*****************************************************************************/
LOCAL BOOLEAN MMI_LoadTPCalibration(int32 *x0, int32 *y0, int32 *dX, int32 *dY)
{
	int32					value[6];
	ERR_MNDATAMAG_CODE_E	err;
	MMINV_READ(MMINV_TP_CALIBRATEION_INFO, value, err);
	if (ERR_MNDATAMAG_NO_ERR == err)
	{
		if (value[0]+value[1]+value[2]+value[3]+value[4] == value[5] &&
			TP_SCALE_VALUE == value[4] )
		{
			*x0	= value[0];
			*y0	= value[1];
			*dX	= value[2];
			*dY	= value[3];
			return TRUE;
		}		
	}
	return FALSE;
}

/*****************************************************************************/
// 	Description : 存Touch Panel校准值
//	Global resource dependence : 
//  Author: liukaizan
//	Note:
/*****************************************************************************/
LOCAL BOOLEAN MMI_SaveTPCalibration(int32 x0, int32 y0, int32 dX, int32 dY)
{
	int32 value[6];
	value[0] = x0; 
	value[1] = y0; 
	value[2] = dX; 
	value[3] = dY; 
	value[4] = TP_SCALE_VALUE;
	value[5] = value[0]+value[1]+value[2]+value[3]+value[4];
	MMINV_WRITE(MMINV_TP_CALIBRATEION_INFO, value);
	return TRUE;
}

/*****************************************************************************/
// 	Description : 处理Touch Panel校准窗口的消息
//	Global resource dependence : 
//  Author: liukaizan
//	Note:
/*****************************************************************************/
LOCAL MMI_RESULT_E TPCalibrationHandler (
									 MMI_WINDOW_ID_E		win_id, 	// 窗口的ID
									 MMI_MESSAGE_ID_E 		msg_id, 	// 窗口的内部消息ID
									 DPARAM 		        param		// 相应消息的参数
									 );

/*****************************************************************************/
// 	Description : Touch Panel的绘制窗口
//	Global resource dependence : 
//  Author: hongbing
//	Note:
/*****************************************************************************/
LOCAL MMI_RESULT_E TP_PaintHandler (
									 MMI_WINDOW_ID_E		win_id, 	// 窗口的ID
									 MMI_MESSAGE_ID_E 		msg_id, 	// 窗口的内部消息ID
									 DPARAM 		        param		// 相应消息的参数
									 );
LOCAL void TP_DrawLine(GUI_POINT_T point_pos, GUI_POINT_T old_point);
LOCAL void TP_DrawPoint (GUI_POINT_T point_pos);

/**--------------------------------------------------------------------------*
 **                         CONSTANT VARIABLES                               *
 **--------------------------------------------------------------------------*/
// the window for startup normal
WINDOW_TABLE( TOUCH_PANEL_CALIBRATION_WIN_TAB ) = 
{
    CLEAR_LCD,
    WIN_PRIO( WIN_ONE_LEVEL ),
    WIN_FUNC( (uint32)TPCalibrationHandler ),    
    WIN_ID( TOUCH_PANEL_CALIBRATION_WIN_ID ),    
    END_WIN
};


// the window for test tp paint blank
WINDOW_TABLE( TOUCH_PANEL_PAINT_WIN_TAB ) = 
{
    CLEAR_LCD,
    WIN_PRIO( WIN_TWO_LEVEL ),
    WIN_FUNC( (uint32)TP_PaintHandler ),    
    WIN_ID( TOUCH_PANEL_PAINT_WIN_ID ),    
    END_WIN
};

/*****************************************************************************/
// 	Description : 处理Touch Panel校准窗口的消息
//	Global resource dependence : 
//  Author: liukaizan
//	Note:
/*****************************************************************************/
LOCAL MMI_RESULT_E TPCalibrationHandler (
									 MMI_WINDOW_ID_E		win_id, 	// 窗口的ID
									 MMI_MESSAGE_ID_E 		msg_id, 	// 窗口的内部消息ID
									 DPARAM 		        param		// 相应消息的参数
									 )
{		
	MMI_RESULT_E		result = MMI_RESULT_TRUE;
	
	BOOLEAN				bForce = (BOOLEAN)(long)MMK_GetWinAddDataPtr(win_id);
	MMI_STRING_T        string_info;
	static uint8		s_curTarget;
	static GUI_POINT_T	s_imgSize;
	GUI_POINT_T gTarget[5] = { 
		{ TP_CALIBRATEION_LEFT,  TP_CALIBRATEION_TOP },
		{ TP_CALIBRATEION_LEFT, TP_CALIBRATEION_TOP },
		{ TP_CALIBRATEION_LEFT,  TP_CALIBRATEION_TOP },
		{ TP_CALIBRATEION_LEFT,  TP_CALIBRATEION_TOP },
		{ TP_CALIBRATEION_LEFT,  TP_CALIBRATEION_TOP },
	};
	static GUI_POINT_T	pos[sizeof(gTarget)/sizeof(gTarget[0])];
	static int32		value[4];
	GUI_POINT_T         text_point;
	uint16 text_string_width;
	uint16 text_string_higth;

	uint8     disp_font = MMI_NORMAL_TEXT_FONT;

	uint16 TP_CALIBRATEION_RIGHT = (MMI_GetScreenRect().right - TP_CALIBRATEION_OFFSET_X);
	uint16 TP_CALIBRATEION_BOTTOM =	(MMI_GetScreenRect().bottom -TP_CALIBRATEION_OFFSET_Y);
	gTarget[1].x = TP_CALIBRATEION_RIGHT;
	gTarget[2].y = TP_CALIBRATEION_BOTTOM;
	gTarget[3].x = TP_CALIBRATEION_RIGHT;
	gTarget[3].y = TP_CALIBRATEION_BOTTOM;
	gTarget[4].x = (TP_CALIBRATEION_RIGHT+TP_CALIBRATEION_LEFT)/2;
	gTarget[4].y = (TP_CALIBRATEION_BOTTOM+TP_CALIBRATEION_TOP)/2;
	
	MMI_GetLabelText(TXT_SYSSET_PENCHECK_PROMPT, &string_info);
	text_string_width = GUI_CalculateStringPiexlNum(string_info.str_ptr,string_info.length,string_info.is_ucs2,disp_font,0);
	text_string_higth = GUI_GetFontHeight(disp_font,string_info.is_ucs2);
	switch (msg_id)
	{
	case MSG_OPEN_WINDOW:		
		SCI_TRACE_LOW("TPCalibrationHandler: MSG_OPEN_WINDOW");
		s_curTarget = 0;
		s_imgSize.x = GUI_GetImageWidth(IMAGE_SYSSET_CALIBRATION);
		s_imgSize.y = GUI_GetImageHight(IMAGE_SYSSET_CALIBRATION);
		TPSetCalibration(0, 0, 1, 1, 1);
		//MMI_LOCKKBD_DisableAutolock();  //笔点校对界面不允许锁键盘
		//MMILOCKKBD_TPEvent(TRUE); //关闭锁键盘定时器
		break;

	case MSG_FULL_PAINT:		
		SCI_TRACE_LOW("TPCalibrationHandler: MSG_FULL_PAINT");
		{
			LCD_INFO_T lcdInfo;
			LCD_GetInfo(FULL_LCD_ID, &lcdInfo);
			memset(lcdInfo.lcdbuff_ptr, 0xff, lcdInfo.lcd_width*lcdInfo.lcd_height*2); 
		}
		GUI_DisplayStaticBmp(FULL_LCD_ID, 0, 0, IMAGE_SYSSET_CALIBRATION_BG);
		IMG_EnableTransparentColor(TRUE);
		GUI_DisplayStaticBmp(FULL_LCD_ID, (uint16)(gTarget[s_curTarget].x-s_imgSize.x/2), 
							(uint16)(gTarget[s_curTarget].y-s_imgSize.y/2), IMAGE_SYSSET_CALIBRATION);
		IMG_EnableTransparentColor(FALSE);
		switch(s_curTarget)
		{
			case 0:
				text_point.x = (uint16)(gTarget[s_curTarget].x+s_imgSize.x/2) + 1;
				text_point.y = (uint16)(gTarget[s_curTarget].y+s_imgSize.y/2) - LCD_STATUS_H;
				break;
			case 1:
				text_point.x = (uint16)(gTarget[s_curTarget].x-s_imgSize.x/2) - text_string_width -1;
				text_point.y = (uint16)(gTarget[s_curTarget].y+s_imgSize.y/2) - LCD_STATUS_H;
				break;
			case 2:
				text_point.x = (uint16)(gTarget[s_curTarget].x+s_imgSize.x/2) +1;
				text_point.y = (uint16)(gTarget[s_curTarget].y-s_imgSize.y/2) - LCD_STATUS_H - text_string_higth;
				break;
			case 3:
				text_point.x = (uint16)(gTarget[s_curTarget].x-s_imgSize.x/2) - text_string_width -1;
				text_point.y = (uint16)(gTarget[s_curTarget].y-s_imgSize.y/2) - LCD_STATUS_H - text_string_higth;
			break;
			case 4:
				text_point.x = (uint16)(gTarget[s_curTarget].x) - text_string_width/2;
				text_point.y = (uint16)(gTarget[s_curTarget].y+s_imgSize.y/2) - LCD_STATUS_H ; 
	
			break;
		}

		LCD_DisplayString(MAIN_LCD_ID,
					text_point,
					string_info.str_ptr,
					string_info.length,
					0,
					MMI_BLACK_COLOR,
					disp_font,
					string_info.is_ucs2,
					0);

#ifndef WIN32
		LCD_Invalidate(MAIN_LCD_ID);
#else	
		MMI_UpdataEmulatorWin();		
#endif
		break;

	case MSG_CLOSE_WINDOW:	
		SCI_TRACE_LOW("TPCalibrationHandler: MSG_CLOSE_WINDOW");
		if (s_curTarget < sizeof(gTarget)/sizeof(gTarget[0]))
		{
			// load nv-item then reset calibration
			int32 x0, y0, dX, dY;
			if (MMI_LoadTPCalibration(&x0, &y0, &dX, &dY))
			{
				TPSetCalibration(x0, y0, dX, dY, TP_SCALE_VALUE);
			}			
		}
		break;

	case MSG_LOSE_FOCUS:
		SCI_TRACE_LOW("TPCalibrationHandler: MSG_LOSE_FOCUS");
		MMK_CloseWin(win_id);
		break;

	case MSG_APP_UP:
		SCI_TRACE_LOW("TPCalibrationHandler: MSG_APP_UP, bForce is %d", bForce);
		//if (bForce)
			MMK_CloseWin(win_id);
		break;
		
	case MSG_APP_RED:
		SCI_TRACE_LOW("TPCalibrationHandler: MSG_APP_RED");
		result = MMI_RESULT_FALSE;
		break;
		
	case MSG_TP_DOWN:
	case MSG_TP_MOVE:
	case MSG_TP_UP:
		SCI_TRACE_LOW("TPCalibrationHandler: MSG_TP_XXXX (%d, %d)...", ((TP_POINT_PTR)param)->x, ((TP_POINT_PTR)param)->y);
		if (MSG_TP_UP == msg_id)
		{
			BOOLEAN is_ivalid = TRUE;
			SCI_TRACE_LOW("TPCalibrationHandler: MSG_TP_UP");
			pos[s_curTarget].x = ((TP_POINT_PTR)param)->x;
			pos[s_curTarget].y = ((TP_POINT_PTR)param)->y;
			switch (s_curTarget)
			{
				case 4:
					if (ABS(pos[4].x - gTarget[4].x) > LCD_DELTA_VALUE ||
						ABS(pos[4].y - gTarget[4].y) > LCD_DELTA_VALUE) 
					{ 
						is_ivalid = FALSE;
						TPSetCalibration(0, 0, 1, 1, 1);
						break; 
					}
					// save to nv-item
					MMI_SaveTPCalibration(value[0], value[1], value[2], value[3]);
					break;
					
				case 3:
					if (ABS(pos[1].x - pos[3].x) > TP_DELTA_VALUE) { is_ivalid = FALSE; break; }
					if (ABS(pos[2].y - pos[3].y) > TP_DELTA_VALUE) { is_ivalid = FALSE; break; }
				case 2:					
					if (ABS(pos[0].x - pos[2].x) > TP_DELTA_VALUE) { is_ivalid = FALSE; break; }
				case 1:
					if (ABS(pos[0].y - pos[1].y) > TP_DELTA_VALUE) { is_ivalid = FALSE; break; }
					if (s_curTarget == 3)
					{
						int32 x0, y0, dX, dY;
						//int32 *value = (int32*)pos;
						dX = ((int32)(gTarget[1].x - gTarget[0].x)) * (TP_SCALE_VALUE * 2) / (pos[1].x-pos[0].x+pos[3].x-pos[2].x);
						dY = ((int32)(gTarget[2].y - gTarget[0].y)) * (TP_SCALE_VALUE * 2) / (pos[2].y-pos[0].y+pos[3].y-pos[1].y);
						x0 = pos[0].x-((int32)gTarget[0].x)*TP_SCALE_VALUE/dX;

⌨️ 快捷键说明

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