رابط کاربری AIDL VHAL در android.hardware.automotive.vehicle namespace تعریف شده است. رابط کاربری VHAL در IVehicle.aidl تعریف شده است. مگر اینکه مشخص شده باشد، همه متدها باید برای یک نسخه خاص VHAL پیادهسازی شوند.
نسخهها
| نسخه اندروید | آخرین نسخه VHAL | آخرین نسخه املاک VHAL | حداقل نسخه VHAL سازگار |
|---|---|---|---|
| اندروید ۱۶ | وی۴ | وی۴ | وی۱ |
| اندروید ۱۵ | وی۳ | وی۳ | وی۱ |
| اندروید ۱۴ | وی۲ | وی۲ | وی۱ |
| اندروید ۱۳ | وی۱ | (رابط ویژگی VHAL تقسیم نشده است) | وی۱ |
توصیه میشود آخرین نسخه VHAL را برای یک نسخه خاص اندروید پیادهسازی کنید.
توابع و فراخوانیهای برگشتی
توابع VHAL در IVehicle.aidl تعریف شدهاند.
| روش | |
|---|---|
VehiclePropConfigs getAllPropConfigs() | |
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) | |
( قابلیت جدید در اندروید ۱۶ )SupportedValuesListResults getSupportedValuesLists(in List | |
( قابلیت جدید در اندروید ۱۶ )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 جهت ارائه نتایج 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 ListgetMinMaxSupportedValue یا 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::vectorresults = getResults(); GetValueResults parcelableResults; ScopedAStatus status = vectorToStableLargeParcelable(std::move(results), &parcelableResults); if (status.isOk()) { // Send parcelableResults through callback. } else { // Handle error. }