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()
|
|
VehiclePropConfigs getPropConfigs(in int[] props)
|
|
void getValues(IVehicleCallback callback, in GetValueRequests requests)
GetValueRequest asynchronicznie. Wynik jest dostarczany przez
onGetValues metoda wywołania zwrotnego. |
|
void setValues(IVehicleCallback callback, in SetValueRequests requests)
SetValueRequest asynchronicznie. Wynik jest dostarczany przez
onSetValues metoda wywołania zwrotnego. |
|
void subscribe(in IVehicleCallback callback, in SubscribeOptions[] options, int maxSharedMemoryFileCount)
maxSharedMemoryFileCount nie jest używane. |
|
void unsubscribe(in IVehicleCallback callback, in int[] propIds)
|
|
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
|
Wywołania zwrotne są zdefiniowane tutaj:
IVehicleCallback.aidl
i obejmuje te metody.
Metoda | |
---|---|
oneway void onGetValues(in GetValueResults responses)
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)
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)
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.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)
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 strukturaVehiclePropConfigs
. Struktura ta korzysta zwriteToParcel
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::vectorresults = getResults(); GetValueResults parcelableResults; ScopedAStatus status = vectorToStableLargeParcelable(std::move(results), &parcelableResults); if (status.isOk()) { // Send parcelableResults through callback. } else { // Handle error. }