Linux輸入設備應用編程(觸摸屏獲取坐標信息)

上一章學習了開發板外接鍵盤并獲取鍵盤的的輸入

Linux輸入設備應用編程(鍵盤,按鍵)-CSDN博客

本章編寫觸摸屏應用程序,獲取觸摸屏的坐標信息并將其打印出來

目錄

一 觸摸屏數據分析(觸摸,點擊,松開)

1.1 硬件須知?

1.2 觸摸屏信息分析

二 觸摸屏應用編程

2.1 獲取觸摸屏的最大同時觸點

2.2? 觸摸屏單點觸點編程


一 觸摸屏數據分析(觸摸,點擊,松開)

1.1 硬件須知?

首先在測試觸摸屏之前,需要保證開發板上已經連接了LCD屏

使用命令"cat /proc/bus/input/devices",確定觸摸屏對應的設備節點(本人將指令封裝成了cat_dev),如下所示: ?

7寸的LCD屏?紅線劃的是我LCD的設備名與設備節點

1.2 觸摸屏信息分析

執行input文件后,一個手指點擊觸摸屏后松開,終端將會打印如下信息: ?

首先第一行上報了絕對位移事件EV_ABS(type=3)中的ABS_MT_TRACKING_ID(code=57)事件,并且value值等于246,也就是ID,這個ID是一個非負數,所以表示這是一個新的觸摸點被創建,也就意味著觸摸屏上產生了一個新的觸摸點(手指按下)。

第二行上報了絕對位移事件EV_ABS(type=3)中的ABS_MT_POSITION_X(code=53)事件,其value對應的便是觸摸點的X坐標;

第三行上報了ABS_MT_POSITION_Y(code=54)事件,其value值對應的便是觸摸點Y坐標,所以由此可知該觸摸點的坐標為(890, 445)。

第四行上報了按鍵類事件EV_KEY(type=1)中的BTN_TOUCH(code=330),value值等于1,表示這是觸摸屏上最先產生的觸摸點(slot=0、也就是觸摸點0)。

第五行和第六行分別上報了絕對位移事件EV_ABS(type=3)中的ABS_X(code=0)和ABS_Y(code=1),其value分別對應的是觸摸點的X坐標和Y坐標。多點觸摸設備也會通過ABS_X、ABS_Y事件上報觸摸點的X、Y坐標,但通常只有觸摸點0支持,所以可以把多點觸摸設備當成單點觸摸設備來使用。

第七行上報了同步類事件EV_SYN(type=0)中的SYN_REPORT(code=0)事件,表示此次觸摸點的信息全部上報完畢。

第八行當手指松開時,觸摸點就會被銷毀,上報ABS_MT_TRACKING_ID事件,并將value設置為-1(ID)

第四行上報了按鍵類事件EV_KEY(type=1)中的BTN_TOUCH(code=330),value值等于0,表示觸摸屏上的觸摸點銷毀

最后一行上報同步事件(type=0、code=0),告知應用層數據完整。

二 觸摸屏應用編程

2.1 獲取觸摸屏的最大同時觸點

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>int main(int argc, char *argv[])
{struct input_absinfo info;    //調用 ioctl()會將獲取到的信息寫入到struct input_absinfo對象int fd = -1;int max_slots;                            //最大觸摸點數/* 校驗傳參 */if (2 != argc) {fprintf(stderr, "usage: %s <input-dev>\n", argv[0]);exit(-1);}/* 打開文件 */if (0 > (fd = open(argv[1], O_RDONLY))) {perror("open error");exit(-1);}/* 獲取slot信息 */if (0 > ioctl(fd, EVIOCGABS(ABS_MT_SLOT), &info)) {perror("ioctl error");close(fd);exit(-1);}max_slots = info.maximum + 1 - info.minimum;printf("max_slots: %d\n", max_slots);/* 關閉、退出 */close(fd);exit(0);
}

?代碼寫完后,進行交叉編譯,通過scp指令將文件發送到開發板上,然后執行input_slot文件

