সেন্সর AIDL HAL

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

সেন্সর AIDL HAL নতুন এবং আপগ্রেড করা ডিভাইসগুলির জন্য Android 13 এবং উচ্চতর সংস্করণে উপলব্ধ। সেন্সর HAL 2.1 এর উপর ভিত্তি করে তৈরি সেন্সর AIDL HAL, AIDL HAL ইন্টারফেস ব্যবহার করে এবং হেড ট্র্যাকার এবং সীমিত-অক্ষ IMU সেন্সর ধরনের প্রকাশ করে।

AIDL HAL ইন্টারফেস

সেন্সর এআইডিএল এইচএএল-এর ডকুমেন্টেশনের প্রধান উৎস হল হার্ডওয়্যার/ইন্টারফেস/সেন্সর/aidl/android/hardware/sensors/ISensors.aidl- এ HAL সংজ্ঞার মধ্যে।

সেন্সর AIDL HAL প্রয়োগ করুন

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

HAL চালু করুন

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

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

initialize() ফাংশনটি অবশ্যই প্রথম ফাংশন হতে হবে যা সেন্সর এইচএএল শুরু করার সময় বলা হয়।

উপলব্ধ সেন্সর প্রকাশ করুন

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

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

সেন্সর তালিকার স্থায়িত্ব

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

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

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

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

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

একটি সেন্সর অবশ্যই batch() ব্যবহার করে সেন্সর ডেটার ক্ষতি ছাড়াই যেকোন সময় পুনরায় কনফিগার করতে সক্ষম হবে।

নমুনা সময়কাল

কনফিগার করা সেন্সর প্রকারের উপর ভিত্তি করে নমুনার সময়কালের একটি ভিন্ন অর্থ রয়েছে:

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

একটি স্যাম্পলিং সময়কাল এবং একটি সেন্সরের রিপোর্টিং মোডগুলির মধ্যে মিথস্ক্রিয়া সম্পর্কে জানতে, রিপোর্টিং মোডগুলি দেখুন৷

সর্বোচ্চ রিপোর্টিং লেটেন্সি

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

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

উদাহরণস্বরূপ, 50 Hz-এ সক্রিয় একটি অ্যাক্সিলোমিটার শূন্য ট্রিগারের সর্বাধিক রিপোর্টিং লেটেন্সি সহ যখন SoC জেগে থাকে তখন প্রতি সেকেন্ডে 50 বার বাধা দেয়।

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

প্রতিটি ইভেন্ট এর সাথে যুক্ত একটি টাইমস্ট্যাম্প আছে। যে সময়ে একটি ইভেন্ট রিপোর্ট করা হয় সেটিকে বিলম্বিত করা অবশ্যই ইভেন্ট টাইমস্ট্যাম্পকে প্রভাবিত করবে না। টাইমস্ট্যাম্পটি অবশ্যই সঠিক হতে হবে এবং যে সময়ে ইভেন্টটি শারীরিকভাবে ঘটেছিল তার সাথে সঙ্গতিপূর্ণ হতে হবে, এটি রিপোর্ট করার সময় নয়।

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

সেন্সর সক্রিয় করুন

ফ্রেমওয়ার্ক activate() ফাংশন ব্যবহার করে সেন্সরকে সক্রিয় এবং নিষ্ক্রিয় করে। একটি সেন্সর সক্রিয় করার আগে, ফ্রেমওয়ার্ককে প্রথমে batch() ব্যবহার করে সেন্সর কনফিগার করতে হবে।

একটি সেন্সর নিষ্ক্রিয় করার পরে, সেই সেন্সর থেকে অতিরিক্ত সেন্সর ইভেন্টগুলি ইভেন্ট FMQ-তে লেখা উচিত নয়৷

ফ্লাশ সেন্সর

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

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

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

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

এফএমকিউতে সেন্সর ইভেন্ট লিখুন

ইভেন্ট এফএমকিউ সেন্সর HAL দ্বারা সেন্সর ইভেন্টগুলিকে অ্যান্ড্রয়েড সেন্সর কাঠামোর মধ্যে পুশ করার জন্য ব্যবহার করা হয়।

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

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

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

