WebHID-এর সাথে Stadia কন্ট্রোলারের সাথে কথা বলা হচ্ছে

ফ্ল্যাশ করা Stadia কন্ট্রোলার একটি স্ট্যান্ডার্ড গেমপ্যাডের মতো কাজ করে, যার মানে গেমপ্যাড API ব্যবহার করে এর সমস্ত বোতাম অ্যাক্সেসযোগ্য নয়। WebHID দিয়ে, আপনি এখন অনুপস্থিত বোতামগুলি অ্যাক্সেস করতে পারেন৷

যেহেতু Stadia বন্ধ হয়ে গেছে, অনেকের ভয় ছিল যে কন্ট্রোলারটি ল্যান্ডফিলের একটি অকেজো হার্ডওয়্যার হিসাবে শেষ হবে। ভাগ্যক্রমে, Stadia টিম একটি কাস্টম ফার্মওয়্যার প্রদান করে Stadia কন্ট্রোলারটি খোলার সিদ্ধান্ত নিয়েছে যা আপনি Stadia Bluetooth মোড পৃষ্ঠায় গিয়ে আপনার কন্ট্রোলারে ফ্ল্যাশ করতে পারেন। এটি আপনার Stadia কন্ট্রোলারটিকে একটি আদর্শ গেমপ্যাড হিসাবে দেখায় যেটির সাথে আপনি USB কেবলের মাধ্যমে বা ব্লুটুথের মাধ্যমে ওয়্যারলেসভাবে সংযোগ করতে পারেন। প্রজেক্ট ফুগু এপিআই শোকেসে গর্বিতভাবে বৈশিষ্ট্যযুক্ত , স্ট্যাডিয়া ব্লুটুথ পৃষ্ঠা নিজেই WebHID এবং WebUSB ব্যবহার করে, কিন্তু এটি এই নিবন্ধের বিষয় নয়। এই পোস্টে, আমি ব্যাখ্যা করতে চাই কিভাবে আপনি WebHID এর মাধ্যমে Stadia কন্ট্রোলারের সাথে কথা বলতে পারেন।

স্ট্যান্ডার্ড গেমপ্যাড হিসেবে স্ট্যাডিয়া কন্ট্রোলার

ফ্ল্যাশ করার পরে, নিয়ামকটি অপারেটিং সিস্টেমে একটি আদর্শ গেমপ্যাড হিসাবে উপস্থিত হয়। একটি সাধারণ গেমপ্যাডে একটি সাধারণ বোতাম এবং অক্ষ বিন্যাসের জন্য নিম্নলিখিত স্ক্রিনশটটি দেখুন। গেমপ্যাড এপিআই স্পেকে সংজ্ঞায়িত হিসাবে, স্ট্যান্ডার্ড গেমপ্যাডগুলিতে 0 থেকে 16 পর্যন্ত বোতাম থাকে, তাই মোট 17টি (ডি-প্যাডটি চারটি বোতাম হিসাবে গণনা করে)। আপনি যদি গেমপ্যাড টেস্টার ডেমোতে Stadia কন্ট্রোলার ব্যবহার করে দেখেন, আপনি লক্ষ্য করবেন যে এটি একটি মুগ্ধতার মতো কাজ করে।

লেবেলযুক্ত বিভিন্ন অক্ষ এবং বোতাম সহ একটি আদর্শ গেমপ্যাডের একটি স্কিমা৷

যাইহোক, যদি আপনি Stadia কন্ট্রোলারে বোতামগুলি গণনা করেন, সেখানে 19টি আছে। আপনি যদি গেমপ্যাড টেস্টারে পদ্ধতিগতভাবে সেগুলিকে একে একে চেষ্টা করেন, আপনি বুঝতে পারবেন যে অ্যাসিস্ট্যান্ট এবং ক্যাপচার বোতামগুলি কাজ করে না। এমনকি যদি গেমপ্যাড স্পেকে সংজ্ঞায়িত গেমপ্যাড buttons অ্যাট্রিবিউট ওপেন-এন্ডেড হয়, যেহেতু স্ট্যাডিয়া কন্ট্রোলার একটি স্ট্যান্ডার্ড গেমপ্যাড হিসাবে প্রদর্শিত হয়, শুধুমাত্র 0-16 বোতামগুলি ম্যাপ করা হয়। আপনি এখনও অন্যান্য বোতামগুলি ব্যবহার করতে পারেন, তবে বেশিরভাগ গেমগুলি তাদের উপস্থিত থাকার আশা করবে না।

