সেন্সর AIDL HAL

সেন্সর হার্ডওয়্যার অ্যাবস্ট্রাকশন লেয়ার (HAL) হল Android সেন্সর ফ্রেমওয়ার্ক এবং অ্যাক্সিলরোমিটার বা জাইরোস্কোপের মতো ডিভাইসের সেন্সরগুলির মধ্যে ইন্টারফেস। সেন্সর HAL এমন ফাংশন সংজ্ঞায়িত করে যা ফ্রেমওয়ার্ককে সেন্সর নিয়ন্ত্রণ করার অনুমতি দেওয়ার জন্য অবশ্যই প্রয়োগ করতে হবে।

নতুন ও আপগ্রেড করা ডিভাইসের জন্য Android 13 ও এর পরের যেকোনও ভার্সনে সেন্সর AIDL HAL উপলভ্য। Sensors AIDL HAL, যা Sensors HAL 2.1-এর উপর ভিত্তি করে তৈরি, AIDL HAL ইন্টারফেস ব্যবহার করে এবং হেড ট্র্যাকার ও লিমিটেড-অ্যাক্সিস IMU সেন্সর টাইপ দেখায়।

AIDL HAL ইন্টারফেস

Sensors AIDL HAL-এর জন্য ডকুমেন্টেশনের মূল সোর্স হল HAL definition-এর মধ্যে hardware/interfaces/sensors/aidl/android/hardware/sensors/ISensors.aidl।

Sensors AIDL HAL প্রয়োগ করা

Sensors AIDL HAL প্রয়োগ করতে, কোনও অবজেক্টকে অবশ্যই ISensors ইন্টারফেস এক্সটেন্ড করতে হবে এবং hardware/interfaces/sensors/aidl/android/hardware/sensors/ISensors.aidl-এ সংজ্ঞায়িত সব ফাংশন প্রয়োগ করতে হবে।

HAL চালু করা

ব্যবহার করার আগে Android সেন্সর ফ্রেমওয়ার্কের মাধ্যমে সেন্সর HAL অবশ্যই ইনিশিয়ালাইজ করতে হবে। ফ্রেমওয়ার্ক initialize() ফাংশনকে কল করে সেন্সর HAL-কে তিনটি প্যারামিটার প্রদান করে: দুটি FMQ ডেসক্রিপ্টর এবং একটি ISensorsCallback অবজেক্টের পয়েন্টার।

ফ্রেমওয়ার্কে সেন্সর ইভেন্ট লেখার জন্য ব্যবহৃত ইভেন্ট FMQ তৈরি করতে HAL প্রথম ডেসক্রিপ্টর ব্যবহার করে। HAL, WAKE_UP সেন্সর ইভেন্টের জন্য HAL-এর ওয়েক লক রিলিজ করার সময় সিঙ্ক্রোনাইজ করার জন্য ব্যবহৃত Wake Lock FMQ তৈরি করতে দ্বিতীয় ডেসক্রিপ্টর ব্যবহার করে। HAL-কে অবশ্যই ISensorsCallback অবজেক্টের একটি পয়েন্টার সেভ করতে হবে, যাতে প্রয়োজনীয় কলব্যাক ফাংশন ইনভোক করা যায়।

Sensors HAL-কে ইনিশিয়ালাইজ করার সময় initialize() ফাংশনটিই প্রথম কল করতে হবে।

উপলভ্য সেন্সর এক্সপোজ করা

ডিভাইসে উপলভ্য সব স্ট্যাটিক সেন্সরের তালিকা পেতে, getSensorsList() ফাংশন ব্যবহার করুন। এই ফাংশনটি সেন্সরগুলির একটি তালিকা রিটার্ন করে, প্রতিটি সেটির হ্যান্ডেল দ্বারা অনন্যভাবে শনাক্ত করা হয়। Sensors HAL রিস্টার্ট করা হলে, প্রদত্ত সেন্সরের হ্যান্ডেল পরিবর্তন করা যাবে না। ডিভাইস রিবুট করলে এবং সিস্টেম সার্ভার রিস্টার্ট করলে হ্যান্ডেল পরিবর্তন হতে পারে।

একাধিক সেন্সর একই ধরনের সেন্সর ও ওয়েক-আপ প্রপার্টি শেয়ার করলে, তালিকার প্রথম সেন্সরকে ডিফল্ট সেন্সর বলা হয় এবং getDefaultSensor(int sensorType, bool wakeUp) ফাংশন ব্যবহার করা অ্যাপকে এটি রিটার্ন করা হয়।

