हेड ट्रैकर HID प्रोटोकॉल

एंड्रॉइड 13 और उच्चतर चलाने वाले उपकरणों के लिए उपलब्ध हेड ट्रैकर ह्यूमन इंटरफ़ेस डिवाइस (HID) प्रोटोकॉल, हेड-ट्रैकिंग डिवाइस को यूएसबी या ब्लूटूथ के माध्यम से एंड्रॉइड डिवाइस से कनेक्ट करने और सेंसर के माध्यम से एंड्रॉइड फ्रेमवर्क और ऐप्स के संपर्क में आने की अनुमति देता है। रूपरेखा। इस प्रोटोकॉल का उपयोग ऑडियो वर्चुअलाइज़र प्रभाव (3डी ऑडियो) को नियंत्रित करने के लिए किया जाता है। यह पृष्ठ डिवाइस और होस्ट शब्दों का उपयोग उनके ब्लूटूथ अर्थ में करता है, जहां डिवाइस का अर्थ हेड-ट्रैकिंग डिवाइस है और होस्ट का अर्थ एंड्रॉइड होस्ट है।

डिवाइस निर्माताओं को हेड ट्रैकर एचआईडी प्रोटोकॉल के लिए समर्थन सक्षम करने के लिए अपने एंड्रॉइड डिवाइस को कॉन्फ़िगर करना होगा। कॉन्फ़िगरेशन के बारे में अधिक विस्तृत जानकारी के लिए, डायनामिक सेंसर्स README देखें।

यह पृष्ठ निम्नलिखित संसाधनों से परिचित है:

शीर्ष स्तरीय संरचना

एंड्रॉइड फ्रेमवर्क हेड ट्रैकर डिवाइस को HID डिवाइस के रूप में पहचानता है।

वैध HID डिस्क्रिप्टर के संपूर्ण उदाहरण के लिए, परिशिष्ट 1 देखें: HID डिस्क्रिप्टर का उदाहरण

शीर्ष स्तर पर, हेड ट्रैकर डिवाइस Sensors पेज ( 0x20 ) और Other: Custom उपयोग ( 0xE1 ) के साथ एक ऐप संग्रह है। इस संग्रह के अंदर कई डेटा फ़ील्ड ( इनपुट ) और गुण ( विशेषताएं ) हैं।

गुण और डेटा फ़ील्ड

यह अनुभाग हेड ट्रैकर डिवाइस के एप्लिकेशन संग्रह में गुणों और डेटा फ़ील्ड का वर्णन करता है।

संपत्ति: सेंसर विवरण ( 0x0308 )

सेंसर विवरण ( 0x0308 ) संपत्ति केवल पढ़ने के लिए ASCII (8-बिट) स्ट्रिंग संपत्ति है जिसमें निम्नलिखित मान होना चाहिए:

#AndroidHeadTracker#1.0

कोई नल-टर्मिनेटर अपेक्षित नहीं है, जिसका अर्थ है कि इस संपत्ति का कुल आकार 23 8-बिट वर्ण है।

यह संपत्ति अन्य कस्टम सेंसर के साथ टकराव से बचने के लिए एक विभेदक के रूप में कार्य करती है।

संपत्ति: स्थायी अद्वितीय आईडी ( 0x0302 )

परसिस्टेंट यूनिक आईडी ( 0x0302 ) प्रॉपर्टी 16 तत्वों की केवल पढ़ने योग्य सरणी है, प्रत्येक 8 बिट (कुल 128 बिट)। कोई शून्य टर्मिनेटर अपेक्षित नहीं है. यह संपत्ति वैकल्पिक है.

यह संपत्ति उन हेड-ट्रैकिंग डिवाइसों को अनुमति देती है जो ऑडियो डिवाइस में एकीकृत होते हैं ताकि वे उस ऑडियो डिवाइस को संदर्भित कर सकें जिससे वे जुड़े हुए हैं। निम्नलिखित योजनाएं समर्थित हैं.

स्टैंडअलोन हेड ट्रैकर