所以從打印結果可知,我們這個屏是一個5點觸摸屏。?

2.2? 觸摸屏單點觸點編程

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>int main(int argc, char *argv[])
{int fd = -1;struct input_event in_ev;int x = 0;                                      //觸摸點 x和 y坐標 int y = 0;int start = 3;                             //用于記錄 BTN_TOUCH事件的 value,1表示按下,0表示松開,-1表示移動int valid = -1;                             //用于記錄數據是否有效(我們關注的信息發生更新表示有效,1表示有效,0表示無效/* 校驗傳參 */if (2 != argc) {fprintf(stderr, "usage: %s <input-dev>\n", argv[0]);exit(-1);}/* 打開文件 */if (0 > (fd = open(argv[1], O_RDONLY))) {perror("open error");exit(-1);}while(1){if(sizeof(struct input_event) != read(fd,&in_ev,sizeof(struct input_event))){perror(" ");exit(-1);}switch (in_ev.type){case EV_KEY:  //按鍵事件if (BTN_TOUCH == in_ev.code)    //觸摸屏第一個點{                start = in_ev.value;       //觸摸屏狀態valid = 1;           //同步時間標志位}break;case EV_ABS:    //絕對位移事件             switch (in_ev.code) {             case ABS_X: //X坐標x = in_ev.value;valid = 1;                 break;             case ABS_Y: //Y坐標                 y = in_ev.value;                 valid = 1;                 break;             }             break; case EV_SYN:    //同步事件if (SYN_REPORT == in_ev.code) {if (valid) {//判斷是否有效switch (start) {//判斷狀態case 1:printf("按下(%d, %d)\n", x, y);break;case 0:printf("松開\n");break;case -1:printf("移動(%d, %d)\n", x, y);break;}valid = 0; //重置validstart = -1; //重置start}}break;}}/* 關閉、退出 */close(fd);exit(0);
}

程序中首先校驗傳參,通過傳參的方式將觸摸屏設備文件路徑傳入到程序中,main()函數中定義了4個變量:

  1. 變量x表示觸摸點的X坐標;
  2. 變量y表示觸摸點的Y坐標;
  3. 變量start表示手指狀態時候按下、松開還是滑動,start=1表示手指按下、start=0表示手指松開、start=-1表示手指滑動;
  4. 變量valid表示數據是否有效,valid=1表示有效、valid=0表示無效;有效指的是我們檢測的信息發生了更改,譬如程序中只檢測了手指的按下、松開動作以及坐標值的變化。

接著調用open()打開觸摸屏設備文件得到文件描述符fd;在for循環之前,首先對x、y、start、valid這4個變量進行初始化操作。在for循環讀取觸摸屏上報的數據,將讀取到的數據存放在struct input_event數據結構中。在switch…case語句中對讀取到的數據進行解析,獲取BTN_TOUCH事件的value數據,判斷觸摸屏是按下還是松開狀態,獲取ABS_X和ABS_Y事件的value變量,得到觸摸點的X軸坐標和Y軸坐標。

當上報同步事件時,表示數據已經完整,接著對我們得到的數據進行分析、打印坐標信息。

將編譯得到的可執行文件拷貝到開發板,準備進行測試。

當手指點擊觸摸屏時會打印"按下(X, Y)",松開時會打印"松開",手指在觸摸屏上滑動時會打印"移動(X, Y)"等信息。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/160803.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160803.shtml
英文地址,請注明出處:http://en.pswp.cn/news/160803.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

采用connector-c++ 8.0操作數據庫

1.下載最新的Connector https://dev.mysql.com/downloads/connector/cpp/&#xff0c;下載帶debug的庫。 解壓縮到本地&#xff0c;本次使用的是帶debug模式的connector庫&#xff1a; 注&#xff1a;其中mysqlcppconn與mysqlcppconn8的區別是&#xff1a; 2.在cmakelist…

