Compartilhar via


Guia de implementação da caneta háptica

Este documento detalha a implementação do protocolo para um dispositivo Haptic Pen que se conecta a um host compatível com o Windows 11. Isso não inclui diretrizes sobre restrições mecânicas, restrições elétricas ou seleção de componente para gerar a resposta háptica dentro do transdutor de caneta. Essa orientação de implementação é independente do protocolo de caneta usado entre o transdutor de caneta e o digitalizador de caneta, no entanto, uma implementação pode optar por usar um protocolo de caneta com uma funcionalidade de uplink que permite que o digitalizador de caneta forneça parâmetros adicionais ao transdutor de caneta para fins de modulação de resposta háptica.

Classe de dispositivo

A Caneta Haptic é uma extensão da classe Dispositivo de Caneta no Windows. Este guia de implementação complementa o Guia de Implementação de Caneta e se concentra na implementação de hápticos no transdutor da caneta. Portanto, as canetas hápticas devem atender não apenas aos requisitos do Guia de Implementação de Caneta, mas também aos que estão contidos aqui.

Conectividade do barramento de dispositivo

A Caneta Haptic deve usar os drivers de caixa de entrada fornecidos pela Microsoft para se conectar a um host do Windows usando HID via Bluetooth.

Implementação de protocolo haptic pen

Uma boa compreensão do protocolo HID é necessária para entender as informações apresentadas aqui. Consulte os seguintes recursos para obter informações sobre o protocolo HID:

O Windows inclui um driver de classe HID e um driver correspondente de miniporta HID com suporte para Bluetooth, portanto, não há necessidade de drivers de miniporta de terceiros. O firmware de dispositivo de caneta háptica só precisa relatar os usos descritos neste tópico. O Windows usará o firmware e seus próprios drivers HID para habilitar o dispositivo e conceder aos aplicativos do Windows acesso ao dispositivo.

Um descritor de exemplo é fornecido na seção Descritores de Relatório de Exemplo abaixo.

Coleção HID de nível superior necessária

Coleção HID de nível superior necessária para caneta háptica

Um dispositivo caneta háptica deve usar o protocolo HID em um sistema Windows 10 de modo que forneça uma coleção de nível superior que apareça como um digitalizador/caneta (Página 0x0D, Uso 0x20).

Relatório de entrada do digitalizador de caneta

O conjunto de digitalizadores de caneta deve informar o identificador de caneta que consiste no número de série do transdutor e na ID do fabricante do transdutor nos relatórios de entrada enviados ao sistema operacional. O mesmo identificador de estilete deve ser relatado através da coleção de estiletes. Isso permite que o sistema operacional correlacione a entrada da caneta gerada pelo digitalizador à caneta. Detalhes sobre o guia de implementação de caneta podem ser encontrados aqui: Protocolo de Implementação de Caneta.

Número de série do transdutor

O Número de Série do Transdutor é um identificador persistente exclusivo para o transdutor usado no acessório de caneta que se comunica com o digitalizador de caneta. Isso é necessário para ser de 32 bits e é definido pelo fornecedor ou pela entidade identificada pela ID do fornecedor do transdutor. Em circunstâncias em que o Número de Série do Transdutor é desconhecido para o digitalizador porque o acessório de caneta não dá suporte à transmissão desse valor ou que a transmissão não foi recebida na íntegra, o digitalizador deve relatar 0 para o host. O host não dá suporte para a posição nula.

Número de série do transdutor – Parte 2

O Número de Série do Transdutor – Parte 2 permite que mais 32 bits sejam especificados como parte do identificador persistente exclusivo para o transdutor usado em um acessório de caneta. Em circunstâncias em que o Número de Série do Transdutor – Parte 2 é desconhecido para o digitalizador porque o acessório de caneta não dá suporte à transmissão desse valor ou que a transmissão não foi recebida na íntegra, o digitalizador deve relatar 0 para o host. O host não dá suporte para a posição nula.

Página ID Anotações
0xD 0x5B Obrigatório para funcionalidades que dependem da identificação única da caneta (veja abaixo)
0xD 0x6E Extensão opcional do número de série por mais 32 bits

ID do fornecedor do Transducer

O ID do Fornecedor do transdutor é um campo para comunicar o fabricante do transdutor utilizado no acessório de caneta que se comunica com o digitalizador. Isso é necessário para que seja uma ID de fornecedor de 2 bytes atribuída pela USB-IF, seja do fabricante ou da IHV/OEM, autorizando o uso de sua ID de fornecedor USB-IF para essa finalidade.

