हेड ट्रैकर एचआईडी प्रोटोकॉल

हेड ट्रैकर ह्यूमन इंटरफ़ेस डिवाइस (एचआईडी) प्रोटोकॉल, डिवाइसों के लिए उपलब्ध है जिनमें Android 13 और इसके बाद वाला वर्शन हो, तो आपको हेड-ट्रैकिंग डिवाइस को यूएसबी के ज़रिए Android डिवाइस से कनेक्ट किया जाता है या को अनुमति देगा और Android फ़्रेमवर्क और ऐप्लिकेशन को सेंसर फ़्रेमवर्क का इस्तेमाल करें. इस प्रोटोकॉल का इस्तेमाल, ऑडियो वर्चुअलाइज़र इफ़ेक्ट (3D ऑडियो) को कंट्रोल करने के लिए किया जाता है. इस पेज पर, डिवाइस और होस्ट शब्दों का इस्तेमाल ब्लूटूथ के हिसाब से किया गया है. यहां डिवाइस का मतलब हेड-ट्रैकिंग डिवाइस से है और होस्ट का मतलब 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 ब्लूटूथ मैक

इस स्कीम में, पहले आठ ऑक्टेट 0 होने चाहिए. आठवें और नौवें ऑक्टेट में, क्रमशः ASCII वैल्यू B और T होनी चाहिए. इसके बाद के छह ऑक्टेट को ब्लूटूथ मैक पते के तौर पर समझा जाता है. ऐसा तब माना जाता है, जब हेड ट्रैकर डिवाइस, इस मैक पते वाले किसी भी ऑडियो डिवाइस पर लागू होता है. यह पता, पहचान वाला पता होना चाहिए. भले ही, डिवाइस कनेक्टिविटी बनाने के लिए किसी भी क्रम में लगाए गए मैक पते का इस्तेमाल करता हो. ब्लूटूथ क्लासिक (v1.0 एचआईडी फ़ॉर्मैट) और ब्लूटूथ एलई (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 (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,
};

इस मामले में, होस्ट अलग-अलग ऐप्लिकेशन के सभी कलेक्शन की गिनती कर सकता है डिवाइस के ज़रिए विज्ञापन दिखाया जाता है. इसके लिए, सेंसर की जानकारी वाली प्रॉपर्टी की जांच की जाती है वे प्रोटोकॉल वर्शन तय करें जिन्हें वे लागू करते हैं और फिर प्रोटोकॉल का नया वर्शन, जो होस्ट पर काम करता हो. चुने जाने पर, होस्ट उस एक प्रोटोकॉल के साथ काम करता है जिसे डिवाइस के कनेक्शन के लाइफ़टाइम के लिए चुना गया था.

परिशिष्ट: एचआईडी डिस्क्रिप्टर का उदाहरण

नीचे दिए गए उदाहरण में, मान्य HID डिस्क्रिप्टर के बारे में बताया गया है. यह आम तौर पर इस्तेमाल किए जाने वाले 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 HID डिस्क्रिप्टर का उदाहरण

इस उदाहरण में, ऐसे डिवाइस के लिए 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,
};