بروتوكول HID لجهاز تتبُّع حركة الرأس

يتوفّر بروتوكول جهاز الواجهة البشرية (HID) لأداة تتبُّع الرأس للأجهزة الإصدار 13 من نظام التشغيل Android والإصدارات الأحدث الذي سيتم ربطه بجهاز Android من خلال USB أو البلوتوث وأن يتم الكشف عن إطار عمل Android وتطبيقاته من خلال أدوات الاستشعار. يُستخدَم هذا البروتوكول للتحكّم في تأثير أداة المحاكاة الافتراضية الصوتية (صوت ثلاثي الأبعاد). تستخدم هذه الصفحة المصطلحين device مضيف بمعنى البلوتوث، حيث يشير device إلى جهاز تتبُّع حركة الرأس وhost تعني مضيف Android.

على الشركات المصنّعة للأجهزة ضبط أجهزة Android لإتاحة التوافق مع بروتوكول HID لجهاز تتبع الرأس. لمزيد من المعلومات التفصيلية حول التهيئة، يمكنك مراجعة دليل توضيحي لأجهزة الاستشعار الديناميكية

تفترض هذه الصفحة الإلمام بالموارد التالية:

بنية المستوى الأعلى

يتعرّف إطار عمل Android على جهاز تتبُّع الرأس كجهاز واجهة بشرية (HID).

للاطّلاع على مثال كامل لرمز HID صالح، يُرجى الاطّلاع على الملحق 1: مثال على أداة وصف الواجهة البشرية (HID)

في المستوى الأعلى، جهاز تتبع الرأس عبارة عن مجموعة تطبيقات تحتوي على Sensors صفحة (0x20) واستخدام Other: Custom (0xE1). داخل هذا جمع البيانات عبارة عن العديد من حقول البيانات (الإدخالات) والخصائص (الميزات).

المواقع وحقول البيانات

يوضِّح هذا القسم السمات وحقول البيانات في أحد التطبيقات. مجموعة من جهاز تتبع الرأس.

الخاصية: وصف أداة الاستشعار (0x0308)

سمة وصف أداة الاستشعار (0x0308) هي سلسلة ASCII (8 بت) للقراءة فقط التي يجب أن تحتوي على القيمة التالية:

#AndroidHeadTracker#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 هذا.

مرجع يستخدم المعرّف الفريد العالمي (UUID)

عند تعيين البت الأكثر أهمية (MSB) للثماني بتات 8 (≥0x80)، يتم يتم تفسيره على أنه UUID، كما هو محدد في RFC-4122. تشير رسالة الأشكال البيانية يوفّر الجهاز الصوتي المقابل المعرّف الفريد العالمي نفسه (UUID) نفسه، والمسجّل في إطار عمل Android من خلال آلية غير محدّدة مخصَّصة نوع وسيلة النقل المستخدمة.

الموقع: حالة إعداد التقارير (0x0316)

خاصية إعداد التقارير (0x0316) هي خاصية للقراءة/الكتابة تحتوي على الدلالة الدلالية القياسية كما هو موضح في مواصفات HID. يستخدم المضيف هذه للإشارة إلى الأحداث التي يجب الإبلاغ عنها للجهاز. فقط القيم لا يتم استخدام الأحداث (0x0840) وجميع الأحداث (0x0841).

يجب أن تكون القيمة الأولية لهذا الحقل "بلا أحداث" ويجب ألا تكون عدّله الجهاز أو المضيف فقط.

الخاصية: حالة الطاقة (0x0319)

خاصية Power State (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) هو حقل إدخال يُستخدم لإعداد تقارير معلومات تتبع حركة الرأس الفعلية. إنها مصفوفة النقاط الثابتة المكونة من ثلاثة عناصر، وفقًا لقواعد HID العادية للقيم الفيزيائية. تكون الوحدات دائمًا بوحدات راديان/ثانية.

يتم تفسير العناصر على أنها: [vx, vy, vz]، بحيث تكون [vx, vy, vz] متّجه تدوير، تمثل السرعة الزاويّة لإطار الرأس (بالنسبة إلى نفسه).

حقل البيانات: القيمة المخصّصة 3 (0x0546)

حقل القيمة المخصّصة 3 (0x0546) هو حقل إدخال يُستخدم للتتبّع. المستمرات في الإطار المرجعي. إنه عدد صحيح عددي 8 بت الحجم. ويجب أن يضيفه الجهاز في كل مرة تغير الإطار المرجعي، على سبيل المثال، إذا تغيرت خوارزمية تصفية الاتجاه المستخدم لتحديد الاتجاه تمت إعادة تعيين حالته. هذه القيمة وفقًا لقواعد HID العادية للقيم الفيزيائية. ومع ذلك، لا تهم القيمة المادية والوحدات. والمعلومات الوحيدة ذات الصلة المضيف هو قيمة متغيرة. لتجنب المشكلات الرقمية المتعلقة بفقدان الدقة أثناء التحويل من الوحدات المنطقية إلى الوحدات المادية، يوصى بتعيين قيم الحد الأدنى المادي والحد الأقصى المادي وأس الوحدة إلى صفر في هذا الحقل.

بنية التقرير

يتم تجميع المواقع في تقارير (حسب تخصيص أرقام تعريف التقارير) المرنة. لتحقيق الكفاءة، ننصح بفصل السمات المخصصة للقراءة فقط. من خصائص القراءة/الكتابة.

بالنسبة إلى حقول البيانات، يجب أن تكون حقول القيمة المخصّصة 1 و2 و3 مطابِقة نفسها وأن تكون ضمن تقرير واحد فقط لجهاز معيّن (مجموعة التطبيقات).

إرسال تقارير الإدخال

يجب أن يتم استخدام الجهاز بشكل دوري وغير متزامن (من خلال رسائل HID INPUT). إرسال تقارير الإدخال عند استيفاء جميع الشروط التالية:

  • يتم ضبط خاصية Power State على "الطاقة الكاملة".
  • تم ضبط موقع "حالة إعداد التقارير" على "جميع الأحداث".
  • قيمة سمة "الفاصل الزمني لإعداد التقارير" ليست صفرية.

يحدد الموقع "الفاصل الزمني لإعداد التقارير" عدد مرات إرسال التقارير. فعندما لم يتم استيفاء أي من الشروط أعلاه، يجب ألا يرسل الجهاز أي تقارير.

التوافق الأمامي والخلفي

يستخدم بروتوكول HID لجهاز تتبع الرأس مخطط الإصدارات التي تسمح مع السماح بإمكانية التشغيل التفاعلي بين المضيف والجهاز الذي يستخدم على إصدارات مختلفة من البروتوكول. تم تحديد إصدارات البروتوكول برقمين، كبير وثانوي، ولهما دلالات مميزة الموضحة في الأقسام التالية.

ويمكن تحديد الإصدارات المتوافقة مع أحد الأجهزة عن طريق فحص خاصية وصف جهاز الاستشعار (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

يوضّح المثال التالي واصف 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,
};