নিচের ছবিতে Android সেন্সর স্ট্যাক দেখানো হয়েছে। প্রতিটি কম্পোনেন্ট শুধুমাত্র তার ঠিক উপরে এবং নিচে থাকা কম্পোনেন্টের সাথে যোগাযোগ করে, যদিও কিছু সেন্সর, সেন্সর হাব উপস্থিত থাকলে সেটিকে বাইপাস করতে পারে। কন্ট্রোল ফ্লো অ্যাপ্লিকেশন থেকে সেন্সর পর্যন্ত এবং ডেটা ফ্লো সেন্সর থেকে অ্যাপ্লিকেশন পর্যন্ত হয়।
ছবি ১. Android সেন্সর স্ট্যাকের লেয়ার ও তাদের নিজ নিজ মালিক
SDK
অ্যাপ্লিকেশন Sensors SDK (সফ্টওয়্যার ডেভেলপমেন্ট কিট) API-এর মাধ্যমে সেন্সর অ্যাক্সেস করে। SDK-তে উপলভ্য সেন্সর তালিকাভুক্ত করার এবং কোনও সেন্সরে রেজিস্টার করার ফাংশন থাকে।
কোনও সেন্সরে রেজিস্টার করার সময়, অ্যাপ্লিকেশনটি তার পছন্দের স্যাম্পেলিং ফ্রিকোয়েন্সি এবং লেটেন্সি সংক্রান্ত প্রয়োজনীয়তা নির্দিষ্ট করে।
- যেমন, কোনও অ্যাপ্লিকেশন ডিফল্ট অ্যাক্সিলরোমিটারের সাথে রেজিস্টার করতে পারে, ১০০Hz-এ ইভেন্টের অনুরোধ করতে পারে এবং ১ সেকেন্ড লেটেন্সি সহ ইভেন্ট রিপোর্ট করার অনুমতি দিতে পারে।
- অ্যাপ্লিকেশনটি অ্যাক্সিলরোমিটার থেকে অন্তত ১০০ হার্টজ রেটে ইভেন্ট পাবে এবং সম্ভবত ১ সেকেন্ড পর্যন্ত বিলম্বিত হতে পারে।
SDK সম্পর্কে আরও তথ্য পেতে ডেভেলপার ডকুমেন্টেশন দেখুন।
ফ্রেমওয়ার্ক
HAL-এর সাথে একাধিক অ্যাপ্লিকেশন লিঙ্ক করার দায়িত্ব ফ্রেমওয়ার্কের। HAL নিজেই সিঙ্গেল-ক্লায়েন্ট। ফ্রেমওয়ার্ক লেভেলে এই মাল্টিপ্লেক্সিং না হলে, যেকোনও সময়ে শুধুমাত্র একটি অ্যাপ্লিকেশনই প্রতিটি সেন্সর অ্যাক্সেস করতে পারত।
- প্রথম অ্যাপ্লিকেশন কোনও সেন্সরে রেজিস্টার করলে, ফ্রেমওয়ার্ক HAL-এর কাছে সেন্সর অ্যাক্টিভেট করার অনুরোধ পাঠায়।
- একই সেন্সরে অতিরিক্ত অ্যাপ্লিকেশন রেজিস্টার করলে, ফ্রেমওয়ার্ক প্রতিটি অ্যাপ্লিকেশনের
প্রয়োজনীয়তা বিবেচনা করে এবং HAL-এ আপডেট করা অনুরোধ করা
প্যারামিটার পাঠায়।
- স্যাম্পেলিং ফ্রিকোয়েন্সি হল অনুরোধ করা স্যাম্পেলিং ফ্রিকোয়েন্সির সর্বাধিক মান, অর্থাৎ কিছু অ্যাপ্লিকেশন তাদের অনুরোধ করা ফ্রিকোয়েন্সির চেয়ে বেশি ফ্রিকোয়েন্সিতে ইভেন্ট পাবে।
- অনুরোধ করা লেটেন্সিগুলির মধ্যে সবচেয়ে কম লেটেন্সি হল রিপোর্টিংয়ের সর্বাধিক লেটেন্সি। কোনও অ্যাপ্লিকেশন যদি সর্বাধিক রিপোর্টিং লেটেন্সি ০ সহ একটি সেন্সরের জন্য অনুরোধ করে, তাহলে সমস্ত অ্যাপ্লিকেশন এই সেন্সর থেকে ইভেন্টগুলি কন্টিনিউয়াস মোডে পাবে, এমনকি কিছু অ্যাপ্লিকেশন যদি নন-জিরো সর্বাধিক রিপোর্টিং লেটেন্সি সহ সেন্সরের জন্য অনুরোধ করে থাকে তাহলেও। আরও বিবরণের জন্য ব্যাচিং দেখুন।
- কোনও একটি সেন্সরের সাথে রেজিস্টার করা শেষ অ্যাপ্লিকেশনটি আনরেজিস্টার হয়ে গেলে, ফ্রেমওয়ার্ক HAL-কে সেন্সরটি ডিঅ্যাক্টিভেট করার অনুরোধ পাঠায়, যাতে অযথা পাওয়ার খরচ না হয়।
মাল্টিপ্লেক্সিংয়ের প্রভাব
ফ্রেমওয়ার্কে মাল্টিপ্লেক্সিং লেয়ারের প্রয়োজনীয়তা কিছু ডিজাইন সংক্রান্ত সিদ্ধান্তকে ব্যাখ্যা করে।
- কোনও অ্যাপ্লিকেশন নির্দিষ্ট স্যাম্পেলিং ফ্রিকোয়েন্সি অনুরোধ করলে, ইভেন্ট যে আরও দ্রুত হারে আসবে না, তার কোনও গ্যারান্টি নেই। অন্য কোনও অ্যাপ্লিকেশন একই সেন্সর আরও দ্রুত রেটে অনুরোধ করলে, প্রথম অ্যাপ্লিকেশনও দ্রুত রেটে তা পাবে।
- অনুরোধ করা সর্বাধিক রিপোর্টিং লেটেন্সিও একই গ্যারান্টি দেয় না: অ্যাপ্লিকেশনগুলি তাদের অনুরোধ করা লেটেন্সির চেয়ে অনেক কম লেটেন্সি সহ ইভেন্ট পেতে পারে।
- স্যাম্পলিং ফ্রিকোয়েন্সি ও সর্বাধিক রিপোর্টিং লেটেন্সি ছাড়া, অ্যাপ্লিকেশন সেন্সর প্যারামিটার
কনফিগার করতে পারে না।
- যেমন, এমন একটি ফিজিক্যাল সেন্সরের কথা ভাবুন যা "হাই অ্যাকুরেসি" এবং "লো পাওয়ার" মোড, দু'টিতেই কাজ করতে পারে।
- Android ডিভাইসে এই দুটি মোডের মধ্যে শুধুমাত্র একটি ব্যবহার করা যেতে পারে, কারণ অন্যথায়, একটি অ্যাপ্লিকেশন হাই অ্যাকুরেসি মোডের অনুরোধ করতে পারে এবং অন্য একটি কম পাওয়ার মোডের অনুরোধ করতে পারে; ফ্রেমওয়ার্কের পক্ষে দুটি অ্যাপ্লিকেশনের অনুরোধ পূরণ করা সম্ভব হবে না। ফ্রেমওয়ার্ককে সবসময় তার সব ক্লায়েন্টকে সন্তুষ্ট করতে পারতে হবে, তাই এটি কোনও বিকল্প নয়।
- অ্যাপ্লিকেশন থেকে সেন্সর বা তাদের ড্রাইভারগুলিতে ডেটা পাঠানোর কোনও পদ্ধতি নেই। এটি নিশ্চিত করে যে একটি অ্যাপ্লিকেশন সেন্সরের আচরণ পরিবর্তন করতে পারে না, অন্যান্য অ্যাপ্লিকেশনগুলি ভেঙে দেয়।
সেন্সর ফিউশন
Android ফ্রেমওয়ার্ক কিছু কম্পোজিট সেন্সরের জন্য ডিফল্ট প্রয়োগ প্রদান করে। কোনও ডিভাইসে জাইরোস্কোপ, অ্যাক্সিলরোমিটার ও ম্যাগনেটোমিটার থাকলেও রোটেট ভেক্টর, গ্র্যাভিটি ও লিনিয়ার অ্যাক্সিলারেশন সেন্সর না থাকলে, ফ্রেমওয়ার্ক সেইসব সেন্সর প্রয়োগ করে যাতে অ্যাপ্লিকেশন সেগুলি ব্যবহার করতে পারে।
অন্যান্য ইমপ্লিমেন্টেশনের কাছে অ্যাক্সেস থাকা সব ডেটাতে ডিফল্ট ইমপ্লিমেন্টেশনের অ্যাক্সেস নেই এবং এটি SoC-তে চলতে হবে, তাই এটি অন্যান্য ইমপ্লিমেন্টেশনের মতো সঠিক বা পাওয়ার-এফিশিয়েন্ট হতে পারে না। যতটা সম্ভব, ডিভাইস প্রস্তুতকারকদের এই ডিফল্ট ইমপ্লিমেন্টেশনের উপর নির্ভর না করে তাদের নিজস্ব ফিউজড সেন্সর (রোটেট ভেক্টর, গ্র্যাভিটি ও লিনিয়ার অ্যাক্সিলারেশন, সেইসাথে গেম রোটেট ভেক্টর-এর মতো নতুন কম্পোজিট সেন্সর) ডিফাইন করা উচিত। এছাড়াও, ডিভাইস প্রস্তুতকারকরা সেন্সর চিপ ভেন্ডরদের কাছে ইমপ্লিমেন্টেশন প্রদান করার অনুরোধ করতে পারেন।
ডিফল্ট সেন্সর ফিউশন ইমপ্লিমেন্টেশন রক্ষণাবেক্ষণ করা হচ্ছে না এবং এর উপর নির্ভর করে এমন ডিভাইস CTS-এ ব্যর্থ হতে পারে।
আচ্ছাদনের নীচে
এই বিভাগটি Android ওপেন সোর্স প্রজেক্ট (AOSP) ফ্রেমওয়ার্ক কোড যারা রক্ষণাবেক্ষণ করেন তাদের জন্য ব্যাকগ্রাউন্ড তথ্য হিসেবে প্রদান করা হয়েছে। এটি হার্ডওয়্যার প্রস্তুতকারকদের জন্য প্রাসঙ্গিক নয়।
JNI
ফ্রেমওয়ার্কটি android.hardware-এর সাথে যুক্ত এবং frameworks/base/core/jni/ ডিরেক্টরিতে অবস্থিত একটি জাভা নেটিভ ইন্টারফেস (JNI) ব্যবহার করে। এই কোডটি সেন্সর হার্ডওয়্যারে অ্যাক্সেস পেতে
নিম্ন স্তরের নেটিভ কোডকে কল করে।
নেটিভ ফ্রেমওয়ার্ক
নেটিভ ফ্রেমওয়ার্ক frameworks/native/-এ সংজ্ঞায়িত করা আছে এবং এটি android.hardware প্যাকেজের
নেটিভ সমতুল্য প্রদান করে। নেটিভ ফ্রেমওয়ার্ক, সেন্সর-নির্দিষ্ট পরিষেবার অ্যাক্সেস পেতে,
বাইন্ডার IPC প্রক্সি কল করে।
Binder IPC
Binder IPC প্রক্সি প্রসেস সীমার মধ্যে যোগাযোগ সহজ করে তোলে।
HAL
সেন্সর হার্ডওয়্যার অ্যাবস্ট্রাকশন লেয়ার (HAL) API হল হার্ডওয়্যার ড্রাইভার ও Android ফ্রেমওয়ার্কের মধ্যে ইন্টারফেস। এতে একটি HAL ইন্টারফেস sensors.h এবং একটি HAL ইমপ্লিমেন্টেশন থাকে, যেটিকে আমরা sensors.cpp বলি।
ইন্টারফেস Android ও AOSP কন্ট্রিবিউটরদের দ্বারা নির্ধারিত হয় এবং ডিভাইস প্রস্তুতকারক এটি প্রয়োগ করে।
সেন্সর HAL ইন্টারফেস hardware/libhardware/include/hardware-এ অবস্থিত।
আরও বিবরণের জন্য
sensors.h দেখুন।
রিলিজ চক্র
HAL প্রয়োগ, your_poll_device.common.version সেট করার মাধ্যমে HAL ইন্টারফেসের কোন ভার্সন এটি প্রয়োগ করে তা
নির্দিষ্ট করে। আগে থেকে থাকা HAL
ইন্টারফেস ভার্সন sensors.h-এ সংজ্ঞায়িত করা আছে এবং কার্যকারিতা সেইসব
ভার্সনের সাথে যুক্ত।
Android ফ্রেমওয়ার্ক বর্তমানে 1.0 এবং 1.3 ভার্সন সাপোর্ট করে, তবে 1.0 ভার্সন শীঘ্রই আর সাপোর্ট করবে না। এই ডকুমেন্টেশনে ভার্সন ১.৩-এর আচরণ বর্ণনা করা হয়েছে, যেটিতে সব ডিভাইসকে আপগ্রেড করতে হবে। 1.3-এ কীভাবে আপগ্রেড করবেন সেই সম্পর্কে বিস্তারিত জানতে, HAL ভার্সন বন্ধ করা দেখুন।
কার্নেল ড্রাইভার
সেন্সর ড্রাইভাররা ফিজিক্যাল ডিভাইসের সাথে ইন্টার্যাক্ট করে। কিছু ক্ষেত্রে, HAL ইমপ্লিমেন্টেশন ও ড্রাইভার একই সফ্টওয়্যার এন্টিটি। অন্যান্য ক্ষেত্রে, হার্ডওয়্যার ইন্টিগ্রেটর সেন্সর চিপ প্রস্তুতকারকদের কাছে ড্রাইভার দেওয়ার অনুরোধ করে, কিন্তু তারাই HAL প্রয়োগ করে।
সব ক্ষেত্রেই, HAL প্রয়োগ ও কার্নেল ড্রাইভারের দায়িত্ব হল হার্ডওয়্যার প্রস্তুতকারকের এবং Android এগুলি লেখার জন্য পছন্দের পদ্ধতি প্রদান করে না।
সেন্সর হাব
ডিভাইসের সেন্সর স্ট্যাকে ঐচ্ছিকভাবে একটি সেন্সর হাব থাকতে পারে, যা SoC সাসপেন্ড মোডে থাকাকালীন কম পাওয়ারে কিছু লো-লেভেল কম্পিউটেশন পারফর্ম করতে সহায়ক। যেমন, এইসব চিপে স্টেপ গণনা বা সেন্সর ফিউশন করা যেতে পারে। এছাড়াও, এটি সেন্সর ইভেন্টের জন্য হার্ডওয়্যার FIFO যোগ করে সেন্সর ব্যাচিং প্রয়োগ করার জন্য একটি ভাল জায়গা। আরও তথ্যের জন্য ব্যাচিং দেখুন।
মনে রাখবেন: নতুন সেন্সর বা LED ব্যবহার করে এমন নতুন ContextHub ফিচার ডেভেলপ করতে, আপনি Hikey বা Hikey960 ডেভেলপমেন্ট বোর্ডের সাথে কানেক্ট করা Neonkey SensorHub-ও ব্যবহার করতে পারেন।
সেন্সর হাব কীভাবে মেটেরিয়ালাইজ করা হয় তা আর্কিটেকচারের উপর নির্ভর করে। এটি কখনও কখনও একটি আলাদা চিপ এবং কখনও কখনও SoC-এর মতো একই চিপে অন্তর্ভুক্ত থাকে। সেন্সর হাবের গুরুত্বপূর্ণ বৈশিষ্ট্য হল যে এতে ব্যাচিংয়ের জন্য পর্যাপ্ত মেমরি থাকা উচিত এবং কম পাওয়ারের Android সেন্সরগুলির বাস্তবায়ন সক্ষম করতে খুব কম শক্তি খরচ করা উচিত। কিছু সেন্সর হাবে সাধারণ কম্পিউটেশনের জন্য মাইক্রোকন্ট্রোলার এবং কম পাওয়ার সেন্সরের জন্য খুব কম পাওয়ার কম্পিউটেশন চালু করতে হার্ডওয়্যার অ্যাক্সিলারেটর থাকে।
সেন্সর হাবের আর্কিটেকচার কেমন এবং এটি কীভাবে সেন্সর ও SoC (I2C বাস, SPI বাস, …)-এর সাথে যোগাযোগ করে তা Android-এর মাধ্যমে নির্দিষ্ট করা হয় না, তবে এর লক্ষ্য হওয়া উচিত সামগ্রিক পাওয়ার ব্যবহার কমানো।
একটি বিকল্প যা বাস্তবায়নের সরলতার উপর উল্লেখযোগ্য প্রভাব ফেলে বলে মনে হয় তা হল সেন্সর হাব থেকে SoC পর্যন্ত দুটি ইন্টারাপ্ট লাইন থাকা: একটি ওয়েক-আপ ইন্টারাপ্টের জন্য (ওয়েক-আপ সেন্সরের জন্য), এবং অন্যটি নন-ওয়েক-আপ ইন্টারাপ্টের জন্য (নন-ওয়েক-আপ সেন্সরের জন্য)।
সেন্সর
এগুলি হল পরিমাপ করা ফিজিক্যাল MEMs চিপ। অনেক ক্ষেত্রে, একই চিপে একাধিক ফিজিক্যাল সেন্সর থাকে। যেমন, কিছু চিপে অ্যাকসিলরোমিটার, জাইরোস্কোপ ও ম্যাগনেটোমিটার থাকে। (এই ধরনের চিপকে প্রায়ই ৯-অ্যাক্সিস চিপ বলা হয়, কারণ প্রতিটি সেন্সর ৩টি অ্যাক্সিস জুড়ে ডেটা প্রদান করে।)
এছাড়াও, এইসব চিপের মধ্যে কিছু লজিক থাকে যা সাধারণ কম্পিউটেশন পারফর্ম করে। যেমন, মুভমেন্ট শনাক্তকরণ, স্টেপ শনাক্তকরণ এবং ৯-অ্যাক্সিস সেন্সর ফিউশন।
যদিও CDD পাওয়ার ও নির্ভুলতা সংক্রান্ত প্রয়োজনীয়তা ও সাজেশন Android সেন্সরকে টার্গেট করে, ফিজিক্যাল সেন্সরকে নয়, তবে সেইসব প্রয়োজনীয়তা ফিজিক্যাল সেন্সর বেছে নেওয়ার উপর প্রভাব ফেলে। যেমন, গেমের রোটেশন ভেক্টরের নির্ভুলতা সংক্রান্ত প্রয়োজনীয়তা, ফিজিক্যাল জাইরোস্কোপের নির্ভুলতা সংক্রান্ত প্রয়োজনীয়তার উপর প্রভাব ফেলে। ডিভাইস প্রস্তুতকারকের উপর নির্ভর করে যে ফিজিক্যাল সেন্সরের জন্য প্রয়োজনীয়তা নির্ধারণ করা।