亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? touch_panel.c

?? 代碼用簡單的4個IO口外加兩個ADC轉換接口實現了觸摸屏全套控制流程.
?? C
?? 第 1 頁 / 共 4 頁
字號:
   {
      send_touch_ilm = KAL_TRUE;
      result = KAL_FALSE;
   }
      
   if (tp_eint_mask == KAL_FALSE)
   EINT_UnMask(TP.eint_chan);
   IRQUnmask(IRQ_GPT_CODE);
   return result;      
}

/*************************************************************************
* FUNCTION
*	touch_panel_conf_move_offset
*
* DESCRIPTION
*	This function is to configure pen move offset and stroke move offset.
*
* PARAMETERS
*	pen_offset: pen move offset
*	stroke_offset: stroke move offset
*
* RETURNS
*
* GLOBALS AFFECTED
*
*************************************************************************/
void touch_panel_conf_move_offset(kal_uint16 pen_offset, kal_uint16 stroke_offset, 
                                  kal_uint16 longtap_pen_offset,
                                  kal_uint16 longtap_stroke_offset)
{
   TP.pen_offset=pen_offset;
   TP.storke_offset=stroke_offset;      
   TP.longtap_pen_offset=longtap_pen_offset;
   TP.longtap_stroke_offset=longtap_stroke_offset;
}  


/*************************************************************************
* FUNCTION
*	touch_panel_exceed_penmove
*
* DESCRIPTION
*	This function is pen move event filter.
*
* PARAMETERS
*	x: x coord.
*	y: y coord.
*
* RETURNS
*	exceed MIN_PEN_MOVE_OFFSET or not
*
* GLOBALS AFFECTED
*
*************************************************************************/
kal_bool touch_panel_exceed_penmove(kal_int16 x, kal_int16 y)
{
   kal_int16 x_diff, y_diff;
   
   if(x>TP.pre.x)   
      x_diff=x-TP.pre.x;
   else
      x_diff=TP.pre.x-x;   
   if(y>TP.pre.y)   
      y_diff=y-TP.pre.y;
   else
      y_diff=TP.pre.y-y;      
          
   if(TP.longtap_state==KAL_FALSE)/*normal*/
   {
   if((x_diff>=TP.pen_offset||y_diff>=TP.pen_offset)
       &&(x_diff<NONHAND_WRITING_MAX_OFFSET)&&(y_diff<NONHAND_WRITING_MAX_OFFSET))   
      return KAL_TRUE;          
   else
      return KAL_FALSE;   
}  
   else/*longtap*/
   {
      if((x_diff>=TP.longtap_pen_offset||y_diff>=TP.longtap_pen_offset)
          &&(x_diff<NONHAND_WRITING_MAX_OFFSET)&&(y_diff<NONHAND_WRITING_MAX_OFFSET))   
         return KAL_TRUE;          
      else
         return KAL_FALSE;   
      
   }         
}  

