واجهة 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)
للاشتراك في أحداث الموقع باستخدام خيارات محدَّدة وتشمل خيارات الاشتراك رقم تعريف الموقع، ورقم تعريف منطقة الموقع، ومعدل العينة بالهرتز (لموقع مستمر). لا يتم استخدام 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، يقع حدث الموقع استنادًا إلى معدّل الاشتراك في العيّنة. بالهرتز أو تردّد رسائل حافلات المركبات قد يقع حدث الموقع أيضًا إذا كان الموقع تغييرات الحالة. على سبيل المثال، من غير متوفّر إلى متاح.
بالنسبة إلى السمة ON_CHANGE، يقع حدث الموقع عندما تكون قيمة الموقع. أو تغيّرت حالة الموقع.
تكون قيمة
SharedMemoryFileCount دائمًا 0.
oneway void onPropertySetError(in VehiclePropErrors errors)
رد الاتصال لإعداد تقارير عن أخطاء مجموعة المواقع غير المتزامنة التي ليس لها مجموعة مقابلة طلبك. إذا عرفنا أي طلب مجموعة يشير إلى الخطأ، onSetValues باستخدام نتيجة خطأ بدلاً من هذه النتيجة.

لمزيد من المعلومات، يُرجى مراجعة IVehicle.aidl أو IVehicleCallback.aidl.

يتم التحقق من صحة تنفيذ VHAL VTS من خلال VHAL VTS في VtsHalAutomotiveVehicle_TargetTest.cpp. يتحقّق الاختبار من تنفيذ الطرق الأساسية بشكل صحيح ومن أنّ الموقع المتوافق من التكوينات صحيحة.

قيمة ممتلكات المركبة

يمكنك استخدام VehiclePropValue لوصف قيمة كل سمة، والتي تحتوي على الحقول التالية:

الحقل الوصف
timestamp الطابع الزمني الذي يمثل وقت وقوع الحدث ومزامنته مع ساعة واحدة (SystemClock.elapsedRealtimeNano())
prop رقم تعريف الموقع لهذه القيمة.
areaid رقم تعريف المنطقة لهذه القيمة. يجب أن تكون المنطقة إحدى المناطق المتوافقة والمدرجة فيها. إعدادات رقم التعريف، أو 0 للمواقع العامة.
value يشير ذلك المصطلح إلى بنية بيانات تحتوي على قيمة السمة الفعلية. استنادًا إلى نوع الموقع، يمكن أن يكون أحد المزيد من الحقول داخل هذا الحقل لتخزين القيمة الفعلية. على سبيل المثال، العنصر في value.int32Values يستخدم لخصائص نوع Int32. للحصول على التفاصيل، يُرجى مراجعة الموقع الإعدادات:

قيم getValues وsetValues غير المتزامنة

يتم تنفيذ العمليات getValues وsetValues بشكل غير متزامن، مما يعني أن الدالة قد تعرض قبل اكتمال عملية get أو set الفعلية. تؤدي نتائج العملية (على سبيل المثال، قيمة الخاصية لـ getValues والنجاح أو حالة الخطأ لـ setValues) من خلال عمليات الاستدعاء التي يتم تمريرها كوسيطات.

يجب ألا يتم حظر التنفيذ على النتيجة في سلسلة التعليمات التي تعالج الطلب. بدلاً من ذلك، ننصحك بتخزين الطلب في قائمة انتظار للطلبات واستخدام سلسلة معالجات منفصلة. معالجة الطلبات بشكل غير متزامن. يمكنك الاطّلاع على تنفيذ المراجع في التفاصيل.

الشكل 1. عملية غير متزامنة

قطع كبيرة من الأراضي

جميع البنى المسماة XXXs، مثل VehiclePropConfigs، يُطلق على SetValueRequests وVehiclePropValues اسم LargeParcelable (أو StableLargeParcelable). يمثل كل منها قائمة من القيم المستخدمة لتمرير بيانات كبيرة قد تتجاوز حدود المربط (4 كيلوبايت في تنفيذ 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. يستخدم الهيكل writeToParcel لإنشاء تسلسل لطرد.

كعميل Java لـ VHAL، تعالج خدمة Car Service التسلسل وإلغاء التسلسل 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.
}