हेड ट्रैकर मानव इंटरफ़ेस डिवाइस (एचआईडी) प्रोटोकॉल, एंड्रॉइड 13 और उच्चतर चलाने वाले उपकरणों के लिए उपलब्ध है, एक हेड-ट्रैकिंग डिवाइस को यूएसबी या ब्लूटूथ के माध्यम से एंड्रॉइड डिवाइस से कनेक्ट करने की अनुमति देता है और सेंसर के माध्यम से एंड्रॉइड फ्रेमवर्क और ऐप्स के संपर्क में आता है। रूपरेखा। इस प्रोटोकॉल का उपयोग ऑडियो वर्चुअलाइज़र प्रभाव (3D ऑडियो) को नियंत्रित करने के लिए किया जाता है। यह पृष्ठ डिवाइस और होस्ट शब्दों का उनके ब्लूटूथ अर्थ में उपयोग करता है, जहां डिवाइस का अर्थ है हेड-ट्रैकिंग डिवाइस और होस्ट का अर्थ है एंड्रॉइड होस्ट।
डिवाइस निर्माताओं को हेड ट्रैकर एचआईडी प्रोटोकॉल के लिए समर्थन सक्षम करने के लिए अपने एंड्रॉइड डिवाइस को कॉन्फ़िगर करना होगा। कॉन्फ़िगरेशन के बारे में अधिक विस्तृत जानकारी के लिए, डायनेमिक सेंसर्स README देखें।
यह पृष्ठ निम्नलिखित संसाधनों से परिचित है:
शीर्ष-स्तरीय संरचना
एंड्रॉइड फ्रेमवर्क हेड ट्रैकर डिवाइस को एचआईडी डिवाइस के रूप में पहचानता है।
एक वैध एचआईडी डिस्क्रिप्टर के पूर्ण उदाहरण के लिए, परिशिष्ट 1: एक एचआईडी डिस्क्रिप्टर का उदाहरण देखें।
शीर्ष स्तर पर, हेड ट्रैकर डिवाइस Sensors
पेज ( 0x20
) और Other: Custom
उपयोग ( 0xE1
) के साथ एक ऐप संग्रह है। इस संग्रह के अंदर कई डेटा फ़ील्ड ( इनपुट ) और गुण ( सुविधाएँ ) हैं।
गुण और डेटा फ़ील्ड
यह खंड हेड ट्रैकर डिवाइस के एप्लिकेशन संग्रह में गुणों और डेटा फ़ील्ड का वर्णन करता है।
संपत्ति: सेंसर विवरण ( 0x0308
)
सेंसर विवरण ( 0x0308
) संपत्ति केवल पढ़ने के लिए ASCII (8-बिट) स्ट्रिंग गुण है जिसमें निम्न मान होना चाहिए:
#AndroidHeadTracker#1.0
कोई नल-टर्मिनेटर अपेक्षित नहीं है, जिसका अर्थ है कि इस संपत्ति का कुल आकार 23 8-बिट वर्ण है।
यह गुण अन्य कस्टम सेंसर के साथ टकराव से बचने के लिए एक विभेदक के रूप में कार्य करता है।
संपत्ति: स्थायी विशिष्ट आईडी ( 0x0302
)
Persistent Unique ID ( 0x0302
) गुण 16 तत्वों की केवल पढ़ने योग्य सरणी है, प्रत्येक 8 बिट (कुल 128 बिट)। कोई शून्य टर्मिनेटर अपेक्षित नहीं है। यह संपत्ति वैकल्पिक है।
यह प्रॉपर्टी हेड-ट्रैकिंग डिवाइस को ऑडियो डिवाइस में एकीकृत करने की अनुमति देती है ताकि वे उस ऑडियो डिवाइस को संदर्भित कर सकें जिससे वे जुड़े हुए हैं। निम्नलिखित योजनाओं का समर्थन किया जाता है।
स्टैंडअलोन हेड ट्रैकर
यदि पर्सिस्टेंट यूनिक आईडी ( 0x0302
) प्रॉपर्टी मौजूद नहीं है या सभी शून्य पर सेट है, तो इसका मतलब है कि हेड ट्रैकर डिवाइस स्थायी रूप से ऑडियो डिवाइस से जुड़ा नहीं है और अलग से इस्तेमाल किया जा सकता है, उदाहरण के लिए, उपयोगकर्ता को मैन्युअल रूप से अनुमति देकर हेड ट्रैकर डिवाइस को एक अलग ऑडियो डिवाइस के साथ संबद्ध करें।
ब्लूटूथ मैक पते का उपयोग कर संदर्भ
ओकटेट | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 1 1 | 12 | 13 | 14 | 15 |
मूल्य | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | बी | टी | ब्लूटूथ मैक |
इस योजना में, पहले 8 ऑक्टेट 0
होना चाहिए, ऑक्टेट 8 और 9 में क्रमशः एएससीआईआई मान B
और T
होना चाहिए, और निम्नलिखित 6 ऑक्टेट को ब्लूटूथ मैक पते के रूप में व्याख्यायित किया जाता है, यह मानते हुए कि हेड ट्रैकर डिवाइस किसी भी ऑडियो डिवाइस पर लागू होता है यह मैक पता।
यूयूआईडी का उपयोग करते हुए संदर्भ
जब भी ऑक्टेट 8 का सबसे महत्वपूर्ण बिट (MSB) सेट किया जाता है ( ≥0x80
), फ़ील्ड को UUID के रूप में व्याख्यायित किया जाता है, जैसा कि RFC-4122 में निर्दिष्ट है। संबंधित ऑडियो डिवाइस एक ही यूयूआईडी प्रदान करता है, जो एंड्रॉइड फ्रेमवर्क पर पंजीकृत है, एक अनिर्दिष्ट तंत्र के माध्यम से जो उपयोग किए जाने वाले परिवहन के प्रकार के लिए विशिष्ट है।
संपत्ति: रिपोर्टिंग राज्य ( 0x0316
)
रिपोर्टिंग स्थिति ( 0x0316
) संपत्ति एक पढ़ने/लिखने की संपत्ति है जिसमें मानक शब्दार्थ है जैसा कि एचआईडी विनिर्देश में परिभाषित किया गया है। होस्ट इस प्रॉपर्टी का इस्तेमाल डिवाइस को यह बताने के लिए करता है कि किस इवेंट की रिपोर्ट करनी है. केवल मान कोई ईवेंट ( 0x0840
) और सभी ईवेंट ( 0x0841
) का उपयोग नहीं किया जाता है।
इस फ़ील्ड के लिए प्रारंभिक मान कोई ईवेंट नहीं होना चाहिए और इसे कभी भी डिवाइस द्वारा, केवल होस्ट द्वारा संशोधित नहीं किया जाना चाहिए।
संपत्ति: पावर स्टेट ( 0x0319
)
पावर स्टेट ( 0x0319
) संपत्ति एक पढ़ने/लिखने वाली संपत्ति है जिसमें मानक शब्दार्थ है जैसा कि एचआईडी विनिर्देश में परिभाषित किया गया है। होस्ट इस गुण का उपयोग डिवाइस को इंगित करने के लिए करता है कि उसे किस पावर स्थिति में होना चाहिए। केवल पूर्ण पावर ( 0x0851
) और पावर ऑफ ( 0x0855
) के मानों का उपयोग किया जाता है।
इस फ़ील्ड के लिए प्रारंभिक मान डिवाइस द्वारा निर्धारित किया जाता है और इसे डिवाइस द्वारा कभी भी संशोधित नहीं किया जाना चाहिए, केवल होस्ट द्वारा।
संपत्ति: रिपोर्ट अंतराल ( 0x030E
)
रिपोर्ट अंतराल ( 0x030E
) संपत्ति एक पढ़ने/लिखने की संपत्ति है जिसमें मानक शब्दार्थ है जैसा कि एचआईडी विनिर्देश में परिभाषित किया गया है। होस्ट इस गुण का उपयोग डिवाइस को यह इंगित करने के लिए करता है कि उसके डेटा रीडिंग को कितनी बार रिपोर्ट करना है। इकाइयाँ सेकंड हैं। इस मान के लिए मान्य सीमा डिवाइस द्वारा निर्धारित की जाती है और भौतिक न्यूनतम/अधिकतम तंत्र का उपयोग करके वर्णित की जाती है। कम से कम 50 हर्ट्ज रिपोर्टिंग दर समर्थित होनी चाहिए, और अनुशंसित अधिकतम रिपोर्टिंग दर 100 हर्ट्ज है। इसलिए, न्यूनतम रिपोर्ट अंतराल 20 ms से कम या उसके बराबर होना चाहिए, और 10 ms से अधिक या उसके बराबर होने की अनुशंसा की जाती है।
डेटा फ़ील्ड: कस्टम मान 1 ( 0x0544
)
कस्टम मान 1 ( 0x0544
) फ़ील्ड एक इनपुट फ़ील्ड है जिसका उपयोग वास्तविक हेड-ट्रैकिंग जानकारी की रिपोर्ट करने के लिए किया जाता है। यह एक 3-तत्व सरणी है, जिसे एचआईडी विनिर्देश के खंड 6.2.2.7 में निर्दिष्ट भौतिक मूल्यों के लिए सामान्य एचआईडी नियमों के अनुसार व्याख्या किया गया है। प्रत्येक तत्व के लिए मान्य सीमा [-π, ] rad है। इकाइयाँ हमेशा रेडियन होती हैं।
तत्वों की व्याख्या इस प्रकार की जाती है: [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 बिट आकार का है। हर बार संदर्भ के फ्रेम को बदलने पर डिवाइस द्वारा इसे बढ़ाया जाना चाहिए (रैपरअराउंड के साथ), उदाहरण के लिए, यदि अभिविन्यास निर्धारित करने के लिए उपयोग किए जाने वाले अभिविन्यास फ़िल्टर एल्गोरिदम का राज्य रीसेट हो गया था। इस मान की व्याख्या भौतिक मूल्यों के लिए सामान्य HID नियमों के अनुसार की जाती है। हालाँकि, भौतिक मूल्य और इकाइयाँ मायने नहीं रखती हैं। होस्ट के लिए प्रासंगिक एकमात्र जानकारी एक परिवर्तित मूल्य है। तार्किक से भौतिक इकाइयों में परिवर्तित करते समय सटीकता के नुकसान से संबंधित संख्यात्मक मुद्दों से बचने के लिए, इस क्षेत्र के लिए भौतिक न्यूनतम, भौतिक अधिकतम और इकाई घातांक के मानों को शून्य पर सेट करने की अनुशंसा की जाती है।
रिपोर्ट संरचना
रिपोर्ट में संपत्तियों का समूहीकरण (रिपोर्ट आईडी के असाइनमेंट द्वारा) लचीला है। दक्षता के लिए, हम केवल-पठन गुणों को पढ़ने/लिखने के गुणों से अलग करने की अनुशंसा करते हैं।
डेटा फ़ील्ड के लिए, कस्टम मान 1, 2, और 3 फ़ील्ड एक ही रिपोर्ट में होने चाहिए और किसी दिए गए डिवाइस (ऐप संग्रह) के लिए केवल एक रिपोर्ट में होना चाहिए।
इनपुट रिपोर्ट भेजना
डिवाइस को समय-समय पर और एसिंक्रोनस रूप से (HID INPUT संदेशों के माध्यम से) इनपुट रिपोर्ट भेजनी चाहिए जब नीचे दी गई सभी शर्तें पूरी हों:
- Power State संपत्ति पूर्ण शक्ति पर सेट है।
- रिपोर्टिंग राज्य संपत्ति सभी घटनाओं पर सेट है।
- रिपोर्टिंग अंतराल संपत्ति गैर-शून्य है।
रिपोर्टिंग अंतराल संपत्ति निर्धारित करती है कि कितनी बार रिपोर्ट भेजनी है। जब उपरोक्त में से कोई भी शर्त पूरी नहीं होती है, तो डिवाइस को कोई रिपोर्ट नहीं भेजनी चाहिए।
आगे और पीछे की अनुकूलता
हेड ट्रैकर 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,
};
इस मामले में, होस्ट डिवाइस द्वारा विज्ञापित सभी अलग-अलग ऐप संग्रहों की गणना कर सकता है, उनके सेंसर विवरण संपत्ति की जांच करके प्रोटोकॉल संस्करणों को निर्धारित कर सकता है, जिन्हें वे प्रत्येक लागू करते हैं, फिर नवीनतम प्रोटोकॉल संस्करण चुन सकते हैं जो होस्ट का समर्थन करता है। चुने जाने पर, होस्ट एकल प्रोटोकॉल के साथ काम करता है जिसे डिवाइस कनेक्शन के जीवनकाल के लिए चुना गया था।
परिशिष्ट 1: एक छिपाई विवरणक का उदाहरण
निम्न उदाहरण एक विशिष्ट मान्य HID डिस्क्रिप्टर को दिखाता है। यह आमतौर पर उपयोग किए जाने वाले C मैक्रोज़ का उपयोग करता है, जो 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,
};