/*************************************************************************
* FUNCTION
*	touch_panel_longtap_handwriting_filter
*
* DESCRIPTION
*	This function is to check longtap event in handwriting area.
*
* PARAMETERS
*	x: x coord.
*	y: y coord.
*
* RETURNS
*	None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void touch_panel_longtap_handwriting_filter(kal_int16 x, kal_int16 y)
{
   kal_int16 x_diff, y_diff;      
   
   if(x>TP.begin.x)   
      x_diff=x-TP.begin.x;
   else
      x_diff=TP.begin.x-x;    
      
   if(y>TP.begin.y)    
      y_diff=y-TP.begin.y;
   else
      y_diff=TP.begin.y-y;    
      
   if(x_diff>TP.longtap_stroke_offset||y_diff>TP.longtap_stroke_offset)/*handwriting long tap*/   
   {
      GPTI_StopItem(touch_panel_repeat_handle);          
      TP.longtap_state=KAL_FALSE;
   }   
}  
/*************************************************************************
* FUNCTION
*	touch_panel_stroke_filter
*
* DESCRIPTION
*	This function is stroke move event filter.
*
* PARAMETERS
*	x: x coord.
*	y: y coord.
*
* RETURNS
*	None
*
* GLOBALS AFFECTED
*
*************************************************************************/
void touch_panel_stroke_filter(kal_int16 x, kal_int16 y)
{
   kal_int16 x_diff, y_diff;
   //TouchPanelCoordStruct diff;
   if(TP.longtap_state==KAL_TRUE)
      touch_panel_longtap_handwriting_filter(x, y);
      
   if(x>TP.pre.x)   
      x_diff=x-TP.pre.x;
   else
      x_diff=TP.pre.x-x;    
      
   if(y>TP.pre.y)    
      y_diff=y-TP.pre.y;
   else
      y_diff=TP.pre.y-y;     
         
   if((x_diff>TP.storke_offset||y_diff>TP.storke_offset)
       &&(x_diff<HAND_WRITING_MAX_OFFSET)&&(y_diff<HAND_WRITING_MAX_OFFSET))
   {           
      if(TP.temp.x==0&&TP.temp.y==0)      
      {
         tp_data_pop(STROKE_MOVE,(x-TP.pre.x) ,(y-TP.pre.y));
         TP.pre.x=x;
         TP.pre.y=y;
      }   
      else
      {
         /*use the previous point*/
         tp_data_pop(STROKE_MOVE, (TP.temp.x-TP.pre.x), (TP.temp.y-TP.pre.y));
         TP.pre.x=TP.temp.x;
         TP.pre.y=TP.temp.y;
         if(x>TP.pre.x)   
            x_diff=x-TP.pre.x;
         else
            x_diff=TP.pre.x-x;   
      
         if(y>TP.pre.y)   
            y_diff=y-TP.pre.y;
         else         
            y_diff=TP.pre.y-y;          
            
         if((x_diff>TP.storke_offset||y_diff>TP.storke_offset))
         {
            tp_data_pop(STROKE_MOVE, (x-TP.pre.x), (y-TP.pre.y));
            TP.pre.x=x;
            TP.pre.y=y;
            TP.temp.x=0;
            TP.temp.y=0;
         }   
         else
         {
            TP.temp.x=x;
            TP.temp.y=y;
         }                                    
      }                        
   }
   else     
   {
      TP.temp.x=x;
      TP.temp.y=y;  
   }   
} 

/*************************************************************************
* FUNCTION
*	tp_data_pop
*
* DESCRIPTION
*	This function is to "push" data to buffer.
*
* PARAMETERS
*	x: x coord.
*	y: y coord.
*  event: event type
*
* RETURNS
*	None
*
* GLOBALS AFFECTED
*
*************************************************************************/  
kal_uint16 tp_roomleft_min=TOUCH_PANEL_BUFFER_SIZE;
void tp_data_pop(Touch_Panel_Event_enum event, kal_int16 x, kal_int16 y)
{
   kal_uint16 roomleft=0;
   
   tp_get_buf_roomleft(roomleft);   
   /*To get minimum roomleft*/
   if(roomleft<tp_roomleft_min)
      tp_roomleft_min=roomleft;
   
   if(TP.is_buff_full==KAL_TRUE)
      return;
   
   if(roomleft<=BASIC_EVENT_UNIT)
   {
       //if(roomleft>=1)
         //touhc_push_data_to_buffer(PEN_ABORT);         
       /*stop collect events until ring buffer is clean*/
       TP.is_buff_full=KAL_TRUE;
       return;
   }    
   
   if(event==STROKE_MOVE) 
   {
      #ifdef TOUCH_PANEL_DEBUG
      dbg_printWithTime("Move %d,%d\r\n",(kal_int16)x,(kal_int16)y);
      #endif
      /*to avoid STROKE_UP data show in the packet*/
      if(x==STROKE_UP||x==STROKE_LONGTAP)
         x--;
      if(y==STROKE_UP||y==STROKE_LONGTAP)
         y--;   
      touhc_push_data_to_buffer(x,event);/*diff_x*/
      touhc_push_data_to_buffer(y,event);/*diff_y*/   
   }   
   else if(event==STROKE_LONGTAP) 
   {
      touhc_push_data_to_buffer(event,event);/*diff_x*/
   }   
   else if(event==STROKE_UP) 
   {
      touhc_push_data_to_buffer(event, event);         
   }
   else
   {
      //if(roomleft>=BASIC_EVENT_UNIT)
      {
         touhc_push_data_to_buffer(event, event);   
         touhc_push_data_to_buffer(x>>8, event);   
         touhc_push_data_to_buffer(x, event);
	      touhc_push_data_to_buffer(y>>8, event);   
	      touhc_push_data_to_buffer(y, event);   
	   }
   }   
      
}   
  
