私はマウスUSBドライバーを使用していますが、/dev/input/mouse0
および/dev/input/mice
によって送信された情報をどのように区別して使用するかわかりません。
Googleで数回検索したところ、/dev/input/mice
の使用に関するコードがいくつか見つかりました
int fd, bytes;
unsigned char data[4];
const char *pDevice = "/dev/input/mice";
// Open Mouse
fd = open(pDevice, O_RDWR);
if(fd == -1)
{
printf("ERROR Opening %s\n", pDevice);
return -1;
}
int left, middle, right;
signed char x, y;
// Read Mouse
bytes = read(fd, data, sizeof(data));
if(bytes > 0)
{
left = data[0] & 0x1;
right = data[0] & 0x2;
middle = data[0] & 0x4;
x = data[1];
y = data[2];
printf("x=%d, y=%d, left=%d, middle=%d, right=%d\n", x, y, left, middle, right);
if(left)
return left;
if(right)
return right;
if(middle)
return middle;
}
return 0;
このプログラムは動作しますが、ホイールスクロールに関する情報を取得しませんでした
/dev/input/event0
を使用するプログラムを見つけることができました
int fd;
struct input_event ev
const char* pFile = "/dev/input/event0";
fd = open(pFile, O_RDONLY);
if(fd == -1)
{
printf("ERROR Opening %s\n", pFile);
return -1;
}
read(fd, &ev, sizeof(ev));
std::cout << "type : " << ev.type << " code : " << ev.code << " value : " << ev.value << std::endl;
close(fd);
return 0;
ただし、このファイルは同時に1つの座標しか保存せず、X座標はYを優先するため、斜め方向の移動には問題があります。 Y軸上でマウスを動かしたいときはとても面倒です
ただし、/dev/input/mouse0
を使用するコードが見つからないため、このファイルにはどのような情報が保存されますか?
私の質問は次のとおりです。1. /dev/input/mouse0
に保存される情報は何ですか? 2. 2つのファイルを開かずに、優先順位の問題(全体のスクロール+ X/Y軸の移動)なしに、すべてのマウス情報を読み取るにはどうすればよいですか?
Linux Input SubsystemユーザースペースAPIドキュメント が質問に答えます。一般に、/dev/input/
のすべてのファイルは、デバイスイベントをユーザースペースに配布するイベントハンドラーによって提供されます。
introduction (重要な部分が強調表示されています)から
1.3.1.3。 mousedev
mousedevは、マウス入力を使用するレガシープログラムを機能させるためのハックです。マウスまたはデジタイザー/タブレットのいずれかからイベントを取得し、PS/2スタイル(la/dev/psaux)マウスデバイスをユーザーランドで使用できるようにします。
/ dev/input内のMousedevデバイス(上記を参照)は次のとおりです。
crw-r--r-- 1 root root 13, 32 Mar 28 22:45 mouse0 crw-r--r-- 1 root root 13, 33 Mar 29 00:41 mouse1 crw-r--r-- 1 root root 13, 34 Mar 29 00:41 mouse2 crw-r--r-- 1 root root 13, 35 Apr 1 10:50 mouse3 ... ... crw-r--r-- 1 root root 13, 62 Apr 1 10:50 mouse30 crw-r--r-- 1 root root 13, 63 Apr 1 10:50 mice
各マウスデバイスは、最後のマウスを除く単一のマウスまたはデジタイザに割り当てられます-マウス。この単一文字のデバイスは、すべてのマウスとデジタイザーで共有されており、接続されていなくてもデバイスは存在します。これは、USBマウスのホットプラグに役立ちます。これにより、ホットプラグを処理しない古いプログラムは、マウスが存在しない場合でもデバイスを開くことができます。 [...]
Mousedevは、データを読み取るプログラムの要求に応じて、PS/2、ImPS/2(Microsoft IntelliMouse)またはExplorerPS/2(IntelliMouse Explorer)プロトコルのいずれかを生成します。 GPMとXをこれらのいずれかに設定できます。 USBマウスのホイールを使用する場合はImPS/2が必要で、追加の(up 5)ボタン。
...これは、マウスホイールイベントが表示されない理由でもあります。レガシープログラムの「ハック」であるため、必要がない場合は使用しないでください。
evdevによって提供される対応する/dev/input/eventX
ファイルを使用します(xorg-driver evdevと混同しないように、イベントハンドラー)。それが、2番目のコードスニペットが明らかにすることです。
優先順位の問題はありません。 2.2。イベントコード によると:
SYN_REPORT:
イベントを同期化して、同じ瞬間に発生する入力データ変更のパケットに分離するために使用されます。たとえば、マウスのモーションは、1つのモーションに対してREL_XおよびREL_Yの値を設定し、SYN_REPORTを発行します。次のモーションは、さらにREL_XおよびREL_Y値を発行し、別のSYN_REPORTを送信します。
SYN_REPORT
イベントまでのすべての連続したイベントは同時に発生したとみなすことができるため、レポートされる順序は重要ではありません。
たとえば、( このプログラム を使用してgithubで見つけました):
time:1528290186.256449 type:EV_REL code:REL_X value:-1
time:1528290186.256449 type:EV_REL code:REL_Y value:1
time:1528290186.256449 type:EV_SYN code:SYN_REPORT value:0
time:1528290186.264460 type:EV_REL code:REL_Y value:1
time:1528290186.264460 type:EV_REL code:REL_WHEEL value:-1
time:1528290186.264460 type:EV_SYN code:SYN_REPORT value:0
ご覧のとおり、同時イベントはSYN_REPORT
イベントで区切られているだけでなく、同じタイムスタンプも持っています。
ところで、evtest
を使用して、デバイスによって生成されたイベントを表示することもできます。ソースコードを見つけることができます こちら 仕組みに興味があるなら。