हेड ट्रैकर ह्यूमन इंटरफ़ेस डिवाइस (एचआईडी) प्रोटोकॉल, डिवाइसों के लिए उपलब्ध है जिनमें Android 13 और इसके बाद वाला वर्शन हो, तो आपको हेड-ट्रैकिंग डिवाइस को यूएसबी के ज़रिए Android डिवाइस से कनेक्ट किया जाता है या को अनुमति देगा और Android फ़्रेमवर्क और ऐप्लिकेशन को सेंसर फ़्रेमवर्क का इस्तेमाल करें. इस प्रोटोकॉल का इस्तेमाल इसके लिए किया जाता है कंट्रोल कर रही हूँ ऑडियो वर्चुअलाइज़र इफ़ेक्ट (3D ऑडियो). यह पेज device शब्दों का इस्तेमाल करता है और होस्ट होता है, जहां device का मतलब हेड-ट्रैकिंग डिवाइस होता है. और होस्ट का मतलब Android होस्ट है.
डिवाइस बनाने वाली कंपनियों को अपने Android डिवाइस कॉन्फ़िगर करने होंगे, ताकि वे हेड ट्रैकर एचआईडी प्रोटोकॉल में बदलाव कर सकते हैं. इसके बारे में ज़्यादा जानकारी पाने के लिए, कॉन्फ़िगरेशन के लिए, डाइनैमिक सेंसर README.
यह पेज इन संसाधनों के बारे में जानकारी रखता है:
- एचआईडी के लिए डिवाइस की कैटगरी की परिभाषा
- यूएसबी के लिए एचआईडी के इस्तेमाल की टेबल
- एचआईडी सेंसर के इस्तेमाल
टॉप लेवल स्ट्रक्चर
Android फ़्रेमवर्क, हेड ट्रैकर डिवाइस की पहचान एचआईडी डिवाइस के तौर पर करता है.
मान्य एचआईडी डिस्क्रिप्टर का पूरा उदाहरण देखने के लिए, यहां देखें अपेंडिक्स 1: एचआईडी की जानकारी देने वाले का उदाहरण.
टॉप लेवल पर, हेड ट्रैकर डिवाइस एक ऐप्लिकेशन कलेक्शन है. इसमें
Sensors
पेज (0x20
) और Other: Custom
का इस्तेमाल (0xE1
). इसके अंदर
कलेक्शन में कई डेटा फ़ील्ड (इनपुट) और प्रॉपर्टी (सुविधाएं) शामिल होती हैं.
प्रॉपर्टी और डेटा फ़ील्ड
यह सेक्शन किसी ऐप्लिकेशन की प्रॉपर्टी और डेटा फ़ील्ड के बारे में बताता है एक हेड ट्रैकर डिवाइस का संग्रह है.
प्रॉपर्टी: सेंसर की जानकारी (0x0308
)
सेंसर की जानकारी (0x0308
) प्रॉपर्टी सिर्फ़ पढ़ने के लिए ASCII (8-बिट) स्ट्रिंग है
प्रॉपर्टी जिसमें नीचे दिए गए मान होने चाहिए:
हेड ट्रैकर का वर्शन 1.0:
#AndroidHeadTracker#1.0
हेड ट्रैकर का वर्शन 2.0 (Android 15 या ज़्यादा है). इसमें LE Audio के साथ काम करने की सुविधा शामिल है:
#AndroidHeadTracker#2.0#x
x
एक पूर्णांक (1
, 2
, 3
) है, जो सपोर्ट ट्रांसपोर्ट को दिखाता है:
- 1: एसीएल
- 2: आईएसओ
- 3: एसीएल + आईएसओ
शून्य-टर्मिनेटर की ज़रूरत नहीं है. इसका मतलब है कि इस प्रॉपर्टी का कुल साइज़ वर्शन 1.0 के लिए 23 8-बिट वर्ण हैं.
यह प्रॉपर्टी, प्रॉपर्टी को आपस में मैच करने में मदद करती है, ताकि एक-दूसरे के साथ टकराव से बचा जा सके कस्टम सेंसर इस्तेमाल करते हैं.
प्रॉपर्टी: स्थायी यूनीक आईडी (0x0302
)
परसिस्टेंट यूनीक आईडी (0x0302
) प्रॉपर्टी, 16 का रीड-ओनली कलेक्शन होती है
एलिमेंट, हर एक के लिए 8 बिट (कुल 128 बिट). शून्य टर्मिनेटर की ज़रूरत नहीं है. यह
प्रॉपर्टी ज़रूरी नहीं है.
यह प्रॉपर्टी, ऑडियो में इंटिग्रेट किए गए हेड-ट्रैकिंग डिवाइसों को इस्तेमाल करने की अनुमति देती है ताकि वे अटैच किए गए ऑडियो डिवाइस का रेफ़रंस ले सकें. इन स्कीम का इस्तेमाल किया जा सकता है.
स्टैंडअलोन हेड ट्रैकर
अगर स्थायी यूनीक आईडी (0x0302
) प्रॉपर्टी मौजूद नहीं है या 'सभी' पर सेट है
शून्य का इस्तेमाल करता है, तो इसका मतलब है कि हेड ट्रैकर डिवाइस
और अलग से इस्तेमाल किया जा सकता है, उदाहरण के लिए, उपयोगकर्ता को
हेड ट्रैकर डिवाइस को मैन्युअल तरीके से किसी अलग ऑडियो डिवाइस से जोड़ें.
ब्लूटूथ MAC पते का इस्तेमाल करके रेफ़रंस बनाना
ऑक्टेट | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
वैल्यू | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | B | T | ब्लूटूथ MAC |
इस स्कीम में, पहले 8 ऑक्टेट 0
होने चाहिए, जबकि 8 और 9 ऑक्टेट में होने चाहिए
ASCII की वैल्यू B
और T
है. साथ ही, नीचे दिए गए छह ऑक्टेट हैं
इसे हेड ट्रैकर डिवाइस को मानते हुए ब्लूटूथ मैक पता माना जाता है
इस MAC पते वाले सभी ऑडियो डिवाइस पर लागू होती है. यह पता
पहचान पता, भले ही डिवाइस किसी भी MAC पते का इस्तेमाल करके पुष्टि कर सके
कनेक्शन. ब्लूटूथ क्लासिक पर कनेक्ट होने वाले ड्यूअल-मोड डिवाइस
(v1.0 एचआईडी फ़ॉर्मैट) और ब्लूटूथ LE (v2.0 एचआईडी फ़ॉर्मैट) में दो एचआईडी दिखने चाहिए
एक जैसे पहचान पते वाले डिस्क्रिप्टर. अलग-अलग मोड वाले ड्यूअल-मोड डिवाइस
बाएं और दाएं डिवाइसों को प्राइमरी ड्यूअल का इस्तेमाल करके ब्लूटूथ LE HID को दिखाना चाहिए
LE-ओनली सेकंडरी डिवाइस के बजाय मोड डिवाइस.
UUID का इस्तेमाल करके पहचान फ़ाइल
जब भी ऑक्टेट 8 का सबसे अहम बिट (MSB) सेट (≥0x80
) हो, तो फ़ील्ड
को UUID के रूप में समझा जाता है, जैसा कि
आरएफ़सी-4122. कॉन्टेंट बनाने
संबंधित ऑडियो डिवाइस वही UUID देता है जो
Android फ़्रेमवर्क, एक ऐसे अनिर्दिष्ट तरीके के ज़रिए बनाया गया है, जो
परिवहन का इस्तेमाल किया गया.
प्रॉपर्टी: रिपोर्टिंग की स्थिति (0x0316
)
रिपोर्टिंग स्टेट (0x0316
) प्रॉपर्टी ऐसी रीड/राइट प्रॉपर्टी है जिसमें
जैसा कि एचआईडी स्पेसिफ़िकेशन में बताया गया है. होस्ट इसका इस्तेमाल करता है
प्रॉपर्टी का इस्तेमाल करें, ताकि डिवाइस को यह बताया जा सके कि कौनसे इवेंट रिपोर्ट करने हैं. सिर्फ़ 'नहीं' वाली वैल्यू
इवेंट (0x0840
) और सभी इवेंट (0x0841
) का इस्तेमाल किया जाता है.
इस फ़ील्ड की शुरुआती वैल्यू कोई इवेंट नहीं होनी चाहिए और इसे कभी भी नहीं होना चाहिए डिवाइस से बदला जा सकता है, सिर्फ़ होस्ट ने.
प्रॉपर्टी: पावर स्टेट (0x0319
)
पावर स्टेट (0x0319
) प्रॉपर्टी ऐसी रीड/राइट प्रॉपर्टी है जिसमें
जैसा कि एचआईडी स्पेसिफ़िकेशन में बताया गया है. होस्ट इसका इस्तेमाल करता है
प्रॉपर्टी का इस्तेमाल करके डिवाइस को यह बताया जाता है कि उसकी पावर की स्थिति कैसी होनी चाहिए. सिर्फ़
वैल्यू, पूरी पावर (0x0851
) और बंद करें (0x0855
) का इस्तेमाल किया जाता है.
इस फ़ील्ड के लिए शुरुआती वैल्यू डिवाइस तय करती है. इसे कभी भी नहीं होना चाहिए डिवाइस से बदला जा सकता है, सिर्फ़ होस्ट ने.
प्रॉपर्टी: रिपोर्ट इंटरवल (0x030E
)
रिपोर्ट इंटरवल (0x030E
) प्रॉपर्टी ऐसी रीड/राइट प्रॉपर्टी है जिसमें
जैसा कि एचआईडी स्पेसिफ़िकेशन में बताया गया है. होस्ट इसका इस्तेमाल करता है
प्रॉपर्टी का इस्तेमाल करें, ताकि डिवाइस को यह बताया जा सके कि उसकी डेटा रीडिंग को कितनी बार रिपोर्ट करना है.
इकाइयां सेकंड होती हैं. इस वैल्यू के लिए मान्य रेंज, डिवाइस के हिसाब से तय की जाती है
और कम से कम/ज़्यादा से ज़्यादा फ़िज़िकल तरीके का इस्तेमाल करके बताए गए हैं. कम से कम 50 हर्ट्ज़
रिपोर्टिंग दर का इस्तेमाल किया जाना चाहिए. साथ ही, सुझाई गई ज़्यादा से ज़्यादा रिपोर्टिंग दर है
100 हर्ट्ज़. इसलिए, रिपोर्ट के कम से कम इंटरवल का समय, इससे कम या इसके बराबर होना चाहिए
20 मि॰से॰ तक. साथ ही, 10 मि॰से॰ से ज़्यादा या इसके बराबर होना चाहिए.
प्रॉपर्टी: वेंडर-रिज़र्व्ड LE ट्रांसपोर्ट (0xF410
)
वेंडर के तौर पर रिज़र्व की गई LE Transport (0xF410
) प्रॉपर्टी, पढ़ने/लिखने के लिए प्रॉपर्टी है
जिसमें एचआईडी स्पेसिफ़िकेशन के मुताबिक स्टैंडर्ड सिमेंटिक्स हों. होस्ट
इस प्रॉपर्टी का इस्तेमाल, चुने गए ट्रांसपोर्ट (ACL या ISO) को दिखाने के लिए करता है. सिर्फ़
ACL (0xF800
) और ISO (0xF801
) मान का इस्तेमाल किया जाता है और ये दोनों ही शामिल होने चाहिए
लॉजिकल कलेक्शन में.
इस प्रॉपर्टी को पावर या रिपोर्टिंग की स्थितियों से पहले कॉन्फ़िगर किया जाता है.
डेटा फ़ील्ड: कस्टम वैल्यू 1 (0x0544
)
कस्टम मान 1 (0x0544
) फ़ील्ड एक इनपुट फ़ील्ड है. इसका इस्तेमाल
असल हेड-ट्रैकिंग जानकारी होती है. यह 3-एलिमेंट का एक कलेक्शन है, जिसे
के सेक्शन 6.2.2.7 में बताए गए सामान्य एचआईडी नियमों के मुताबिक होना चाहिए
एचआईडी की खास बातें. हर एलिमेंट के लिए मान्य रेंज [-Device, सुनने के लिए] रेडियन है. इकाइयां
हमेशा रेडियन होते हैं.
एलिमेंट को इस तरह समझा जाता है: [rx, ry, rz]
, जैसे कि [rx, ry, rz]
एक
रोटेशन वेक्टर,
रेफ़रंस फ़्रेम से हेड फ़्रेम में बदलने का तरीका दिखाता है.
तीव्रता [0..] रेंज में होनी चाहिए.
रेफ़रंस फ़्रेम आर्बिट्रेरी है, लेकिन यह आम तौर पर पहले से तय होता है दाएं हाथ के साथ. थोड़ा-बहुत ड्रिफ़्ट स्वीकार किया जाता है. हेड ऐक्स:
- बाएं कान से दाएं तक X
- Y सिर के पीछे से नाक तक (पीछे से सामने)
- गर्दन से लेकर सिर के ऊपर तक Z
डेटा फ़ील्ड: कस्टम वैल्यू 2 (0x0545
)
कस्टम वैल्यू 2 (0x0545
) फ़ील्ड एक इनपुट फ़ील्ड है. इसका इस्तेमाल,
असल हेड-ट्रैकिंग जानकारी होती है. यह 3-एलिमेंट वाला फ़िक्स्ड-पॉइंट अरे है.
भौतिक मानों के लिए सामान्य एचआईडी नियमों के अनुसार समझा जाता है.
इकाइयां हमेशा रेडियन/सेकंड होती हैं.
एलिमेंट को इस तरह समझा जाता है: [vx, vy, vz]
, जैसे कि [vx, vy, vz]
एक
रोटेशन वेक्टर,
हेड फ़्रेम की ऐंग्युलर वेलोसिटी को दिखाते हैं.
डेटा फ़ील्ड: कस्टम वैल्यू 3 (0x0546
)
कस्टम वैल्यू 3 (0x0546
) फ़ील्ड एक इनपुट फ़ील्ड है. इसका इस्तेमाल ट्रैकिंग के लिए किया जाता है
में अंतर हो सकता है. यह 8 बिट का अदिश पूर्णांक है
साइज़. यह ज़रूरी है कि डिवाइस,
संदर्भ का फ़्रेम बदल गया हो. उदाहरण के लिए, अगर ओरिएंटेशन फ़िल्टर एल्गोरिदम बदल रहा हो
ओरिएंटेशन का पता लगाने के लिए इस्तेमाल किया जाता है, जिसकी स्थिति रीसेट कर दी गई थी. यह मान है
भौतिक मानों के लिए सामान्य एचआईडी नियमों के अनुसार समझा जाता है. हालांकि,
भौतिक मान और इकाइयों से कोई खास फ़र्क़ नहीं पड़ता. सिर्फ़ वह जानकारी जो
होस्ट एक परिवर्तित मान है. सटीक जानकारी न पाने से जुड़ी समस्याओं से बचने के लिए
लॉजिकल से फ़िज़िकल इकाइयों में बदलते समय, यह सलाह दी जाती है कि
इस फ़ील्ड के लिए भौतिक कम से कम, भौतिक अधिकतम और इकाई घातांक के मान शून्य पर सेट करें.
रिपोर्ट का स्ट्रक्चर
रिपोर्ट में प्रॉपर्टी को ग्रुप में बांटने के लिए (रिपोर्ट आईडी के असाइनमेंट के आधार पर) सुविधाजनक. हमारा सुझाव है कि बेहतर परफ़ॉर्मेंस के लिए, रीड-ओनली प्रॉपर्टी को अलग करें वैल्यू को मैन्युअल तौर पर कैलकुलेट किया जा सकता है.
डेटा फ़ील्ड के लिए, कस्टम वैल्यू 1, 2, और 3 फ़ील्ड एक जैसे होने चाहिए किसी डिवाइस (ऐप्लिकेशन कलेक्शन) के लिए, सिर्फ़ एक रिपोर्ट में होना चाहिए.
इनपुट रिपोर्ट भेजें
डिवाइस को समय-समय पर और एसिंक्रोनस रूप से (एचआईडी इनपुट मैसेज के ज़रिए) करना चाहिए ये सभी शर्तें पूरी होने पर, इनपुट रिपोर्ट भेजें:
- पावर स्टेट प्रॉपर्टी, फ़ुल पावर पर सेट है.
- रिपोर्टिंग स्टेट प्रॉपर्टी, सभी इवेंट पर सेट होती है.
- रिपोर्टिंग इंटरवल प्रॉपर्टी शून्य नहीं होती है.
रिपोर्टिंग इंटरवल प्रॉपर्टी से तय होता है कि रिपोर्ट कितनी बार भेजनी हैं. टास्क कब शुरू होगा अगर ऊपर बताई गई कोई भी शर्त पूरी नहीं होती है, तो डिवाइस को कोई रिपोर्ट नहीं भेजनी चाहिए.
आगे और पीछे के साथ काम करने की सुविधा
हेड ट्रैकर एचआईडी प्रोटोकॉल, वर्शनिंग स्कीम का इस्तेमाल करता है. इससे आपको अपडेट होते हैं. साथ ही, होस्ट और इस्तेमाल करने वाले डिवाइस के बीच इंटरऑपरेबिलिटी (दूसरे सिस्टम के साथ काम करने की सुविधा) की अनुमति देते हैं . प्रोटोकॉल के वर्शन की पहचान कर ली गई है दो संख्याओं से इन सेक्शन में बताया गया है.
किसी डिवाइस के साथ काम करने वाले वर्शन
इसकी सेंसर जानकारी (0x0308
) प्रॉपर्टी.
माइनर वर्शन के साथ काम करता है
माइनर वर्शन में किए गए बदलाव, पुराने माइनर वर्शन के साथ काम करते हैं जो एक ही मेजर वर्शन पर आधारित हैं. नाबालिग के अपडेट में वर्शन है तो होस्ट अतिरिक्त डेटा फ़ील्ड और प्रॉपर्टी को अनदेखा कर देता है. उदाहरण के लिए, प्रोटोकॉल वर्शन 1.6 का इस्तेमाल करने वाला डिवाइस, ओएस को सपोर्ट करने वाले होस्ट के साथ काम करता है प्रोटोकॉल वर्शन 1.x, जिसमें वर्शन 1.5 शामिल है.
मेजर वर्शन के साथ काम करता है
मेजर वर्शन में बदलाव करने के लिए, पुराने सिस्टम के साथ काम नहीं करने वाले बदलावों की अनुमति है. यहां की यात्रा पर हूं नए और पुराने होस्ट के साथ इंटरऑपरेबिलिटी के लिए, कई मेजर वर्शन की सुविधा देता हो. डिवाइसों की रिपोर्ट में, एक से ज़्यादा ऐप्लिकेशन के कलेक्शन तय किए जा सकते हैं डिस्क्रिप्टर शामिल करें. उदाहरण के लिए:
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,
};
इस मामले में होस्ट, ऐप्लिकेशन के सभी अलग-अलग कलेक्शन की सूची बना सकता है डिवाइस के ज़रिए विज्ञापन दिखाया जाता है. इसके लिए, सेंसर की जानकारी वाली प्रॉपर्टी की जांच की जाती है वे प्रोटोकॉल वर्शन तय करें जिन्हें वे लागू करते हैं और फिर प्रोटोकॉल का नया वर्शन, जो होस्ट पर काम करता हो. चुने जाने पर, होस्ट काम करता है अब तक के लिए चुना गया एक प्रोटोकॉल ही इस्तेमाल किया जा सकता है कनेक्शन.
अपेंडिक्स: एचआईडी डिस्क्रिप्टर का उदाहरण
इस उदाहरण में, आम तौर पर मान्य एचआईडी डिस्क्रिप्टर के बारे में बताया गया है. यह आम तौर पर इस्तेमाल किए जाने वाले C मैक्रो, जो एचआईडी सेंसर के इस्तेमाल (सेक्शन 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,
};
अपेंडिक्स 2: v2.0 एचआईडी डिस्क्रिप्टर का उदाहरण
इस उदाहरण में, ऐसे डिवाइस के लिए v2.0 एचआईडी डिस्क्रिप्टर दिखाया गया है जो इसके साथ काम करता है सिर्फ़ ब्लूटूथ LE ACL ट्रांसपोर्ट करके.
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,
};