📄 mmi_touchpanel.c
字号:
/*****************************************************************************
** 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 + -