यदि पर्सिस्टेंट यूनिक आईडी ( 0x0302 ) प्रॉपर्टी मौजूद नहीं है या सभी शून्य पर सेट है, तो इसका मतलब है कि हेड ट्रैकर डिवाइस किसी ऑडियो डिवाइस से स्थायी रूप से जुड़ा नहीं है और इसे अलग से इस्तेमाल किया जा सकता है, उदाहरण के लिए, उपयोगकर्ता को मैन्युअल रूप से अनुमति देकर हेड ट्रैकर डिवाइस को एक अलग ऑडियो डिवाइस के साथ संबद्ध करें।

ब्लूटूथ मैक पते का उपयोग कर संदर्भ

ओकटेट 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
कीमत 0 0 0 0 0 0 0 0 बी टी ब्लूटूथ मैक

इस योजना में, पहले 8 ऑक्टेट 0 होने चाहिए, ऑक्टेट 8 और 9 में क्रमशः ASCII मान B और T होने चाहिए, और निम्नलिखित 6 ऑक्टेट को ब्लूटूथ MAC पते के रूप में व्याख्या किया जाता है, यह मानते हुए कि हेड ट्रैकर डिवाइस किसी भी ऑडियो डिवाइस पर लागू होता है यह मैक पता.

यूयूआईडी का उपयोग कर संदर्भ

जब भी ऑक्टेट 8 का सबसे महत्वपूर्ण बिट (MSB) सेट किया जाता है ( ≥0x80 ), फ़ील्ड को UUID के रूप में व्याख्या किया जाता है, जैसा कि RFC-4122 में निर्दिष्ट है। संबंधित ऑडियो डिवाइस वही यूयूआईडी प्रदान करता है, जो एक अनिर्दिष्ट तंत्र के माध्यम से एंड्रॉइड फ्रेमवर्क पर पंजीकृत है, जो उपयोग किए गए परिवहन के प्रकार के लिए विशिष्ट है।

संपत्ति: रिपोर्टिंग स्थिति ( 0x0316 )

रिपोर्टिंग स्थिति ( 0x0316 ) संपत्ति एक पढ़ने/लिखने की संपत्ति है जिसमें HID विनिर्देश में परिभाषित मानक शब्दार्थ हैं। होस्ट इस प्रॉपर्टी का उपयोग डिवाइस को यह इंगित करने के लिए करता है कि कौन सी घटनाओं की रिपोर्ट करनी है। केवल मान नो इवेंट्स ( 0x0840 ) और ऑल इवेंट्स ( 0x0841 ) का उपयोग किया जाता है।

इस फ़ील्ड के लिए प्रारंभिक मान कोई ईवेंट नहीं होना चाहिए और इसे डिवाइस द्वारा कभी भी संशोधित नहीं किया जाना चाहिए, केवल होस्ट द्वारा।

संपत्ति: पावर स्टेट ( 0x0319 )

पावर स्टेट ( 0x0319 ) संपत्ति एक पढ़ने/लिखने की संपत्ति है जिसमें HID विनिर्देश में परिभाषित मानक शब्दार्थ हैं। होस्ट इस प्रॉपर्टी का उपयोग डिवाइस को इंगित करने के लिए करता है कि यह किस पावर स्थिति में होना चाहिए। केवल पूर्ण पावर ( 0x0851 ) और पावर ऑफ ( 0x0855 ) मान का उपयोग किया जाता है।

इस फ़ील्ड का प्रारंभिक मान डिवाइस द्वारा निर्धारित किया जाता है और इसे डिवाइस द्वारा कभी भी संशोधित नहीं किया जाना चाहिए, केवल होस्ट द्वारा।

संपत्ति: रिपोर्ट अंतराल ( 0x030E )

रिपोर्ट अंतराल ( 0x030E ) संपत्ति एक पढ़ने/लिखने की संपत्ति है जिसमें HID विनिर्देश में परिभाषित मानक शब्दार्थ हैं। होस्ट इस प्रॉपर्टी का उपयोग डिवाइस को यह इंगित करने के लिए करता है कि उसे कितनी बार अपने डेटा रीडिंग की रिपोर्ट करनी है। इकाइयाँ सेकंड हैं. इस मान के लिए वैध सीमा डिवाइस द्वारा निर्धारित की जाती है और भौतिक न्यूनतम/अधिकतम तंत्र का उपयोग करके वर्णित की जाती है। कम से कम 50 हर्ट्ज़ रिपोर्टिंग दर समर्थित होनी चाहिए, और अनुशंसित अधिकतम रिपोर्टिंग दर 100 हर्ट्ज़ है। इसलिए, न्यूनतम रिपोर्ट अंतराल 20 एमएस से कम या उसके बराबर होना चाहिए, और 10 एमएस से अधिक या उसके बराबर होने की अनुशंसा की जाती है।

