Udostępnij przez


Przewodnik implementacji pióra haptycznego

Ten dokument zawiera szczegółowe informacje na temat implementacji protokołu dla urządzenia haptic Pen łączącego się z zgodnym hostem systemu Windows 11. Nie obejmuje to wskazówek dotyczących ograniczeń mechanicznych, ograniczeń elektrycznych ani wyboru komponentów do generowania odpowiedzi haptycznej w przetworniku pióra. Te wskazówki dotyczące implementacji są niezależne od protokołu pióra używanego między przetwornikiem pióra a cyfryzatorem pióra, jednak implementacja może wybrać użycie protokołu pióra z funkcją łącza w górę, co pozwala cyfryzatorowi pióra przekazać dodatkowe parametry do przetwornika pióra w celu modulacji odpowiedzi haptycznej.

Klasa urządzenia

Haptic Pen to rozszerzenie klasy Pen Device w systemie Windows. Ten przewodnik implementacji uzupełnia przewodnik implementacji pióra i koncentruje się na implementowaniu haptyki w przetworniku pióra, dlatego haptyczne pióra muszą spełniać wymagania określone w przewodniku implementacji pióra oraz zawarte tutaj.

Łączność z magistralą urządzeń

Pióro dotykowe używa wbudowanych sterowników firmy Microsoft, aby połączyć się z hostem systemu Windows za pomocą HID przez Bluetooth.

Implementacja protokołu haptycznego pióra

Aby zrozumieć przedstawione tutaj informacje, należy dobrze zrozumieć protokół HID. Aby uzyskać informacje o protokole HID, zobacz następujące zasoby:

System Windows zawiera sterownik klasy HID i odpowiedni sterownik miniportu obsługujący funkcję Bluetooth HID, dlatego nie ma potrzeby żadnych sterowników mini-portów innych firm. Oprogramowanie układowe pióra haptycznego musi zgłaszać użycia opisane w tym temacie. System Windows będzie używać oprogramowania układowego i własnych sterowników HID, aby włączyć urządzenie i zapewnić aplikacjom systemu Windows dostęp do urządzenia.

Przykładowy deskryptor jest udostępniany w poniższej sekcji Deskryptory przykładowych raportów.

Wymagana kolekcja HID najwyższego poziomu

Wymagana kolekcja HID najwyższego poziomu dla pióra haptycznego

Urządzenie pióro haptic powinno używać protokołu HID w systemie Windows 10 w taki sposób, aby urządzenie dostarczało kolekcję najwyższego poziomu, która jest wyświetlana jako cyfryzator/rysik (Page 0x0D, Usage 0x20).

Raport wejściowy funkcji Pen Digitizer

Kolekcja pen digitizer musi zgłosić identyfikator stylus składający się z numeru seryjnego przetwornika i identyfikatora dostawcy przetwornika w raportach wejściowych zgłoszonych do systemu operacyjnego. Ten sam identyfikator stylus musi być zgłaszany za pośrednictwem kolekcji stylus. Dzięki temu system operacyjny może skorelować dane wejściowe pióra wygenerowane przez digitizatora z rysikami. Szczegółowe informacje na temat przewodnika implementacji protokołu pióra można znaleźć pod tym linkiem: Implementacja protokołu pióra.

Numer seryjny przetwornika

Numer seryjny przetwornika jest unikatowym trwałym identyfikatorem przetwornika używanego w akcesorium do pióra komunikującego się z cyfrowym przetwornikiem. Musi być 32-bitowy i jest definiowany przez dostawcę lub podmiot zidentyfikowany przez identyfikator dostawcy przetwornika. W sytuacjach, gdy numer seryjny przetwornika jest nieznany digitalizerowi, ponieważ akcesorium pióra nie obsługuje przekazywania tej wartości lub transmisja danych nie została w pełni odebrana, digitalizer przesyła 0 do hosta. Pozycja null nie jest obsługiwana przez hosta.

Numer seryjny przetwornika — część 2

Numer seryjny przetwornika — część 2 umożliwia określenie dodatkowych 32-bitowych bitów jako część unikatowego identyfikatora trwałego przetwornika używanego w akcesorium piórowym. W przypadkach, gdy numer seryjny przetwornika – część 2 jest nieznany cyfrowemu przetwornikowi, ponieważ akcesorium pióra nie obsługuje przesyłania tej wartości lub transmisja nie została odebrana w całości, przetwornik przekazuje 0 do hosta. Pozycja null nie jest obsługiwana przez hosta.

