AIDL VHAL در android.hardware.automotive.vehicle namespace
تعریف شده است. رابط 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) |
تماسهای برگشتی در 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 توسط 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
برای سریال سازی یک بسته استفاده می کند.
به عنوان یک مشتری جاوا برای 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. }