触屏处理流程

2019-04-02 23:29

P100触屏学习总结

一、 触屏驱动的配置文件:

为了使触屏工作,触屏模块驱动文件必须正确配置触屏的驱动文件,其配置文件在DOOV_11A_COSMOS_GPRS.mak文件中,

中断端口的配置在Touch_panel_.h和IntrCtrl_Mt6236。H文件中 ADC的配置文件在Adc_hw.h文件中;

对于系统是怎么区分x、y、和press的请看36的datasheet。

二、 触屏工作流程:

P100使用的是触屏及极少的触屏事件,因而它的输入事件分为两类1:一般的键盘

按键事件;2:触屏事件。

一般的键盘按键事件,之前已经写过相应的文档;就不再重述了。

对于触屏事件的处理,其原理大致上与键盘按键事件的处理流程大致相同,也是上层注册触屏事件,下层在触发触屏事件后,会发一个消息给上层,上层得到消息后会处理之前注册过的函数;主要涉及的相关文件有Dcl_sts.c、Touch_panel_.c、Touch_panel_main.c、Touch_panel_custom.c 、TouchScreen.c、Wgui_Touch_Screen.c、Ts_drv.c等几个文件。

下面我将以触屏初始化----mmi层对触屏事件的注册----drv层触屏中断响应及处理----mmi层触屏事件的响应及处理的顺序描述一下触屏事件在各个环节是怎么处理的,最后以屏幕校准为例描述整个流程;然后再简单描述一下Wgui_Touch_Screen.c文件。

I、触屏初始化

触屏初始化是在函数tp_task_main中完成的,tp_task_main函数是在系统初始化过程中由创立一个任务函数custom_tp_task_create实现的,它会调用函数tp_task_create,从而激活函数tp_task_main。

函数tp_task_main处理触屏事件的重要函数,此函数主要有两个作用:1、初始化触屏事件;2、等待触屏事件的到来。

1、 初始化触屏事件,主要包括的以下几个方面:

a: 首先它会调用kal_create_event_group创立一个触屏事件,用于

kal_set_eg_events设置和kal_retrieve_eg_events接收触屏事件的信息。 b: 然后执行初始化函数DclSTS_Initialize(),在函数DclSTS_Initialize中

主要是根据全局变量fgSTSInit的值来决定是否调用touch_panel_init();在函数touch_panel_init()中主要做了注册触屏事件的回调函数,包含了DOWN、UP事件的回调函数,调用了touch_custom_init函数用于去抖动时间、触发触屏事件的压力、对应的LCD显示屏的显示起始坐标,触屏的起始坐标等触屏基本信息的配置,然后调用DclHTS_Initialize函数用于调用函数ts_drv_init(),函数ts_drv_init()主要处理了:初始化触屏事件的中断,设置ADC控制寄存器AUXADC_CON3,设置中断寄存器(中断向量地址为0x31)标志(边沿触发),打开中断,注册中断处理函数TS_LISR等;

c: 接着调用函数touch_panel_test,此函数主要处理了打开触屏、配置手写

区域、配置采样周期、配置超时时间。

2、 处理完初始化工作后就会进入一个while死循环中,用函数

kal_retrieve_eg_events去接收事件信息,然后根据TP.state的状态去执行相应的回调函数

流程图如下:

touch_panel_test配置手写区域、配置采样周期、配置超时时间tp_task_main初始化kal_create_event_group创立一个按键事件等待触屏事件TP.state=1执行up事件的回kal_retrieve_eg_e调函数ventsDclSTS_InitializeTP.state=0touch_panel_init注册触屏的回调函数,发送消息的回调函数fgSTSInit为真执行DOWN事件的回调函数touch_custom_init去抖动时间、触发按键事件的压力DclHTS_Initializets_drv_init初始化触屏的中断,注册中断处理函数TS_LISR图1:初始化流程图

在完成初始化工作之后,上层MMI就会注册相应的down、up事件函数,当触发到触屏事件后就会执行相应的注册函数。

为了方便理解真个流程下面将MMI对触屏事件的注册和响应放在一起进行描述,但程序的执行还是以上面的顺序为主。 II、上层MMI对触屏事件的注册和处理

对于触屏它的触屏事件有两大类① pen事件,②stroke事件(手写);pen类事件包括up、move、long_tap、repeat、abort等;stroke类事件包括:stroke_down、 stroke_up、stroke_move、stroke_longtap等;在上层mmi层他们注册过程和相应的处理方式是相同的,我们就以pen类事件中的down事件为例,MMI对pen事件的处理包括pen事件的注册和pen事件的响应,具体如下:

a:MMI层触屏事件的注册

若在某个界面需要down事件,他就会调用相应down事件注册函数

mmi_pen_register_down_handler进行注册,在mmi_pen_register_down_handle函数

中他会把参数中的回调函数赋给全局变量g_pen_event_table即 g_pen_event_table[MMI_PEN_EVENT_DOWN] = pen_fp;

其他的还有up、move、long_tap、repeat、abort及stroke类的等函数的注册也是一样的。

b:MMI层触屏事件的响应

在初始化pen system过程中mmi_pen_init函数会注册函数 mmi_pen_drv_callback_registry(mmi_pen_touch_panel_sendilm, NULL) 用于底层drv向上层MMI发送消息和