Página ID Anotações
0xD 0x91 Obrigatório para funcionalidades que dependem da identificação única da caneta (veja abaixo)

Recursos dependentes da identificação de caneta exclusiva

O relatório de PenID é obrigatório para habilitar cenários como feedback tátil da caneta (necessário para os recursos táteis descritos neste guia).

Também é obrigatório para cenários que usam várias canetas para escrita à tinta. Por exemplo:

  • O aplicativo Whiteboard no Windows dá suporte ao uso de várias canetas em que cada caneta pode ser mapeada para uma determinada ferramenta de escrita à tinta
  • Em geral, os aplicativos que desejam atribuir atributos ou comportamentos a canetas físicas diferentes, embora o digitalizador possa dar suporte apenas a uma única caneta na tela no momento
  • Aplicativos que desejam rastrear várias canetas simultâneas em digitalizadores com suporte

Relatório de saída háptica

Se um dispositivo de caneta der suporte a feedback háptico, ele poderá permitir que o sistema e os aplicativos tirem proveito dele, incluindo uma coleção de feedback háptico (Página 0x0E, Uso 0x01) dentro do TLC de caneta. Para obter mais informações sobre como a especificação HID dá suporte ao feedback háptico, consulte a ratificação da especificação HID na página Haptics.

O host utiliza as seguintes utilizações em um relatório de saída (por meio da coleção de feedback háptico) para permitir que o host envie eventos de feedback háptico para o dispositivo de caneta háptica. Se um dispositivo optar por expor uma coleção de comentários hápticos, alguns usos serão obrigatórios para permitir que comentários hápticos iniciados pelo host sejam suportados.

Membro Description Página ID Obrigatório/opcional
Lista de forma de onda Lista ordenada de formatos de onda hápticos compatíveis com o dispositivo 0x0E 0x10 Obrigatório
Lista de Duração Lista ordenada de durações para formas de onda na Lista de formas de onda 0x0E 0x11 Obrigatório
Gatilho Automático Forma de onda a ser disparada automaticamente a critério do dispositivo 0x0E 0x20 Obrigatório
Controle associado do gatilho automático Uso de HID do controle associado ao feedback tátil 0x0E 0x22 Obrigatório
Intensidade Saída – Intensidade da forma de onda do acionamento manual como uma porcentagem 0x0E 0x23 Opcional
Contagem repetida Saída – Número de vezes para executar o sinal do Gatilho Manual após a execução inicial 0x0E 0x24 Opcional
Período de repetição Saída – Duração do intervalo para aguardar antes de reativar o Gatilho Manual ao repetir 0x0E 0x25 Opcional
Tempo de corte de forma de onda Tempo máximo em que uma forma de onda do Gatilho Manual pode ser reproduzida antes de ser cortada 0x0E 0x28 Opcional

Lista de forma de onda

O uso da lista de forma de onda representa uma coleção dos usos HID de formas de onda com suporte, ordenados usando ordinais. Os formatos de onda hápticos predefinidos são definidos na especificação HID. Para dispositivos hápticos de caneta, esses formatos de onda podem ser classificados como dois segmentos que correspondem a cenários diferentes:

  • WAVEFORM_*CONTINUOUS – Comentários baseados em tinta para simular várias texturas enquanto o usuário está ativamente aplicando tinta com diferentes ferramentas, como caneta, lápis etc.
  • WAVEFORM_* – Comentários discretos e não contínuos baseados em interação para quando um usuário executa algumas tarefas orientadas por entrada, como passar o mouse sobre um botão, clicar em um botão desabilitado e o reconhecimento bem-sucedido da forma de tinta.

A lista completa de formas de onda com suporte para dispositivos hápticos de caneta está abaixo:

