AIDL VHAL در android.hardware.automotive.vehicle namespace
تعریف شده است. رابط VHAL در IVehicle.aidl
تعریف شده است. مگر اینکه مشخص شده باشد، همه روش ها باید برای یک نسخه VHAL خاص اجرا شوند.
نسخه ها
نسخه اندروید | آخرین نسخه VHAL | آخرین نسخه دارایی VHAL | حداقل نسخه VHAL سازگار |
---|---|---|---|
اندروید 16 | V4 | V4 | V1 |
اندروید 15 | V3 | V3 | V1 |
اندروید 14 | V2 | V2 | V1 |
اندروید 13 | V1 | (رابط ویژگی VHAL تقسیم نمی شود) | V1 |
توصیه می شود آخرین نسخه VHAL را برای یک نسخه اندروید خاص پیاده سازی کنید.
توابع و تماس ها
توابع 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) | |
( جدید در اندروید 16 )SupportedValuesListResults getSupportedValuesLists(in List | |
( جدید در اندروید 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 توسط 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
) از طریق تماسهای برگشتی به عنوان آرگومان ارسال میشوند.
پیاده سازی نباید نتیجه را در رشته بایندر که درخواست را مدیریت می کند مسدود کند. در عوض، توصیه می کنیم درخواست را در یک صف درخواست ذخیره کنید و از یک رشته کنترل کننده جداگانه برای رسیدگی به درخواست ها به صورت ناهمزمان استفاده کنید. برای جزئیات به پیاده سازی مرجع مراجعه کنید.
شکل 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
برای سریال سازی یک بسته استفاده می کند.
به عنوان یک مشتری جاوا برای VHAL، Car Service سریالسازی و سریالسازی را برای LargeParcelable
انجام میدهد. برای پیاده سازی های VHAL و کلاینت های بومی، یک 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. }