/*************************************************************************
* FUNCTION
*	touch_panel_check_cali
*
* DESCRIPTION
*	This function is to check calibration result.
*
* PARAMETERS
*	x: x coord.
*	y: y coord.
*
* RETURNS
*	None
*
* GLOBALS AFFECTED
*
*************************************************************************/   
kal_bool touch_panel_check_cali_stage3(void)
{
   kal_int16 x, y, x_diff, y_diff;
   double x_slope, y_slope, x_offset, y_offset; 
      
   touch_panel_tuning(cali_point[0].x, cali_point_adc[0].x, 
                      cali_point[1].x, cali_point_adc[1].x, 
                      &x_slope, &x_offset);
   touch_panel_tuning(cali_point[0].y, cali_point_adc[0].y, 
                      cali_point[1].y, cali_point_adc[1].y, 
                      &y_slope, &y_offset); 
        
   x=(kal_int16)(x_slope*(double)(cali_point_adc[2].x)+x_offset);   
   y=(kal_int16)(y_slope*(double)(cali_point_adc[2].y)+y_offset); 
   
   x_diff=cali_point[2].x-x;
   y_diff=cali_point[2].y-y;
   if(x_diff>TOUCH_PANEL_CALI_CHECK_OFFSET||x_diff<-TOUCH_PANEL_CALI_CHECK_OFFSET||
      y_diff>TOUCH_PANEL_CALI_CHECK_OFFSET||y_diff<-TOUCH_PANEL_CALI_CHECK_OFFSET)
      return KAL_FALSE;
   
   return KAL_TRUE;
}   