डेटा फ़ील्ड: कस्टम मान 1 ( 0x0544 )

कस्टम वैल्यू 1 ( 0x0544 ) फ़ील्ड एक इनपुट फ़ील्ड है जिसका उपयोग वास्तविक हेड-ट्रैकिंग जानकारी की रिपोर्ट करने के लिए किया जाता है। यह एक 3-तत्व सरणी है, जिसे HID विनिर्देश के खंड 6.2.2.7 में निर्दिष्ट भौतिक मानों के लिए सामान्य HID नियमों के अनुसार व्याख्या की गई है। प्रत्येक तत्व के लिए वैध सीमा [-π, π] रेड है। इकाइयाँ सदैव रेडियन होती हैं।

तत्वों की व्याख्या इस प्रकार की जाती है: [rx, ry, rz] , जैसे कि [rx, ry, rz] एक रोटेशन वेक्टर है, जो संदर्भ फ्रेम से हेड फ्रेम में परिवर्तन का प्रतिनिधित्व करता है। परिमाण [0..π] सीमा में होना चाहिए।

संदर्भ फ़्रेम मनमाना है, लेकिन यह आम तौर पर तय होता है और दाएं हाथ का होना चाहिए। थोड़ी मात्रा में बहाव स्वीकार्य है. सिर की कुल्हाड़ियाँ हैं:

  • X बाएँ कान से दाएँ तक
  • Y सिर के पीछे से नाक तक (पीछे से सामने)
  • गर्दन से सिर के ऊपर तक Z

डेटा फ़ील्ड: कस्टम मान 2 ( 0x0545 )

कस्टम वैल्यू 2 ( 0x0545 ) फ़ील्ड एक इनपुट फ़ील्ड है जिसका उपयोग वास्तविक हेड-ट्रैकिंग जानकारी की रिपोर्ट करने के लिए किया जाता है। यह एक 3-तत्व निश्चित-बिंदु सरणी है, जिसकी व्याख्या भौतिक मूल्यों के लिए सामान्य HID नियमों के अनुसार की जाती है। इकाइयाँ हमेशा रेडियन/सेकंड होती हैं।

तत्वों की व्याख्या इस प्रकार की जाती है: [vx, vy, vz] , जैसे कि [vx, vy, vz] एक घूर्णन वेक्टर है, जो हेड फ्रेम के कोणीय वेग (स्वयं के सापेक्ष) का प्रतिनिधित्व करता है।

डेटा फ़ील्ड: कस्टम मान 3 ( 0x0546 )

कस्टम वैल्यू 3 ( 0x0546 ) फ़ील्ड एक इनपुट फ़ील्ड है जिसका उपयोग संदर्भ फ़्रेम में असंतुलन को ट्रैक करने के लिए किया जाता है। यह 8 बिट आकार का एक अदिश पूर्णांक है। हर बार संदर्भ का फ्रेम बदले जाने पर डिवाइस द्वारा इसे (रैपअराउंड के साथ) बढ़ाया जाना चाहिए, उदाहरण के लिए, यदि ओरिएंटेशन निर्धारित करने के लिए उपयोग किए जाने वाले ओरिएंटेशन फ़िल्टर एल्गोरिदम की स्थिति रीसेट हो गई है। इस मान की व्याख्या भौतिक मूल्यों के लिए सामान्य HID नियमों के अनुसार की जाती है। हालाँकि, भौतिक मूल्य और इकाइयाँ मायने नहीं रखतीं। होस्ट के लिए प्रासंगिक एकमात्र जानकारी परिवर्तित मूल्य है। तार्किक से भौतिक इकाइयों में परिवर्तित करते समय परिशुद्धता के नुकसान से संबंधित संख्यात्मक मुद्दों से बचने के लिए, इस क्षेत्र के लिए भौतिक न्यूनतम, भौतिक अधिकतम और इकाई घातांक के मानों को शून्य पर सेट करने की अनुशंसा की जाती है।

