/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

각 마우스 장치는 마지막 마우스를 제외하고 단일 마우스 또는 디지타이저에 할당됩니다. 이 단일 문자 장치는 모든 마우스와 디지타이저에서 공유됩니다., 연결된 것이 없더라도 장치는 존재합니다. 이는 USB 마우스를 핫플러그하는 데 유용하므로 핫플러그를 처리하지 않는 오래된 프로그램은 마우스가 없을 때에도 장치를 열 수 있습니다. [...]

Mousedev는 프로그램이 데이터를 읽는 방식에 따라 PS/2, ImPS/2(Microsoft IntelliMouse) 또는 ExplorerPS/2(IntelliMouse Explorer) 프로토콜을 생성합니다. GPM과 X를 이들 중 하나로 설정할 수 있습니다.USB 마우스의 휠을 사용하려면 ImPS/2가 필요합니다.추가(최대 5개) 버튼을 사용하려는 경우 ExplorerPS/2.

...이것이 마우스 휠 이벤트가 표시되지 않는 이유일 수도 있습니다. 레거시 프로그램에 대한 "해킹"이므로 꼭 필요하지 않다면 사용하지 말아야 합니다.

모든 마우스 정보를 어떻게 읽을 수 있습니까 [...]?

/dev/input/eventX에서 제공하는 해당 파일을 사용하십시오 .evdev(이벤트 핸들러, xorg-driver evdev와 혼동하지 마세요). 이것이 바로 두 번째 코드 조각이 수행하는 작업입니다.

...하지만 우선순위 문제는 어떻습니까?

우선순위 문제는 없습니다. 에 따르면2.2. 이벤트 코드:

SYN_보고:

이벤트를 입력 데이터 변경 패킷으로 동기화하고 분리하는 데 사용됩니다.같은 순간에 일어나는. 예를 들어 마우스 동작은 하나의 동작에 대해 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'
}

관련 정보