Baş takip cihazı HID protokolü

Cihazlar için kullanılabilen baş izleme insan arayüzü cihazı (HID) protokolü Android 13 ve sonraki sürümleri çalıştıran bir Android cihaza USB veya ve Android çerçevesi ile uygulamalarına erişim sahibi, sensors çerçevesidir. Bu protokol şunlar için kullanılır: kontrol ediyor Ses sanallaştırıcı efekti (3D ses). Bu sayfada cihaz ve Bluetooth anlamında ana makine (cihaz, baş izleme cihazı anlamına gelir) host ise Android ana makinesi anlamına gelir.

Cihaz üreticilerinin Android cihazlarını desteğin etkinleştirilmesi için yapılandırmaları gerekir: baş takip cihazı HID protokolüyle uyumlu. Ayrıntılı bilgi için hakkında daha fazla bilgi edinmek için Dinamik Sensörler BENİOKU).

Bu sayfada aşağıdaki kaynaklara aşina olduğunuz varsayılır:

Üst düzey yapı

Android çerçevesi, baş takip cihazını bir HID cihazı olarak tanımlar.

Geçerli bir HID tanımlayıcısının tam örneği için bkz. Ek 1: HID Açıklayıcı örneği.

Üst düzeyde, baş takip cihazı, şuna sahip bir uygulama koleksiyonudur: Sensors sayfası (0x20) ve Other: Custom kullanımı (0xE1). İçinde çeşitli veri alanları (girişler) ve özelliklerden (özellikler) oluşur.

Mülkler ve veri alanları

Bu bölümde, bir uygulamadaki özellikler ve veri alanları açıklanmaktadır baş takip cihazı koleksiyonu.

Özellik: Sensör Açıklaması (0x0308)

Sensör Açıklaması (0x0308) özelliği, salt okunur bir ASCII (8 bit) dizesidir özelliği ekleyin:

Baş takip cihazı sürüm 1.0:

#AndroidHeadTracker#1.0

Baş takip cihazı sürüm 2.0 (Android 15 veya sonraki sürümlerde kullanılabilir. yüksek) şunları sağlar:

#AndroidHeadTracker#2.0#x

x, destek aktarımını gösteren bir tam sayıdır (1, 2, 3):

  • 1: EKL
  • 2: ISO
  • 3: EKL + ISO

Boş sonlandırıcı beklenmemektedir. Diğer bir deyişle, bu mülkün toplam boyutu sürüm 1.0 için 8 bitlik 23 karakterdir.

Bu özellik, diğer öğelerle çakışmaları önlemek için özel sensörler.

Özellik: Kalıcı Benzersiz Kimlik (0x0302)

Kalıcı Benzersiz Kimlik (0x0302) özelliği, 16'lık salt okunur bir dizidir öğeler, her biri 8 bit (toplam 128 bit). Boş sonlandırıcı beklenmemektedir. Bu özelliği isteğe bağlıdır.

Bu özellik, sese entegre edilmiş baş izleme cihazlarına izin verir. cihazları, bağlı oldukları ses cihazına referans göstermek için kullanır. Aşağıdaki şemalar desteklenir.

Bağımsız baş takip cihazı