請簡要說明 Mysql 中 MyISAM 和 InnoDB 引擎的區別

“請簡要說明 Mysql 中 MyISAM 和 InnoDB 引擎的區別”。 屏幕前有多少同學在面試過程與遇到過類似問題&#xff0c; 可以在評論區留言&#xff1a;遇到過。 考察目的 對于 xxxx 技術的區別&#xff0c;在面試中是很常見的一個問題 一般情況下&#xff0c;面試官會通過這類…

SpringBoot監聽器解析

監聽器模式介紹 監聽器模式的要素 事件監聽器廣播器觸發機制 SpringBoot監聽器實現 系統事件 事件發送順序 監聽器注冊 監聽器注冊和初始化器注冊流程類似 監聽器觸發機制 獲取監聽器列表核心流程: 通用觸發條件: 自定義監聽器實現 實現方式1 實現監聽器接口: Order(1) …

[操作系統]進程和線程

目錄 1.什么是進程 1.1進程控制塊抽象 1.2 CPU 分配 —— 進程調度&#xff08;Process Scheduling&#xff09; 1.3內存分配 —— 內存管理&#xff08;Memory Manage&#xff09; 1.4進程間通信(Inter Process Communication) 2.線程 2.1概念 2.2為什么要有線程 2.3線…

論文閱讀 Forecasting at Scale (二)

最近在看時間序列的文章&#xff0c;回顧下經典 論文地址 項目地址 Forecasting at Scale 3.2、季節性 3.3、假日和活動事件3.4、模型擬合3.5、分析師參與的循環建模4、自動化預測評估4.1、使用基線預測4.2、建模預測準確性4.3、模擬歷史預測4.4、識別大的預測誤差 5、結論6、致…

【Python】重磅!這本30w人都在看的Python數據分析暢銷書更新了!

Python 語言極具吸引力。自從 1991 年誕生以來&#xff0c;Python 如今已經成為最受歡迎的解釋型編程語言。 【文末送書】今天推薦一本Python領域優質數據分析書籍&#xff0c;這本30w人都在看的書&#xff0c;值得入手。 目錄 作譯者簡介主要變動導讀視頻購書鏈接文末送書 pan…

【計算機方向】通信、算法、自動化、機器人、電子電氣、計算機工程、控制工程、計算機視覺~~~~~合集!!!

◆本文為大家梳理了近期可投的EI國際會議&#xff0c;涵蓋計算機各個學科方向&#xff0c;均可EI檢索 本期EI會議匯總合集涵蓋領域&#xff1a;計算機視覺、物聯網、算法、通信、智能技術、人工智能、人機交互、機器人、電子電氣等眾多領域&#xff01; 本期所推薦的EI會議有…

ros2不同機器通訊時IP設置

看到這就是不同機器的IP地址&#xff0c;為了避免在路由器為不同的機器使用DHCP分配到上面的地址&#xff0c;可以設置DHCP分配的范圍&#xff1a;&#xff08;我的路由器是如下設置的&#xff0c;一般路由器型號都不一樣&#xff0c;自己找一下&#xff09; 防火墻設置-----&…

Leetcode—13.羅馬數字轉整數【簡單】

2023每日刷題&#xff08;三十七&#xff09; Leetcode—13.羅馬數字轉整數 算法思想 當前位置的元素比下個位置的元素小&#xff0c;就減去當前值&#xff0c;否則加上當前值 實現代碼 int getValue(char c) {switch(c) {case I:return 1;case V:return 5;case X:return 1…

elasticsearch 8安裝

問題提前報 max virtual memory areas error max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] 如果您的環境是Linux&#xff0c;注意要做以下操作&#xff0c;否則es可能會啟動失敗 1 用編輯工具打開文件/etc/sysctl.conf 2 …

wpf使用CefSharp.OffScreen模擬網頁登錄,并獲取身份cookie

