Interfejs 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, należy wdrożyć 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)
Asynchroniczne pobieranie wartości właściwości pojazdu. Obsługuje wsad 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 dostarczany przez metodę 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). Konto maxSharedMemoryFileCount nie jest używane.
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)
Nie jest używany i można go zaimplementować w trybie bezobsługowym.

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

Metoda
oneway void onGetValues(in GetValueResults responses)
Wywołanie zwrotne dla funkcji 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)
Wywołanie zwrotne dla funkcji 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)
Zwrotny wywołanie 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ć po zmianie stanu 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órej żądanej wartości odnosi się błąd, zamiast tego należy użyć wartości onSetValues z wartością błędu.

Więcej informacji znajdziesz w plikach IVehicle.aidlIVehicleCallback.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 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 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 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 klient natywny analizujący żądania getValues otrzymane z bindera:

// 'requests' are from the binder.
GetValueRequests requests;
expected, 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.
}