Interfejs AIDL VHAL

AIDL VHAL jest zdefiniowany w android.hardware.automotive.vehicle namespace. Interfejs VHAL jest zdefiniowany na stronie 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 Wersja 1
Android 15 V3 V3 Wersja 1
Android 14 Wersja 2 Wersja 2 Wersja 1
Android 13 Wersja 1 (Interfejs właściwości VHAL nie jest podzielony) Wersja 1

ZALECAMY wdrożenie najnowszej wersji VHAL dla konkretnej wersji Androida.

Funkcje i wywołania zwrotne

Funkcje VHAL są zdefiniowane na stronie IVehicle.aidl.

Metoda
VehiclePropConfigs getAllPropConfigs()
Zwraca listę wszystkich konfiguracji właściwości obsługiwanych przez ten interfejs HAL pojazdu.
VehiclePropConfigs getPropConfigs(in int[] props)
Zwraca listę konfiguracji usługi dla podanych identyfikatorów usługi.
void getValues(IVehicleCallback callback, in GetValueRequests requests)
Pobieranie wartości właściwości pojazdu asynchronicznie. Obsługuje asynchronicznie partię obiektów GetValueRequest. Wynik jest przekazywany za pomocą metody onGetValues wywołania zwrotnego.
void setValues(IVehicleCallback callback, in SetValueRequests requests)
Asynchroniczne ustawianie wartości właściwości pojazdu. Obsługuje partię SetValueRequest asynchronicznie. Wynik jest przekazywany za pomocą metody onSetValues wywołania zwrotnego.
void subscribe(in IVehicleCallback callback, in SubscribeOptions[] options, int maxSharedMemoryFileCount)
Subskrybuje zdarzenia dotyczące usługi z określonymi opcjami. Opcje subskrypcji obejmują identyfikator usługi, identyfikator obszaru usługi i częstotliwość próbkowania w Hz (w przypadku usługi ciągłej). maxSharedMemoryFileCount nie jest używana.
void unsubscribe(in IVehicleCallback callback, in int[] propIds)
Anuluje subskrypcję zdarzeń usługi w przypadku określonych usług.
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
Nie jest używana i może być zaimplementowana jako operacja bez efektu.
(Nowość w Androidzie 16)
SupportedValuesListResults getSupportedValuesLists(in List propIdAreaIds)
Pobiera listy obsługiwanych wartości dla określonych par identyfikatorów właściwości i obszarów.
Wprowadzono w VHAL V4.
(Nowość w Androidzie 16)
MinMaxSupportedValueResults getMinMaxSupportedValue(in List propIdAreaIds)
Pobiera minimalne i maksymalne obsługiwane wartości dla określonych par identyfikatorów właściwości i obszarów.
Wprowadzono w VHAL V4.
void registerSupportedValueChangeCallback(in IVehicleCallback callback, in List propIdAreaIds)
Rejestruje wywołanie zwrotne, które ma być wywoływane, gdy zmienią się obsługiwane wartości.
Wprowadzono w VHAL V4.
void unregisterSupportedValueChangeCallback(in IVehicleCallback callback, in List propIdAreaIds)
Usuwa rejestrację wywołania zwrotnego obsługiwanej zmiany wartości.
Wprowadzono w VHAL V4.

Funkcje zwrotne są zdefiniowane w IVehicleCallback.aidl i zawierają te metody.

