VHAL AIDL ditentukan dalam
android.hardware.automotive.vehicle namespace
.
Antarmuka VHAL ditentukan di
IVehicle.aidl
.
Kecuali jika ditentukan, semua metode harus diterapkan untuk versi VHAL tertentu.
Versi
Versi Android | Versi VHAL terbaru | Versi properti VHAL terbaru | Versi VHAL kompatibel minimum |
---|---|---|---|
Android 16 | V4 | V4 | V1 |
Android 15 | V3 | V3 | V1 |
Android 14 | V2 | V2 | V1 |
Android 13 | V1 | (Antarmuka properti VHAL tidak dibagi) | V1 |
SEBAIKNYA terapkan versi VHAL terbaru untuk versi Android tertentu.
Fungsi dan callback
Fungsi VHAL ditentukan di
IVehicle.aidl
.
Metode | |
---|---|
VehiclePropConfigs getAllPropConfigs()
|
|
VehiclePropConfigs getPropConfigs(in int[] props)
|
|
void getValues(IVehicleCallback callback, in GetValueRequests requests)
GetValueRequest secara asinkron. Hasilnya dikirimkan melalui metode callback
onGetValues . |
|
void setValues(IVehicleCallback callback, in SetValueRequests requests)
SetValueRequest secara asinkron. Hasilnya dikirimkan melalui metode callback
onSetValues . |
|
void subscribe(in IVehicleCallback callback, in SubscribeOptions[] options, int maxSharedMemoryFileCount)
maxSharedMemoryFileCount tidak digunakan. |
|
void unsubscribe(in IVehicleCallback callback, in int[] propIds)
|
|
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
|
|
(Baru di Android 16)SupportedValuesListResults getSupportedValuesLists(in List
|
|
(Baru di Android 16)MinMaxSupportedValueResults getMinMaxSupportedValue(in List
|
|
void registerSupportedValueChangeCallback(in IVehicleCallback callback, in List
|
|
void unregisterSupportedValueChangeCallback(in IVehicleCallback callback, in List
|
Callback ditentukan di
IVehicleCallback.aidl
dan berisi metode ini.
Metode | |
---|---|
oneway void onGetValues(in GetValueResults responses)
getValues guna memberikan hasil nilai yang diperoleh. Dipanggil
saat beberapa nilai yang akan diambil sudah siap. |
|
oneway void onSetValues(in SetValueResults responses)
setValues guna memberikan hasil nilai yang ditetapkan. Dipanggil saat
VHAL telah selesai menangani beberapa permintaan setelan properti. |
|
oneway void onPropertyEvent(in VehiclePropValues propValues, int sharedMemoryFileCount)
CONTINUOUS , peristiwa properti terjadi berdasarkan frekuensi pengambilan sampel langganan
dalam Hz atau frekuensi pesan bus kendaraan. Peristiwa properti juga dapat terjadi jika status properti berubah. Misalnya, dari tidak tersedia menjadi tersedia.ON_CHANGE , peristiwa properti terjadi saat nilai properti
atau status properti berubah.VehiclePropValue dengan status tidak tersedia atau error
dan nilai kosong harus dikirimkan.SharedMemoryFileCount selalu 0 . |
|
oneway void onPropertySetError(in VehiclePropErrors errors)
onSetValues dengan
hasil error harus digunakan, bukan ini. |
|
oneway void onSupportedValueChange(in List
getMinMaxSupportedValue atau
getSupportedValuesLists untuk mendapatkan nilai yang diupdate. |
Penerapan VHAL divalidasi oleh VTS VHAL di
VtsHalAutomotiveVehicle_TargetTest.cpp
.
Pengujian ini memverifikasi bahwa metode dasar diterapkan dengan benar dan konfigurasi properti yang didukung sudah benar. Pengujian dijalankan terhadap semua instance VHAL di perangkat, tetapi AAOS hanya menggunakan instance default (android.hardware.automotive.vehicle.IVehicle/default
)
Nilai properti kendaraan
Gunakan struktur
VehiclePropValue
untuk mendeskripsikan nilai setiap properti, yang memiliki kolom berikut:
Kolom | Deskripsi |
---|---|
timestamp
| Stempel waktu yang menunjukkan waktu terjadinya peristiwa dan disinkronkan dengan
clock SystemClock.elapsedRealtimeNano() . |
prop |
ID properti untuk nilai ini. |
areaid |
ID area untuk nilai ini. Area harus berupa salah satu area yang didukung yang tercantum dalam konfigurasi
ID area, atau 0 untuk properti global. |
value |
Struktur data yang berisi nilai properti sebenarnya. Berdasarkan jenis properti, satu atau
beberapa kolom dalam kolom ini digunakan untuk menyimpan nilai sebenarnya. Misalnya, elemen
pertama di value.int32Values digunakan untuk properti jenis Int32. Untuk mengetahui detailnya, lihat
Konfigurasi
Properti. |
status |
Status properti untuk dibaca. Untuk properti baca/tulis, hal ini juga dapat berlaku untuk
penulisan, tetapi tidak dijamin. Misalnya, properti mungkin tersedia untuk dibaca, tetapi tidak tersedia untuk
ditulis. Dalam kasus tersebut, statusnya adalah AVAILABLE dan kolom nilai berisi informasi yang valid.
Untuk mengetahui kemungkinan status, lihat
VehiclePropertyStatus . |
getValues dan setValues asinkron
Operasi getValues
dan setValues
dilakukan secara asinkron,
artinya fungsi dapat ditampilkan sebelum operasi get atau set yang sebenarnya selesai.
Hasil operasi (misalnya, nilai properti untuk getValues
dan status berhasil atau
status error untuk setValues
) dikirimkan melalui callback yang diteruskan sebagai argumen.
Penerapan tidak boleh memblokir hasil di thread binder yang menangani permintaan. Sebagai gantinya, sebaiknya simpan permintaan dalam antrean permintaan dan gunakan thread handler terpisah untuk menangani permintaan secara asinkron. Lihat Implementasi Referensi untuk detailnya.
Gambar 1. Proses asinkron.
Parcelable besar
Semua struktur yang bernama XXXs
, seperti VehiclePropConfigs
,
SetValueRequests
, dan VehiclePropValues
disebut
LargeParcelable
(atau, StableLargeParcelable
). Setiap struktur merepresentasikan daftar
nilai yang digunakan untuk meneruskan data besar yang mungkin melampaui batasan binder (4 KB dalam
implementasi library LargeParcelable
) di seluruh batas binder. Setiap struktur definisi memiliki struktur yang serupa yang berisi kolom berikut.
Panduan | Deskripsi |
---|---|
payloads |
Daftar nilai jika ukuran nilai sesuai dengan batasan memori binder, atau daftar kosong. |
sharedMemoryFd |
Deskriptor file nullable yang mengarah ke file memori bersama yang menyimpan payload yang diserialisasi jika daftar nilai terlalu besar. |
Misalnya, VehiclePropConfigs
ditentukan sebagai:
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
berisi payload yang tidak kosong atau
sharedMemoryFd
yang tidak null.
- Jika
payloads
tidak kosong,payloads
akan menyimpan daftar data aktual, yaitu konfigurasi properti. - Jika
sharedMemoryFd
tidak null, maka akan berisi file memori bersama, yang menyimpan strukturVehiclePropConfigs
yang diserialkan. Struktur ini menggunakan fungsiwriteToParcel
untuk melakukan serialisasi Parcel.
Sebagai klien Java untuk VHAL, Car Service menangani serialisasi dan deserialisasi untuk
LargeParcelable
. Untuk penerapan VHAL dan klien native, LargeParcelable
harus diserialisasi dan dideserialisasi dengan
library LargeParcelable
atau class wrapper yang berguna untuk library di
ParcelableUtils.h
.
Misalnya, permintaan penguraian klien native untuk getValues
yang diterima dari binder
adalah sebagai berikut:
// '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. }
Contoh penerapan VHAL yang mengirimkan hasil untuk getValues
melalui binder
ditampilkan di bawah:
std::vectorresults = getResults(); GetValueResults parcelableResults; ScopedAStatus status = vectorToStableLargeParcelable(std::move(results), &parcelableResults); if (status.isOk()) { // Send parcelableResults through callback. } else { // Handle error. }