Gesture.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624
  1. /********************************** (C) COPYRIGHT ******************************
  2. * File Name :usb_driver.h
  3. * Author : DL
  4. * Version : V1.1
  5. * Date : 2020/06/02
  6. * Description : A demo for USB compound device created by CH552, support
  7. touch panel , and HID-compliant device.
  8. ********************************************************************************/
  9. #include "TouchInclude.h"
  10. UINT16 wTwoPointsCoorYBak[2]; //备份Y坐标,用来判断角落是否有两指滑动
  11. BOOL bTwoFingersMoveDown = 0; //双指下滑
  12. UINT8 byTwoTouch = 0; //双指按下计算用
  13. extern UINT8 TouchNum;
  14. #ifdef GESTURE
  15. UINT8 byTouchNumberChange = 0; //双指点击时记录手指数变化
  16. UINT8 byTouchTime1 = 0; //单指点击时计时
  17. UINT8 byTouchTime2 = 0; //双指点击时计时
  18. UINT16 wCoorXBak[5]; //备份X坐标,用来判断是否有滑动
  19. UINT16 wCoorYBak[5]; //备份Y坐标,用来判断是否有滑动
  20. UINT8 byFirstTouch = 0; //用于双指第一次按下去抖
  21. BOOL bMoveFlag = 0; //双指滑动标志
  22. BOOL bclickFlag = 0; //双指点击标志
  23. UINT8 byWheelUpDown = 0; //双指滑动后滚轮上下滚动标志
  24. #define LEFT_RIGHT_MOVE_DIS 600
  25. #define UP_DOWN_MOVE_DIS 600
  26. #define FIVE_MOVE_DIS 400
  27. UINT8 byFourTouch = 0;
  28. UINT8 byFiveTouch = 0;
  29. UINT8 FourfingersGesture(void);
  30. UINT8 byLeftRightMoveFlag = 0; //左右滑动的标志
  31. UINT8 byUpDownMoveFlag = 0; //上下滑动的标志
  32. BOOL bUpDowntMoveCtrl = 0; //上下滑动,上报键值之后要上报ctrl键
  33. UINT16 wDisCoorX[4];
  34. UINT16 wDisCoorY[4];
  35. UINT16 wDisCoorXbak[4];
  36. UINT16 wDisCoorYbak[4];
  37. BOOL bFiveFingersMoveInFlag = 0;
  38. BOOL bFiveFingersMoveOutFlag = 0;
  39. extern UINT8 TouchNumBak;
  40. extern BOOL bTwoFingerCoorBak;
  41. extern UINT8 TouchCount; //手指按下帧数记录,要延迟3帧才上报鼠标
  42. /*******************************************************************************
  43. * Function Name : WheelMove
  44. * Description : 检测双指滑动
  45. * Input : None
  46. * Output : None
  47. * Return : None
  48. *******************************************************************************/
  49. void WheelMove()
  50. {
  51. byWheelUpDown = 0; //每次清0重新判断
  52. if (TouchNum == 0)
  53. {
  54. byFirstTouch = 0;
  55. }
  56. else if (TouchNum == 2)
  57. {
  58. if (byFirstTouch == 0)
  59. {
  60. byFirstTouch++; //要去抖一次,否则坐标不对
  61. }
  62. else if(byFirstTouch == 1)
  63. {
  64. byFirstTouch = 3;
  65. wCoorXBak[0] = TP[0].X_pos; //备份坐标,用来做距离判断滑动
  66. wCoorXBak[1] = TP[1].X_pos;
  67. wCoorYBak[0] = TP[0].Y_pos;
  68. wCoorYBak[1] = TP[1].Y_pos;
  69. }
  70. else if (byFirstTouch > 1)
  71. {
  72. //左右滑动也要判断,以免识别成点击
  73. if (TP[0].X_pos + 100 < wCoorXBak[0] && TP[1].X_pos + 100 < wCoorXBak[1])
  74. {
  75. bMoveFlag = 1; //置滑动标志,有滑动就不会识别成点击
  76. }
  77. else if (TP[0].X_pos > wCoorXBak[0] + 100 && TP[1].X_pos > wCoorXBak[1] + 100)
  78. {
  79. bMoveFlag = 1;
  80. }
  81. else if (TP[0].Y_pos + 20 < wCoorYBak[0] && TP[1].Y_pos + 20 < wCoorYBak[1]) //Up
  82. {
  83. bMoveFlag = 1;
  84. byWheelUpDown = 1;
  85. }
  86. else if (TP[0].Y_pos > wCoorYBak[0] + 20 && TP[1].Y_pos > wCoorYBak[1] + 20) //Down
  87. {
  88. bMoveFlag = 1;
  89. byWheelUpDown = 2;
  90. }
  91. if (bMoveFlag) //有滑动了,重新备份坐标来判断距离
  92. {
  93. wCoorXBak[0] = TP[0].X_pos;
  94. wCoorXBak[1] = TP[1].X_pos;
  95. wCoorYBak[0] = TP[0].Y_pos;
  96. wCoorYBak[1] = TP[1].Y_pos;
  97. }
  98. }
  99. }
  100. }
  101. /*******************************************************************************
  102. * Function Name : TwoPointsClick
  103. * Description : 检测双指点击,有下面4种情况:
  104. 1、双指同时点击,同时松开
  105. 2、双指同时点击,松开时一指先离开,另一指再离开
  106. 3、单指先触摸到,紧接着双指触摸,双指同时松开
  107. 4、单指先触摸到,紧接着双指触摸,松开时一指先离开,另一指再离开
  108. * Input : None
  109. * Output : None
  110. * Return : 1:双指双击 other:无效
  111. *******************************************************************************/
  112. UINT8 TwoPointsClick()
  113. {
  114. UINT8 flag = 0xff;
  115. if (bMoveFlag == 1) //双指有滑动,直接退出检测
  116. {
  117. byTouchNumberChange = 0;
  118. return(flag);
  119. }
  120. if (TouchNum == 0) //没有手指,已松键
  121. {
  122. //双指同时按下同时松开,并且触摸时间在400ms内
  123. if ((byTouchNumberChange == 2) && (byTouchTime2 < 10))
  124. {
  125. //CH552UART0SendByte(0xbb);
  126. flag = 1;
  127. }
  128. //两指同时按下,松开过程先变一指再松开,触摸时间在400ms内
  129. else if ((byTouchNumberChange == 3) && (byTouchTime1 < 10))
  130. {
  131. //CH552UART0SendByte(0xbb);
  132. flag = 1;
  133. }
  134. //按下时先单指接触再变两指接触,松开过程不管,触摸时间在400ms内
  135. else if ((byTouchNumberChange == 4) && (byTouchTime1 < 20) && (byTouchTime2 < 10))
  136. {
  137. //CH552UART0SendByte(0xbb);
  138. flag = 1;
  139. }
  140. byTouchNumberChange = 0;
  141. byTouchTime1 = 0;
  142. byTouchTime2 = 0;
  143. }
  144. else if ((TouchNum == 1) && (byTouchNumberChange != 0xFF)) //检测到单指触摸
  145. {
  146. if (byTouchNumberChange == 0) //如果之前没有触摸,说明在按下的过程先是一指触摸
  147. {
  148. byTouchNumberChange = 1;
  149. byTouchTime1 = 0;
  150. }
  151. else if (byTouchNumberChange == 2) //如果之前是两指触摸,说明在松开的过程先是一指离开
  152. {
  153. byTouchNumberChange = 3;
  154. }
  155. flag = 2;
  156. }
  157. else if ((TouchNum == 2) && (byTouchNumberChange != 0xFF)) //检测到两指触摸
  158. {
  159. if (byTouchNumberChange == 0) //如果之前没有触摸,说明在按下的过程是两指同时触摸
  160. {
  161. byTouchNumberChange = 2;
  162. byTouchTime1 = 0;
  163. byTouchTime2 = 0;
  164. }
  165. else if (byTouchNumberChange == 1) //如果之前先识别到一指触摸,说明在按下的过程是一指变两指
  166. {
  167. byTouchNumberChange = 4;
  168. byTouchTime2 = 0;
  169. }
  170. flag = 2;
  171. }
  172. else //其他手指数则非法
  173. {
  174. byTouchNumberChange = 0xFF;
  175. byTouchTime1 = 0;
  176. byTouchTime2 = 0;
  177. flag = 0;
  178. }
  179. return(flag);
  180. }
  181. void BackUpXPos()
  182. {
  183. UINT8 i;
  184. for (i = 0; i < 5; i++)
  185. {
  186. wCoorXBak[i] = TP[i].X_pos;
  187. }
  188. }
  189. void BackUpYPos()
  190. {
  191. UINT8 i;
  192. for (i = 0; i < 5; i++)
  193. {
  194. wCoorYBak[i] = TP[i].Y_pos;
  195. }
  196. }
  197. UINT16 GetAbs(UINT16 a, UINT16 b)
  198. {
  199. return a > b ? a - b : b - a;
  200. }
  201. void ReportKey()
  202. {
  203. #if (DEBUG!=Debug_USB)
  204. if (!IsBLEConnected() || BleReportPosEn == DISABLE)
  205. #else
  206. if (((!BleReportFirst) && EnumOK) || !IsBLEConnected() || BleReportPosEn == DISABLE)
  207. #endif
  208. {
  209. R8_UEP3_T_LEN = 9;
  210. R8_UEP3_CTRL = (R8_UEP3_CTRL & (~ MASK_UEP_T_RES)) | UEP_T_RES_ACK;
  211. }
  212. else
  213. {
  214. HidDev_Report(HID_RPT_ID_KEY_IN, HID_REPORT_TYPE_INPUT, 8, &pEP3_RAM_Addr[1]);
  215. }
  216. }
  217. UINT8 FourfingersGesture()
  218. {
  219. UINT8 i;
  220. UINT8 xmoveincount = 0;
  221. UINT8 ymoveincount = 0;
  222. UINT8 xmoveoutcount = 0;
  223. UINT8 ymoveoutcount = 0;
  224. memset(pEP3_RAM_Addr, 0, 9);
  225. pEP3_RAM_Addr[0] = HID_RPT_ID_KEY_IN;
  226. //CH552UART0SendByte(TouchNum);
  227. //PRINT("Touch=%d\n", TouchNum);
  228. if (TouchNum == 0)
  229. {
  230. byLeftRightMoveFlag = 0; //clean move flag
  231. byUpDownMoveFlag = 0;
  232. bFiveFingersMoveInFlag = 0;
  233. bFiveFingersMoveOutFlag = 0;
  234. if (byFourTouch || byFiveTouch)
  235. {
  236. if (byFourTouch == 3 || byFiveTouch == 3) //松键第一帧
  237. {
  238. pEP3_RAM_Addr[1] = 1; //上报Ctrl
  239. }
  240. else
  241. {
  242. pEP3_RAM_Addr[1] = 0;
  243. //防止鼠标判断有误,需要清除以下标志
  244. TouchNumBak = 0;
  245. TouchCount = 0;
  246. bTwoFingerCoorBak = 0;
  247. }
  248. ReportKey();
  249. if (byFourTouch)
  250. byFourTouch--;
  251. if (byFiveTouch)
  252. byFiveTouch--;
  253. return 1;
  254. }
  255. }
  256. else if (TouchNum == 4)
  257. {
  258. if (byFourTouch == 0 )
  259. {
  260. byFourTouch++;
  261. }
  262. else if (byFourTouch == 1)
  263. {
  264. byFiveTouch = 0;
  265. BackUpXPos();
  266. BackUpYPos();
  267. byFourTouch = 3;
  268. pEP3_RAM_Addr[1] = 1; //Ctrl
  269. ReportKey();
  270. }
  271. else if (byFourTouch > 1)
  272. {
  273. //上报了键值,要紧接着上报一帧Ctrl键,否则系统会识别长按键,键值功能失效
  274. if (bUpDowntMoveCtrl)
  275. {
  276. bUpDowntMoveCtrl = 0;
  277. //byFourTouch = 2; //这里上报了Ctrl,松键的时候就不上报Ctrl了
  278. pEP3_RAM_Addr[1] = 1; //上报Ctrl
  279. ReportKey();
  280. }
  281. if (TP[0].X_pos + LEFT_RIGHT_MOVE_DIS < wCoorXBak[0] && TP[1].X_pos + LEFT_RIGHT_MOVE_DIS < wCoorXBak[1]
  282. && TP[2].X_pos + LEFT_RIGHT_MOVE_DIS < wCoorXBak[2] /*&& TP[3].X_pos + LEFT_RIGHT_MOVE_DIS < wCoorXBak[3]*/) //left
  283. {
  284. //CH552UART0SendByte(0xF5);
  285. if (byLeftRightMoveFlag == 0 || byLeftRightMoveFlag == 2)
  286. {
  287. byLeftRightMoveFlag = 1;
  288. pEP3_RAM_Addr[1] = 0x01; //Ctrl
  289. pEP3_RAM_Addr[3] = 0x4f;//0x50; //<-
  290. ReportKey();
  291. }
  292. BackUpXPos();
  293. }
  294. else if (TP[0].X_pos > wCoorXBak[0] + LEFT_RIGHT_MOVE_DIS && TP[1].X_pos > wCoorXBak[1] + LEFT_RIGHT_MOVE_DIS
  295. && TP[2].X_pos > wCoorXBak[2] + LEFT_RIGHT_MOVE_DIS/* && TP[3].X_pos > wCoorXBak[3] + LEFT_RIGHT_MOVE_DIS*/) //right
  296. {
  297. //CH552UART0SendByte(0xF6);
  298. if (byLeftRightMoveFlag == 0 || byLeftRightMoveFlag == 1)
  299. {
  300. byLeftRightMoveFlag = 2;
  301. pEP3_RAM_Addr[1] = 0x01; //Ctrl
  302. pEP3_RAM_Addr[3] = 0x50;//0x4f; //->
  303. ReportKey();
  304. }
  305. BackUpXPos();
  306. }
  307. else if (TP[0].Y_pos + UP_DOWN_MOVE_DIS < wCoorYBak[0] && TP[1].Y_pos + UP_DOWN_MOVE_DIS < wCoorYBak[1]
  308. && TP[2].Y_pos + UP_DOWN_MOVE_DIS < wCoorYBak[2] /*&& TP[3].Y_pos + UP_DOWN_MOVE_DIS < wCoorYBak[3]*/) //Up
  309. {
  310. if (byUpDownMoveFlag == 0 || byUpDownMoveFlag == 2)
  311. {
  312. byUpDownMoveFlag = 1;
  313. bUpDowntMoveCtrl = 1;
  314. pEP3_RAM_Addr[1] = 0x01; //Ctrl
  315. pEP3_RAM_Addr[3] = 0x52; //up
  316. ReportKey();
  317. }
  318. BackUpYPos();
  319. }
  320. else if (TP[0].Y_pos > wCoorYBak[0] + UP_DOWN_MOVE_DIS && TP[1].Y_pos > wCoorYBak[1] + UP_DOWN_MOVE_DIS
  321. && TP[2].Y_pos > wCoorYBak[2] + UP_DOWN_MOVE_DIS /*&& TP[3].Y_pos > wCoorYBak[3] + UP_DOWN_MOVE_DIS*/) //Down
  322. {
  323. if (byUpDownMoveFlag == 0 || byUpDownMoveFlag == 1)
  324. {
  325. byUpDownMoveFlag = 2;
  326. bUpDowntMoveCtrl = 1;
  327. pEP3_RAM_Addr[1] = 0x01; //Ctrl
  328. pEP3_RAM_Addr[3] = 0x51; //down
  329. ReportKey();
  330. }
  331. BackUpYPos();
  332. }
  333. }
  334. return 1;
  335. }
  336. else if (TouchNum == 5) //五指手势识别
  337. {
  338. if (byFiveTouch == 0 )
  339. {
  340. byFiveTouch++;
  341. }
  342. else if (byFiveTouch == 1)
  343. {
  344. byFourTouch = 0;
  345. BackUpXPos();
  346. BackUpYPos();
  347. byFiveTouch = 3;
  348. pEP3_RAM_Addr[1] = 1; //Ctrl
  349. ReportKey();
  350. }
  351. else if (byFiveTouch > 1)
  352. {
  353. for (i = 0; i < 3; i++)
  354. {
  355. wDisCoorX[i] = GetAbs(TP[i].X_pos, TP[i + 2].X_pos);
  356. wDisCoorY[i] = GetAbs(TP[i].Y_pos, TP[i + 2].Y_pos);
  357. wDisCoorXbak[i] = GetAbs(wCoorXBak[i], wCoorXBak[i + 2]);
  358. wDisCoorYbak[i] = GetAbs(wCoorYBak[i], wCoorYBak[i + 2]);
  359. }
  360. wDisCoorX[3] = GetAbs(TP[0].X_pos, TP[4].X_pos);
  361. wDisCoorY[3] = GetAbs(TP[0].Y_pos, TP[4].Y_pos);
  362. wDisCoorXbak[3] = GetAbs(wCoorXBak[0], wCoorXBak[4]);
  363. wDisCoorYbak[3] = GetAbs(wCoorYBak[0], wCoorYBak[4]);
  364. //=======================Close========================//
  365. for (i = 0; i < 4; i++)
  366. {
  367. if (wDisCoorX[i] + FIVE_MOVE_DIS < wDisCoorXbak[i])
  368. {
  369. xmoveincount++;
  370. }
  371. if (wDisCoorY[i] + FIVE_MOVE_DIS < wDisCoorYbak[i])
  372. {
  373. ymoveincount++;
  374. }
  375. }
  376. if ((xmoveincount + ymoveincount >= 3))
  377. {
  378. if (bFiveFingersMoveInFlag == 0)
  379. {
  380. bFiveFingersMoveInFlag = 1;
  381. pEP3_RAM_Addr[1] = 1; //Ctrl
  382. pEP3_RAM_Addr[3] = 0x05; //B
  383. ReportKey();
  384. }
  385. BackUpXPos();
  386. BackUpYPos();
  387. }
  388. //=======================Open========================//
  389. for (i = 0; i < 4; i++)
  390. {
  391. if (wDisCoorX[i] > wDisCoorXbak[i] + FIVE_MOVE_DIS)
  392. {
  393. xmoveoutcount++;
  394. }
  395. if (wDisCoorY[i] > wDisCoorYbak[i] + FIVE_MOVE_DIS)
  396. {
  397. ymoveoutcount++;
  398. }
  399. }
  400. if (xmoveoutcount + ymoveoutcount >= 3)
  401. {
  402. //CH552UART0SendByte(0xF3);
  403. if (bFiveFingersMoveOutFlag == 0)
  404. {
  405. bFiveFingersMoveOutFlag = 1;
  406. pEP3_RAM_Addr[1] = 1; //Ctrl
  407. pEP3_RAM_Addr[3] = 0x05; //B
  408. ReportKey();
  409. }
  410. BackUpXPos();
  411. BackUpYPos();
  412. }
  413. }
  414. return 1;
  415. }
  416. else if (byFourTouch || byFiveTouch)
  417. {
  418. return 1;
  419. }
  420. return 0;
  421. }
  422. #endif
  423. #ifdef DOUBLECLIK_FILETER
  424. extern UINT16 Press_Flag;
  425. extern UINT16 Press_Flag_Bak1;
  426. extern UINT16 Press_Flag_Bak2;
  427. extern UINT16 StylusPress;
  428. UINT8 DoubleClickTimer = 0;
  429. void DoubleClickFilter(BOOL flag, UINT8 id)
  430. {
  431. static UINT16 PrePointX = 0xFFFF, PrePointY = 0xFFFF;
  432. //static UINT16 PreStylusPressure = 0;
  433. UINT16 Range = 240;
  434. //static UINT8 ID;
  435. #if USBCONFIG
  436. if(config.mouse_double_click_en ==0)
  437. return;
  438. #endif
  439. if(flag)
  440. {
  441. Range = 150;
  442. }
  443. if(DoubleClickTimer < 5)// || DoubleClickFlag) //400ms以内连续单指Touch
  444. {
  445. if(TP[id].X_pos < PrePointX + Range && TP[id].X_pos + Range > PrePointX
  446. && TP[id].Y_pos < PrePointY + Range && TP[id].Y_pos + Range > PrePointY)
  447. {
  448. //ID = id;
  449. TP[id].X_pos = PrePointX;
  450. TP[id].Y_pos = PrePointY;
  451. }
  452. else
  453. {
  454. DoubleClickTimer = 100;
  455. }
  456. }
  457. else
  458. {
  459. PrePointX = TP[id].X_pos;
  460. PrePointY = TP[id].Y_pos;
  461. }
  462. if((Press_Flag&Press_Flag_Bak1&Press_Flag_Bak2)==0 && !flag)
  463. {
  464. DoubleClickTimer = 0;
  465. }
  466. }
  467. #endif
  468. #ifdef CALL_OSD_MENU
  469. //双指在右下角下滑,串口上报命令调用OSD菜单
  470. #define X_RANGE 10916
  471. #define Y_RANGE 6400
  472. UINT8 CallOsdMenuCmd[10] = {0x55, 0x56, 0xd1, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x27};
  473. void CallOSDMenu()
  474. {
  475. UINT16 x_range = X_RANGE;
  476. if (TouchNum == 0)
  477. {
  478. byTwoTouch = 0;
  479. if (bTwoFingersMoveDown)
  480. {
  481. bTwoFingersMoveDown = 0;
  482. USART2_SendData(CallOsdMenuCmd, 10);
  483. }
  484. }
  485. else if (TouchNum == 2)
  486. {
  487. if(TpOption.uart_cmd == UART_COMMAND_A_90
  488. ||TpOption.uart_cmd == UART_COMMAND_B_90
  489. ||TpOption.uart_cmd == UART_COMMAND_A_270
  490. ||TpOption.uart_cmd == UART_COMMAND_B_270
  491. )
  492. {
  493. x_range = RESOLUTION_X/2;
  494. }
  495. if (TP[0].X_pos_back > x_range && TP[0].Y_pos_back > Y_RANGE && TP[1].X_pos_back > x_range && TP[1].Y_pos_back > Y_RANGE)
  496. {
  497. if (byTwoTouch == 0)
  498. {
  499. byTwoTouch++;
  500. }
  501. else if (byTwoTouch == 1)
  502. {
  503. wTwoPointsCoorYBak[0] = TP[0].Y_pos_back;
  504. wTwoPointsCoorYBak[1] = TP[1].Y_pos_back;
  505. byTwoTouch++;
  506. }
  507. else if (byTwoTouch > 1)
  508. {
  509. if (TP[0].Y_pos_back > wTwoPointsCoorYBak[0] + 320
  510. && TP[1].Y_pos_back > wTwoPointsCoorYBak[1] + 320)
  511. {
  512. //CH552UART0SendByte(0x66);
  513. bTwoFingersMoveDown = 1;
  514. }
  515. }
  516. }
  517. }
  518. }
  519. #endif