সেন্সর হার্ডওয়্যার অ্যাবস্ট্রাকশন লেয়ার (HAL) হল Android সেন্সর ফ্রেমওয়ার্ক এবং অ্যাক্সিলরোমিটার বা জাইরোস্কোপের মতো ডিভাইসের সেন্সরগুলির মধ্যে ইন্টারফেস। সেন্সর HAL এমন ফাংশন সংজ্ঞায়িত করে যা ফ্রেমওয়ার্ককে সেন্সর নিয়ন্ত্রণ করার অনুমতি দেওয়ার জন্য অবশ্যই প্রয়োগ করতে হবে।
নতুন ও আপগ্রেড করা ডিভাইসের জন্য Android 10 ও তার পরবর্তী যেকোনও ভার্সনে Sensors HAL 2.0 উপলভ্য। Sensors HAL 2.0 হল Sensors HAL 1.0-এর উপর ভিত্তি করে তৈরি, তবে এতে বেশ কিছু মূল পার্থক্য রয়েছে, যার কারণে এটি ব্যাকওয়ার্ড কম্প্যাটিবল নয়। HAL থেকে Android সেন্সর ফ্রেমওয়ার্কে সেন্সর ইভেন্ট পাঠাতে Sensors HAL 2.0 ফাস্ট মেসেজ কিউ (FMQ) ব্যবহার করে।
নতুন ও আপগ্রেড করা ডিভাইসের জন্য Android 11 ও তার পরবর্তী যেকোনও ভার্সনে
সেন্সর HAL 2.1 উপলভ্য। Sensors HAL 2.1 হল Sensors HAL 2.0-এর একটি আইটেরেশন
যা
HINGE_ANGLE
সেন্সর টাইপ এক্সপোজ করে এবং HINGE_ANGLE টাইপ গ্রহণ করার জন্য বিভিন্ন পদ্ধতি আপডেট করে।
HAL 2.1 ইন্টারফেস
Sensors HAL 2.1-এর জন্য ডকুমেন্টেশনের মূল সোর্স হল HAL
definition-এর মধ্যে
hardware/interfaces/sensors/2.1/ISensors.hal।
এই পৃষ্ঠা ও ISensors.hal-এর মধ্যে প্রয়োজনীয়তার কোনও দ্বন্দ্ব থাকলে,
ISensors.hal-এর প্রয়োজনীয়তা ব্যবহার করুন।
HAL 2.0 ইন্টারফেস
Sensors HAL 2.0-এর ডকুমেন্টেশনের প্রধান সোর্স হল HAL
ডেফিনেশন, যা
hardware/interfaces/sensors/2.0/ISensors.hal-এ রয়েছে।
এই পৃষ্ঠা ও ISensors.hal-এর মধ্যে প্রয়োজনীয়তার কোনও বিরোধ থাকলে,
ISensors.hal-এর প্রয়োজনীয়তা ব্যবহার করুন।
Sensor HAL 2.0 ও HAL 2.1 প্রয়োগ করা
Sensors HAL 2.0 বা 2.1 প্রয়োগ করতে, কোনও অবজেক্টকে অবশ্যই ISensors
ইন্টারফেস এক্সটেন্ড করতে হবে এবং
2.0/ISensors.hal
বা
2.1/ISensors.hal-এ সংজ্ঞায়িত সব ফাংশন প্রয়োগ করতে হবে।
HAL চালু করা
Android সেন্সর ফ্রেমওয়ার্ককে সেন্সর HAL-কে ইনিশিয়ালাইজ করতে হবে, তবেই এটি
ব্যবহার করা যাবে। ফ্রেমওয়ার্ক HAL 2.0-এর জন্য initialize() ফাংশন এবং HAL 2.1-এর জন্য initialize_2_1() ফাংশন কল করে যাতে সেন্সর HAL-এ তিনটি প্যারামিটার প্রদান করা যায়: দুটি FMQ ডেসক্রিপ্টর এবং একটি ISensorsCallback অবজেক্টের পয়েন্টার।
ফ্রেমওয়ার্কে সেন্সর
ইভেন্ট লেখার জন্য ব্যবহৃত ইভেন্ট FMQ তৈরি করতে HAL প্রথম ডেসক্রিপ্টর ব্যবহার করে। HAL দ্বিতীয় ডেসক্রিপ্টর ব্যবহার করে ওয়েক লক FMQ তৈরি করে যা WAKE_UPটি সেন্সর ইভেন্টের জন্য HAL ওয়েক লক রিলিজ করার সময় সিঙ্ক করতে ব্যবহার করা হয়। HAL-কে অবশ্যই ISensorsCallback অবজেক্টের একটি পয়েন্টার সেভ করতে হবে, যাতে
প্রয়োজনীয় কলব্যাক ফাংশন ইনভোক করা যায়।
Sensors HAL শুরু করার সময় initialize() বা initialize_2_1() ফাংশনটিই প্রথম
ফাংশন হিসেবে কল করতে হবে।
উপলভ্য সেন্সর এক্সপোজ করা
ডিভাইসে উপলভ্য সব স্ট্যাটিক সেন্সরের তালিকা পেতে, HAL 2.0-এ
getSensorsList() ফাংশন এবং HAL 2.1-এ getSensorsList_2_1() ফাংশন
ব্যবহার করুন। এই ফাংশন সেন্সরগুলির একটি তালিকা রিটার্ন করে, প্রতিটি সেন্সরকে
এর হ্যান্ডেল দ্বারা অনন্যভাবে শনাক্ত করা হয়। সেন্সর HAL রিস্টার্ট করা হলে, প্রদত্ত সেন্সরের হ্যান্ডেল পরিবর্তন করা যাবে না।
ডিভাইস রিবুট করলে এবং সিস্টেম সার্ভার রিস্টার্ট করলে হ্যান্ডেল পরিবর্তন হতে পারে।
একাধিক সেন্সর একই ধরনের সেন্সর ও ওয়েক-আপ প্রপার্টি শেয়ার করলে, তালিকার
প্রথম সেন্সরকে ডিফল্ট সেন্সর বলা হয় এবং getDefaultSensor(int sensorType, bool wakeUp)
ফাংশন ব্যবহার করা অ্যাপকে
এটি রিটার্ন করা হয়।
সেন্সর তালিকার স্থিতিশীলতা
Sensors HAL রিস্টার্ট করার পরে, getSensorsList() বা
getSensorsList_2_1()-এর মাধ্যমে ফেরত পাঠানো ডেটা যদি রিস্টার্ট করার আগে পাওয়া সেন্সর তালিকার তুলনায়
উল্লেখযোগ্য পরিবর্তন দেখায়, তাহলে ফ্রেমওয়ার্ক
Android রানটাইম রিস্টার্ট করে। সেন্সর তালিকায় উল্লেখযোগ্য পরিবর্তন বলতে, কোনও নির্দিষ্ট হ্যান্ডেল সহ সেন্সর অনুপস্থিত থাকলে বা তার অ্যাট্রিবিউট পরিবর্তিত হলে অথবা নতুন
সেন্সর যোগ করা হলে, সেইসব ক্ষেত্রে করা পরিবর্তনকে বোঝায়। যদিও Android রানটাইম রিস্টার্ট করলে ব্যবহারকারীর
অসুবিধা হতে পারে, তবে এটি প্রয়োজন কারণ Android ফ্রেমওয়ার্ক আর
Android API কন্ট্র্যাক্ট মেনে চলতে পারে না। এর কারণ হল, কোনও অ্যাপের
লাইফটাইম চলাকালীন স্ট্যাটিক (ননডায়নামিক) সেন্সর পরিবর্তন হয় না। এর ফলে ফ্রেমওয়ার্ক অ্যাপের করা অ্যাক্টিভ সেন্সর অনুরোধ
আবার এস্টাবলিশ করতে পারে না। তাই, HAL ভেন্ডরদের পরামর্শ দেওয়া হয় যে
অপ্রয়োজনীয় সেন্সর তালিকা পরিবর্তন এড়িয়ে চলুন।
স্থিতিশীল সেন্সর হ্যান্ডেল নিশ্চিত করতে, HAL-কে অবশ্যই ডিভাইসে দেওয়া ফিজিক্যাল সেন্সরকে তার হ্যান্ডেলের সাথে ডিটারমিনিস্টিক পদ্ধতিতে ম্যাপ করতে হবে। যদিও Sensors HAL ইন্টারফেসের মাধ্যমে কোনও নির্দিষ্ট প্রয়োগ বাধ্যতামূলক নয়, তবে এই প্রয়োজনীয়তা পূরণ করার জন্য ডেভেলপারদের কাছে একাধিক বিকল্প উপলভ্য।
যেমন, প্রতিটি সেন্সরের নির্দিষ্ট অ্যাট্রিবিউট, যেমন বিক্রেতা, মডেল এবং সেন্সরের ধরন
একত্রিত করে সেন্সরের তালিকা সাজানো যেতে পারে। আরেকটি বিকল্প নির্ভর করে
এই তথ্যের উপর যে ডিভাইসের স্ট্যাটিক সেন্সরের সেট হার্ডওয়্যারে ফিক্স করা থাকে, তাই
getSensorsList() বা getSensorsList_2_1() থেকে রিটার্ন করার আগে HAL-কে জানতে হবে যে সব প্রত্যাশিত সেন্সর
কখন ইনিশিয়ালাইজেশন সম্পূর্ণ করেছে। এই
প্রত্যাশিত সেন্সরগুলির তালিকা HAL বাইনারিতে কম্পাইল করা বা ফাইল সিস্টেমে
কনফিগারেশন ফাইলে স্টোর করা যেতে পারে এবং স্থিতিশীল হ্যান্ডেল পাওয়ার জন্য
সেগুলি যেভাবে দেখানো হয় সেই ক্রম ব্যবহার করা যেতে পারে। যদিও সেরা সমাধান আপনার HAL-এর নির্দিষ্ট প্রয়োগের বিবরণের উপর নির্ভর করে, মূল প্রয়োজনীয়তা হল HAL রিস্টার্ট জুড়ে সেন্সর হ্যান্ডেলগুলি পরিবর্তন হয় না।
সেন্সর কনফিগার করা
সেন্সর চালু করার আগে, batch() ফাংশন ব্যবহার করে স্যাম্পলিং পিরিয়ড ও সর্বাধিক রিপোর্টিং লেটেন্সি সহ সেন্সর কনফিগার করতে হবে।
batch() ব্যবহার করে যেকোনও সময় সেন্সরকে আবার কনফিগার করা যেতে হবে এবং এর ফলে সেন্সর ডেটা
মুছে গেলে চলবে না।
স্যাম্পলিং পিরিয়ড
যে সেন্সর টাইপ কনফিগার করা হচ্ছে তার উপর ভিত্তি করে স্যাম্পলিং পিরিয়ডের অর্থ আলাদা হয়:
- ধারাবাহিক: সেন্সর ইভেন্ট একটানা হারে তৈরি হয়।
- পরিবর্তন হলে: স্যাম্পেল নেওয়ার সময়কালের চেয়ে দ্রুত ইভেন্ট তৈরি হয় না এবং পরিমাপ করা ভ্যালু পরিবর্তিত না হলে স্যাম্পেল নেওয়ার সময়কালের চেয়ে ধীরে ধীরে তৈরি হতে পারে।
- ওয়ান-শট: স্যাম্পেল নেওয়ার সময়সীমা উপেক্ষা করা হয়।
- বিশেষ: আরও বিবরণের জন্য, সেন্সরের ধরন দেখুন।
স্যাম্পলিং পিরিয়ড ও সেন্সরের রিপোর্টিং মোডের মধ্যে ইন্টার্যাকশন সম্পর্কে জানতে, রিপোর্টিং মোড দেখুন।
রিপোর্টিংয়ের সর্বাধিক লেটেন্সি
সর্বাধিক রিপোর্টিং ল্যাটেন্সি হল ন্যানোসেকেন্ডে সর্বাধিক সময় যা ইভেন্ট বিলম্বিত হতে পারে এবং SoC জেগে থাকাকালীন HAL-এর মাধ্যমে Event FMQ-তে লেখার আগে হার্ডওয়্যার FIFO-তে স্টোর করা যেতে পারে।
শূন্য মান থেকে বোঝা যায় যে ইভেন্টগুলি পরিমাপ করা হলেই সেগুলি রিপোর্ট করতে হবে। এর জন্য FIFO সম্পূর্ণভাবে এড়িয়ে যাওয়া অথবা FIFO-তে সেন্সর থেকে কোনও একটি ইভেন্ট থাকলেই FIFO খালি করে দেওয়া যেতে পারে।
যেমন, SoC চালু থাকলে, ৫০ Hz-এ অ্যাক্টিভেট হওয়া অ্যাক্সেলেরোমিটার, সর্বাধিক রিপোর্টিং লেটেন্সি শূন্য ট্রিগার সহ প্রতি সেকেন্ডে ৫০ বার ইন্টারাপ্ট করে।
সর্বাধিক রিপোর্টিং ল্যাটেন্সি শূন্যের থেকে বেশি হলে, সেন্সর ইভেন্ট শনাক্ত করার সাথে সাথেই রিপোর্ট করতে হবে না। সর্বাধিক রিপোর্টিং লেটেন্সি এর চেয়ে বেশি দেরি না হলে, ইভেন্টগুলি সাময়িকভাবে হার্ডওয়্যার FIFO-তে স্টোর করা যেতে পারে এবং ব্যাচে রিপোর্ট করা যেতে পারে। আগের ব্যাচের পর থেকে সব ইভেন্ট রেকর্ড করা হয় এবং একবারে ফেরত দেওয়া হয়। এর ফলে SoC-তে পাঠানো ইন্টারাপ্টের সংখ্যা কমে যায় এবং সেন্সর ডেটা ক্যাপচার ও ব্যাচিং করার সময় SoC কম পাওয়ার মোডে সুইচ করতে পারে।
প্রতিটি ইভেন্টের সাথে একটি টাইমস্ট্যাম্প যুক্ত থাকে। ইভেন্ট রিপোর্ট করার সময় পিছিয়ে দিলে ইভেন্ট টাইমস্ট্যাম্পের উপর কোনও প্রভাব পড়লে চলবে না। টাইমস্ট্যাম্পটি অবশ্যই সঠিক হতে হবে এবং ইভেন্টটি শারীরিকভাবে যে সময়ে ঘটেছে তার সাথে মিল থাকতে হবে, এটি রিপোর্ট করার সময় নয়।
শূন্য নয় এমন সর্বাধিক রিপোর্টিং লেটেন্সি সহ সেন্সর ইভেন্ট রিপোর্ট করা সংক্রান্ত অতিরিক্ত তথ্য ও প্রয়োজনীয়তার জন্য, ব্যাচিং দেখুন।
সেন্সর অ্যাক্টিভেট করুন
ফ্রেমওয়ার্ক activate() ফাংশন ব্যবহার করে সেন্সর চালু ও বন্ধ করে।
কোনও সেন্সর অ্যাক্টিভেট করার আগে, ফ্রেমওয়ার্ককে অবশ্যই batch() ব্যবহার করে সেন্সরটি কনফিগার করতে হবে।
কোনও সেন্সর বন্ধ করার পরে, সেই সেন্সর থেকে অতিরিক্ত সেন্সর ইভেন্ট অবশ্যই ইভেন্ট FMQ-তে লেখা যাবে না।
ফ্লাশ সেন্সর
কোনও সেন্সরকে ব্যাচ সেন্সর ডেটা কনফিগার করা হলে, ফ্রেমওয়ার্ক flush() কল করে ব্যাচ করা সেন্সর ইভেন্টকে অবিলম্বে
ফ্লাশ করতে বাধ্য করতে পারে। এর ফলে
নির্দিষ্ট সেন্সর হ্যান্ডেলের জন্য ব্যাচ করা সেন্সর ইভেন্ট অবিলম্বে
ইভেন্ট FMQ-তে লেখা হয়। flush()-এ কল করার ফলে লেখা সেন্সর ইভেন্টের শেষে
সেন্সর HAL-কে অবশ্যই একটি ফ্লাশ সম্পূর্ণ ইভেন্ট
যোগ করতে হবে।
ফ্লাশ অ্যাসিঙ্ক্রোনাসভাবে হয় (অর্থাৎ, এই ফাংশনকে সঙ্গে সঙ্গে রিটার্ন করতে হবে)। ইমপ্লিমেন্টেশনে একাধিক সেন্সরের জন্য একটি FIFO ব্যবহার করা হলে, সেই FIFO ফ্লাশ করা হয় এবং শুধুমাত্র নির্দিষ্ট সেন্সরের জন্য ফ্লাশ সম্পূর্ণ হওয়ার ইভেন্ট যোগ করা হয়।
নির্দিষ্ট সেন্সরে FIFO (কোনও বাফারিং সম্ভব নয়) না থাকলে অথবা কল করার সময় FIFO খালি থাকলে, flush()-কে অবশ্যই সফল হতে হবে এবং সেই সেন্সরের জন্য ফ্ল্যাশ
সম্পূর্ণ হওয়ার ইভেন্ট পাঠাতে হবে। এটি ওয়ান-শট সেন্সর ছাড়া অন্য সব সেন্সরের ক্ষেত্রে
প্রযোজ্য।
এক-শট সেন্সরের জন্য flush() কল করা হলে, flush()-কে অবশ্যই
BAD_VALUE রিটার্ন করতে হবে এবং ফ্ল্যাশ সম্পূর্ণ হওয়ার ইভেন্ট তৈরি করা যাবে না।
FMQ-তে সেন্সর ইভেন্ট লেখা
Android সেন্সর ফ্রেমওয়ার্কে সেন্সর ইভেন্ট পুশ করার জন্য Sensors HAL, Event FMQ ব্যবহার করে।
ইভেন্ট FMQ হল একটি সিঙ্ক্রোনাইজ করা FMQ, যার অর্থ হল উপলভ্য স্পেসের থেকে বেশি ইভেন্ট FMQ-তে লেখার চেষ্টা করলে লেখা যাবে না। এই ধরনের ক্ষেত্রে, HAL-কে নির্ধারণ করতে হবে যে ইভেন্টের বর্তমান সেটকে দুটি ছোট ইভেন্টের গ্রুপ হিসেবে লেখা হবে নাকি পর্যাপ্ত স্পেস উপলভ্য হলে সব ইভেন্ট একসাথে লেখা হবে।
Sensors HAL যখন Event FMQ-তে কাঙ্ক্ষিত সংখ্যক সেন্সর ইভেন্ট লিখেছে, তখন Sensors HAL-কে অবশ্যই ফ্রেমওয়ার্ককে জানাতে হবে যে ইভেন্ট রেডি আছে। এটি করার জন্য, Event FMQ-এর
EventFlag::wake ফাংশনে EventQueueFlagBits::READ_AND_PROCESS বিট লিখতে হবে।
EventFlag::createEventFlag ব্যবহার করে Event FMQ
থেকে EventFlag তৈরি করা যেতে পারে এবং Event FMQ-এর getEventFlagWord()
ফাংশন।
Sensor HAL 2.0/2.1, ইভেন্ট FMQ-তে write ও writeBlocking, দু'টিই সাপোর্ট করে।
ডিফল্ট প্রয়োগ write ব্যবহার করার জন্য একটি রেফারেন্স প্রদান করে। যদি
writeBlocking ফাংশন ব্যবহার করা হয়, তাহলে readNotification ফ্ল্যাগকে অবশ্যই
EventQueueFlagBits::EVENTS_READ হিসেবে সেট করতে হবে, যা ফ্রেমওয়ার্ক Event FMQ থেকে
ইভেন্ট পড়ার সময় সেট করে। রাইট নোটিফিকেশন ফ্ল্যাগ অবশ্যই
EventQueueFlagBits::READ_AND_PROCESS-এ সেট করতে হবে, যা ফ্রেমওয়ার্ককে জানায় যে ইভেন্টগুলি
ইভেন্ট FMQ-তে লেখা হয়েছে।
WAKE_UP ইভেন্ট
WAKE_UP ইভেন্ট হল সেন্সর ইভেন্ট যা অ্যাপ্লিকেশন প্রসেসর (AP)-কে
জাগিয়ে তোলে এবং অবিলম্বে ইভেন্ট ম্যানেজ করে। যখনই কোনও WAKE_UP ইভেন্ট
ইভেন্ট FMQ-তে লেখা হয়, তখন ফ্রেমওয়ার্ক ইভেন্টটি ম্যানেজ না করা পর্যন্ত সিস্টেম যাতে চালু থাকে তা নিশ্চিত করতে সেন্সর HAL-কে অবশ্যই একটি ওয়েক লক সুরক্ষিত করতে হবে। WAKE_UP ইভেন্ট পাওয়ার পরে, ফ্রেমওয়ার্ক নিজের ওয়েক লক সুরক্ষিত করে, যার ফলে
Sensors HAL নিজের ওয়েক লক রিলিজ করতে পারে। Sensor HAL
তার ওয়েক লক রিলিজ করলে সিঙ্ক্রোনাইজ করতে, ওয়েক লক FMQ ব্যবহার করুন।
ফ্রেমওয়ার্ক কতগুলি WAKE_UP ইভেন্ট ম্যানেজ করেছে তা নির্ধারণ করতে,
সেন্সর HAL-কে অবশ্যই ওয়েক লক FMQ পড়তে হবে। মোট আনহ্যান্ডেল করা WAKE_UP ইভেন্টের সংখ্যা শূন্য হলে, HAL শুধুমাত্র WAKE_UP ইভেন্টের জন্য এর ওয়েক লক
রিলিজ করবে।
সেন্সর ইভেন্ট ম্যানেজ করার পরে, ফ্রেমওয়ার্ক WAKE_UP ইভেন্ট হিসেবে চিহ্নিত ইভেন্টের সংখ্যা গণনা করে এবং এই সংখ্যাটি ওয়েক লক FMQ-তে লিখে রাখে।
ফ্রেমওয়ার্ক, Wake Lock FMQ-তে ডেটা লেখার সময়, Wake Lock FMQ-তে WakeLockQueueFlagBits::DATA_WRITTEN write
বিজ্ঞপ্তি সেট করে।
ডায়নামিক সেন্সর
ডায়নামিক সেন্সর হল এমন সেন্সর যা ডিভাইসের অংশ নয়, তবে ডিভাইসে ইনপুট হিসেবে ব্যবহার করা যায়, যেমন অ্যাক্সিলরোমিটার সহ গেমপ্যাড।
ডায়নামিক সেন্সর কানেক্ট করা হলে, Sensors HAL থেকে
ISensorsCallback-এ onDynamicSensorConnected ফাংশন কল করতে হবে। এটি নতুন ডায়নামিক সেন্সর
ফ্রেমওয়ার্ককে বিজ্ঞপ্তি দেয় এবং ফ্রেমওয়ার্কের মাধ্যমে সেন্সরকে নিয়ন্ত্রণ করতে
এবং ক্লায়েন্টদের দ্বারা সেন্সরের ইভেন্ট ব্যবহার করার অনুমতি দেয়।
একইভাবে, কোনও ডায়নামিক সেন্সর ডিসকানেক্ট করা হলে, ISensorsCallback-এর মধ্যে থাকা
onDynamicSensorDisconnected ফাংশনকে কল করতে হবে, যাতে
ফ্রেমওয়ার্ক সেইসব সেন্সর সরিয়ে দিতে পারে যেগুলি আর উপলভ্য নেই।
সরাসরি চ্যানেল
ডাইরেক্ট চ্যানেল হল এমন একটি অপারেশন পদ্ধতি যেখানে সেন্সর ইভেন্টগুলি Android সেন্সর ফ্রেমওয়ার্ককে বাইপাস করে ইভেন্ট FMQ-এর পরিবর্তে নির্দিষ্ট মেমরিতে লেখা হয়। সরাসরি চ্যানেল রেজিস্টার করা ক্লায়েন্টকে অবশ্যই সরাসরি চ্যানেল তৈরি করতে ব্যবহৃত মেমরি থেকে সরাসরি সেন্সর ইভেন্ট
পড়তে হবে এবং ফ্রেমওয়ার্কের মাধ্যমে সেন্সর ইভেন্ট
পাবে না। configDirectReport()
ফাংশনটি স্বাভাবিক অপারেশনের জন্য batch()-এর মতো এবং সরাসরি রিপোর্ট চ্যানেল
কনফিগার করে।
registerDirectChannel() ও unregisterDirectChannel() ফাংশন একটি নতুন ডাইরেক্ট চ্যানেল তৈরি করে
বা মুছে দেয়।
অপারেশন মোড
setOperationMode()ফাংশন ফ্রেমওয়ার্ককে একটি সেন্সর কনফিগার করার অনুমতি দেয়
যাতে ফ্রেমওয়ার্ক সেন্সরে সেন্সর ডেটা ইনজেক্ট করতে পারে। এটি টেস্টিংয়ের জন্য উপযোগী, বিশেষ করে ফ্রেমওয়ার্কের নিচে থাকা অ্যালগরিদমের জন্য।
HAL 2.0-এর injectSensorData() ফাংশন এবং HAL 2.0-এর injectSensorsData_2_1()
ফাংশন সাধারণত
সেন্সর HAL-এ অপারেশনাল প্যারামিটার পুশ করতে ব্যবহার করা হয়। এছাড়াও, কোনও
নির্দিষ্ট সেন্সরে সেন্সর ইভেন্ট ইনজেক্ট করতে এই ফাংশন ব্যবহার করা যেতে পারে।
যাচাইকরণ
Sensors 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 পরীক্ষা
সেন্সর HAL 2.0-এর জন্য VTS পরীক্ষাগুলি
hardware/interfaces/sensors/2.0/vts-এ অবস্থিত।
সেন্সর HAL 2.1-এর জন্য VTS পরীক্ষাগুলি
hardware/interfaces/sensors/2.1/vts-এ অবস্থিত।
এইসব পরীক্ষা নিশ্চিত করে যে Sensors HAL সঠিকভাবে প্রয়োগ করা হয়েছে এবং ISensors.hal ও ISensorsCallback.hal-এর মধ্যে থাকা সব
প্রয়োজনীয়তা সঠিকভাবে পূরণ করা হয়েছে।
2.0 থেকে Sensors HAL 2.1-এ আপগ্রেড করা
2.0 থেকে 2.1-এ আপগ্রেড করার সময়, আপনার HAL ইমপ্লিমেন্টেশনে HAL 2.1-এর ধরন সহ
initialize_2_1(), getSensorsList_2_1() ও injectSensorsData_2_1()
পদ্ধতি থাকতে হবে। এইসব পদ্ধতিকে উপরে HAL 2.0-এর জন্য উল্লিখিত একই
প্রয়োজনীয়তা পূরণ করতে হবে।
কারণ মাইনর ভার্সন HAL-কে আগের HAL-এর সব ফাংশন কাজ করাতে হবে, 2.1 HAL-কে 2.0 HAL হিসেবে ইনিশিয়ালাইজ করা কাজ করাতে হবে। দুটি HAL ভার্সনই কাজ করে এমন জটিলতা এড়াতে, Multi-HAL 2.1 ব্যবহার করার জন্য অত্যন্ত সাজেস্ট করা হয়।
আপনার নিজস্ব Sensors 2.1 HAL কীভাবে প্রয়োগ করবেন তার একটি উদাহরণ পেতে, Sensors.h দেখুন।
1.0 থেকে Sensors HAL 2.0-তে আপগ্রেড করা
Sensors HAL 1.0 থেকে 2.0-এ আপগ্রেড করার সময়, আপনার HAL প্রয়োগ নিম্নলিখিত প্রয়োজনীয়তা পূরণ করছে কিনা তা নিশ্চিত করুন।
HAL চালু করা
ফ্রেমওয়ার্ক ও HAL-এর মধ্যে FMQ স্থাপন করতে initialize() ফাংশন কাজ করতে হবে।
উপলভ্য সেন্সর এক্সপোজ করুন
Sensor HAL 2.0-এ, getSensorsList() ফাংশনকে একটি ডিভাইস বুট করার সময় একই মান
ফেরাতে হবে, এমনকি Sensor HAL রিস্টার্ট করা হলেও। getSensorsList() ফাংশনের নতুন প্রয়োজনীয়তা
হল, একটি ডিভাইস বুট করার সময়
সেটিকে একই ভ্যালু রিটার্ন করতে হবে, এমনকি সেন্সর HAL রিস্টার্ট হলেও। এর ফলে, সিস্টেম সার্ভার
আবার চালু হলে, ফ্রেমওয়ার্ক
সেন্সর কানেকশন আবার স্থাপন করার চেষ্টা করতে পারে। ডিভাইস রিবুট করার পরে getSensorsList()-এর মাধ্যমে ফিরিয়ে দেওয়া ভ্যালু পরিবর্তন হতে পারে।
FMQ-তে সেন্সর ইভেন্ট লেখা
poll() কল করার জন্য অপেক্ষা করার পরিবর্তে, Sensors HAL 2.0-এ, Sensors
HAL-কে অবশ্যই সেন্সর ইভেন্ট উপলভ্য হলেই Event FMQ-তে সেন্সর ইভেন্ট লিখতে হবে। ফ্রেমওয়ার্কের মধ্যে FMQ রিড করার জন্য
EventFlag-এ সঠিক বিট লেখার দায়িত্বও HAL-এর।
WAKE_UP ইভেন্ট
Sensors HAL 1.0-এ, WAKE_UP
ইভেন্ট poll()-এ পোস্ট করার পরে WAKE_UP poll()-এ যেকোনও পরবর্তী কলে HAL তার ওয়েক লক রিলিজ করতে পারত
poll() কারণ এটি ইঙ্গিত করত যে ফ্রেমওয়ার্ক সমস্ত সেন্সর
ইভেন্ট প্রসেস করেছে এবং প্রয়োজন হলে ওয়েক লক পেয়েছে। কারণ, Sensors HAL 2.0-তে,
FMQ-তে লেখা ইভেন্ট ফ্রেমওয়ার্ক কখন প্রসেস করেছে তা HAL আর জানে না, Wake Lock FMQ ফ্রেমওয়ার্ককে HAL-এর সাথে যোগাযোগ করার অনুমতি দেয় যখন এটি
WAKE_UP ইভেন্ট ম্যানেজ করে।
Sensors HAL 2.0-এ, WAKE_UP
ইভেন্টের জন্য Sensors HAL দ্বারা সুরক্ষিত ওয়েক লক অবশ্যই SensorsHAL_WAKEUP দিয়ে শুরু হতে হবে।
ডায়নামিক সেন্সর
Sensors HAL 1.0-এ poll() ফাংশন ব্যবহার করে ডায়নামিক সেন্সর রিটার্ন করা হয়েছে।
ডায়নামিক
সেন্সর কানেকশন পরিবর্তন হলে, ISensorsCallback-এ onDynamicSensorsConnected এবং
onDynamicSensorsDisconnected কল করতে হবে, এটি Sensors HAL 2.0-এর প্রয়োজন। এইসব কলব্যাক ISensorsCallback পয়েন্টারের অংশ হিসেবে উপলভ্য
যা initialize() ফাংশনের মাধ্যমে প্রদান করা হয়।
অপারেশন মোড
WAKE_UP সেন্সরের জন্য DATA_INJECTION মোড অবশ্যই Sensors HAL
2.0-এ কাজ করতে হবে।
মাল্টি-HAL সহায়তা
সেন্সর HAL 2.0 এবং 2.1, সেন্সর মাল্টি-HAL ফ্রেমওয়ার্ক ব্যবহার করে মাল্টি-HAL-এ কাজ করে। ইমপ্লিমেন্টেশন সংক্রান্ত বিবরণের জন্য, Sensors HAL 1.0 থেকে পোর্ট করা দেখুন।