Interfejs VHAL

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()
Zwraca listę wszystkich konfiguracji właściwości obsługiwanych przez ten HAL pojazdu.
VehiclePropConfigs getPropConfigs(in int[] props)
Zwraca listę konfiguracji usług dla podanych identyfikatorów usług.
void getValues(IVehicleCallback callback, in GetValueRequests requests)
Asynchroniczne pobieranie wartości właściwości pojazdu. Obsługuje zbiorczo GetValueRequest asynchronicznie. Wynik jest przekazywany za pomocą metody wywołania zwrotnego onGetValues.
void setValues(IVehicleCallback callback, in SetValueRequests requests)
Ustaw asynchronicznie wartości właściwości pojazdu. Obsługuje zbiorcze wywołania funkcji 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)
Subskrybuje zdarzenia 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). Karta maxSharedMemoryFileCount nie jest używana.
void unsubscribe(in IVehicleCallback callback, in int[] propIds)
Rezygnuje z subskrypcji wcześniej zarejestrowanych zdarzeń usługi w przypadku wybranych usług.
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
Nieużywany i może być zaimplementowany jako nieaktywny.
(Nowość w Androidzie 16)
SupportedValuesListResults getSupportedValuesLists(in List propIdAreaIds)
Pobiera listy obsługiwanych wartości dla określonych par identyfikatorów usługi i obszaru.
Wprowadzona 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 usługi i obszaru.
Wprowadzona w VHAL V4.
void registerSupportedValueChangeCallback(in IVehicleCallback callback, in List propIdAreaIds)
Rejestruje wywołanie zwrotne, które zostanie wywołane po zmianie obsługiwanych wartości.
Wprowadzona w VHAL V4.
void unregisterSupportedValueChangeCallback(in IVehicleCallback callback, in List propIdAreaIds)
Wyrejestruje wywołanie zwrotne obsługiwanej zmiany wartości.
Wprowadzona w VHAL V4.

Funkcje zwrotne są zdefiniowane w IVehicleCallback.aidli zawierają te metody.

Metoda
oneway void onGetValues(in GetValueResults responses)
Wywołanie zwrotne dla funkcji 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)
Wywołanie zwrotne dla funkcji 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)
Zwrotny wywołanie służące do raportowania zdarzeń aktualizacji obiektu.
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ą.
W przypadku właściwości ON_CHANGE zdarzenie związane z właściwością występuje, gdy zmienia się wartość lub stan tej właściwości.
Należy go też używać do przesyłania zdarzeń zmiany stanu usługi, na przykład gdy usługa staje się niedostępna lub występuje błąd podczas odczytu, należy przesłać VehiclePropValue ze stanem niedostępny lub błąd i pustą wartością.
SharedMemoryFileCount to zawsze 0.
oneway void onPropertySetError(in VehiclePropErrors errors)
Funkcja wywołania zwrotnego do raportowania asynchronicznych błędów zestawu właściwości, które nie mają odpowiadającego im żądania zestawu. Jeśli wiemy, do której grupy żądań należy błąd, zamiast tego należy użyć onSetValues z odpowiednim wynikiem błędu.
oneway void onSupportedValueChange(in List propIdAreaIds)
Funkcja wywołania zwrotnego do raportowania minimalnej i maksymalnej obsługiwanej wartości lub zmian na liście obsługiwanych wartości. Osoba dzwoniąca powinna zadzwonić pod numer 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 getValuessetValues 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, SetValueRequestsVehiclePropValues, 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 struktura VehiclePropConfigs. Struktura używa funkcji writeToParcel 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::vector results = getResults();
GetValueResults parcelableResults;
ScopedAStatus status = vectorToStableLargeParcelable(std::move(results), &parcelableResults);
if (status.isOk()) {
    // Send parcelableResults through callback.
} else {
    // Handle error.
}