GitHub – jameslockman/Griffin-PowerMate-Driver · GitHub

PUBLICIDADE

GitHub - jameslockman/Griffin-PowerMate-Driver · GitHub

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 PowerMateDemo

Com 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 longabotã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/liberado
  • PowerMateEvent.buttonClick — pressione e solte brevemente (sob longPressThreshold).
  • PowerMateEvent.buttonLongPress – pressione pelo menos longPressThresholde 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: table 0–2, op 0 = mais lento, 1 = normal, 2 = mais rápido, arg 1–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 rolagem CGEvent (por exemplo CGEventCreateScrollWheelEvent) e publique-o ou insira o delta em sua própria lógica de rolagem.
  • Clique: Em onButtonDown / onButtonUpcrie e publique um clique do mouse CGEventou chame seu próprio gerenciador de cliques.
  • Mídia / outros: Mapa onRotate e onButtonDown para 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

  1. Desconecte e reconecte o PowerMate e execute seu aplicativo novamente.
  2. Saia de outro software que pode estar usando o PowerMate (por exemplo, aplicativos PowerMate antigos).
  3. O motorista usa kIOHIDOptionsTypeSeizeDevice então é preciso acesso exclusivo; apenas um processo pode usá-lo por vez.

Fonte: theverge

Mais recentes

PUBLICIDADE

WP Twitter Auto Publish Powered By : XYZScripts.com