সেন্সর তালিকার স্থিতিশীলতা

Sensor HAL রিস্টার্ট হওয়ার পরে, getSensorsList() রিস্টার্ট হওয়ার আগে পাওয়া সেন্সর তালিকার তুলনায় ফেরত আসা ডেটা যদি উল্লেখযোগ্য পরিবর্তন নির্দেশ করে, তাহলে ফ্রেমওয়ার্ক Android রানটাইম রিস্টার্ট করার ট্রিগার করে। সেন্সর তালিকায় উল্লেখযোগ্য পরিবর্তনের মধ্যে এমন পরিস্থিতি অন্তর্ভুক্ত যেখানে প্রদত্ত হ্যান্ডেল সহ কোনও সেন্সর অনুপস্থিত বা অ্যাট্রিবিউট পরিবর্তন হয়েছে অথবা যেখানে নতুন সেন্সর চালু করা হয়েছে। যদিও Android রানটাইম রিস্টার্ট করলে ব্যবহারকারীর অসুবিধা হতে পারে, তবে এটি প্রয়োজন কারণ Android ফ্রেমওয়ার্ক আর Android API কন্ট্র্যাক্ট মেনে চলতে পারে না। এর কারণ হল, কোনও অ্যাপের লাইফটাইম চলাকালীন স্ট্যাটিক (ননডায়নামিক) সেন্সর পরিবর্তন হয় না। এর ফলে ফ্রেমওয়ার্ক অ্যাপের করা অ্যাক্টিভ সেন্সর অনুরোধ আবার এস্টাবলিশ করতে পারে না। তাই, HAL ভেন্ডরদের পরামর্শ দেওয়া হয় যে অপ্রয়োজনীয় সেন্সর তালিকা পরিবর্তন এড়িয়ে চলুন।

স্থিতিশীল সেন্সর হ্যান্ডেল নিশ্চিত করতে, HAL-কে অবশ্যই ডিভাইসে দেওয়া ফিজিক্যাল সেন্সরকে তার হ্যান্ডেলের সাথে ডিটারমিনিস্টিক পদ্ধতিতে ম্যাপ করতে হবে। যদিও Sensors HAL ইন্টারফেসের মাধ্যমে কোনও নির্দিষ্ট প্রয়োগ বাধ্যতামূলক নয়, তবে এই প্রয়োজনীয়তা পূরণ করার জন্য ডেভেলপারদের কাছে একাধিক বিকল্প উপলভ্য।

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

সেন্সর কনফিগার করা

কোনও সেন্সর অ্যাক্টিভেট করার আগে, batch() ফাংশন ব্যবহার করে সেন্সরটিকে স্যাম্পেলিং পিরিয়ড ও সর্বাধিক রিপোর্টিং ল্যাটেন্সি সহ কনফিগার করতে হবে।

সেন্সর ডেটা না হারিয়েই batch() ব্যবহার করে যেকোনও সময় সেন্সরকে আবার কনফিগার করার সুবিধা থাকতে হবে।

স্যাম্পলিং পিরিয়ড

কনফিগার করা হচ্ছে এমন সেন্সরের ধরনের উপর ভিত্তি করে স্যাম্পেলিং পিরিয়ডের আলাদা আলাদা অর্থ হয়:

  • ধারাবাহিক: সেন্সর ইভেন্ট একটানা হারে তৈরি হয়।
  • পরিবর্তন হলে: ইভেন্টগুলি স্যাম্পলিং পিরিয়ডের চেয়ে দ্রুত তৈরি হয় না এবং পরিমাপ করা মান পরিবর্তন না হলে স্যাম্পলিং পিরিয়ডের চেয়ে ধীর গতিতে তৈরি হতে পারে।
  • ওয়ান-শট: স্যাম্পলিংয়ের সময়সীমা উপেক্ষা করা হয়।
  • বিশেষ: আরও বিবরণের জন্য, সেন্সরের ধরন দেখুন।

স্যাম্পলিং পিরিয়ড ও সেন্সরের রিপোর্টিং মোডের মধ্যে ইন্টার‍্যাকশন সম্পর্কে জানতে, রিপোর্টিং মোড দেখুন।