SetProtocolEventHandler(mmi_pen_touch_panel_event_ind, MSG_ID_TP_EVENT_IND);用于当MMI层接收到消息MSG_ID_TP_EVENT_IND就会执行函数MMI_task函数,MMI_task就会调用ProtocolEventHandler进而调用mmi_frm_execute_current_protocol_handler,函数 mmi_frm_execute_current_protocol_handler会

根据eventID找到之前在初始化pen system过程中注册过的函数mmi_pen_touch_panel_event_ind进而调用mmi_pen_poll_hdlr();接着根据event的类型excecute_pen_event();执行之前注册的函数(g_pen_event_table[evt_type]) (pos); 流程图如下:

MMI_taskMMI接收到消息ProtocolEventHandlermmi_pen_touch_panel_event_indExecuteCurrProtocolHandlermmi_pen_poll_hdlr根据事件ID号找到之前的注册函数Switch(data.event)从buffer中取出数据excecute_pen_event(g_pen_stroke_table[evt_type]) (pos)

图2:MMI层触摸的响应流程图

(g_pen_event_table[evt_type]) (pos)中的注册函数的参数pos是x、y的坐标值;在执行之前注册过的函数时他会调用mmi_pen_check_inside_polygon(area, point);判断触摸的坐标与控件的显示坐标是否匹配;若匹配则是有效触摸然后进行相应操作;若不匹配则被视为无效触摸;

下面主要描述一下MMI层响应的主要函数mmi_pen_poll_hdlr,描述时还以pen down事件为例;

首先会根据if_has_pen_event()的返回值是否为假和delay_polling_timer是否为真即进入while语句;在执行函数if_has_pen_event()过程中它会从buffer中读出之前存入buffer的触摸信息,具体流程见下图:

mmi_pen_poll_hdlrwhile (!delay_polling_timer && if_has_pen_event())真if_has_pen_event()mmi_pen_lookahead_buffer_fill_data假mmi_pen_drv_get_eventswitch (data.event)data.event有DCL_PEN_DOWN、DCL_PEN_MOVE、DCL_PEN_REPEAT、DCL_STROKE_MOVE等DclSTS_ControlSTS_CMD_GET_EVENTDCL_PEN_DOWN(其他处理流程大致相同或)excecute_pen_eventtouch_panel_get_event_mmi_frm_fetch_msg_from_extQ_to_circularQtouch_pop_data_from_buffer读出触摸信息存到touch_data结构体中并置send_touch_ilmif(OslNumOfCircularQMsgs() > MMI_PENDING_MSG_THRESHOLD)真跳出while循环真While循环结束if (delay_polling_timer)开启一个执行mmi_pen_poll_hdlr回调函数的timer else if (g_pen_cntx.is_pen_down || pen_abort_happen)真开启一个执行mmi_pen_poll_hdlr回调函数的timer并置pen_abort_happen为0mmi_pen_poll_hdlr函数结束图3:mmi_pen_poll_hdlr函数流程图

在mmi_pen_poll_hdlr中的while循环会一直从buffer中读数据直到while的条件为假;然后开启一个执行回调函数mmi_pen_poll_hdlr的timer,以处理后面的repeat、longtap、up事件。

III、drv层触屏事件中断响应及处理

在我们的系统中,对于触摸功能是这样处理的: 首次触摸是由中断检测得到,之后响应中断进行处理;处理完后开启一个timer,定时器到时处理时主动读取触摸坐标,若是有效坐标则处理,处理完后同样开启一个timer ,若是无效坐标则表示没有触摸,此时再清除中断标记、重新打开中断响应,等待下一次触摸中断 。

在初始化过程中已经注册了中断的响应函数TS_LISR,当触屏上的压力大于门槛压力时就会触发一个中断,进入中断函数TS_LISR,会激活高级中断的DRV_AUXADC_HISR_ID

从而进出高级中断函数TS_HISR,在高级TS_HISR函数会检测tp_state然后根据tp_state的值进行相应的处理,读出ADC的值即tp的x、y坐标,继而执行相应的回调函数HTS_DownHandle以设置一个事件kal_set_eg_events,从而使函数tp_task_main中的while循环得到事件信息进而执行相应的回调函数touch_panel_down_hdr,在函数touch_panel_down_hdr中首先处检查是否有中断丢失若有就会调用touch_panel_up_hdr()参数为空即不作处理。若没有就会把tp的x、y坐标转化为屏的坐标,然后判断是否是手写然后把坐标值、时间、压力值、事件类型,存放到buffer里边,同时开启一个timer用于长触屏事件和重复触屏事件的处理,具体流程如下:

TS_LISRDRV_AUXADC_HISR_ID硬件中断TS_HISR并打开中断tp_read_adcts_read_adcHTS_DownHandlets_read_adc_adc_3835_WAkal_set_eg_eventsTP.event=24tp_task_maintouch_panel_down_hdrtp_data_pushtouch_panel_event_hdrtouch_start_longtap发送消息MSG_ID_TP_EVENT_INDtouch_panel_event_cbtouch_panel_longtap_cb上层MMI touch_panel_repeat_cb 图4:drv层触屏事件中断响应及处理流程图

下面对touch_panel_down_hdr函数进行描述,重点在于对此函数中的长触屏事件和重复触屏事件的处理进行描述:

首先会判断是否有中断丢失若有就会调用touch_panel_up_hdr()参数为空即不作处理。若没有就会把tp的x、y坐标转化为屏的坐标,然后判断是否是手写然后把坐标值、时间、


触屏处理流程.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:关于开展互联网服务单位落实安全防范技术措施记录相关网络日志情

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: