واجهة في هال

يتم تعريف 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)
غير مستخدم ويمكن تنفيذه باعتباره no-op.

يتم تعريف عمليات الاسترجاعات في 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 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 ). يمثل كل منها قائمة من القيم المستخدمة لتمرير البيانات الكبيرة التي قد تتجاوز حدود الرابط (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، تتولى خدمة السيارات عملية التسلسل وإلغاء التسلسل لـ 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.
}