Strona identyfikator Notatki
0xD 0x5B Obowiązkowe dla funkcji zależnych od unikatowej identyfikacji pióra (patrz poniżej)
0xD 0x6E Opcjonalne rozszerzenie numeru seryjnego przez dodatkowe 32 bity

Identyfikator dostawcy przetwornika

Identyfikator dostawcy przetwornika jest polem służącym do wskazania producenta przetwornika używanego w akcesorium pióra współpracującym z cyfryzatorem pióra. Jest wymagany 2-bajtowy identyfikator dostawcy USB-IF, przypisany albo producentowi, albo przez dostawcę IHV/OEM, którzy autoryzują użycie swojego identyfikatora dostawcy USB-IF do tego celu.

Strona identyfikator Notatki
0xD 0x91 Obowiązkowe dla funkcji zależnych od unikatowej identyfikacji pióra (patrz poniżej)

Funkcje wymagające unikatowej identyfikacji długopisu

Raportowanie PenID jest konieczne, aby umożliwić scenariusze, takie jak funkcje haptyczne pióra (związane z haptycznymi funkcjami w tym przewodniku).

Jest to również obowiązkowe w scenariuszach, które używają wielu piór do pisma odręcznego. Przykład:

  • Aplikacja Tablica w systemie Windows obsługuje wiele piór, gdzie każde pióro można przypisać do określonego narzędzia pisma odręcznego.
  • Ogólnie rzecz biorąc, aplikacje, które chcą przypisać atrybuty lub zachowania do różnych fizycznych długopisów, mimo że cyfryzator może obsługiwać tylko jedno pióro jednocześnie.
  • Aplikacje, które chcą śledzić wiele równoczesnych rysików na obsługiwanych digitalizatorach

Raport wyjściowy dotykowy

Jeśli urządzenie długopisowe obsługuje informację zwrotną haptyczną, może umożliwić systemowi i aplikacjom korzystanie z tej funkcji, uwzględniając kolekcję informacji zwrotnych haptycznych (strona 0x0E, Usage 0x01) w stylus TLC. Aby uzyskać więcej informacji na temat sposobu, w jaki specyfikacja HID obsługuje opinie haptyczne, zapoznaj się ze stroną Haptics ratyfikacji specyfikacji HID.

Host używa następujących użyć w raporcie wyjściowym (za pośrednictwem zbioru sprzężenia zwrotnego haptycznego), aby umożliwić hostowi wystawianie sygnałów sprzężenia zwrotnego haptycznego do urządzenia haptycznego. Jeśli urządzenie zdecyduje się uwidocznić kolekcję opinii haptycznych, niektóre zastosowania są obowiązkowe, aby zezwolić na obsługiwanie opinii haptycznych inicjowanych przez hosta.

Członek Description Strona identyfikator Obowiązkowe/opcjonalne
Lista kształtów falowych Uporządkowana lista haptycznych kształtów fal obsługiwanych przez urządzenie 0x0E 0x10 Mandatory
Lista czasu trwania Uporządkowana lista czasów trwania kształtów falowych na liście kształtów falowych 0x0E 0x11 Mandatory
Wyzwalacz automatyczny Kształt falowy do automatycznego wyzwalania według uznania urządzenia 0x0E 0x20 Mandatory
Kontrolka skojarzona z automatycznym wyzwalaczem HID użycie elementu sterującego związanego ze sprzężeniem zwrotnym haptycznym 0x0E 0x22 Mandatory
Intensywność Dane wyjściowe — intensywność ręcznego kształtowania fal wyzwalacza jako wartość procentowa 0x0E 0x23 Opcjonalnie
Liczba powtórzeń Dane wyjściowe — liczba razy odtworzenia przebiegu ręcznego wyzwalacza po początkowym odtwarzaniu. 0x0E 0x24 Opcjonalnie
Okres ponownego pobierania Dane wyjściowe — czas oczekiwania przed ponownym wyzwoleniem wyzwalacza ręcznego podczas powtarzania 0x0E 0x25 Opcjonalnie
Czas odcięcia kształtów falowych Maksymalny czas odtwarzania wzorca wyzwalanego ręcznie przed jego zatrzymaniem 0x0E 0x28 Opcjonalnie

Lista kształtów falowych

