AIDL VHAL-টি android.hardware.automotive.vehicle namespace সংজ্ঞায়িত করা হয়েছে। VHAL ইন্টারফেসটি IVehicle.aidl এ সংজ্ঞায়িত করা হয়েছে। নির্দিষ্ট করে বলা না থাকলে, সমস্ত মেথড অবশ্যই একটি নির্দিষ্ট VHAL ভার্সনের জন্য ইমপ্লিমেন্ট করতে হবে।
সংস্করণ
| অ্যান্ড্রয়েড সংস্করণ | সর্বশেষ VHAL সংস্করণ | VHAL প্রপার্টির সর্বশেষ সংস্করণ | সর্বনিম্ন সামঞ্জস্যপূর্ণ VHAL সংস্করণ |
|---|---|---|---|
| অ্যান্ড্রয়েড ১৬ | ভি৪ | ভি৪ | ভি১ |
| অ্যান্ড্রয়েড ১৫ | ভি৩ | ভি৩ | ভি১ |
| অ্যান্ড্রয়েড ১৪ | ভি২ | ভি২ | ভি১ |
| অ্যান্ড্রয়েড ১৩ | ভি১ | (VHAL প্রপার্টি ইন্টারফেস বিভক্ত নয়) | ভি১ |
একটি নির্দিষ্ট অ্যান্ড্রয়েড সংস্করণের জন্য সর্বশেষ VHAL সংস্করণটি প্রয়োগ করার সুপারিশ করা হয়।
ফাংশন এবং কলব্যাক
VHAL ফাংশনগুলো IVehicle.aidl এ সংজ্ঞায়িত করা আছে।
| পদ্ধতি | |
|---|---|
VehiclePropConfigs getAllPropConfigs() | |
VehiclePropConfigs getPropConfigs(in int[] props) | |
void getValues(IVehicleCallback callback, in GetValueRequests requests)GetValueRequest পরিচালনা করে। ফলাফলটি কলব্যাকের onGetValues মেথডের মাধ্যমে সরবরাহ করা হয়। | |
void setValues(IVehicleCallback callback, in SetValueRequests requests)SetValueRequest পরিচালনা করে। এর ফলাফল কলব্যাকের onSetValues মেথডের মাধ্যমে প্রদান করা হয়। | |
void subscribe(in IVehicleCallback callback, in SubscribeOptions[] options, int maxSharedMemoryFileCount)maxSharedMemoryFileCount ব্যবহৃত হয় না। | |
void unsubscribe(in IVehicleCallback callback, in int[] propIds) | |
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId) | |
( অ্যান্ড্রয়েড ১৬-এর নতুন বৈশিষ্ট্য )SupportedValuesListResults getSupportedValuesLists(in List | |
( অ্যান্ড্রয়েড ১৬-এর নতুন বৈশিষ্ট্য )MinMaxSupportedValueResults getMinMaxSupportedValue(in List | |
void registerSupportedValueChangeCallback(in IVehicleCallback callback, in List | |
void unregisterSupportedValueChangeCallback(in IVehicleCallback callback, in List | |
কলব্যাকগুলি IVehicleCallback.aidl এ সংজ্ঞায়িত করা হয়েছে এবং এতে এই মেথডগুলি রয়েছে।
| পদ্ধতি | |
|---|---|
oneway void onGetValues(in GetValueResults responses)getValues ফাংশনের জন্য কলব্যাক, যা প্রাপ্ত ভ্যালুর ফলাফল সরবরাহ করে। যখন ফেচ করার জন্য কিছু ভ্যালু প্রস্তুত হয়ে যায়, তখন এটি কল করা হয়। | |
oneway void onSetValues(in SetValueResults responses)setValues ফাংশনের কলব্যাক। VHAL কিছু প্রপার্টি সেট অনুরোধের প্রক্রিয়াকরণ শেষ করলে এটি কল করা হয়। | |
oneway void onPropertyEvent(in VehiclePropValues propValues, int sharedMemoryFileCount)CONTINUOUS প্রপার্টির ক্ষেত্রে, একটি প্রপার্টি ইভেন্ট ঘটে হার্টজ (Hz) এককে সাবস্ক্রাইব স্যাম্পল রেট অথবা ভেহিকেল বাস মেসেজ ফ্রিকোয়েন্সির উপর ভিত্তি করে। কোনো প্রপার্টির স্ট্যাটাস পরিবর্তিত হলেও একটি প্রপার্টি ইভেন্ট ঘটতে পারে। উদাহরণস্বরূপ, অনুপলব্ধ (unavailable) থেকে উপলব্ধ (available) হলে।ON_CHANGE প্রপার্টির ক্ষেত্রে, যখন কোনো প্রপার্টির মান বা স্ট্যাটাস পরিবর্তিত হয়, তখন একটি প্রপার্টি ইভেন্ট ঘটে।VehiclePropValue পৌঁছে দেওয়া উচিত।SharedMemoryFileCount সর্বদা 0 হয়। | |
oneway void onPropertySetError(in VehiclePropErrors errors)onSetValues ব্যবহার করতে হবে। | |
oneway void onSupportedValueChange(in ListgetMinMaxSupportedValue অথবা getSupportedValuesLists কল করতে হবে। | |
VtsHalAutomotiveVehicle_TargetTest.cpp এ থাকা VHAL VTS দ্বারা VHAL বাস্তবায়নটি যাচাই করা হয়।
এই পরীক্ষাটি যাচাই করে যে মৌলিক পদ্ধতিগুলো সঠিকভাবে প্রয়োগ করা হয়েছে এবং সমর্থিত প্রপার্টি কনফিগারেশনগুলো সঠিক আছে। পরীক্ষাটি ডিভাইসের সমস্ত VHAL ইনস্ট্যান্সের বিপরীতে চালানো হয়, তবে AAOS শুধুমাত্র ডিফল্ট ইনস্ট্যান্সটি ( android.hardware.automotive.vehicle.IVehicle/default ) ব্যবহার করে।
যানবাহনের সম্পত্তির মূল্য
প্রতিটি প্রপার্টির মান বর্ণনা করতে VehiclePropValue স্ট্রাকচারটি ব্যবহার করুন, যেটিতে নিম্নলিখিত ফিল্ডগুলো রয়েছে:
| মাঠ | বর্ণনা |
|---|---|
timestamp | যে টাইমস্ট্যাম্পটি ঘটনাটি ঘটার সময়কে নির্দেশ করে এবং SystemClock.elapsedRealtimeNano() ক্লকের সাথে সিঙ্ক্রোনাইজ করা হয়েছে। |
prop | এই মানের জন্য প্রপার্টি আইডি। |
areaid | এই মানের জন্য এলাকা আইডি। এলাকাটি অবশ্যই এলাকা আইডি কনফিগারেশনে তালিকাভুক্ত সমর্থিত এলাকাগুলোর মধ্যে একটি হতে হবে, অথবা গ্লোবাল প্রপার্টির জন্য 0 হবে। |
value | একটি ডেটা স্ট্রাকচার যা প্রপার্টির প্রকৃত মান ধারণ করে। প্রপার্টির ধরনের উপর ভিত্তি করে, এই ফিল্ডের মধ্যে থাকা এক বা একাধিক ফিল্ড প্রকৃত মানটি সংরক্ষণ করতে ব্যবহৃত হয়। উদাহরণস্বরূপ, Int32 ধরনের প্রপার্টির জন্য value.int32Values এর প্রথম উপাদানটি ব্যবহৃত হয়। বিস্তারিত জানতে, প্রপার্টি কনফিগারেশন দেখুন। |
status | পড়ার জন্য প্রপার্টির স্ট্যাটাস। রিড/রাইট প্রপার্টির ক্ষেত্রে, এটি লেখার জন্যও প্রযোজ্য হতে পারে, তবে তা নিশ্চিত নয়; উদাহরণস্বরূপ, প্রপার্টিটি পড়ার জন্য উপলব্ধ থাকলেও লেখার জন্য উপলব্ধ নাও হতে পারে। সেক্ষেত্রে, স্ট্যাটাস হয় AVAILABLE এবং ভ্যালু ফিল্ডে বৈধ তথ্য থাকে। সম্ভাব্য স্ট্যাটাসগুলোর জন্য, VehiclePropertyStatus দেখুন। |
অ্যাসিঙ্ক্রোনাস getValues এবং setValues
getValues এবং setValues অপারেশনগুলো অ্যাসিঙ্ক্রোনাসভাবে সম্পাদিত হয়, যার অর্থ হলো প্রকৃত get বা set অপারেশনটি সম্পন্ন হওয়ার আগেই ফাংশনটি রিটার্ন করতে পারে। অপারেশনের ফলাফল (উদাহরণস্বরূপ, getValues জন্য প্রপার্টির মান এবং setValues এর জন্য সফল বা ত্রুটিপূর্ণ স্ট্যাটাস) আর্গুমেন্ট হিসেবে পাস করা কলব্যাকগুলোর মাধ্যমে সরবরাহ করা হয়।
যে বাইন্ডার থ্রেডটি অনুরোধটি পরিচালনা করে, সেখানে ইমপ্লিমেন্টেশনটি ফলাফলের জন্য ব্লক করবে না। এর পরিবর্তে, আমরা সুপারিশ করি যে আপনি অনুরোধটি একটি রিকোয়েস্ট কিউ-তে সংরক্ষণ করুন এবং অনুরোধগুলি অ্যাসিঙ্ক্রোনাসভাবে পরিচালনা করার জন্য একটি পৃথক হ্যান্ডলার থ্রেড ব্যবহার করুন। বিস্তারিত জানার জন্য রেফারেন্স ইমপ্লিমেন্টেশন দেখুন।
চিত্র ১. অ্যাসিঙ্ক্রোনাস প্রক্রিয়া।
বড় পার্সেলযোগ্য
XXXs নামে পরিচিত সমস্ত স্ট্রাকচার, যেমন VehiclePropConfigs , SetValueRequests , এবং VehiclePropValues LargeParcelable (বা, StableLargeParcelable ) বলা হয়। প্রতিটি হলো ভ্যালুর একটি তালিকা, যা বাইন্ডারের সীমাবদ্ধতা ( LargeParcelable লাইব্রেরি ইমপ্লিমেন্টেশনে ৪কেবি) অতিক্রম করতে পারে এমন বড় ডেটা বাইন্ডারের সীমানা পেরিয়ে পাঠানোর জন্য ব্যবহৃত হয়। প্রতিটির একটি অনুরূপ স্ট্রাকচার ডেফিনিশন রয়েছে, যাতে নিম্নলিখিত ফিল্ডগুলো থাকে।
| নির্দেশনা | বর্ণনা |
|---|---|
payloads | যখন মানের আকার বাইন্ডার মেমরির সীমাবদ্ধতার মধ্যে থাকে, তখন মানগুলির একটি তালিকা, অথবা একটি খালি তালিকা। |
sharedMemoryFd | একটি নালযোগ্য ফাইল ডেসক্রিপ্টর যা একটি শেয়ার্ড মেমরি ফাইলকে নির্দেশ করে, যেখানে মানের তালিকা খুব বড় হলে সিরিয়ালাইজড পেলোডগুলি সংরক্ষণ করা হয়। |
উদাহরণস্বরূপ, VehiclePropConfigs এভাবে সংজ্ঞায়িত করা হয়:
parcelable VehiclePropConfigs { // The list of vehicle property configs if they fit the binder memory // limitation. VehiclePropConfig[] payloads; // Shared memory file to store configs if they exceed binder memory // limitation. Created by VHAL, readable only at client. Client could keep // the fd opened or keep the FD mapped to access configs. @nullable ParcelFileDescriptor sharedMemoryFd; }
VehiclePropConfigs হয় অ-খালি পেলোড অথবা একটি অ-নাল sharedMemoryFd থাকে।
- যদি
payloadsখালি না থাকে, তবে এটি প্রকৃত ডেটার একটি তালিকা সংরক্ষণ করে, যা হলো প্রপার্টি কনফিগ। - যদি
sharedMemoryFdনাল না হয়, তবে এতে একটি শেয়ার্ড মেমোরি ফাইল থাকে, যাVehiclePropConfigsএর সিরিয়ালাইজড স্ট্রাকচারটি সংরক্ষণ করে। এই স্ট্রাকচারটি একটি Parcel-কে সিরিয়ালাইজ করার জন্যwriteToParcelফাংশনটি ব্যবহার করে।
VHAL-এর একটি জাভা ক্লায়েন্ট হিসেবে, কার সার্ভিস LargeParcelable এর সিরিয়ালাইজেশন এবং ডিসিরিয়ালাইজেশন পরিচালনা করে। VHAL ইমপ্লিমেন্টেশন এবং নেটিভ ক্লায়েন্টদের জন্য, একটি LargeParcelable LargeParcelable লাইব্রেরি অথবা ParcelableUtils.h এ থাকা লাইব্রেরিটির কোনো কার্যকর র্যাপার ক্লাস ব্যবহার করে সিরিয়ালাইজ ও ডিসিরিয়ালাইজ করা উচিত।
উদাহরণস্বরূপ, একটি বাইন্ডার থেকে প্রাপ্ত getValues অনুরোধগুলি পার্স করার জন্য একটি নেটিভ ক্লায়েন্টের প্রক্রিয়াটি নিম্নরূপ:
// 'requests' are from the binder. GetValueRequests requests; expected<LargeParcelableBase::BorrowedOwnedObject, ScopedAStatus> deserializedResults = fromStableLargeParcelable(requests); if (deserializedResults.ok()) { const std::vector & getValueRequests = deserializedResults.value().getObject()->payloads; // Use the getValueRequests. } else { // handle error. }
নিচে একটি নমুনা VHAL ইমপ্লিমেন্টেশন দেখানো হলো, যা বাইন্ডারের মাধ্যমে getValues এর ফলাফল পাঠায়:
std::vectorresults = getResults(); GetValueResults parcelableResults; ScopedAStatus status = vectorToStableLargeParcelable(std::move(results), &parcelableResults); if (status.isOk()) { // Send parcelableResults through callback. } else { // Handle error. }