উদ্ধারের জন্য WebHID

WebHID API-এর জন্য ধন্যবাদ, আপনি 17 এবং 18 অনুপস্থিত বোতামগুলির সাথে কথা বলতে পারেন। এবং আপনি যদি সত্যিই চান তবে আপনি গেমপ্যাড API এর মাধ্যমে ইতিমধ্যে উপলব্ধ অন্যান্য সমস্ত বোতাম এবং অক্ষ সম্পর্কে ডেটাও পেতে পারেন। প্রথম ধাপ হল Stadia কন্ট্রোলার কীভাবে অপারেটিং সিস্টেমে রিপোর্ট করে তা খুঁজে বের করা। এটি করার একটি উপায় হল যেকোন র্যান্ডম পৃষ্ঠায় Chrome DevTools কনসোল খোলা এবং WebHID API থেকে ডিভাইসগুলির একটি ফিল্টার না করা তালিকার অনুরোধ করা৷ তারপরে আপনি আরও পরিদর্শনের জন্য ম্যানুয়ালি স্ট্যাডিয়া কন্ট্রোলার বেছে নিন। একটি খালি filters অপশন অ্যারে পাস করে ডিভাইসগুলির একটি ফিল্টার না করা তালিকা পান৷

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

পিকারে, শেষ পর্যন্ত প্রবেশটি Stadia কন্ট্রোলারের মতো দেখায়।

WebHID API ডিভাইস পিকার কিছু অসংলগ্ন ডিভাইস দেখায় এবং Stadia কন্ট্রোলার চূড়ান্ত অবস্থানে।

"Stadia Controller rev. A" ডিভাইস নির্বাচন করার পর, কনসোলে HIDDevice অবজেক্টটি লগ করুন। এটি স্ট্যাডিয়া কন্ট্রোলারের productId ( 37888 , যা হেক্সে 0x9400 ) এবং vendorId ( 6353 , যা হেক্সে 0x18d1 ) প্রকাশ করে। আপনি যদি অফিসিয়াল ইউএসবি ভেন্ডর আইডি টেবিলে vendorID খোঁজেন, তাহলে আপনি যা আশা করবেন সেই 6353 মানচিত্র দেখতে পাবেন: Google Inc.

Chrome DevTools Console HIDDevice অবজেক্ট লগ করার আউটপুট দেখাচ্ছে।

উপরে বর্ণিত প্রবাহের একটি বিকল্প হল URL বারে chrome://device-log/ এ নেভিগেট করা, ক্লিয়ার বোতাম টিপে, আপনার Stadia কন্ট্রোলার প্লাগ ইন করা এবং তারপর রিফ্রেশ টিপুন। এটি আপনাকে একই তথ্য প্রদান করে।

chrome://device-log ডিবাগ ইন্টারফেস প্লাগ-ইন Stadia কন্ট্রোলার সম্পর্কে তথ্য দেখায়।

তবুও আরেকটি বিকল্প হল HID এক্সপ্লোরার টুল ব্যবহার করা যা আপনাকে আপনার কম্পিউটারের সাথে সংযুক্ত HID ডিভাইসগুলির আরও বিস্তারিত অন্বেষণ করতে দেয়।

এখন সঠিক WebHID ডিভাইসের জন্য সঠিকভাবে ফিল্টার করে পিকারে যা দেখানো হয়েছে তা পরিমার্জন করতে এই দুটি আইডি, vendorId এবং productId ব্যবহার করুন।

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

