Interfejs VHAL

Numer VHAL AIDL 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 Obsługiwane konfiguracje usługi przez ten pojazd HAL.
VehiclePropConfigs getPropConfigs(in int[] props)
Zwraca listę wartości Konfiguracje usługi w przypadku danej identyfikatorów usług.
void getValues(IVehicleCallback callback, in GetValueRequests requests)
Asynchronicznie pobieraj wartości właściwości pojazdu. Obsługuje wsad z GetValueRequest asynchronicznie. Wynik jest dostarczany przez onGetValues metoda wywołania zwrotnego.
void setValues(IVehicleCallback callback, in SetValueRequests requests)
Asynchronicznie ustawiaj wartości właściwości pojazdu. Obsługuje wsad SetValueRequest asynchronicznie. Wynik jest dostarczany przez onSetValues metoda wywołania zwrotnego.
void subscribe(in IVehicleCallback callback, in SubscribeOptions[] options, int maxSharedMemoryFileCount)
Subskrybuje zdarzenia usługi z określonymi opcjami. Dostępne opcje subskrypcji to: identyfikatora usługi, identyfikatora obszaru usługi i częstotliwości 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)
Anuluj subskrypcję wcześniej zasubskrybowanych zdarzeń usługi dla określonych 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 tutaj: IVehicleCallback.aidl i obejmuje te metody.

Metoda
oneway void onGetValues(in GetValueResults responses)
Wywołanie zwrotne dla funkcji getValues w celu uzyskania wyników dotyczących wartości. Nawiązano połączenie gdy niektóre wartości do pobrania będą gotowe.
oneway void onSetValues(in SetValueResults responses)
Wywołanie zwrotne dla funkcji setValues w celu dostarczenia określonej wartości. Wywoływane, gdy VHAL zakończył obsługę niektórych żądań zestawu usług.
oneway void onPropertyEvent(in VehiclePropValues propValues, int sharedMemoryFileCount)
Wywołanie zwrotne dla raportowania zdarzeń aktualizacji usługi.
.
CONTINUOUS, zdarzenie w usłudze odbywa się 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 zmiany stanu. na przykład z niedostępnych na dostępne.
.
W przypadku usługi ON_CHANGE zdarzenie usługi zachodzi, gdy wartość właściwości lub zmieni się stan usługi.
.
SharedMemoryFileCount to zawsze 0.
oneway void onPropertySetError(in VehiclePropErrors errors)
Wywołanie zwrotne do zgłaszania błędów asynchronicznego zestawu usług, które nie ma odpowiadającego ustawienia użytkownika. Jeśli wiemy, którego zestawu żądania dotyczy błąd, onSetValues z parametrem .

Więcej informacji: IEV.aidl, oraz IVehicleCallback.aidl

Implementacja VHAL jest weryfikowana przez VHAL VTS pod adresem VtsHalAutomotiveVehicle_TargetTest.cpp. Test sprawdza, czy podstawowe metody są prawidłowo zaimplementowane oraz czy obsługiwana właściwość są poprawne.

Wartość własności pojazdu

Użyj VehiclePropValue do opisania wartości każdej właściwości, która zawiera te pola:

Pole Opis
timestamp Sygnatura czasowa określająca czas wystąpienia zdarzenia i zsynchronizowanego z Zegar SystemClock.elapsedRealtimeNano().
prop Identyfikator usługi dla tej wartości.
areaid Identyfikator obszaru dla tej wartości. Należy wybrać jeden z obsługiwanych obszarów na liście Konfiguracja identyfikatora lub 0 w przypadku usług globalnych.
value Struktura danych zawierająca rzeczywistą wartość właściwości. W zależności od typu usługi: jedna lub więcej pól w tym polu jest wykorzystywanych do przechowywania rzeczywistej wartości. Na przykład pierwszy parametr elementu w tabeli value.int32Values jest używany w właściwościach typu Int32. Więcej informacji: Usługa Konfiguracje.

Asynchroniczne wartości getValue i setValues

Operacje getValues i setValues są wykonywane asynchronicznie, co oznacza, że funkcja może wrócić przed zakończeniem rzeczywistej operacji pobierania lub ustawiania. wyniki operacji (np. wartość właściwości getValues oraz powodzenie lub stan błędu dla funkcji setValues) są dostarczane przez wywołania zwrotne przekazywane jako argumenty.

Implementacja nie może blokować wyniku w wątku powiązania, który obsługuje żądanie. Zamiast tego zalecamy zapisanie żądania w kolejce żądań i użycie osobnego wątku modułu obsługi asynchroniczną obsługę żądań. Zobacz Implementacja referencyjna – .

Rysunek 1. Proces asynchroniczny.

Duże działki

Wszystkie obiekty o nazwie XXXs, takie jak VehiclePropConfigs, Nazwy SetValueRequests i VehiclePropValues mają swoje nazwy LargeParcelable (lub StableLargeParcelable). Każdy z nich przedstawia listę używane do przekazywania dużych danych, które mogą przekraczać ograniczenia powiązania (4 KB w implementacji biblioteki LargeParcelable) przez granice wiązania. Każdy ma podobny definicji struktury, która zawiera następujące pola.

Wskazówki Opis
payloads Lista wartości, gdy rozmiar wartości mieści się w ograniczeniu pamięci powiązania lub jest pusta.
sharedMemoryFd Deskryptor pliku z wartością null wskazujący plik pamięci współdzielonej, w którym jest zserializowany 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 wartość niepustą sharedMemoryFd

  • Jeśli payloads nie jest pusta, przechowywana jest lista rzeczywistych danych, która jest config.
  • Jeśli sharedMemoryFd nie ma wartości null, zawiera plik pamięci współdzielonej, w którym przechowywane są zserializowana struktura VehiclePropConfigs. Struktura ta korzysta z writeToParcel do zserializacji działki.

Jako klient w Javie dla VHAL firma Car Service zajmuje się serializacją i deserializacją LargeParcelable W przypadku wdrożeń VHAL i klientów natywnych Pole LargeParcelable powinno być zserializowane i poddane deserializacji za pomocą atrybutu LargeParcelable lub przydatną klasę kodu dla biblioteki w ParcelableUtils.h

Na przykład natywny klient analizuje żądania getValues odebrane z powiązań jest taki:

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

Przykładowa implementacja VHAL, która wysyła wyniki funkcji getValues za pomocą separatora, to 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.
}