Onda Description Página ID Obrigatório/opcional
FORMA_DE_ONDA_NENHUMA Não opera. Não deve afetar o estado de reprodução de formas de onda contínuas 0x0E 0x1001 Obrigatório
WAVEFORM_STOP Interrompe a reprodução de formas de onda contínuas 0x0E 0x1002 Obrigatório
WAVEFORM_CLICK Cria um breve retorno de "clique". O fallback padrão quando o formato de onda de comentários de interação selecionado pelo aplicativo não é suportado pela caneta háptica 0x0E 0x1003 Obrigatório
WAVEFORM_INKCONTINUOUS Simula a sensação de uso de uma caneta esferográfica. Fallback padrão quando não há suporte para uma forma de onda de escrita pela caneta háptica 0x0E 0x100B Obrigatório
WAVEFORM_SUCCESS Sinal háptico forte para alertar o usuário de que uma ação foi bem-sucedida 0x0E 0x1009 Opcional
ERRO_DE_FORMA_DE_ONDA O sinal háptico forte para alertar o usuário de que uma ação falhou ou ocorreu um erro 0x0E 0x100A Opcional
WAVEFORM_HOVER Sinal tátil quando o usuário passa a caneta háptica sobre um elemento interativo da interface do usuário 0x0E 0x1008 Opcional
WAVEFORM_PRESS Sinal háptico para quando um usuário pressiona um elemento interativo da interface do usuário em uma ação incremental (consulte Release) 0x0E 0x1006 Opcional
WAVEFORM_RELEASE Sinal háptico para quando um usuário libera um elemento interativo de UI em uma ação incremental (consulte Press) 0x0E 0x1007 Opcional
WAVEFORM_PENCILCONTINUOUS Sinal háptico contínuo quando o usuário seleciona lápis como ferramenta de escrita à tinta 0x0E 0x100C Opcional
WAVEFORM_MARKERCONTINUOUS Sinal háptico contínuo quando o usuário seleciona o marcador como ferramenta de escrita à tinta 0x0E 0x100D Opcional
WAVEFORM_CHISELMARKERCONTINUOUS Sinal háptico contínuo quando o usuário seleciona marcador chanfrado/marcador de texto como ferramenta de anotação 0x0E 0x100E Opcional
FORMA_DE_ONDA_PINCEL_CONTÍNUO Sinal háptico contínuo quando o usuário seleciona pincel como ferramenta de escrita à tinta 0x0E 0x100F Opcional
WAVEFORM_ERASERCONTINUOUS Sinal háptico contínuo quando o usuário seleciona borracha como ferramenta de escrita à tinta 0x0E 0x1010 Opcional
WAVEFORM_SPARKLECONTINUOUS Sinal háptico contínuo para ferramentas especiais de tinta, como um pincel multicolorido 0x0E 0x1011 Opcional

Observação

Embora não seja necessário, é recomendável também implementar as outras formas de onda enumeradas a fim de fornecer uma experiência de usuário mais completa. Em particular, WAVEFORM_PRESS e WAVEFORM_RELEASE são altamente recomendados, pois fornecem comentários de interação valiosos.

Tanto WAVEFORM_NONE quanto WAVEFORM_STOP são necessários para todos os dispositivos hápticos compatíveis com HID. Ordinais 1 e 2 são implicitamente definidos como WAVEFORM_NONE e WAVEFORM_STOP. Eles não precisam ser declarados na Lista de Forma de Onda ou na Lista de Duração. A Lista de Formas de Onda declara formas de onda suportadas com base nos mínimos e máximos físicos de cada ordinal na lista.

Lista de Duração

O uso da Lista de Durações representa uma coleção das durações para as formas de onda com suporte na lista de Formas de Onda, ordenadas usando ordinais. A unidade para a duração da forma de onda é de milissegundos e a duração deve ser um valor positivo diferente de zero para qualquer forma de onda não contínua. Se uma forma de onda for contínua, (será reproduzida até que o host ou o Tempo de Corte da Forma de Onda seja excedido), sua duração será definida como zero.

WAVEFORM_NONE e WAVEFORM_STOP devem ter uma duração igual a zero. Eles não precisam ser declarados na Lista de Duração.

Intensidade

O uso de intensidade representa a porcentagem de intensidade máxima a ser aplicada a uma forma de onda. Esse valor deve variar entre 0 e 100%. 100% indica que as formas de onda serão disparadas pelo dispositivo em sua força máxima e 0% indica que o transdutor háptico não está habilitado.

Contagem repetida

O uso de Contagem de Repetição representa o número de vezes que uma forma de onda é repetida. Uma contagem de repetição de zero indica que a forma de onda acionada manualmente deve ser reproduzida somente uma vez (sem repetição). Se o Tempo de Corte de Forma de Onda tiver sido excedido, espera-se que todas as repetições incompletas sejam ignoradas.

Período de repetição

O uso do Período de Relançamento representa a quantidade de tempo que o dispositivo deve aguardar antes de repetir uma forma de onda de gatilho manual em um relatório de saída, conforme o valor especificado pela Contagem de Repetição. As unidades para esse valor são milissegundos. Se o Período de Repetição for menor que a duração da forma de onda que está sendo reproduzida, a forma de onda deve ser interrompida e reiniciada no momento indicado pelo período de repetição.

Tempo de corte de forma de onda

