`

[转载] [TouchPanel]TouchPanel的虚拟按键没有震感

 
阅读更多

 

[FAQ06834] [TouchPanel]TouchPanel的虚拟按键没有震感
Branch:ICSICS2JBJB2

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触摸屏界面编写软件

    Touch Panel触摸屏界面编写软件

    NI LabVIEW 2010 Touch Panel Module keygen

    NI LabVIEW 2010 Touch Panel Module破解

    touchpanel测试程序

    【touchpanel测试程序】 在IT领域,触摸屏(Touch Panel,简称TP)是人机交互的重要组成部分,尤其在智能手机、平板电脑以及各种嵌入式设备中广泛应用。"touchpanel测试程序"是一个专用于验证触控屏功能是否正常的...

    NI LabVIEW Touch Panel Module V86破解机

    Touch.Panel.Module.V8.6破解机

    LabVIEW Touch Panel Module for Windows CE

    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问题集锦

    TouchPanel问题集锦

    labview touch panel 2010.pdf

    - **获取方式**:选择“开始”-&gt;“所有程序”-&gt;“National Instruments”-&gt;“LabVIEW”-&gt;“Readme”并打开“readme_TouchPanel.html”文件。 以上内容详细介绍了如何使用LabVIEW Touch Panel Module 2010创建和调试...

    LabVIEW2012 touch panel

    好多人都在找labview touch panel, 找了好久分享给大家,自己也下载使用,没有任何问题,请大家放心下载使用

    LPC1788 LCD TouchPanel 程序

    开发LPC1788 LCD TouchPanel程序通常会用到嵌入式开发环境,如Keil uVision或IAR Embedded Workbench,这些IDE支持C/C++编程,并有对应的LPC1788库函数和硬件抽象层(HAL)。此外,NXP官方提供的LPCXpresso工具和...

    NI LabVIEW v8.6 Touch Panel Module.zip

    LabVIEW v8.6 版本是其历史上的一个重要里程碑,它引入了许多新特性和改进,其中特别值得一提的是“触摸屏模块”(Touch Panel Module)。此模块的出现,极大地拓展了LabVIEW在嵌入式系统和人机交互界面设计上的应用...

    touch panel 触摸屏基础知识

    触摸屏,touch panel,导电薄膜,氧化钛,AZO等技术电阻式,电容式,表面电容式,红外式等

    Touch Panel 生产流程说明[1].doc .doc

    ### Touch Panel 生产流程详解 #### 一、概述 Touch Panel(触摸屏)是一种重要的输入设备,广泛应用于手机、平板电脑、智能电视等电子产品中。本文档详细介绍了Touch Panel的生产流程,包括ITO(Indium Tin Oxide...

    touchPanel

    在编程方面,`touchPanel.c` 文件可能是实现触控面板驱动程序的一部分。开发触控面板驱动通常涉及到与硬件接口的通信,解析来自触控板的信号,以及将这些信号转化为操作系统可以理解的事件。对于嵌入式系统和移动...

    touchpanel

    在本文中,我们将深入探讨与“touchpanel”相关的触摸屏校准源码,这对于理解和优化触控系统的性能至关重要。 触控屏校准是确保触控输入准确无误的关键步骤。它涉及到将物理触摸位置映射到屏幕上对应的位置,这个...

    机械设备(电子机械设备)类专用设备(专用机械设备)行业TouchPanel检测系统领域分析报告(研究报告).pdf

    《机械设备(电子机械设备)类专用设备(专用机械设备)行业TouchPanel检测系统领域分析报告》是对当前TouchPanel检测系统在机械设备行业的深入研究。这份报告涵盖了行业分析、市场分布、人力成本等多个关键方面,...

    TOUCHPANEL_RAWDATA

    获取touchpanel的rawdata

    touch panel原理-MTK

    关于MTK平台touch panel驱动源码分析,了解TP驱动的实现流程

Global site tag (gtag.js) - Google Analytics