kal_bool touch_panel_check_cali_stage1(void)
{
   kal_int32 x_adc_range, x_coord_range, x_adc_high, x_adc_low;   
   kal_int32 y_adc_range, y_coord_range, y_adc_high, y_adc_low;
   
   /*use the relative ADC difference*/
   /*X ADC Diff*/
   if(cali_point_adc[1].x>=cali_point_adc[0].x)
      x_adc_range=cali_point_adc[1].x-cali_point_adc[0].x;   
   else
      x_adc_range=cali_point_adc[0].x-cali_point_adc[1].x;   
   /*Y ADC Diff*/   
   if(cali_point_adc[1].y>=cali_point_adc[0].y)   
      y_adc_range=cali_point_adc[1].y-cali_point_adc[0].y;   
   else
      y_adc_range=cali_point_adc[0].y-cali_point_adc[1].y; 
                 
   /*X Coord Diff*/   
   if(cali_point[1].x>=cali_point[0].x)         
      x_coord_range=cali_point[1].x-cali_point[0].x;   
   else
      x_coord_range=cali_point[0].x-cali_point[1].x;      
   /*Y Coord Diff*/      
   if(cali_point[1].y>=cali_point[0].y)   
      y_coord_range=cali_point[1].y-cali_point[0].y;  
   else   
      y_coord_range=cali_point[0].y-cali_point[1].y;  
               
   x_adc_high=x_coord_range*(ADC_X_END-ADC_X_START)*150/(SCREEN_X_END-SCREEN_X_START)/100; 
   x_adc_low=x_coord_range*(ADC_X_END-ADC_X_START)*50/(SCREEN_X_END-SCREEN_X_START)/100;
   y_adc_high=y_coord_range*(ADC_Y_END-ADC_Y_START)*150/(SCREEN_Y_END-SCREEN_Y_START)/100; 
   y_adc_low=y_coord_range*(ADC_Y_END-ADC_Y_START)*50/(SCREEN_Y_END-SCREEN_Y_START)/100;       
   #ifdef TOUCH_PANEL_DEBUG
   dbg_printWithTime("x adc diff=%d high=%d low=%d\r\n",x_adc_range,x_adc_high,x_adc_low ); 
   dbg_printWithTime("y adc diff=%d high=%d low=%d\r\n",y_adc_range,y_adc_high,y_adc_low );                        
   #endif
   if((x_adc_range<x_adc_low) || (x_adc_range>x_adc_high))
      return KAL_FALSE;
   if((y_adc_range<y_adc_low) || (y_adc_range>y_adc_high))
      return KAL_FALSE;                           
   return KAL_TRUE;      
}
kal_bool touch_panel_check_cali_stage2(void)
{   
   kal_int32 x02_diff, y02_diff, x12_diff, y12_diff;
      
   /*use the point 3 to check if the previous 2 two points are opposite*/      
   if(cali_point_adc[1].x>=cali_point_adc[0].x)/*1>2>0*/
   {
      x12_diff=cali_point_adc[1].x-cali_point_adc[2].x;
      x02_diff=cali_point_adc[2].x-cali_point_adc[0].x;            
   }
   else/*0>2>1*/
   {  
      x12_diff=cali_point_adc[2].x-cali_point_adc[1].x;
      x02_diff=cali_point_adc[0].x-cali_point_adc[2].x;            
   }            
   if(cali_point_adc[1].y>=cali_point_adc[0].y)/*1>2>0*/
   {
      y12_diff=cali_point_adc[1].y-cali_point_adc[2].y;
      y02_diff=cali_point_adc[2].y-cali_point_adc[0].y;            
   }
   else/*0>2>1*/
   {  
      y12_diff=cali_point_adc[2].y-cali_point_adc[1].y;
      y02_diff=cali_point_adc[0].y-cali_point_adc[2].y;            
   }   
      
   if(y12_diff>y02_diff||x12_diff>x02_diff)
      return KAL_FALSE;      
   return KAL_TRUE;
}
kal_bool touch_panel_check_cali(void)
{
   kal_bool result1, result2, result3;
   result1=touch_panel_check_cali_stage1();
   result2=touch_panel_check_cali_stage2();
   result3=touch_panel_check_cali_stage3();
      
   if(result1==KAL_TRUE&&result2==KAL_TRUE&&result3==KAL_TRUE)
      return KAL_TRUE;
   else   
      return KAL_FALSE;
}

