Interfejs VHALA

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ą zostać zaimplementowane.

metoda
VehiclePropConfigs getAllPropConfigs()
Zwraca listę wszystkich konfiguracji właściwości obsługiwanych przez HAL tego 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)
Pobieraj wartości właściwości pojazdu asynchronicznie. Obsługuje partię GetValueRequest asynchronicznie. Wynik jest dostarczany za pomocą metody wywołania zwrotnego onGetValues .
void setValues(IVehicleCallback callback, in SetValueRequests requests)
Ustaw wartości właściwości pojazdu asynchronicznie. Obsługuje partię SetValueRequest asynchronicznie. Wynik jest dostarczany za pomocą metody wywołania zwrotnego onSetValues .
void subscribe(in IVehicleCallback callback, in SubscribeOptions[] options, int maxSharedMemoryFileCount)
Subskrybuje zdarzenia 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 (dla właściwości ciągłej). maxSharedMemoryFileCount nie jest używany.
void unsubscribe(in IVehicleCallback callback, in int[] propIds)
Anuluje subskrypcję wcześniej subskrybowanych zdarzeń właściwości dla określonych właściwości.
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
Nieużywane i można je zaimplementować jako nieoperacyjne.

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

metoda
oneway void onGetValues(in GetValueResults responses)
Wywołanie zwrotne funkcji getValues ​​w celu dostarczenia wyników uzyskiwania wartości. Wywoływana, gdy niektóre wartości do pobrania są gotowe.
oneway void onSetValues(in SetValueResults responses)
Wywołanie zwrotne dla funkcji setValues ​​w celu dostarczenia wyników wartości zadanych. Wywoływane, gdy VHAL zakończył obsługę niektórych żądań zestawu właściwości.
oneway void onPropertyEvent(in VehiclePropValues propValues, int sharedMemoryFileCount)
Wywołanie zwrotne umożliwiające raportowanie zdarzeń aktualizacji usługi.
CONTINUOUS , zdarzenie właściwości następuje w oparciu o częstotliwość próbkowania subskrybowanego sygnału w Hz lub częstotliwość komunikatów magistrali pojazdu. Zdarzenie dotyczące właściwości może również wystąpić w przypadku zmiany stanu właściwości. Na przykład z niedostępnego na dostępne.
W przypadku właściwości ON_CHANGE zdarzenie właściwości ma miejsce, gdy zmienia się wartość właściwości lub jej status.
SharedMemoryFileCount ma zawsze wartość 0 .
oneway void onPropertySetError(in VehiclePropErrors errors)
Wywołanie zwrotne służące do raportowania błędów asynchronicznego zestawu właściwości, które nie mają odpowiedniego żądania ustawienia. Jeśli wiemy, którego żądania setowego dotyczy błąd, zamiast tego należy użyć onSetValues ​​z wynikiem błędu.

Aby uzyskać więcej informacji, zobacz IVehicle.aidl i IVehicleCallback.aidl .

Implementacja VHAL jest sprawdzana przez VHAL VTS w VtsHalAutomotiveVehicle_TargetTest.cpp . Test sprawdza, czy podstawowe metody są poprawnie zaimplementowane, a obsługiwane konfiguracje właściwości są prawidłowe.

Wartość właściwości pojazdu

Użyj struktury VehiclePropValue , aby opisać wartość każdej właściwości, która ma następujące pola:

Pole Opis
timestamp Znacznik czasu reprezentujący czas wystąpienia zdarzenia i zsynchronizowany z zegarem SystemClock.elapsedRealtimeNano() .
prop Identyfikator właściwości dla tej wartości.
areaid Identyfikator obszaru dla tej wartości. Obszar musi należeć do obsługiwanych obszarów wymienionych w konfiguracji identyfikatora obszaru lub mieć 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, 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 dla właściwości typu Int32. Aby uzyskać szczegółowe informacje, zobacz Konfiguracje właściwości .

Asynchroniczne metody getValues ​​i setValues

Operacje getValues ​​i setValues ​​są wykonywane asynchronicznie, co oznacza, że ​​funkcja może zwrócić przed zakończeniem faktycznej operacji get lub set. Wyniki operacji (na przykład wartość właściwości dla getValues ​​i status powodzenia lub błędu dla setValues ​​) są dostarczane poprzez wywołania zwrotne przekazywane jako argumenty.

Implementacja nie może blokować wyniku w wątku segregatora, który obsługuje żądanie. Zamiast tego zalecamy przechowywanie żądania w kolejce żądań i używanie osobnego wątku obsługi do asynchronicznej obsługi żądań. Aby uzyskać szczegółowe informacje, zobacz implementację referencyjną .

Rysunek 1. Proces asynchroniczny.

Duże przesyłki

Wszystkie struktury o nazwach XXXs , takie jak VehiclePropConfigs , SetValueRequests i VehiclePropValues , nazywane są LargeParcelable (lub StableLargeParcelable ). Każda reprezentuje listę wartości używanych do przekazywania dużych danych, które mogą przekroczyć ograniczenia powiązań (4 KB w implementacji biblioteki LargeParcelable ) przez granice powiązań. Każdy ma podobną definicję struktury, która zawiera następujące pola.

Przewodnictwo Opis
payloads Lista wartości, gdy rozmiar wartości mieści się w ograniczeniu pamięci segregatora lub pusta lista.
sharedMemoryFd Deskryptor pliku dopuszczający wartość null wskazujący plik pamięci współdzielonej, w którym przechowywane są serializowane ładunki, jeśli lista wartości jest zbyt duża.

Na przykład VehiclePropConfigs definiuje się 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ą sharedMemoryFd .

  • Jeśli payloads nie jest pusty, przechowuje listę rzeczywistych danych, czyli konfigurację właściwości.
  • Jeśli sharedMemoryFd nie ma wartości null, zawiera plik pamięci współdzielonej, w którym przechowywana jest serializowana struktura VehiclePropConfigs . Struktura wykorzystuje funkcję writeToParcel do serializacji Parcel.

Jako klient Java dla VHAL, 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ą biblioteki LargeParcelable lub przydatnej klasy opakowania dla biblioteki w ParcelableUtils.h .

Na przykład natywny klient analizujący żądania getValues ​​otrzymane z segregatora wygląda następująco:

// '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.
}

Przykładowa implementacja VHAL, która wysyła wyniki dla getValues ​​poprzez segregator, jest pokazana 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.
}