Antarmuka VHAL

VHAL AIDL didefinisikan dalam android.hardware.automotive.vehicle namespace. Antarmuka VHAL didefinisikan di IVehicle.aidl. Kecuali ditentukan lain, semua metode harus diimplementasikan.

Metode
VehiclePropConfigs getAllPropConfigs()
Menampilkan daftar semua Konfigurasi Properti didukung oleh HAL kendaraan ini.
VehiclePropConfigs getPropConfigs(in int[] props)
Menampilkan daftar Konfigurasi Properti untuk atribut tertentu ID properti.
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)
Tetapkan nilai properti kendaraan secara asinkron. Menangani sekumpulan SetValueRequest secara asinkron. Hasilnya dikirimkan melalui Metode callback onSetValues.
void subscribe(in IVehicleCallback callback, in SubscribeOptions[] options, int maxSharedMemoryFileCount)
Berlangganan peristiwa properti dengan opsi yang ditentukan. Opsi berlangganan meliputi ID properti, ID area properti, dan frekuensi sampel dalam Hz (untuk properti berkelanjutan). maxSharedMemoryFileCount tidak digunakan.
void unsubscribe(in IVehicleCallback callback, in int[] propIds)
Berhenti berlangganan peristiwa properti yang berlangganan sebelumnya untuk properti yang ditentukan.
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
Tidak digunakan dan dapat diterapkan karena tidak ada pengoperasian.

Callback didefinisikan di IVehicleCallback.aidl yang berisi metode ini.

Metode
oneway void onGetValues(in GetValueResults responses)
Callback untuk fungsi getValues guna mengirim mendapatkan hasil nilai. Menghubungi ketika beberapa nilai yang akan diambil sudah siap.
oneway void onSetValues(in SetValueResults responses)
Callback untuk fungsi setValues guna memberikan hasil nilai yang telah ditetapkan. Dipanggil saat VHAL telah selesai menangani beberapa permintaan set properti.
oneway void onPropertyEvent(in VehiclePropValues propValues, int sharedMemoryFileCount)
Callback untuk melaporkan peristiwa pembaruan properti.
properti
CONTINUOUS, peristiwa properti terjadi berdasarkan frekuensi sampel berlangganan dalam Hz atau frekuensi pesan bus kendaraan. Kejadian properti juga dapat terjadi jika perubahan status. Misalnya, dari tidak tersedia menjadi tersedia.
Untuk properti ON_CHANGE, peristiwa properti terjadi saat nilai properti atau perubahan status properti.
SharedMemoryFileCount selalu 0.
oneway void onPropertySetError(in VehiclePropErrors errors)
Callback untuk melaporkan error kumpulan properti asinkron yang tidak memiliki kumpulan yang sesuai permintaan. Jika kita mengetahui kumpulan permintaan mana yang menimbulkan error, onSetValues dengan hasil error harus digunakan.

Untuk informasi selengkapnya, lihat IKendaraan.aidl dan IKendaraanCallback.aidl.

Implementasi VHAL divalidasi oleh VHAL VTS pada VtsHalAutomotiveKendaraan_TargetTest.cpp. Pengujian ini memastikan bahwa metode dasar diterapkan dengan benar dan properti yang didukung sudah benar.

Nilai properti kendaraan

Gunakan VehiclePropValue untuk mendeskripsikan nilai setiap 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 di area tersebut Konfigurasi ID, atau 0 untuk properti global.
value Struktur data yang berisi nilai properti sebenarnya. Berdasarkan jenis properti, satu atau lebih banyak {i>field<i} dalam {i>field<i} ini digunakan untuk menyimpan nilai sebenarnya. Misalnya, yang pertama di value.int32Values digunakan untuk properti jenis Int32. Untuk mengetahui detailnya, lihat Properti Konfigurasi.

getValues dan setValues asinkron

Operasi getValues dan setValues dijalankan secara asinkron, artinya fungsi itu mungkin akan dikembalikan sebelum operasi {i>get<i} atau {i>set<i} yang sebenarnya selesai. Hasil operasi (misalnya, nilai properti untuk getValues dan keberhasilan atau status error untuk setValues) dikirim melalui callback yang diteruskan sebagai argumen.

Implementasi tidak boleh memblokir hasil di thread binder yang menangani permintaan. Sebagai gantinya, kami sarankan Anda menyimpan permintaan dalam antrean permintaan dan menggunakan thread pengendali yang berbeda untuk menangani permintaan secara asinkron. Lihat Penerapan Referensi untuk spesifikasi pendukung.

Gambar 1. Proses asinkron.

parcelable besar

Semua struktur bernama XXXs, seperti VehiclePropConfigs, SetValueRequests, dan VehiclePropValues dipanggil LargeParcelable (atau StableLargeParcelable). Masing-masing mewakili daftar nilai yang digunakan untuk meneruskan data besar yang mungkin melebihi batasan binder (4KB dalam Implementasi library LargeParcelable) di seluruh batas binder. Masing-masing memiliki definisi struktur yang berisi kolom-kolom berikut.

Panduan Deskripsi
payloads Daftar nilai saat ukuran nilai sesuai dengan batasan memori binder, atau daftar kosong.
sharedMemoryFd Deskriptor file nullable menunjuk ke file memori bersama yang menyimpan rangkaian {i>payload<i} 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 non-null sharedMemoryFd.

  • Jika payloads tidak kosong, kode ini akan menyimpan daftar data sebenarnya, yang merupakan konfigurasi properti default.
  • Jika sharedMemoryFd bukan null, file tersebut akan berisi file memori bersama, yang menyimpan struktur serial dari VehiclePropConfigs. Struktur ini menggunakan Fungsi writeToParcel untuk menserialisasi Parcel.

Sebagai klien Java untuk VHAL, Car Service menangani serialisasi dan deserialisasi untuk LargeParcelable. Untuk implementasi VHAL dan klien native, LargeParcelable harus diserialisasi dan dideserialisasi dengan LargeParcelable library atau class wrapper yang berguna untuk library ParcelableUtils.h

Misalnya, permintaan penguraian klien native untuk getValues yang diterima dari binder adalah sebagai berikut:

// '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.
}

Contoh implementasi VHAL yang mengirimkan hasil untuk getValues melalui binder adalah yang ditampilkan di bawah ini:

std::vector results = getResults();
GetValueResults parcelableResults;
ScopedAStatus status = vectorToStableLargeParcelable(std::move(results), &parcelableResults);
if (status.isOk()) {
    // Send parcelableResults through callback.
} else {
    // Handle error.
}