Remapear um evento de entrada da webcam para uma tecla no teclado

1

Estou desenvolvendo um aplicativo no qual preciso ler a entrada de um acionador em uma webcam para que meu aplicativo faça alguma coisa.

O projeto envolve o OpenCV construído com suporte a QT, e eu receberei falhas aleatoriamente quando eu aplicar esse gatilho (ASSERT: "false" no arquivo qasciikey.cpp, linha 495).

Então eu percebi que uma maneira mais fácil e robusta é mapear o gatilho externo para uma chave (barra de espaço, especificamente). Eu não quero substituir a barra de espaço, apenas para que o gatilho pareça que a barra de espaço foi pressionada.

Até agora, usando evtest, eu selecionei meu dispositivo:

/dev/input/event13: See3CAM_CU51

E pode ver quando eu acionar a câmera, ele exibe o seguinte:

Event: time 1507757166.472300, type 1 (EV_KEY), code 212 (KEY_CAMERA), value 1
Event: time 1507757166.472300, -------------- SYN_REPORT ------------
Event: time 1507757167.147649, type 1 (EV_KEY), code 212 (KEY_CAMERA), value 0
Event: time 1507757167.147649, -------------- SYN_REPORT ------------

O "valor 1" é quando os pinos são puxados para cima (acionados) e "valor 0" quando os pinos são separados. Então eu acho que só preciso remapear o KEY_CAMERA para a barra de espaço, mas não tenho certeza da maneira mais limpa de fazer isso usando o Ubuntu 16.04.

Quando seleciono meu dispositivo de teclado:

/dev/input/event4: AT Translated Set 2 keyboard

E pressiono a barra de espaço, recebo a seguinte saída:

Event: time 1507757327.011812, -------------- SYN_REPORT ------------
Event: time 1507757328.818177, type 4 (EV_MSC), code 4 (MSC_SCAN), value 39
Event: time 1507757328.818177, type 1 (EV_KEY), code 57 (KEY_SPACE), value 1
Event: time 1507757328.818177, -------------- SYN_REPORT ------------
Event: time 1507757328.896970, type 4 (EV_MSC), code 4 (MSC_SCAN), value 39
Event: time 1507757328.896970, type 1 (EV_KEY), code 57 (KEY_SPACE), value 0

Eu tenho lido sobre como escrever o arquivo hwdb udev, mas ainda não vi uma maneira de mapear uma entrada de um dispositivo para outro. Isso é possível? Qual é a maneira mais fácil de fazer isso?

Obrigado antecipadamente.

    
por justynnuff 12.10.2017 / 00:06

1 resposta

0

Provavelmente, a resposta correta é escrever um arquivo [hwdb] para substituir a interpretação do código de tecla KEY_CAMERA em KEY_SPACE . Este parece ser um exemplo, mas é um pouco carente de detalhes.

O formato do arquivo é principalmente descrito em um comentário na cabeça do arquivo /usr/lib/udev/hwdb.d/60-keyboard.hwdb (no meu sistema), e você pode ver alguns archlinux discussão disso. Cuidado, este formato depende do lançamento do systemd, então verifique seu próprio arquivo. Você pode combinar seu dispositivo de entrada com um dos três padrões:

  • Generic input devices match:

      evdev:input:bZZZZvYYYYpXXXXeWWWW-VVVV

    This matches on the kernel modalias of the input-device, mainly: ZZZZ is the bus-id (see /usr/include/linux/input.h BUS_*), YYYY, XXXX and WWW are the 4-digit hex uppercase vendor, product and version ID and VVVV is an arbitrary length input-modalias describing the device capabilities.
  • AT keyboard DMI data matches:

      evdev:atkbd:dmi:bvn*:bvr*:bd*:svnvendor:pnproduct:pvr*

    vendor and product are the firmware-provided strings exported by the kernel DMI modalias.
  • Input driver device name and DMI data match:

      evdev:name:input device name:dmi:bvn*:bvr*:bd*:svnvendor:pn*

    input device name is the name device specified by the driver, vendor is the firmware-provided string exported by the kernel DMI modalias.

Outra possibilidade é escrever um programa pequeno para ler o fluxo de eventos da webcam, como o evtest faz, e quando a chave é vista, injete um KEY_SPACE no outro fluxo de eventos. Parece haver muito mais documentação sobre isso, e muitos exemplos de Python como este tutorial snippet para injetar um evento.

    
por 12.10.2017 / 23:02