Android 13 ve sonraki sürümlerin yüklü olduğu cihazlarda kullanılabilen başlık izleyici insan arayüz cihazı (HID) protokolü, başlık izleme cihazının USB veya Bluetooth aracılığıyla Android cihaza bağlanmasına ve sensörler çerçevesi üzerinden Android çerçevesine ve uygulamalarına sunulmasına olanak tanır. Bu protokol, ses sanallaştırma efektini (3D ses) kontrol etmek için kullanılır. Bu sayfada cihaz ve ana makine terimleri, Bluetooth anlamında kullanılmaktadır. Cihaz, baş takibi cihazı, ana makine ise Android ana makinesi anlamına gelir.
Cihaz üreticileri, Android cihazlarını başlık izleyici HID protokolü desteğini etkinleştirecek şekilde yapılandırmalıdır. Yapılandırma hakkında daha ayrıntılı bilgi için Dynamic Sensors README dosyasını inceleyin.
Bu sayfada, aşağıdaki kaynaklar hakkında bilgi sahibi olduğunuz varsayılır:
Üst düzey yapı
Android çerçevesi, baş takip cihazını HID cihazı olarak tanımlar.
Geçerli bir HID tanımlayıcısının tam örneği için Ek 1: HID Tanımlayıcısı Örneği bölümüne bakın.
En üst düzeyde, başlık izleyici cihaz, Sensors
sayfası (0x20
) ve Other: Custom
kullanımı (0xE1
) olan bir uygulama koleksiyonudur. Bu koleksiyonun içinde çeşitli veri alanları (girişler) ve özellikler (özellikler) bulunur.
Özellikler ve veri alanları
Bu bölümde, baş takip cihazının uygulama koleksiyonundaki özellikler ve veri alanları açıklanmaktadır.
Özellik: Sensör Açıklaması (0x0308
)
Sensör Açıklaması (0x0308
) özelliği, aşağıdaki değerleri içermesi gereken salt okunur bir ASCII (8 bit) dize özelliğidir:
Baş takip cihazı sürümü 1.0:
#AndroidHeadTracker#1.0
LE Audio desteği içeren başlık izleyici 2.0 sürümü (Android 15 veya sonraki sürümlerde kullanılabilir):
#AndroidHeadTracker#2.0#x
x
, desteklenen aktarımı belirten bir tam sayıdır (1
, 2
, 3
):
- 1: EKL
- 2: ISO
- 3: EKL + ISO
Boş sonlandırıcı beklenmez. Bu nedenle, bu özelliğin toplam boyutu 1.0 sürümü için 23 adet 8 bitlik karakterdir.
Bu özellik, diğer özel sensörlerle çakışmaları önlemek için ayırt edici olarak kullanılır.
Özellik: Kalıcı Benzersiz Kimlik (0x0302
)
Kalıcı benzersiz kimlik (0x0302
) özelliği, her biri 8 bit olan 16 öğeden oluşan salt okunur bir dizidir (toplam 128 bit). Boş sonlandırıcı beklenmez. Bu özellik isteğe bağlıdır.
Bu özellik, ses cihazlarına entegre edilmiş kafa izleme cihazlarının, bağlı oldukları ses cihazına referans vermesine olanak tanır. Aşağıdaki şemalar desteklenir.
Bağımsız başlık izleyici
Kalıcı Benzersiz Kimlik (0x0302
) özelliği yoksa veya tüm sıfırlar olarak ayarlanmışsa başlık izleme cihazının kalıcı olarak bir ses cihazına bağlı olmadığı ve ayrı olarak kullanılabileceği (ör. kullanıcının başlık izleme cihazını ayrı bir ses cihazıyla manuel olarak ilişkilendirmesine izin vererek) anlamına gelir.
Bluetooth MAC adresini kullanarak referans verme
Sekizlik | 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 sekizli 0
olmalı, 8. ve 9. sekizli sırasıyla B
ve T
ASCII değerlerini içermeli ve sonraki 6 sekizli, kafa hareketi izleme cihazının bu MAC adresine sahip herhangi bir ses cihazı için geçerli olduğu varsayılarak Bluetooth MAC adresi olarak yorumlanmalıdır. Cihaz bağlantı oluşturmak için rastgele bir MAC adresi kullansa bile bu adres, kimlik adresi olmalıdır. Bluetooth Classic (v1.0 HID biçimi) ve Bluetooth LE (v2.0 HID biçimi) üzerinden bağlanan çift modlu cihazlar, aynı kimlik adresine sahip iki HID tanımlayıcısı göstermelidir. Ayrılmış sol ve sağ cihazlara sahip çift modlu cihazlar, yalnızca LE olan ikincil cihaz yerine birincil çift modlu cihazı kullanarak Bluetooth LE HID'yi kullanıma sunmalıdır.
UUID kullanarak referans oluşturma
8. sekizlinin en anlamlı biti (MSB) ayarlandığında (≥0x80
), alan RFC-4122'de belirtildiği gibi UUID olarak yorumlanır. İlgili ses cihazı, kullanılan aktarım türüne özgü belirtilmemiş bir mekanizma aracılığıyla Android çerçevesine kaydedilen aynı UUID'yi sağlar.
Tesis: Raporlama durumu (0x0316
)
Raporlama durumu (0x0316
) özelliği, HID spesifikasyonunda tanımlandığı gibi standart semantiğe sahip bir okuma/yazma özelliğidir. Ana makine, hangi etkinliklerin cihaza raporlanacağını belirtmek için bu özelliği kullanır. Yalnızca Etkinlik Yok (0x0840
) ve Tüm Etkinlikler (0x0841
) değerleri kullanılır.
Bu alanın ilk değeri "No Events" (Etkinlik Yok) olmalı ve yalnızca ana makine tarafından değiştirilmelidir. Cihaz tarafından hiçbir zaman değiştirilmemelidir.
Özellik: Güç Durumu (0x0319
)
Güç durumu (0x0319
) özelliği, HID spesifikasyonunda tanımlandığı gibi standart semantiğe sahip bir okuma/yazma özelliğidir. Ana makine, cihazın hangi güç durumunda olması gerektiğini belirtmek için bu özelliği kullanır. Yalnızca Full Power (Tam Güç) (0x0851
) ve Power Off (Gücü Kapat) (0x0855
) değerleri kullanılır.
Bu alanın başlangıç değeri cihaz tarafından belirlenir ve hiçbir zaman cihaz tarafından değiştirilmemeli, yalnızca ana makine tarafından değiştirilmelidir.
Tesis: Rapor Aralığı (0x030E
)
Rapor Aralığı (0x030E
) özelliği, HID spesifikasyonunda tanımlandığı gibi standart semantiğe sahip bir okuma/yazma özelliğidir. Ana makine, bu özelliği kullanarak cihaza veri okumalarını ne sıklıkta bildireceğini belirtir.
Birimler saniyedir. Bu değerin geçerli aralığı cihaz tarafından belirlenir ve fiziksel minimum/maksimum mekanizması kullanılarak açıklanır. En az 50 Hz raporlama hızı desteklenmelidir ve önerilen maksimum raporlama hızı 100 Hz'dir. Bu nedenle, minimum rapor aralığı 20 ms'den küçük veya bu değere eşit olmalı ve 10 ms'den büyük veya bu değere eşit olması önerilir.
Mülk: Satıcıya ayrılmış LE Taşıma (0xF410
)
Tedarikçiye ayrılmış LE Transport (0xF410
) özelliği, HID spesifikasyonunda tanımlandığı gibi standart anlambilime sahip bir okuma/yazma özelliğidir. Ana makine, seçilen aktarımı (ACL veya ISO) belirtmek için bu özelliği kullanır. Yalnızca EKL (0xF800
) ve ISO (0xF801
) değerleri kullanılır ve her ikisi de mantıksal koleksiyona dahil edilmelidir.
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 kafa izleme bilgilerini raporlamak için kullanılan bir giriş alanıdır. HID spesifikasyonunun 6.2.2.7 bölümünde belirtildiği gibi, fiziksel değerlerle ilgili normal HID kurallarına göre yorumlanan 3 öğeli bir dizidir. Her öğe için geçerli aralık [-π, π] rad'dır. Birimler
her zaman radyan cinsindendir.
Öğeler şu şekilde yorumlanır: [rx, ry, rz]
. Burada [rx, ry, rz]
, referans çerçevesinden baş çerçevesine dönüşümü temsil eden bir dönüş vektörüdür.
Büyüklük [0..π] aralığında olmalıdır.
Referans çerçevesi rastgeledir ancak genellikle sabittir ve sağ el kuralına uygun olmalıdır. Az miktarda kayma kabul edilebilir. Baş eksenleri şunlardır:
- Sol kulaktan sağa X
- Y: Başın arkasından buruna (arkadan öne)
- Boyundan kafanın üst kısmına kadar olan Z
Veri alanı: Özel Değer 2 (0x0545
)
Özel değer 2 (0x0545
) alanı, gerçek kafa izleme bilgilerini raporlamak için kullanılan bir giriş alanıdır. Fiziksel değerler için normal HID kurallarına göre yorumlanan 3 öğeli sabit nokta dizisidir.
Birimler her zaman radyan/saniye cinsindendir.
Öğeler şu şekilde yorumlanır: [vx, vy, vz]
. Burada [vx, vy, vz]
, başlığın açısal hızını (kendisine göre) temsil eden bir dönüş vektörüdür.
Veri alanı: Özel Değer 3 (0x0546
)
Özel Değer 3 (0x0546
) alanı, referans çerçevesindeki süreksizlikleri izlemek için kullanılan bir giriş alanıdır. Boyutu 8 bit olan bir skaler tam sayıdır. Referans çerçevesi her değiştiğinde (ör. yönü belirlemek için kullanılan bir yönlendirme filtresi algoritmasının durumu sıfırlandığında) cihaz tarafından artırılmalıdır (sarma ile). Bu değer, fiziksel değerlerle ilgili normal HID kurallarına göre yorumlanır. Ancak, fiziksel değer ve birimler önemli değildir. Ana makineyle ilgili tek bilgi, değiştirilen bir değerdir. Mantıksal birimlerden fiziksel birimlere dönüştürme sırasında hassasiyet kaybıyla ilgili sayısal sorunları önlemek için bu alanın fiziksel minimum, fiziksel maksimum ve birim üssü değerlerini sıfır olarak ayarlamanız önerilir.
Rapor yapısı
Mülklerin raporlar halinde gruplandırılması (rapor kimliklerinin atanmasıyla) esnektir. Verimlilik için salt okunur özelliklerin okuma/yazma özelliklerinden ayrılmasını öneririz.
Veri alanları için Özel Değer 1, 2 ve 3 alanları aynı raporda olmalı ve belirli bir cihaz (uygulama koleksiyonu) için yalnızca bir raporda yer almalıdır.
Giriş raporları gönderme
Cihaz, aşağıdaki koşulların tümü karşılandığında giriş raporlarını düzenli olarak ve eşzamansız olarak (HID INPUT mesajları aracılığıyla) göndermelidir:
- Güç Durumu özelliği Tam Güç olarak ayarlanmış olmalıdır.
- Raporlama durumu özelliği Tüm Etkinlikler olarak ayarlanır.
- Raporlama aralığı özelliği sıfır değildir.
Raporlama Aralığı özelliği, raporların ne sıklıkta gönderileceğini belirler. Yukarıdaki koşullardan herhangi biri karşılanmadığında cihaz rapor göndermemelidir.
İleri ve geriye dönük uyumluluk
Başlık izleyici HID protokolü, protokolün farklı sürümlerini kullanan bir ana makine ile cihaz arasında birlikte çalışabilirliğe izin verirken güncellemelere de olanak tanıyan bir sürüm oluşturma şeması kullanır. Protokolün sürümleri, aşağıdaki bölümlerde açıklandığı gibi farklı semantiklere sahip olan iki sayıyla (ana ve alt) tanımlanır.
Bir cihazın desteklediği sürümler, cihazın Sensor Description (Sensör Açıklaması) (0x0308
) özelliği incelenerek belirlenebilir.
Alt sürüm uyumluluğu
Alt sürümde yapılan değişiklikler, aynı ana sürüme dayalı önceki alt sürümlerle geriye dönük olarak uyumludur. Küçük sürüm güncellemelerinde, ana makine ek veri alanlarını ve özellikleri yoksayar. Örneğin, 1.6 protokol sürümünü kullanan bir cihaz, 1.5 sürümü de dahil olmak üzere 1.x protokol sürümünü destekleyen bir ana makineyle uyumludur.
Ana sürüm uyumluluğu
Ana sürümlerde yapılan değişikliklerde eski sürümlerle uyumlu olmayan değişikliklere izin verilir. Eski ve yeni ana makinelerle birlikte çalışabilirlik için birden fazla ana sürümü desteklemek üzere cihazlar, rapor tanımlayıcılarında birden fazla uygulama koleksiyonu belirtebilir. Örneğin:
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, cihaz tarafından tanıtılan tüm farklı uygulama koleksiyonlarını numaralandırabilir, her birinin uyguladığı protokol sürümlerini belirlemek için Sensor Description özelliğini inceleyebilir ve ardından ana makinenin desteklediği en son protokol sürümünü seçebilir. Seçildiğinde, ana makine cihaz bağlantısının ömrü boyunca seçilen tek protokolle çalışır.
Ek: HID tanımlayıcı örneği
Aşağıdaki örnekte tipik bir geçerli HID tanımlayıcısı gösterilmektedir. Bu işlev, HID Sensor Usages (HID Sensör Kullanımları) bölümünde (4.1) sağlanan, yaygın olarak kullanılan C makrolarını kullanır.
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ı örneği
Aşağıdaki örnekte, yalnızca Bluetooth LE ACL aktarımını destekleyen bir cihaz için v2.0 HID tanımlayıcısı gösterilmektedir.
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,
};