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

1

Estou trabalhando com um driver USB de mouse e realmente não sei diferenciar e usar as informações enviadas por /dev/input/mouse0 e /dev/input/mice

Após poucas pesquisas no Google, encontrei alguns códigos sobre o uso de /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 o deslocamento 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);
    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 esse arquivo salvou apenas 1 coordenada ao mesmo tempo e a coordenada X tem prioridade em Y; então é muito chato quando você quer mover o mouse no eixo Y

No entanto, não encontro nenhum código para usar /dev/input/mouse0 , então, quais informações são salvas nesse arquivo?

Então minhas perguntas são: 1. Quais informações são salvas em /dev/input/mouse0 ? 2. Como posso ler todas as informações do mouse sem abrir 2 arquivos e sem problema de prioridade (whell scrolling + movimento do eixo X / Y)?

    
por damadam 05.06.2018 / 16:36

1 resposta

2

A documentação da API do espaço de usuário do subsistema de entrada do Linux responde às suas perguntas. Em geral, todos os arquivos em /dev/input/ são fornecidos por manipuladores de eventos que distribuem eventos de dispositivo para o espaço do usuário.

O que são / dev / input / mouse0 e / dev / input / mice?

A partir da introdução (partes importantes destacadas por mim)

1.3.1.3. mousedev

mousedev is a hack to make legacy programs that use mouse input work. It takes events from either mice or digitizers/tablets and makes a PS/2-style (a la /dev/psaux) mouse device available to the userland.

Mousedev devices in /dev/input (as shown above) are:

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

Each mouse device is assigned to a single mouse or digitizer, except the last one - mice. This single character device is shared by all mice and digitizers, and even if none are connected, the device is present. This is useful for hotplugging USB mice, so that older programs that do not handle hotplug can open the device even when no mice are present. [...]

Mousedev will generate either PS/2, ImPS/2 (Microsoft IntelliMouse) or ExplorerPS/2 (IntelliMouse Explorer) protocols, depending on what the program reading the data wishes. You can set GPM and X to any of these. You’ll need ImPS/2 if you want to make use of a wheel on a USB mouse and ExplorerPS/2 if you want to use extra (up to 5) buttons.

... isso também pode ser o motivo pelo qual você não vê eventos de roda do mouse. Como é um "hack" para programas legados, você não deve usá-lo se não precisar.

Como posso ler todas as informações do mouse [...]?

Use o arquivo /dev/input/eventX correspondente que é fornecido pelo evdev (o manipulador de eventos, para não ser confundido com o evdev do xorg-driver). Isso é o que seu segundo snippet de código obviamente faz.

... mas e o problema de prioridade?

Não há problema de prioridade. De acordo com 2.2. Códigos de eventos :

SYN_REPORT:

Used to synchronize and separate events into packets of input data changes occurring at the same moment in time. For example, motion of a mouse may set the REL_X and REL_Y values for one motion, then emit a SYN_REPORT. The next motion will emit more REL_X and REL_Y values and send another SYN_REPORT.

Como todos os eventos consecutivos até que um evento SYN_REPORT possa ser considerado como ocorrido ao mesmo tempo, a ordem em que são informados não importa.

Por exemplo (usando este programa que encontrei 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, não são apenas eventos simultâneos separados por SYN_REPORT events, eles também têm o mesmo registro de data e hora.

A propósito, você também pode usar evtest para ver os eventos gerados por um dispositivo. Você pode encontrar o código-fonte aqui se estiver interessado em saber como funciona.

    
por danzel 06.06.2018 / 15:17