يتم تحديد 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 |
يُنصح بتنفيذ أحدث إصدار من VHAL لإصدار معيّن من Android.
الدوال وعمليات رد الاتصال
يمكن الاطّلاع على تعريفات دوال 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 ، يحدث حدث الموقع استنادًا إلى معدّل أخذ العيّنات من الاشتراك
بالهرتز أو معدّل تكرار رسائل ناقل بيانات المركبة. قد يحدث حدث خاص بموقع أيضًا إذا تغيّرت حالة الموقع. على سبيل المثال، من غير متوفّر إلى متوفّر.ON_CHANGE ، يحدث حدث خاص بالسمة عند تغيير قيمة السمة
أو حالة السمة.VehiclePropValue بحالة غير متاحة أو حالة خطأ وقيمة فارغة.SharedMemoryFileCount يساوي دائمًا 0 . |
|
oneway void onPropertySetError(in VehiclePropErrors errors)
onSetValues مع نتيجة خطأ بدلاً من ذلك. |
|
oneway void onSupportedValueChange(in List
getMinMaxSupportedValue أو getSupportedValuesLists للحصول على القيم المعدَّلة. |
يتم التحقّق من صحة تنفيذ VHAL من خلال VTS الخاص بـ VHAL على VtsHalAutomotiveVehicle_TargetTest.cpp
.
يتحقّق الاختبار من تنفيذ الطرق الأساسية بشكل صحيح ومن صحة إعدادات المواقع المتوافقة. يتم إجراء الاختبار على جميع مثيلات VHAL على الجهاز، ولكن لا يستخدم نظام التشغيل Android Automotive إلا المثيل التلقائي (android.hardware.automotive.vehicle.IVehicle/default
).
قيمة خاصية المركبة
استخدِم بنية
VehiclePropValue
لوصف قيمة كل سمة، والتي تتضمّن الحقول التالية:
الحقل | الوصف |
---|---|
timestamp
| الطابع الزمني الذي يمثّل الوقت الذي وقع فيه الحدث وتمت مزامنته مع ساعة SystemClock.elapsedRealtimeNano() . |
prop |
تمثّل هذه السمة معرّف الموقع لهذه القيمة. |
areaid |
تمثّل هذه السمة رقم تعريف المنطقة لهذه القيمة. يجب أن تكون المنطقة إحدى المناطق المتوافقة والمدرَجة في إعدادات رقم تعريف المنطقة، أو 0 للمواقع العالمية. |
value |
بنية بيانات تحتوي على قيمة السمة الفعلية استنادًا إلى نوع السمة، يتم استخدام حقل واحد أو أكثر ضمن هذا الحقل لتخزين القيمة الفعلية. على سبيل المثال، يتم استخدام العنصر الأول في value.int32Values للسمات من النوع Int32. لمزيد من التفاصيل، يُرجى الاطّلاع على إعدادات الموقع. |
status |
تمثّل هذه السمة حالة الموقع الإلكتروني للقراءة. بالنسبة إلى سمة القراءة/الكتابة، قد ينطبق ذلك أيضًا على الكتابة ولكن ليس مضمونًا، على سبيل المثال، قد تكون السمة متاحة للقراءة ولكن ليس للكتابة. في هذه الحالة، تكون الحالة AVAILABLE ويحتوي حقل القيمة على معلومات صالحة.
للاطّلاع على الحالات المحتملة، راجِع
VehiclePropertyStatus . |
الدالتان غير المتزامنتان getValues وsetValues
يتم تنفيذ العمليتَين getValues
وsetValues
بشكل غير متزامن،
ما يعني أنّ الدالة قد تعرض قيمة قبل اكتمال عملية الحصول على البيانات أو ضبطها.
يتم عرض نتائج العملية (على سبيل المثال، قيمة السمة الخاصة بـ getValues
وحالة النجاح أو الخطأ الخاصة بـ setValues
) من خلال عمليات الرجوع التي يتم تمريرها كوسيطات.
يجب ألا يتم الحظر على النتيجة في سلسلة ربط البيانات التي تعالج الطلب. بدلاً من ذلك، ننصحك بتخزين الطلب في قائمة انتظار الطلبات واستخدام سلسلة معالجة منفصلة للتعامل مع الطلبات بشكل غير متزامن. يمكنك الاطّلاع على التنفيذ المرجعي للحصول على التفاصيل.
الشكل 1. عملية غير متزامنة
عناصر كبيرة قابلة للتسلسل
تُسمى جميع البِنى التي تحمل الاسم XXXs
، مثل VehiclePropConfigs
وSetValueRequests
وVehiclePropValues
، باسم LargeParcelable
(أو StableLargeParcelable
). ويمثّل كل منها قائمة بالقيم المستخدَمة لنقل البيانات الكبيرة التي قد تتجاوز حدود Binder (4 كيلوبايت في تنفيذ مكتبة LargeParcelable
) عبر حدود Binder. يتضمّن كلّ منهما تعريفًا مشابهًا للبنية يحتوي على الحقول التالية.
إرشادات | الوصف |
---|---|
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
لتسلسل Parcel.
بصفتها برنامج Java للعميل في VHAL، تتولّى خدمة 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. }