এখন সমস্ত অসংলগ্ন ডিভাইস থেকে আওয়াজ চলে গেছে, এবং শুধুমাত্র Stadia কন্ট্রোলার দেখা যাচ্ছে।

WebHID API ডিভাইস পিকার শুধুমাত্র Stadia কন্ট্রোলার দেখাচ্ছে।

পরবর্তীতে, open() পদ্ধতিতে কল করে HIDDevice খুলুন।

await stadiaController.open();

HIDDevice আবার লগ করুন, এবং opened পতাকা true সেট করা হয়েছে।

Chrome DevTools কনসোল HIDDevice অবজেক্ট খোলার পরে লগ করার আউটপুট দেখাচ্ছে৷

ডিভাইস খোলার সাথে, একটি ইভেন্ট লিসেনার সংযুক্ত করে ইনকামিং inputreport ইভেন্টগুলি শুনুন৷

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

আপনি যখন কন্ট্রোলারে সহকারী বোতাম টিপুন এবং যেতে দেন, তখন দুটি ইভেন্ট কনসোলে লগ ইন করা হয়। আপনি সেগুলিকে " সহকারী বোতাম ডাউন" এবং " অ্যাসিস্ট্যান্ট বাটন আপ" ইভেন্ট হিসাবে ভাবতে পারেন। timeStamp ছাড়াও, দুটি ইভেন্টকে প্রথম নজরে আলাদা করা যায় না।

Chrome DevTools কনসোল HIDINputReportEvent অবজেক্টগুলি লগ করা দেখাচ্ছে৷

HIDInputReportEvent ইন্টারফেসের reportId বৈশিষ্ট্য এই প্রতিবেদনের জন্য এক-বাইট সনাক্তকরণ উপসর্গ প্রদান করে, অথবা যদি HID ইন্টারফেস রিপোর্ট ID ব্যবহার না করে তাহলে 0 । এই ক্ষেত্রে এটি 3 . গোপন তথ্যটি data প্রপার্টিতে রয়েছে, যা 10 আকারের DataView হিসাবে উপস্থাপিত হয়। একটি DataView বাইনারি ArrayBuffer একাধিক সংখ্যার ধরন পড়তে এবং লেখার জন্য একটি নিম্ন-স্তরের ইন্টারফেস প্রদান করে। এই উপস্থাপনা থেকে আরও হজমযোগ্য কিছু পাওয়ার উপায় হল ArrayBuffer থেকে একটি Uint8Array তৈরি করা, যাতে আপনি স্বতন্ত্র 8-বিট স্বাক্ষরবিহীন পূর্ণসংখ্যা দেখতে পারেন।

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

আপনি যখন ইনপুট রিপোর্ট ইভেন্ট ডেটা আবার লগ করেন, তখন জিনিসগুলি আরও বোধগম্য হতে শুরু করে এবং " সহকারী বোতাম ডাউন" এবং " অ্যাসিস্ট্যান্ট বোতাম আপ" ইভেন্টগুলি পাঠযোগ্য হতে শুরু করে। প্রথম পূর্ণসংখ্যা (উভয় ইভেন্টে 8 ) বোতাম প্রেসের সাথে সম্পর্কিত বলে মনে হচ্ছে এবং দ্বিতীয় পূর্ণসংখ্যা ( 2 এবং 0 ) সহকারী বোতাম টিপছে কিনা তার সাথে সম্পর্কিত বলে মনে হচ্ছে।

Chrome DevTools কনসোল Uint8Array অবজেক্টগুলিকে প্রতিটি HIDInputReportEvent এর জন্য লগ করা দেখাচ্ছে৷

অ্যাসিস্ট্যান্ট বোতামের পরিবর্তে ক্যাপচার বোতাম টিপুন, এবং আপনি দেখতে পাবেন যে দ্বিতীয় পূর্ণসংখ্যাটি 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');
    }
  }
});

