رابط VHAL

رابط کاربری AIDL VHAL در android.hardware.automotive.vehicle namespace تعریف شده است. رابط کاربری VHAL در IVehicle.aidl تعریف شده است. مگر اینکه مشخص شده باشد، همه متدها باید برای یک نسخه خاص VHAL پیاده‌سازی شوند.

نسخه‌ها

نسخه اندروید آخرین نسخه VHAL آخرین نسخه املاک VHAL حداقل نسخه VHAL سازگار
اندروید ۱۶ وی۴ وی۴ وی۱
اندروید ۱۵ وی۳ وی۳ وی۱
اندروید ۱۴ وی۲ وی۲ وی۱
اندروید ۱۳ وی۱ (رابط ویژگی VHAL تقسیم نشده است) وی۱

توصیه می‌شود آخرین نسخه VHAL را برای یک نسخه خاص اندروید پیاده‌سازی کنید.

توابع و فراخوانی‌های برگشتی

توابع VHAL در IVehicle.aidl تعریف شده‌اند.

روش
VehiclePropConfigs getAllPropConfigs()
لیستی از تمام پیکربندی‌های املاک پشتیبانی شده توسط این وسیله نقلیه HAL را برمی‌گرداند.
VehiclePropConfigs getPropConfigs(in int[] props)
لیستی از پیکربندی‌های ویژگی را برای شناسه‌های ویژگی داده شده برمی‌گرداند.
void getValues(IVehicleCallback callback, in GetValueRequests requests)
مقادیر ویژگی‌های وسیله نقلیه را به صورت ناهمزمان دریافت می‌کند. دسته‌ای از GetValueRequest به صورت ناهمزمان مدیریت می‌کند. نتیجه از طریق متد onGetValues ​​از تابع callback ارسال می‌شود.
void setValues(IVehicleCallback callback, in SetValueRequests requests)
مقادیر ویژگی‌های وسیله نقلیه را به صورت ناهمگام تنظیم می‌کند. دسته‌ای از SetValueRequest به صورت ناهمگام مدیریت می‌کند. نتیجه از طریق متد onSetValues ​​از تابع callback ارسال می‌شود.
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 پیاده‌سازی شود.
( قابلیت جدید در اندروید ۱۶ )
SupportedValuesListResults getSupportedValuesLists(in List propIdAreaIds)
لیست مقادیر پشتیبانی شده برای جفت‌های شناسه ویژگی و شناسه ناحیه مشخص شده را دریافت می‌کند.
در VHAL V4 معرفی شد.
( قابلیت جدید در اندروید ۱۶ )
MinMaxSupportedValueResults getMinMaxSupportedValue(in List propIdAreaIds)
حداقل و حداکثر مقادیر پشتیبانی شده برای جفت‌های شناسه ویژگی و شناسه منطقه مشخص شده را دریافت می‌کند.
در VHAL V4 معرفی شد.
void registerSupportedValueChangeCallback(in IVehicleCallback callback, in List propIdAreaIds)
یک تابع فراخوانی (callback) ثبت می‌کند تا در صورت تغییر مقادیر پشتیبانی‌شده، فراخوانی شود.
در VHAL V4 معرفی شد.
void unregisterSupportedValueChangeCallback(in IVehicleCallback callback, in List propIdAreaIds)
تابع فراخوانی تغییر مقدار پشتیبانی‌شده را از حالت ثبت خارج می‌کند.
در VHAL V4 معرفی شد.

کال‌بک‌ها در IVehicleCallback.aidl تعریف شده‌اند و شامل این متدها هستند.

روش
oneway void onGetValues(in GetValueResults responses)
فراخوانی برگشتی برای تابع getValues ​​جهت ارائه نتایج get value. زمانی فراخوانی می‌شود که برخی از مقادیر مورد نظر برای واکشی آماده باشند.
oneway void onSetValues(in SetValueResults responses)
فراخوانی مجدد برای تابع setValues ​​برای ارائه نتایج set value. زمانی فراخوانی می‌شود که VHAL مدیریت برخی از درخواست‌های set property را به پایان رسانده باشد.
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 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 ) از طریق callback های ارسالی به عنوان آرگومان تحویل داده می‌شوند.

پیاده‌سازی نباید روی نتیجه در نخ اتصال‌دهنده‌ای که درخواست را مدیریت می‌کند، مسدود شود. در عوض، توصیه می‌کنیم درخواست را در یک صف درخواست ذخیره کنید و از یک نخ کنترل‌کننده جداگانه برای مدیریت ناهمگام درخواست‌ها استفاده کنید. برای جزئیات بیشتر به پیاده‌سازی مرجع مراجعه کنید.

شکل ۱. فرآیند ناهمزمان.

بسته‌های بزرگ

تمام ساختارهایی که XXXs نامیده می‌شوند، مانند VehiclePropConfigs ، SetValueRequests و VehiclePropValues LargeParcelable (یا StableLargeParcelable ) نامیده می‌شوند. هر کدام لیستی از مقادیر را نشان می‌دهند که برای انتقال داده‌های بزرگ که ممکن است از محدودیت‌های binder (4 کیلوبایت در پیاده‌سازی کتابخانه LargeParcelable ) فراتر روند، از مرزهای binder استفاده می‌شوند. هر کدام تعریف ساختار مشابهی دارند که شامل فیلدهای زیر است.

راهنمایی توضیحات
payloads فهرست مقادیر، زمانی که اندازه مقدار در محدوده حافظه binder یا یک لیست خالی قرار می‌گیرد.
sharedMemoryFd توصیف‌گر فایل تهی‌پذیر (Nullable file descriptor) که به یک فایل حافظه مشترک اشاره می‌کند که در صورت بزرگ بودن لیست مقادیر، داده‌های سریالی‌شده را ذخیره می‌کند.

برای مثال، 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 شامل payload های غیر خالی یا یک sharedMemoryFd غیر تهی است.

  • اگر payloads خالی نباشد، فهرستی از داده‌های واقعی را ذخیره می‌کند که همان پیکربندی ویژگی است.
  • اگر sharedMemoryFd تهی نباشد، حاوی یک فایل حافظه مشترک است که ساختار سریالی شده VehiclePropConfigs را ذخیره می‌کند. این ساختار از تابع writeToParcel برای سریالی کردن یک Parcel استفاده می‌کند.

به عنوان یک کلاینت جاوا برای VHAL، Car Service سریال‌سازی و غیرسریال‌سازی LargeParcelable را مدیریت می‌کند. برای پیاده‌سازی‌های VHAL و کلاینت‌های native، یک LargeParcelable باید با کتابخانه LargeParcelable یا یک کلاس wrapper مفید برای کتابخانه در ParcelableUtils.h سریال‌سازی و غیرسریال‌سازی شود.

برای مثال، یک کلاینت نیتیو که درخواست‌های getValues ​​دریافتی از یک binder را تجزیه می‌کند، به شرح زیر است:

// '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 ​​از طریق binder ارسال می‌کند، در زیر نشان داده شده است:

std::vector results = getResults();
GetValueResults parcelableResults;
ScopedAStatus status = vectorToStableLargeParcelable(std::move(results), &parcelableResults);
if (status.isOk()) {
    // Send parcelableResults through callback.
} else {
    // Handle error.
}