সর্বাধিক রিপোর্টিং লেটেন্সি

সর্বাধিক রিপোর্টিং ল্যাটেন্সি হল ন্যানোসেকেন্ডে সর্বাধিক সময় যা ইভেন্ট বিলম্বিত হতে পারে এবং SoC জেগে থাকাকালীন HAL-এর মাধ্যমে Event FMQ-তে লেখার আগে হার্ডওয়্যার FIFO-তে স্টোর করা যেতে পারে।

শূন্য মান থেকে বোঝা যায় যে ইভেন্টগুলি পরিমাপ করা হলেই সেগুলি রিপোর্ট করতে হবে। এর জন্য FIFO সম্পূর্ণভাবে এড়িয়ে যাওয়া অথবা FIFO-তে সেন্সর থেকে কোনও একটি ইভেন্ট থাকলেই FIFO খালি করে দেওয়া যেতে পারে।

যেমন, SoC চালু থাকলে, ৫০ Hz-এ অ্যাক্টিভেট হওয়া অ্যাক্সেলেরোমিটার, সর্বাধিক রিপোর্টিং লেটেন্সি শূন্য ট্রিগার সহ প্রতি সেকেন্ডে ৫০ বার ইন্টারাপ্ট করে।

সর্বাধিক রিপোর্টিং ল্যাটেন্সি শূন্যের থেকে বেশি হলে, সেন্সর ইভেন্ট শনাক্ত করার সাথে সাথেই রিপোর্ট করতে হবে না। সর্বাধিক রিপোর্টিং লেটেন্সি এর চেয়ে বেশি দেরি না হলে, ইভেন্টগুলি সাময়িকভাবে হার্ডওয়্যার FIFO-তে স্টোর করা যেতে পারে এবং ব্যাচে রিপোর্ট করা যেতে পারে। আগের ব্যাচের পর থেকে সব ইভেন্ট রেকর্ড করা হয় এবং একবারে ফেরত দেওয়া হয়। এর ফলে SoC-তে পাঠানো ইন্টারাপ্টের সংখ্যা কমে যায় এবং সেন্সর ডেটা ক্যাপচার ও ব্যাচিং করার সময় SoC কম পাওয়ার মোডে সুইচ করতে পারে।

প্রতিটি ইভেন্টের সাথে একটি টাইমস্ট্যাম্প যুক্ত থাকে। কোনও ইভেন্ট রিপোর্ট করার সময় দেরি হলে, ইভেন্ট টাইমস্ট্যাম্পে তার প্রভাব পড়লে চলবে না। টাইমস্ট্যাম্পটি অবশ্যই সঠিক হতে হবে এবং ইভেন্টটি শারীরিকভাবে যে সময়ে ঘটেছে তার সাথে মিল থাকতে হবে, এটি রিপোর্ট করার সময় নয়।

নন-জিরো সর্বাধিক রিপোর্টিং লেটেন্সি সহ সেন্সর ইভেন্ট রিপোর্ট করার বিষয়ে অতিরিক্ত তথ্য এবং প্রয়োজনীয়তার জন্য, ব্যাচিং দেখুন।

সেন্সর অ্যাক্টিভেট করা

ফ্রেমওয়ার্ক activate() ফাংশন ব্যবহার করে সেন্সর চালু ও বন্ধ করে। কোনও সেন্সর অ্যাক্টিভেট করার আগে, ফ্রেমওয়ার্ককে অবশ্যই প্রথমে batch() ব্যবহার করে সেন্সরটি কনফিগার করতে হবে।

কোনও সেন্সর ডিঅ্যাক্টিভেট করার পরে, সেই সেন্সর থেকে অতিরিক্ত সেন্সর ইভেন্ট Event FMQ-তে লেখা যাবে না।

ফ্লাশ সেন্সর

কোনও সেন্সরকে ব্যাচ সেন্সর ডেটা কনফিগার করা হলে, ফ্রেমওয়ার্ক flush() কল করে ব্যাচ করা সেন্সর ইভেন্টকে অবিলম্বে ফ্লাশ করতে বাধ্য করতে পারে। এর ফলে নির্দিষ্ট সেন্সর হ্যান্ডেলের জন্য ব্যাচ করা সেন্সর ইভেন্ট অবিলম্বে ইভেন্ট FMQ-তে লেখা হয়। Sensors HAL-কে অবশ্যই ফ্ল্যাশ সম্পূর্ণ ইভেন্ট flush()-এ কল করার ফলে লেখা সেন্সর ইভেন্টের শেষে যোগ করতে হবে।

