antarmuka VHAL

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

metode
VehiclePropConfigs getAllPropConfigs()
Mengembalikan daftar semua Konfigurasi Properti yang didukung oleh HAL kendaraan ini.
VehiclePropConfigs getPropConfigs(in int[] props)
Mengembalikan daftar Konfigurasi Properti untuk ID properti tertentu.
void getValues(IVehicleCallback callback, in GetValueRequests requests)
Dapatkan nilai properti kendaraan secara asinkron. Menangani kumpulan GetValueRequest secara asinkron. Hasilnya dikirimkan melalui metode callback onGetValues .
void setValues(IVehicleCallback callback, in SetValueRequests requests)
Tetapkan nilai properti kendaraan secara asinkron. Menangani kumpulan SetValueRequest secara asinkron. Hasilnya dikirimkan melalui metode callback onSetValues .
void subscribe(in IVehicleCallback callback, in SubscribeOptions[] options, int maxSharedMemoryFileCount)
Berlangganan acara properti dengan opsi tertentu. Opsi berlangganan mencakup ID properti, ID area properti, dan laju sampel dalam Hz (untuk properti berkelanjutan). maxSharedMemoryFileCount tidak digunakan.
void unsubscribe(in IVehicleCallback callback, in int[] propIds)
Berhenti berlangganan peristiwa properti langganan sebelumnya untuk properti tertentu.
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
Tidak digunakan dan dapat diimplementasikan sebagai no-op.

Callback didefinisikan di IVehicleCallback.aidl dan berisi metode ini.

metode
oneway void onGetValues(in GetValueResults responses)
Panggilan balik untuk fungsi getValues ​​guna memberikan hasil mendapatkan nilai. Dipanggil ketika beberapa nilai yang akan diambil sudah siap.
oneway void onSetValues(in SetValueResults responses)
Panggilan balik untuk fungsi setValues ​​untuk memberikan hasil nilai yang ditetapkan. Dipanggil ketika VHAL telah selesai menangani beberapa permintaan set properti.
oneway void onPropertyEvent(in VehiclePropValues propValues, int sharedMemoryFileCount)
Panggilan balik untuk melaporkan peristiwa pembaruan properti.
Properti CONTINUOUS , peristiwa properti terjadi berdasarkan laju sampel berlangganan 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 ketika nilai properti atau status properti berubah.
SharedMemoryFileCount selalu 0 .
oneway void onPropertySetError(in VehiclePropErrors errors)
Panggilan balik untuk melaporkan kesalahan kumpulan properti asinkron yang tidak memiliki permintaan kumpulan yang sesuai. Jika kita mengetahui permintaan set mana yang menyebabkan kesalahan, onSetValues ​​dengan hasil kesalahan harus digunakan sebagai ganti ini.

Untuk informasi selengkapnya, lihat IVehicle.aidl dan IVehicleCallback.aidl .

Implementasi VHAL divalidasi oleh VHAL VTS di VtsHalAutomotiveVehicle_TargetTest.cpp . Pengujian memverifikasi bahwa metode dasar diterapkan dengan benar dan konfigurasi properti yang didukung sudah benar.

Nilai properti kendaraan

Gunakan struktur VehiclePropValue untuk mendeskripsikan setiap nilai properti, yang memiliki kolom berikut:

Bidang Keterangan
timestamp Stempel waktu yang mewakili waktu terjadinya peristiwa dan disinkronkan dengan jam SystemClock.elapsedRealtimeNano() .
prop ID properti untuk nilai ini.
areaid ID area untuk nilai ini. Area tersebut 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 tipe properti, satu atau beberapa kolom dalam kolom ini digunakan untuk menyimpan nilai sebenarnya. Misalnya, elemen pertama di value.int32Values ​​digunakan untuk properti tipe Int32. Untuk detailnya, lihat Konfigurasi Properti .

GetValues ​​dan setValues ​​asinkron

Operasi getValues ​​dan setValues ​​dilakukan secara asinkron, artinya fungsi tersebut mungkin kembali sebelum operasi get atau set sebenarnya selesai. Hasil operasi (misalnya, nilai properti untuk getValues ​​dan status sukses atau kesalahan untuk setValues ​​) dikirimkan melalui callback yang diteruskan sebagai argumen.

Implementasi tidak boleh memblokir hasil di thread pengikat yang menangani permintaan. Sebagai gantinya, kami menyarankan Anda menyimpan permintaan dalam antrean permintaan dan menggunakan thread pengendali terpisah untuk menangani permintaan secara asinkron. Lihat Implementasi Referensi untuk detailnya.

Gambar 1. Proses asinkron.

Paket besar

Semua struktur 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 pengikat (4KB dalam implementasi perpustakaan LargeParcelable ) melintasi batas pengikat. Masing-masing memiliki definisi struktur serupa yang berisi bidang berikut.

Panduan Keterangan
payloads Daftar nilai ketika ukuran nilai sesuai dengan batasan memori pengikat, atau daftar kosong.
sharedMemoryFd Deskriptor file nullable menunjuk ke file memori bersama yang menyimpan muatan serial jika daftar nilainya terlalu besar.

Misalnya, VehiclePropConfigs didefinisikan 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 bukan null.

  • Jika payloads tidak kosong, ia akan menyimpan daftar data aktual, yang merupakan konfigurasi properti.
  • Jika sharedMemoryFd bukan null, ia berisi file memori bersama, yang menyimpan struktur serial VehiclePropConfigs . Strukturnya menggunakan fungsi writeToParcel untuk membuat serialisasi Parcel.

Sebagai klien Java untuk VHAL, Car Service menangani serialisasi dan deserialisasi untuk LargeParcelable . Untuk implementasi VHAL dan klien asli, LargeParcelable harus diserialkan dan dideserialisasi dengan pustaka LargeParcelable atau kelas wrapper yang berguna untuk pustaka di ParcelableUtils.h .

Misalnya, permintaan penguraian klien asli untuk getValues ​​yang diterima dari pengikat 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 getValues ​​melalui binder ditunjukkan 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.
}