সেন্সর হার্ডওয়্যার অ্যাবস্ট্রাকশন লেয়ার (HAL) হলো অ্যান্ড্রয়েড সেন্সর ফ্রেমওয়ার্ক এবং ডিভাইসের সেন্সর, যেমন অ্যাক্সেলেরোমিটার বা জাইরোস্কোপের মধ্যেকার ইন্টারফেস। সেন্সর HAL সেই ফাংশনগুলোকে সংজ্ঞায়িত করে, যেগুলো ফ্রেমওয়ার্ককে সেন্সরগুলো নিয়ন্ত্রণ করার সুযোগ দেওয়ার জন্য অবশ্যই প্রয়োগ করতে হবে।
Sensors AIDL HAL নতুন এবং আপগ্রেড করা ডিভাইসগুলির জন্য Android 13 এবং তার পরবর্তী সংস্করণগুলিতে উপলব্ধ। Sensors AIDL HAL, যা Sensors HAL 2.1-এর উপর ভিত্তি করে তৈরি, AIDL HAL ইন্টারফেস ব্যবহার করে এবং হেড ট্র্যাকার ও লিমিটেড-অ্যাক্সিস IMU সেন্সর টাইপগুলিকে উন্মুক্ত করে।
AIDL HAL ইন্টারফেস
Sensors AIDL HAL-এর ডকুমেন্টেশনের প্রধান উৎসটি hardware/interfaces/sensors/aidl/android/hardware/sensors/ISensors.aidl-এ অবস্থিত HAL ডেফিনিশনের মধ্যে রয়েছে।
সেন্সর AIDL HAL বাস্তবায়ন করুন
Sensors AIDL HAL প্রয়োগ করতে হলে, একটি অবজেক্টকে অবশ্যই ISensors ইন্টারফেসটি এক্সটেন্ড করতে হবে এবং hardware/interfaces/sensors/aidl/android/hardware/sensors/ISensors.aidl- এ সংজ্ঞায়িত সমস্ত ফাংশন ইমপ্লিমেন্ট করতে হবে।
HAL শুরু করুন
সেন্সর HAL ব্যবহার করার আগে অ্যান্ড্রয়েড সেন্সর ফ্রেমওয়ার্ক দ্বারা এটিকে অবশ্যই ইনিশিয়ালাইজ করতে হবে। ফ্রেমওয়ার্কটি সেন্সর HAL-কে তিনটি প্যারামিটার সরবরাহ করার জন্য initialize() ফাংশনটি কল করে: দুটি FMQ ডেসক্রিপ্টর এবং একটি ISensorsCallback অবজেক্টের পয়েন্টার।
HAL প্রথম ডেসক্রিপ্টরটি ব্যবহার করে ইভেন্ট এফএমকিউ (Event FMQ) তৈরি করে, যা ফ্রেমওয়ার্কে সেন্সর ইভেন্টগুলো লেখার জন্য ব্যবহৃত হয়। HAL দ্বিতীয় ডেসক্রিপ্টরটি ব্যবহার করে ওয়েক লক এফএমকিউ (Wake Lock FMQ) তৈরি করে, যা WAKE_UP সেন্সর ইভেন্টের জন্য HAL কখন তার ওয়েক লক রিলিজ করবে তা সিনক্রোনাইজ করতে ব্যবহৃত হয়। HAL-কে অবশ্যই ISensorsCallback অবজেক্টের একটি পয়েন্টার সংরক্ষণ করতে হবে, যাতে যেকোনো প্রয়োজনীয় কলব্যাক ফাংশন আহ্বান করা যায়।
Sensors HAL ইনিশিয়ালাইজ করার সময় initialize() ফাংশনটি অবশ্যই সর্বপ্রথম কল করতে হবে।
উপলব্ধ সেন্সরগুলি উন্মোচন করুন
ডিভাইসে উপলব্ধ সমস্ত স্ট্যাটিক সেন্সরের একটি তালিকা পেতে, getSensorsList() ফাংশনটি ব্যবহার করুন। এই ফাংশনটি সেন্সরগুলির একটি তালিকা ফেরত দেয়, যার প্রতিটি তার হ্যান্ডেল দ্বারা অনন্যভাবে চিহ্নিত করা হয়। সেন্সর HAL হোস্টকারী প্রসেসটি পুনরায় চালু হলেও একটি নির্দিষ্ট সেন্সরের হ্যান্ডেল পরিবর্তন হওয়া উচিত নয়। ডিভাইস রিবুট এবং সিস্টেম সার্ভার পুনরায় চালুর কারণে হ্যান্ডেলগুলি পরিবর্তিত হতে পারে।
যদি একাধিক সেন্সরের একই সেন্সর টাইপ এবং ওয়েক-আপ প্রপার্টি থাকে, তাহলে তালিকার প্রথম সেন্সরটিকে ডিফল্ট সেন্সর বলা হয় এবং getDefaultSensor(int sensorType, bool wakeUp) ফাংশন ব্যবহারকারী অ্যাপগুলিতে এটিকে ফেরত পাঠানো হয়।
সেন্সর তালিকার স্থিতিশীলতা
সেন্সর HAL রিস্টার্টের পরে, যদি getSensorsList() দ্বারা ফেরত আসা ডেটা রিস্টার্টের আগে প্রাপ্ত সেন্সর তালিকার তুলনায় কোনো উল্লেখযোগ্য পরিবর্তন নির্দেশ করে, তাহলে ফ্রেমওয়ার্ক অ্যান্ড্রয়েড রানটাইম রিস্টার্ট করে। সেন্সর তালিকার উল্লেখযোগ্য পরিবর্তনের মধ্যে রয়েছে যখন একটি নির্দিষ্ট হ্যান্ডেলযুক্ত সেন্সর অনুপস্থিত থাকে বা তার অ্যাট্রিবিউট পরিবর্তিত হয়, অথবা যখন নতুন সেন্সর যুক্ত করা হয়। যদিও অ্যান্ড্রয়েড রানটাইম রিস্টার্ট করা ব্যবহারকারীর জন্য বিঘ্ন ঘটায়, এটি প্রয়োজনীয় কারণ অ্যান্ড্রয়েড ফ্রেমওয়ার্ক আর অ্যান্ড্রয়েড এপিআই চুক্তি পূরণ করতে পারে না, যেখানে বলা আছে যে একটি অ্যাপের জীবনকালে স্ট্যাটিক (নন-ডাইনামিক) সেন্সরগুলো পরিবর্তিত হবে না। এটি ফ্রেমওয়ার্ককে অ্যাপ দ্বারা করা সক্রিয় সেন্সর অনুরোধগুলো পুনরায় স্থাপন করতেও বাধা দিতে পারে। অতএব, HAL বিক্রেতাদের পরিহারযোগ্য সেন্সর তালিকার পরিবর্তন রোধ করার পরামর্শ দেওয়া হয়।
স্থিতিশীল সেন্সর হ্যান্ডেল নিশ্চিত করার জন্য, HAL-কে অবশ্যই ডিভাইসের একটি নির্দিষ্ট ফিজিক্যাল সেন্সরকে তার হ্যান্ডেলের সাথে সুনির্দিষ্টভাবে ম্যাপ করতে হবে। যদিও সেন্সর HAL ইন্টারফেস দ্বারা কোনো নির্দিষ্ট বাস্তবায়ন বাধ্যতামূলক করা হয়নি, ডেভেলপারদের কাছে এই প্রয়োজনীয়তা পূরণের জন্য বেশ কিছু বিকল্প উপলব্ধ রয়েছে।
উদাহরণস্বরূপ, প্রতিটি সেন্সরের নির্দিষ্ট অ্যাট্রিবিউট, যেমন ভেন্ডর, মডেল এবং সেন্সর টাইপের সমন্বয়ে সেন্সর তালিকাটি সাজানো যেতে পারে। আরেকটি বিকল্প এই সত্যের উপর নির্ভর করে যে, ডিভাইসটির স্ট্যাটিক সেন্সরগুলোর সেট হার্ডওয়্যারে স্থির করা থাকে, তাই getSensorsList() থেকে রিটার্ন করার আগে HAL-কে জানতে হয় কখন সমস্ত প্রত্যাশিত সেন্সরের ইনিশিয়ালাইজেশন সম্পন্ন হয়েছে। প্রত্যাশিত সেন্সরগুলোর এই তালিকাটি HAL বাইনারিতে কম্পাইল করা যেতে পারে অথবা ফাইল সিস্টেমের একটি কনফিগারেশন ফাইলে সংরক্ষণ করা যেতে পারে, এবং উপস্থিতির ক্রম ব্যবহার করে স্থিতিশীল হ্যান্ডেলগুলো বের করা যায়। যদিও সেরা সমাধানটি আপনার HAL-এর নির্দিষ্ট বাস্তবায়নের বিবরণের উপর নির্ভর করে, মূল শর্তটি হলো HAL রিস্টার্টের পরেও সেন্সর হ্যান্ডেলগুলো যেন পরিবর্তিত না হয়।
সেন্সর কনফিগার করুন
সেন্সর সক্রিয় করার আগে, batch() ফাংশন ব্যবহার করে সেটিকে একটি স্যাম্পলিং পিরিয়ড এবং সর্বোচ্চ রিপোর্টিং ল্যাটেন্সি দিয়ে কনফিগার করতে হবে।
সেন্সরের ডেটা নষ্ট না করে, batch() ফাংশন ব্যবহার করে যেকোনো সময় সেন্সরটিকে পুনরায় কনফিগার করার ব্যবস্থা থাকতে হবে।
নমুনা সংগ্রহের সময়কাল
কনফিগার করা সেন্সরের ধরনের ওপর ভিত্তি করে স্যাম্পলিং পিরিয়ডের অর্থ ভিন্ন হয়:
- অবিচ্ছিন্ন: সেন্সর ইভেন্টগুলো অবিচ্ছিন্ন হারে তৈরি হয়।
- অন-চেঞ্জ: ইভেন্টগুলো স্যাম্পলিং পিরিয়ডের চেয়ে দ্রুত তৈরি হয় না এবং পরিমাপকৃত মান পরিবর্তিত না হলে স্যাম্পলিং পিরিয়ডের চেয়ে ধীর গতিতেও তৈরি হতে পারে।
- এককালীন: নমুনা সংগ্রহের সময়কাল উপেক্ষা করা হয়।
- বিশেষ: আরও বিস্তারিত তথ্যের জন্য, সেন্সরের প্রকারভেদ দেখুন।
স্যাম্পলিং পিরিয়ড এবং সেন্সরের রিপোর্টিং মোডগুলোর মধ্যকার পারস্পরিক সম্পর্ক সম্পর্কে জানতে, রিপোর্টিং মোডসমূহ দেখুন।
সর্বোচ্চ রিপোর্টিং বিলম্ব
সর্বোচ্চ রিপোর্টিং ল্যাটেন্সি ন্যানোসেকেন্ডে সেই সর্বোচ্চ সময় নির্ধারণ করে, যে সময়ে SoC সজাগ থাকা অবস্থায় HAL-এর মাধ্যমে Event FMQ-তে লেখার আগে ইভেন্টগুলোকে হার্ডওয়্যার FIFO-তে বিলম্বিত ও সংরক্ষণ করা যায়।
শূন্য মান বোঝায় যে ইভেন্টগুলি পরিমাপ করার সাথে সাথেই রিপোর্ট করতে হবে, হয় FIFO সম্পূর্ণরূপে এড়িয়ে গিয়ে, অথবা সেন্সর থেকে একটি ইভেন্ট FIFO-তে উপস্থিত হওয়ার সাথে সাথেই FIFO খালি করে।
উদাহরণস্বরূপ, যখন SoC সক্রিয় থাকে, তখন ৫০ Hz-এ সক্রিয় এবং সর্বোচ্চ রিপোর্টিং ল্যাটেন্সি শূন্য এমন একটি অ্যাক্সেলেরোমিটার প্রতি সেকেন্ডে ৫০ বার ইন্টারাপ্ট ট্রিগার করে।
যখন সর্বোচ্চ রিপোর্টিং ল্যাটেন্সি শূন্যের চেয়ে বেশি হয়, তখন সেন্সর ইভেন্টগুলো শনাক্ত হওয়ার সাথে সাথেই রিপোর্ট করার প্রয়োজন হয় না। ইভেন্টগুলো হার্ডওয়্যার FIFO-তে সাময়িকভাবে সংরক্ষণ করা যায় এবং ব্যাচ আকারে রিপোর্ট করা যায়, যতক্ষণ পর্যন্ত কোনো ইভেন্ট সর্বোচ্চ রিপোর্টিং ল্যাটেন্সির চেয়ে বেশি বিলম্বিত না হয়। পূর্ববর্তী ব্যাচের পর থেকে সমস্ত ইভেন্ট একসাথে রেকর্ড এবং ফেরত পাঠানো হয়। এটি SoC-তে পাঠানো ইন্টারাপ্টের সংখ্যা কমিয়ে দেয় এবং সেন্সর যখন ডেটা ক্যাপচার ও ব্যাচিং করে, তখন SoC-কে একটি লো-পাওয়ার মোডে স্যুইচ করার সুযোগ দেয়।
প্রতিটি ঘটনার সাথে একটি টাইমস্ট্যাম্প যুক্ত থাকে। কোনো ঘটনা রিপোর্ট করার সময় বিলম্বিত হলেও তার টাইমস্ট্যাম্পের উপর কোনো প্রভাব পড়া যাবে না। টাইমস্ট্যাম্পটি অবশ্যই নির্ভুল হতে হবে এবং ঘটনাটি বাস্তবে ঘটার সময়ের সাথে মিল থাকতে হবে, রিপোর্ট করার সময়ের সাথে নয়।
অশূন্য সর্বোচ্চ রিপোর্টিং লেটেন্সি সহ সেন্সর ইভেন্ট রিপোর্ট করার বিষয়ে অতিরিক্ত তথ্য এবং প্রয়োজনীয়তার জন্য, ব্যাচিং দেখুন।
সেন্সর সক্রিয় করুন
ফ্রেমওয়ার্কটি activate() ফাংশন ব্যবহার করে সেন্সর চালু এবং বন্ধ করে। কোনো সেন্সর সক্রিয় করার আগে, ফ্রেমওয়ার্কটিকে অবশ্যই batch() ব্যবহার করে সেন্সরটি কনফিগার করতে হবে।
কোনো সেন্সর নিষ্ক্রিয় করার পর, সেই সেন্সর থেকে আসা অতিরিক্ত ইভেন্টগুলো ইভেন্ট এফএমকিউ-তে লেখা যাবে না।
ফ্লাশ সেন্সর
যদি কোনো সেন্সরকে সেন্সর ডেটা ব্যাচ করার জন্য কনফিগার করা থাকে, তাহলে ফ্রেমওয়ার্ক flush() কল করার মাধ্যমে ব্যাচ করা সেন্সর ইভেন্টগুলোকে অবিলম্বে ফ্লাশ করতে বাধ্য করতে পারে। এর ফলে নির্দিষ্ট সেন্সর হ্যান্ডেলের জন্য ব্যাচ করা সেন্সর ইভেন্টগুলো অবিলম্বে ইভেন্ট এফএমকিউ-তে লেখা হয়। flush() কলের ফলে যে সেন্সর ইভেন্টগুলো লেখা হয়, সেন্সরস এইচএএল-কে অবশ্যই সেগুলোর শেষে একটি ফ্লাশ কমপ্লিট ইভেন্ট যুক্ত করতে হবে।
ফ্লাশ প্রক্রিয়াটি অ্যাসিঙ্ক্রোনাসভাবে সম্পন্ন হয় (অর্থাৎ, এই ফাংশনটিকে অবশ্যই অবিলম্বে রিটার্ন করতে হবে)। যদি ইমপ্লিমেন্টেশনে একাধিক সেন্সরের জন্য একটিমাত্র FIFO ব্যবহার করা হয়, তবে শুধুমাত্র নির্দিষ্ট সেন্সরটির জন্যই সেই FIFO-টি ফ্লাশ করা হয় এবং ফ্লাশ সম্পন্ন হওয়ার ইভেন্টটি যুক্ত করা হয়।
যদি নির্দিষ্ট সেন্সরটিতে কোনো FIFO না থাকে (অর্থাৎ বাফারিং সম্ভব না হয়), অথবা কল করার সময় FIFO-টি খালি থাকে, তবুও flush() ফাংশনটি অবশ্যই সফল হবে এবং সেই সেন্সরটির জন্য একটি flush complete ইভেন্ট পাঠাবে। এটি ওয়ান-শট সেন্সর ছাড়া অন্য সব সেন্সরের ক্ষেত্রে প্রযোজ্য।
যদি কোনো ওয়ান-শট সেন্সরের জন্য flush() কল করা হয়, তাহলে flush() অবশ্যই BAD_VALUE রিটার্ন করবে এবং কোনো flush complete ইভেন্ট তৈরি করবে না।
সেন্সর ইভেন্টগুলো FMQ-তে লিখুন
সেন্সর HAL দ্বারা ইভেন্ট FMQ ব্যবহার করা হয় অ্যান্ড্রয়েড সেন্সর ফ্রেমওয়ার্কে সেন্সর ইভেন্টগুলো পাঠানোর জন্য।
ইভেন্ট এফএমকিউ একটি সিনক্রোনাইজড এফএমকিউ, যার অর্থ হলো, উপলব্ধ স্থানের চেয়ে বেশি ইভেন্ট লেখার যেকোনো প্রচেষ্টা ব্যর্থ হয়। এমন ক্ষেত্রে, এইচএএল-কে নির্ধারণ করতে হবে যে বর্তমান ইভেন্ট সেটটিকে দুটি ছোট ছোট দলে লেখা হবে, নাকি পর্যাপ্ত স্থান উপলব্ধ হলে সমস্ত ইভেন্ট একসাথে লেখা হবে।
যখন সেন্সরস এইচএএল (Sensors HAL) ইভেন্ট এফএমকিউ (Event FMQ)-তে কাঙ্ক্ষিত সংখ্যক সেন্সর ইভেন্ট লিখে ফেলে, তখন সেন্সরস এইচএএল-কে অবশ্যই ইভেন্ট এফএমকিউ-এর EventFlag::wake ফাংশনে EventQueueFlagBits::READ_AND_PROCESS বিটটি লিখে ফ্রেমওয়ার্ককে জানাতে হবে যে ইভেন্টগুলো প্রস্তুত। ইভেন্ট এফএমকিউ থেকে EventFlag::createEventFlag এবং Event FMQ-এর getEventFlagWord() ফাংশন ব্যবহার করে ইভেন্টফ্ল্যাগ (EventFlag) তৈরি করা যায়।
সেন্সর AIDL HAL, ইভেন্ট FMQ-তে write এবং writeBlocking উভয়ই সমর্থন করে। ডিফল্ট ইমপ্লিমেন্টেশনটি write ব্যবহারের জন্য একটি রেফারেন্স প্রদান করে। যদি writeBlocking ফাংশনটি ব্যবহার করা হয়, তাহলে readNotification ফ্ল্যাগটি অবশ্যই EventQueueFlagBits::EVENTS_READ এ সেট করতে হবে, যা ফ্রেমওয়ার্ক ইভেন্ট FMQ থেকে ইভেন্ট পড়ার সময় সেট করে। write notification ফ্ল্যাগটি অবশ্যই EventQueueFlagBits::READ_AND_PROCESS এ সেট করতে হবে, যা ফ্রেমওয়ার্ককে জানায় যে ইভেন্টগুলো ইভেন্ট FMQ-তে লেখা হয়েছে।
ওয়েক_আপ ইভেন্টগুলি
WAKE_UP ইভেন্ট হলো সেন্সর ইভেন্ট যা অ্যাপ্লিকেশন প্রসেসরকে (AP) জাগিয়ে তোলে এবং অবিলম্বে ইভেন্টটি পরিচালনা করতে বাধ্য করে। যখনই Event FMQ-তে একটি WAKE_UP ইভেন্ট লেখা হয়, তখন Sensors HAL-কে অবশ্যই একটি ওয়েক লক সুরক্ষিত করতে হয়, যাতে ফ্রেমওয়ার্ক ইভেন্টটি পরিচালনা না করা পর্যন্ত সিস্টেমটি সজাগ থাকে। একটি WAKE_UP ইভেন্ট গ্রহণ করার পর, ফ্রেমওয়ার্ক তার নিজের ওয়েক লক সুরক্ষিত করে, যা Sensors HAL-কে তার ওয়েক লকটি মুক্ত করার সুযোগ দেয়। Sensors HAL কখন তার ওয়েক লক মুক্ত করবে তার সাথে সিঙ্ক্রোনাইজ করতে Wake Lock FMQ ব্যবহার করুন।
ফ্রেমওয়ার্ক কতগুলো WAKE_UP ইভেন্ট হ্যান্ডেল করেছে তা নির্ধারণ করার জন্য সেন্সর HAL-কে অবশ্যই ওয়েক লক FMQ পড়তে হবে। HAL কেবল তখনই WAKE_UP ইভেন্টগুলোর জন্য তার ওয়েক লক রিলিজ করবে, যখন হ্যান্ডেল না করা মোট WAKE_UP ইভেন্টের সংখ্যা শূন্য হবে। সেন্সর ইভেন্টগুলো হ্যান্ডেল করার পর, ফ্রেমওয়ার্ক WAKE_UP ইভেন্ট হিসেবে চিহ্নিত ইভেন্টগুলোর সংখ্যা গণনা করে এবং এই সংখ্যাটি ওয়েক লক FMQ-তে পুনরায় লিখে দেয়।
যখনই ফ্রেমওয়ার্কটি Wake Lock FMQ-তে ডেটা লেখে, তখনই এটি WakeLockQueueFlagBits::DATA_WRITTEN রাইট নোটিফিকেশনটি সেট করে।
ডায়নামিক সেন্সর
ডাইনামিক সেন্সর হলো এমন সেন্সর যা ভৌতভাবে ডিভাইসের অংশ নয়, কিন্তু ডিভাইসে ইনপুট হিসেবে ব্যবহার করা যায়; যেমন অ্যাক্সেলেরোমিটারযুক্ত একটি গেমপ্যাড।
যখন একটি ডাইনামিক সেন্সর সংযুক্ত করা হয়, তখন Sensors HAL থেকে ISensorsCallback এর onDynamicSensorConnected ফাংশনটি অবশ্যই কল করতে হবে। এটি ফ্রেমওয়ার্ককে নতুন ডাইনামিক সেন্সর সম্পর্কে অবহিত করে এবং সেন্সরটিকে ফ্রেমওয়ার্কের মাধ্যমে নিয়ন্ত্রণ করার ও ক্লায়েন্টদের দ্বারা সেন্সরের ইভেন্টগুলো গ্রহণ করার সুযোগ করে দেয়।
একইভাবে, যখন একটি ডাইনামিক সেন্সর সংযোগ বিচ্ছিন্ন হয়, তখন ISensorsCallback এর মধ্যে থাকা onDynamicSensorDisconnected ফাংশনটি অবশ্যই কল করতে হবে, যাতে ফ্রেমওয়ার্কটি আর উপলব্ধ নয় এমন যেকোনো সেন্সরকে সরিয়ে ফেলতে পারে।
সরাসরি চ্যানেল
ডাইরেক্ট চ্যানেল হলো একটি কার্যপদ্ধতি, যেখানে অ্যান্ড্রয়েড সেন্সরস ফ্রেমওয়ার্ককে বাইপাস করে সেন্সর ইভেন্টগুলো ইভেন্ট এফএমকিউ (Event FMQ)-তে না পাঠিয়ে একটি নির্দিষ্ট মেমরিতে লেখা হয়। যে ক্লায়েন্ট একটি ডাইরেক্ট চ্যানেল রেজিস্টার করে, তাকে অবশ্যই ডাইরেক্ট চ্যানেলটি তৈরি করতে ব্যবহৃত মেমরি থেকে সরাসরি সেন্সর ইভেন্টগুলো পড়তে হয় এবং সে ফ্রেমওয়ার্কের মাধ্যমে সেন্সর ইভেন্টগুলো গ্রহণ করে না। configDirectReport() ফাংশনটি সাধারণ অপারেশনের জন্য batch() মতোই এবং এটি ডাইরেক্ট রিপোর্ট চ্যানেলটি কনফিগার করে।
registerDirectChannel() এবং unregisterDirectChannel() ফাংশনগুলো একটি নতুন ডিরেক্ট চ্যানেল তৈরি বা ধ্বংস করে।
অপারেশন মোড
setOperationMode() ফাংশনটি ফ্রেমওয়ার্ককে একটি সেন্সর কনফিগার করার সুযোগ দেয়, যাতে ফ্রেমওয়ার্কটি সেন্সরের মধ্যে সেন্সর ডেটা প্রবেশ করাতে পারে। এটি পরীক্ষার জন্য উপযোগী, বিশেষ করে সেইসব অ্যালগরিদমের ক্ষেত্রে যেগুলো ফ্রেমওয়ার্কের নিচে কাজ করে।
injectSensorData() ফাংশনটি সাধারণত সেন্সর HAL-এ অপারেশনাল প্যারামিটার পুশ করতে ব্যবহৃত হয়। এই ফাংশনটি একটি নির্দিষ্ট সেন্সরে সেন্সর ইভেন্ট ইনজেক্ট করতেও ব্যবহার করা যেতে পারে।
বৈধতা
আপনার Sensors HAL-এর বাস্তবায়ন যাচাই করতে, সেন্সর CTS এবং VTS পরীক্ষাগুলো চালান।
CTS পরীক্ষা
সেন্সর CTS পরীক্ষা স্বয়ংক্রিয় CTS পরীক্ষা এবং ম্যানুয়াল CTS ভেরিফায়ার অ্যাপ, উভয় ক্ষেত্রেই বিদ্যমান।
স্বয়ংক্রিয় পরীক্ষাগুলো cts/tests/sensor/src/android/hardware/cts- এ অবস্থিত। এই পরীক্ষাগুলো সেন্সরের সাধারণ কার্যকারিতা যাচাই করে, যেমন সেন্সর সক্রিয় করা, ব্যাচিং এবং সেন্সর ইভেন্টের হার।
CTS ভেরিফায়ার টেস্টগুলো cts/apps/CtsVerifier/src/com/android/cts/verifier/sensors ফোল্ডারে অবস্থিত। এই টেস্টগুলোর জন্য টেস্ট অপারেটরের ম্যানুয়াল ইনপুট প্রয়োজন হয় এবং এগুলো নিশ্চিত করে যে সেন্সরগুলো সঠিক মান রিপোর্ট করছে।
পরীক্ষাধীন ডিভাইসটি যে CDD-এর সকল শর্ত পূরণ করে, তা নিশ্চিত করার জন্য CTS পরীক্ষায় উত্তীর্ণ হওয়া অত্যন্ত গুরুত্বপূর্ণ।
ভিটিএস পরীক্ষা
Sensors AIDL HAL-এর জন্য VTS টেস্টগুলো hardware/interfaces/sensors/aidl/vts/ -এ অবস্থিত। এই টেস্টগুলো নিশ্চিত করে যে Sensors HAL সঠিকভাবে প্রয়োগ করা হয়েছে এবং ISensors.aidl ও ISensorsCallback.aidl অন্তর্ভুক্ত সমস্ত প্রয়োজনীয়তা যথাযথভাবে পূরণ করা হয়েছে।
HAL শুরু করুন
ফ্রেমওয়ার্ক এবং HAL-এর মধ্যে FMQ স্থাপন করার জন্য initialize() ফাংশনটি অবশ্যই সমর্থিত হতে হবে।
উপলব্ধ সেন্সরগুলি উন্মোচন করুন
সেন্সর AIDL HAL-এ, getSensorsList() ফাংশনটিকে একটিমাত্র ডিভাইস বুটের সময় অবশ্যই একই মান রিটার্ন করতে হবে, এমনকি সেন্সর HAL রিস্টার্টের পরেও। getSensorsList() ফাংশনের একটি নতুন আবশ্যকতা হলো, এটিকে একটিমাত্র ডিভাইস বুটের সময় অবশ্যই একই মান রিটার্ন করতে হবে, এমনকি সেন্সর HAL রিস্টার্টের পরেও। এর ফলে, সিস্টেম সার্ভার রিস্টার্ট হলে ফ্রেমওয়ার্কটি সেন্সর সংযোগগুলো পুনরায় স্থাপন করার চেষ্টা করতে পারে। ডিভাইসটি রিবুট করার পর getSensorsList() দ্বারা রিটার্ন করা মান পরিবর্তিত হতে পারে।
সেন্সর ইভেন্টগুলো FMQ-তে লিখুন
poll() কল হওয়ার জন্য অপেক্ষা না করে, Sensors AIDL HAL-এ, যখনই সেন্সর ইভেন্ট উপলব্ধ হয়, তখনই সেন্সর HAL-কে সক্রিয়ভাবে Event FMQ-তে সেন্সর ইভেন্টগুলো লিখতে হবে। ফ্রেমওয়ার্কের মধ্যে একটি FMQ রিড শুরু করার জন্য EventFlag এ সঠিক বিটগুলো লেখার দায়িত্বও HAL-এর।
ওয়েক_আপ ইভেন্টগুলি
Sensors HAL 1.0-এ, poll poll() poll() ফাংশনে একটি WAKE_UP ইভেন্ট পোস্ট করার পর, পরবর্তী যেকোনো poll() কলে HAL তার ওয়েক WAKE_UP ছেড়ে দিতে পারত। কারণ এটি নির্দেশ করত যে ফ্রেমওয়ার্কটি সমস্ত সেন্সর ইভেন্ট প্রসেস করেছে এবং প্রয়োজনে একটি ওয়েক লক অর্জন করেছে। যেহেতু Sensors AIDL HAL-এ, ফ্রেমওয়ার্ক যখন FMQ-তে লেখা ইভেন্টগুলো প্রসেস করে, তখন HAL-কে আর জানানো হয় না, তাই ওয়েক লক FMQ ফ্রেমওয়ার্ককে HAL-এর সাথে যোগাযোগ করার সুযোগ দেয় যে কখন এটি WAKE_UP ইভেন্টগুলো হ্যান্ডেল করেছে।
Sensors AIDL HAL-এ, WAKE_UP ইভেন্টের জন্য Sensors HAL দ্বারা সুরক্ষিত ওয়েক লকটি অবশ্যই SensorsHAL_WAKEUP দিয়ে শুরু হতে হবে।
ডায়নামিক সেন্সর
Sensors HAL 1.0-এ poll() ফাংশন ব্যবহার করে ডাইনামিক সেন্সরগুলো রিটার্ন করা হতো। Sensors AIDL HAL-এর নিয়ম অনুযায়ী, যখনই ডাইনামিক সেন্সর সংযোগ পরিবর্তিত হয়, ISensorsCallback মধ্যে থাকা onDynamicSensorsConnected এবং onDynamicSensorsDisconnected কলব্যাকগুলো অবশ্যই কল করতে হবে। এই কলব্যাকগুলো initialize() ফাংশনের মাধ্যমে সরবরাহ করা ISensorsCallback পয়েন্টারের অংশ হিসেবে পাওয়া যায়।
অপারেশন মোড
WAKE_UP সেন্সরগুলির জন্য DATA_INJECTION মোড অবশ্যই সমর্থিত হতে হবে।
মাল্টি-এইচএএল সমর্থন
Sensors AIDL HAL, Sensors Multi-HAL ফ্রেমওয়ার্ক ব্যবহার করে মাল্টি-HAL সমর্থন করে। বাস্তবায়নের বিস্তারিত বিবরণের জন্য, Sensors HAL 2.1 থেকে পোর্টিং দেখুন।