terça-feira, setembro 20, 2016

Sinalizador - Parte 3

Agora que podemos ligar o nosso sinalizador a um micro via USB, é hora de ver como a nossa aplicação pode controlá-lo.


Existem algumas bibliotecas para acesso a dispositivos HID. Uma delas é a HIDAPI, que é multiplataforma. Porém vou examinar aqui o acesso diretamente através das APIs nativas do Windows e do Linux.

Os meus programas de exemplo estão nos arquivos do blog, em SinalizadorUSB_util.zip, e no github (https://github.com/dquadros/Sinalizador).

Windows

O acesso a dispositivos USB HID com a API do Windows pode parecer complicado a primeira vista. A documentação existente é pouca e confusa. Mas, depois que se descobre o caminho, a coisa é bastante lógica:
  • A interação com um dispositivo HID é feita através das funções HidD, cuja documentação está aqui.
  • Para usar as funções HidD você precisa de um handle para o dispositivo, que é fornecido pela função CreateFile (apesar do nome, ela serve tanto para criar arquivos como para abrir arquivos e dispositivos já existentes) a partir do nome completo (path) do dispositivo.
  • Para encontrar o nome completo do dispositivo, você tem que usar as funções SetupDi, que permitem descobrir todos os dispositivos. Você identifica o seu pelo VendorId e ProductId.

Um exemplo completo (mas não muito claro) é o HidCom da Simplibox IO. Uma referência parcial pode ser vista neste application note da ST. Se você preferir algo mais detalhado, existe o livro USB Complete.

Linux

Seguindo a filosofia do Unix, ao invés de ter várias funções específicas, o Linux utiliza uma única rotina, a ioctl. Esta função tem três parâmetros: um handle para o dispositivo, um código da requisição e um ponteiro para uma área de memória (o infame void *). O conteúdo da área de memória depende do dispositivo e da requisição. No caso de dispositivos HID, as requisições disponíveis são descritas aqui.

Novamente é necessário saber o nome completo do dispositivo para obter o handle (através da função open, que além de abrir arquivos e dispositivos sabe criar arquivos). Os nomes dos dispositivos HID tem a forma /dev/usb/hiddev*. O HidCom simplesmente examina os nomes sequencialmente (/dev/usb/hiddev0, /dev/usb/hiddev1, etc) até encontrar um com o VendoId e ProductId desejados.

Um detalhe é que por padrão o dispositivo não pode ser acessado por um usuário comum. Você precisar usar sudo ou mudar as permissões do  dispositivo.

Generalizando

Com estas informações podemos escrever uma aplicação que controla os LEDs conforme qualquer informação que consigamos obter. Por exemplo, verificar os emails na caixa de entrada e acender os LEDs conforme os remetentes.

O que vimos nestes dois últimos posts podem ser usados para muito mais que controlar LEDs. Levando ao pé da letra, um Human Interface Device é qualquer coisa que interaja com pessoas. Um projeto que eu venho embalando há tempos é um painel de informações para o micro, montado em uma carcaça de leitor de CD/DVD (enquanto ainda existe lugar para isto nos desktops). Na frente teria algum tipo de display e alguns LEDs. O painel se ligaria a uma das portas USB na traseira do micro. Um serviço enviaria ao painel informações como o uso da memória e do disco.


Obs.: Este post está saindo com atraso devido ao furto do sinalizador, do circuito montado e o raspberry pi (com acessórios) que eu pretendia usar no teste com Linux. Estou prosseguindo a série usando (pelo menos por enquanto) quatro LEDs avulsos ao invés do sinalizador.

Nenhum comentário: