Antarmuka VHAL

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()
Menampilkan daftar semua Konfigurasi Properti yang didukung oleh HAL kendaraan ini.
VehiclePropConfigs getPropConfigs(in int[] props)
Menampilkan daftar Konfigurasi Properti untuk ID properti tertentu.
void getValues(IVehicleCallback callback, in GetValueRequests requests)
Mendapatkan nilai properti kendaraan secara asinkron. Menangani batch GetValueRequest secara asinkron. Hasilnya dikirimkan melalui metode callback onGetValues.
void setValues(IVehicleCallback callback, in SetValueRequests requests)
Menetapkan nilai properti kendaraan secara asinkron. Menangani batch SetValueRequest secara asinkron. Hasilnya dikirimkan melalui metode callback onSetValues.
void subscribe(in IVehicleCallback callback, in SubscribeOptions[] options, int maxSharedMemoryFileCount)
Berlangganan ke peristiwa properti dengan opsi yang ditentukan. Opsi langganan mencakup ID properti, ID area properti, dan frekuensi sampling dalam Hz (untuk properti berkelanjutan). maxSharedMemoryFileCount tidak digunakan.
void unsubscribe(in IVehicleCallback callback, in int[] propIds)
Membatalkan langganan peristiwa properti yang sebelumnya dilanggan untuk properti tertentu.
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
Tidak digunakan dan dapat diimplementasikan sebagai no-op.
(Baru di Android 16)
SupportedValuesListResults getSupportedValuesLists(in List propIdAreaIds)
Mendapatkan daftar nilai yang didukung untuk pasangan ID properti dan ID area yang ditentukan.
Diperkenalkan di VHAL V4.
(Baru di Android 16)
MinMaxSupportedValueResults getMinMaxSupportedValue(in List propIdAreaIds)
Mendapatkan nilai minimum dan maksimum yang didukung untuk pasangan ID properti dan ID area yang ditentukan.
Diperkenalkan di VHAL V4.
void registerSupportedValueChangeCallback(in IVehicleCallback callback, in List propIdAreaIds)
Mendaftarkan callback untuk dipanggil saat nilai yang didukung berubah.
Diperkenalkan di VHAL V4.
void unregisterSupportedValueChangeCallback(in IVehicleCallback callback, in List propIdAreaIds)
Membatalkan pendaftaran callback perubahan nilai yang didukung.
Diperkenalkan di VHAL V4.

Callback ditentukan di IVehicleCallback.aidl dan berisi metode ini.

Metode
oneway void onGetValues(in GetValueResults responses)
Callback untuk fungsi getValues guna memberikan hasil nilai yang diperoleh. Dipanggil saat beberapa nilai yang akan diambil sudah siap.
oneway void onSetValues(in SetValueResults responses)
Callback untuk fungsi 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)
Callback untuk melaporkan peristiwa pembaruan properti.
Properti
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.
Untuk properti ON_CHANGE, peristiwa properti terjadi saat nilai properti atau status properti berubah.
Ini juga harus digunakan untuk mengirimkan peristiwa perubahan status properti, misalnya, saat properti menjadi tidak tersedia atau error untuk dibaca, VehiclePropValue dengan status tidak tersedia atau error dan nilai kosong harus dikirimkan.
SharedMemoryFileCount selalu 0.
oneway void onPropertySetError(in VehiclePropErrors errors)
Callback untuk melaporkan error set properti asinkron yang tidak memiliki permintaan set yang sesuai. Jika kita mengetahui permintaan set mana yang menyebabkan error, onSetValues dengan hasil error harus digunakan, bukan ini.
oneway void onSupportedValueChange(in List propIdAreaIds)
Callback untuk melaporkan perubahan nilai minimum dan maksimum yang didukung atau daftar nilai yang didukung. Pemanggil seharusnya memanggil 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 struktur VehiclePropConfigs yang diserialkan. Struktur ini menggunakan fungsi writeToParcel 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::vector results = getResults();
GetValueResults parcelableResults;
ScopedAStatus status = vectorToStableLargeParcelable(std::move(results), &parcelableResults);
if (status.isOk()) {
    // Send parcelableResults through callback.
} else {
    // Handle error.
}