Użycie listy kształtów falowych reprezentuje kolekcję użycia HID obsługiwanych kształtów falowych uporządkowanych przy użyciu reguł porządkowych. Wstępnie zdefiniowane kształty falowe są określone w specyfikacji HID. W przypadku haptycznych urządzeń piórowych kształt fali może być dzielony na dwa segmenty, które odpowiadają różnym scenariuszom.

  • WAVEFORM_*CONTINOUS — informacje zwrotne oparte na atramencie do symulowania różnych tekstur, podczas gdy użytkownik aktywnie rysuje za pomocą rozmaitych narzędzi, takich jak pióro, ołówek itp.
  • WAVEFORM_* — dyskretna, nieciągła informacja zwrotna oparta na interakcjach, gdy użytkownik wykonuje niektóre zadania oparte na danych wejściowych, takie jak umieszczenie kursora na przycisku, kliknięcie wyłączonego przycisku, i pomyślne rozpoznawanie kształtów pisma odręcznego.

Poniżej znajduje się pełna lista kształtów fal obsługiwanych w przypadku urządzeń haptycznych piórem:

Przebiegu Description Strona identyfikator Obowiązkowe/opcjonalne
WAVEFORM_NONE Brak operacji. Nie należy wpływać na stan odtwarzania bieżących kształtów fali 0x0E 0x1001 Mandatory
WAVEFORM_STOP Zatrzymuje odtwarzanie trwających kształtów fal 0x0E 0x1002 Mandatory
WAVEFORM_CLICK Tworzy krótki sygnał "klik". Domyślne ustawienie zapasowe, gdy informacja zwrotna dotycząca interakcji wybrana przez aplikację nie jest wspierana przez pióro haptyczne 0x0E 0x1003 Mandatory
WAVEFORM_INKCONTINUOUS Symuluje uczucie pisma odręcznego za pomocą fizycznego pióra punktowego. Domyślna opcja rezerwowa, gdy kształt fali pisma odręcznego nie jest obsługiwany przez pióro haptyczne 0x0E 0x100B Mandatory
SUKCES_FALI Silny sygnał haptyczny ostrzegawczego użytkownika, że akcja powiodła się 0x0E 0x1009 Opcjonalnie
WAVEFORM_ERROR Silny sygnał haptyczny ostrzegawcy użytkownika, że akcja nie powiodła się lub wystąpił błąd 0x0E 0x100A Opcjonalnie
WAVEFORM_HOVER Sygnał haptyczny, gdy użytkownik zbliża haptyczne pióro do interaktywnego elementu interfejsu użytkownika 0x0E 0x1008 Opcjonalnie
WAVEFORM_PRESS Sygnal haptyczny, gdy użytkownik naciska interaktywny element interfejsu użytkownika podczas czynności przyrostowej (zobacz Wersja) 0x0E 0x1006 Opcjonalnie
WAVEFORM_RELEASE Sygnał haptyczny, gdy użytkownik zwalnia interakcyjny element interfejsu użytkownika w akcji przyrostowej (zobacz Press) 0x0E 0x1007 Opcjonalnie
WAVEFORM_PENCILCONTINUOUS Ciągły sygnał haptyczny, gdy użytkownik wybiera ołówek jako narzędzie pisma odręcznego 0x0E 0x100C Opcjonalnie
WAVEFORM_MARKERCONTINUOUS Ciągły sygnał haptyczny, gdy użytkownik wybiera znacznik jako narzędzie pisma odręcznego 0x0E 0x100D Opcjonalnie
WYKRESZKSZTAŁTU_DŁUTOMARKERCIĄGŁY Ciągły sygnał haptyczny, gdy użytkownik wybiera znacznik/wyróżniacz cysel jako narzędzie pisma odręcznego 0x0E 0x100E Opcjonalnie
WAVEFORM_BRUSHCONTINUOUS Ciągły sygnał haptyczny, gdy użytkownik wybiera szczotkę jako narzędzie pisma odręcznego 0x0E 0x100F Opcjonalnie
KONTYNUALNE_USUWANIE_FALI Ciągły sygnał haptyczny, gdy użytkownik wybiera gumkę jako narzędzie do rysowania 0x0E 0x1010 Opcjonalnie
WAVEFORM_SPARKLECONTINUOUS Ciągły sygnał haptyczny dla specjalnych narzędzi atramentowych, takich jak wielokolorowa szczotka 0x0E 0x1011 Opcjonalnie

Uwaga / Notatka

Chociaż nie jest to wymagane, zaleca się również zaimplementowanie innych wyliczonych kształtów fal w celu zapewnienia bardziej kompletnego środowiska użytkownika. W szczególności WAVEFORM_PRESS i WAVEFORM_RELEASE są zdecydowanie zalecane, ponieważ zapewniają cenne opinie dotyczące interakcji.

