সেন্সর স্ট্যাক

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

অ্যান্ড্রয়েড সেন্সর স্ট্যাকের স্তর এবং মালিক

চিত্র ১. অ্যান্ড্রয়েড সেন্সর স্ট্যাকের স্তরসমূহ এবং তাদের নিজ নিজ মালিকগণ

এসডিকে

অ্যাপ্লিকেশনগুলো সেন্সর এসডিকে (সফটওয়্যার ডেভেলপমেন্ট কিট) এপিআই-এর মাধ্যমে সেন্সর অ্যাক্সেস করে। এসডিকে-তে উপলব্ধ সেন্সরগুলোর তালিকা তৈরি করার এবং কোনো সেন্সরে নিবন্ধন করার ফাংশন রয়েছে।

কোনো সেন্সরে নিবন্ধন করার সময়, অ্যাপ্লিকেশনটি তার পছন্দের স্যাম্পলিং ফ্রিকোয়েন্সি এবং ল্যাটেন্সি সংক্রান্ত প্রয়োজনীয়তা নির্দিষ্ট করে দেয়।

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

SDK সম্পর্কে আরও তথ্যের জন্য ডেভেলপার ডকুমেন্টেশন দেখুন।

কাঠামো

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

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

মাল্টিপ্লেক্সিংয়ের প্রভাব

ফ্রেমওয়ার্কে মাল্টিপ্লেক্সিং লেয়ারের এই প্রয়োজনীয়তা কিছু ডিজাইন সিদ্ধান্তের ব্যাখ্যা দেয়।

  • যখন কোনো অ্যাপ্লিকেশন একটি নির্দিষ্ট স্যাম্পলিং ফ্রিকোয়েন্সির জন্য অনুরোধ করে, তখন ইভেন্টগুলো যে আরও দ্রুত হারে আসবে না, তার কোনো নিশ্চয়তা নেই। যদি অন্য কোনো অ্যাপ্লিকেশন একই সেন্সরের জন্য আরও দ্রুত হারে অনুরোধ করে, তবে প্রথম অ্যাপ্লিকেশনটিও সেগুলো দ্রুত হারেই গ্রহণ করবে।
  • অনুরোধকৃত সর্বোচ্চ রিপোর্টিং লেটেন্সির ক্ষেত্রেও একই ধরনের নিশ্চয়তার অভাব রয়েছে: অ্যাপ্লিকেশনগুলো তাদের অনুরোধ করা লেটেন্সির চেয়ে অনেক কম লেটেন্সিতে ইভেন্ট গ্রহণ করতে পারে।
  • স্যাম্পলিং ফ্রিকোয়েন্সি এবং সর্বোচ্চ রিপোর্টিং ল্যাটেন্সি ছাড়া, অ্যাপ্লিকেশনগুলি সেন্সরের অন্যান্য প্যারামিটার কনফিগার করতে পারে না।
    • উদাহরণস্বরূপ, এমন একটি ভৌত ​​সেন্সরের কথা ভাবুন যা “উচ্চ নির্ভুলতা” এবং “কম শক্তি” উভয় মোডেই কাজ করতে পারে।
    • একটি অ্যান্ড্রয়েড ডিভাইসে ওই দুটি মোডের মধ্যে কেবল একটিই ব্যবহার করা যায়, কারণ অন্যথায়, একটি অ্যাপ্লিকেশন উচ্চ নির্ভুলতা মোড এবং অন্যটি কম শক্তি ব্যবহারের মোড চাইতে পারে; সেক্ষেত্রে ফ্রেমওয়ার্কের পক্ষে উভয় অ্যাপ্লিকেশনের চাহিদা পূরণ করা সম্ভব হবে না। ফ্রেমওয়ার্ককে অবশ্যই তার সমস্ত ক্লায়েন্টের চাহিদা সবসময় পূরণ করতে সক্ষম হতে হবে, তাই এটি কোনো বিকল্প নয়।
  • অ্যাপ্লিকেশনগুলো থেকে সেন্সর বা তাদের ড্রাইভারের কাছে ডেটা পাঠানোর কোনো ব্যবস্থা নেই। এর ফলে, কোনো একটি অ্যাপ্লিকেশন সেন্সরগুলোর আচরণ পরিবর্তন করে অন্য অ্যাপ্লিকেশনগুলোকে অকার্যকর করতে পারে না।

