VHAL ইন্টারফেস

AIDL VHAL android.hardware.automotive.vehicle namespace সংজ্ঞায়িত করা হয়েছে। 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)
ব্যবহার করা হয় না এবং নো-অপ হিসাবে প্রয়োগ করা যেতে পারে।

কলব্যাকগুলিকে 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 প্রপার্টির জন্য, একটি প্রপার্টি ইভেন্ট ঘটে যখন একটি প্রপার্টির মান বা প্রপার্টির স্থিতি পরিবর্তন হয়।
SharedMemoryFileCount সবসময় 0 হয়।
oneway void onPropertySetError(in VehiclePropErrors errors)
অ্যাসিঙ্ক্রোনাস প্রপার্টি সেটের ত্রুটির রিপোর্ট করার জন্য কলব্যাক যার কোনো অনুরূপ সেট অনুরোধ নেই। যদি আমরা জানি যে ত্রুটিটি কোন সেটের অনুরোধের জন্য, তাহলে এর পরিবর্তে একটি ত্রুটির ফলাফল সহ onSetValues ​​ব্যবহার করতে হবে।

আরও তথ্যের জন্য, IVEhicle.aidl এবং IVEhicleCallback.aidl দেখুন।

VHAL বাস্তবায়ন VHAL VTS দ্বারা VtsHalAutomotiveVehicle_TargetTest.cpp- এ যাচাই করা হয়েছে। পরীক্ষাটি যাচাই করে যে মৌলিক পদ্ধতিগুলি সঠিকভাবে প্রয়োগ করা হয়েছে এবং সমর্থিত সম্পত্তি কনফিগারেশনগুলি সঠিক।

যানবাহনের সম্পত্তির মূল্য

প্রতিটি সম্পত্তির মান বর্ণনা করতে VehiclePropValue কাঠামো ব্যবহার করুন, যার এই ক্ষেত্রগুলি রয়েছে:

মাঠ বর্ণনা
timestamp টাইমস্ট্যাম্প যে সময়টি ইভেন্টটি ঘটেছিল এবং SystemClock.elapsedRealtimeNano() ঘড়ির সাথে সিঙ্ক্রোনাইজ করে।
prop এই মানের জন্য প্রপার্টি আইডি।
areaid এই মানের জন্য এলাকা আইডি। এলাকাটি অবশ্যই এলাকা আইডি কনফিগারেশনে তালিকাভুক্ত সমর্থিত এলাকাগুলির মধ্যে একটি হতে হবে, অথবা গ্লোবাল প্রপার্টির জন্য 0
value প্রকৃত সম্পত্তি মান ধারণকারী একটি ডেটা কাঠামো। সম্পত্তির প্রকারের উপর ভিত্তি করে, এই ক্ষেত্রের মধ্যে এক বা একাধিক ক্ষেত্র প্রকৃত মান সংরক্ষণ করতে ব্যবহৃত হয়। উদাহরণস্বরূপ, value.int32Values এর প্রথম উপাদানটি Int32 প্রকারের বৈশিষ্ট্যগুলির জন্য ব্যবহৃত হয়। বিস্তারিত জানার জন্য, সম্পত্তি কনফিগারেশন দেখুন।

অ্যাসিঙ্ক্রোনাস getValues ​​এবং setValues

getValues ​​এবং setValues ​​অপারেশনগুলি অ্যাসিঙ্ক্রোনাসভাবে সঞ্চালিত হয়, যার অর্থ প্রকৃত গেট বা সেট অপারেশন সম্পূর্ণ হওয়ার আগে ফাংশনটি ফিরে আসতে পারে। অপারেশন ফলাফল (উদাহরণস্বরূপ, getValues এর জন্য সম্পত্তি মান এবং setValues এর সাফল্য বা ত্রুটির স্থিতি) আর্গুমেন্ট হিসাবে পাস করা কলব্যাকের মাধ্যমে বিতরণ করা হয়।

অনুরোধটি পরিচালনাকারী বাইন্ডার থ্রেডের ফলাফলে বাস্তবায়ন অবশ্যই ব্লক করা উচিত নয়। পরিবর্তে, আমরা আপনাকে অনুরোধটি একটি অনুরোধ সারিতে সংরক্ষণ করার পরামর্শ দিই এবং অনুরোধগুলিকে অ্যাসিঙ্ক্রোনাসভাবে পরিচালনা করতে একটি পৃথক হ্যান্ডলার থ্রেড ব্যবহার করুন৷ বিস্তারিত জানার জন্য রেফারেন্স বাস্তবায়ন দেখুন।

চিত্র 1. অ্যাসিঙ্ক্রোনাস প্রক্রিয়া।

বড় পার্সেবল

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-এর জাভা ক্লায়েন্ট হিসাবে, কার সার্ভিস LargeParcelable এর জন্য সিরিয়ালাইজেশন এবং ডিসিরিয়ালাইজেশন পরিচালনা করে। VHAL বাস্তবায়ন এবং নেটিভ ক্লায়েন্টদের জন্য, একটি LargeParcelable LargeParcelable লাইব্রেরি বা ParcelableUtils.h এ লাইব্রেরির জন্য একটি দরকারী র্যাপার ক্লাসের সাথে সিরিয়ালাইজড এবং ডিসিরিয়ালাইজ করা উচিত।

উদাহরণস্বরূপ, একটি বাইন্ডার থেকে প্রাপ্ত getValues এর জন্য একটি নেটিভ ক্লায়েন্ট পার্সিং অনুরোধ নিম্নরূপ:

// 'requests' are from the binder.
GetValueRequests requests;
expected, 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.
}