Zarówno WAVEFORM_NONE, jak i WAVEFORM_STOP są wymagane dla wszystkich urządzeń zgodnych ze standardem HID. Porządkowe 1 i 2 są niejawnie ustawione na WAVEFORM_NONE i WAVEFORM_STOP. Nie muszą być deklarowane na liście kształtów falowych ani na liście czasu trwania. Lista kształtów falowych deklaruje obsługiwane kształty falowe według fizycznego minimum i maksymalnej liczby wszystkich porządkowych na liście.

Lista czasu trwania

Użycie listy czasu trwania reprezentuje kolekcję czasów trwania obsługiwanych kształtów falowych na liście Waveform uporządkowane przy użyciu reguł. Jednostka czasu trwania kształtów fali to milisekundy, a czas trwania musi być dodatnią wartością niezerową dla dowolnego nieciągłego kształt fali. Jeśli kształt fali jest ciągły (będzie odtwarzany do momentu, gdy zostanie zatrzymany przez hosta lub przekroczony czas odcięcia fali), to jego czas trwania ustala się na zero.

zakłada się, że WAVEFORM_NONE i WAVEFORM_STOP mają czas trwania zero. Nie muszą być zadeklarowane na liście czasu trwania.

Intensywność

Użycie intensywności reprezentuje wartość procentową maksymalnej intensywności, która ma być stosowana do kształtów fali. Ta wartość powinna się różnić w zakresie od 0 do 100 procent. 100 procent wskazuje, że kształty fal zostaną wyzwolone przez urządzenie przy maksymalnej sile, a 0 procent wskazuje, że transducer haptyczny nie jest włączony.

Liczba powtórzeń

Liczba powtórzeń określa, ile razy należy powtórzyć kształt fali. Liczba powtórzeń zera wskazuje, że kształt fali wyzwalacza ręcznego powinien być odtwarzany tylko raz (bez powtarzania). Jeśli przekroczono czas odcięcia Waveform, oczekuje się, że wszystkie niekompletne powtórzenia będą ignorowane.

Okres ponownego pobierania

Użycie okresu ponownego wyzwalania reprezentuje czas, przez jaki urządzenie czeka przed powtórzeniem ręcznie wyzwalanej formy fali w raporcie wyjściowym, zgodnie z wartością określoną przez Liczbę Powtórzeń. Jednostki dla tej wartości to milisekundy. Jeśli okres pobierania jest mniejszy niż czas trwania odtwarzanego kształtu fali, kształt fali powinien zostać zatrzymany i ponownie uruchomiony w okresie wskazanym przez okres pobierania.

Czas odcięcia kształtów falowych

Użycie czasu odcięcia w formacie Waveform reprezentuje maksymalny czas, przez jaki urządzenie zezwoli na powtórzenie ręcznego przebiegu wyzwalacza przed zakończeniem odtwarzania. Jest to stała wartość urządzenia i zawiera zarówno ciągłe kształty fal bez ustawionych czasów trwania, jak i kształty fal z dyskretnymi czasami trwania, które są ustawione tak, aby powtarzały się wiele razy. Jednostki dla tej wartości to milisekundy.

Raport wyjściowy dotykowy

Gospodarz używa następujących zastosowań w raporcie wyjściowym do generowania zdarzeń haptycznych na urządzeniu Haptic Pen. Niektóre użycia są obowiązkowe w celu zapewnienia zgodności z implementacją hosta systemu Windows.

Członek Description Strona identyfikator Obowiązkowe/opcjonalne
Wyzwalacz ręczny Kształt fali do wyzwolenia jako jawne polecenie z hosta 0x0E 0x21 Mandatory
Intensywność Intensywność ręcznego formowania fali wyzwalacza jako wartość procentowa 0x0E 0x23 Mandatory
Liczba powtórzeń Liczba prób odtwarzania ręcznego wyzwalacza falowego po początkowym odtwarzaniu 0x0E 0x24 Opcjonalnie
Okres ponownego pobierania Czas oczekiwania przed ponownym wyzwoleniem ręcznego wyzwalacza przy powtarzaniu 0x0E 0x25 Opcjonalnie

Wyzwalacz ręczny

Użycie wyzwalacza ręcznego reprezentuje obsługiwane użycie kształtów falowych z listy kształtów falowych, które zostało żądane do odtworzenia przez hosta. Gdy raport wyjściowy zawierający wyzwalacz ręczny inny niż WAVEFORM_NONE jest wysyłany do urządzenia, powinien natychmiast rozpocząć odtwarzanie określonego kształta fali z dodatkowymi właściwościami zawartymi w raporcie wyjściowym (intensywność, liczba powtórzeń, okres pobierania). Gdy raport wyjściowy zawiera wyzwalacz ręczny WAVEFORM_STOP, wszystkie trwające odtwarzanie kształtów falowych powinny zostać zatrzymane.