Metoda
oneway void onGetValues(in GetValueResults responses)
Wywołanie zwrotne funkcji getValues, które dostarcza wyniki wartości. Wywoływana, gdy niektóre z wartości do pobrania są gotowe.
oneway void onSetValues(in SetValueResults responses)
Wywołanie zwrotne funkcji setValues, które dostarcza wyniki o ustalonej wartości. Wywoływana, gdy VHAL zakończy obsługę niektórych żądań ustawienia właściwości.
oneway void onPropertyEvent(in VehiclePropValues propValues, int sharedMemoryFileCount)
Funkcja zwrotna do raportowania zdarzeń aktualizacji właściwości.
W przypadku usługi
CONTINUOUS zdarzenie usługi występuje na podstawie częstotliwości próbkowania subskrypcji w Hz lub częstotliwości wiadomości magistrali pojazdu. Zdarzenie usługi może też wystąpić, jeśli zmieni się stan usługi. Na przykład z niedostępnego na dostępny.
W przypadku usługi ON_CHANGE zdarzenie usługi występuje, gdy zmieni się wartość lub stan usługi.
Należy go też używać do przekazywania zdarzeń związanych ze zmianą stanu usługi, np. gdy usługa staje się niedostępna lub występuje błąd odczytu, należy przekazać VehiclePropValue ze stanem niedostępności lub błędu i pustą wartością.
SharedMemoryFileCount to zawsze 0.
oneway void onPropertySetError(in VehiclePropErrors errors)
Wywołanie zwrotne do raportowania asynchronicznych błędów ustawiania właściwości, które nie mają odpowiedniego żądania ustawienia. Jeśli wiemy, którego żądania zestawu dotyczy błąd, zamiast tego należy użyć onSetValues z wynikiem błędu.
oneway void onSupportedValueChange(in List propIdAreaIds)
Wywołanie zwrotne do raportowania zmian minimalnej i maksymalnej obsługiwanej wartości lub listy obsługiwanych wartości. Dzwoniący powinien zadzwonić pod numer getMinMaxSupportedValue lub getSupportedValuesLists, aby uzyskać zaktualizowane wartości.

Implementacja VHAL jest weryfikowana przez VHAL VTS na stronie VtsHalAutomotiveVehicle_TargetTest.cpp.

Test sprawdza, czy podstawowe metody są prawidłowo zaimplementowane, a obsługiwane konfiguracje usługi są poprawne. 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. Struktura ta zawiera te pola:

Pole Opis
timestamp Sygnatura czasowa reprezentująca czas wystąpienia zdarzenia zsynchronizowany 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ść usługi. 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 pierwszy element w value.int32Values jest używany w przypadku właściwości typu Int32. Szczegółowe informacje znajdziesz w sekcji Konfiguracje usługi.
status Stan usługi do odczytu. W przypadku właściwości z uprawnieniami do odczytu i zapisu może to również dotyczyć 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 sekcji VehiclePropertyStatus.

Asynchroniczne metody getValues i setValues

Operacje getValuessetValues są wykonywane asynchronicznie, co oznacza, że funkcja może zwrócić wartość przed zakończeniem rzeczywistej operacji pobierania lub ustawiania. Wyniki operacji (np. wartość właściwości dla getValues i stan powodzenia lub błędu dla setValues) są przekazywane za pomocą wywołań zwrotnych przekazywanych jako argumenty.

Implementacja nie może blokować wyniku w wątku powiązanym, 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ń. Szczegółowe informacje znajdziesz w implementacji referencyjnej.

Rysunek 1. Proces asynchroniczny.

Duże obiekty Parcelable

Wszystkie struktury o nazwie XXXs, takie jak VehiclePropConfigs, SetValueRequestsVehiclePropValues, 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 modułu Binder (4 KB w implementacji biblioteki LargeParcelable), przez granice modułu Binder. Każda z nich ma podobną definicję struktury, która zawiera te pola:

Wskazówki Opis
payloads Lista wartości, jeśli rozmiar wartości mieści się w limicie pamięci modułu, lub pusta lista.
sharedMemoryFd Deskryptor pliku z 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 zdefiniowane 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 niepustą wartość sharedMemoryFd.

  • Jeśli payloads nie jest pusta, przechowuje listę rzeczywistych danych, czyli konfigurację usługi.
  • Jeśli sharedMemoryFd nie jest wartością null, zawiera plik pamięci współdzielonej, w którym jest przechowywana serializowana struktura VehiclePropConfigs. Struktura używa funkcji writeToParcel do serializacji obiektu Parcel.

Jako klient VHAL w języku Java usługa Car Service obsługuje serializację i deserializację dla LargeParcelable. W przypadku implementacji VHAL i klientów natywnych element LargeParcelable powinien być serializowany i deserializowany za pomocą biblioteki LargeParcelable lub przydatnej klasy opakowującej dla biblioteki w ParcelableUtils.h.

Na przykład klient natywny analizujący żądania dotyczące getValues otrzymane z bindera 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.
}

Przykładowe wdrożenie VHAL, które wysyła wyniki dla getValues za pomocą bindera, jest pokazane poniżej:

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