[FAQ06834] [TouchPanel]TouchPanel的虚拟按键没有震感 |
FAQ Content
【问题描述】
Setting->情景模式->使能振动选项,TP虚拟按键无振动效果 【问题原因】
在TouchPanel的driver中,如果虚拟按键是以 input_report_key(tpd->kpd, key_code, key_val);方式上报key值,是不会有触感的。
如果虚拟按键是以坐标形式上报,如下所示:
input_report_abs(tpd->dev, ABS_MT_POSITION_X, x);
input_report_abs(tpd->dev, ABS_MT_POSITION_Y, y); 上报的,就会有触感。
【解决方法】
把虚拟按键以坐标的形式上报。
1,TPD_HAVE_BUTTON宏要打开:#define TPD_HAVE_BUTTON
2,定义按键的坐标位置(具体定义,可以参考 FAQ03862 --电容屏客制化文件vitual key的配置)
#define TPD_BUTTON_HEIGH 100
#define TPD_KEY_COUNT 3 #define TPD_KEYS { KEY_MENU, KEY_HOME,KEY_BACK} #define TPD_KEYS_DIM {{80,850,160,TPD_BUTTON_HEIGH},{240,850,160,TPD_BUTTON_HEIGH},{400,850,160,TPD_BUTTON_HEIGH}} 3, 从TouchPanel中读到的虚拟按键数据有两种,一种是key值(1,2,3),另一种是报的坐标值((x,y));
如果读出的虚拟按键值为坐标,那直接按TouchPanel报坐标点的方式上报就OK了。
如果是key值,那就需要把key人为的转为坐标,然后在上报。
【例子】
以msg2133为列,它的虚拟按键读取的为key值,需要转成坐标上报,code如下:
static void tpd_down(int x, int y, int p, int id) {
input_report_abs(tpd->dev, ABS_MT_TOUCH_MAJOR, 100);
input_report_abs(tpd->dev, ABS_PRESSURE, 100); input_report_key(tpd->dev, BTN_TOUCH, 1); input_report_abs(tpd->dev, ABS_MT_POSITION_X, x); input_report_abs(tpd->dev, ABS_MT_POSITION_Y, y); /* track id Start 0 */
//input_report_abs(tpd->dev, ABS_MT_TRACKING_ID, p); input_mt_sync(tpd->dev); if (FACTORY_BOOT == get_boot_mode()|| RECOVERY_BOOT == get_boot_mode()) { tpd_button(x, y, 1); } if(y > TPD_RES_Y) //virtual key debounce to avoid android ANR issue { msleep(50); TPD_DEBUG("D virtual key \n"); } TPD_EM_PRINT(x, y, x, y, id, 1); } static void tpd_up(int x, int y,int *count) { input_report_key(tpd->dev, BTN_TOUCH, 0);
input_mt_sync(tpd->dev); TPD_EM_PRINT(x, y, x, y, 0, 0); if(FACTORY_BOOT == get_boot_mode()|| RECOVERY_BOOT == get_boot_mode()) { TPD_DEBUG(KERN_ERR "[msg2133a]--tpd_up-BOOT MODE--X:%d, Y:%d; \n", x, y); tpd_button(x, y, 0); } } static void tpd_key(int key_code, int key_val)
{ input_report_key(tpd->kpd, key_code, key_val); TPD_DEBUG(KERN_ERR "[msg2133a] key_code = %d(%d)\n", key_code, key_val); } static void tpd_check_key(int *key, int *is_down) { static int pre_key = 0; int cur_key; if (*key == 1) cur_key = KEY_MENU; else if (*key == 2) cur_key = KEY_HOME; else if (*key == 4) cur_key = KEY_BACK; else cur_key = 0; if ((pre_key != 0) && (cur_key != pre_key)) { // current key is different from previous key, then need to send key up cur_key = pre_key; pre_key = 0; *is_down = 0; } else { pre_key = cur_key; *is_down = 1; } *key = cur_key; }
static int touch_event_handler(void *unused) { TouchScreenInfo_t touchData; u8 touchkeycode = 0; static u32 preKeyStatus = 0; int i=0; TPD_DEBUG(KERN_ERR "[msg2133a]touch_event_handler() do while \n"); touchData.nFingerNum = 0;
TPD_DEBUG(KERN_ERR "[msg2133a]touch_event_handler() do while \n"); if (tpd_touchinfo(&touchData)) { TPD_DEBUG(KERN_ERR "[msg2133a]--KeyMode:%d, KeyCode:%d, FingerNum =%d \n", touchData.nTouchKeyMode, touchData.nTouchKeyCode, touchData.nFingerNum ); //key event if( touchData.nTouchKeyMode ) { //report key 以报key的方式上报数据,虚拟按键不会有触感 #if 0 int key_code = touchData.nTouchKeyCode; int key_val; tpd_check_key(&key_code, &key_val);
tpd_key(key_code, key_val); input_sync(tpd->kpd); goto TPD_EVENT_END;
#else //report coordinate 把key值转变为坐标值,然后在上报数据,此时就会有震感。 touchData.nFingerNum = 1; if( touchData.nTouchKeyCode == 1 ) { //touchkeycode = KEY_MENU; touchData.Point[0].X = 80; touchData.Point[0].Y = 850; } if( touchData.nTouchKeyCode == 2 ) { //touchkeycode = KEY_HOMEPAGE ; touchData.Point[0].X = 240; touchData.Point[0].Y = 850; }
if( touchData.nTouchKeyCode == 4 ) { //touchkeycode = KEY_BACK; touchData.Point[0].X = 400; touchData.Point[0].Y = 850; }
if( touchData.nTouchKeyCode == 8 ) { //touchkeycode = KEY_SEARCH; //touchData.Point[0].X = 560; //touchData.Point[0].Y = 850; }
#endif } //Touch event if( ( touchData.nFingerNum ) == 0 ) //touch end { TPD_DEBUG("------UP------ \n"); TPD_DEBUG(KERN_ERR "[msg2133a]---X:%d, Y:%d; \n", touchData.Point[0].X, touchData.Point[0].Y); tpd_up(touchData.Point[0].X, touchData.Point[0].Y, 0); input_sync( tpd->dev ); } else //touch on screen { TPD_DEBUG("------DOWN------ \n"); for( i = 0; i < ( (int)touchData.nFingerNum ); i++ ) { tpd_down(touchData.Point[i].X, touchData.Point[i].Y, 1, i); TPD_DEBUG(KERN_ERR "[msg2133a]---X:%d, Y:%d; i=%d \n", touchData.Point[i].X, touchData.Point[i].Y, i); } input_sync( tpd->dev ); } } TPD_EVENT_END:
mt_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM); return 0; } |
相关推荐
Touch Panel触摸屏界面编写软件
NI LabVIEW 2010 Touch Panel Module破解
【touchpanel测试程序】 在IT领域,触摸屏(Touch Panel,简称TP)是人机交互的重要组成部分,尤其在智能手机、平板电脑以及各种嵌入式设备中广泛应用。"touchpanel测试程序"是一个专用于验证触控屏功能是否正常的...
Touch.Panel.Module.V8.6破解机
The LabVIEW Touch Panel Module extends the LabVIEW graphical development environment to Touch Panel devices so you can create human-machine interface (HMI) applications for Touch Panel devices running...
TouchPanel问题集锦
- **获取方式**:选择“开始”->“所有程序”->“National Instruments”->“LabVIEW”->“Readme”并打开“readme_TouchPanel.html”文件。 以上内容详细介绍了如何使用LabVIEW Touch Panel Module 2010创建和调试...
好多人都在找labview touch panel, 找了好久分享给大家,自己也下载使用,没有任何问题,请大家放心下载使用
开发LPC1788 LCD TouchPanel程序通常会用到嵌入式开发环境,如Keil uVision或IAR Embedded Workbench,这些IDE支持C/C++编程,并有对应的LPC1788库函数和硬件抽象层(HAL)。此外,NXP官方提供的LPCXpresso工具和...
LabVIEW v8.6 版本是其历史上的一个重要里程碑,它引入了许多新特性和改进,其中特别值得一提的是“触摸屏模块”(Touch Panel Module)。此模块的出现,极大地拓展了LabVIEW在嵌入式系统和人机交互界面设计上的应用...
触摸屏,touch panel,导电薄膜,氧化钛,AZO等技术电阻式,电容式,表面电容式,红外式等
### Touch Panel 生产流程详解 #### 一、概述 Touch Panel(触摸屏)是一种重要的输入设备,广泛应用于手机、平板电脑、智能电视等电子产品中。本文档详细介绍了Touch Panel的生产流程,包括ITO(Indium Tin Oxide...
在编程方面,`touchPanel.c` 文件可能是实现触控面板驱动程序的一部分。开发触控面板驱动通常涉及到与硬件接口的通信,解析来自触控板的信号,以及将这些信号转化为操作系统可以理解的事件。对于嵌入式系统和移动...
在本文中,我们将深入探讨与“touchpanel”相关的触摸屏校准源码,这对于理解和优化触控系统的性能至关重要。 触控屏校准是确保触控输入准确无误的关键步骤。它涉及到将物理触摸位置映射到屏幕上对应的位置,这个...
《机械设备(电子机械设备)类专用设备(专用机械设备)行业TouchPanel检测系统领域分析报告》是对当前TouchPanel检测系统在机械设备行业的深入研究。这份报告涵盖了行业分析、市场分布、人力成本等多个关键方面,...
获取touchpanel的rawdata
关于MTK平台touch panel驱动源码分析,了解TP驱动的实现流程