হেড ট্র্যাকার হিউম্যান ইন্টারফেস ডিভাইস (এইচআইডি) প্রোটোকল, যা অ্যান্ড্রয়েড ১৩ এবং তার পরবর্তী সংস্করণ চালিত ডিভাইসগুলোর জন্য উপলব্ধ, একটি হেড-ট্র্যাকিং ডিভাইসকে ইউএসবি বা ব্লুটুথের মাধ্যমে একটি অ্যান্ড্রয়েড ডিভাইসের সাথে সংযুক্ত করতে এবং সেন্সর ফ্রেমওয়ার্কের মাধ্যমে অ্যান্ড্রয়েড ফ্রেমওয়ার্ক ও অ্যাপগুলোতে উন্মুক্ত করতে দেয়। এই প্রোটোকলটি একটি অডিও ভার্চুয়ালাইজার এফেক্ট (থ্রিডি অডিও) নিয়ন্ত্রণের জন্য ব্যবহৃত হয়। এই পৃষ্ঠায় 'ডিভাইস' এবং 'হোস্ট' শব্দ দুটি তাদের ব্লুটুথ অর্থে ব্যবহৃত হয়েছে, যেখানে 'ডিভাইস' বলতে হেড-ট্র্যাকিং ডিভাইস এবং ' হোস্ট' বলতে অ্যান্ড্রয়েড হোস্টকে বোঝানো হয়েছে।
ডিভাইস প্রস্তুতকারকদের অবশ্যই তাদের অ্যান্ড্রয়েড ডিভাইসগুলিতে হেড ট্র্যাকার HID প্রোটোকলের সমর্থন সক্রিয় করার জন্য কনফিগার করতে হবে। কনফিগারেশন সম্পর্কে আরও বিস্তারিত তথ্যের জন্য, ডায়নামিক সেন্সর README দেখুন।
এই পৃষ্ঠাটি পড়ার জন্য ধরে নেওয়া হচ্ছে যে নিম্নলিখিত উৎসগুলো সম্পর্কে আপনার পূর্বপরিচিতি রয়েছে:
শীর্ষ-স্তরের কাঠামো
অ্যান্ড্রয়েড ফ্রেমওয়ার্ক হেড ট্র্যাকার ডিভাইসটিকে একটি HID ডিভাইস হিসেবে শনাক্ত করে।
একটি বৈধ HID ডেসক্রিপ্টরের পূর্ণাঙ্গ উদাহরণের জন্য, পরিশিষ্ট ১: HID ডেসক্রিপ্টরের উদাহরণ দেখুন।
সর্বোচ্চ স্তরে, হেড ট্র্যাকার ডিভাইসটি হলো একটি অ্যাপ কালেকশন, যার মধ্যে Sensors পেজ ( 0x20 ) এবং Other: Custom ব্যবহার ( 0xE1 ) রয়েছে। এই কালেকশনের ভিতরে বেশ কয়েকটি ডেটা ফিল্ড ( ইনপুট ) এবং প্রোপার্টি ( ফিচার ) আছে।
বৈশিষ্ট্য এবং ডেটা ক্ষেত্র
এই অংশে একটি হেড ট্র্যাকার ডিভাইসের অ্যাপ্লিকেশন কালেকশনে থাকা বৈশিষ্ট্য এবং ডেটা ফিল্ডগুলো বর্ণনা করা হয়েছে।
বৈশিষ্ট্য: সেন্সরের বিবরণ ( 0x0308 )
সেন্সর বিবরণ ( 0x0308 ) প্রপার্টিটি একটি রিড-অনলি ASCII (8-বিট) স্ট্রিং প্রপার্টি যাতে অবশ্যই নিম্নলিখিত মানগুলি থাকতে হবে:
হেড ট্র্যাকার সংস্করণ ১.০:
#AndroidHeadTracker#1.0
হেড ট্র্যাকার ভার্সন ২.০ (অ্যান্ড্রয়েড ১৫ বা তার পরবর্তী সংস্করণে উপলব্ধ), যেটিতে এলই অডিও-এর সাপোর্ট অন্তর্ভুক্ত রয়েছে:
#AndroidHeadTracker#2.0#x
x হলো একটি পূর্ণসংখ্যা ( 1 , 2 , 3 ) যা সহায়ক পরিবহন নির্দেশ করে:
- ১: এসিএল
- ২: আইএসও
- 3: ACL + ISO
কোনো নাল-টার্মিনেটর প্রত্যাশিত নয়, যার অর্থ হলো সংস্করণ ১.০-এর জন্য এই প্রপার্টিটির মোট আকার হলো ২৩টি ৮-বিট ক্যারেক্টার।
এই বৈশিষ্ট্যটি অন্যান্য কাস্টম সেন্সরের সাথে সংঘর্ষ এড়ানোর জন্য একটি বিভেদক হিসেবে কাজ করে।
বৈশিষ্ট্য: স্থায়ী অনন্য আইডি ( 0x0302 )
স্থায়ী অনন্য আইডি ( 0x0302 ) প্রপার্টিটি হলো ১৬টি উপাদানের একটি রিড-অনলি অ্যারে, যার প্রতিটি ৮ বিটের (মোট ১২৮ বিট)। কোনো নাল টার্মিনেটর প্রত্যাশিত নয়। এই প্রপার্টিটি ঐচ্ছিক।
এই বৈশিষ্ট্যটি অডিও ডিভাইসে সমন্বিত হেড-ট্র্যাকিং ডিভাইসগুলোকে তাদের সাথে সংযুক্ত অডিও ডিভাইসটিকে রেফারেন্স করার সুযোগ দেয়। নিম্নলিখিত স্কিমগুলো সমর্থিত।
স্বতন্ত্র হেড ট্র্যাকার
যদি পারসিস্টেন্ট ইউনিক আইডি ( 0x0302 ) প্রপার্টিটি বিদ্যমান না থাকে বা এর মান সব শূন্য হয়, তার মানে হলো হেড ট্র্যাকার ডিভাইসটি কোনো অডিও ডিভাইসের সাথে স্থায়ীভাবে সংযুক্ত নয় এবং এটি আলাদাভাবে ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ, ব্যবহারকারী নিজে থেকে হেড ট্র্যাকার ডিভাইসটিকে একটি আলাদা অডিও ডিভাইসের সাথে যুক্ত করতে পারবেন।
ব্লুটুথ ম্যাক অ্যাড্রেস ব্যবহার করে রেফারেন্স
| অক্টেট | ০ | ১ | ২ | ৩ | ৪ | ৫ | ৬ | ৭ | ৮ | ৯ | ১০ | ১১ | ১২ | ১৩ | ১৪ | ১৫ |
| মূল্য | ০ | ০ | ০ | ০ | ০ | ০ | ০ | ০ | বি | টি | ব্লুটুথ ম্যাক | |||||
এই স্কিমে, প্রথম ৮টি অক্টেট অবশ্যই 0 হতে হবে, ৮ম এবং ৯ম অক্টেটে যথাক্রমে B এবং T ASCII মান থাকতে হবে, এবং পরবর্তী ৬টি অক্টেটকে একটি ব্লুটুথ MAC অ্যাড্রেস হিসেবে ব্যাখ্যা করা হয়, এই শর্তে যে হেড ট্র্যাকার ডিভাইসটি এই MAC অ্যাড্রেসযুক্ত যেকোনো অডিও ডিভাইসের জন্য প্রযোজ্য। এই অ্যাড্রেসটি অবশ্যই আইডেন্টিটি অ্যাড্রেস হতে হবে, এমনকি যদি ডিভাইসটি সংযোগ স্থাপনের জন্য একটি র্যান্ডম MAC অ্যাড্রেস ব্যবহার করে থাকে। ব্লুটুথ ক্লাসিক (v1.0 HID ফরম্যাট) এবং ব্লুটুথ LE (v2.0 HID ফরম্যাট)-এর মাধ্যমে সংযোগকারী ডুয়াল-মোড ডিভাইসগুলোকে অবশ্যই একই আইডেন্টিটি অ্যাড্রেসসহ দুটি HID ডেসক্রিপ্টর প্রকাশ করতে হবে। পৃথক বাম এবং ডান ডিভাইসযুক্ত ডুয়াল-মোড ডিভাইসগুলোকে অবশ্যই শুধুমাত্র LE-যুক্ত সেকেন্ডারি ডিভাইসের পরিবর্তে প্রাইমারি ডুয়াল-মোড ডিভাইসটি ব্যবহার করে ব্লুটুথ LE HID প্রকাশ করতে হবে।
UUID ব্যবহার করে রেফারেন্স
যখনই অক্টেট ৮-এর সর্বাধিক গুরুত্বপূর্ণ বিট (MSB) সেট করা হয় ( ≥0x80 ), তখন RFC-4122- এ নির্দিষ্ট করা অনুযায়ী ফিল্ডটিকে একটি UUID হিসাবে ব্যাখ্যা করা হয়। সংশ্লিষ্ট অডিও ডিভাইসটি ব্যবহৃত ট্রান্সপোর্টের ধরনের উপর নির্ভরশীল একটি অনির্দিষ্ট পদ্ধতির মাধ্যমে একই UUID সরবরাহ করে, যা অ্যান্ড্রয়েড ফ্রেমওয়ার্কে নিবন্ধিত থাকে।
সম্পত্তি: রিপোর্টিং অবস্থা ( 0x0316 )
রিপোর্টিং স্টেট ( 0x0316 ) প্রপার্টিটি একটি রিড/রাইট প্রপার্টি, যার অর্থ HID স্পেসিফিকেশনে সংজ্ঞায়িত স্ট্যান্ডার্ড অর্থ অনুযায়ী। হোস্ট এই প্রপার্টিটি ব্যবহার করে ডিভাইসকে নির্দেশ করে যে কোন ইভেন্টগুলো রিপোর্ট করতে হবে। শুধুমাত্র নো ইভেন্টস ( 0x0840 ) এবং অল ইভেন্টস ( 0x0841 ) ভ্যালুগুলোই ব্যবহৃত হয়।
এই ফিল্ডের প্রাথমিক মান অবশ্যই 'কোনো ইভেন্ট নেই' হতে হবে এবং এটি ডিভাইস দ্বারা কখনোই পরিবর্তন করা যাবে না, শুধুমাত্র হোস্টই তা পরিবর্তন করতে পারবে।
বৈশিষ্ট্য: পাওয়ার স্টেট ( 0x0319 )
পাওয়ার স্টেট ( 0x0319 ) প্রপার্টিটি একটি রিড/রাইট প্রপার্টি, যার অর্থ HID স্পেসিফিকেশনে সংজ্ঞায়িত স্ট্যান্ডার্ড অর্থ অনুযায়ী। হোস্ট এই প্রপার্টিটি ব্যবহার করে ডিভাইসকে নির্দেশ করে যে তাকে কোন পাওয়ার স্টেটে থাকতে হবে। শুধুমাত্র ফুল পাওয়ার ( 0x0851 ) এবং পাওয়ার অফ ( 0x0855 ) মান দুটি ব্যবহৃত হয়।
এই ফিল্ডের প্রাথমিক মান ডিভাইস দ্বারা নির্ধারিত হয় এবং এটি ডিভাইস দ্বারা কখনোই পরিবর্তন করা যাবে না, শুধুমাত্র হোস্টই তা পরিবর্তন করতে পারবে।
প্রপার্টি: রিপোর্ট ইন্টারভাল ( 0x030E )
রিপোর্ট ইন্টারভ্যাল ( 0x030E ) প্রপার্টিটি একটি রিড/রাইট প্রপার্টি, যার অর্থ HID স্পেসিফিকেশনে সংজ্ঞায়িত স্ট্যান্ডার্ড অর্থ অনুযায়ী। হোস্ট এই প্রপার্টিটি ব্যবহার করে ডিভাইসকে নির্দেশ করে যে কত ঘন ঘন তার ডেটা রিডিং রিপোর্ট করতে হবে। এর একক হলো সেকেন্ড। এই মানের বৈধ পরিসীমা ডিভাইস দ্বারা নির্ধারিত হয় এবং ফিজিক্যাল মিন/ম্যাক্স মেকানিজম ব্যবহার করে বর্ণনা করা হয়। কমপক্ষে ৫০ হার্জ রিপোর্টিং রেট সমর্থন করতে হবে এবং প্রস্তাবিত সর্বোচ্চ রিপোর্টিং রেট হলো ১০০ হার্জ। অতএব, সর্বনিম্ন রিপোর্ট ইন্টারভ্যাল অবশ্যই ২০ মিলিসেকেন্ডের কম বা সমান হতে হবে এবং এটি ১০ মিলিসেকেন্ডের বেশি বা সমান হওয়ার পরামর্শ দেওয়া হয়।
সম্পত্তি: বিক্রেতা-সংরক্ষিত এলই ট্রান্সপোর্ট ( 0xF410 )
ভেন্ডর-রিজার্ভড LE ট্রান্সপোর্ট ( 0xF410 ) প্রপার্টিটি একটি রিড/রাইট প্রপার্টি, যার অর্থ HID স্পেসিফিকেশনে সংজ্ঞায়িত স্ট্যান্ডার্ড অর্থ অনুযায়ী। হোস্ট এই প্রপার্টিটি ব্যবহার করে নির্বাচিত ট্রান্সপোর্ট (ACL বা ISO) নির্দেশ করে। শুধুমাত্র ACL ( 0xF800 ) এবং ISO ( 0xF801 ) মান দুটি ব্যবহৃত হয়, এবং উভয়কেই লজিক্যাল কালেকশনে অন্তর্ভুক্ত থাকতে হবে।
এই প্রপার্টিটি পাওয়ার বা রিপোর্টিং স্টেটের পূর্বে কনফিগার করা হয়।
ডেটা ফিল্ড: কাস্টম মান 1 ( 0x0544 )
কাস্টম ভ্যালু ১ ( 0x0544 ) ফিল্ডটি প্রকৃত হেড-ট্র্যাকিং তথ্য জানানোর জন্য ব্যবহৃত একটি ইনপুট ফিল্ড। এটি একটি ৩-উপাদানের অ্যারে, যা HID স্পেসিফিকেশনের ৬.২.২.৭ অনুচ্ছেদে উল্লেখিত ভৌত মানের জন্য সাধারণ HID নিয়ম অনুসারে ব্যাখ্যা করা হয়। প্রতিটি উপাদানের বৈধ পরিসর হলো [-π, π] রেডিয়ান। একক সর্বদা রেডিয়ান।
উপাদানগুলোকে [rx, ry, rz] হিসেবে ব্যাখ্যা করা হয়, যেখানে [rx, ry, rz] হলো একটি ঘূর্ণন ভেক্টর , যা রেফারেন্স ফ্রেম থেকে হেড ফ্রেমে রূপান্তরকে প্রতিনিধিত্ব করে। এর মান অবশ্যই [0..π] সীমার মধ্যে থাকতে হবে।
রেফারেন্স ফ্রেমটি ইচ্ছামত হতে পারে, তবে এটি সাধারণত স্থির থাকে এবং অবশ্যই ডান-হাতি হতে হবে। সামান্য বিচ্যুতি গ্রহণযোগ্য। হেড অ্যাক্সিসগুলো হলো:
- বাম কান থেকে ডান কান পর্যন্ত X
- মাথার পেছন থেকে নাক পর্যন্ত Y (পিছন থেকে সামনে)
- ঘাড় থেকে মাথার শীর্ষ পর্যন্ত Z
ডেটা ফিল্ড: কাস্টম মান 2 ( 0x0545 )
কাস্টম ভ্যালু ২ ( 0x0545 ) ফিল্ডটি প্রকৃত হেড-ট্র্যাকিং তথ্য জানানোর জন্য ব্যবহৃত একটি ইনপুট ফিল্ড। এটি একটি ৩-উপাদান বিশিষ্ট ফিক্সড-পয়েন্ট অ্যারে, যা ভৌত মানের জন্য সাধারণ HID নিয়ম অনুসারে ব্যাখ্যা করা হয়। এর একক সর্বদা রেডিয়ান/সেকেন্ড।
উপাদানগুলোকে [vx, vy, vz] হিসেবে ব্যাখ্যা করা হয়, যেখানে [vx, vy, vz] হলো একটি ঘূর্ণন ভেক্টর , যা হেড ফ্রেমের কৌণিক বেগ (নিজের সাপেক্ষে) নির্দেশ করে।
ডেটা ফিল্ড: কাস্টম মান 3 ( 0x0546 )
কাস্টম ভ্যালু ৩ ( 0x0546 ) ফিল্ডটি একটি ইনপুট ফিল্ড যা রেফারেন্স ফ্রেমে বিচ্যুতি ট্র্যাক করার জন্য ব্যবহৃত হয়। এটি ৮-বিট আকারের একটি স্কেলার ইন্টিজার। প্রতিবার রেফারেন্স ফ্রেম পরিবর্তিত হলে, যেমন ওরিয়েন্টেশন নির্ধারণের জন্য ব্যবহৃত কোনো ওরিয়েন্টেশন ফিল্টার অ্যালগরিদমের অবস্থা রিসেট হলে, ডিভাইস দ্বারা এটিকে অবশ্যই (র্যাপারউন্ড সহ) ইনক্রিমেন্ট করতে হবে। এই মানটি ফিজিক্যাল ভ্যালুর জন্য সাধারণ HID নিয়ম অনুসারে ব্যাখ্যা করা হয়। তবে, ফিজিক্যাল ভ্যালু এবং ইউনিট এখানে বিবেচ্য নয়। হোস্টের জন্য একমাত্র প্রাসঙ্গিক তথ্য হলো পরিবর্তিত মান। লজিক্যাল থেকে ফিজিক্যাল ইউনিটে রূপান্তর করার সময় নির্ভুলতা হ্রাসের সাথে সম্পর্কিত সাংখ্যিক সমস্যা এড়াতে, এই ফিল্ডের জন্য ফিজিক্যাল মিন, ফিজিক্যাল ম্যাক্স এবং ইউনিট এক্সপোনেন্টের মান শূন্যতে সেট করার পরামর্শ দেওয়া হয়।
প্রতিবেদনের কাঠামো
প্রপার্টিগুলোকে রিপোর্টে (রিপোর্ট আইডি নির্ধারণের মাধ্যমে) ভাগ করার প্রক্রিয়াটি নমনীয়। কার্যকারিতার জন্য, আমরা রিড-অনলি প্রপার্টিগুলোকে রিড/রাইট প্রপার্টিগুলো থেকে আলাদা করার পরামর্শ দিই।
ডেটা ফিল্ডগুলোর ক্ষেত্রে, কাস্টম ভ্যালু ১, ২, এবং ৩ ফিল্ডগুলো অবশ্যই একই রিপোর্টে থাকতে হবে এবং একটি নির্দিষ্ট ডিভাইসের (অ্যাপ কালেকশন) জন্য শুধুমাত্র একটি রিপোর্টেই এগুলো থাকবে।
ইনপুট রিপোর্ট পাঠান
যখন এই সমস্ত শর্ত পূরণ হবে, তখন ডিভাইসটিকে অবশ্যই পর্যায়ক্রমে এবং অ্যাসিঙ্ক্রোনাসভাবে (HID INPUT বার্তার মাধ্যমে) ইনপুট রিপোর্ট পাঠাতে হবে:
- পাওয়ার স্টেট প্রপার্টিটি ফুল পাওয়ার-এ সেট করা আছে।
- রিপোর্টিং স্টেট প্রপার্টিটি অল ইভেন্টস-এ সেট করা আছে।
- রিপোর্টিং ইন্টারভ্যাল প্রপার্টিটি অশূন্য।
রিপোর্টিং ইন্টারভ্যাল প্রপার্টিটি নির্ধারণ করে যে কত ঘন ঘন রিপোর্ট পাঠানো হবে। যখন উপরের কোনো শর্ত পূরণ হয় না, তখন ডিভাইসটি কোনো রিপোর্ট পাঠাবে না।
ফরোয়ার্ড এবং ব্যাকওয়ার্ড সামঞ্জস্যতা
হেড ট্র্যাকার (HID) প্রোটোকল এমন একটি ভার্সনিং স্কিম ব্যবহার করে যা আপডেটের সুযোগ দেয় এবং একই সাথে প্রোটোকলের ভিন্ন ভিন্ন ভার্সন ব্যবহারকারী হোস্ট ও ডিভাইসের মধ্যে আন্তঃকার্যক্ষমতা নিশ্চিত করে। প্রোটোকলের ভার্সনগুলো মেজর এবং মাইনর—এই দুটি সংখ্যা দ্বারা চিহ্নিত করা হয়, যেগুলোর স্বতন্ত্র অর্থ রয়েছে, যা পরবর্তী বিভাগগুলোতে বর্ণনা করা হয়েছে।
একটি ডিভাইস কোন কোন সংস্করণ সমর্থন করে তা তার সেন্সর বিবরণ ( 0x0308 ) বৈশিষ্ট্য পরীক্ষা করে নির্ধারণ করা যেতে পারে।
ক্ষুদ্র সংস্করণের সামঞ্জস্যতা
মাইনর ভার্সনের পরিবর্তনগুলো একই মেজর ভার্সনের উপর ভিত্তি করে তৈরি পূর্ববর্তী মাইনর ভার্সনগুলোর সাথে ব্যাকওয়ার্ড কম্প্যাটিবল। মাইনর ভার্সনের আপডেটের ক্ষেত্রে, হোস্ট অতিরিক্ত ডেটা ফিল্ড এবং প্রোপার্টিগুলো উপেক্ষা করে। উদাহরণস্বরূপ, প্রোটোকল ভার্সন ১.৬ ব্যবহারকারী একটি ডিভাইস এমন একটি হোস্টের সাথে কম্প্যাটিবল, যা প্রোটোকল ভার্সন ১.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 বর্ণনাকারী প্রদর্শন করে। এতে HID সেন্সর ব্যবহার (অনুচ্ছেদ ৪.১)-এ প্রদত্ত বহুল ব্যবহৃত C ম্যাক্রো ব্যবহার করা হয়েছে।
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,
};
পরিশিষ্ট ২: v2.0 HID বর্ণনাকারীর একটি উদাহরণ
নিম্নলিখিত উদাহরণটি এমন একটি ডিভাইসের জন্য একটি v2.0 HID ডেসক্রিপ্টর প্রদর্শন করে যা শুধুমাত্র ব্লুটুথ LE ACL ট্রান্সপোর্ট সমর্থন করে।
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#2.0#1"
HID_USAGE_SENSOR_PROPERTY_SENSOR_DESCRIPTION,
HID_LOGICAL_MIN_8(0),
HID_LOGICAL_MAX_8(0xFF),
HID_REPORT_SIZE(8),
HID_REPORT_COUNT(25),
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),
// 1-bit transport selection
HID_USAGE_SENSOR_PROPERTY_VENDOR_LE_TRANSPORT,
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_VENDOR_LE_TRANSPORT_ACL,
HID_USAGE_SENSOR_PROPERTY_VENDOR_LE_TRANSPORT_ISO,
HID_FEATURE(HID_DATA_ARR_ABS),
HID_END_COLLECTION,
// 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,
};