AIDL VHAL jest zdefiniowany w
android.hardware.automotive.vehicle namespace.
Interfejs VHAL jest zdefiniowany w
IVehicle.aidl.
O ile nie określono inaczej, wszystkie metody muszą być zaimplementowane w określonej wersji VHAL.
Wersje
| Wersja Androida | Najnowsza wersja VHAL | Najnowsza wersja właściwości VHAL | Minimalna zgodna wersja VHAL |
|---|---|---|---|
| Android 16 | V4 | V4 | V1 |
| Android 15 | V3 | V3 | V1 |
| Android 14 | V2 | V2 | V1 |
| Android 13 | V1 | (Interfejs właściwości VHAL nie jest podzielony) | V1 |
Zalecamy zaimplementowanie najnowszej wersji VHAL dla określonej wersji Androida.
Funkcje i wywołania zwrotne
Funkcje VHAL są zdefiniowane w
IVehicle.aidl.
| Metoda | |
|---|---|
VehiclePropConfigs getAllPropConfigs()
|
|
VehiclePropConfigs getPropConfigs(in int[] props)
|
|
void getValues(IVehicleCallback callback, in GetValueRequests requests)
GetValueRequest. Wynik jest dostarczany za pomocą
onGetValues metody wywołania zwrotnego. |
|
void setValues(IVehicleCallback callback, in SetValueRequests requests)
SetValueRequest. Wynik jest dostarczany za pomocą
onSetValues metody wywołania zwrotnego. |
|
void subscribe(in IVehicleCallback callback, in SubscribeOptions[] options, int maxSharedMemoryFileCount)
maxSharedMemoryFileCount nie jest używane. |
|
void unsubscribe(in IVehicleCallback callback, in int[] propIds)
|
|
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
|
|
(Nowość w Androidzie 16)SupportedValuesListResults getSupportedValuesLists(in List
|
|
(Nowość w Androidzie 16)MinMaxSupportedValueResults getMinMaxSupportedValue(in List
|
|
void registerSupportedValueChangeCallback(in IVehicleCallback callback, in List
|
|
void unregisterSupportedValueChangeCallback(in IVehicleCallback callback, in List
|
|
Wywołania zwrotne są zdefiniowane w
IVehicleCallback.aidl
i zawierają te metody.
| Metoda | |
|---|---|
oneway void onGetValues(in GetValueResults responses)
getValues służące do dostarczania wyników pobierania wartości. Wywoływane
gdy niektóre z wartości do pobrania są gotowe. |
|
oneway void onSetValues(in SetValueResults responses)
setValues służące do dostarczania wyników ustawiania wartości. Wywoływane, gdy
VHAL zakończy obsługę niektórych żądań ustawienia właściwości. |
|
oneway void onPropertyEvent(in VehiclePropValues propValues, int sharedMemoryFileCount)
CONTINUOUS zdarzenie właściwości występuje na podstawie częstotliwości próbkowania subskrypcji
w Hz lub częstotliwości wiadomości magistrali pojazdu. Zdarzenie właściwości może też wystąpić, jeśli zmieni się stan właściwości. Na przykład z niedostępnego na dostępny.ON_CHANGE zdarzenie właściwości występuje, gdy zmieni się wartość
lub stan właściwości.VehiclePropValue ze stanem niedostępności lub błędu
i pustą wartością.SharedMemoryFileCount jest zawsze równe 0. |
|
oneway void onPropertySetError(in VehiclePropErrors errors)
onSetValues z wynikiem błędu musi być użyte zamiast tego. |
|
oneway void onSupportedValueChange(in List
getMinMaxSupportedValue lub
getSupportedValuesLists, aby uzyskać zaktualizowane wartości. |
|
Implementacja VHAL jest weryfikowana przez VHAL VTS w
VtsHalAutomotiveVehicle_TargetTest.cpp.
Test sprawdza, czy podstawowe metody są prawidłowo zaimplementowane, a obsługiwane konfiguracje właściwości
są prawidłowe. Test jest przeprowadzany na wszystkich instancjach VHAL na urządzeniu, ale AAOS używa tylko
instancji domyślnej (android.hardware.automotive.vehicle.IVehicle/default)
Wartość właściwości pojazdu
Używaj struktury
VehiclePropValue
do opisywania wartości każdej właściwości, która ma te pola:
| Pole | Opis |
|---|---|
timestamp
| Sygnatura czasowa reprezentująca czas wystąpienia zdarzenia i zsynchronizowana z
SystemClock.elapsedRealtimeNano() zegarem. |
prop |
Identyfikator właściwości dla tej wartości. |
areaid |
Identyfikator obszaru dla tej wartości. Obszar musi być jednym z obsługiwanych obszarów wymienionych w konfiguracji identyfikatora obszaru
lub 0 w przypadku właściwości globalnych. |
value |
Struktura danych zawierająca rzeczywistą wartość właściwości. W zależności od typu właściwości do przechowywania rzeczywistej wartości używane jest co najmniej 1
pole w tym polu. Na przykład w przypadku właściwości typu Int32 używany jest pierwszy
element w value.int32Values. Więcej informacji znajdziesz w sekcji
Konfiguracje
właściwości. |
status |
Stan właściwości do odczytu. W przypadku właściwości do odczytu i zapisu może to dotyczyć też
zapisu, ale nie jest to gwarantowane. Na przykład właściwość może być dostępna do odczytu, ale nie do
zapisu. W takim przypadku stan to AVAILABLE, a pole wartości zawiera prawidłowe informacje.
Możliwe stany znajdziesz w
VehiclePropertyStatus. |
Asynchroniczne getValues i setValues
Operacje getValues i setValues są wykonywane asynchronicznie,
co oznacza, że funkcja może zwrócić wartość, zanim operacja pobierania lub ustawiania zostanie zakończona.
Wyniki operacji (np. wartość właściwości w przypadku getValues oraz stan powodzenia lub
błędu w przypadku setValues) są dostarczane za pomocą wywołań zwrotnych przekazywanych jako argumenty.
Implementacja nie może blokować wyniku w wątku powiązań, który obsługuje żądanie. Zamiast tego zalecamy przechowywanie żądania w kolejce żądań i używanie osobnego wątku obsługi do asynchronicznego obsługiwania żądań. Więcej informacji znajdziesz w implementacji referencyjnej.
Rysunek 1. Proces asynchroniczny.
Duże obiekty Parcelable
Wszystkie struktury o nazwie XXXs, takie jak VehiclePropConfigs,
SetValueRequests, i VehiclePropValues są nazywane
LargeParcelable (lub StableLargeParcelable). Każda z nich reprezentuje listę
wartości używanych do przekazywania dużych ilości danych, które mogą przekraczać ograniczenia powiązań (4 KB w
implementacji biblioteki LargeParcelable) przez granice powiązań. Każda z nich ma podobną
definicję struktury, która zawiera te pola.
| Wskazówki | Opis |
|---|---|
payloads |
Lista wartości, gdy rozmiar wartości mieści się w limicie pamięci powiązań, lub pusta lista. |
sharedMemoryFd |
Deskryptor pliku z możliwością wartości null wskazujący plik pamięci współdzielonej, który przechowuje serializowane ładunki, jeśli lista wartości jest zbyt długa. |
Na przykład VehiclePropConfigs jest zdefiniowany jako:
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 zawiera niepuste ładunki lub niepusty element
sharedMemoryFd.
- Jeśli
payloadsnie jest puste, przechowuje listę rzeczywistych danych, czyli konfigurację właściwości. - Jeśli
sharedMemoryFdnie jest puste, zawiera plik pamięci współdzielonej, który przechowuje serializowaną strukturęVehiclePropConfigs. Struktura używa funkcjiwriteToParceldo serializacji obiektu Parcel.
Jako klient Java VHAL usługa Car Service obsługuje serializację i deserializację dla
LargeParcelable. W przypadku implementacji VHAL i klientów natywnych
LargeParcelable należy serializować i deserializować za pomocą
LargeParcelable
biblioteki lub przydatnej klasy opakowującej bibliotekę w
ParcelableUtils.h.
Na przykład klient natywny analizujący żądania getValues otrzymane z powiązania
wygląda tak:
// '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. }
Poniżej znajdziesz przykładową implementację VHAL, która wysyła wyniki dla getValues za pomocą powiązania:
pokazano poniżej:
std::vectorresults = getResults(); GetValueResults parcelableResults; ScopedAStatus status = vectorToStableLargeParcelable(std::move(results), &parcelableResults); if (status.isOk()) { // Send parcelableResults through callback. } else { // Handle error. }