/*************************************************************************
* FUNCTION
*	touch_excute_cali
*
* DESCRIPTION
*	This function is to excute calibration.
*
* PARAMETERS
*	x: x coord.
*	y: y coord.
*
* RETURNS
*	None
*
* GLOBALS AFFECTED
*
*************************************************************************/   
void touch_excute_cali(kal_int16 x_adc, kal_int16 y_adc)
{
   ilm_struct *tp_ilm;
   tp_cali_done_struct *local_para;
   kal_bool cali_result;
   module_type owner=0;
   if(tp_cali_mode==KAL_FALSE)
      return;
   if(tp_cali_cnt==0)         
   {
      #ifdef TOUCH_PANEL_DEBUG
      dbg_printWithTime("1st Cali %d,%d\r\n",x_adc,y_adc);
      #endif
      //touch_panel_read_adc(&(cali_point_adc[0].x),&(cali_point_adc[0].y));
      tp_cali_cnt++;
      cali_point_adc[0].x=x_adc;
      cali_point_adc[0].y=y_adc;      
   }         
   else if(tp_cali_cnt==1)   
   {
      #ifdef TOUCH_PANEL_DEBUG
      dbg_printWithTime("2nd Cali %d,%d\r\n",x_adc,y_adc);
      #endif
      tp_cali_cnt++;
      cali_point_adc[1].x=x_adc;
      cali_point_adc[1].y=y_adc;          
   }
   else if(tp_cali_cnt==2)
   {      
      cali_point_adc[2].x=x_adc;
      cali_point_adc[2].y=y_adc;          
      tp_cali_mode=KAL_FALSE;
      tp_cali_cnt=0;
      cali_result=touch_panel_check_cali();
      
      if(cali_result==KAL_TRUE) 
      {
      touch_panel_tuning(cali_point[0].x, cali_point_adc[0].x, 
                         cali_point[1].x, cali_point_adc[1].x, 
                         &TPCali.x_slope, &TPCali.x_offset);
      touch_panel_tuning(cali_point[0].y, cali_point_adc[0].y, 
                         cali_point[1].y, cali_point_adc[1].y, 
                         &TPCali.y_slope, &TPCali.y_offset);      

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品一区视频| 精品亚洲欧美一区| 国产精品美女视频| 国产欧美一二三区| 精品国产3级a| 26uuu亚洲综合色欧美| 精品国产乱码久久久久久蜜臀| 欧美一级高清片在线观看| 在线播放国产精品二区一二区四区| 欧美午夜一区二区三区| 欧美性大战久久| 欧美另类变人与禽xxxxx| 91精品国产麻豆| 精品免费日韩av| 欧美精彩视频一区二区三区| 国产午夜精品久久| 亚洲欧洲成人av每日更新| 综合中文字幕亚洲| 亚洲高清在线视频| 免费三级欧美电影| 高清在线成人网| 91欧美激情一区二区三区成人| 91片在线免费观看| 欧美酷刑日本凌虐凌虐| 亚洲欧美在线观看| 亚洲一区二区四区蜜桃| 男人的天堂亚洲一区| 国产乱码精品一品二品| 93久久精品日日躁夜夜躁欧美| 91高清视频在线| 欧美一区2区视频在线观看| 精品成人在线观看| 日韩伦理av电影| 奇米精品一区二区三区四区| 国产成人在线看| 在线观看日韩精品| 日韩精品一区二区三区四区视频| 日本一区二区三区四区 | 亚洲影院久久精品| 日韩激情在线观看| 成人精品在线视频观看| 欧美视频在线观看一区| 精品乱人伦小说| 亚洲综合色自拍一区| 韩国精品在线观看| 欧美日韩欧美一区二区| 国产精品午夜久久| 美女视频一区二区三区| 色综合一区二区| 久久久久久久久久久久久夜| 天天操天天综合网| 91免费国产在线观看| 久久久久97国产精华液好用吗| 一区二区三区日韩精品| 国产69精品久久99不卡| 欧美一区二区免费观在线| 一区二区三区在线观看网站| 久久国产精品99久久久久久老狼| 欧美性videosxxxxx| 中文字幕在线观看不卡| 国内精品久久久久影院色| 国产精品国产精品国产专区不蜜| 日韩一区欧美二区| 日本韩国精品在线| 成人欧美一区二区三区视频网页 | 蜜桃视频在线观看一区| 色综合久久66| 综合色天天鬼久久鬼色| 成人免费高清视频在线观看| 久久久国产午夜精品| 久久99热99| 精品精品国产高清一毛片一天堂| 亚洲福中文字幕伊人影院| 欧美影视一区在线| 一区二区免费看| 欧美三级一区二区| 亚洲电影一区二区三区| 欧美日韩三级视频| 亚洲成人久久影院| 9191精品国产综合久久久久久| 午夜精品在线看| 91麻豆精品国产自产在线观看一区 | 国产欧美精品一区二区三区四区| 午夜国产精品影院在线观看| 欧洲日韩一区二区三区| 亚洲人成7777| 日本高清不卡aⅴ免费网站| 一区二区三区在线免费观看| 91福利在线免费观看| 亚洲mv在线观看| 欧美一区二区三区在线看 | 日韩美女一区二区三区| 九一久久久久久| 亚洲国产精品传媒在线观看| 成人做爰69片免费看网站| 综合自拍亚洲综合图不卡区| 97精品超碰一区二区三区| 一区二区高清免费观看影视大全| 在线观看www91| 麻豆国产一区二区| 欧美草草影院在线视频| 精品国产露脸精彩对白| 国产日韩欧美一区二区三区乱码| 国产麻豆成人精品| 国产精品久久久久久久久久久免费看| 国产91露脸合集magnet| 一区二区三区欧美| 欧美一级xxx| 成人av资源在线观看| 亚洲另类一区二区| 日韩欧美在线网站| 成a人片国产精品| 午夜影院久久久| 久久久久久麻豆| 欧美亚洲动漫精品| 国产一区二区影院| 一区二区三区四区不卡视频| 欧美成人一区二区三区片免费| 成人av在线一区二区| 日韩经典一区二区| 最新国产の精品合集bt伙计| 日韩精品专区在线| 不卡视频免费播放| 蜜桃视频在线一区| 亚洲已满18点击进入久久| 久久久欧美精品sm网站| 欧美久久久久久久久| 99国产精品一区| 国产精品性做久久久久久| 亚洲成人动漫一区| 亚洲人成网站在线| 国产视频一区在线播放| 制服丝袜亚洲播放| 在线精品国精品国产尤物884a| 成人一区二区三区在线观看| 青青草成人在线观看| 亚洲韩国一区二区三区| 亚洲天堂av一区| 国产成人av一区二区| 日韩中文字幕一区二区三区| 精品美女在线观看| 在线国产电影不卡| 国产一区二区三区四| 中文av一区二区| 2024国产精品| 精品蜜桃在线看| 91精品国产手机| 欧美日本韩国一区| 欧美三级中文字幕在线观看| 一本在线高清不卡dvd| www.欧美亚洲| 成人免费看黄yyy456| 国产91在线观看丝袜| 国产在线精品一区二区| 九九九精品视频| 麻豆精品一区二区三区| 免费黄网站欧美| 久久国产精品色婷婷| 麻豆成人久久精品二区三区小说| 日韩综合小视频| 久久精品国产精品亚洲综合| 久久www免费人成看片高清| 国产午夜久久久久| 26uuu精品一区二区三区四区在线| 欧美性色欧美a在线播放| 欧美亚洲国产一区二区三区| 这里是久久伊人| 欧美不卡123| 久久女同性恋中文字幕| 久久精品夜夜夜夜久久| 国产女主播一区| 中文字幕在线观看不卡| 亚洲影院理伦片| 久久福利资源站| 国产精品自在在线| 91美女视频网站| 欧美肥妇bbw| 久久男人中文字幕资源站| 国产女人18水真多18精品一级做| 国产精品美女一区二区| 亚洲一区二区三区四区五区黄 | 色天使色偷偷av一区二区| 欧美日韩国产一二三| 日韩欧美国产麻豆| 中文字幕日韩欧美一区二区三区| 又紧又大又爽精品一区二区| 免费观看在线色综合| 成人丝袜18视频在线观看| 欧美日韩亚洲综合| 精品国产青草久久久久福利| 亚洲图片另类小说| 蜜臀av性久久久久蜜臀av麻豆| 丁香桃色午夜亚洲一区二区三区| 91视频一区二区三区| 精品久久久久久久人人人人传媒| 中文字幕一区二区三中文字幕| 日韩电影在线免费看| av激情亚洲男人天堂| 精品国产一区二区三区不卡| 亚洲黄色av一区|