WAKE_UP ইভেন্ট

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

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

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

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

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

যখন একটি ডাইনামিক সেন্সর সংযুক্ত থাকে, তখন ISensorsCallbackonDynamicSensorConnected ফাংশনটি সেন্সর HAL থেকে কল করতে হবে। এটি নতুন গতিশীল সেন্সরের কাঠামোকে অবহিত করে এবং সেন্সরটিকে ফ্রেমওয়ার্কের মাধ্যমে নিয়ন্ত্রিত করার অনুমতি দেয় এবং সেন্সরের ইভেন্টগুলি ক্লায়েন্টদের দ্বারা গ্রাস করা যায়।

একইভাবে, যখন একটি ডায়নামিক সেন্সর সংযোগ বিচ্ছিন্ন হয়, তখন ISensorsCallbackonDynamicSensorDisconnected ফাংশনটিকে কল করতে হবে যাতে ফ্রেমওয়ার্কটি আর উপলব্ধ নেই এমন কোনো সেন্সরকে সরাতে পারে।

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

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

registerDirectChannel() এবং unregisterDirectChannel() ফাংশন একটি নতুন সরাসরি চ্যানেল তৈরি বা ধ্বংস করে।

অপারেশন মোড

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

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

বৈধতা

সেন্সর 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 পরীক্ষায় উত্তীর্ণ হওয়া গুরুত্বপূর্ণ।

ভিটিএস পরীক্ষা

সেন্সর AIDL HAL-এর VTS পরীক্ষাগুলি হার্ডওয়্যার/ইন্টারফেস/সেন্সর/aidl/vts/- এ অবস্থিত। এই পরীক্ষাগুলি নিশ্চিত করে যে সেন্সর HAL সঠিকভাবে প্রয়োগ করা হয়েছে এবং ISensors.aidl এবং ISensorsCallback.aidl মধ্যে সমস্ত প্রয়োজনীয়তা সঠিকভাবে পূরণ করা হয়েছে।

HAL চালু করুন

initialize() ফাংশনটি ফ্রেমওয়ার্ক এবং এইচএএল-এর মধ্যে FMQ স্থাপন করতে সমর্থিত হতে হবে।

উপলব্ধ সেন্সর প্রকাশ করুন

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

এফএমকিউতে সেন্সর ইভেন্ট লিখুন

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

WAKE_UP ইভেন্ট

সেন্সর HAL 1.0-এ, HAL যে কোনো WAKE_UP ইভেন্টের জন্য তার WAKE_UP ইভেন্টের জন্য তার ওয়েক লক রিলিজ করতে সক্ষম হয়েছিল যে কোনো পরবর্তী কল টু poll poll() poll()WAKE_UP পোস্ট করার পর প্রয়োজনে জাগ্রত তালা। কারণ, সেন্সর এআইডিএল এইচএএল-এ, যখন ফ্রেমওয়ার্কটি FMQ-তে লেখা ইভেন্টগুলিকে প্রক্রিয়াজাত করে তখন HAL-কে আর অবহিত করা হয় না, Wake Lock FMQ ফ্রেমওয়ার্ককে HAL-এর সাথে যোগাযোগ করার অনুমতি দেয় যখন এটি WAKE_UP ইভেন্টগুলি পরিচালনা করে।

সেন্সর AIDL HAL-এ, WAKE_UP ইভেন্টের জন্য সেন্সর HAL দ্বারা সুরক্ষিত ওয়েক লকটি অবশ্যই SensorsHAL_WAKEUP দিয়ে শুরু হবে।

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

সেন্সর HAL 1.0-এ poll() ফাংশন ব্যবহার করে ডায়নামিক সেন্সর ফেরত দেওয়া হয়েছিল। সেন্সর AIDL HAL এর জন্য প্রয়োজন যে ডাইনামিক সেন্সর কানেকশন পরিবর্তন হলেই ISensorsCallbackonDynamicSensorsConnected এবং onDynamicSensorsDisconnected করা হবে। এই কলব্যাকগুলি ISensorsCallback পয়েন্টারের অংশ হিসাবে উপলব্ধ যা initialize() ফাংশনের মাধ্যমে সরবরাহ করা হয়।

