/dev/input/mouse0 と /dev/input/mice の違い

/dev/input/mouse0 と /dev/input/mice の違い

私はマウスの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);are
    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 軸の移動) なしに、すべてのマウス情報を読み取るにはどうすればよいですか?

答え1

Linux 入力サブシステム ユーザー空間 API ドキュメントあなたの質問に答えます。一般的に、すべてのファイル/dev/input/イベントハンドラデバイスイベントをユーザー空間に配信します。

/dev/input/mouse0 と /dev/input/mice とは何ですか?

から導入(重要な部分は私が強調しました)

1.3.1.3. マウスデバイス

mousedev は、マウス入力を使用するレガシー プログラムを動作させるためのハックです。マウスまたはデジタイザ/タブレットからイベントを取得し、PS/2 スタイル (/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

各マウスデバイスは、最後のマウスを除いて、1つのマウスまたはデジタイザに割り当てられます。この1つの文字デバイスは、すべてのマウスとデジタイザで共有されます。、何も接続されていない場合でも、デバイスは存在します。これは USB マウスのホットプラグに役立ち、ホットプラグに対応していない古いプログラムでも、マウスが存在しない場合でもデバイスを開くことができます。 [...]

Mousedev は、データを読み取るプログラムの要求に応じて、PS/2、ImPS/2 (Microsoft IntelliMouse)、または ExplorerPS/2 (IntelliMouse Explorer) プロトコルのいずれかを生成します。GPM と X をこれらのいずれかに設定できます。USBマウスのホイールを利用するにはImPS/2が必要です。追加のボタン(最大 5 個)を使用する場合は、ExplorerPS/2 を使用します。

...これは、マウス ホイール イベントが表示されない理由にもなります。これはレガシー プログラム用の「ハック」なので、必要がない限り使用しないでください。

マウスのすべての情報を読み取るにはどうすればよいですか? [...]

/dev/input/eventX提供されている対応するファイルを使用してください。エヴデヴ(イベント ハンドラー。xorg ドライバー evdev と混同しないでください)。明らかに、2 番目のコード スニペットが行っているのはこれです。

...しかし、優先順位の問題はどうでしょうか?

優先順位の問題はありません。2.2. イベントコード:

SYN_レポート:

イベントを同期し、入力データの変更のパケットに分離するために使用されます。同じ瞬間に起こるたとえば、マウスの動きによって、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デバイスによって生成されたイベントを確認するためにも使用できます。ソースコードは以下にあります。ここそれがどのように機能するかに興味がある場合。

答え2

私の場合は、OS のマウス イベントを実行しようとしました。コードは次のapp.jsとおりです。

var Mouse = require("./node_modules/node-mouse/mouse");
 
var m = new Mouse();
 
m.on("mousedown",function(event) {
    console.log(event);
});
 
m.on("mouseup",function(event) {
    console.log(event);
});
 
// same as mouseup, but fired after
m.on("click",function(event) {
    console.log(event);
});
 
 
m.on("mousemove", function(event) {
    console.log(event);
});

私は走っていたnode app.js

だから次のエラーが発生します

Error: EACCES: permission denied, open '/dev/input/mice'
Emitted 'error' event on Mouse instance at:

だから単純にsudo そのように実行する

node app.js

次のエラーは発生しません

{
  leftBtn: false,
  rightBtn: false,
  middleBtn: false,
  xSign: false,
  ySign: false,
  xOverflow: false,
  yOverflow: false,
  xDelta: 0,
  yDelta: 0,
  type: 'click',
  button: 1,
  dev: 'mice'
}
{
  leftBtn: false,
  rightBtn: false,
  middleBtn: false,
  xSign: false,
  ySign: false,
  xOverflow: false,
  yOverflow: false,
  xDelta: 0,
  yDelta: 0,
  type: 'click',
  button: 0,
  dev: 'mice'
}
{
  leftBtn: false,
  rightBtn: false,
  middleBtn: false,
  xSign: false,
  ySign: false,
  xOverflow: false,
  yOverflow: false,
  xDelta: 0,
  yDelta: 0,
  type: 'click',
  button: 0,
  dev: 'mice'
}

関連情報