সেন্সর ফিউশন

অ্যান্ড্রয়েড ফ্রেমওয়ার্ক কিছু যৌগিক সেন্সরের জন্য একটি ডিফল্ট ইমপ্লিমেন্টেশন প্রদান করে। যখন কোনো ডিভাইসে একটি জাইরোস্কোপ , একটি অ্যাক্সেলেরোমিটার এবং একটি ম্যাগনেটোমিটার উপস্থিত থাকে, কিন্তু কোনো রোটেশন ভেক্টর , গ্র্যাভিটি এবং লিনিয়ার অ্যাক্সেলারেশন সেন্সর থাকে না, তখন ফ্রেমওয়ার্ক সেই সেন্সরগুলোকে ইমপ্লিমেন্ট করে, যাতে অ্যাপ্লিকেশনগুলো সেগুলো ব্যবহার করতে পারে।

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

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

হুডের নিচে

এই অংশটি অ্যান্ড্রয়েড ওপেন সোর্স প্রজেক্ট (AOSP) ফ্রেমওয়ার্ক কোড রক্ষণাবেক্ষণকারীদের জন্য পটভূমি তথ্য হিসেবে প্রদান করা হয়েছে। এটি হার্ডওয়্যার নির্মাতাদের জন্য প্রাসঙ্গিক নয়।

জেএনআই

এই ফ্রেমওয়ার্কটি android.hardware-এর সাথে যুক্ত এবং frameworks/base/core/jni/ ডিরেক্টরিতে অবস্থিত একটি জাভা নেটিভ ইন্টারফেস (JNI) ব্যবহার করে। এই কোডটি সেন্সর হার্ডওয়্যারে অ্যাক্সেস পাওয়ার জন্য নিম্ন স্তরের নেটিভ কোডকে কল করে।

নেটিভ ফ্রেমওয়ার্ক

নেটিভ ফ্রেমওয়ার্কটি frameworks/native/ ফোল্ডারে সংজ্ঞায়িত করা হয়েছে এবং এটি android.hardware প্যাকেজের একটি নেটিভ সমতুল্য সংস্করণ প্রদান করে। এই নেটিভ ফ্রেমওয়ার্কটি সেন্সর-নির্দিষ্ট পরিষেবাগুলিতে অ্যাক্সেস পাওয়ার জন্য বাইন্ডার আইপিসি প্রক্সিগুলিকে কল করে।

বাইন্ডার আইপিসি

বাইন্ডার আইপিসি প্রক্সিগুলো প্রসেস সীমানা জুড়ে যোগাযোগ সহজ করে।

এইচএএল

সেন্সর হার্ডওয়্যার অ্যাবস্ট্রাকশন লেয়ার (HAL) API হলো হার্ডওয়্যার ড্রাইভার এবং অ্যান্ড্রয়েড ফ্রেমওয়ার্কের মধ্যেকার ইন্টারফেস। এটিতে একটি HAL ইন্টারফেস sensors.h এবং একটি HAL ইমপ্লিমেন্টেশন রয়েছে, যা আমরা sensors.cpp নামে উল্লেখ করি।

ইন্টারফেসটি অ্যান্ড্রয়েড এবং AOSP অবদানকারীদের দ্বারা সংজ্ঞায়িত করা হয়, এবং এর বাস্তবায়ন ডিভাইসটির প্রস্তুতকারক সরবরাহ করে থাকে।

