جارٍ التحدّث إلى وحدة تحكّم Stadia باستخدام WebHID

تعمل وحدة تحكّم Stadia المضيئة كلوحة ألعاب عادية، ما يعني أنّه لا يمكن الوصول إلى جميع أزرارها باستخدام واجهة برمجة تطبيقات Gamepad API. باستخدام WebHID، يمكنك الآن الوصول إلى الأزرار المفقودة.

منذ إيقاف منصة Stadia، يخشى الكثيرون من أنّ وحدة التحكّم قد تصبح كجهاز غير مفيد في مكب النفايات. لحسن الحظّ، قرّر فريق Stadia فتح وحدة تحكّم Stadia بدلاً من ذلك من خلال توفير برامج ثابتة مخصّصة يمكنك وميضها على وحدة التحكّم من خلال الانتقال إلى صفحة وضع بلوتوث في Stadia. تجعل وحدة التحكّم في Stadia تبدو كوحدة تحكّم عادية في الألعاب يمكنك ربطها عبر كابل USB أو لاسلكيًا عبر البلوتوث. تبيّن أنّ صفحة Stadia التي تتضمّن بلوتوث تم تضمينها في واجهة عرض Project Fugu API، وهي تستخدم WebHID وWebUSB، إلا أنّ هذا ليس موضوع هذه المقالة. في هذه المشاركة، أريد أن أوضّح لك كيفية التحدّث إلى وحدة التحكّم في Stadia عبر WebHID.

وحدة تحكّم Stadia كلوحة ألعاب عادية

بعد تثبيت وحدة التحكم، تظهر على نظام التشغيل لوحة ألعاب عادية. يمكنك الاطّلاع على لقطة الشاشة التالية لمعرفة ترتيب الأزرار والمحور الشائع في لوحة الألعاب العادية. كما هو موضّح في مواصفات Gamepad API، تحتوي لوحات الألعاب العادية على أزرار من 0 إلى 16، وبالتالي يكون العدد الإجمالي 17 حرفًا (لوحة التحكّم كأربعة أزرار). إذا جرّبت وحدة التحكّم Stadia من خلال العرض التوضيحي لمختبِري لوحة الألعاب، ستلاحظ أنّها تعمل كالسحر.

يشير ذلك المصطلح إلى مخطط لوحة ألعاب عادية يتضمّن أسماء محاور وأزرار مختلفة.

ومع ذلك، إذا تم احتساب الأزرار على وحدة تحكّم Stadia، يعني ذلك أنّ هناك 19 أزرارًا. إذا جرّبت استخدام هذه الأدوات بشكل منهجي واحدًا تلو الآخر في أداة اختبار لوحة الألعاب، ستدرك أنّ زرَّي مساعد Google وزر التقاط لا تعملان. حتى إذا كانت سمة buttons الخاصة بلوحة الألعاب كما هو موضَّح في مواصفات وحدة التحكّم في الألعاب، سيتم ربط الأزرار من 0 إلى 16 فقط بما أنّ وحدة تحكّم Stadia تظهر كلوحة ألعاب عادية. وسيظل بإمكانك استخدام الأزرار الأخرى، ولكن لا يمكن أن تتوفّر في معظم الألعاب.

WebHID لإنقاذ الجهاز

بفضل WebHID API، يمكنك التحدّث إلى الزرّين المفقودَين 17 و18. ويمكنك أيضًا الحصول على بيانات حول جميع الأزرار والمحاور الأخرى المتوفّرة حاليًا عبر واجهة برمجة تطبيقات Gamepad API. الخطوة الأولى هي معرفة كيفية إرسال وحدة تحكّم Stadia إلى نظام التشغيل. وتتوفّر إحدى الطرق لإجراء ذلك من خلال فتح "وحدة تحكّم أدوات مطوّري البرامج في Chrome" على أي صفحة عشوائية، وطلب قائمة أجهزة غير مفلترة من WebHID API. ويمكنك بعد ذلك اختيار وحدة تحكُّم Stadia يدويًا لإجراء مزيد من الفحص. يمكنك الحصول على قائمة أجهزة بدون فلترة عن طريق تمرير مصفوفة خيارات filters فارغة.

const [device] = await navigator.hid.requestDevice({filters: []});

في أداة الاختيار، يبدو الإدخال ما قبل الأخير مثل وحدة تحكّم Stadia.

