Estou trabalhando com um driver USB de mouse e realmente não sei diferenciar e utilizar informações enviadas por /dev/input/mouse0
e/dev/input/mice
Depois de algumas pesquisas no Google, encontrei este código sobre como usar/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;
Este programa funciona, mas não obteve nenhuma informação sobre a rolagem da roda.
Consegui encontrar um programa que usa/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;
Mas há um problema para o movimento diagonal porque este arquivo salvou apenas 1 coordenada ao mesmo tempo, e a coordenada X tem prioridade sobre Y, então é muito chato quando você deseja mover o mouse no eixo Y.
Não encontrei nenhum código para usar /dev/input/mouse0
, então quais informações estão salvas nesse arquivo?
Minhas perguntas são:
- Em quais informações são salvas
/dev/input/mouse0
? - Como posso ler todas as informações do mouse sem abrir 2 arquivos e sem problemas de prioridade (rolagem da roda + movimento do eixo X/Y)?
Responder1
ODocumentação da API do espaço do usuário do Linux Input Subsystemresponde às suas perguntas. Em geral, todos os arquivos /dev/input/
são fornecidos pormanipuladores de eventosque distribuem eventos de dispositivo para o espaço do usuário.
O que são /dev/input/mouse0 e /dev/input/mice?
Deintrodução(partes importantes destacadas por mim)
1.3.1.3. mousedev
mousedev é um hack para fazer programas legados que usam entrada do mouse funcionarem. Ele pega eventos de mouses ou digitalizadores/tablets e disponibiliza um dispositivo de mouse estilo PS/2 (como /dev/psaux) para o usuário.
Os dispositivos Mousedev em /dev/input (como mostrado acima) são:
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
Cada dispositivo de mouse é atribuído a um único mouse ou digitalizador, exceto o último - mouse. Este dispositivo de caracter único é compartilhado por todos os mouses e digitalizadores, e mesmo que nenhum esteja conectado, o dispositivo está presente. Isso é útil para mouses USB hotplug, para que programas mais antigos que não suportam hotplug possam abrir o dispositivo mesmo quando nenhum mouse estiver presente. [...]
Mousedev irá gerar os protocolos PS/2, ImPS/2 (Microsoft IntelliMouse) ou ExplorerPS/2 (IntelliMouse Explorer), dependendo do que o programa que lê os dados deseja. Você pode definir GPM e X para qualquer um deles.Você precisará do ImPS/2 se quiser usar uma roda em um mouse USBe ExplorerPS/2 se você quiser usar botões extras (até 5).
... esse também pode ser o motivo pelo qual você não vê os eventos da roda do mouse. Como é um "hack" para programas legados, você não deve usá-lo se não for necessário.
Como posso ler todas as informações do mouse [...]?
Use o /dev/input/eventX
arquivo correspondente fornecido porevdev(o manipulador de eventos, não deve ser confundido com o driver xorg evdev). É isso que o seu segundo trecho de código obviamente faz.
...mas e o problema prioritário?
Não há problema de prioridade. De acordo com2.2. Códigos de evento:
SYN_REPORT:
Usado para sincronizar e separar eventos em pacotes de alterações de dados de entradaocorrendo no mesmo momento no tempo. Por exemplo, o movimento de um mouse pode definir os valores REL_X e REL_Y para um movimento e, em seguida, emitir um SYN_REPORT. O próximo movimento emitirá mais valores REL_X e REL_Y e enviará outro SYN_REPORT.
Como todos os eventos consecutivos até um SYN_REPORT
evento podem ser considerados como tendo acontecido ao mesmo tempo, a ordem em que são relatados não importa.
Por exemplo (usandoeste programaEncontrei no 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
Como você pode ver, os eventos simultâneos não são apenas separados por SYN_REPORT
eventos, mas também têm o mesmo carimbo de data/hora.
Aliás, você também pode usar evtest
para ver os eventos gerados por um dispositivo. Você pode encontrar seu código fonteaquise você estiver interessado em como funciona.
Responder2
No meu caso, tente executar o evento do mouse do sistema operacional. meu código app.js
era:
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);
});
eu estava correndonode app.js
então está me dando o seguinte erro
Error: EACCES: permission denied, open '/dev/input/mice'
Emitted 'error' event on Mouse instance at:
então simplesmente corra sudo
assim
node app.js
não está dando o seguinte erro
{
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'
}