অপারেশন মোড

WAKE_UP সেন্সরগুলির জন্য DATA_INJECTION মোড অবশ্যই সমর্থিত হবে৷

মাল্টি-এইচএএল সমর্থন

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

,

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

সেন্সর AIDL HAL নতুন এবং আপগ্রেড করা ডিভাইসগুলির জন্য Android 13 এবং উচ্চতর সংস্করণে উপলব্ধ। সেন্সর HAL 2.1 এর উপর ভিত্তি করে তৈরি সেন্সর AIDL HAL, AIDL HAL ইন্টারফেস ব্যবহার করে এবং হেড ট্র্যাকার এবং সীমিত-অক্ষ IMU সেন্সর ধরনের প্রকাশ করে।

AIDL HAL ইন্টারফেস

সেন্সর এআইডিএল এইচএএল-এর ডকুমেন্টেশনের প্রধান উৎস হল হার্ডওয়্যার/ইন্টারফেস/সেন্সর/aidl/android/hardware/sensors/ISensors.aidl- এ HAL সংজ্ঞার মধ্যে।

সেন্সর AIDL HAL প্রয়োগ করুন

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

HAL চালু করুন

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

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

initialize() ফাংশনটি অবশ্যই প্রথম ফাংশন হতে হবে যা সেন্সর এইচএএল শুরু করার সময় বলা হয়।

উপলব্ধ সেন্সর প্রকাশ করুন

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

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

সেন্সর তালিকার স্থায়িত্ব

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

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

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

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

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

একটি সেন্সর অবশ্যই batch() ব্যবহার করে সেন্সর ডেটার ক্ষতি ছাড়াই যেকোন সময় পুনরায় কনফিগার করতে সক্ষম হবে।

নমুনা সময়কাল

কনফিগার করা সেন্সর প্রকারের উপর ভিত্তি করে নমুনার সময়কালের একটি ভিন্ন অর্থ রয়েছে:

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

একটি স্যাম্পলিং সময়কাল এবং একটি সেন্সরের রিপোর্টিং মোডগুলির মধ্যে মিথস্ক্রিয়া সম্পর্কে জানতে, রিপোর্টিং মোডগুলি দেখুন৷

সর্বোচ্চ রিপোর্টিং লেটেন্সি

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

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

উদাহরণস্বরূপ, 50 Hz-এ সক্রিয় একটি অ্যাক্সিলোমিটার শূন্য ট্রিগারের সর্বাধিক রিপোর্টিং লেটেন্সি সহ যখন SoC জেগে থাকে তখন প্রতি সেকেন্ডে 50 বার বাধা দেয়।

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

প্রতিটি ইভেন্ট এর সাথে যুক্ত একটি টাইমস্ট্যাম্প আছে। যে সময়ে একটি ইভেন্ট রিপোর্ট করা হয় সেটিকে বিলম্বিত করা অবশ্যই ইভেন্ট টাইমস্ট্যাম্পকে প্রভাবিত করবে না। টাইমস্ট্যাম্পটি অবশ্যই সঠিক হতে হবে এবং যে সময়ে ইভেন্টটি শারীরিকভাবে ঘটেছিল তার সাথে সঙ্গতিপূর্ণ হতে হবে, এটি রিপোর্ট করার সময় নয়।

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

সেন্সর সক্রিয় করুন

ফ্রেমওয়ার্ক activate() ফাংশন ব্যবহার করে সেন্সরকে সক্রিয় এবং নিষ্ক্রিয় করে। একটি সেন্সর সক্রিয় করার আগে, ফ্রেমওয়ার্ককে প্রথমে batch() ব্যবহার করে সেন্সর কনফিগার করতে হবে।

একটি সেন্সর নিষ্ক্রিয় করার পরে, সেই সেন্সর থেকে অতিরিক্ত সেন্সর ইভেন্টগুলি ইভেন্ট FMQ-তে লেখা উচিত নয়৷

