Interfejs VHAL

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()
Zwraca listę wszystkich konfiguracji właściwości obsługiwanych przez ten interfejs HAL pojazdu.
VehiclePropConfigs getPropConfigs(in int[] props)
Zwraca listę konfiguracji właściwości dla podanych identyfikatorów właściwości.
void getValues(IVehicleCallback callback, in GetValueRequests requests)
Asynchroniczne pobieranie wartości właściwości pojazdu. Asynchroniczne obsługiwanie partii GetValueRequest. Wynik jest dostarczany za pomocą onGetValues metody wywołania zwrotnego.
void setValues(IVehicleCallback callback, in SetValueRequests requests)
Asynchroniczne ustawianie wartości właściwości pojazdu. Asynchroniczne obsługiwanie partii SetValueRequest. Wynik jest dostarczany za pomocą onSetValues metody wywołania zwrotnego.
void subscribe(in IVehicleCallback callback, in SubscribeOptions[] options, int maxSharedMemoryFileCount)
Subskrybowanie zdarzeń właściwości z określonymi opcjami. Opcje subskrypcji obejmują identyfikator właściwości, identyfikator obszaru właściwości i częstotliwość próbkowania w Hz (w przypadku właściwości ciągłej). maxSharedMemoryFileCount nie jest używane.
void unsubscribe(in IVehicleCallback callback, in int[] propIds)
Anulowanie subskrypcji wcześniej subskrybowanych zdarzeń właściwości dla określonych właściwości.
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
Nie jest używane i można je zaimplementować jako operację bezczynną.
(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 identyfikatorów obszarów.
Wprowadzone 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 identyfikatorów obszarów.
Wprowadzone 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.
Wprowadzone w VHAL V4.
void unregisterSupportedValueChangeCallback(in IVehicleCallback callback, in List propIdAreaIds)
Anuluje rejestrację wywołania zwrotnego zmiany obsługiwanej wartości.
Wprowadzone w VHAL V4.

Wywołania zwrotne są zdefiniowane w IVehicleCallback.aidl i zawierają te metody.

Metoda
oneway void onGetValues(in GetValueResults responses)
Wywołanie zwrotne funkcji 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)
Wywołanie zwrotne funkcji 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)
Wywołanie zwrotne służące do raportowania zdarzeń aktualizacji właściwości.
W przypadku właściwości
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.
W przypadku właściwości ON_CHANGE zdarzenie właściwości występuje, gdy zmieni się wartość lub stan właściwości.
Należy go też używać do dostarczania zdarzeń zmiany stanu właściwości, np. gdy właściwość stanie się niedostępna lub wystąpi błąd odczytu. Należy wtedy dostarczyć 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)
Wywołanie zwrotne służące do raportowania asynchronicznych błędów ustawiania właściwości, które nie mają odpowiadającego im żądania ustawienia. Jeśli wiemy, którego żądania ustawienia dotyczy błąd, onSetValues z wynikiem błędu musi być użyte zamiast tego.
oneway void onSupportedValueChange(in List propIdAreaIds)
Wywołanie zwrotne służące do raportowania zmian minimalnej i maksymalnej obsługiwanej wartości lub listy obsługiwanych wartości. Wywołujący powinien wywołać 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 payloads nie jest puste, przechowuje listę rzeczywistych danych, czyli konfigurację właściwości.
  • Jeśli sharedMemoryFd nie jest puste, zawiera plik pamięci współdzielonej, który przechowuje serializowaną strukturę VehiclePropConfigs. Struktura używa funkcji writeToParcel do 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::vector results = getResults();
GetValueResults parcelableResults;
ScopedAStatus status = vectorToStableLargeParcelable(std::move(results), &parcelableResults);
if (status.isOk()) {
    // Send parcelableResults through callback.
} else {
    // Handle error.
}