O uso do Tempo de Corte da Forma de Onda representa o tempo máximo que o dispositivo permitirá que uma forma de onda com gatilho manual seja repetida antes de encerrar a reprodução. Esse é um valor constante para o dispositivo e inclui formas de onda contínuas sem durações definidas e formas de onda com durações discretas que são definidas para repetir muitas vezes. As unidades para esse valor são milissegundos.

Relatório de saída háptica

O host utiliza os seguintes usos em um relatório de saída para emitir eventos de feedback tátil para o dispositivo Haptic Pen. Alguns usos são obrigatórios para compatibilidade com a implementação do host do Windows.

Membro Description Página ID Obrigatório/opcional
Gatilho Manual Forma de onda a ser acionada como comando explícito do host 0x0E 0x21 Obrigatório
Intensidade Intensidade da forma de onda do Gatilho Manual em porcentagem 0x0E 0x23 Obrigatório
Contagem repetida Número de vezes para reproduzir a forma de onda do Disparo Manual após a reprodução inicial 0x0E 0x24 Opcional
Período de repetição Duração de espera antes de acionar novamente o Gatilho Manual ao repetir 0x0E 0x25 Opcional

Gatilho Manual

O uso do Gatilho Manual refere-se a uma forma de onda suportada pela lista de formas de onda, que foi solicitada para reprodução pelo host. Quando um relatório de saída que contém um Gatilho Manual diferente de WAVEFORM_NONE é enviado para o dispositivo, ele deve começar imediatamente a reproduzir a forma de onda especificada com as propriedades adicionais incluídas no relatório de saída (Intensidade, Contagem de Repetição, Período de Repetição). Quando um relatório de saída contém um Gatilho Manual de WAVEFORM_STOP, qualquer reprodução contínua de onda deve ser interrompida.

Para as utilizações de Intensidade, Contagem de Repetição e Período de Reativação, consulte a seção anterior no que diz respeito ao relatório de recursos de saída.

Iniciando e parando hápticos

O fluxograma abaixo descreve quando os sinais hápticos da caneta devem ser configurados, limpos, iniciados e interrompidos.

Os vários estados hápticos descritos abaixo são:

  • Jogando: A caneta está ativamente jogando a forma de onda háptica
  • Pausada: A caneta está configurada com uma forma de onda, mas não está reproduzindo-a ativamente
  • Parado: a caneta não está configurada com uma forma de onda e não está reproduzindo ativamente nada

Para o estado da caneta em relação ao digitalizador, consulte "Windows Pen States".

Observação

Quando a caneta fica fora do alcance, é recomendável, mas não é obrigatório, redefinir a configuração háptica. Isso é transmitido no diagrama abaixo pelos dois caminhos alternativos que saem do estado "Caneta: Dentro do alcance; Háptico: Pausado" quando a caneta sai do alcance.

Observação

O host a qualquer momento pode solicitar que uma forma de onda não contínua seja reproduzida. Nesse caso, a caneta deve executá-lo e depois voltar ao estado em que estava anteriormente.

Observação

O host deve configurar apenas formas de onda contínuas. Formas de onda discretas/não contínuas só devem ser disparadas manualmente.

Diagrama de estado da caneta háptica

Coleção de teclados (opcional)

Um recurso opcional para habilitar a notificação de cliques no botão final para o host via relatórios de teclado HID.

Um dispositivo compatível deve relatar três combinações de teclado distintas correspondentes a três ações de botão distintas por meio de um dispositivo de teclado Bluetooth HID exposto ao host. As ações e as combinações de teclado correspondentes são descritas abaixo:

Ação do botão Combinação de teclas
Clique único WIN+F20
Clique duas vezes WIN+F19
Pressionar e segurar Win+F18

Implementação do botão Bluetooth

Para implementar um botão Bluetooth de extremidade final, o dispositivo relatará três combinações de teclado distintas correspondentes a três ações de botão distintas por meio de um dispositivo de teclado HID Bluetooth LE exposto ao host. As ações e as combinações de teclado correspondentes são descritas abaixo:

Ação do botão Bluetooth Combinação de chaves para relatório
Um clique WIN+F20
Clique duas vezes WIN+F19
Pressionar e segurar WIN+F18

Armazenamento de Canetas

A partir do Windows 10, versão 1903, o sistema oferece suporte a notificações para dispositivos que incorporam armazenagem de caneta compatível. O mecanismo depende do hardware detectando a caneta sendo removida ou substituída e gerando um relatório de teclado HID correspondente para um par de combinações de atalho. Para sinalizar um armazenamento (caneta colocada no compartimento), sinalize WIN+CTRL+F20 e para sinalizar um retiro (caneta removida do compartimento), sinalize WIN+CTRL+F19. Isso pode ser implementado com firmware ou driver.