أداة اختيار أجهزة WebHID API تعرض بعض الأجهزة غير المرتبطة، ووحدة تحكُّم Stadia في الموضع ما قبل النهائي

بعد اختيار الجهاز "الأرباح من وحدة تحكّم Stadia"، سجِّل عنصر HIDDevice الناتج في وحدة التحكّم. يؤدي هذا إلى إظهار productId في وحدة تحكّم Stadia (37888، أي 0x9400 بالنظام السداسي العشري) وvendorId (6353، أي 0x18d1 بالنظام السداسي العشري). إذا بحثت عن vendorID في جدول أرقام تعريف مورّد USB الرسمي، ستجد أنّ 6353 مرتبط بما يمكنك توقّعه: Google Inc..

وحدة تحكّم أدوات مطوّري البرامج في Chrome تعرض نتيجة تسجيل كائن HIDDevice

بدلاً من الخطوات الموضّحة أعلاه، يمكنك الانتقال إلى chrome://device-log/ في شريط عنوان URL والضغط على الزر محو وتوصيل وحدة تحكّم Stadia ثم الضغط على إعادة التحميل. وهذا يوفر لك المعلومات نفسها.

واجهة تصحيح أخطاء chrome://device-log تعرض معلومات عن وحدة تحكُّم Stadia المتصلة

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

استخدِم رقمَي التعريف هذين، vendorId وproductId، لتحسين ما يتم عرضه في أداة الاختيار من خلال الفلترة بشكل صحيح للوصول إلى جهاز WebHID المناسب.

const [stadiaController] = await navigator.hid.requestDevice({filters: [{
  vendorId: 6353,
  productId: 37888,
}]});

الآن، تمت إزالة الضجيج من جميع الأجهزة غير المرتبطة، ولن تظهر سوى وحدة تحكُّم Stadia.

أداة اختيار الأجهزة في WebHID API تعرض وحدة تحكُّم Stadia فقط

بعد ذلك، افتح HIDDevice من خلال طلب طريقة open().

await stadiaController.open();

سجِّل العلامة HIDDevice مرة أخرى، مع ضبط العلامة opened على true.

وحدة تحكّم أدوات مطوّري البرامج في Chrome تعرض نتيجة تسجيل عنصر HIDDevice بعد فتحه

عندما يكون الجهاز مفتوحًا، يمكنك الاستماع إلى أحداث inputreport الواردة من خلال إرفاق أداة معالجة الأحداث.

stadiaController.addEventListener('inputreport', (e) => {
  console.log(e);
});

عند الضغط على زر مساعد Google وإفلاته على وحدة التحكّم، يتم تسجيل حدثَين في وحدة التحكّم. يمكنك اعتبارهما حدثَين مثل "زر مساعد Google" و "زر مساعد Google". بصرف النظر عن timeStamp، يبدو أنّ الحدثَين لا يمكن تمييزهما للوهلة الأولى.

وحدة تحكّم أدوات مطوّري البرامج في Chrome تعرض كائنات HIDInputReportEvent التي يتم تسجيلها

تعرض السمة reportId في واجهة HIDInputReportEvent بادئة التعريف المكوَّنة من بايت واحد لهذا التقرير أو 0 إذا كانت واجهة HID لا تستخدم أرقام تعريف التقارير. في هذه الحالة، هو 3. يكمن السر في السمة data، والممثّلة على شكل DataView بالحجم 10. توفّر DataView واجهة منخفضة المستوى لقراءة أنواع متعددة من الأرقام وكتابتها في ArrayBuffer ثنائي. تتمثل الطريقة للحصول على عنصر أكثر قابلية للاستيعاب من هذا التمثيل في إنشاء Uint8Array من ArrayBuffer، حتى تتمكن من رؤية الأعداد الصحيحة الفردية بدون توقيع 8 بت.

const data = new Uint8Array(event.data.buffer);

عند تسجيل بيانات الحدث في تقرير الإدخال مرة أخرى، تبدأ الأمور بشكل أفضل ويصبح بالإمكان فك رموز حدثَي "مساعد Google" و "زر مساعد Google". يبدو أنّ العدد الصحيح الأول (8 في كلا الحدثَين) مرتبط بضغطات الأزرار، بينما يبدو أنّ العدد الصحيح الثاني (2 و0) مرتبط بما إذا تم الضغط على زر مساعد Google أم لا.

وحدة تحكّم أدوات مطوّري البرامج في Chrome تعرض كائنات Uint8Array التي يتم تسجيلها لكل HIDInputReportEvent.

