VHAL w ramach AIDL jest zdefiniowany w dokumentacji android.hardware.automotive.vehicle namespace
.
Interfejs VHAL jest zdefiniowany w dokumentacji IVehicle.aidl
.
O ile nie określono inaczej, wszystkie metody muszą być zaimplementowane w przypadku konkretnej 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 wdrożenie najnowszej wersji VHAL dla konkretnej wersji Androida.
Funkcje i wywołania zwrotne
Funkcje VHAL są zdefiniowane w pliku IVehicle.aidl
.
Metoda | |
---|---|
VehiclePropConfigs getAllPropConfigs()
|
|
VehiclePropConfigs getPropConfigs(in int[] props)
|
|
void getValues(IVehicleCallback callback, in GetValueRequests requests)
GetValueRequest asynchronicznie. Wynik jest przekazywany za pomocą metody wywołania zwrotnego onGetValues . |
|
void setValues(IVehicleCallback callback, in SetValueRequests requests)
SetValueRequest w sposób asynchroniczny. Wynik jest przekazywany za pomocą metody wywołania zwrotnego onSetValues . |
|
void subscribe(in IVehicleCallback callback, in SubscribeOptions[] options, int maxSharedMemoryFileCount)
maxSharedMemoryFileCount nie jest używana. |
|
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
|
Funkcje zwrotne są zdefiniowane w IVehicleCallback.aidl
i zawierają te metody.
Metoda | |
---|---|
oneway void onGetValues(in GetValueResults responses)
getValues , aby zwrócić wyniki funkcji get value. Wywoływany, gdy niektóre wartości do pobrania są gotowe. |
|
oneway void onSetValues(in SetValueResults responses)
setValues , która zwraca wyniki ustawionej wartości. Wywoływany, gdy VHAL zakończy przetwarzanie niektórych żądań dotyczących zestawu usług. |
|
oneway void onPropertyEvent(in VehiclePropValues propValues, int sharedMemoryFileCount)
CONTINUOUS usługa, zdarzenie usługi występuje na podstawie częstotliwości próbkowania subskrypcji w Hz lub częstotliwości wiadomości z busa pojazdu. Zdarzenie usługi może też wystąpić, jeśli zmieni się stan usługi. na przykład z niedostępnej na dostępną.ON_CHANGE zdarzenie związane z właściwością występuje, gdy zmienia się wartość lub stan tej właściwości.VehiclePropValue ze stanem niedostępny lub błąd i pustą wartością.SharedMemoryFileCount to zawsze 0 . |
|
oneway void onPropertySetError(in VehiclePropErrors errors)
onSetValues z odpowiednim wynikiem błędu. |
|
oneway void onSupportedValueChange(in List
getMinMaxSupportedValue lub getSupportedValuesLists , aby uzyskać zaktualizowane wartości. |
Implementacja VHAL jest weryfikowana przez VHAL VTS pod adresem VtsHalAutomotiveVehicle_TargetTest.cpp
.
Test sprawdza, czy podstawowe metody są prawidłowo zaimplementowane i czy konfiguracje obsługiwanych usług 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żyj struktury VehiclePropValue
, aby opisać wartość każdej właściwości, która zawiera te pola:
Pole | Opis |
---|---|
timestamp
| Sygnatura czasowa reprezentująca czas wystąpienia zdarzenia i zsynchronizowana z zegarem SystemClock.elapsedRealtimeNano() . |
prop |
Identyfikator usługi 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 usług globalnych. |
value |
Struktura danych zawierająca rzeczywistą wartość właściwości. W zależności od typu właściwości jedno lub więcej pól w tym polu służy do przechowywania rzeczywistej wartości. Na przykład pierwszy element w value.int32Values jest używany do właściwości typu Int32. Więcej informacji znajdziesz w artykule Konfiguracje właściwości. |
status |
Stan usługi do odczytu. W przypadku usługi z dostępem do odczytu i zapisu może to dotyczyć również zapisu, ale nie jest to gwarantowane. Na przykład usługa 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.
Dostępne stany: VehiclePropertyStatus . |
Asynchroniczne wywołania getValues i setValues
Operacje getValues
i setValues
są wykonywane asynchronicznie, co oznacza, że funkcja może zwrócić wynik przed zakończeniem operacji get lub set.
Wyniki operacji (np. wartość właściwości w przypadku getValues
oraz stan błędu lub sukces w przypadku setValues
) są przekazywane za pomocą funkcji zwracanych jako argumenty.
Implementacja nie może blokować wyniku w wątku bindera, który obsługuje żądanie. Zamiast tego zalecamy przechowywanie żądania w kole żądań i używanie oddzielnego wątku obsługi do obsługi żądań asynchronicznie. Więcej informacji znajdziesz w implementacji referencyjnej.
Rysunek 1. Proces asynchroniczny.
Duże obiekty do przesyłania
Wszystkie struktury o nazwie XXXs
, takie jak VehiclePropConfigs
, SetValueRequests
i VehiclePropValues
, nazywane są LargeParcelable
(lub StableLargeParcelable
). Każda z nich reprezentuje listę wartości służącą do przekazywania dużych danych, które mogą przekraczać ograniczenia bindera (4 KB w implementacji biblioteki LargeParcelable
) na granicach bindera. Każdy 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 ograniczeniu pamięci bindera, lub pusta lista. |
sharedMemoryFd |
Descriptor pliku z możliwością anulowania, który wskazuje plik pamięci współdzielonej przechowujący serializowane dane ładunku, jeśli lista wartości jest zbyt duża. |
Na przykład VehiclePropConfigs
jest zdefiniowana 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 dane ładunku lub niepustą wartość sharedMemoryFd
.
- Jeśli element
payloads
nie jest pusty, zawiera listę rzeczywistych danych, czyli konfigurację usługi. - Jeśli
sharedMemoryFd
nie jest równe null, zawiera plik pamięci współdzielonej, w którym przechowywana jest serializowana strukturaVehiclePropConfigs
. Struktura używa funkcjiwriteToParcel
do serializacji obiektu Parcel.
Jako klient Java dla VHAL, Car Service obsługuje serializację i deserializację w przypadku LargeParcelable
. W przypadku implementacji VHAL i klientów natywnych obiekt LargeParcelable
powinien być serializowany i deserializowany za pomocą biblioteki LargeParcelable
lub przydatnej klasy opakowującej bibliotekę w ParcelableUtils.h
.
Na przykład natywny klient analizujący żądania getValues
otrzymane z bindera:
// '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 przedstawiamy przykładową implementację VHAL, która wysyła wyniki dla getValues
za pomocą bindera:
std::vectorresults = getResults(); GetValueResults parcelableResults; ScopedAStatus status = vectorToStableLargeParcelable(std::move(results), &parcelableResults); if (status.isOk()) { // Send parcelableResults through callback. } else { // Handle error. }