Interfejs VHAL

AIDL VHAL jest zdefiniowany w android.hardware.automotive.vehicle namespace. Interfejs VHAL jest zdefiniowany w dokumentacji IVehicle.aidl. O ile nie określono inaczej, należy zaimplementować wszystkie metody.

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)
Asynchronicznie pobieraj 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.

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, aby zwrócić 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 komunikatów magistrali 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.
SharedMemoryFileCount to zawsze 0.
oneway void onPropertySetError(in VehiclePropErrors errors)
Funkcja wywołania zwrotnego do zgłaszania asynchronicznych błędów zestawu właściwości, które nie mają odpowiadającego im żądania zestawu. Jeśli wiemy, do którego zestawu żądań należy błąd, zamiast tego należy użyć onSetValues z odpowiedzią błędu.

Więcej informacji znajdziesz w plikach IVehicle.aidlIVehicleCallback.aidl.

Wdrożenie VHAL jest weryfikowane 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 wywołania getValues i setValues

Operacje getValuessetValues 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, SetValueRequestsVehiclePropValues, 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 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 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 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 znajduje się przykładowa implementacja 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.
}