Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Det här dokumentet beskriver protokollimplementeringen för haptiska indataenheter som ansluter till en kompatibel Windows 11 värd. Detta omfattar inte vägledning om mekaniska begränsningar, elektriska begränsningar eller komponentval för att generera haptiska svar i indataenhetens maskinvara.
Enhetsklasser som stöds
Windows 11 stöder följande klasser av haptiska indataenheter:
Haptic Touchpad är ett tillägg för klassen Touchpad-enhet på Windows. Den här implementeringsguiden kompletterar Touchpad-implementeringsguiden och fokuserar på att implementera haptik i pekplattans digitalisator, så haptikpekplattor måste uppfylla kraven i Touchpad-implementeringsguiden utöver de som anges här.
Haptic Mouse är ett tillägg till klassen Mouse Device på Windows. Haptiska möss måste uppfylla kraven i den här dokumentationen.
Anmärkning
Haptic-aktiverade penninmatningsenheter är en särskild enhetsklass som inte kommer att omfattas av det här dokumentet. Information om hur du implementerar en pennenhet med haptisk feedback finns i implementeringsguiden för Haptic Pen.
Implementering av haptikprotokollet för indataenheter
Det krävs en god förståelse för HID-protokollet för att kunna förstå den information som presenteras här. Se följande resurser för information om HID-protokollet:
Den haptiska indataenhetens inbyggda programvara behöver bara rapportera de användningar som beskrivs i det här avsnittet. Windows använder den inbyggda programvaran och sina egna HID-drivrutiner för att aktivera enheten och ge Windows program åtkomst till enheten.
Exempelbeskrivningar för varje enhetsklass som stöds finns i avsnittet Exempelrapportbeskrivningar nedan.
Värdinitierad haptisk feedback
En haptikaktiverad indataenhet kan stödja värdstyrd haptisk feedback, som kan utlösas när som helst efter uppräkning. Funktioner relaterade till haptik måste ingå i en HID SimpleHapticsController-samling (sida 0x0E, användning 0x01).
- För pekplattor måste den här samlingen vara underordnad samlingen Windows Precision Touchpad på översta nivån.
- För möss måste den här samlingen vara en toppnivåsamling och ett syskon till mussamlingen på den översta nivån.
Stöd för värdinitierad haptisk feedback kräver HID-rapporter:
- En GET_FEATURE rapport som används av värden för att fråga efter vågformer som stöds och deras varaktighet. Se avsnittet "Waveform Information Feature Report" nedan.
- En utdata-rapport som används av värden för att manuellt utlösa haptisk feedback. Se avsnittet "Manuell utdatarapport för utlösare" nedan.
För pekplattor måste dessa rapporter definieras i två SimpleHapticsController-logiska underordnade samlingar som är underordnade huvudsamlingen SimpleHapticsController. För möss kan dessa rapporter definieras direkt i samlingen på den översta nivån.
Vågformer
Följande tabell definierar de vågformer som stöds av hosten för haptik-aktiverade indataenheter. Vågformerna som stöds av en enhet är associerade med ett ordinaltal. Vågformens användning och varaktighet tillhandahålls till värdenheten via egenskapsrapporten för vågformsinformation (se nedan). Vid aktivering av feedback tillhandahåller värddatorn ordningsnumret för den önskade vågformen som värde för användningen av den manuella utlösaren.
Obligatoriskt och valfritt
| Vågform | Description | Sida | ID-nummer | Obligatoriskt/valfritt |
|---|---|---|---|---|
| None | Ingen åtgärd (No-op). Bör inte påverka uppspelningsstatusen för pågående ljudvågor | 0x0E | 0x1001 | Mandatory |
| Stoppa | Stannar uppspelningen av pågående ljudvågformer | 0x0E | 0x1002 | Mandatory |
| Hovra | En ljuspuls som indikerar hovringstillstånd, vilket signalerar potentialen för en kommande åtgärd | 0x0E | 0x1008 | Mandatory |
| Kollidera | En mjuk puls för att visa att en gräns nås | 0x0E | 0x1012 | Mandatory |
| Align | En skarp puls när ett objekt fäster mot en justeringsguide | 0x0E | 0x1013 | Mandatory |
| Step | En fast puls för diskreta ändringar, till exempel att gå igenom steg eller värden | 0x0E | 0x1014 | Mandatory |
| Växa | En dynamisk puls som förmedlar rörelse, övergångar eller intelligent systemaktivitet | 0x0E | 0x1015 | Mandatory |
| Tryck | En puls som representerar en knapptryckning | 0x0E | 0x1006 | Se nedan |
| Lansering | En puls som representerar en knapptryckning | 0x0E | 0x1007 | Se nedan |
| Success | Ett stigande mönster som bekräftar en slutförd åtgärd | 0x0E | 0x1009 | Se nedan |
| Error | Ett fallande mönster som indikerar en misslyckad åtgärd | 0x0E | 0x100A | Se nedan |
Tryck- och Frisläppningsvågformerna är valfria, men om den ena stöds måste även den andra vara det. För pekplattor ska vågformerna matcha den enhetsinitierade pressen och släppa feedback.
Vågformerna Success och Error är obligatoriska för möss och valfria för pekplattor. Om den ena stöds måste den andra också vara det.
Ej tillåtet
Följande vågformer får inte stödjas.
| Vågform | ID-nummer | Noteringar |
|---|---|---|
| Klicka | 0x1003 | Skulle orsaka förvirring med den befintliga haptiska feedbacken för knapptryckningar. |
| Buzz Kontinuerlig | 0x1004 | Kontinuerliga vågformer får inte stödjas. |
| Rumble kontinuerlig | 0x1005 | Kontinuerliga vågformer får inte stödjas. |
| Kontinuerligt bläckflöde | 0x100B | Gäller endast pennor. |
| Löpande penna | 0x100C | Gäller endast pennor. |
| Kontinuerlig markering | 0x100D | Gäller endast pennor. |
| Kontinuerlig mejselmarkör | 0x100E | Gäller endast pennor. |
| Pensla kontinuerligt | 0x100F | Gäller endast pennor. |
| Kontinuerlig radering | 0x1010 | Gäller endast pennor. |
| Sparkle Kontinuerlig | 0x1011 | Gäller endast pennor. |
Funktionsrapport för vågformsinformation
Värden utfärdar den här GET_FEATURE rapporten när den frågar enheten om dess vågformer som stöds. Den här funktionsrapporten måste ha ett dedikerat rapport-ID.
Rapporten måste ha två underordnade logiska samlingar, en för vågformslistan och en för varaktighetslistan. Dessa samlingar måste definiera ett användningsintervall på sidan Ordinal (0x0A), vilket tillåter värd att fråga efter vågformen och varaktigheten som är kopplade till varje ordningstal.
Obligatoriska och valfria användningar
| Medlem | Description | Sida | ID-nummer | Obligatoriskt/valfritt |
|---|---|---|---|---|
| Vågformslista | Logisk samling som innehåller en ordnad lista över haptiska vågformer som stöds av enheten | 0x0E | 0x10 | Mandatory |
| Varaktighetslista | Logisk samling som innehåller en ordnad lista över varaktigheter för vågformer i vågformslistan | 0x0E | 0x11 | Mandatory |
Vågformslista (obligatorisk)
Den här samlingen innehåller mappningen mellan ordningstal och motsvarande vågformer. Ordningstalen 1 och 2 motsvarar None och Stop implicit och behöver inte deklareras i beskrivningen. Därför kan användningsminimum för samlingens användningsintervall vara 3, och användningsgränsen måste vara tillräckligt stor för att tilldela ordningstal till alla vågformer som stöds. Det finns ingen nödvändig ordning för att tilldela vågformer till ordningstal 3 och senare – endast ordningstalen 1 och 2 har fasta definitioner.
Om maxanvändningen är större än antalet vågformer som stöds av enheten bör enheten rapportera Ingen för ordningstal som inte stöds.
Det logiska intervallet för användningsintervallet måste innehålla alla vågformsanvändningar som stöds. Det fysiska intervallet och enheterna måste vara 0.
Varaktighetslista (obligatorisk)
Den här samlingen innehåller varaktigheterna för vågformerna som definierats i vågformslistan. Användningsminimum och maximum för samlingens användningsintervall måste vara identiska med dem i vågformslistan.
Diskreta vågformer måste ha en varaktighet som inte är noll. Ingen och Stoppa, om det anges, måste ha en varaktighet på noll.
Det logiska minimivärdet för användningsintervallet måste vara noll och det logiska maxvärdet måste vara minst lika stort som varaktigheten för den längsta diskreta vågformen. Värden kommer att behandla de logiska värdena som millisekunder. Det fysiska intervallet måste antingen vara noll eller identiskt med det logiska intervallet. Om det fysiska intervallet och det logiska intervallet matchar måste enheterna vara millisekunder.
Utdatarapport för manuell utlösare
När diskret haptisk feedback aktiveras, utfärdar värden den här rapporten. Den här utdatarapporten måste ha ett dedikerat rapport-ID.
Obligatoriska och valfria användningar
| Medlem | Description | Sida | ID-nummer | Obligatoriskt/valfritt |
|---|---|---|---|---|
| Manuell utlösare | Waveform som aktiveras som ett explicit kommando från värddatorn | 0x0E | 0x21 | Mandatory |
| Intensitet | Feedbackens intensitet | 0x0E | 0x23 | Mandatory |
| Antal upprepningar | Antal gånger som feedbacken ska upprepas efter inledande uppspelning | 0x0E | 0x24 | Se nedan |
| Omutlösningsperiod | Hur lång tid det tar att vänta innan feedbacken återutlöses vid upprepande | 0x0E | 0x25 | Se nedan |
| Vågformsgränstid | Maximal tid som feedbacken kan spelas upp innan den stängs av | 0x0E | 0x28 | Se nedan |
Repeat Count, Retrigger Period och Waveform Cutoff Time är valfria, men om den ena stöds måste även de andra två vara det.
Förbjuden användning
| Usage | ID-nummer | Noteringar |
|---|---|---|
| Automatisk utlösare | 0x20 | Stöds inte av värd. |
| Automatisk utlösare associerad kontroll | 0x22 | Stöds inte av värd. |
Manuell utlösare (obligatorisk)
Denna användning innehåller vågformens ordningstal, så som definierat i funktionsrapporten för vågformsinformation och har begärts att spelas upp av värden. När en utdatarapport som innehåller en annan ordning än Ingen skickas till enheten bör den omedelbart börja spela upp den angivna vågformen med de ytterligare egenskaperna som ingår i utdatarapporten (Intensitet, Upprepa antal, Retrigger-period, Bryttid, om det stöds). Enheten bör endast respektera ordningstal för diskreta vågformer, Ingen och Stopp. Om ordningstalet motsvarar Stopp ska all pågående diskret vågformsuppspelning stoppas. Om ordinaltalet motsvarar Ingen, ska ingen åtgärd vidtas och pågående haptisk feedback bör fortsätta att spelas upp.
Det logiska intervallet måste innehålla alla möjliga ordningstal, inklusive implicita ordningstal 1 (Ingen) och 2 (stopp). Det fysiska intervallet och enheterna måste vara 0.
Intensitet (obligatoriskt)
Den här användningen representerar procentandelen av maximal intensitet som ska tillämpas på den begärda vågformen, där det logiska maxvärdet representerar maximal intensitet och det logiska minimum som inte representerar någon feedback alls.
Det logiska minimumet måste vara noll och det logiska maxvärdet ska väljas baserat på enhetens funktioner – om enheten till exempel stöder fyra nivåer av intensitet bör det logiska maxvärdet vara fyra. Om enheten stöder mer detaljerad intensitet kan det logiska maxvärdet vara större, men det får inte överstiga 100. Enheten måste ha stöd för minst fyra nivåer av intensitet, så det minsta logiska maxvärdet är fyra. En intensitet på noll anger att ingen feedback ska spelas upp – värddatorn kommer bara att använda det här värdet för Stop.
Det fysiska intervallet och enheterna måste vara 0.
Upprepa antal (valfritt)
Den här användningen representerar antalet gånger som vågformen ska upprepas efter den första uppspelningen. Värdet noll anger att vågformen bara ska spelas upp en gång.
Om det här användningsområdet stöds måste även användningen av retrigging-perioden och tidsspärren stödjas.
Det logiska minimumet måste vara noll och det logiska maxvärdet måste vara större än noll. Det logiska maxvärdet bör begränsas till ett rimligt värde (till exempel 10). Det fysiska intervallet och enheterna måste vara 0.
Omtriggertid (valfritt)
Den här användningen representerar tiden mellan vågformens återutlösningar och mäts från starttiden för den föregående utlösaren. Värdet noll ska tolkas som identiskt med standardvaraktigheten för vågformen, så retriggan inträffar omedelbart efter att den föregående har slutförts. Värden som är mindre än standardvaraktigheten för vågformen bör avbryta vågformen och starta om den.
Om den här användningen stöds måste användning av antal upprepningar och tidsgränser också stödjas.
Värden kommer att behandla de logiska värdena som millisekunder. Det logiska minimumet måste vara noll och det logiska maxvärdet måste vara minst 1 000 (representerar en sekund). Det fysiska intervallet måste antingen vara noll eller identiskt med det logiska intervallet. Om det fysiska intervallet inte är noll måste enheterna vara millisekunder.
Bryttid för vågform (valfritt)
Den här användningen representerar den maximala tid som en enskild utlösare kan leda till uppspelning, med hänsyn till antalet upprepningar och retriggerperioden.
Om den här användningen stöds måste användningen av upprepningsantal och retriggerperiod också stödjas.
Värden kommer att behandla de logiska värdena som millisekunder. Det logiska minimumet måste vara minst lika stort som varaktigheten för den längsta diskreta vågformen multiplicerat med det logiska maxvärdet för användningen av upprepat antal plus en. Det här logiska minimumet representerar varaktigheten för att utlösa den längsta vågformen med det maximala antalet upprepade utlösare som stöds och ingen fördröjning mellan retriggers. Det logiska maxvärdet kan begränsas för att förhindra överdriven haptisk feedbackvaraktighet för en enskild begäran, efter enhetens gottfinnande. Det fysiska intervallet måste antingen vara noll eller identiskt med det logiska intervallet. Om det fysiska intervallet inte är noll måste enheterna vara millisekunder.
Haptic Touchpad-vägledning
Objekten i det här avsnittet gäller endast för haptiska pekplattor.
Enhetsinitierad haptisk återkoppling
En haptisk pekplatta ansvarar för att utlösa haptisk feedback när den fastställer att pekplattans yta knapp har tryckts eller släppts. Den kan välja att stödja SET_FEATURE-rapporter för att tillåta användaranpassning av dess beteende när den gör det.
- Intensiteten i den haptiska feedbacken
- Den kraft som krävs för att utlösa en knapptryckning
Båda dessa funktionsrapporter är obligatoriska om pekplattan också stöder värdinitierad haptisk feedback. Varje rapport måste använda ett distinkt rapport-ID, som inte används med någon annan användning.
Under uppräkningen utvärderar värden det logiska och fysiska intervall som stöds från beskrivningen och beräknar de tillgängliga alternativen för inställningsgränssnittet, inklusive standardvärdena. Värddatorn ska skicka ut SET_FEATURE för att förmedla det användarspecifika värdet till enheten. Detta kan ske när som helst, men ska ske när inställningen ändras, en användarväxling sker och när enheten räknas upp eller återställs. Innan SET_FEATURE rapporten har utfärdats bör enheten använda en rimlig standardinställning som den själv väljer (t.ex. mitten av dess logiska intervall).
Rapport om haptisk intensitet och funktioner
Den här SET_FEATURE rapporten anger användarens inställning för intensiteten i haptisk feedback för knapptryckning och -släpp. Den gäller INTE för intensiteten i någon värdinitierad feedback, om den stöds av enheten. För att stödja den här konfigurationen måste enheten definiera en logisk underordnad SimpleHapticsController-samling (sida 0x0E, användning 0x01) i samlingen Windows Precision Touchpad på den översta nivån, som innehåller haptisk intensitetsanvändning (sid 0x0E, användning 0x23) som en funktionsrapport med ett dedikerat rapport-ID. Den här underordnade samlingen får inte innehålla användningar av automatisk trigg (Sida 0x0E, användning 0x20) eller manuell trigg (Sida 0x0E, användning 0x21). Den måste vara separat från den underordnad samlingen SimpleHapticsController som används för värdinitierad haptisk feedback (om den stöds).
Det logiska minimumet måste vara lika med noll och det logiska maxvärdet måste vara större än eller lika med fyra. Användarens inställning skalas linjärt in i det logiska intervallet, med noll som anger att ingen feedback ska utlösas för knapptryckning och släpp.
Tryckknapp tröskelvärdesfunktionsrapport
Den här SET_FEATURE rapporten anger användarens inställning för hur mycket kraft som krävs för att utlösa en knapptryckning. För att stödja den här konfigurationen måste enheten definiera användningen av knapptryckningströskeln (sida 0x0D, användning 0xB0) som en funktionsrapport med ett dedikerat rapport-ID i samlingen Windows Precision Touchpad på den översta nivån. Den får inte finnas i en logisk SimpleHapticsController-samling.
Det logiska intervallet ska linjärt mappas till det fysiska intervallet med värden och vara jämnt fördelat och centrerat kring standardvärdet. När du hämtar det logiska intervallet beräknas standardvärdet med hjälp av följande formel:
Det logiska minimivärdet, standardvärdet och det logiska maxvärdet motsvarar 3 distinkta nivåer av knapptryckning som exponeras för en användare via användargränssnittet för Windows inställningar (stöd för "Låg", "Medel" respektive "Hög").
Det rekommenderade fysiska intervallet för knapptryckningströskel är att åtminstone täcka intervallet mellan 110g och 190g, vilket motsvarar de lägsta respektive högsta värdena. En exempelbeskrivning som använder ett fysiskt maxvärde på 190g och ett fysiskt minimum på 110 g (baserat på formeln ovan är standardvärdet 150 g) finns i Exempelrapportbeskrivningar.
Exempel på HID-rapportbeskrivningar
Haptic Touchpad-exempelbeskrivning
Följande beskrivning stöder alla obligatoriska och valfria användningar. Den deklarerar stöd för fem vågformer, med den längsta varaktigheten på 50 ms.
Alla logiska intervall bör uppdateras baserat på enhetsstöd. Så här stöder du ett annat antal vågformer:
- Det logiska intervallet för användningen av manuell utlösare måste uppdateras
- Användningsintervallen och rapportantalet för Vågformslista och Varaktighetslista måste uppdateras
För att stödja en annan maximal vågformslängd måste följande logiska intervall uppdateras:
- Retriggerperiod (utdata)
- Bryttid för vågform (utdata)
- Varaktighetslista (funktion)
0x05, 0x0D, // UsagePage(Digitizers[0x000D])
0x09, 0x05, // UsageId(Touch Pad[0x0005])
0xA1, 0x01, // Collection(Application)
0x85, 0x40, // ReportId(64)
0x05, 0x0D, // UsagePage(Digitizers[0x000D])
0x09, 0xB0, // UsageId(Button Press Threshold[0x00B0])
0x35, 0x6E, // PhysicalMinimum(110)
0x46, 0xBE, 0x00, // PhysicalMaximum(190)
0x66, 0x01, 0x01, // Unit('gram', SiLinear, Gram:1)
0x55, 0x00, // UnitExponent(1)
0x15, 0x01, // LogicalMinimum(1)
0x25, 0x03, // LogicalMaximum(3)
0x95, 0x01, // ReportCount(1)
0x75, 0x08, // ReportSize(8)
0xB1, 0x02, // Feature(Data, Variable, Absolute)
0x85, 0x41, // ReportId(65)
0x05, 0x0E, // UsagePage(Haptics[0x000E])
0x09, 0x01, // UsageId(Simple Haptic Controller[0x0001])
0xA1, 0x02, // Collection(Logical)
0x05, 0x0E, // UsagePage(Haptics[0x000E])
0x09, 0x23, // UsageId(Intensity[0x0023])
0x35, 0x00, // PhysicalMinimum(0)
0x45, 0x00, // PhysicalMaximum(0)
0x65, 0x00, // Unit(None)
0x55, 0x00, // UnitExponent(1)
0x15, 0x00, // LogicalMinimum(0)
0x25, 0x04, // LogicalMaximum(4)
0x95, 0x01, // ReportCount(1)
0x75, 0x08, // ReportSize(8)
0xB1, 0x02, // Feature(Data, Variable, Absolute)
0xC0, // EndCollection()
0x85, 0x42, // ReportId(66)
0x05, 0x0E, // UsagePage(Haptics[0x000E])
0x09, 0x01, // UsageId(Simple Haptic Controller[0x0001])
0xA1, 0x02, // Collection(Logical)
0x05, 0x0E, // UsagePage(Haptics[0x000E])
0x09, 0x10, // UsageId(Waveform List[0x0010])
0xA1, 0x02, // Collection(Logical)
0x05, 0x0A, // UsagePage(Ordinal[0x000A])
0x19, 0x03, // UsageIdMin(Instance 3[0x0003])
0x29, 0x07, // UsageIdMax(Instance 7[0x0007])
0x35, 0x00, // PhysicalMinimum(0)
0x45, 0x00, // PhysicalMaximum(0)
0x65, 0x00, // Unit(None)
0x55, 0x00, // UnitExponent(1)
0x16, 0x01, 0x10, // LogicalMinimum(4,097)
0x26, 0xFF, 0x2F, // LogicalMaximum(12,287)
0x95, 0x05, // ReportCount(5)
0x75, 0x10, // ReportSize(16)
0xB1, 0x02, // Feature(Data, Variable, Absolute)
0xC0, // EndCollection()
0x05, 0x0E, // UsagePage(Haptics[0x000E])
0x09, 0x11, // UsageId(Duration List[0x0011])
0xA1, 0x02, // Collection(Logical)
0x05, 0x0A, // UsagePage(Ordinal[0x000A])
0x19, 0x03, // UsageIdMin(Instance 3[0x0003])
0x29, 0x07, // UsageIdMax(Instance 7[0x0007])
0x35, 0x00, // PhysicalMinimum(0)
0x45, 0x32, // PhysicalMaximum(50)
0x66, 0x01, 0x10, // Unit('millisecond', SiLinear, Seconds:1)
0x55, 0x0D, // UnitExponent(0.001)
0x15, 0x00, // LogicalMinimum(0)
0x25, 0x32, // LogicalMaximum(50)
0x95, 0x05, // ReportCount(5)
0x75, 0x08, // ReportSize(8)
0xB1, 0x02, // Feature(Data, Variable, Absolute)
0xC0, // EndCollection()
0xC0, // EndCollection()
0x85, 0x43, // ReportId(67)
0x05, 0x0E, // UsagePage(Haptics[0x000E])
0x09, 0x01, // UsageId(Simple Haptic Controller[0x0001])
0xA1, 0x02, // Collection(Logical)
0x05, 0x0E, // UsagePage(Haptics[0x000E])
0x09, 0x21, // UsageId(Manual Trigger[0x0021])
0x35, 0x00, // PhysicalMinimum(0)
0x45, 0x00, // PhysicalMaximum(0)
0x65, 0x00, // Unit(None)
0x55, 0x00, // UnitExponent(1)
0x15, 0x01, // LogicalMinimum(1)
0x25, 0x07, // LogicalMaximum(7)
0x95, 0x01, // ReportCount(1)
0x75, 0x08, // ReportSize(8)
0x91, 0x02, // Output(Data, Variable, Absolute)
0x05, 0x0E, // UsagePage(Haptics[0x000E])
0x09, 0x23, // UsageId(Intensity[0x0023])
0x35, 0x00, // PhysicalMinimum(0)
0x45, 0x00, // PhysicalMaximum(0)
0x65, 0x00, // Unit(None)
0x55, 0x00, // UnitExponent(1)
0x15, 0x00, // LogicalMinimum(0)
0x25, 0x04, // LogicalMaximum(4)
0x95, 0x01, // ReportCount(1)
0x75, 0x08, // ReportSize(8)
0x91, 0x02, // Output(Data, Variable, Absolute)
0x05, 0x0E, // UsagePage(Haptics[0x000E])
0x09, 0x24, // UsageId(Repeat Count[0x0024])
0x35, 0x00, // PhysicalMinimum(0)
0x45, 0x00, // PhysicalMaximum(0)
0x65, 0x00, // Unit(None)
0x55, 0x00, // UnitExponent(1)
0x15, 0x00, // LogicalMinimum(0)
0x25, 0x05, // LogicalMaximum(5)
0x95, 0x01, // ReportCount(1)
0x75, 0x08, // ReportSize(8)
0x91, 0x02, // Output(Data, Variable, Absolute)
0x05, 0x0E, // UsagePage(Haptics[0x000E])
0x09, 0x25, // UsageId(Retrigger Period[0x0025])
0x35, 0x00, // PhysicalMinimum(0)
0x46, 0xE8, 0x03, // PhysicalMaximum(1,000)
0x66, 0x01, 0x10, // Unit('millisecond', SiLinear, Seconds:1)
0x55, 0x0D, // UnitExponent(0.001)
0x15, 0x00, // LogicalMinimum(0)
0x26, 0xE8, 0x03, // LogicalMaximum(1,000)
0x95, 0x01, // ReportCount(1)
0x75, 0x10, // ReportSize(16)
0x91, 0x02, // Output(Data, Variable, Absolute)
0x05, 0x0E, // UsagePage(Haptics[0x000E])
0x09, 0x28, // UsageId(Waveform Cutoff Time[0x0028])
0x36, 0xE8, 0x03, // PhysicalMinimum(1,000)
0x46, 0x88, 0x13, // PhysicalMaximum(5,000)
0x66, 0x01, 0x10, // Unit('millisecond', SiLinear, Seconds:1)
0x55, 0x0D, // UnitExponent(0.001)
0x16, 0xE8, 0x03, // LogicalMinimum(1,000)
0x26, 0x88, 0x13, // LogicalMaximum(5,000)
0x95, 0x01, // ReportCount(1)
0x75, 0x10, // ReportSize(16)
0x91, 0x02, // Output(Data, Variable, Absolute)
0xC0, // EndCollection()
0xC0, // EndCollection()
Ovanstående beskrivning genererades via följande Waratah-fil :
[[settings]]
packingInBytes = 1
optimize = false
[[unit]]
name = 'millisecond'
second = [0.001, 1.0]
[[applicationCollection]]
usage = ['Digitizers', 'Touch Pad']
# Button press threshold feature report
[[applicationCollection.featureReport]]
id = 0x40
[[applicationCollection.featureReport.variableItem]]
usage = ['Digitizers', 'Button Press Threshold']
logicalValueRange = [1, 3]
physicalValueRange = [110, 190]
unit = 'gram'
# Feedback intensity feature report
[[applicationCollection.featureReport]]
id = 0x41
[[applicationCollection.featureReport.logicalCollection]]
usage = ['Haptics', 'Simple Haptic Controller']
[[applicationCollection.featureReport.logicalCollection.variableItem]]
usage = ['Haptics', 'Intensity']
logicalValueRange = [0, 4]
# Host-initiated waveform information feature report
[[applicationCollection.featureReport]]
id = 0x42
[[applicationCollection.featureReport.logicalCollection]]
usage = ['Haptics', 'Simple Haptic Controller']
[[applicationCollection.featureReport.logicalCollection.logicalCollection]]
usage = ['Haptics', 'Waveform List']
[[applicationCollection.featureReport.logicalCollection.logicalCollection.variableItem]]
usageRange = ['Ordinal', 'Instance 3', 'Instance 7']
logicalValueRange = [0x1001, 0x2FFF]
[[applicationCollection.featureReport.logicalCollection.logicalCollection]]
usage = ['Haptics', 'Duration List']
[[applicationCollection.featureReport.logicalCollection.logicalCollection.variableItem]]
usageRange = ['Ordinal', 'Instance 3', 'Instance 7']
logicalValueRange = [0, 50]
physicalValueRange = [0, 50]
unit = 'millisecond'
# Host-initiated waveform manual trigger output report
[[applicationCollection.outputReport]]
id = 0x43
[[applicationCollection.outputReport.logicalCollection]]
usage = ['Haptics', 'Simple Haptic Controller']
[[applicationCollection.outputReport.logicalCollection.variableItem]]
usage = ['Haptics', 'Manual Trigger']
logicalValueRange = [1, 7]
[[applicationCollection.outputReport.logicalCollection.variableItem]]
usage = ['Haptics', 'Intensity']
logicalValueRange = [0, 4]
[[applicationCollection.outputReport.logicalCollection.variableItem]]
usage = ['Haptics', 'Repeat Count']
logicalValueRange = [0, 5]
[[applicationCollection.outputReport.logicalCollection.variableItem]]
usage = ['Haptics', 'Retrigger Period']
logicalValueRange = [0, 1000]
physicalValueRange = [0, 1000]
unit = 'millisecond'
[[applicationCollection.outputReport.logicalCollection.variableItem]]
usage = ['Haptics', 'Waveform Cutoff Time']
logicalValueRange = [1000, 5000]
physicalValueRange = [1000, 5000]
unit = 'millisecond'
Exempel på haptisk musbeskrivning
Följande beskrivning stöder alla obligatoriska och valfria användningar. Det deklarerar stöd för åtta vågformer, med den längsta varaktigheten på 200 ms.
Alla logiska intervall bör uppdateras baserat på enhetsstöd. Så här stöder du ett annat antal vågformer:
- Det logiska intervallet för användningen av manuell utlösare måste uppdateras
- Användningsintervallen och rapportantalet för Vågformslista och Varaktighetslista måste uppdateras
För att stödja en annan maximal vågformslängd måste följande logiska intervall uppdateras:
- Retriggerperiod (utdata)
- Bryttid för vågform (utdata)
- Varaktighetslista (funktion)
0x05, 0x01, // UsagePage(Generic Desktop[0x0001])
0x09, 0x02, // UsageId(Mouse[0x0002])
0xA1, 0x01, // Collection(Application)
0x85, 0x01, // ReportId(1)
0x09, 0x01, // UsageId(Pointer[0x0001])
0xA1, 0x00, // Collection(Physical)
0x09, 0x30, // UsageId(X[0x0030])
0x09, 0x31, // UsageId(Y[0x0031])
0x15, 0x80, // LogicalMinimum(-128)
0x25, 0x7F, // LogicalMaximum(127)
0x95, 0x02, // ReportCount(2)
0x75, 0x08, // ReportSize(8)
0x81, 0x06, // Input(Data, Variable, Relative)
0x05, 0x09, // UsagePage(Button[0x0009])
0x19, 0x01, // UsageIdMin(Button 1[0x0001])
0x29, 0x03, // UsageIdMax(Button 3[0x0003])
0x15, 0x00, // LogicalMinimum(0)
0x25, 0x01, // LogicalMaximum(1)
0x95, 0x03, // ReportCount(3)
0x75, 0x01, // ReportSize(1)
0x81, 0x02, // Input(Data, Variable, Absolute)
0xC0, // EndCollection()
0x95, 0x01, // ReportCount(1)
0x75, 0x05, // ReportSize(5)
0x81, 0x03, // Input(Constant, Variable, Absolute)
0xC0, // EndCollection()
0x05, 0x0E, // UsagePage(Haptics[0x000E])
0x09, 0x01, // UsageId(Simple Haptic Controller[0x0001])
0xA1, 0x01, // Collection(Application)
0x85, 0x10, // ReportId(16)
0x09, 0x10, // UsageId(Waveform List[0x0010])
0xA1, 0x02, // Collection(Logical)
0x05, 0x0A, // UsagePage(Ordinal[0x000A])
0x19, 0x03, // UsageIdMin(Instance 3[0x0003])
0x29, 0x0A, // UsageIdMax(Instance 10[0x000A])
0x16, 0x01, 0x10, // LogicalMinimum(4,097)
0x26, 0xFF, 0x2F, // LogicalMaximum(12,287)
0x95, 0x08, // ReportCount(8)
0x75, 0x0E, // ReportSize(14)
0xB1, 0x02, // Feature(Data, Variable, Absolute)
0xC0, // EndCollection()
0x05, 0x0E, // UsagePage(Haptics[0x000E])
0x09, 0x11, // UsageId(Duration List[0x0011])
0xA1, 0x02, // Collection(Logical)
0x05, 0x0A, // UsagePage(Ordinal[0x000A])
0x19, 0x03, // UsageIdMin(Instance 3[0x0003])
0x29, 0x0A, // UsageIdMax(Instance 10[0x000A])
0x46, 0xC8, 0x00, // PhysicalMaximum(200)
0x66, 0x01, 0x10, // Unit('millisecond', SiLinear, Seconds:1)
0x55, 0x0D, // UnitExponent(0.001)
0x15, 0x00, // LogicalMinimum(0)
0x26, 0xC8, 0x00, // LogicalMaximum(200)
0x75, 0x08, // ReportSize(8)
0xB1, 0x02, // Feature(Data, Variable, Absolute)
0xC0, // EndCollection()
0x85, 0x11, // ReportId(17)
0x05, 0x0E, // UsagePage(Haptics[0x000E])
0x09, 0x21, // UsageId(Manual Trigger[0x0021])
0x45, 0x00, // PhysicalMaximum(0)
0x65, 0x00, // Unit(None)
0x55, 0x00, // UnitExponent(1)
0x15, 0x01, // LogicalMinimum(1)
0x25, 0x0A, // LogicalMaximum(10)
0x95, 0x01, // ReportCount(1)
0x75, 0x04, // ReportSize(4)
0x91, 0x02, // Output(Data, Variable, Absolute)
0x09, 0x23, // UsageId(Intensity[0x0023])
0x15, 0x00, // LogicalMinimum(0)
0x25, 0x04, // LogicalMaximum(4)
0x75, 0x03, // ReportSize(3)
0x91, 0x02, // Output(Data, Variable, Absolute)
0x09, 0x24, // UsageId(Repeat Count[0x0024])
0x25, 0x05, // LogicalMaximum(5)
0x91, 0x02, // Output(Data, Variable, Absolute)
0x09, 0x25, // UsageId(Retrigger Period[0x0025])
0x46, 0xE8, 0x03, // PhysicalMaximum(1,000)
0x66, 0x01, 0x10, // Unit('millisecond', SiLinear, Seconds:1)
0x55, 0x0D, // UnitExponent(0.001)
0x26, 0xE8, 0x03, // LogicalMaximum(1,000)
0x75, 0x0A, // ReportSize(10)
0x91, 0x02, // Output(Data, Variable, Absolute)
0x09, 0x28, // UsageId(Waveform Cutoff Time[0x0028])
0x36, 0xE8, 0x03, // PhysicalMinimum(1,000)
0x46, 0x88, 0x13, // PhysicalMaximum(5,000)
0x16, 0xE8, 0x03, // LogicalMinimum(1,000)
0x26, 0x88, 0x13, // LogicalMaximum(5,000)
0x75, 0x0D, // ReportSize(13)
0x91, 0x02, // Output(Data, Variable, Absolute)
0x75, 0x07, // ReportSize(7)
0x91, 0x03, // Output(Constant, Variable, Absolute)
0xC0, // EndCollection()
Ovanstående beskrivning genererades via följande Waratah-fil :
[[unit]]
name = 'millisecond'
second = [0.001, 1.0]
[[applicationCollection]]
usage = ['Generic Desktop', 'Mouse']
# Mouse
[[applicationCollection.inputReport]]
[[applicationCollection.inputReport.physicalCollection]]
usage = ['Generic Desktop', 'Pointer']
[[applicationCollection.inputReport.physicalCollection.variableItem]]
usage = ['Generic Desktop', 'X']
sizeInBits = 8
logicalValueRange = 'maxSignedSizeRange'
reportFlags = ['relative']
[[applicationCollection.inputReport.physicalCollection.variableItem]]
usage = ['Generic Desktop', 'Y']
sizeInBits = 8
logicalValueRange = 'maxSignedSizeRange'
reportFlags = ['relative']
[[applicationCollection.inputReport.physicalCollection.variableItem]]
usageRange = ['Button', 'Button 1', 'Button 3']
logicalValueRange = [0, 1]
[[applicationCollection]]
usage = ['Haptics', 'Simple Haptic Controller']
# Host-initiated waveform information feature report
[[applicationCollection.featureReport]]
id = 0x10
[[applicationCollection.featureReport.logicalCollection]]
usage = ['Haptics', 'Waveform List']
[[applicationCollection.featureReport.logicalCollection.variableItem]]
usageRange = ['Ordinal', 'Instance 3', 'Instance 10']
logicalValueRange = [0x1001, 0x2FFF]
[[applicationCollection.featureReport.logicalCollection]]
usage = ['Haptics', 'Duration List']
[[applicationCollection.featureReport.logicalCollection.variableItem]]
usageRange = ['Ordinal', 'Instance 3', 'Instance 10']
logicalValueRange = [0, 200]
physicalValueRange = [0, 200]
unit = 'millisecond'
# Host-initiated waveform manual trigger output report
[[applicationCollection.outputReport]]
id = 0x11
[[applicationCollection.outputReport.variableItem]]
usage = ['Haptics', 'Manual Trigger']
logicalValueRange = [1, 10]
[[applicationCollection.outputReport.variableItem]]
usage = ['Haptics', 'Intensity']
logicalValueRange = [0, 4]
[[applicationCollection.outputReport.variableItem]]
usage = ['Haptics', 'Repeat Count']
logicalValueRange = [0, 5]
[[applicationCollection.outputReport.variableItem]]
usage = ['Haptics', 'Retrigger Period']
logicalValueRange = [0, 1000]
physicalValueRange = [0, 1000]
unit = 'millisecond'
[[applicationCollection.outputReport.variableItem]]
usage = ['Haptics', 'Waveform Cutoff Time']
logicalValueRange = [1000, 5000]
physicalValueRange = [1000, 5000]
unit = 'millisecond'