اضغط على زر التقاط بدلاً من زر مساعد Google، وسيظهر لك أنّ العدد الصحيح الثاني يتغير من 1 عند الضغط على الزر إلى 0 عند رفعه. هذا يسمح لك بكتابة "برنامج تشغيل" بسيط للغاية يمكّنك من الاستفادة من الزرّين المفقودين.

stadia.addEventListener('inputreport', (event) => {
  if (!e.reportId === 3) {
    return;
  }
  const data = new Uint8Array(event.data.buffer);
  if (data[0] === 8) {
    if (data[1] === 1) {
      hidButtons[1].classList.add('highlight');
    } else if (data[1] === 2) {
      hidButtons[0].classList.add('highlight');
    } else if (data[1] === 3) {
      hidButtons[0].classList.add('highlight');
      hidButtons[1].classList.add('highlight');
    } else {
      hidButtons[0].classList.remove('highlight');
      hidButtons[1].classList.remove('highlight');
    }
  }
});

باستخدام نهج هندسة عكسية مثل هذا، يمكنك، زر تلو الآخر، والمحور حسب المحور، معرفة كيفية التحدث إلى وحدة تحكّم Stadia باستخدام WebHID. بمجرد أن تتعلمها، فإن الباقي سيكون تقريبًا عملاً ميكانيكيًا لرسم خرائط الأعداد الصحيحة.

ما يفوتك الآن هو توفير تجربة الاتصال السلِسة التي توفّرها لك واجهة برمجة تطبيقات Gamepad API. لأسباب تتعلق بالأمان، عليك دائمًا اتّباع تجربة أداة الاختيار الأولية مرة واحدة للعمل مع جهاز WebHID مثل وحدة تحكّم Stadia. أما بالنسبة إلى الاتصالات المستقبلية، فيمكنك إعادة الاتصال بالأجهزة المعروفة. ويمكنك إجراء ذلك من خلال استدعاء طريقة getDevices().

let stadiaController;
const [device] = await navigator.hid.getDevices();
if (device && device.vendorId === 6353 && device.productId === 37888) {
  stadiaController = device;
}

الخصائص الديموغرافية

يمكنك الاطّلاع على وحدة التحكّم في Stadia التي يتم التحكّم فيها معًا من خلال واجهة برمجة تطبيقات Gamepad API وWebHID API في عرض توضيحي أنشأته. تأكّد من الاطّلاع على رمز المصدر الذي يعتمد على المقتطفات من هذه المقالة. ولتبسيط الأمر، أعرض فقط الأزرار A وB وX وY (التي يتم التحكّم فيها من خلال واجهة برمجة تطبيقات Gamepad API)، وأزرار المساعد وCapture (التي يتم التحكّم فيها من خلال واجهة برمجة تطبيقات WebHID). أسفل صورة وحدة التحكم، يمكنك رؤية بيانات WebHID الأولية، حتى تتمكن من التعرف على جميع الأزرار والمحاور في وحدة التحكم.

التطبيق التجريبي المتوفّر على الرابط https://stadia-controller-webhid-gamepad.glitch.me/ يعرض الأزرار A وB وX وY التي يتم التحكّم فيها من خلال واجهة برمجة تطبيقات Gamepad، فضلاً عن أزرار "مساعد Google" و"التقاط" التي يتم التحكّم فيها من خلال واجهة برمجة تطبيقات WebHID.

الاستنتاجات

بفضل البرامج الثابتة الجديدة، يمكن الآن استخدام وحدة تحكّم Stadia كلوحة ألعاب عادية مزوّدة بـ 17 زرًا، ما يجعل في معظم الحالات أكثر من اللازم للتحكّم في ألعاب الويب الشائعة. فإذا كنت بحاجة لأي سبب من الأسباب إلى بيانات من جميع الأزرار البالغ عددها 19 في وحدة التحكم، فإن WebHID يسمح لك بالوصول إلى تقارير الإدخال منخفضة المستوى التي يمكنك فك تشفيرها عن طريق إجراء هندسة عكسية لها واحدًا تلو الآخر. إذا كتبت برنامج تشغيل WebHID كامل بعد قراءة هذه المقالة، يُرجى التواصل معنا، وسيسعدني ربط مشروعك هنا. نتمنى لك تجربة سعيدة مع WebHID.

شكر وتقدير

راجع هذه المقالة فرانسوا بوفورت.