Este pequeno driver habilita o Griffin PowerMate, um pequeno dispositivo bacana de tempos passados. O que o PowerMate faz? É um botão que você pode girar ou pressionar. É isso. Ele também possui um LED azul na base que pode alterar a intensidade de acordo com o que você está fazendo.
Quando foi lançado, o objetivo era auxiliar na produção de vídeo e áudio, adicionando um botão de rolagem à sua área de trabalho. É claro que existem controladores modernos que oferecem muito mais recursos literais, mas há algo… curioso… nesse dispositivo inicial.
Para instalar, abra o DMG e arraste Agente PowerMate para sua pasta Aplicativos. Então, lance Agente PowerMate. Claro, ele não fará nada sem um PowerMate, então vá vasculhar sua gaveta USB de lixo e tirar o pó! Você verá um novo item no menu superior para controlar o comportamento do PowerMate.
O PowerMate atua como um controle de rolagem, portanto, se a janela ou controle ativo tiver uma opção de rolagem, girar o dial irá rolar a janela ou aumentar/diminuir o valor selecionado. Você pode inverter a direção de rolagem se não gostar da direção de rolagem padrão.
O PowerMate também funciona como um botão do mouse. Um toque momentâneo no botão funciona como um clique do mouse. Um toque longo no botão funciona como um clique com o botão direito. Você também pode alterar o comportamento para que um toque longo funcione como um clique duplo.
Muito simples, hein?
Um pequeno driver macOS que abre o Griffin PowerMate (NO 0x077dPID 0x0410) por USB HID, lê seus relatórios de 6 bytes e expõe botão e rotação eventos para que você possa mapeá-los para ações (por exemplo, rolar, clicar, teclas de mídia).
O dispositivo reporta no barramento, mas não faz nada por padrão no macOS; esta biblioteca apreende o dispositivo e entrega eventos para seu aplicativo.
Formato do relatório (do dispositivo)
- Byte 0: Estado do botão —
0= liberado,1= pressionado - Byte 1: Delta de rotação — assinado; positivo = sentido horário, negativo = sentido anti-horário (normalmente ±1 a ±7 por relatório). O dispositivo não informa a velocidade diretamente; o motorista deriva taxa de rotação (deltas por segundo) a partir do tempo entre os relatórios.
cd /path/to/USB
swift build
swift run PowerMateDemoCom o PowerMate conectado, gire o botão ou pressione o botão; a demonstração imprime eventos. Pare com Ctrl+C.
Driver para todo o sistema (Agente PowerMate)
Agente PowerMate transforma o botão e o botão em eventos de teclado/rolagem que qualquer aplicativo recebe (navegador, editor, etc.):
- Rotação → rolagem vertical ou Teclas de seta para cima/para baixo quando um menu (ou submenu) está em foco.
- Clique (pressione brevemente) → botão esquerdo do mouse (no cursor) ou Retornar quando um menu está em foco (escolhe o item destacado).
- Pressão longa → botão direito do mouse (no cursor).
A detecção de menu e submenu usa o Acessibilidade API: quando o elemento da UI em foco é um menu (incluindo submenus), a rotação envia teclas de seta e o clique envia Return. Conceder Acessibilidade em Configurações do sistema → Privacidade e segurança para que os submenus funcionem sem “grudar” na rolagem. Um toque longo ainda entra em um “modo de menu” alternativo (teclas de seta até o clique ou tempo limite de 5 segundos) se a Acessibilidade não estiver habilitada.
O LED pulsa enquanto você gira e escurece quando está inativo; totalmente ligado enquanto o botão é pressionado.
Na primeira execução, o macOS solicitará Monitoramento de entrada permissão. Conceda-o em Configurações do sistema → Privacidade e segurança → Monitoramento de entrada e adicione (ou habilite) o Terminal ou o executável construído e, em seguida, execute o agente novamente.
Para executar em segundo plano: swift run PowerMateAgent & ou execute o binário construído ./.build/debug/PowerMateAgent e adicione-o a Itens de login se você quiser que ele comece quando você fizer login.
Para criar um aplicativo assinado e autenticado (ou instalador) para que outros possam usá-lo sem avisos de segurança, consulte DISTRIBUIÇÃO.md. Você precisará de uma conta de desenvolvedor Apple; os usuários ainda precisarão conceder monitoramento de entrada (ou acessibilidade) uma vez quando usarem o dial pela primeira vez.
No seu aplicativo Package.swift (ou Xcode: Arquivo → Adicionar Dependências do Pacote):
dependencies: [
.package(path: "/path/to/USB"), // or your clone URL
],
targets: [
.target(name: "YourApp", dependencies: ["PowerMateDriver"]),
]2. Inicie os eventos do driver e do mapa
import PowerMateDriver
let driver = PowerMateDriver()
// Optional: use closures for simple mapping
driver.onRotate = { delta, rate in
// delta > 0 = clockwise, delta < 0 = counter-clockwise
// rate = deltas per second (nil on first report); use for speed-dependent mapping
// e.g. scroll: CGEventCreateScrollWheelEvent(..., delta * lineHeight)
}
driver.onButtonDown = { /* e.g. simulate click or toggle */ }
driver.onButtonUp = { }
// Or use the delegate for all events
driver.delegate = self // implement PowerMateDriverDelegate
driver.start()
// Keep run loop running (e.g. main thread in an app)PowerMateEvent.buttonDown/buttonUp— botão pressionado/liberadoPowerMateEvent.buttonClick— pressione e solte brevemente (soblongPressThreshold).PowerMateEvent.buttonLongPress– pressione pelo menoslongPressThresholde solte.PowerMateEvent.rotate(delta: Int, rate: Double?)–deltaé a contagem de passos assinada (por exemplo, +1, -2);rateé a velocidade de rotação derivada em deltas por segundo (nulo no primeiro relatório).
Definir longPressThreshold (padrão 0,4 segundos) para ajustar o que conta como um toque longo. Usar onClick e onLongPress (ou o delegado) para tratamento separado.
Usar driver.isConnected para ver se o dispositivo está aberto no momento.
A base possui um LED azul que você pode usar para feedback. Controle-o apenas quando o dispositivo estiver conectado (isConnected == true).
setLEDBrightness(_ value: UInt8)— brilho estático 0–255 (0 = desligado).setLEDPulseAsleep(_ on: Bool)/setLEDPulseAwake(_ on: Bool)— ligue ou desligue o pulso integrado quando estiver “adormecido” ou “acordado”.setLEDPulseMode(table:op:arg:)— pulso personalizado:table0–2,op0 = mais lento, 1 = normal, 2 = mais rápido,arg1–255 para operação 0/2.
Os comandos LED usam solicitações de controle do fornecedor USB (mesmo protocolo do driver Linux). Eles voltam true se o comando foi enviado com sucesso. Se o dispositivo USB estiver ocupado (por exemplo, outro processo o tiver aberto), as chamadas de LED poderão falhar.
Mapeamento para ações do sistema
- Rolagem: Em
onRotatecrie uma roda de rolagemCGEvent(por exemploCGEventCreateScrollWheelEvent) e publique-o ou insira o delta em sua própria lógica de rolagem. - Clique: Em
onButtonDown/onButtonUpcrie e publique um clique do mouseCGEventou chame seu próprio gerenciador de cliques. - Mídia / outros: Mapa
onRotateeonButtonDownpara o que você precisar (por exemplo, volume, equivalentes de teclas).
A publicação de eventos pode exigir Monitoramento de entrada (ou Acessibilidade) em Configurações do sistema → Privacidade e segurança para seu aplicativo.
Se o dispositivo não responder
- Desconecte e reconecte o PowerMate e execute seu aplicativo novamente.
- Saia de outro software que pode estar usando o PowerMate (por exemplo, aplicativos PowerMate antigos).
- O motorista usa
kIOHIDOptionsTypeSeizeDeviceentão é preciso acesso exclusivo; apenas um processo pode usá-lo por vez.
Fonte: theverge

