رابط VHAL

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)
استفاده نمی شود و می توان آن را به عنوان بدون عملیات پیاده سازی کرد.

تماس‌های برگشتی در 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, 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.
}