এইরকম একটি বিপরীত-ইঞ্জিনিয়ারিং পদ্ধতি ব্যবহার করে, আপনি, বোতাম দ্বারা বোতাম এবং অক্ষ দ্বারা অক্ষ, WebHID-এর সাথে Stadia কন্ট্রোলারের সাথে কীভাবে কথা বলতে হয় তা নির্ধারণ করতে পারেন। একবার আপনি এটি হ্যাং পেতে, বাকি প্রায় যান্ত্রিক পূর্ণসংখ্যা ম্যাপিং কাজ.

একটি জিনিস যা এখন অনুপস্থিত তা হল মসৃণ সংযোগের অভিজ্ঞতা যা গেমপ্যাড API আপনাকে দেয়। যদিও নিরাপত্তার কারণে Stadia কন্ট্রোলারের মতো একটি WebHID ডিভাইসের সাথে কাজ করার জন্য আপনাকে সবসময় প্রাথমিক পিকার অভিজ্ঞতার মধ্য দিয়ে যেতে হবে, ভবিষ্যতে সংযোগের জন্য, আপনি পরিচিত ডিভাইসগুলির সাথে পুনরায় সংযোগ করতে পারেন। getDevices() পদ্ধতিতে কল করে এটি করুন।

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

ডেমো

আপনি আমার তৈরি ডেমোতে গেমপ্যাড এপিআই এবং ওয়েবএইচআইডি এপিআই দ্বারা যৌথভাবে নিয়ন্ত্রিত Stadia কন্ট্রোলার দেখতে পাবেন। এই নিবন্ধের স্নিপেটগুলির উপর ভিত্তি করে সোর্স কোডটি পরীক্ষা করতে ভুলবেন না। সরলতার জন্য, আমি শুধুমাত্র A , B , X , এবং Y বোতামগুলি (গেমপ্যাড API দ্বারা নিয়ন্ত্রিত), এবং সহকারী এবং ক্যাপচার বোতামগুলি (WebHID API দ্বারা নিয়ন্ত্রিত) প্রদর্শন করি৷ কন্ট্রোলার ইমেজের নীচে, আপনি কাঁচা WebHID ডেটা দেখতে পারেন, যাতে আপনি কন্ট্রোলারের সমস্ত বোতাম এবং অক্ষগুলির জন্য একটি অনুভূতি পেতে পারেন৷

https://stadia-controller-webhid-gamepad.glitch.me/ এ ডেমো অ্যাপ A, B, X, এবং Y বোতামগুলি গেমপ্যাড API দ্বারা নিয়ন্ত্রিত হচ্ছে এবং সহকারী এবং ক্যাপচার বোতামগুলি দ্বারা নিয়ন্ত্রিত হচ্ছে WebHID API।

উপসংহার

নতুন ফার্মওয়্যারের জন্য ধন্যবাদ, Stadia কন্ট্রোলার এখন 17 বোতাম সহ একটি আদর্শ গেমপ্যাড হিসাবে ব্যবহারযোগ্য, যা বেশিরভাগ ক্ষেত্রে সাধারণ ওয়েব গেমগুলি নিয়ন্ত্রণ করার জন্য যথেষ্ট। যদি, যে কারণেই হোক, আপনার কন্ট্রোলারের সমস্ত 19টি বোতাম থেকে ডেটার প্রয়োজন হলে, WebHID আপনাকে নিম্ন-স্তরের ইনপুট রিপোর্টগুলিতে অ্যাক্সেস পেতে দেয় যেগুলিকে আপনি একের পর এক রিভার্স-ইঞ্জিনিয়ারিং করে পাঠোদ্ধার করতে পারেন৷ আপনি যদি এই নিবন্ধটি পড়ার পরে একটি সম্পূর্ণ WebHID ড্রাইভার লিখতে চান, তাহলে আমার সাথে যোগাযোগ করতে ভুলবেন না এবং আমি আনন্দের সাথে আপনার প্রকল্পটি এখানে লিঙ্ক করব। শুভ WebHIDing!

স্বীকৃতি

এই নিবন্ধটি François Beaufort দ্বারা পর্যালোচনা করা হয়েছে.