ফ্লাশ সেন্সর

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

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

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

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

এফএমকিউতে সেন্সর ইভেন্ট লিখুন

ইভেন্ট এফএমকিউ সেন্সর এইচএল দ্বারা সেন্সর ইভেন্টগুলি অ্যান্ড্রয়েড সেন্সর ফ্রেমওয়ার্কে চাপ দেওয়ার জন্য ব্যবহার করা হয়।

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

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

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

WAKE_UP ইভেন্ট

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

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

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

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

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

যখন একটি ডাইনামিক সেন্সর সংযুক্ত থাকে, তখন ISensorsCallbackonDynamicSensorConnected ফাংশনটি সেন্সর HAL থেকে কল করতে হবে। এটি নতুন গতিশীল সেন্সরের কাঠামোকে অবহিত করে এবং সেন্সরটিকে ফ্রেমওয়ার্কের মাধ্যমে নিয়ন্ত্রিত করার অনুমতি দেয় এবং সেন্সরের ইভেন্টগুলি ক্লায়েন্টদের দ্বারা গ্রাস করা যায়।

একইভাবে, যখন একটি ডায়নামিক সেন্সর সংযোগ বিচ্ছিন্ন হয়, তখন ISensorsCallbackonDynamicSensorDisconnected ফাংশনটিকে কল করতে হবে যাতে ফ্রেমওয়ার্কটি আর উপলব্ধ নেই এমন কোনো সেন্সরকে সরাতে পারে।

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

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

registerDirectChannel() এবং unregisterDirectChannel() ফাংশন একটি নতুন সরাসরি চ্যানেল তৈরি বা ধ্বংস করে।

অপারেশন মোড

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

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

বৈধতা

সেন্সর 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 পরীক্ষায় উত্তীর্ণ হওয়া গুরুত্বপূর্ণ।

ভিটিএস পরীক্ষা

সেন্সর AIDL HAL-এর VTS পরীক্ষাগুলি হার্ডওয়্যার/ইন্টারফেস/সেন্সর/aidl/vts/- এ অবস্থিত। এই পরীক্ষাগুলি নিশ্চিত করে যে সেন্সর HAL সঠিকভাবে প্রয়োগ করা হয়েছে এবং ISensors.aidl এবং ISensorsCallback.aidl মধ্যে সমস্ত প্রয়োজনীয়তা সঠিকভাবে পূরণ করা হয়েছে।

HAL চালু করুন

initialize() ফাংশনটি ফ্রেমওয়ার্ক এবং এইচএএল-এর মধ্যে FMQ স্থাপন করতে সমর্থিত হতে হবে।

উপলব্ধ সেন্সর প্রকাশ করুন

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

এফএমকিউতে সেন্সর ইভেন্ট লিখুন

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

WAKE_UP ইভেন্ট

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

সেন্সর AIDL HAL-এ, WAKE_UP ইভেন্টের জন্য সেন্সর HAL দ্বারা সুরক্ষিত ওয়েক লকটি অবশ্যই SensorsHAL_WAKEUP দিয়ে শুরু হবে।

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

সেন্সর HAL 1.0-এ poll() ফাংশন ব্যবহার করে ডায়নামিক সেন্সর ফেরত দেওয়া হয়েছিল। সেন্সর AIDL HAL এর জন্য প্রয়োজন যে ডাইনামিক সেন্সর কানেকশন পরিবর্তন হলেই ISensorsCallbackonDynamicSensorsConnected এবং onDynamicSensorsDisconnected করা হবে। এই কলব্যাকগুলি ISensorsCallback পয়েন্টারের অংশ হিসাবে উপলব্ধ যা initialize() ফাংশনের মাধ্যমে সরবরাহ করা হয়।

অপারেশন মোড

WAKE_UP সেন্সরগুলির জন্য DATA_INJECTION মোড অবশ্যই সমর্থিত হবে৷

মাল্টি-এইচএএল সমর্থন

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