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,
};