Android ইনপুট সাবসিস্টেম সাধারণত একটি ইভেন্ট পাইপলাইন দিয়ে গঠিত হয় যা সিস্টেমের একাধিক লেয়ারের মধ্যে দিয়ে যায়।
ইনপুট পাইপলাইন
সবচেয়ে নিচের স্তরে, ফিজিক্যাল ইনপুট ডিভাইস সিগন্যাল তৈরি করে যা কী প্রেস ও টাচ কন্ট্যাক্ট পয়েন্টের মতো স্টেট পরিবর্তন বর্ণনা করে। ডিভাইস ফার্মওয়্যার এই সিগন্যালগুলিকে কোনওভাবে এনকোড ও ট্রান্সমিট করে যেমন, সিস্টেমে USB HID রিপোর্ট পাঠানো অথবা I2C বাসে ইন্টারাপ্ট তৈরি করার মাধ্যমে।
তারপরে, Linux কার্নেলে থাকা ডিভাইস ড্রাইভার সিগন্যালটি ডিকোড করে। Linux কার্নেল অনেক স্ট্যান্ডার্ড পেরিফেরালের জন্য ড্রাইভার প্রদান করে, বিশেষ করে যেগুলি HID প্রোটোকল মেনে চলে। তবে, একটি OEM-কে প্রায়ই এম্বেড করা ডিভাইসের জন্য কাস্টম ড্রাইভার প্রদান করতে হয় যা টাচ স্ক্রিনের মতো নিম্ন-স্তরে সিস্টেমের সাথে শক্তভাবে ইন্টিগ্রেট করা থাকে।
ইনপুট ডিভাইস ড্রাইভার, ডিভাইস-নির্দিষ্ট সিগন্যালকে স্ট্যান্ডার্ড ইনপুট ইভেন্ট ফর্ম্যাটে অনুবাদ করার জন্য দায়ী,
Linux ইনপুট প্রোটোকলের মাধ্যমে। Linux ইনপুট প্রোটোকল linux/input.h কার্নেল হেডার ফাইলে ইভেন্টের ধরন ও কোডের
স্ট্যান্ডার্ড সেট নির্ধারণ করে।
এইভাবে, কার্নেলের বাইরের কম্পোনেন্টগুলিকে ফিজিক্যাল স্ক্যান কোড, HID ব্যবহার, I2C মেসেজ, GPIO পিন এবং এই ধরনের বিবরণের ব্যাপারে চিন্তা করতে হয় না।
এরপরে, Android EventHub কম্পোনেন্ট, প্রতিটি ইনপুট ডিভাইসের সাথে যুক্ত evdev ড্রাইভার খুলে
কার্নেল থেকে ইনপুট ইভেন্ট রিড করে।
Android InputReader কম্পোনেন্ট তারপরে ডিভাইস ক্লাস অনুযায়ী ইনপুট ইভেন্ট
ডিকোড করে এবং Android ইনপুট
ইভেন্টের একটি স্ট্রিম তৈরি করে। এই প্রসেসের অংশ হিসেবে, ইনপুট ডিভাইস কনফিগারেশন,
কীবোর্ড লেআউট ফাইল এবং বিভিন্ন
ম্যাপিং টেবিল অনুযায়ী Linux ইনপুট প্রোটোকল ইভেন্ট কোড
Android ইভেন্ট কোডে ট্রান্সলেট করা হয়।
সবশেষে, InputReader, InputDispatcher-এ ইনপুট ইভেন্ট পাঠায়
যা উপযুক্ত উইন্ডোতে সেগুলি ফরওয়ার্ড করে।
কন্ট্রোল পয়েন্ট
ইনপুট পাইপলাইনে বেশ কয়েকটি ধাপ আছে যা ইনপুট ডিভাইসের আচরণকে নিয়ন্ত্রণ করে।
ড্রাইভার ও ফার্মওয়্যার কনফিগারেশন
ইনপুট ডিভাইস ড্রাইভাররা প্রায়ই রেজিস্টারে প্যারামিটার সেট করে বা এমনকি ফার্মওয়্যার আপলোড করে ইনপুট ডিভাইসের আচরণ কনফিগার করে। এটি বিশেষ করে টাচ স্ক্রিনের মতো এম্বেড করা ডিভাইসের ক্ষেত্রে প্রযোজ্য, যেখানে ক্যালিব্রেশন প্রসেসের একটি বড় অংশ হল এইসব প্যারামিটার টিউনিং করা বা ফার্মওয়্যার ঠিক করা যাতে কাঙ্ক্ষিত নির্ভুলতা ও রেসপন্সিভনেস প্রদান করা যায় এবং নয়েজ কমানো যায়।
কার্নেল বোর্ড সাপোর্ট প্যাকেজে (BSP) ড্রাইভার কনফিগারেশন বিকল্পগুলি প্রায়শই মডিউল প্যারামিটার হিসেবে নির্দিষ্ট করা থাকে যাতে একই ড্রাইভার একাধিক আলাদা আলাদা হার্ডওয়্যার ইমপ্লিমেন্টেশনকে সাপোর্ট করতে পারে।
এই ডকুমেন্টেশন ড্রাইভার বা ফার্মওয়্যার কনফিগারেশন বর্ণনা করার চেষ্টা করে, তবে এটি সাধারণভাবে ডিভাইস ক্যালিব্রেশন সম্পর্কে নির্দেশিকা প্রদান করে।
বোর্ড কনফিগারেশন প্রপার্টি
কার্নেল বোর্ড সাপোর্ট প্যাকেজ (BSP) SysFS-এর মাধ্যমে বোর্ড কনফিগারেশন প্রপার্টি এক্সপোর্ট করতে পারে যা Android InputReader কম্পোনেন্ট ব্যবহার করে, যেমন টাচ স্ক্রিনে ভার্চুয়াল কীয়ের প্লেসমেন্ট।
বিভিন্ন ডিভাইস কীভাবে বোর্ড কনফিগারেশন প্রপার্টি ব্যবহার করে সেই সম্পর্কে বিস্তারিত জানতে ডিভাইস ক্লাস বিভাগ দেখুন।
রিসোর্স ওভারলে
config.xml-এ রিসোর্স ওভারলে ব্যবহার করে কিছু ইনপুট আচরণ কনফিগার করা হয়,
যেমন লিড সুইচের অপারেশন।
এখানে কিছু উদাহরণ দেওয়া হল:
-
config_lidKeyboardAccessibility: হার্ডওয়্যার কীবোর্ড অ্যাক্সেস করা যাবে নাকি লুকানো থাকবে, সেটি লিড সুইচের এফেক্ট নির্দিষ্ট করে। -
config_lidNavigationAccessibility: ট্র্যাকপ্যাড অ্যাক্সেস করা যাবে নাকি লুকানো থাকবে, তা লিড সুইচের মাধ্যমে নির্দিষ্ট করা হয়। -
config_longPressOnPowerBehavior: ব্যবহারকারী পাওয়ার বোতামটি হোল্ড করে রাখলে কী হওয়া উচিত তা নির্দিষ্ট করে। -
config_lidOpenRotation: স্ক্রিন সজ্জার উপর ঢাকনা বন্ধ করার প্রভাব নির্দিষ্ট করে।
প্রতিটি কনফিগারেশন বিকল্প সম্পর্কে বিস্তারিত জানতে frameworks/base/core/res/res/values/config.xml-এর মধ্যে
ডকুমেন্টেশন দেখুন।
কী ম্যাপ
কী-ম্যাপ, Android EventHub ও InputReader কম্পোনেন্ট ব্যবহার করে
কী, জয়স্টিক বোতাম ও জয়স্টিক অ্যাক্সিসের জন্য
Linux ইভেন্ট কোড থেকে Android ইভেন্ট কোডে ম্যাপিং কনফিগার করে। ম্যাপিং ডিভাইস বা ভাষার উপর
নির্ভরশীল হতে পারে।
কী ম্যাপ কীভাবে বিভিন্ন ডিভাইস ব্যবহার করে সেই সম্পর্কে বিস্তারিত জানতে ডিভাইস ক্লাস বিভাগ দেখুন।
ইনপুট ডিভাইস কনফিগারেশন ফাইল
ইনপুট ডিভাইস কনফিগারেশন ফাইল Android EventHub এবং
InputReader কম্পোনেন্ট দ্বারা ব্যবহার করা হয় যাতে বিশেষ ডিভাইস বৈশিষ্ট্য কনফিগার করা যায়
যেমন টাচ সাইজ তথ্য কীভাবে রিপোর্ট করা হয়।
বিভিন্ন ডিভাইস কীভাবে ইনপুট ডিভাইস কনফিগারেশন ম্যাপ ব্যবহার করে সেই সম্পর্কে বিস্তারিত জানতে ডিভাইস ক্লাস বিভাগ দেখুন।
HID ব্যবহার ও ইভেন্ট কোড সম্পর্কে জানুন
কীবোর্ডের কোনও নির্দিষ্ট কী, গেম কন্ট্রোলারের বোতাম, জয়স্টিক অ্যাক্সিস বা অন্যান্য কন্ট্রোল বোঝাতে প্রায়শই একাধিক আলাদা আলাদা আইডেন্টিফায়ার ব্যবহার করা হয়। এইসব আইডেন্টিফায়ারের মধ্যে সম্পর্ক সবসময় এক হয় না: এগুলি ম্যাপিং টেবিলের সেটের উপর নির্ভর করে, যার মধ্যে কিছু নির্দিষ্ট এবং কিছু ডিভাইসের বৈশিষ্ট্য, ডিভাইস ড্রাইভার, বর্তমান লোকেল, সিস্টেম কনফিগারেশন, ব্যবহারকারীর পছন্দ এবং অন্যান্য বিষয়ের উপর নির্ভর করে পরিবর্তিত হয়।
- ফিজিক্যাল স্ক্যান কোড
-
ফিজিক্যাল স্ক্যান কোড হল ডিভাইস-নির্দিষ্ট শনাক্তকারী যা প্রতিটি কী, বোতাম বা অন্যান্য কন্ট্রোলের সাথে যুক্ত থাকে। যেহেতু ফিজিক্যাল স্ক্যান কোড প্রায়ই এক ডিভাইস থেকে অন্য ডিভাইসে আলাদা হয়, তাই ফার্মওয়্যার বা ডিভাইস ড্রাইভার সেগুলিকে HID ব্যবহার বা Linux কী কোডের মতো স্ট্যান্ডার্ড শনাক্তকারীতে ম্যাপ করার জন্য দায়ী।
স্ক্যান কোড মূলত কীবোর্ডের জন্য গুরুত্বপূর্ণ। অন্যান্য ডিভাইস সাধারণত GPIO পিন, I2C মেসেজ বা অন্য উপায়ে লো-লেভেলে যোগাযোগ করে। এর ফলে, সফ্টওয়্যার স্ট্যাকের উপরের লেয়ারগুলি কী ঘটছে তা বোঝার জন্য ডিভাইস ড্রাইভারের উপর নির্ভর করে।
- HID ব্যবহার
-
HID ব্যবহার হল একটি স্ট্যান্ডার্ড শনাক্তকারী যা কীবোর্ড কী, জয়স্টিক অক্ষ, মাউস বোতাম বা টাচ কন্ট্যাক্ট পয়েন্টের মতো নিয়ন্ত্রণের অবস্থা রিপোর্ট করতে ব্যবহৃত হয়। বেশিরভাগ USB ও ব্লুটুথ ইনপুট ডিভাইস HID স্পেসিফিকেশন মেনে চলে, যা সিস্টেমকে তাদের সাথে অভিন্ন উপায়ে ইন্টারফেস করতে দেয়।
Android ফ্রেমওয়ার্ক, HID ব্যবহার সংক্রান্ত কোডকে Linux কী কোড ও অন্যান্য শনাক্তকারীতে ট্রান্সলেট করার জন্য Linux কার্নেল HID ড্রাইভারের উপর নির্ভর করে। তাই HID ব্যবহার মূলত পেরিফেরাল প্রস্তুতকারকদের জন্য আগ্রহের বিষয়।
- Linux কী কোড
-
Linux 'কী' কোড হল কোনও 'কী' বা বোতামের জন্য স্ট্যান্ডার্ড আইডেন্টিফায়ার।
linux/input.hহেডার ফাইলে Linux কী কোডকে কনস্ট্যান্ট ব্যবহার করে সংজ্ঞায়িত করা হয়, যেগুলিKEY_বাBTN_প্রিফিক্স দিয়ে শুরু হয়। Linux কার্নেল ইনপুট ড্রাইভার, ফিজিক্যাল স্ক্যান কোড, HID ব্যবহার এবং অন্যান্য ডিভাইস-নির্দিষ্ট সিগন্যালকে Linux কী কোডে ট্রান্সলেট করার জন্য দায়ী এবং এগুলি সম্পর্কে তথ্যEV_KEYইভেন্টের অংশ হিসেবে প্রদান করে।Android API কখনও কখনও কোনও কী-এর সাথে যুক্ত Linux কী কোডকে এর "স্ক্যান কোড" হিসেবে উল্লেখ করে। এটি টেকনিক্যালি ভুল হলেও API-তে এটি Android কী কোড থেকে Linux কী কোডকে আলাদা করতে সাহায্য করে।
- Linux রিলেটিভ বা অ্যাবসলিউট অ্যাক্সিস কোড
-
Linux-এর আপেক্ষিক বা পরম অ্যাক্সিস কোড হল কোনও অ্যাক্সিস বরাবর আপেক্ষিক মুভমেন্ট বা পরম পজিশন রিপোর্ট করার জন্য একটি স্ট্যান্ডার্ড শনাক্তকারী। যেমন, X-অ্যাক্সিস বরাবর মাউসের আপেক্ষিক মুভমেন্ট বা X-অ্যাক্সিস বরাবর জয়স্টিকের পরম পজিশন।
linux/input.hheader ফাইলে ধ্রুবক ব্যবহার করে Linux অ্যাক্সিস কোডকে সংজ্ঞায়িত করা হয়, যাREL_বাABS_উপসর্গ দিয়ে শুরু হয়। Linux কার্নেল ইনপুট ড্রাইভার HID ব্যবহার এবং অন্যান্য ডিভাইস-নির্দিষ্ট সিগন্যালকে Linux অ্যাক্সিস কোডে অনুবাদ করার জন্য এবংEV_RELওEV_ABSইভেন্টের অংশ হিসেবে তাদের সম্পর্কে তথ্য প্রদান করার জন্য দায়ী। - Linux Switch Code
-
Linux সুইচ কোড হল ডিভাইসে সুইচের অবস্থা রিপোর্ট করার জন্য একটি স্ট্যান্ডার্ড শনাক্তকারী, যেমন লিড সুইচ। Linux সুইচ কোড
linux/input.hহেডার ফাইলেSW_প্রিফিক্স দিয়ে শুরু হওয়া ধ্রুবক ব্যবহার করে সংজ্ঞায়িত করা হয়। Linux কার্নেল ইনপুট ড্রাইভারEV_SWইভেন্ট হিসেবে সুইচ স্টেট পরিবর্তন রিপোর্ট করে।Android অ্যাপ্লিকেশন সাধারণত সুইচ থেকে ইভেন্ট গ্রহণ করে না, কিন্তু সিস্টেম বিভিন্ন ডিভাইস-নির্দিষ্ট ফাংশন নিয়ন্ত্রণ করতে অভ্যন্তরীণভাবে সেগুলি ব্যবহার করতে পারে।
- Android কী কোড
-
Android কী কোড হল Android API-তে নির্দিষ্ট করা একটি স্ট্যান্ডার্ড শনাক্তকারী যা 'HOME'-এর মতো কোনও নির্দিষ্ট কী নির্দেশ করে। Android কী কোড
android.view.KeyEventক্লাস দ্বারা ধ্রুবক হিসেবে সংজ্ঞায়িত করা হয় যাKEYCODE_প্রিফিক্স দিয়ে শুরু হয়।কী লেআউট থেকে জানা যায় যে Linux কী কোড কীভাবে Android কী কোডের সাথে ম্যাপ করা হয়। কীবোর্ড মডেল, ভাষা, দেশ, লেআউট বা বিশেষ ফাংশনের উপর নির্ভর করে আলাদা আলাদা কী লেআউট ব্যবহার করা হতে পারে।
ডিভাইস ও লোকেল নির্দিষ্ট কী ক্যারেক্টার ম্যাপ ব্যবহার করে Android কী কোডের কম্বিনেশনকে ক্যারেক্টার কোডে ট্রান্সফর্ম করা হয়। যেমন,
KEYCODE_SHIFTওKEYCODE_Aহিসেবে চিহ্নিত কী দুটি একসাথে প্রেস করা হলে, সিস্টেম কী ক্যারেক্টার ম্যাপে কম্বিনেশনটি খুঁজে দেখে এবং বড় হাতের 'A' খুঁজে পায়, যেটি তারপর বর্তমানে ফোকাস করা টেক্সট উইজেটে ইনসার্ট করা হয়। - Android Axis Code
-
Android অ্যাক্সিস কোড হল Android API-তে নির্দিষ্ট করা একটি স্ট্যান্ডার্ড শনাক্তকারী যা নির্দিষ্ট ডিভাইসের অ্যাক্সিসকে নির্দেশ করে। Android অ্যাক্সিস কোড
android.view.MotionEventক্লাস দ্বারা কনস্ট্যান্ট হিসেবে সংজ্ঞায়িত করা হয় যাAXIS_প্রিফিক্স দিয়ে শুরু হয়।কী লেআউট থেকে জানা যায় যে Linux Axis কোড কীভাবে Android axis কোডের সাথে ম্যাপ করা হয়। ডিভাইস মডেল, ভাষা, দেশ, লেআউট বা বিশেষ ফাংশনের উপর নির্ভর করে আলাদা আলাদা কী লেআউট ব্যবহার করা হতে পারে।
- Android মেটা স্টেট
-
Android মেটা স্টেট হল একটি স্ট্যান্ডার্ড শনাক্তকারী যা Android API-তে সংজ্ঞায়িত করা হয়েছে এবং কোন মডিফায়ার কী প্রেস করা হয়েছে তা নির্দেশ করে। Android মেটা স্টেট
android.view.KeyEventক্লাস দ্বারা কনস্ট্যান্ট হিসেবে সংজ্ঞায়িত করা হয় যাMETA_প্রিফিক্স দিয়ে শুরু হয়।বর্তমান মেটা স্টেট Android InputReader কম্পোনেন্ট দ্বারা নির্ধারিত হয় যা
KEYCODE_SHIFT_LEFT-এর মতো মডিফায়ার কী প্রেস / রিলিজ করা এবং উপযুক্ত মেটা স্টেট ফ্ল্যাগ সেট / রিসেট করার সময় মনিটর করে।মডিফায়ার কী এবং মেটা স্টেটের মধ্যে সম্পর্ক হার্ডকোড করা থাকে কিন্তু কী লেআউট মডিফায়ার কী কীভাবে ম্যাপ করা হয়েছে তা পরিবর্তন করতে পারে যা মেটা স্টেটকে প্রভাবিত করে।
- Android বোতামের স্টেট
-
Android বোতামের অবস্থা হল একটি স্ট্যান্ডার্ড শনাক্তকারী যা Android API-তে সংজ্ঞায়িত করা হয়েছে। এটি নির্দেশ করে যে কোন বোতাম (মাউস বা স্টাইলাসে) প্রেস করা হয়েছে। Android বোতামের স্টেটকে
android.view.MotionEventclass দ্বারা কনস্ট্যান্ট হিসেবে সংজ্ঞায়িত করা হয়, যাBUTTON_প্রিফিক্স দিয়ে শুরু হয়।বর্তমান বোতামের অবস্থা Android InputReader কম্পোনেন্ট দ্বারা নির্ধারিত হয় যা বোতামগুলি (মাউস বা স্টাইলাসে) কখন প্রেস করা / রিলিজ করা হয় তা মনিটর করে এবং উপযুক্ত বোতামের অবস্থা ফ্ল্যাগ সেট / রিসেট করে।
বোতাম ও বোতামের অবস্থার মধ্যে সম্পর্ক হার্ডকোড করা থাকে।