目錄 框架信息&#xff1a;MainWindow.xamlMainWindow.xaml.cs爬取邏輯模擬登錄攔截請求Cookie獲取 CookieVisitorHandle 框架信息&#xff1a; CefSharp.OffScreen.NETCore 119.1.20 MainWindow.xaml <Window x:Class"Wpf_CHZC_Img_Identy_ApiDataGet.MainWindow&qu…

selinux-policy-default(2:2.20231119-2)軟件包內容詳細介紹(2)

接前一篇文章&#xff1a;selinux-policy-default&#xff08;2:2.20231119-2&#xff09;軟件包內容詳細介紹&#xff08;1&#xff09; 4. 重點文件內容解析 &#xff08;1&#xff09;control/postist文件 文件內容如下&#xff1a; #!/bin/sh set -e# summary of how th…

22LLMSecEval數據集及其在評估大模型代碼安全中的應用:GPT3和Codex根據LLMSecEval的提示生成代碼和代碼補全,CodeQL進行安全評估

LLMSecEval: A Dataset of Natural Language Prompts for Security Evaluations 寫在最前面主要工作 課堂討論大模型和密碼方向&#xff08;沒做&#xff0c;只是一個idea&#xff09; 相關研究提示集目標NL提示的建立NL提示的建立流程 數據集數據集分析 存在的問題 寫在最前面…

力扣算法練習BM45—滑塊窗口的最大值

題目 給定一個長度為 n 的數組 num 和滑動窗口的大小 size &#xff0c;找出所有滑動窗口里數值的最大值。 例如&#xff0c;如果輸入數組{2,3,4,2,6,2,5,1}及滑動窗口的大小3&#xff0c;那么一共存在6個滑動窗口&#xff0c;他們的最大值分別為{4,4,6,6,6,5}&#xff1b; 針…

使用Python畫一棵樹

&#x1f38a;專欄【不單調的代碼】 &#x1f354;喜歡的詩句&#xff1a;更喜岷山千里雪 三軍過后盡開顏。 &#x1f386;音樂分享【如愿】 &#x1f970;歡迎并且感謝大家指出我的問題 文章目錄 &#x1f339;Turtle模塊&#x1f384;效果&#x1f33a;代碼&#x1f6f8;代碼…

【tomcat】java.lang.Exception: Socket bind failed: [730048

項目中一些舊工程運行情況處理 問題 1、啟動端口占用 2、打印編碼亂碼 ??&#xfffd;&#xfffd; 13, 2023 9:33:26 &#xfffd;&#xfffd;&#xfffd;&#xfffd; org.apache.coyote.AbstractProtocol init &#xfffd;&#xfffd;&#xfffd;&#xfffd;: Fa…

五毛QQ項目記

問題與挑戰&#xff1a;某公司為了實現某馬總造福全人類&#xff0c;紅旗插遍全球的宏偉目標&#xff0c;為應對后續用戶量激增的問題。特別安排了一次針對全體用戶的秒殺活動&#xff1a;于XXXX年XX月XX日XX時XX分XX秒開始的秒殺五毛錢一百個QQ幣的活動。每個賬戶僅限一次&…

oracle面試相關的,Oracle基本操作的SQL命令

文章目錄 數據庫-Oracle〇、Oracle用戶管理一、Oracle數據庫操作二、Oracle表操作1、創建表2、刪除表3、重命名表4、增加字段5、修改字段6、重名字段7、刪除字段8、添加主鍵9、刪除主鍵10、創建索引11、刪除索引12、創建視圖13、刪除視圖 三、Oracle操作數據1、數據查詢2、插入…

ubuntu 20.04如何切換gcc/g++/python的版本

ubuntu 20.04如何切換gcc/g/python的版本 1 安裝gcc/g/python2 設置gcc/g/python的備選項3 選擇當前系統要使用的gcc/g/python版本3.1 切換gcc/g/python版本3.2 切換示例 當系統同時存在gcc-9以及gcc-10時該如何切換讓當前的系統gcc版本指向gcc-9或是gcc-10呢&#xff1f;g也同…