ফ্লাশ অ্যাসিঙ্ক্রোনাসভাবে ঘটে (অর্থাৎ, এই ফাংশনটি অবিলম্বে ফিরে আসতে হবে)। ইমপ্লিমেন্টেশনে একাধিক সেন্সরের জন্য একটি FIFO ব্যবহার করা হলে, সেই FIFO ফ্লাশ করা হয় এবং শুধুমাত্র নির্দিষ্ট সেন্সরের জন্য ফ্লাশ সম্পূর্ণ হওয়ার ইভেন্ট যোগ করা হয়।

নির্দিষ্ট সেন্সরে FIFO (কোনও বাফারিং সম্ভব নয়) না থাকলে অথবা কল করার সময় FIFO খালি থাকলে, flush()-কে অবশ্যই সফল হতে হবে এবং সেই সেন্সরের জন্য ফ্ল্যাশ সম্পূর্ণ হওয়ার ইভেন্ট পাঠাতে হবে। এটি ওয়ান-শট সেন্সর ছাড়া সব সেন্সরের ক্ষেত্রে প্রযোজ্য।

এক-শট সেন্সরের জন্য flush() কল করা হলে, flush()-কে অবশ্যই BAD_VALUE রিটার্ন করতে হবে এবং ফ্ল্যাশ সম্পূর্ণ হওয়ার ইভেন্ট তৈরি করা যাবে না।

FMQ-তে সেন্সর ইভেন্ট লেখা

Android সেন্সর ফ্রেমওয়ার্কে সেন্সর ইভেন্ট পুশ করার জন্য Sensors HAL, Event FMQ ব্যবহার করে।

ইভেন্ট FMQ হল একটি সিঙ্ক্রোনাইজ করা FMQ, যার অর্থ হল উপলভ্য স্পেসের থেকে বেশি ইভেন্ট FMQ-তে লেখার চেষ্টা করলে লেখা যাবে না। এই ধরনের ক্ষেত্রে, HAL-কে নির্ধারণ করতে হবে যে ইভেন্টের বর্তমান সেটকে দুটি ছোট ইভেন্টের গ্রুপ হিসেবে লেখা হবে নাকি পর্যাপ্ত স্পেস উপলভ্য হলে সব ইভেন্ট একসাথে লেখা হবে।

সেন্সর HAL যখন ইভেন্ট FMQ-তে সেন্সর ইভেন্টের কাঙ্ক্ষিত সংখ্যা লিখেছে, তখন সেন্সর HAL-কে অবশ্যই ফ্রেমওয়ার্ককে জানাতে হবে যে ইভেন্ট FMQ-এর EventFlag::wake ফাংশনে EventQueueFlagBits::READ_AND_PROCESS বিট লিখে ইভেন্টগুলি প্রস্তুত করা হয়েছে। EventFlag::createEventFlag ব্যবহার করে Event FMQ থেকে EventFlag তৈরি করা যেতে পারে এবং Event FMQ-এর getEventFlagWord() ফাংশন।

Sensors AIDL HAL, ইভেন্ট FMQ-তে write ও writeBlocking, দু'টিই সাপোর্ট করে। ডিফল্ট প্রয়োগ write ব্যবহার করার জন্য একটি রেফারেন্স প্রদান করে। writeBlocking ফাংশন ব্যবহার করা হলে, readNotification ফ্ল্যাগ অবশ্যই EventQueueFlagBits::EVENTS_READ-এ সেট করতে হবে, যা ফ্রেমওয়ার্ক দ্বারা সেট করা হয় যখন এটি ইভেন্ট FMQ থেকে ইভেন্ট পড়ে। রাইট নোটিফিকেশন ফ্ল্যাগ অবশ্যই EventQueueFlagBits::READ_AND_PROCESS-এ সেট করতে হবে, যা ফ্রেমওয়ার্ককে জানায় যে ইভেন্টগুলি ইভেন্ট FMQ-তে লেখা হয়েছে।

WAKE_UP ইভেন্ট