W przypadku intensywności, liczby powtórzeń i okresu ponownego wyzwalania, zapoznaj się z poprzednią sekcją w odniesieniu do raportu dotyczącego funkcji wyjściowych.

Uruchamianie i zatrzymywanie haptyki

Poniższy schemat blokowy opisuje, kiedy należy skonfigurować, wyczyścić, uruchomić i zatrzymać sygnały haptyczne pióra.

Różne stany haptyczne opisane poniżej to:

  • Odtwarzane: Długopis aktywnie odtwarza falę haptyczną
  • Wstrzymano: pióro jest skonfigurowane z przebiegiem falowym, ale nie jest on aktywnie odtwarzany
  • Zatrzymano: Długopis nie jest skonfigurowany do odtwarzania fali i nie odtwarza nic.

Stan pióra w odniesieniu do digitalizatora można znaleźć w artykule Stany pióra systemu Windows.

Uwaga / Notatka

Kiedy pióro wychodzi poza zakres, zaleca się, ale nie jest wymagane, aby wyczyścić ustawienia konfiguracji haptycznej. Jest to przedstawione na poniższym diagramie przez dwie alternatywne ścieżki wychodzące ze stanu "Pióro: w zakresie; Haptics: Wstrzymano", gdy pióro wykracza poza zakres.

Uwaga / Notatka

Host w dowolnym momencie może zażądać, aby nie ciągły kształt fali był odtwarzany. W takim przypadku długopis powinien go odtworzyć, a następnie wrócić do stanu, w jaki był wcześniej.

Uwaga / Notatka

Host konfiguruje tylko ciągłe kształty fali. Dyskretne/nieciągłe kształty fali są wyzwalane ręcznie.

Diagram stanu pióra haptycznego

Kolekcja klawiatury (opcjonalnie)

Opcjonalna funkcja umożliwiająca przesyłanie raportów kliknięć końcowych przycisków do hosta za pośrednictwem raportów klawiatury HID.

Zgodne urządzenie zgłasza 3 różne kombinacje klawiatury odpowiadające 3 odrębnym akcjom przycisków za pośrednictwem urządzenia klawiaturowego Bluetooth HID uwidocznionego dla hosta. Akcje i odpowiednie kombinacje klawiatury zostały opisane poniżej:

Akcja przycisku Kombinacja klawiszy
Kliknięcie jednokrotne WIN+F20
Kliknij dwukrotnie WIN+F19
Naciśnij i przytrzymaj Win+F18

Implementacja przycisku Bluetooth

Aby zaimplementować końcowy przycisk Bluetooth, urządzenie będzie zgłaszać 3 odrębne kombinacje klawiatury odpowiadające 3 odrębnym akcjom przycisku za pośrednictwem urządzenia klawiatury HID Bluetooth LE udostępnionego na hoście. Akcje i odpowiednie kombinacje klawiatury zostały opisane poniżej:

Akcja przycisku Bluetooth Kombinacja klawiszy do zgłaszania
Kliknięcie jednokrotne WIN+F20
Kliknij dwukrotnie WIN+F19
Naciśnij i przytrzymaj WIN+F18

Pióro stowage

Począwszy od systemu Windows 10, wersja 1903, system Windows obsługuje powiadomienia dla urządzeń z kompatybilnym uchwytem na pióro. Mechanizm polega na tym, że sprzęt wykrywa wyciągnięcie lub włożenie pióra i generuje odpowiedni raport klawiaturowy HID dla pary kombinacji skrótów. Aby zasygnalizować dokowanie (pióro umieszczone w schowku), użyj WIN+CTRL+F20, a aby zasygnalizować oddokowanie (pióro usunięte ze schowka), użyj WIN+CTRL+F19. Można to zaimplementować za pomocą oprogramowania układowego lub sterownika.

Te zdarzenia oddokowania/dokowania otwierają/zamykają menu obszaru roboczego pisma cyfrowego powłoki. Począwszy od systemu Windows 10, wersja 2004 Office reaguje również na te zdarzenia przy użyciu interfejsu API platformy , który umożliwia każdemu deweloperowi rozszerzenie aplikacji na świadomość zdarzeń stowage. Nie ma mechanizmu sprawdzania, czy pióro jest w doku; aplikacje są powiadamiane tylko o zdarzeniach usunięcia i powrotu pióra, gdy są w pierwszym planie.

Przykładowy deskryptor raportu HID

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 ()