linuxタッチスクリーン(一)タッチスクリーンアプリケーションの作成
5646 ワード
linuxタッチスクリーン
linuxタッチスクリーン(一)タッチスクリーンアプリケーションの作成
linuxタッチスクリーン(二)tslibを使用
タッチスクリーン駆動は一般的にinputサブシステム駆動フレームワークで実現されるので、アプリケーション層インタフェースはinputフレームワークのインタフェースに従い、タッチスクリーンアプリケーションの作成を紹介する前に、まずinputアプリケーションのプログラミングを学ぶ.
一、hexdumpを用いてinputデバイスを読み取る
Linuxで見る
例えば私の結果は
これらはすべてinputサブシステムによって実現される入力装置駆動であり、inputサブシステム規範に従う.
ここでevent 2は私のタッチスクリーンデバイスノードであり、次のコマンドで読み取ります(hexdump読み取りの数は16進数で印刷されます).
タッチパネルをクリックして離すと、コンソールに多くのメッセージが印刷されています.
どの行も1つのinputイベントを表していますが、単純に見ると分析できないので、まずinputイベントを紹介してから分析する必要があります.
二、inputイベント分析
Inputイベント構造体の定義は、Linuxカーネルの
各inputイベントには32ビットの秒,32ビットの微妙さを含む時間があることがわかる.
また、16ビットのtype(イベントタイプ)、16ビットのcode(イベントキー値)、32ビットのvalue(値)もあります.
はい、今また疑問があります.type、code、valueは具体的に何ですか.
タイプ
typeとはイベントタイプを指し、
1つのデバイスには、マウスがボタンをクリックするとボタンイベントが報告され、移動時に相対位置イベントが報告されるなど、さまざまなタイプのイベントがあります.
code
codeはイベントのキー値を指し、イベントタイプ内のサブイベントで、各イベントタイプに対応する一連のキー値があります.
例えば、ボタンイベントでは、このボタンはボタン1かボタン2かマウスの左ボタンかを示します.
例えば、絶対位置イベントでは、このイベントはX軸かY軸かを指します.キーイベントのキー値 相対位置イベントのキー値 絶対位置イベント
他にもイベントタイプがありますここでは詳しく説明しません
value
valueはcode(キー値)に対応する値であり、codeタイプの変化に伴って解釈が変化する
例えば、キーイベントにおいて、codeがキー1を示す場合、valueは1を示すキー1が押下され、0を示すキー1が押下されていないことに等しい
絶対位置イベントでcodeがX軸座標を表す場合、valueはX軸座標におけるタッチポイントの位置を表す
ここまでinputイベントの理解はクリアされているはずですが、これらの理解があれば、hexdumpで読み込んだデータを解析してみましょう.
上位64ビットはイベントを表しているので,ここでは解析しない.
1:絶対位置イベント、X軸708箇所
2:絶対位置イベント、Y軸385箇所
3:ボタンイベント、タッチパネルボタン、1は押すことを表す
4:絶対位置イベント、絶対位置押し、圧力1(一部のタッチパネルは圧力検出があり、このタッチパネルはないので直接報告した)
5:イベントの同期、分離
6:ボタンイベント、タッチパネルボタン、0は緩みを表す
7:絶対位置イベント、絶対位置押圧、圧力0、表緩み
8:同期イベント
三、タッチスクリーン応用プログラミング
Inputイベントをクリアした後、1つのアプリを書くのはとても簡単で、タッチパネルを例にして、私たちは直接
linuxタッチスクリーン(一)タッチスクリーンアプリケーションの作成
linuxタッチスクリーン(二)tslibを使用
タッチスクリーン駆動は一般的にinputサブシステム駆動フレームワークで実現されるので、アプリケーション層インタフェースはinputフレームワークのインタフェースに従い、タッチスクリーンアプリケーションの作成を紹介する前に、まずinputアプリケーションのプログラミングを学ぶ.
一、hexdumpを用いてinputデバイスを読み取る
Linuxで見る
ls /dev/input
現在ある入力デバイスを見ることができます例えば私の結果は
# ls /dev/input/
event0 event1 event2 mice mouse0 mouse1
これらはすべてinputサブシステムによって実現される入力装置駆動であり、inputサブシステム規範に従う.
ここでevent 2は私のタッチスクリーンデバイスノードであり、次のコマンドで読み取ります(hexdump読み取りの数は16進数で印刷されます).
# hexdump /dev/input/event2
タッチパネルをクリックして離すと、コンソールに多くのメッセージが印刷されています.
0247 0000 00d3 000e 0003 0000 02c4 0000
0247 0000 00db 000e 0003 0001 0181 0000
0247 0000 00de 000e 0001 014a 0001 0000
0247 0000 00e0 000e 0003 0018 0001 0000
0247 0000 00e2 000e 0000 0000 0000 0000
0248 0000 c838 0002 0001 014a 0000 0000
0248 0000 c876 0002 0003 0018 0000 0000
0248 0000 c89f 0002 0000 0000 0000 0000
どの行も1つのinputイベントを表していますが、単純に見ると分析できないので、まずinputイベントを紹介してから分析する必要があります.
二、inputイベント分析
Inputイベント構造体の定義は、Linuxカーネルの
include\linux\input.h
ファイルstruct timeval {
__kernel_time_t tv_sec; /* seconds,32bit */
__kernel_suseconds_t tv_usec; /* microseconds,32bit */
};
struct input_event {
struct timeval time; //
__u16 type; //
__u16 code; //
__s32 value; //
};
各inputイベントには32ビットの秒,32ビットの微妙さを含む時間があることがわかる.
また、16ビットのtype(イベントタイプ)、16ビットのcode(イベントキー値)、32ビットのvalue(値)もあります.
はい、今また疑問があります.type、code、valueは具体的に何ですか.
タイプ
typeとはイベントタイプを指し、
include\linux\input.h
ファイルに一連のイベントタイプが定義されている#define EV_SYN 0x00 // ,
#define EV_KEY 0x01 // , 、 、
#define EV_REL 0x02 // ,
#define EV_ABS 0x03 // ,
...
1つのデバイスには、マウスがボタンをクリックするとボタンイベントが報告され、移動時に相対位置イベントが報告されるなど、さまざまなタイプのイベントがあります.
code
codeはイベントのキー値を指し、イベントタイプ内のサブイベントで、各イベントタイプに対応する一連のキー値があります.
例えば、ボタンイベントでは、このボタンはボタン1かボタン2かマウスの左ボタンかを示します.
例えば、絶対位置イベントでは、このイベントはX軸かY軸かを指します.
include\linux\input.h
一連のイベントキー値がファイルに定義されている#define KEY_1 2
#define KEY_2 3
#define KEY_3 4
...
#define KEY_A 30
#define KEY_S 31
#define KEY_D 32
...
#define REL_X 0x00 //x
#define REL_Y 0x01 //y
#define REL_Z 0x02 //z
#define REL_RX 0x03
#define REL_RY 0x04
#define REL_RZ 0x05
#define REL_HWHEEL 0x06
#define REL_DIAL 0x07
#define REL_WHEEL 0x08
#define REL_MISC 0x09
#define ABS_X 0x00
#define ABS_Y 0x01
#define ABS_Z 0x02
...
#define ABS_PRESSURE 0x18
...
他にもイベントタイプがありますここでは詳しく説明しません
value
valueはcode(キー値)に対応する値であり、codeタイプの変化に伴って解釈が変化する
例えば、キーイベントにおいて、codeがキー1を示す場合、valueは1を示すキー1が押下され、0を示すキー1が押下されていないことに等しい
絶対位置イベントでcodeがX軸座標を表す場合、valueはX軸座標におけるタッチポイントの位置を表す
ここまでinputイベントの理解はクリアされているはずですが、これらの理解があれば、hexdumpで読み込んだデータを解析してみましょう.
上位64ビットはイベントを表しているので,ここでは解析しない.
s |us |type|code|value
1: 0247 0000 00d3 000e 0003 0000 02c4 0000 //EV_ABS、ABS_X、708
2: 0247 0000 00db 000e 0003 0001 0181 0000 //EV_ABS、ABS_Y、385
3: 0247 0000 00de 000e 0001 014a 0001 0000 //EV_KEY、BTN_TOUCH、1
4: 0247 0000 00e0 000e 0003 0018 0001 0000 //EV_ABS、ABS_PRESSURE、1
5: 0247 0000 00e2 000e 0000 0000 0000 0000 //EV_SYN
6: 0248 0000 c838 0002 0001 014a 0000 0000 //EV_KEY、BTN_TOUCH、0
7: 0248 0000 c876 0002 0003 0018 0000 0000 //EV_ABS、ABS_PRESSURE、0
8: 0248 0000 c89f 0002 0000 0000 0000 0000 //EV_SYN
1:絶対位置イベント、X軸708箇所
2:絶対位置イベント、Y軸385箇所
3:ボタンイベント、タッチパネルボタン、1は押すことを表す
4:絶対位置イベント、絶対位置押し、圧力1(一部のタッチパネルは圧力検出があり、このタッチパネルはないので直接報告した)
5:イベントの同期、分離
6:ボタンイベント、タッチパネルボタン、0は緩みを表す
7:絶対位置イベント、絶対位置押圧、圧力0、表緩み
8:同期イベント
三、タッチスクリーン応用プログラミング
Inputイベントをクリアした後、1つのアプリを書くのはとても簡単で、タッチパネルを例にして、私たちは直接
struct input_event
対象を読み取ることができて、それからtype
・code
・・key
・によって解析します#include
#include
#include
#include
#include
#include
int main(int argc, char* argv[])
{
if(argc != 2)
{
printf("Usage: %s
", argv[0]);
return -1;
}
int fd = open(argv[1], O_RDONLY);
if(fd < 0)
{
printf("failed to open %s
", argv[1]);
return -1;
}
struct input_event event;
int x = 0, y = 0;
while(1)
{
memset(&event, 0, sizeof(event));
read(fd, &event, sizeof(event));
if(event.type == EV_SYN)
continue;
if(event.type == EV_ABS)
{
if(event.code == ABS_X)
x = event.value;
else if(event.code == ABS_Y)
y = event.value;
}
else if(event.type == EV_KEY)
{
if(event.value == 1)
{
printf("touch press (%d,%d)
", x, y);
}
else if(event.value == 0)
{
printf("touch release (%d,%d)
", x, y);
x = 0;
y = 0;
}
}
else
continue;
}
close(fd);
return 0;
}