压力值、事件类型,存放到buffer里边,同时开启一个timer用于长触屏事件和重复触屏事件的处理,
流程图如下:
if (tp_up_intr_lost_flag == KAL_TRUE)假真关闭所有timer,进入函数touch_panel_up_hdrtouch_excute_calitouch_panel_adc_to_coordinateif(TP.area==HAND_WRITING)*-假*-真tp_data_push把数据存到buffer中把数据存到buffer中tp_data_pushtouch_panel_event_hdr开启一个执行touch_panel_event_cb的timertouch_panel_stroke_hdr**touch_start_handwriting_longtap开启一个执行touch_panel_stroke_cb的timertouch_start_longtap开启一个执行touch_panel_longtap_cb的timer开启一个执行touch_panel_longtap_cb的timer开启一个执行touch_panel_repeat_cb的timer
图5:touch_panel_down_hdr函数流程图
下面描述一下是怎么检查UP事件的,当进入函数touch_panel_event_cb后,会调用函数DclHTS_Control来检测TP.state的状态是否改变,通过tp_level_pressure检测压力来判断是否发生了状态改变,若没有改变则执行down事件,可以说touch_panel_event_cb只做了两件事a:检查TP.state的状态是否改变,若改变执行up事件,b:若没有改变则读出ADC的值,并转换成坐标,判断是否是有效坐标,若是开一个执行touch_panel_repeat_cb的timer,然后调用touch_panel_event_hdr,若否直接调用touch_panel_event_hdr,具体流程如下:
开始真假调用函数DclHTS_Control检查TP.state是否发生变化if(TP.state==DOWN)真调用DclHTS_Controlif (KAL_TRUE == tp_fun_ptr->tp_pressure_check())真TPUpdateNotifytouch_panel_read_adc(&x, &y)kal_set_eg_eventsTP.state = UP假tp_task_mainif(touch_panel_exceed_penmove(x, y)&&(valid==KAL_TRUE))真假touch_panel_up_hdr开启一个执行回调函数touch_panel_repeat_cb的timer结束touch_panel_event_hdr图6:up事件检测及处理流程图
touch_panel_up_hdr的处理流很简单只是关闭了所有用于长触屏事件和重复触屏事件事件的timer,然后把数据存到buffer中。
对于long和repeat的处理过程几乎是一样的,这里以repeat为例,描述一下相应的处理流程,也是先调用函数DclHTS_Control来检测TP.state的状态是否改变,通过tp_level_pressure检测压力来判断是否发生了状态改变,若没有改变则执行down事件,并在最后开启一个timer,具体流程如下:
开始真假调用函数DclHTS_Control检查TP.state是否发生变化if(TP.state==DOWN)真调用DclHTS_Control把数据存放到buffer中真TPUpdateNotify开启一个执行回调函数touch_panel_repeat_cb的timerkal_set_eg_eventsTP.state = UPTP.event=24假tp_task_maintouch_panel_up_hdr结束 图7:repeat事件流程图
以上就是触屏触摸流程的整个过程从MMI的注册到drv层的中断处理再到MMI层的响应的整个过程;
IV、下面将以屏幕校准为例在描述一下整个流程:整个流程和上述过程一样,同样是上层注册触摸事件,触摸引发中断进入drv层进行处理;然后发送消息给上层;上层得到消息后响应触摸事件; 整体流程如下:
vapp_bootup_flow_pen_calibrationvapp_bootup_needs_pen_calibration()的返回追是否为1真假ReadValue从NV里面读出值VappBootupApp::doPenCalibrationsrv_setting_pen_calibration_is_calibration_needed()srv_setting_pen_calibration_init_data VfxApp::onRunsrv_setting_pen_calibration_get_data_int VappPenCalibrationCui::onRun从NV中读出值存放到calibration_data->data[i]VappPenCalibrationCui::onPenTappedsrv_setting_pen_calibration_startmmi_pen_start_calibrationmmi_pen_read_calibration_dataDclSTS_Control命令为STS_CMD_START_CALIDclSTS_Control命令为STS_CMD_READ_CALItouch_panel_start_cali_置tp_cali_mode=KAL_TRUEtouch_panel_read_cali_存放到结构体cali中SetProtocolEventHandler(srv_setting_pen_calibration_rsp,MSG_ID_TP_CALI_DONE);在函数srv_setting_pen_calibration_start中的回调函数touch_excute_cali发送消息MSG_ID_TP_CALI_DONE给srv_setting_pen_calibration_rspmmi_pen_read_calibration_data此函数是被函数touch_panel_down_hdr调用的,而touch_panel_down_hdr的调用流程与图5是一样的可以参考图5;由于被置为1,因而它会执行下面的程序,进行屏幕校准共3次;并计算出TPCali.x_slope、TPCali.x_offset和TPCali.y_slope、TPCali.y_offset然后发送消息给上层srv_setting_pen_calibration_set_dataDclSTS_Control命令为STS_CMD_READ_CALIDclSTS_Control命令为STS_CMD_SET_CALItouch_panel_read_cali_存放到结构体calibration_data中touch_panel_set_cali_WriteValue到NV里面 当调用 void mmi_pen_start_calibration(kal_uint16 num, const mmi_pen_point_struct *points) 函数时,就开始进入触摸屏校准状态,num 表示校准的个数,points 分别就是理想点的位置,真正执行校准的是在 函数 touch_excute_cali里面
其实校准是否正确 还是主要看 touch_panel_check_cali 这个函数的结果。这个函数主要里有 3 个校准测试,只有都符合条件才符合。
stage 1 比例对比,也就是保证测试点1 和 点 2 倾斜一定的角度。不会与x 轴或者y轴平行
stage 2 保证第1 点 和 第 2 点 在 第3 点的 两端
stage 3 根据stage 1 和 stage 2 得出的slope 和 offset, 比较计算获得的第3点 和 希望获得第3点 误差小于 设定值。
V、简单描述一下Wgui_Touch_Screen.c文件
Wgui_Touch_Screen.c文件中有许多关于down、up、move、repeat等事件的相关函数,现以wgui_general_pen_down_hdlr为例简单描述一下他的流程,大致流程是:首先根据当前屏幕的ID号取出当前屏幕的控件集的地址赋给control_set_ptr,然后for循环利用函数gui_icontext_button_translate_pen_event遍历整个控件集寻找触发的控件,找到相应的控件之后,会把相应的控件赋给全局变量g_pen_to_control;然后调用相应函数进入新的屏幕;在up和move等中就可以利用g_pen_to_control所指的控件进行相应的操作。
以上就是整个触屏事件的处理流程和一个例子的讲解;有很多不完善的请批评指针。