AIDL VHAL ইন্টারফেস

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()
এই ভেহিকেল 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)
নির্দিষ্ট বিকল্প সহ প্রপার্টি ইভেন্টে সাবস্ক্রাইব করে। সাবস্ক্রাইব করার বিকল্পের মধ্যে রয়েছে প্রপার্টি আইডি, প্রপার্টি এরিয়া আইডি এবং Hz-এ স্যাম্পেল রেট (ধারাবাহিক প্রপার্টির জন্য)। maxSharedMemoryFileCount ব্যবহার করা হয়নি।
void unsubscribe(in IVehicleCallback callback, in int[] propIds)
নির্দিষ্ট প্রপার্টির জন্য আগে সাবস্ক্রাইব করা প্রপার্টি ইভেন্ট আনসাবস্ক্রাইব করে।
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
ব্যবহার করা হয়নি এবং নো-অপ হিসেবে প্রয়োগ করা যেতে পারে।
(Android 16-এ নতুন)
SupportedValuesListResults getSupportedValuesLists(in List propIdAreaIds)
নির্দিষ্ট প্রপার্টি আইডি ও এরিয়া আইডি পেয়ারের জন্য কাজ করে এমন ভ্যালুর তালিকা পায়।
VHAL V4-এ চালু করা হয়েছে।
(Android 16-এ নতুন)
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-এ সাবস্ক্রাইব স্যাম্পেল রেট বা গাড়ির বাস মেসেজ ফ্রিকোয়েন্সির উপর ভিত্তি করে প্রপার্টি ইভেন্ট ঘটে। কোনও প্রপার্টির স্ট্যাটাস পরিবর্তন হলে, প্রপার্টি ইভেন্টও হতে পারে। যেমন, উপলভ্য নেই থেকে উপলভ্য আছে।
ON_CHANGE প্রপার্টির জন্য, কোনও প্রপার্টির ভ্যালু বা স্ট্যাটাস পরিবর্তন হলে প্রপার্টি ইভেন্ট ঘটে।
এছাড়াও, প্রপার্টির স্ট্যাটাস পরিবর্তন সংক্রান্ত ইভেন্ট ডেলিভার করার জন্য এটি ব্যবহার করা উচিত, যেমন, প্রপার্টি অনুপলভ্য হলে বা রিডিং সংক্রান্ত সমস্যা হলে, অনুপলভ্য বা সমস্যা সংক্রান্ত স্ট্যাটাস এবং খালি ভ্যালু সহ VehiclePropValue ডেলিভার করা উচিত।
SharedMemoryFileCount সবসময় 0 হয়।
oneway void onPropertySetError(in VehiclePropErrors errors)
অ্যাসিঙ্ক্রোনাস প্রপার্টি সেট সংক্রান্ত সমস্যার রিপোর্ট করার জন্য কলব্যাক, যার কোনও সংশ্লিষ্ট সেট অনুরোধ নেই। কোন সেট অনুরোধের জন্য সমস্যা হচ্ছে তা জানা থাকলে, এর পরিবর্তে সমস্যা সংক্রান্ত ফলাফল সহ onSetValues ব্যবহার করতে হবে।
oneway void onSupportedValueChange(in List propIdAreaIds)
রিপোর্ট করার জন্য কলব্যাক ন্যূনতম এবং সর্বাধিক সমর্থিত মান বা সমর্থিত মান তালিকা পরিবর্তন। আপডেট করা ভ্যালু পেতে কলারকে 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::vector results = getResults();
GetValueResults parcelableResults;
ScopedAStatus status = vectorToStableLargeParcelable(std::move(results), &parcelableResults);
if (status.isOk()) {
    // Send parcelableResults through callback.
} else {
    // Handle error.
}