WAKE_UP ইভেন্ট হল সেন্সর ইভেন্ট যা অ্যাপ্লিকেশন প্রসেসর (AP)-কে জাগিয়ে তোলে এবং অবিলম্বে ইভেন্ট ম্যানেজ করে। Event FMQ-তে যখনই কোনও WAKE_UP ইভেন্ট লেখা হয়, তখন ফ্রেমওয়ার্ক ইভেন্ট হ্যান্ডেল না করা পর্যন্ত সিস্টেম যাতে সজাগ থাকে তা নিশ্চিত করতে Sensors HAL-কে অবশ্যই একটি ওয়েক লক সুরক্ষিত করতে হবে। WAKE_UP ইভেন্ট পাওয়ার পরে, ফ্রেমওয়ার্ক নিজের ওয়েক লক সুরক্ষিত করে, এর ফলে সেন্সর HAL নিজের ওয়েক লক রিলিজ করতে পারে। Sensor HAL তার ওয়েক লক রিলিজ করলে সিঙ্ক্রোনাইজ করতে, ওয়েক লক FMQ ব্যবহার করুন।

ফ্রেমওয়ার্ক কতগুলি WAKE_UP ইভেন্ট হ্যান্ডেল করেছে তা নির্ধারণ করতে সেন্সর HAL-কে অবশ্যই ওয়েক লক FMQ পড়তে হবে। HAL-এর ওয়েক লক শুধুমাত্র তখনই রিলিজ করা উচিত যখন WAKE_UP ইভেন্টের জন্য হ্যান্ডেল না করা WAKE_UP ইভেন্টের মোট সংখ্যা শূন্য হয়। সেন্সর ইভেন্ট ম্যানেজ করার পরে, ফ্রেমওয়ার্ক WAKE_UP ইভেন্ট হিসেবে চিহ্নিত ইভেন্টের সংখ্যা গণনা করে এবং এই সংখ্যাটি ওয়েক লক FMQ-তে লিখে রাখে।

ফ্রেমওয়ার্ক, Wake Lock FMQ-তে ডেটা লেখার সময়, Wake Lock FMQ-তে WakeLockQueueFlagBits::DATA_WRITTEN write বিজ্ঞপ্তি সেট করে।

ডায়নামিক সেন্সর

ডায়নামিক সেন্সর হল এমন সেন্সর যা ডিভাইসের অংশ নয়, তবে ডিভাইসে ইনপুট হিসেবে ব্যবহার করা যায়, যেমন অ্যাক্সিলরোমিটার সহ গেমপ্যাড।

ডায়নামিক সেন্সর কানেক্ট করা থাকলে, ISensorsCallback-এ onDynamicSensorConnected ফাংশনটি অবশ্যই Sensors HAL থেকে কল করতে হবে। এটি নতুন ডায়নামিক সেন্সরের ফ্রেমওয়ার্ককে বিজ্ঞপ্তি দেয় এবং ফ্রেমওয়ার্কের মাধ্যমে সেন্সরকে কন্ট্রোল করার অনুমতি দেয় এবং সেন্সরের ইভেন্ট ক্লায়েন্টদের দ্বারা ব্যবহার করার অনুমতি দেয়।

একইভাবে, কোনও ডায়নামিক সেন্সর ডিসকানেক্ট করা হলে, ISensorsCallback-এর মধ্যে থাকা onDynamicSensorDisconnected ফাংশনকে কল করতে হবে, যাতে ফ্রেমওয়ার্ক সেইসব সেন্সর সরিয়ে দিতে পারে যেগুলি আর উপলভ্য নেই।

সরাসরি চ্যানেল

ডাইরেক্ট চ্যানেল হল অপারেশনের একটি পদ্ধতি যেখানে সেন্সর ইভেন্টগুলি Android Sensors Framework বাইপাস করে Event FMQ-তে না লিখে নির্দিষ্ট মেমরিতে লেখা হয়। যে ক্লায়েন্ট সরাসরি চ্যানেল রেজিস্টার করে তাকে অবশ্যই সরাসরি চ্যানেল তৈরি করার জন্য ব্যবহৃত মেমরি থেকে সরাসরি সেন্সর ইভেন্ট পড়তে হবে এবং ফ্রেমওয়ার্কের মাধ্যমে সেন্সর ইভেন্ট পাবে না। configDirectReport() ফাংশনটি সাধারণ অপারেশনের জন্য batch()-এর মতো এবং ডাইরেক্ট রিপোর্ট চ্যানেল কনফিগার করে।

