VHAL AIDL ditentukan di
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 minimum yang kompatibel |
---|---|---|---|
Android 16 | V4 | V4 | V1 |
Android 15 | V3 | V3 | V1 |
Android 14 | V2 | V2 | V1 |
Android 13 | V1 | (Antarmuka properti VHAL tidak terpisah) | 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 dikirim melalui
metode callback onGetValues . |
|
void setValues(IVehicleCallback callback, in SetValueRequests requests)
SetValueRequest secara asinkron. Hasilnya dikirim 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 get. Dipanggil
saat beberapa nilai yang akan diambil sudah siap. |
|
oneway void onSetValues(in SetValueResults responses)
setValues guna mengirimkan hasil nilai yang ditetapkan. Dipanggil saat
VHAL telah selesai menangani beberapa permintaan kumpulan properti. |
|
oneway void onPropertyEvent(in VehiclePropValues propValues, int sharedMemoryFileCount)
CONTINUOUS , peristiwa properti terjadi berdasarkan frekuensi sampel berlangganan
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 dikirim.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 diperbarui. |
Penerapan VHAL divalidasi oleh VTS VHAL di
VtsHalAutomotiveVehicle_TargetTest.cpp
.
Pengujian memverifikasi bahwa metode dasar diterapkan dengan benar dan konfigurasi properti
yang didukung sudah benar. Pengujian berjalan pada 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 setiap nilai properti, yang memiliki kolom berikut:
Kolom | Deskripsi |
---|---|
timestamp
| Stempel waktu yang menunjukkan waktu terjadinya peristiwa dan disinkronkan dengan
jam SystemClock.elapsedRealtimeNano() . |
prop |
ID properti untuk nilai ini. |
areaid |
ID area untuk nilai ini. Area harus merupakan 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 mungkin juga berlaku untuk
penulisan, tetapi tidak dijamin, misalnya, properti mungkin tersedia untuk dibaca, tetapi tidak tersedia untuk
penulisan. Dalam hal ini, 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,
yang berarti fungsi mungkin ditampilkan sebelum operasi get atau set yang sebenarnya selesai.
Hasil operasi (misalnya, nilai properti untuk getValues
dan status berhasil atau error untuk setValues
) dikirim melalui callback yang diteruskan sebagai argumen.
Implementasi tidak boleh memblokir hasil di thread binder yang menangani permintaan. Sebagai gantinya, sebaiknya simpan permintaan dalam antrean permintaan dan gunakan thread pengendali terpisah untuk menangani permintaan secara asinkron. Lihat Implementasi Referensi untuk mengetahui detailnya.
Gambar 1. Proses asinkron.
Parcelable besar
Semua struktur yang bernama XXXs
, seperti VehiclePropConfigs
,
SetValueRequests
, dan VehiclePropValues
disebut
LargeParcelable
(atau, StableLargeParcelable
). Masing-masing mewakili daftar
nilai yang digunakan untuk meneruskan data besar yang mungkin melebihi batasan binder (4 KB dalam
implementasi library LargeParcelable
) di seluruh batas binder. Masing-masing memiliki definisi struktur serupa yang berisi kolom berikut.
Panduan | Deskripsi |
---|---|
payloads |
Daftar nilai jika ukuran nilai sesuai dengan batasan memori binder, atau daftar kosong. |
sharedMemoryFd |
Deskripsi file nullable yang mengarah ke file memori bersama yang menyimpan payload serialisasi 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
non-null.
- Jika tidak kosong,
payloads
akan menyimpan daftar data sebenarnya, yaitu konfigurasi properti. - Jika
sharedMemoryFd
bukan null, file tersebut berisi file memori bersama, yang menyimpan struktur serialVehiclePropConfigs
. Struktur ini menggunakan fungsiwriteToParcel
untuk melakukan serialisasi Parcel.
Sebagai klien Java untuk VHAL, Layanan Mobil menangani serialisasi dan deserialisasi untuk
LargeParcelable
. Untuk implementasi 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 implementasi VHAL yang mengirim hasil untuk getValues
melalui binder
ditampilkan di bawah ini:
std::vectorresults = getResults(); GetValueResults parcelableResults; ScopedAStatus status = vectorToStableLargeParcelable(std::move(results), &parcelableResults); if (status.isOk()) { // Send parcelableResults through callback. } else { // Handle error. }