Kalıcı Benzersiz Kimlik (0x0302) özelliği yoksa veya "all" değerine ayarlanmışsa sıfırsa, baş takip cihazı kalıcı olarak bir cihaza bağlı değildir. ses cihazıdır ve ayrı olarak kullanılabilir (örneğin, kullanıcının baş takip cihazını ayrı bir ses cihazıyla manuel olarak ilişkilendirme

Bluetooth MAC adresi kullanarak referans

Sekiz 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Değer 0 0 0 0 0 0 0 0 B T Bluetooth MAC

Bu şemada, ilk 8 sekizlik 0, 8 ve 9 sekizlikleri şunları içermelidir sırasıyla B ve T ASCII değerleri ve aşağıdaki 6 sekizlik bir Bluetooth MAC adresi olarak yorumlanır ve baş takip cihazının bu MAC adresine sahip tüm ses sistemleri için geçerlidir. Bu adres kimlik adresi (cihaz, MAC adresi tarafından bağlantılar. Bluetooth klasik üzerinden bağlanan çift modlu cihazlar (v1.0 HID biçimi) ve Bluetooth LE (v2.0 HID biçimi) iki HID biçimini göstermelidir aynı kimlik adresine sahip tanımlayıcılar. Ayrılan çift modlu cihazlar Sol ve sağ cihazlar birincil ikili kimliği kullanarak Bluetooth LE HID'yi açığa çıkarmalıdır tercih edebilirsiniz.

UUID kullanan referans

8 sekizlinin en anlamlı biti (MSB) ayarlandığında (≥0x80), alan aşağıdaki gibi bir UUID olarak yorumlanır: RFC-4122. İlgili içeriği oluşturmak için kullanılan ses cihazında kayıtlı olan UUID'nin aynısını sağlar sisteme özgü belirtilmemiş bir mekanizma aracılığıyla, kullanılan ulaşım türünü ifade eder.

Mülk: Raporlama Durumu (0x0316)

Raporlama Durumu (0x0316) özelliği, aşağıdakileri içeren bir okuma/yazma özelliğidir: HID spesifikasyonunda tanımlandığı gibi standart anlamlar. Ana makine, bunu özelliğini kullanabilirsiniz. Yalnızca değerleri Hayır Etkinlikler (0x0840) ve Tüm Etkinlikler (0x0841) kullanılır.

Bu alanın ilk değeri Etkinlik Yok olmalı ve hiçbir zaman olmamalıdır cihaz tarafından değiştirildiğinde yalnızca ana makine tarafından değiştirilir.

Mülk: Güç Durumu (0x0319)

Güç Durumu (0x0319) özelliği, HID spesifikasyonunda tanımlandığı gibi standart anlamlar. Ana makine, bunu özelliğini kullanarak cihazın hangi güç durumunda olması gerektiğini belirtir. Yalnızca Tam Güç (0x0851) ve Kapat (0x0855) değerleri kullanılır.

Bu alanın ilk değeri cihaz tarafından belirlenir ve hiçbir zaman cihaz tarafından değiştirildiğinde yalnızca ana makine tarafından değiştirilir.

Mülk: Rapor Aralığı (0x030E)

Rapor Aralığı (0x030E) özelliği, HID spesifikasyonunda tanımlandığı gibi standart anlamlar. Ana makine, bunu özelliğini kullanmanızı öneririz. Birimler saniyedir. Bu değer için geçerli aralık cihaz tarafından belirlenir ve Fiziksel Min/Max mekanizması kullanılarak açıklandı. En az 50 Hz raporlama ücreti desteklenmelidir. Önerilen maksimum raporlama ücreti: 100 Hz. Bu nedenle, minimum rapor aralığı en fazla şuna eşit olmalıdır: 20 ms'ye ayarlanır ve 10 ms'den yüksek veya 10 ms'ye eşit olması önerilir.

Mülk: Tedarikçi firma tarafından ayrılmış LE Transport (0xF410)

Tedarikçi firma tarafından ayrılmış LE Transport (0xF410) mülkü bir okuma/yazma özelliğidir özellikleri, HID spesifikasyonunda tanımlandığı gibi standart anlamlara sahip olmalıdır. Ev sahibi bu özelliği seçilen aktarımı (EKL veya ISO) belirtmek için kullanır. Yalnızca EKL (0xF800) ve ISO (0xF801) değerleri kullanılır ve her ikisi de dahil edilmelidir mantıksal koleksiyonda kullanır.

Bu özellik, güç veya raporlama durumlarından önce yapılandırılır.

Veri alanı: Özel Değer 1 (0x0544)

Özel Değer 1 (0x0544) alanı, gerçek baş izleme bilgileridir. Bu, 3 öğeli bir dizidir ve Bölüm 6.2.2.7'de belirtildiği gibi, fiziksel değerler için normal HID kurallarına HID spesifikasyonu. Her öğe için geçerli aralık [-÷, ÷] rad'dir. Birimler her zaman radyandır.

Öğeler şu şekilde yorumlanır: [rx, ry, rz]. Böylece [rx, ry, rz], bir rotasyon vektörü için , referans çerçeveden ana çerçeveye dönüştürmeyi temsil eder. Büyüklük, [0..karma] aralığında olmalıdır.

Referans çerçevesi rastgeledir ancak genellikle sabittir ve sağ elle kullanılıyor. Az miktarda kayma kabul edilebilir. Baş eksenleri şunlardır:

  • Sol kulaktan sağa X işareti
  • kafanın arkasından buruna kadar Y (geriye doğru)
  • boyundan kafanın üst kısmına Z

Veri alanı: Özel Değer 2 (0x0545)

Özel Değer 2 (0x0545) alanı, gerçek baş izleme bilgileridir. Bu, 3 öğeli sabit noktalı bir dizidir, Fiziksel değerler için normal HID kurallarına göre yorumlanır. Birimler her zaman radyan/saniyedir.

Öğeler şu şekilde yorumlanır: [vx, vy, vz]. Böylece [vx, vy, vz], bir rotasyon vektörü için baş çerçevesinin açısal hızını temsil eden (kendisine göre).

Veri alanı: Özel Değer 3 (0x0546)

Özel Değer 3 (0x0546) alanı, izleme için kullanılan bir giriş alanıdır süreksizlikler olduğunu gösterdiğini öğrendik. 8 bitlik skaler bir tam sayıdır seçin. Bu değer cihaz tarafından artırılmalıdır (kapsamlı şekilde). referans çerçevesinin değiştirilmesi (ör. bir yön filtresi algoritması Yönü belirlemek için kullanılan zaman dilimi sıfırlanmış. Bu değer Fiziksel değerler için normal HID kurallarına göre yorumlanır. Ancak, fiziksel değerin ve birimlerin önemi yoktur. Yalnızca proje başlatma belgesine değil, ana makine değiştirilmiş bir değerdir. Hassasiyet kaybıyla ilgili sayısal sorunları önlemek için mantıksaldan fiziksel birimlere dönüştürürken, bu alanda fiziksel minimum, fiziksel maks ve birim üs değerlerini sıfır olarak ayarlayın.

Rapor yapısı

Mülklerin raporlar halinde gruplandırılması (rapor kimliklerinin atamasına göre) daha esnek hale getirebilirsiniz. Verimlilik için salt okunur özellikleri ayırmanızı öneririz çıkarmanıza yardımcı olur.

Veri alanları için Özel Değer 1, 2 ve 3 alanları aynı olmalıdır belirli bir cihaz (uygulama koleksiyonu) için tek bir raporda yer alması gerekir.

Giriş raporlarını gönder

Cihaz periyodik ve eşzamansız olarak (HID INPUT mesajlarıyla) olmalıdır tüm şu koşullar karşılandığında giriş raporları gönder:

  • Güç Durumu özelliği, Tam Güç olarak ayarlanır.
  • Raporlama Durumu özelliği, Tüm Etkinlikler olarak ayarlanır.
  • Raporlama Aralığı özelliği sıfır dışında bir değerdir.

Raporlama Aralığı özelliği, raporların ne sıklıkta gönderileceğini belirler. Zaman yukarıdaki koşullardan hiçbiri karşılanmadığında, cihazın herhangi bir rapor göndermemesi gerekir.

İleri ve geri uyumluluk

Ana izleyici HID protokolü, bir ana makine ile cihaz kullanan bir cihaz arasında birlikte çalışabilirlik sağlar. farklı sürümleri olabilir. Protokol sürümleri tanımlanmış küçük ve büyük olmak üzere iki sayıya göre gösterilir; bu iki sayı, aşağıdaki bölümlerde açıklanmıştır.

Cihazın desteklediği sürümler, Sensör Açıklaması (0x0308) özelliğini kullanın.

Alt sürüm uyumluluğu

Alt sürümdeki değişiklikler, önceki küçük sürümlerle geriye dönük uyumludur başka sürümler de olabilir. Küçüklere yönelik güncellemeler sürümünü içeriyorsa, ana makine ek veri alanlarını ve özelliklerini yoksayar. Örneğin, Protokol sürümü 1.6 kullanan bir cihazın, aşağıdakini destekleyen bir ana makineyle uyumlu olması: protokol sürümü 1.x (1.5 sürümü dahil).

Ana sürüm uyumluluğu

Ana sürümlerde yapılan değişikliklerde geriye dönük uyumlu olmayan değişikliklere izin verilir. Alıcı: Eski ve yeni barındırıcılarla birlikte çalışabilmek için birden çok ana sürümü destekler, cihazlar, raporlarında birden fazla uygulama koleksiyonu belirtebilir tanımlar. Örnek:

const unsigned char ReportDescriptor[] = {
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_TYPE_OTHER_CUSTOM,

    HID_COLLECTION(HID_APPLICATION),
        // Feature report 2 (read-only).
        HID_REPORT_ID(2),

        // Magic value: "#AndroidHeadTracker#1.5"
        HID_USAGE_SENSOR_PROPERTY_SENSOR_DESCRIPTION,
        HID_LOGICAL_MIN_8(0),
        HID_LOGICAL_MAX_8(0xFF),
        HID_REPORT_SIZE(8),
        HID_REPORT_COUNT(23),
        HID_FEATURE(HID_CONST_VAR_ABS),

      ...

    HID_END_COLLECTION,

    HID_COLLECTION(HID_APPLICATION),
        // Feature report 12 (read-only).
        HID_REPORT_ID(12),

        // Magic value: "#AndroidHeadTracker#2.4"
        HID_USAGE_SENSOR_PROPERTY_SENSOR_DESCRIPTION,
        HID_LOGICAL_MIN_8(0),
        HID_LOGICAL_MAX_8(0xFF),
        HID_REPORT_SIZE(8),
        HID_REPORT_COUNT(23),
        HID_FEATURE(HID_CONST_VAR_ABS),

      ...

    HID_END_COLLECTION,
};

Bu durumda ana makine, farklı tüm uygulama koleksiyonlarını numaralandırabilir. cihaz tarafından reklamı yapılan sensörlerin Sensör Açıklaması özelliğini her birinin uyguladığı protokol sürümlerini belirler ve ardından ana makinenin desteklediği en son protokol sürümüne sahip olmalıdır. Seçildiğinde, düzenleyen kullanıcı çalışır. (cihazın kullanım ömrü boyunca seçilen tek protokolle) bağlantı.

Ek: HID tanımlayıcısı örneği

Aşağıdaki örnekte tipik bir geçerli HID tanımlayıcısı gösterilmektedir. Şunu kullanır: kullanılan C makroları, HID Sensör Kullanımları (bölüm 4.1).

const unsigned char ReportDescriptor[] = {
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_TYPE_OTHER_CUSTOM,
    HID_COLLECTION(HID_APPLICATION),
        // Feature report 2 (read-only).
        HID_REPORT_ID(2),

        // Magic value: "#AndroidHeadTracker#1.0"
        HID_USAGE_SENSOR_PROPERTY_SENSOR_DESCRIPTION,
        HID_LOGICAL_MIN_8(0),
        HID_LOGICAL_MAX_8(0xFF),
        HID_REPORT_SIZE(8),
        HID_REPORT_COUNT(23),
        HID_FEATURE(HID_CONST_VAR_ABS),

        // UUID.
        HID_USAGE_SENSOR_PROPERTY_PERSISTENT_UNIQUE_ID,
        HID_LOGICAL_MIN_8(0),
        HID_LOGICAL_MAX_8(0xFF),
        HID_REPORT_SIZE(8),
        HID_REPORT_COUNT(16),
        HID_FEATURE(HID_CONST_VAR_ABS),

        // Feature report 1 (read/write).
        HID_REPORT_ID(1),

        // 1-bit on/off reporting state.
        HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
        HID_LOGICAL_MIN_8(0),
        HID_LOGICAL_MAX_8(1),
        HID_REPORT_SIZE(1),
        HID_REPORT_COUNT(1),
        HID_COLLECTION(HID_LOGICAL),
            HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS,
            HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS,
            HID_FEATURE(HID_DATA_ARR_ABS),
        HID_END_COLLECTION,

        // 1-bit on/off power state.
        HID_USAGE_SENSOR_PROPERTY_POWER_STATE,
        HID_LOGICAL_MIN_8(0),
        HID_LOGICAL_MAX_8(1),
        HID_REPORT_SIZE(1),
        HID_REPORT_COUNT(1),
        HID_COLLECTION(HID_LOGICAL),
            HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D4_POWER_OFF,
            HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D0_FULL_POWER,
            HID_FEATURE(HID_DATA_ARR_ABS),
        HID_END_COLLECTION,

        // 6-bit reporting interval, with values [0x00..0x3F] corresponding to [10ms..100ms].
        HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
        HID_LOGICAL_MIN_8(0x00),
        HID_LOGICAL_MAX_8(0x3F),
        HID_PHYSICAL_MIN_8(10),
        HID_PHYSICAL_MAX_8(100),
        HID_REPORT_SIZE(6),
        HID_REPORT_COUNT(1),
        HID_USAGE_SENSOR_UNITS_SECOND,
        HID_UNIT_EXPONENT(0xD),  // 10^-3
        HID_FEATURE(HID_DATA_VAR_ABS),

        // Input report 1

        // Orientation as rotation vector (scaled to [-pi..pi] rad).
        HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_1,
        HID_LOGICAL_MIN_16(0x01, 0x80), // LOGICAL_MINIMUM (-32767)
        HID_LOGICAL_MAX_16(0xFF, 0x7F), // LOGICAL_MAXIMUM (32767)
        HID_PHYSICAL_MIN_32(0x60, 0x4F, 0x46, 0xED),  // -314159265
        HID_PHYSICAL_MAX_32(0xA1, 0xB0, 0xB9, 0x12),  // 314159265
        HID_UNIT_EXPONENT(0x08),  // 10^-8
        HID_REPORT_SIZE(16),
        HID_REPORT_COUNT(3),
        HID_INPUT(HID_DATA_VAR_ABS),

        // Angular velocity as rotation vector (scaled to [-32..32] rad/sec).
        HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_2,
        HID_LOGICAL_MIN_16(0x01, 0x80), // LOGICAL_MINIMUM (-32767)
        HID_LOGICAL_MAX_16(0xFF, 0x7F), // LOGICAL_MAXIMUM (32767)
        HID_PHYSICAL_MIN_8(0xE0),
        HID_PHYSICAL_MAX_8(0x20),
        HID_UNIT_EXPONENT(0x00),  // 10^0
        HID_REPORT_SIZE(16),
        HID_REPORT_COUNT(3),
        HID_INPUT(HID_DATA_VAR_ABS),

        // Reference frame reset counter.
        HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_3,
        HID_LOGICAL_MIN_16(0x00, 0x00), // LOGICAL_MINIMUM (0)
        HID_LOGICAL_MAX_16(0xFF, 0x00), // LOGICAL_MAXIMUM (255)
        HID_PHYSICAL_MIN_8(0x00),
        HID_PHYSICAL_MAX_8(0x00),
        HID_UNIT_EXPONENT(0x00),  // 10^0
        HID_REPORT_SIZE(8),
        HID_REPORT_COUNT(1),
        HID_INPUT(HID_DATA_VAR_ABS),

    HID_END_COLLECTION,
};

Ek 2: v2.0 HID tanımlayıcısı örneği

Aşağıdaki örnekte, desteklenen bir cihaz için v2.0 HID tanımlayıcısı gösterilmektedir yalnızca Bluetooth LE ACL aktarımını destekler.

const unsigned char ReportDescriptor[] = {
    HID_USAGE_PAGE_SENSOR,
    HID_USAGE_SENSOR_TYPE_OTHER_CUSTOM,
    HID_COLLECTION(HID_APPLICATION),
        // Feature report 2 (read-only).
        HID_REPORT_ID(2),

        // Magic value: "#AndroidHeadTracker#2.0#1"
        HID_USAGE_SENSOR_PROPERTY_SENSOR_DESCRIPTION,
        HID_LOGICAL_MIN_8(0),
        HID_LOGICAL_MAX_8(0xFF),
        HID_REPORT_SIZE(8),
        HID_REPORT_COUNT(25),
        HID_FEATURE(HID_CONST_VAR_ABS),

        // UUID.
        HID_USAGE_SENSOR_PROPERTY_PERSISTENT_UNIQUE_ID,
        HID_LOGICAL_MIN_8(0),
        HID_LOGICAL_MAX_8(0xFF),
        HID_REPORT_SIZE(8),
        HID_REPORT_COUNT(16),
        HID_FEATURE(HID_CONST_VAR_ABS),

        // Feature report 1 (read/write).
        HID_REPORT_ID(1),

        // 1-bit on/off reporting state.
        HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE,
        HID_LOGICAL_MIN_8(0),
        HID_LOGICAL_MAX_8(1),
        HID_REPORT_SIZE(1),
        HID_REPORT_COUNT(1),
        HID_COLLECTION(HID_LOGICAL),
            HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_NO_EVENTS,
            HID_USAGE_SENSOR_PROPERTY_REPORTING_STATE_ALL_EVENTS,
            HID_FEATURE(HID_DATA_ARR_ABS),
        HID_END_COLLECTION,

        // 1-bit on/off power state.
        HID_USAGE_SENSOR_PROPERTY_POWER_STATE,
        HID_LOGICAL_MIN_8(0),
        HID_LOGICAL_MAX_8(1),
        HID_REPORT_SIZE(1),
        HID_REPORT_COUNT(1),
        HID_COLLECTION(HID_LOGICAL),
            HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D4_POWER_OFF,
            HID_USAGE_SENSOR_PROPERTY_POWER_STATE_D0_FULL_POWER,
            HID_FEATURE(HID_DATA_ARR_ABS),
        HID_END_COLLECTION,

        // 6-bit reporting interval, with values [0x00..0x3F] corresponding to [10ms..100ms].
        HID_USAGE_SENSOR_PROPERTY_REPORT_INTERVAL,
        HID_LOGICAL_MIN_8(0x00),
        HID_LOGICAL_MAX_8(0x3F),
        HID_PHYSICAL_MIN_8(10),
        HID_PHYSICAL_MAX_8(100),
        HID_REPORT_SIZE(6),
        HID_REPORT_COUNT(1),
        HID_USAGE_SENSOR_UNITS_SECOND,
        HID_UNIT_EXPONENT(0xD),  // 10^-3
        HID_FEATURE(HID_DATA_VAR_ABS),

        // 1-bit transport selection
        HID_USAGE_SENSOR_PROPERTY_VENDOR_LE_TRANSPORT,
        HID_LOGICAL_MIN_8(0),
        HID_LOGICAL_MAX_8(1),
        HID_REPORT_SIZE(1),
        HID_REPORT_COUNT(1),
        HID_COLLECTION(HID_LOGICAL),
            HID_USAGE_SENSOR_PROPERTY_VENDOR_LE_TRANSPORT_ACL,
            HID_USAGE_SENSOR_PROPERTY_VENDOR_LE_TRANSPORT_ISO,
            HID_FEATURE(HID_DATA_ARR_ABS),
        HID_END_COLLECTION,

        // Input report 1

        // Orientation as rotation vector (scaled to [-pi..pi] rad).
        HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_1,
        HID_LOGICAL_MIN_16(0x01, 0x80), // LOGICAL_MINIMUM (-32767)
        HID_LOGICAL_MAX_16(0xFF, 0x7F), // LOGICAL_MAXIMUM (32767)
        HID_PHYSICAL_MIN_32(0x60, 0x4F, 0x46, 0xED),  // -314159265
        HID_PHYSICAL_MAX_32(0xA1, 0xB0, 0xB9, 0x12),  // 314159265
        HID_UNIT_EXPONENT(0x08),  // 10^-8
        HID_REPORT_SIZE(16),
        HID_REPORT_COUNT(3),
        HID_INPUT(HID_DATA_VAR_ABS),

        // Angular velocity as rotation vector (scaled to [-32..32] rad/sec).
        HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_2,
        HID_LOGICAL_MIN_16(0x01, 0x80), // LOGICAL_MINIMUM (-32767)
        HID_LOGICAL_MAX_16(0xFF, 0x7F), // LOGICAL_MAXIMUM (32767)
        HID_PHYSICAL_MIN_8(0xE0),
        HID_PHYSICAL_MAX_8(0x20),
        HID_UNIT_EXPONENT(0x00),  // 10^0
        HID_REPORT_SIZE(16),
        HID_REPORT_COUNT(3),
        HID_INPUT(HID_DATA_VAR_ABS),

        // Reference frame reset counter.
        HID_USAGE_SENSOR_DATA_CUSTOM_VALUE_3,
        HID_LOGICAL_MIN_16(0x00, 0x00), // LOGICAL_MINIMUM (0)
        HID_LOGICAL_MAX_16(0xFF, 0x00), // LOGICAL_MAXIMUM (255)
        HID_PHYSICAL_MIN_8(0x00),
        HID_PHYSICAL_MAX_8(0x00),
        HID_UNIT_EXPONENT(0x00),  // 10^0
        HID_REPORT_SIZE(8),
        HID_REPORT_COUNT(1),
        HID_INPUT(HID_DATA_VAR_ABS),

    HID_END_COLLECTION,
};