AIDL VHAL jest zdefiniowany w android.hardware.automotive.vehicle namespace
.
Interfejs VHAL jest zdefiniowany na stronie IVehicle.aidl
.
O ile nie określono inaczej, należy wdrożyć wszystkie metody.
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 dostarczany przez metodę wywołania zwrotnego onSetValues . |
|
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)
|
Wywołania zwrotne są zdefiniowane w zadaniu IVehicleCallback.aidl
i zawierają te metody.
Metoda | |
---|---|
oneway void onGetValues(in GetValueResults responses)
getValues , aby zwrócić wyniki funkcji get value. Wywoływana, gdy niektóre wartości do pobrania są gotowe. |
|
oneway void onSetValues(in SetValueResults responses)
setValues , która zwraca wyniki ustawionej wartości. Wywoływana po zakończeniu obsługi niektórych żądań zestawu usług przez VHAL. |
|
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 komunikatów magistrali pojazdu. Zdarzenie usługi może też wystąpić po zmianie stanu 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.SharedMemoryFileCount to zawsze 0 . |
|
oneway void onPropertySetError(in VehiclePropErrors errors)
onSetValues z wartością błędu. |
Więcej informacji znajdziesz w plikach IVehicle.aidl i IVehicleCallback.aidl.
Implementacja VHAL jest weryfikowana przez VHAL VTS w pliku VtsHalAutomotiveVehicle_TargetTest.cpp. Test sprawdza, czy podstawowe metody są prawidłowo zaimplementowane i czy konfiguracje obsługiwanych usług są prawidłowe.
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. |
Asynchroniczne wartości getValue i setValues
Operacje getValues
i setValues
są wykonywane asynchronicznie, co oznacza, że funkcja może zwrócić wartość 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
Wszystkie struktury o nazwie XXXs
, takie jak VehiclePropConfigs
, SetValueRequests
i VehiclePropValues
, nazywają się 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 |
Opcjonalny deskryptor pliku wskazujący na plik pamięci współdzielonej, który przechowuje 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
payloads
nie jest pusty, przechowuje listę rzeczywistych danych, czyli konfigurację właściwości. - 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 VHAL w Javie, 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 klient natywny analizujący żądania getValues
otrzymane z bindera:
// 'requests' are from the binder.
GetValueRequests requests;
expected
Poniżej znajduje się przykładowa implementacja VHAL, która wysyła wyniki dla getValues
za pomocą bindera:
std::vector