Esses eventos de desencaixar/encaixar abrem/descartam o menu da área de trabalho de tinta do Shell. A partir do Windows 10, a partir da versão 2004 do Office também reage a esses eventos usando uma API de plataforma que permite que qualquer desenvolvedor estenda seu aplicativo para reconhecimento de eventos de stowage. Não há suporte para consultar se a caneta está presente no dock, os aplicativos só são notificados de eventos de remoção e de retorno se estiverem em primeiro plano.

Descritor de relatório HID de exemplo

05,0D,                      // Usage Page (Digitizers)
09,20,                      // Usage (Stylus)
A1,01,                      // Collection (Application)
85,40,                      //   Report ID (64)
95,01,                      //   Report Count (1)
75,20,                      //   Report Size (32)
17,00,00,00,80,             //   Logical Minimum (-2147483648)
27,FF,FF,FF,7F,             //   Logical Maximum (2147483647)
09,5B,                      //   Transducer Serial Number
81,02,                      //   Input (Data,Var,Abs)
75,10,                      //   Report Size (16)
15,01,                      //   Logical Minimum (1)
27,FF,FF,00,00,             //   Logical Maximum (65535)
09,91,                      //   Transducer Vendor ID
81,02,                      //   Input (Data,Var,Abs)
05,0E,                      //   Usage Page (Haptics)
09,01,                      //   Usage (0x01)
A1,02,                      //   Collection (Logical)
85,41,                      //     Report ID (65)
95,01,                      //     Report Count (1)
75,08,                      //     Report Size (8)
15,01,                      //     Logical Minimum (1)
26,FF,00,                   //     Logical Maximum (255)
09,24,                      //     Usage (0x24)
B1,02,                      //     Feature (Data,Var,Abs)
09,24,                      //     Usage (0x24)
91,02,                      //     Output (Data,Var,Abs)
09,23,                      //     Usage (0x23)
B1,02,                      //     Feature (Data,Var,Abs)
09,23,                      //     Usage (0x23)
91,02,                      //     Output (Data,Var,Abs)
15,01,                      //     Logical Minimum (1)
25,12,                      //     Logical Maximum (18)
09,20,                      //     Usage (0x20)
B1,02,                      //     Feature (Data,Var,Abs)
09,21,                      //     Usage (0x21)
91,02,                      //     Output (Data,Var,Abs)
15,00,                      //     Logical Minimum (0)
26,FE,00,                   //     Logical Maximum (254)
66,01,10,                   //     Unit (SI Linear)
55,FD,                      //     Unit Exponent (253)
35,00,                      //     Physical Minimum (0)
46,EC,09,                   //     Physical Maximum (2540)
09,28,                      //     Usage (0x28)
91,02,                      //     Output (Data,Var,Abs)
75,10,                      //     Report Size (16)
26,D0,07,                   //     Logical Maximum (2000)
46,D0,07,                   //     Physical Maximum (2000)
09,25,                      //     Usage (0x25)
91,02,                      //     Output (Data,Var,Abs)
09,25,                      //     Usage (0x25)
B1,02,                      //     Feature (Data,Var,Abs)
45,00,                      //     Physical Maximum (0)
85,42,                      //     Report ID (66)
75,20,                      //     Report Size (32)
17,42,00,0D,00,             //     Logical Minimum (852034)
27,42,00,0D,00,             //     Logical Maximum (852034)
09,22,                      //     Usage (0x22)
B1,02,                      //     Feature (Data,Var,Abs)
09,11,                      //     Usage (0x11)
A1,02,                      //     Collection (Logical)
05,0A,                      //       Usage Page (Ordinal)
75,10,                      //       Report Size (16)
95,10,                      //       Report Count (16)
15,01,                      //       Logical Minimum (1)
27,FF,FF,00,00,             //       Logical Maximum (65535)
19,03,                      //       Usage Minimum (0x03)
29,12,                      //       Usage Maximum (0x12)
B1,02,                      //       Feature (Data,Var,Abs)
C0,                         //     End Collection ()
05,0E,                      //     Usage Page (Haptics)
09,10,                      //     Usage (0x10)
A1,02,                      //     Collection (Logical)
05,0A,                      //       Usage Page (Ordinal)
16,03,10,                   //       Logical Minimum (4099)
26,FF,2F,                   //       Logical Maximum (12287)
19,03,                      //       Usage Minimum (0x03)
29,12,                      //       Usage Maximum (0x12)
B1,02,                      //       Feature (Data,Var,Abs)
C0,                         //     End Collection ()
C0,                         //   End Collection ()
C0                          // End Collection ()