সেন্সর HAL ইন্টারফেসটি hardware/libhardware/include/hardware এ অবস্থিত। অতিরিক্ত বিবরণের জন্য sensors.h দেখুন।

মুক্তির চক্র

your_poll_device.common.version সেট করার মাধ্যমে HAL ইমপ্লিমেন্টেশন নির্দিষ্ট করে দেয় যে এটি HAL ইন্টারফেসের কোন সংস্করণটি ব্যবহার করছে। বিদ্যমান HAL ইন্টারফেস সংস্করণগুলো sensors.h-এ সংজ্ঞায়িত করা আছে এবং কার্যকারিতা সেই সংস্করণগুলোর সাথে সংযুক্ত।

অ্যান্ড্রয়েড ফ্রেমওয়ার্ক বর্তমানে ১.০ এবং ১.৩ সংস্করণ সমর্থন করে, কিন্তু ১.০ সংস্করণটি শীঘ্রই আর সমর্থিত হবে না। এই ডকুমেন্টেশনে ১.৩ সংস্করণের কার্যকারিতা বর্ণনা করা হয়েছে, যেটিতে সকল ডিভাইসের আপগ্রেড করা উচিত। কীভাবে ১.৩ সংস্করণে আপগ্রেড করবেন সে সম্পর্কে বিস্তারিত জানতে, HAL version deprecation দেখুন।

কার্নেল ড্রাইভার

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

সকল ক্ষেত্রেই, HAL বাস্তবায়ন এবং কার্নেল ড্রাইভার তৈরির দায়িত্ব হার্ডওয়্যার প্রস্তুতকারকদের, এবং অ্যান্ড্রয়েড এগুলো লেখার জন্য কোনো নির্দিষ্ট পদ্ধতি প্রদান করে না।

সেন্সর হাব

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

দ্রষ্টব্য: নতুন সেন্সর বা এলইডি ব্যবহার করে নতুন ContextHub ফিচার তৈরি করার জন্য, আপনি Hikey বা Hikey960 ডেভেলপমেন্ট বোর্ডের সাথে সংযুক্ত একটি Neonkey SensorHub- ও ব্যবহার করতে পারেন।

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

সেন্সর হাবটির গঠন কেমন এবং এটি কীভাবে সেন্সর ও এসওসি-র (SoC) সাথে যোগাযোগ করে (যেমন I2C বাস, SPI বাস ইত্যাদি), তা অ্যান্ড্রয়েড নির্দিষ্ট করে দেয়নি, তবে এর লক্ষ্য হওয়া উচিত সার্বিক বিদ্যুৎ ব্যবহার সর্বনিম্ন রাখা।

বাস্তবায়নের সরলতার উপর উল্লেখযোগ্য প্রভাব ফেলে এমন একটি বিকল্প হলো সেন্সর হাব থেকে SoC-তে দুটি ইন্টারাপ্ট লাইন রাখা: একটি ওয়েক-আপ ইন্টারাপ্টের জন্য (ওয়েক-আপ সেন্সরগুলির জন্য), এবং অন্যটি নন-ওয়েক-আপ ইন্টারাপ্টের জন্য (নন-ওয়েক-আপ সেন্সরগুলির জন্য)।

সেন্সর

এগুলো হলো ভৌত MEMs চিপ, যেগুলো পরিমাপগুলো করে থাকে। অনেক ক্ষেত্রে, একই চিপে একাধিক ভৌত সেন্সর থাকে। উদাহরণস্বরূপ, কিছু চিপে অ্যাক্সেলেরোমিটার, জাইরোস্কোপ এবং ম্যাগনেটোমিটার অন্তর্ভুক্ত থাকে। (এই ধরনের চিপগুলোকে প্রায়শই ৯-অক্ষ চিপ বলা হয়, কারণ প্রতিটি সেন্সর ৩টি অক্ষ বরাবর ডেটা সরবরাহ করে।)

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

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