AIDL VHAL
android.hardware.automotive.vehicle namespace-এ সংজ্ঞায়িত করা হয়েছে।
VHAL ইন্টারফেস
IVehicle.aidl-এ সংজ্ঞায়িত করা আছে।
উল্লেখ করা না থাকলে, নির্দিষ্ট VHAL ভার্সনের জন্য সব পদ্ধতি প্রয়োগ করতে হবে।
বিভিন্ন ভার্সন
| Android ভার্সন | লেটেস্ট VHAL ভার্সন | লেটেস্ট VHAL প্রপার্টি ভার্সন | মানানসই VHAL-এর ন্যূনতম ভার্সন |
|---|---|---|---|
| Android 16 | V4 | V4 | V1 |
| Android 15 | V3 | V3 | V1 |
| Android 14 | V2 | V2 | V1 |
| Android 13 | V1 | (VHAL প্রপার্টি ইন্টারফেস স্প্লিট করা হয়নি) | V1 |
নির্দিষ্ট Android ভার্সনের জন্য লেটেস্ট 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)
|
|
(Android 16-এ নতুন)SupportedValuesListResults getSupportedValuesLists(in List
|
|
(Android 16-এ নতুন)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-এ সাবস্ক্রাইব স্যাম্পেল রেট
বা গাড়ির বাস মেসেজ ফ্রিকোয়েন্সির উপর ভিত্তি করে প্রপার্টি ইভেন্ট ঘটে। কোনও প্রপার্টির স্ট্যাটাস পরিবর্তন হলে, প্রপার্টি ইভেন্টও
হতে পারে। যেমন, উপলভ্য নেই থেকে উপলভ্য আছে।ON_CHANGE প্রপার্টির জন্য, কোনও প্রপার্টির ভ্যালু বা স্ট্যাটাস পরিবর্তন হলে
প্রপার্টি ইভেন্ট ঘটে।VehiclePropValue ডেলিভার করা উচিত।SharedMemoryFileCount সবসময় 0 হয়। |
|
oneway void onPropertySetError(in VehiclePropErrors errors)
onSetValues
ব্যবহার করতে হবে। |
|
oneway void onSupportedValueChange(in List
getMinMaxSupportedValue বা
getSupportedValuesLists-এ কল করতে হবে। |
|
VHAL ইমপ্লিমেন্টেশন VHAL VTS-এর মাধ্যমে
VtsHalAutomotiveVehicle_TargetTest.cpp-এ যাচাই করা হয়।
এই টেস্টের মাধ্যমে যাচাই করা হয় যে প্রাথমিক পদ্ধতিগুলি সঠিকভাবে প্রয়োগ করা হয়েছে কিনা এবং কাজ করে এমন প্রপার্টি
কনফিগারেশন সঠিক কিনা। ডিভাইসের সব VHAL ইনস্ট্যান্সের ক্ষেত্রে টেস্ট রান করে, তবে AAOS শুধুমাত্র
ডিফল্ট ইনস্ট্যান্স (android.hardware.automotive.vehicle.IVehicle/default) ব্যবহার করে
গাড়ির প্রপার্টি সংক্রান্ত ভ্যালু
প্রতিটি প্রপার্টির ভ্যালু বর্ণনা করতে
VehiclePropValue
স্ট্রাকচার ব্যবহার করো, যার মধ্যে এইসব ফিল্ড আছে:
| ফিল্ড | বর্ণনা |
|---|---|
timestamp
| ইভেন্টটি কখন ঘটেছে তা টাইমস্ট্যাম্প থেকে জানা যায় এবং এটি SystemClock.elapsedRealtimeNano() ঘড়ির সাথে
সিঙ্ক করা থাকে। |
prop |
এই ভ্যালুর জন্য প্রপার্টি আইডি। |
areaid |
এই ভ্যালুর জন্য এলাকা আইডি। এলাকাটি অবশ্যই এলাকা আইডি কনফিগারেশনে তালিকাভুক্ত সমর্থিত এলাকাগুলির মধ্যে একটি হতে হবে, অথবা গ্লোবাল প্রপার্টির জন্য 0 হতে হবে। |
value |
একটি ডেটা স্ট্রাকচার যাতে আসল প্রপার্টি ভ্যালু থাকে। প্রপার্টির ধরনের উপর ভিত্তি করে, এই ফিল্ডের মধ্যে এক বা
একাধিক ফিল্ড আসল ভ্যালু স্টোর করার জন্য ব্যবহার করা হয়। যেমন, value.int32Values-এর প্রথম
এলিমেন্ট Int32 ধরনের প্রপার্টির জন্য ব্যবহার করা হয়। আরও জানতে,
প্রপার্টি
কনফিগারেশন দেখুন। |
status |
পড়ার জন্য প্রপার্টির স্ট্যাটাস। রিড/রাইট প্রপার্টির ক্ষেত্রে, এটি লেখার জন্যও প্রযোজ্য হতে পারে, তবে গ্যারান্টিযুক্ত নয়, উদাহরণস্বরূপ, প্রপার্টিটি পড়ার জন্য উপলভ্য হতে পারে তবে লেখার জন্য উপলভ্য নাও হতে পারে। এই ধরনের ক্ষেত্রে, স্ট্যাটাস হল AVAILABLE এবং ভ্যালু ফিল্ডে সঠিক তথ্য থাকে।
সম্ভাব্য স্ট্যাটাসের জন্য,
VehiclePropertyStatus দেখুন। |
অ্যাসিঙ্ক্রোনাস getValues ও setValues
getValues এবং setValues অপারেশন অ্যাসিঙ্ক্রোনাসভাবে করা হয়,
যার অর্থ হল, আসল get বা set অপারেশন সম্পূর্ণ হওয়ার আগেই ফাংশনটি রিটার্ন করতে পারে।
অপারেশনের ফলাফল (যেমন, getValues-এর জন্য প্রপার্টি ভ্যালু এবং setValues-এর জন্য সাফল্য বা
সমস্যার স্ট্যাটাস) আর্গুমেন্ট হিসেবে পাস করা কলব্যাকের মাধ্যমে ডেলিভার করা হয়।
অনুরোধ ম্যানেজ করে এমন বাইন্ডার থ্রেডে ফলাফলের উপর ইমপ্লিমেন্টেশন ব্লক করা যাবে না। পরিবর্তে, আমরা আপনাকে অনুরোধটি একটি অনুরোধ সারিতে স্টোর করতে এবং অনুরোধগুলি অ্যাসিঙ্ক্রোনাসভাবে পরিচালনা করতে একটি পৃথক হ্যান্ডলার থ্রেড ব্যবহার করার পরামর্শ দিই। বিস্তারিত জানতে রেফারেন্স ইমপ্লিমেন্টেশন দেখুন।
ছবি ১. অ্যাসিঙ্ক্রোনাস প্রসেস।
বড় পার্সেলযোগ্য আইটেম
XXXs নামে পরিচিত সব স্ট্রাকচার, যেমন VehiclePropConfigs,
SetValueRequests এবং VehiclePropValues-কে
LargeParcelable (বা, StableLargeParcelable) বলা হয়। প্রতিটি স্ট্রাকচার এমন ভ্যালুর তালিকা দেখায়
যা বাইন্ডারের সীমা (LargeParcelable লাইব্রেরি ইমপ্লিমেন্টেশনে 4KB) অতিক্রম করতে পারে এমন বড় ডেটা বাইন্ডার সীমানা জুড়ে পাস করতে ব্যবহৃত হয়। প্রতিটির একই ধরনের
গঠনগত সংজ্ঞা আছে যাতে নিম্নলিখিত ফিল্ডগুলি থাকে।
| নির্দেশিকা | বর্ণনা |
|---|---|
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-এর সিরিয়ালাইজ করা স্ট্রাকচার স্টোর করে। স্ট্রাকচারটি একটি পার্সেলকে সিরিয়ালাইজ করতেwriteToParcelফাংশন ব্যবহার করে।
VHAL-এর জন্য Java ক্লায়েন্ট হিসেবে, Car Service 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. }