সেন্সর হার্ডওয়্যার অ্যাবস্ট্রাকশন লেয়ার (HAL) হল অ্যান্ড্রয়েড সেন্সর ফ্রেমওয়ার্ক এবং একটি ডিভাইসের সেন্সর, যেমন একটি অ্যাক্সিলোমিটার বা জাইরোস্কোপের মধ্যে ইন্টারফেস। সেন্সর HAL সেই ফাংশনগুলিকে সংজ্ঞায়িত করে যা সেন্সরগুলিকে নিয়ন্ত্রণ করতে ফ্রেমওয়ার্ককে অনুমতি দেওয়ার জন্য প্রয়োগ করা আবশ্যক৷
সেন্সর HAL 2.0 নতুন এবং আপগ্রেড করা ডিভাইসের জন্য Android 10 এবং উচ্চতর সংস্করণে উপলব্ধ। সেন্সর HAL 2.0 সেন্সর HAL 1.0 এর উপর ভিত্তি করে তৈরি করা হয়েছে কিন্তু এর বেশ কিছু মূল পার্থক্য রয়েছে, যা এটিকে পিছিয়ে যাওয়া সামঞ্জস্যপূর্ণ হতে বাধা দেয়। সেন্সর HAL 2.0 ফাস্ট মেসেজ কিউ (FMQs) ব্যবহার করে HAL থেকে সেন্সর ইভেন্টগুলিকে Android সেন্সর ফ্রেমওয়ার্কে পাঠাতে।
সেন্সর HAL 2.1 নতুন এবং আপগ্রেড করা ডিভাইসগুলির জন্য Android 11 এবং উচ্চতর সংস্করণে উপলব্ধ। সেন্সর HAL 2.1 হল সেন্সর HAL 2.0-এর একটি পুনরাবৃত্তি যা HINGE_ANGLE সেন্সরের ধরন প্রকাশ করে এবং HINGE_ANGLE
ধরন গ্রহণ করার জন্য বিভিন্ন পদ্ধতি আপডেট করে।
HAL 2.1 ইন্টারফেস
সেন্সর HAL 2.1-এর ডকুমেন্টেশনের প্রধান উৎস হল হার্ডওয়্যার/ইন্টারফেস/সেন্সর/2.1/ISensors.hal- এ HAL সংজ্ঞার মধ্যে। এই পৃষ্ঠা এবং ISensors.hal
মধ্যে প্রয়োজনীয়তার দ্বন্দ্ব থাকলে, ISensors.hal
এ প্রয়োজনীয়তা ব্যবহার করুন।
HAL 2.0 ইন্টারফেস
সেন্সর HAL 2.0-এর ডকুমেন্টেশনের প্রধান উৎস হল হার্ডওয়্যার/ইন্টারফেস/সেন্সর/2.0/ISensors.hal- এ HAL সংজ্ঞার মধ্যে। এই পৃষ্ঠা এবং ISensors.hal
মধ্যে প্রয়োজনীয়তার দ্বন্দ্ব থাকলে, ISensors.hal
এ প্রয়োজনীয়তা ব্যবহার করুন।
HAL 2.0 এবং HAL 2.1 সেন্সর প্রয়োগ করুন
সেন্সর HAL 2.0 বা 2.1 বাস্তবায়ন করতে, একটি বস্তুকে অবশ্যই ISensors
ইন্টারফেস প্রসারিত করতে হবে এবং 2.0/ISensors.hal
বা 2.1/ISensors.hal
এ সংজ্ঞায়িত সমস্ত ফাংশন বাস্তবায়ন করতে হবে।
HAL চালু করুন
সেন্সর HAL ব্যবহার করার আগে অবশ্যই অ্যান্ড্রয়েড সেন্সর ফ্রেমওয়ার্ক দ্বারা শুরু করতে হবে। ফ্রেমওয়ার্ক HAL 2.0-এর জন্য initialize()
ফাংশন এবং HAL 2.1-এর জন্য initialize_2_1()
ফাংশনকে কল করে সেন্সর HAL-কে তিনটি প্যারামিটার প্রদান করতে: দুটি FMQ বর্ণনাকারী এবং একটি ISensorsCallback
অবজেক্টে একটি পয়েন্টার।
ফ্রেমওয়ার্কে সেন্সর ইভেন্ট লিখতে ব্যবহৃত ইভেন্ট FMQ তৈরি করতে HAL প্রথম বর্ণনাকারী ব্যবহার করে। HAL WAKE_UP
সেন্সর ইভেন্টের জন্য HAL তার ওয়েক লক রিলিজ করার সময় সিঙ্ক্রোনাইজ করতে ব্যবহৃত ওয়েক লক FMQ তৈরি করতে দ্বিতীয় বর্ণনাকারী ব্যবহার করে। HAL-কে অবশ্যই ISensorsCallback
অবজেক্টে একটি পয়েন্টার সংরক্ষণ করতে হবে যাতে যেকোনো প্রয়োজনীয় কলব্যাক ফাংশন আহ্বান করা যায়।
initialize()
বা initialize_2_1()
ফাংশনটি অবশ্যই প্রথম ফাংশন হতে হবে যা সেন্সর এইচএএল শুরু করার সময় বলা হয়।
উপলব্ধ সেন্সর প্রকাশ করুন
ডিভাইসে উপলব্ধ সমস্ত স্ট্যাটিক সেন্সরগুলির একটি তালিকা পেতে, HAL 2.0-এ getSensorsList()
ফাংশন এবং HAL 2.1-এ getSensorsList_2_1()
ফাংশন ব্যবহার করুন৷ এই ফাংশনটি সেন্সরগুলির একটি তালিকা প্রদান করে, প্রতিটি তার হ্যান্ডেল দ্বারা স্বতন্ত্রভাবে চিহ্নিত করা হয়। সেন্সর এইচএএল হোস্টিং প্রক্রিয়া পুনরায় আরম্ভ হলে একটি প্রদত্ত সেন্সরের জন্য হ্যান্ডেল পরিবর্তন করা উচিত নয়। ডিভাইস রিবুট এবং সিস্টেম সার্ভার রিস্টার্ট জুড়ে হ্যান্ডেলগুলি পরিবর্তিত হতে পারে।
যদি বেশ কয়েকটি সেন্সর একই সেন্সর টাইপ এবং ওয়েক-আপ প্রপার্টি শেয়ার করে, তাহলে তালিকার প্রথম সেন্সরটিকে ডিফল্ট সেন্সর বলা হয় এবং getDefaultSensor(int sensorType, bool wakeUp)
ফাংশন ব্যবহার করে এমন অ্যাপগুলিতে ফেরত দেওয়া হয়।
সেন্সর তালিকার স্থায়িত্ব
সেন্সর HAL রিস্টার্ট হওয়ার পরে, যদি getSensorsList()
বা getSensorsList_2_1()
দ্বারা প্রত্যাবর্তিত ডেটা রিস্টার্টের আগে পুনরুদ্ধার করা সেন্সর তালিকার তুলনায় একটি উল্লেখযোগ্য পরিবর্তন নির্দেশ করে, ফ্রেমওয়ার্কটি Android রানটাইম পুনরায় চালু করতে ট্রিগার করে। সেন্সর তালিকায় উল্লেখযোগ্য পরিবর্তনগুলি এমন ক্ষেত্রে অন্তর্ভুক্ত যেখানে একটি প্রদত্ত হ্যান্ডেল সহ একটি সেন্সর অনুপস্থিত বা বৈশিষ্ট্যগুলি পরিবর্তিত হয়েছে বা যেখানে নতুন সেন্সর চালু করা হয়েছে। যদিও অ্যান্ড্রয়েড রানটাইম রিস্টার্ট করা ব্যবহারকারীর জন্য বিঘ্নিত করে, এটি প্রয়োজন কারণ অ্যান্ড্রয়েড ফ্রেমওয়ার্ক আর অ্যান্ড্রয়েড API চুক্তি পূরণ করতে পারে না যে একটি অ্যাপের জীবদ্দশায় স্ট্যাটিক (ননডাইনামিক) সেন্সর পরিবর্তন হয় না। এটি অ্যাপগুলির দ্বারা তৈরি সক্রিয় সেন্সর অনুরোধগুলিকে পুনঃস্থাপন করা থেকে ফ্রেমওয়ার্কটিকে আটকাতে পারে৷ অতএব, এইচএএল বিক্রেতাদের এড়ানো যায় এমন সেন্সর তালিকা পরিবর্তন প্রতিরোধ করার পরামর্শ দেওয়া হয়।
স্থিতিশীল সেন্সর হ্যান্ডেলগুলি নিশ্চিত করার জন্য, এইচএএলকে অবশ্যই ডিভাইসের একটি প্রদত্ত শারীরিক সেন্সরকে তার হ্যান্ডেলে ম্যাপ করতে হবে। যদিও সেন্সর এইচএএল ইন্টারফেস দ্বারা কোনো নির্দিষ্ট বাস্তবায়ন বাধ্যতামূলক করা হয় না, তবে বিকাশকারীদের এই প্রয়োজনীয়তা পূরণের জন্য অনেকগুলি বিকল্প উপলব্ধ রয়েছে।
উদাহরণস্বরূপ, সেন্সর তালিকাটি প্রতিটি সেন্সরের নির্দিষ্ট বৈশিষ্ট্যগুলির সংমিশ্রণ ব্যবহার করে সাজানো যেতে পারে, যেমন বিক্রেতা, মডেল এবং সেন্সর প্রকার। আরেকটি বিকল্প এই বিষয়টির উপর নির্ভর করে যে ডিভাইসের স্ট্যাটিক সেন্সর সেটটি হার্ডওয়্যারে স্থির করা হয়েছে, তাই getSensorsList()
বা getSensorsList_2_1()
থেকে ফিরে আসার আগে 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 তৈরি করা যেতে পারে।
সেন্সর HAL 2.0/2.1 ইভেন্ট 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-তে ডেটা লেখে, তখনই বিজ্ঞপ্তি সেট করে।
ডায়নামিক সেন্সর
ডায়নামিক সেন্সর হল সেন্সর যেগুলি শারীরিকভাবে ডিভাইসের একটি অংশ নয় কিন্তু ডিভাইসে ইনপুট হিসাবে ব্যবহার করা যেতে পারে, যেমন একটি অ্যাক্সিলোমিটার সহ একটি গেমপ্যাড।
যখন একটি ডাইনামিক সেন্সর সংযুক্ত থাকে, তখন ISensorsCallback
এ onDynamicSensorConnected
ফাংশনটি সেন্সর HAL থেকে কল করতে হবে। এটি নতুন গতিশীল সেন্সরের কাঠামোকে অবহিত করে এবং সেন্সরটিকে ফ্রেমওয়ার্কের মাধ্যমে নিয়ন্ত্রিত করার অনুমতি দেয় এবং সেন্সরের ইভেন্টগুলি ক্লায়েন্টদের দ্বারা গ্রাস করা যায়।
একইভাবে, যখন একটি ডায়নামিক সেন্সর সংযোগ বিচ্ছিন্ন হয়, তখন ISensorsCallback
এ onDynamicSensorDisconnected
ফাংশনটিকে কল করতে হবে যাতে ফ্রেমওয়ার্কটি আর উপলব্ধ নেই এমন কোনো সেন্সরকে সরাতে পারে।
সরাসরি চ্যানেল
ডাইরেক্ট চ্যানেল হল অপারেশনের একটি পদ্ধতি যেখানে সেন্সর ইভেন্টগুলি Android সেন্সর ফ্রেমওয়ার্ককে বাইপাস করে ইভেন্ট FMQ এর পরিবর্তে নির্দিষ্ট মেমরিতে লেখা হয়। যে ক্লায়েন্ট একটি সরাসরি চ্যানেল নিবন্ধন করে তাকে অবশ্যই মেমরি থেকে সরাসরি সেন্সর ইভেন্টগুলি পড়তে হবে যা সরাসরি চ্যানেল তৈরি করতে ব্যবহৃত হয়েছিল এবং ফ্রেমওয়ার্কের মাধ্যমে সেন্সর ইভেন্টগুলি গ্রহণ করবে না। configDirectReport()
ফাংশনটি সাধারণ অপারেশনের জন্য batch()
এর অনুরূপ এবং সরাসরি রিপোর্ট চ্যানেল কনফিগার করে।
registerDirectChannel()
এবং unregisterDirectChannel()
ফাংশন একটি নতুন সরাসরি চ্যানেল তৈরি বা ধ্বংস করে।
অপারেশন মোড
setOperationMode()
ফাংশন ফ্রেমওয়ার্ককে একটি সেন্সর কনফিগার করার অনুমতি দেয় যাতে ফ্রেমওয়ার্কটি সেন্সরে সেন্সর ডেটা ইনজেক্ট করতে পারে। এটি পরীক্ষার জন্য উপযোগী, বিশেষ করে ফ্রেমওয়ার্কের নিচে বিদ্যমান অ্যালগরিদমগুলির জন্য।
HAL 2.0-এ injectSensorData()
ফাংশন এবং HAL 2.0-এ injectSensorsData_2_1()
ফাংশন সাধারণত সেন্সর 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 পরীক্ষায় উত্তীর্ণ হওয়া গুরুত্বপূর্ণ।
ভিটিএস পরীক্ষা
সেন্সর HAL 2.0-এর জন্য VTS পরীক্ষাগুলি হার্ডওয়্যার/ইন্টারফেস/সেন্সর/2.0/vts- এ অবস্থিত। সেন্সর HAL 2.1-এর জন্য VTS পরীক্ষাগুলি হার্ডওয়্যার/ইন্টারফেস/সেন্সর/2.1/vts- এ অবস্থিত। এই পরীক্ষাগুলি নিশ্চিত করে যে সেন্সর HAL সঠিকভাবে প্রয়োগ করা হয়েছে এবং ISensors.hal
এবং ISensorsCallback.hal
মধ্যে সমস্ত প্রয়োজনীয়তা সঠিকভাবে পূরণ করা হয়েছে।
2.0 থেকে সেন্সর HAL 2.1 এ আপগ্রেড করুন
2.0 থেকে সেন্সর HAL 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 সংস্করণ সমর্থন করার জটিলতা এড়াতে, মাল্টি-এইচএএল 2.1 ব্যবহার করার জন্য অত্যন্ত সুপারিশ করা হয়।
কিভাবে আপনার নিজস্ব সেন্সর 2.1 HAL বাস্তবায়ন করবেন তার একটি উদাহরণের জন্য, Sensors.h দেখুন।
1.0 থেকে সেন্সর HAL 2.0 এ আপগ্রেড করুন
1.0 থেকে সেন্সর HAL 2.0 এ আপগ্রেড করার সময়, নিশ্চিত করুন যে আপনার HAL বাস্তবায়ন নিম্নলিখিত প্রয়োজনীয়তাগুলি পূরণ করে৷
HAL চালু করুন
initialize()
ফাংশনটি ফ্রেমওয়ার্ক এবং এইচএএল-এর মধ্যে FMQ স্থাপন করতে সমর্থিত হতে হবে।
উপলব্ধ সেন্সর প্রকাশ করুন
সেন্সর HAL 2.0-এ, getSensorsList()
ফাংশন একটি একক ডিভাইস বুট করার সময় একই মান প্রদান করতে হবে, এমনকি সেন্সর HAL রিস্টার্ট জুড়ে। getSensorsList()
ফাংশনের একটি নতুন প্রয়োজনীয়তা হল যে এটি একটি একক ডিভাইস বুট করার সময় একই মান ফেরত দিতে হবে, এমনকি সেন্সর HAL রিস্টার্ট জুড়ে। সিস্টেম সার্ভার পুনরায় চালু হলে এটি ফ্রেমওয়ার্ককে সেন্সর সংযোগ পুনঃস্থাপন করার চেষ্টা করার অনুমতি দেয়। ডিভাইসটি রিবুট করার পরে getSensorsList()
দ্বারা প্রত্যাবর্তিত মান পরিবর্তন হতে পারে।
এফএমকিউতে সেন্সর ইভেন্ট লিখুন
সেন্সর HAL 2.0-এ poll()
ডাকার জন্য অপেক্ষা করার পরিবর্তে, সেন্সর ইভেন্টগুলি যখনই সেন্সর ইভেন্টগুলি উপলব্ধ থাকে তখন সেন্সর HAL কে অবশ্যই ইভেন্ট FMQ-তে সেন্সর ইভেন্টগুলিকে সক্রিয়ভাবে লিখতে হবে। FMQ ফ্রেমওয়ার্কের মধ্যে পড়ার জন্য EventFlag
সঠিক বিট লেখার জন্যও HAL দায়ী।
WAKE_UP ইভেন্ট
সেন্সর HAL 1.0-এ, HAL যে কোনো WAKE_UP ইভেন্টের জন্য তার WAKE_UP
ইভেন্টের জন্য তার ওয়েক লক রিলিজ করতে সক্ষম হয়েছিল যে কোনো পরবর্তী কল টু poll poll()
poll()
এ WAKE_UP
পোস্ট করার পর প্রয়োজনে জাগ্রত তালা। কারণ, সেন্সর HAL 2.0-এ, HAL আর জানে না কখন ফ্রেমওয়ার্ক FMQ-তে লিখিত ইভেন্টগুলি প্রক্রিয়া করেছে, Wake Lock FMQ ফ্রেমওয়ার্ককে HAL-এর সাথে যোগাযোগ করার অনুমতি দেয় যখন এটি WAKE_UP
ইভেন্টগুলি পরিচালনা করে।
সেন্সর HAL 2.0-এ, WAKE_UP
ইভেন্টগুলির জন্য সেন্সর HAL দ্বারা সুরক্ষিত ওয়েক লকটি অবশ্যই SensorsHAL_WAKEUP
দিয়ে শুরু হবে৷
ডায়নামিক সেন্সর
সেন্সর HAL 1.0-এ poll()
ফাংশন ব্যবহার করে ডায়নামিক সেন্সর ফেরত দেওয়া হয়েছিল। সেন্সর HAL 2.0 এর জন্য প্রয়োজন যে যখনই ডাইনামিক সেন্সর সংযোগ পরিবর্তন হয় তখন ISensorsCallback
এ onDynamicSensorsConnected
সেন্সর সংযুক্ত এবং onDynamicSensorsDisconnected
হয়। এই কলব্যাকগুলি ISensorsCallback
পয়েন্টারের অংশ হিসাবে উপলব্ধ যা initialize()
ফাংশনের মাধ্যমে সরবরাহ করা হয়।
অপারেশন মোড
WAKE_UP
সেন্সরের জন্য DATA_INJECTION
মোড অবশ্যই সেন্সর HAL 2.0-এ সমর্থিত হতে হবে।
মাল্টি-এইচএএল সমর্থন
সেন্সর HAL 2.0 এবং 2.1 সেন্সর মাল্টি-HAL ফ্রেমওয়ার্ক ব্যবহার করে মাল্টি- এইচএএল সমর্থন করে। বাস্তবায়নের বিশদ বিবরণের জন্য, সেন্সর HAL 1.0 থেকে পোর্টিং দেখুন।
,সেন্সর হার্ডওয়্যার অ্যাবস্ট্রাকশন লেয়ার (HAL) হল অ্যান্ড্রয়েড সেন্সর ফ্রেমওয়ার্ক এবং একটি ডিভাইসের সেন্সর, যেমন একটি অ্যাক্সিলোমিটার বা জাইরোস্কোপের মধ্যে ইন্টারফেস। সেন্সর HAL সেই ফাংশনগুলিকে সংজ্ঞায়িত করে যা সেন্সরগুলিকে নিয়ন্ত্রণ করতে ফ্রেমওয়ার্ককে অনুমতি দেওয়ার জন্য প্রয়োগ করা আবশ্যক৷
সেন্সর HAL 2.0 নতুন এবং আপগ্রেড করা ডিভাইসের জন্য Android 10 এবং উচ্চতর সংস্করণে উপলব্ধ। সেন্সর HAL 2.0 সেন্সর HAL 1.0 এর উপর ভিত্তি করে তৈরি করা হয়েছে কিন্তু এর বেশ কিছু মূল পার্থক্য রয়েছে, যা এটিকে পিছিয়ে যাওয়া সামঞ্জস্যপূর্ণ হতে বাধা দেয়। সেন্সর HAL 2.0 ফাস্ট মেসেজ কিউ (FMQs) ব্যবহার করে HAL থেকে সেন্সর ইভেন্টগুলিকে Android সেন্সর ফ্রেমওয়ার্কে পাঠাতে।
সেন্সর HAL 2.1 নতুন এবং আপগ্রেড করা ডিভাইসগুলির জন্য Android 11 এবং উচ্চতর সংস্করণে উপলব্ধ। সেন্সর HAL 2.1 হল সেন্সর HAL 2.0-এর একটি পুনরাবৃত্তি যা HINGE_ANGLE সেন্সরের ধরন প্রকাশ করে এবং HINGE_ANGLE
ধরন গ্রহণ করার জন্য বিভিন্ন পদ্ধতি আপডেট করে।
HAL 2.1 ইন্টারফেস
সেন্সর HAL 2.1-এর ডকুমেন্টেশনের প্রধান উৎস হল হার্ডওয়্যার/ইন্টারফেস/সেন্সর/2.1/ISensors.hal- এ HAL সংজ্ঞার মধ্যে। এই পৃষ্ঠা এবং ISensors.hal
মধ্যে প্রয়োজনীয়তার দ্বন্দ্ব থাকলে, ISensors.hal
এ প্রয়োজনীয়তা ব্যবহার করুন।
HAL 2.0 ইন্টারফেস
সেন্সর HAL 2.0-এর ডকুমেন্টেশনের প্রধান উৎস হল হার্ডওয়্যার/ইন্টারফেস/সেন্সর/2.0/ISensors.hal- এ HAL সংজ্ঞার মধ্যে। এই পৃষ্ঠা এবং ISensors.hal
মধ্যে প্রয়োজনীয়তার দ্বন্দ্ব থাকলে, ISensors.hal
এ প্রয়োজনীয়তা ব্যবহার করুন।
HAL 2.0 এবং HAL 2.1 সেন্সর প্রয়োগ করুন
সেন্সর HAL 2.0 বা 2.1 বাস্তবায়ন করতে, একটি বস্তুকে অবশ্যই ISensors
ইন্টারফেস প্রসারিত করতে হবে এবং 2.0/ISensors.hal
বা 2.1/ISensors.hal
এ সংজ্ঞায়িত সমস্ত ফাংশন বাস্তবায়ন করতে হবে।
HAL চালু করুন
সেন্সর HAL ব্যবহার করার আগে অবশ্যই অ্যান্ড্রয়েড সেন্সর ফ্রেমওয়ার্ক দ্বারা শুরু করতে হবে। ফ্রেমওয়ার্ক HAL 2.0-এর জন্য initialize()
ফাংশন এবং HAL 2.1-এর জন্য initialize_2_1()
ফাংশনকে কল করে সেন্সর HAL-কে তিনটি প্যারামিটার প্রদান করতে: দুটি FMQ বর্ণনাকারী এবং একটি ISensorsCallback
অবজেক্টে একটি পয়েন্টার।
ফ্রেমওয়ার্কে সেন্সর ইভেন্ট লিখতে ব্যবহৃত ইভেন্ট FMQ তৈরি করতে HAL প্রথম বর্ণনাকারী ব্যবহার করে। HAL WAKE_UP
সেন্সর ইভেন্টের জন্য HAL তার ওয়েক লক রিলিজ করার সময় সিঙ্ক্রোনাইজ করতে ব্যবহৃত ওয়েক লক FMQ তৈরি করতে দ্বিতীয় বর্ণনাকারী ব্যবহার করে। HAL-কে অবশ্যই ISensorsCallback
অবজেক্টে একটি পয়েন্টার সংরক্ষণ করতে হবে যাতে যেকোনো প্রয়োজনীয় কলব্যাক ফাংশন আহ্বান করা যায়।
initialize()
বা initialize_2_1()
ফাংশনটি অবশ্যই প্রথম ফাংশন হতে হবে যা সেন্সর এইচএএল শুরু করার সময় বলা হয়।
উপলব্ধ সেন্সর প্রকাশ করুন
ডিভাইসে উপলব্ধ সমস্ত স্ট্যাটিক সেন্সরগুলির একটি তালিকা পেতে, HAL 2.0-এ getSensorsList()
ফাংশন এবং HAL 2.1-এ getSensorsList_2_1()
ফাংশন ব্যবহার করুন৷ এই ফাংশনটি সেন্সরগুলির একটি তালিকা প্রদান করে, প্রতিটি তার হ্যান্ডেল দ্বারা স্বতন্ত্রভাবে চিহ্নিত করা হয়। সেন্সর এইচএএল হোস্টিং প্রক্রিয়া পুনরায় আরম্ভ হলে একটি প্রদত্ত সেন্সরের জন্য হ্যান্ডেল পরিবর্তন করা উচিত নয়। ডিভাইস রিবুট এবং সিস্টেম সার্ভার রিস্টার্ট জুড়ে হ্যান্ডেলগুলি পরিবর্তিত হতে পারে।
যদি বেশ কয়েকটি সেন্সর একই সেন্সর টাইপ এবং ওয়েক-আপ প্রপার্টি শেয়ার করে, তাহলে তালিকার প্রথম সেন্সরটিকে ডিফল্ট সেন্সর বলা হয় এবং getDefaultSensor(int sensorType, bool wakeUp)
ফাংশন ব্যবহার করে এমন অ্যাপগুলিতে ফেরত দেওয়া হয়।
সেন্সর তালিকার স্থায়িত্ব
সেন্সর HAL রিস্টার্ট হওয়ার পরে, যদি getSensorsList()
বা getSensorsList_2_1()
দ্বারা প্রত্যাবর্তিত ডেটা রিস্টার্টের আগে পুনরুদ্ধার করা সেন্সর তালিকার তুলনায় একটি উল্লেখযোগ্য পরিবর্তন নির্দেশ করে, ফ্রেমওয়ার্কটি Android রানটাইম পুনরায় চালু করতে ট্রিগার করে। সেন্সর তালিকায় উল্লেখযোগ্য পরিবর্তনগুলি এমন ক্ষেত্রে অন্তর্ভুক্ত যেখানে একটি প্রদত্ত হ্যান্ডেল সহ একটি সেন্সর অনুপস্থিত বা বৈশিষ্ট্যগুলি পরিবর্তিত হয়েছে বা যেখানে নতুন সেন্সর চালু করা হয়েছে। যদিও অ্যান্ড্রয়েড রানটাইম রিস্টার্ট করা ব্যবহারকারীর জন্য বিঘ্নিত করে, এটি প্রয়োজন কারণ অ্যান্ড্রয়েড ফ্রেমওয়ার্ক আর অ্যান্ড্রয়েড API চুক্তি পূরণ করতে পারে না যে একটি অ্যাপের জীবদ্দশায় স্ট্যাটিক (ননডাইনামিক) সেন্সর পরিবর্তন হয় না। এটি অ্যাপগুলির দ্বারা তৈরি সক্রিয় সেন্সর অনুরোধগুলিকে পুনঃস্থাপন করা থেকে ফ্রেমওয়ার্কটিকে আটকাতে পারে৷ অতএব, এইচএএল বিক্রেতাদের এড়ানো যায় এমন সেন্সর তালিকা পরিবর্তন প্রতিরোধ করার পরামর্শ দেওয়া হয়।
স্থিতিশীল সেন্সর হ্যান্ডেলগুলি নিশ্চিত করার জন্য, এইচএএলকে অবশ্যই ডিভাইসের একটি প্রদত্ত শারীরিক সেন্সরকে তার হ্যান্ডেলে ম্যাপ করতে হবে। যদিও সেন্সর এইচএএল ইন্টারফেস দ্বারা কোনো নির্দিষ্ট বাস্তবায়ন বাধ্যতামূলক করা হয় না, তবে বিকাশকারীদের এই প্রয়োজনীয়তা পূরণের জন্য অনেকগুলি বিকল্প উপলব্ধ রয়েছে।
উদাহরণস্বরূপ, সেন্সর তালিকাটি প্রতিটি সেন্সরের নির্দিষ্ট বৈশিষ্ট্যগুলির সংমিশ্রণ ব্যবহার করে সাজানো যেতে পারে, যেমন বিক্রেতা, মডেল এবং সেন্সর প্রকার। আরেকটি বিকল্প এই বিষয়টির উপর নির্ভর করে যে ডিভাইসের স্ট্যাটিক সেন্সর সেটটি হার্ডওয়্যারে স্থির করা হয়েছে, তাই getSensorsList()
বা getSensorsList_2_1()
থেকে ফিরে আসার আগে 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 তৈরি করা যেতে পারে।
সেন্সর HAL 2.0/2.1 ইভেন্ট 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-তে ডেটা লেখে, তখনই বিজ্ঞপ্তি সেট করে।
ডায়নামিক সেন্সর
ডায়নামিক সেন্সর হল সেন্সর যেগুলি শারীরিকভাবে ডিভাইসের একটি অংশ নয় কিন্তু ডিভাইসে ইনপুট হিসাবে ব্যবহার করা যেতে পারে, যেমন একটি অ্যাক্সিলোমিটার সহ একটি গেমপ্যাড।
যখন একটি ডাইনামিক সেন্সর সংযুক্ত থাকে, তখন ISensorsCallback
এ onDynamicSensorConnected
ফাংশনটি সেন্সর HAL থেকে কল করতে হবে। এটি নতুন গতিশীল সেন্সরের কাঠামোকে অবহিত করে এবং সেন্সরটিকে ফ্রেমওয়ার্কের মাধ্যমে নিয়ন্ত্রিত করার অনুমতি দেয় এবং সেন্সরের ইভেন্টগুলি ক্লায়েন্টদের দ্বারা গ্রাস করা যায়।
একইভাবে, যখন একটি ডায়নামিক সেন্সর সংযোগ বিচ্ছিন্ন হয়, তখন ISensorsCallback
এ onDynamicSensorDisconnected
ফাংশনটিকে কল করতে হবে যাতে ফ্রেমওয়ার্কটি আর উপলব্ধ নেই এমন কোনো সেন্সরকে সরাতে পারে।
সরাসরি চ্যানেল
ডাইরেক্ট চ্যানেল হল অপারেশনের একটি পদ্ধতি যেখানে সেন্সর ইভেন্টগুলি Android সেন্সর ফ্রেমওয়ার্ককে বাইপাস করে ইভেন্ট FMQ এর পরিবর্তে নির্দিষ্ট মেমরিতে লেখা হয়। যে ক্লায়েন্ট একটি সরাসরি চ্যানেল নিবন্ধন করে তাকে অবশ্যই মেমরি থেকে সরাসরি সেন্সর ইভেন্টগুলি পড়তে হবে যা সরাসরি চ্যানেল তৈরি করতে ব্যবহৃত হয়েছিল এবং ফ্রেমওয়ার্কের মাধ্যমে সেন্সর ইভেন্টগুলি গ্রহণ করবে না। configDirectReport()
ফাংশনটি সাধারণ অপারেশনের জন্য batch()
এর অনুরূপ এবং সরাসরি রিপোর্ট চ্যানেল কনফিগার করে।
registerDirectChannel()
এবং unregisterDirectChannel()
ফাংশন একটি নতুন সরাসরি চ্যানেল তৈরি বা ধ্বংস করে।
অপারেশন মোড
setOperationMode()
ফাংশন ফ্রেমওয়ার্ককে একটি সেন্সর কনফিগার করার অনুমতি দেয় যাতে ফ্রেমওয়ার্কটি সেন্সরে সেন্সর ডেটা ইনজেক্ট করতে পারে। এটি পরীক্ষার জন্য উপযোগী, বিশেষ করে ফ্রেমওয়ার্কের নিচে বিদ্যমান অ্যালগরিদমগুলির জন্য।
HAL 2.0-এ injectSensorData()
ফাংশন এবং HAL 2.0-এ injectSensorsData_2_1()
ফাংশন সাধারণত সেন্সর 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 পরীক্ষায় উত্তীর্ণ হওয়া গুরুত্বপূর্ণ।
ভিটিএস পরীক্ষা
সেন্সর HAL 2.0-এর জন্য VTS পরীক্ষাগুলি হার্ডওয়্যার/ইন্টারফেস/সেন্সর/2.0/vts- এ অবস্থিত। সেন্সর HAL 2.1-এর জন্য VTS পরীক্ষাগুলি হার্ডওয়্যার/ইন্টারফেস/সেন্সর/2.1/vts- এ অবস্থিত। এই পরীক্ষাগুলি নিশ্চিত করে যে সেন্সর HAL সঠিকভাবে প্রয়োগ করা হয়েছে এবং ISensors.hal
এবং ISensorsCallback.hal
মধ্যে সমস্ত প্রয়োজনীয়তা সঠিকভাবে পূরণ করা হয়েছে।
2.0 থেকে সেন্সর HAL 2.1 এ আপগ্রেড করুন
2.0 থেকে সেন্সর HAL 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 সংস্করণ সমর্থন করার জটিলতা এড়াতে, মাল্টি-এইচএএল 2.1 ব্যবহার করার জন্য অত্যন্ত সুপারিশ করা হয়।
আপনার নিজের সেন্সরগুলি 2.1 এইচএল কীভাবে প্রয়োগ করতে হয় তার উদাহরণের জন্য, সেন্সরগুলি দেখুন। এইচ।
1.0 থেকে সেন্সর এইচএল 2.0 এ আপগ্রেড করুন
1.0 থেকে সেন্সর এইচএল 2.0 এ আপগ্রেড করার সময়, আপনার এইচএল বাস্তবায়ন নিম্নলিখিত প্রয়োজনীয়তা পূরণ করে তা নিশ্চিত করুন।
এইচএল শুরু করুন
ফ্রেমওয়ার্ক এবং এইচএল এর মধ্যে এফএমকিউ স্থাপনের জন্য initialize()
ফাংশনটি অবশ্যই সমর্থন করতে হবে।
উপলব্ধ সেন্সরগুলি প্রকাশ করুন
সেন্সরগুলি এইচএল 2.0 এ, getSensorsList()
ফাংশনটি অবশ্যই একটি একক ডিভাইস বুটের সময় একই মানটি ফিরিয়ে দিতে হবে, এমনকি সেন্সরগুলিও এইচএল পুনরায় চালু করে। getSensorsList()
ফাংশনের একটি নতুন প্রয়োজনীয়তা হ'ল এটি অবশ্যই একটি একক ডিভাইস বুটের সময় একই মানটি ফেরত দিতে হবে, এমনকি সেন্সরগুলিও এইচএল পুনরায় চালু করে। এটি সিস্টেম সার্ভারটি পুনরায় আরম্ভ হলে ফ্রেমওয়ার্কটি সেন্সর সংযোগগুলি পুনঃপ্রকাশের চেষ্টা করার অনুমতি দেয়। ডিভাইসটি পুনরায় বুট করার পরে getSensorsList()
দ্বারা ফিরে আসা মান পরিবর্তন করতে পারে।
এফএমকিউতে সেন্সর ইভেন্টগুলি লিখুন
poll()
কল করার জন্য অপেক্ষা না করে, সেন্সরগুলি এইচএল ২.০ -তে, সেন্সর এইচএএলএসকে অবশ্যই সক্রিয়ভাবে সেন্সর ইভেন্টগুলি যখনই সেন্সর ইভেন্টগুলি পাওয়া যায় তখন ইভেন্ট এফএমকিউতে লিখতে হবে। ফ্রেমওয়ার্কের মধ্যে একটি এফএমকিউ পড়ার জন্য EventFlag
সঠিক বিট লেখার জন্য এইচএলও দায়ী।
জাগ্রত_আপ ইভেন্ট
সেন্সর এইচএল ১.০ -তে, WAKE_UP
poll()
poll()
কোনও আহ্বানে যে কোনও WAKE_UP
ইভেন্টের জন্য তার ওয়েক লকটি প্রকাশ করতে সক্ষম হয়েছিল কারণ এটি ইঙ্গিত দেয় যে কাঠামোটি সমস্ত সেন্সর ইভেন্টগুলি প্রক্রিয়াজাত করেছে এবং একটি পেয়েছে প্রয়োজনে লক জাগান। কারণ, সেন্সরগুলি এইচএল ২.০ -তে, এইচএল আর জানে না যে ফ্রেমওয়ার্কটি কখন এফএমকিউতে লিখিত ইভেন্টগুলি প্রক্রিয়া করেছে, ওয়েক লক এফএমকিউ ফ্রেমওয়ার্কটিকে HAL এর সাথে যোগাযোগ করার অনুমতি দেয় যখন এটি WAKE_UP
ইভেন্টগুলি পরিচালনা করে।
সেন্সর এইচএল ২.০ -তে, WAKE_UP
ইভেন্টগুলির জন্য সেন্সরগুলি এইচএল দ্বারা সুরক্ষিত ওয়েক লকটি অবশ্যই SensorsHAL_WAKEUP
দিয়ে শুরু করতে হবে।
গতিশীল সেন্সর
সেন্সর এইচএল 1.0 এ poll()
ফাংশনটি ব্যবহার করে গতিশীল সেন্সরগুলি ফিরিয়ে দেওয়া হয়েছিল। সেন্সরগুলি এইচএল ২.০ এর প্রয়োজন যে onDynamicSensorsConnected
এবং onDynamicSensorsDisconnected
ISensorsCallback
মধ্যে ডাকা হবে যখনই গতিশীল সেন্সর সংযোগগুলি পরিবর্তিত হয়। এই কলব্যাকগুলি ISensorsCallback
পয়েন্টারের অংশ হিসাবে উপলব্ধ যা initialize()
ফাংশনের মাধ্যমে সরবরাহ করা হয়।
অপারেশন মোড
WAKE_UP
সেন্সরগুলির জন্য DATA_INJECTION
মোডটি অবশ্যই সেন্সরগুলি এইচএল 2.0 এ সমর্থিত হতে হবে।
বহু অর্ধেক সমর্থন
সেন্সরগুলি এইচএল 2.0 এবং 2.1 সেন্সরগুলি বহু-অর্ধেক কাঠামো ব্যবহার করে বহু-অর্ধেক সমর্থন করে। বাস্তবায়নের বিশদগুলির জন্য, সেন্সরগুলি এইচএল 1.0 থেকে পোর্টিং দেখুন।