linuxタッチスクリーン(一)タッチスクリーンアプリケーションの作成

5646 ワード

linuxタッチスクリーン
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対象を読み取ることができて、それからtypecode・・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; }