VHAL ইন্টারফেস

AIDL VHAL-টি android.hardware.automotive.vehicle namespace সংজ্ঞায়িত করা হয়েছে। VHAL ইন্টারফেসটি IVehicle.aidl এ সংজ্ঞায়িত করা হয়েছে। নির্দিষ্ট করে বলা না থাকলে, সমস্ত মেথড অবশ্যই একটি নির্দিষ্ট VHAL ভার্সনের জন্য ইমপ্লিমেন্ট করতে হবে।

সংস্করণ

অ্যান্ড্রয়েড সংস্করণ সর্বশেষ VHAL সংস্করণ VHAL প্রপার্টির সর্বশেষ সংস্করণ সর্বনিম্ন সামঞ্জস্যপূর্ণ VHAL সংস্করণ
অ্যান্ড্রয়েড ১৬ ভি৪ ভি৪ ভি১
অ্যান্ড্রয়েড ১৫ ভি৩ ভি৩ ভি১
অ্যান্ড্রয়েড ১৪ ভি২ ভি২ ভি১
অ্যান্ড্রয়েড ১৩ ভি১ (VHAL প্রপার্টি ইন্টারফেস বিভক্ত নয়) ভি১

একটি নির্দিষ্ট অ্যান্ড্রয়েড সংস্করণের জন্য সর্বশেষ VHAL সংস্করণটি প্রয়োগ করার সুপারিশ করা হয়।

ফাংশন এবং কলব্যাক

VHAL ফাংশনগুলো IVehicle.aidl এ সংজ্ঞায়িত করা আছে।

পদ্ধতি
VehiclePropConfigs getAllPropConfigs()
এই যানবাহন HAL দ্বারা সমর্থিত সমস্ত প্রপার্টি কনফিগারেশনের একটি তালিকা ফেরত দেয়।
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 propIdAreaIds)
নির্দিষ্ট প্রপার্টি আইডি এবং এরিয়া আইডি জোড়াগুলোর জন্য সমর্থিত মানগুলোর তালিকা পাওয়া যায়।
VHAL V4-এ প্রবর্তিত।
( অ্যান্ড্রয়েড ১৬-এর নতুন বৈশিষ্ট্য )
MinMaxSupportedValueResults getMinMaxSupportedValue(in List propIdAreaIds)
নির্দিষ্ট প্রপার্টি আইডি এবং এরিয়া আইডি জোড়াগুলোর জন্য সর্বনিম্ন ও সর্বোচ্চ সমর্থিত মানগুলো পাওয়া যায়।
VHAL V4-এ প্রবর্তিত।
void registerSupportedValueChangeCallback(in IVehicleCallback callback, in List propIdAreaIds)
সমর্থিত মান পরিবর্তিত হলে কল করার জন্য একটি কলব্যাক নিবন্ধন করে।
VHAL V4-এ প্রবর্তিত।
void unregisterSupportedValueChangeCallback(in IVehicleCallback callback, in List propIdAreaIds)
সমর্থিত মান পরিবর্তন কলব্যাকটি অনিবন্ধিত করে।
VHAL V4-এ প্রবর্তিত।

কলব্যাকগুলি 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 List propIdAreaIds)
সর্বনিম্ন ও সর্বোচ্চ সমর্থিত মান অথবা সমর্থিত মান তালিকার পরিবর্তন জানানোর জন্য কলব্যাক। আপডেট করা মানগুলো পাওয়ার জন্য কলারকে getMinMaxSupportedValue অথবা 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::vector results = getResults();
GetValueResults parcelableResults;
ScopedAStatus status = vectorToStableLargeParcelable(std::move(results), &parcelableResults);
if (status.isOk()) {
    // Send parcelableResults through callback.
} else {
    // Handle error.
}