registerDirectChannel() ও unregisterDirectChannel() ফাংশন একটি নতুন ডাইরেক্ট চ্যানেল তৈরি করে বা মুছে দেয়।

অপারেশন মোড

setOperationMode()ফাংশন ফ্রেমওয়ার্ককে একটি সেন্সর কনফিগার করার অনুমতি দেয় যাতে ফ্রেমওয়ার্ক সেন্সরে সেন্সর ডেটা ইনজেক্ট করতে পারে। এটি পরীক্ষা করার জন্য, বিশেষ করে ফ্রেমওয়ার্কের নিচে থাকা অ্যালগরিদমের জন্য উপযোগী।

injectSensorData() ফাংশনটি সাধারণত Sensors HAL-এ অপারেশনাল প্যারামিটার পুশ করতে ব্যবহার করা হয়। এছাড়াও, কোনও নির্দিষ্ট সেন্সরে সেন্সর ইভেন্ট ইনজেক্ট করার জন্য এই ফাংশন ব্যবহার করা যেতে পারে।

যাচাইকরণ

আপনার সেন্সর HAL-এর প্রয়োগ যাচাই করতে, সেন্সর CTS এবং VTS পরীক্ষা চালান।

CTS টেস্ট

অটোমেটেড CTS টেস্ট ও ম্যানুয়াল CTS Verifier অ্যাপ, দু'টিতেই সেন্সর CTS টেস্ট থাকে।

অটোমেটেড টেস্টগুলি cts/tests/sensor/src/android/hardware/cts-এ আছে। এইসব পরীক্ষা সেন্সরের সাধারণ কার্যকারিতা যাচাই করে, যেমন সেন্সর অ্যাক্টিভেট করা, ব্যাচিং এবং সেন্সর ইভেন্ট রেট।

CTS Verifier টেস্টগুলি এখানে আছে: cts/apps/CtsVerifier/src/com/android/cts/verifier/sensors. এইসব টেস্টের জন্য টেস্ট অপারেটরের থেকে ম্যানুয়াল ইনপুট প্রয়োজন এবং সেন্সর যাতে সঠিক ভ্যালু রিপোর্ট করে তা নিশ্চিত করে।

পরীক্ষা করা ডিভাইস যাতে সমস্ত CDD প্রয়োজনীয়তা পূরণ করে তা নিশ্চিত করার জন্য CTS পরীক্ষা পাস করা অত্যন্ত গুরুত্বপূর্ণ।

VTS পরীক্ষা

সেন্সর 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-এ, Sensors HAL-কে অবশ্যই ইভেন্ট FMQ-তে সেন্সর ইভেন্ট উপলভ্য হওয়ার সাথে সাথেই তা লিখতে হবে। ফ্রেমওয়ার্কের মধ্যে FMQ রিড করার জন্য EventFlag-এ সঠিক বিট লেখার দায়িত্বও HAL-এর।

WAKE_UP ইভেন্ট

Sensors HAL 1.0-এ, WAKE_UP ইভেন্ট poll()-এ পোস্ট করার পরে WAKE_UP poll()-এ যেকোনও পরবর্তী কলে HAL তার ওয়েক লক রিলিজ করতে পারত poll() কারণ এটি ইঙ্গিত করত যে ফ্রেমওয়ার্ক সমস্ত সেন্সর ইভেন্ট প্রসেস করেছে এবং প্রয়োজন হলে ওয়েক লক পেয়েছে। কারণ, 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-এর প্রয়োজন যে onDynamicSensorsConnected এবং onDynamicSensorsDisconnected-কে ISensorsCallback-এ কল করা হোক। এইসব কলব্যাক initialize() ফাংশনের মাধ্যমে প্রদান করা ISensorsCallback পয়েন্টারের অংশ হিসেবে উপলভ্য।

অপারেশন মোড

WAKE_UP সেন্সরের জন্য DATA_INJECTION মোড কাজ করতে হবে।

মাল্টি-HAL সহায়তা

Sensors AIDL HAL, Sensors Multi-HAL ফ্রেমওয়ার্ক ব্যবহার করে মাল্টি-HAL-কে সাপোর্ট করে। প্রয়োগ সম্পর্কিত বিবরণের জন্য, Sensors HAL 2.1 থেকে পোর্ট করা দেখুন।