रिपोर्ट संरचना

रिपोर्ट में संपत्तियों का समूहीकरण (रिपोर्ट आईडी के असाइनमेंट द्वारा) लचीला है। दक्षता के लिए, हम केवल-पढ़ने योग्य गुणों को पढ़ने/लिखने वाले गुणों से अलग करने की अनुशंसा करते हैं।

डेटा फ़ील्ड के लिए, कस्टम मान 1, 2, और 3 फ़ील्ड एक ही रिपोर्ट में होने चाहिए और किसी दिए गए डिवाइस (ऐप संग्रह) के लिए केवल एक रिपोर्ट में होने चाहिए।

इनपुट रिपोर्ट भेजें

ये सभी शर्तें पूरी होने पर डिवाइस को समय-समय पर और एसिंक्रोनस रूप से (HID इनपुट संदेशों के माध्यम से) इनपुट रिपोर्ट भेजनी होगी:

  • पावर स्टेट संपत्ति पूर्ण पावर पर सेट है।
  • रिपोर्टिंग राज्य संपत्ति सभी घटनाओं पर सेट है।
  • रिपोर्टिंग अंतराल गुण शून्य नहीं है.

रिपोर्टिंग अंतराल संपत्ति निर्धारित करती है कि रिपोर्ट कितनी बार भेजनी है। जब उपरोक्त शर्तों में से कोई भी पूरी नहीं होती है, तो डिवाइस को कोई रिपोर्ट नहीं भेजनी चाहिए।

आगे और पीछे की अनुकूलता

हेड ट्रैकर एचआईडी प्रोटोकॉल एक वर्जनिंग योजना का उपयोग करता है जो अपडेट की अनुमति देता है, जबकि एक होस्ट और एक डिवाइस के बीच अंतरसंचालनीयता की अनुमति देता है जो प्रोटोकॉल के विभिन्न संस्करणों का उपयोग करता है। प्रोटोकॉल के संस्करणों को दो संख्याओं, प्रमुख और लघु, द्वारा पहचाना जाता है, जिनके अलग-अलग शब्दार्थ होते हैं जैसा कि निम्नलिखित अनुभागों में वर्णित है।

किसी डिवाइस द्वारा समर्थित संस्करणों को उसके सेंसर विवरण ( 0x0308 ) गुण की जांच करके निर्धारित किया जा सकता है।

लघु संस्करण अनुकूलता

लघु संस्करण में परिवर्तन पिछले लघु संस्करणों के साथ पिछड़े संगत हैं जो समान प्रमुख संस्करण पर आधारित हैं। छोटे संस्करण के अपडेट में, होस्ट अतिरिक्त डेटा फ़ील्ड और गुणों को अनदेखा कर देता है। उदाहरण के लिए, प्रोटोकॉल संस्करण 1.6 का उपयोग करने वाला एक उपकरण उस होस्ट के साथ संगत है जो संस्करण 1.5 सहित प्रोटोकॉल संस्करण 1.x का समर्थन करता है।

प्रमुख संस्करण अनुकूलता

प्रमुख संस्करणों में परिवर्तन के लिए गैर-पिछड़े-संगत परिवर्तनों की अनुमति है। पुराने और नए होस्ट के साथ इंटरऑपरेबिलिटी के लिए कई प्रमुख संस्करणों का समर्थन करने के लिए, डिवाइस अपने रिपोर्ट डिस्क्रिप्टर में कई ऐप संग्रह निर्दिष्ट कर सकते हैं। उदाहरण के लिए:

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 डिस्क्रिप्टर का उदाहरण

निम्नलिखित उदाहरण एक विशिष्ट वैध HID डिस्क्रिप्टर को दर्शाता है। यह आमतौर पर उपयोग किए जाने वाले सी मैक्रोज़ का उपयोग करता है, जो एचआईडी सेंसर उपयोग (अनुभाग 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,
};