diferença entre /dev/input/mouse0 e /dev/input/mice

diferença entre /dev/input/mouse0 e /dev/input/mice

Estou trabalhando com um driver USB de mouse e realmente não sei diferenciar e utilizar informações enviadas por /dev/input/mouse0e/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:

  1. Em quais informações são salvas /dev/input/mouse0?
  2. 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/eventXarquivo 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_REPORTevento 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_REPORTeventos, mas também têm o mesmo carimbo de data/hora.

Aliás, você também pode usar evtestpara 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.jsera:

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'
}

informação relacionada