마우스 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
이 파일에는 어떤 정보가 저장되어 있나요?
내 질문은 다음과 같습니다
- 에는 어떤 정보가 저장되나요
/dev/input/mouse0
? - 파일 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'
}