Interfejs Vehicle Hardware Abstraction Layer (VHAL) definiuje właściwości, które OEM może zaimplementować, oraz zawiera metadane właściwości (np. czy dana właściwość jest typu int i które tryby zmiany są dozwolone). Interfejs VHAL opiera się na dostępie (odczyt, zapis, subskrypcja) do usługi, która jest abstrakcją konkretnej funkcji.
Interfejsy HAL
VHAL używa tych interfejsów:
getAllPropConfigs()
generuje(vec<VehiclePropConfig>propConfigs)
Lista konfiguracji wszystkich właściwości obsługiwanych przez VHAL. Usługa CarService korzysta tylko z obsługiwanych właściwości.getPropConfigs(vec<int32_t> props)
generuje(StatusCode status,vec<VehiclePropConfig> propConfigs);
Zwraca konfigurację wybranych właściwości.- Funkcja
set(VehiclePropValue propValue)
generuje(StatusCodestatus);
Zapisz wartość do usługi. Wynik zapisu jest zdefiniowany dla każdej usługi. subscribe(IVehicleCallback callback, vec<SubscribeOptions> options)
generuje(StatusCode status);
Zacznij monitorować zmianę wartości właściwości. W przypadku usługi z podziałem na strefyunsubscribe(IVehicleCallback callback, int32_t propId)
generuje(StatusCode status);
VHAL używa tych interfejsów wywołania zwrotnego:
oneway onPropertyEvent(vec<VehiclePropValue>propValues);
Powiadomienie o zmianie wartości właściwości pojazdu. Należy to zrobić tylko w przypadku subskrybowanych usług.oneway onPropertySetError(StatusCode errorCode,int32_t propId,int32_tareaId);
Zwraca globalny błąd na poziomie VHAL lub błąd na usługę. Błąd globalny powoduje ponowne uruchomienie HAL, co może prowadzić do ponownego uruchomienia innych komponentów (w tym aplikacji).
Właściwości pojazdu
Właściwości mogą być tylko do odczytu, tylko do zapisu (używane do przekazywania informacji do poziomu VHAL) lub do odczytu i zapisu (obsługa większości właściwości jest opcjonalna). Każda właściwość jest jednoznacznie identyfikowana za pomocą klucza int32 i ma wstępnie zdefiniowany typ (value_type
):
BYTES
BOOLEAN
EPOCH_TIME
FLOAT
FLOAT[]
INT32
INT32[]
INT64
INT64[]
STRING
MIXED
Właściwość z podziałem na strefy może mieć więcej niż 1 wartość, w zależności od liczby stref obsługiwanych przez tę właściwość.
Typy obszarów
VHAL definiuje kilka typów obszarów:
Typ obszaru | Opis |
---|---|
GLOBAL |
Ta usługa jest usługą pojedynczą i nie ma wielu obszarów. |
WINDOW |
Obszar na podstawie okien, używa enum VehicleAreaWindow . |
MIRROR |
Obszar na podstawie lusterek; używa wyliczenia VehicleAreaMirror . |
SEAT |
Obszar na podstawie miejsc, korzysta z wyliczenia VehicleAreaSeat . |
DOOR |
Obszar na podstawie drzwi, używa enum VehicleAreaDoor . |
WHEEL |
Pole „Area” (obszar) na podstawie kół, używa enum VehicleAreaWheel . |
Każda usługa strefowa musi używać wstępnie zdefiniowanego typu obszaru. Każdy typ obszaru ma zestaw flag bitowych zdefiniowanych w enumeracji dla tego typu. Na przykład obszar SEAT
definiuje wyliczenia VehicleAreaSeat
:
ROW_1_LEFT = 0x0001
ROW_1_CENTER = 0x0002
ROW_1_RIGHT = 0x0004
ROW_2_LEFT = 0x0010
ROW_2_CENTER = 0x0020
ROW_2_RIGHT = 0x0040
ROW_3_LEFT = 0x0100
- …
Identyfikatory obszarów
Obiekty strefowe są adresowane za pomocą identyfikatorów obszarów. Każda usługa w strefach może obsługiwać
co najmniej 1 identyfikator obszaru. Identyfikator obszaru składa się z co najmniej 1 flagi z odpowiedniego typu enumeracji. Na przykład usługa używająca właściwości VehicleAreaSeat
może używać takich identyfikatorów obszarów:
Produkt | Opis |
---|---|
ROW_1_LEFT | ROW_1_RIGHT |
Identyfikator obszaru dotyczy obu przednich siedzeń. |
ROW_2_LEFT |
Dotyczy tylko lewego tylnego siedzenia. |
ROW_2_RIGHT |
Dotyczy tylko prawego tylnego siedzenia. |
Stan usługi
Każda wartość właściwości ma wartość VehiclePropertyStatus
.
Wskazuje bieżący stan usługi:
Produkt | Opis |
---|---|
AVAILABLE |
Właściwość jest dostępna, a jej wartość jest prawidłowa. |
UNAVAILABLE |
Wartość obiektu jest obecnie niedostępna. Dane są używane na potrzeby tymczasowo wyłączonych funkcji w obsługiwanej usłudze. |
ERROR |
Coś jest nie tak z tą usługą. |
Konfigurowanie usługi
W polu VehiclePropConfig
podaj informacje o konfiguracji dla każdej usługi. Informacje obejmują:
Zmienna | Opis |
---|---|
access |
r , w , rw |
changeMode |
Określa sposób monitorowania usługi: ciągły lub po zmianie. |
areaConfigs |
wartości areaId , min i max . |
configArray |
dodatkowe parametry konfiguracji. |
configString |
Dodatkowe informacje przekazywane w postaci ciągu znaków. |
minSampleRate |
maxSampleRate |
prop |
Identyfikator usługi, int |
Obsługa właściwości strefy
Usługa podzielona na strefy jest odpowiednikiem kolekcji wielu usług, w których przypadku dostęp do każdej usługi podrzędnej można uzyskać za pomocą określonej wartości identyfikatora strefy.
get
wywołanie w przypadku usługi z wyznaczonym obszarem zawsze zawiera identyfikator obszaru w żądaniu. Dlatego zwracana jest tylko bieżąca wartość żądanego identyfikatora obszaru. Jeśli usługa jest globalna, identyfikator obszaru ma wartość 0.- Wywołanie
set
usługi w strefie zawsze zawiera w żądaniu identyfikator obszaru. W związku z tym zmienia się tylko żądany identyfikator obszaru. subscribe
wywołanie generuje zdarzenia dla wszystkich identyfikatorów obszaru usługi.
Odbieranie połączeń
Podczas inicjalizacji wartość właściwości może być jeszcze niedostępna, ponieważ odpowiednia wiadomość z sieci pojazdów nie została jeszcze odebrana. W takich przypadkach wywołanie get
powinno zwrócić -EAGAIN
. Niektóre obiekty (np. klimatyzacja) mają oddzielną właściwość włączania i wyłączania zasilania. Wywołanie funkcji get
w przypadku takiej właściwości (gdy jest wyłączona) powinno zwrócić stan UNAVAILABLE
, a nie błąd. Na przykład: temperatura ogrzewania, wentylacji i klimatyzacji
Rysunek 1. Pobieranie temperatury ogrzewania/wentylacji/klimatyzacji (CS = CarService, VHAL = Vehicle HAL)
Ustawienia połączeń
W typowej operacji wywołanie set
prowadzi do wysłania żądania zmiany w sieci pojazdu. Wywołanie set
to w najlepszym przypadku operacja asynchroniczna, która zwraca wynik możliwie szybko, ale może też być synchroniczna. Niektóre wywołania set
mogą wymagać danych początkowych, ale podczas inicjowania mogą być jeszcze niedostępne. W takich przypadkach wywołanie set
powinno zwrócić wartość StatusCode#TRY_AGAIN
. Niektóre usługi z osobnym zasilaniem i wyłączonym zasilaniem powinny zwracać wartości StatusCode#NOT_AVAILABLE
lub StatusCode#NOT_AVAILABLE_DISABLED
, gdy usługa jest wyłączona i nie można set
. Do momentu zastosowania funkcji set
funkcja get
nie zawsze zwraca taką samą wartość jak ustawiona. Na przykład: set HVAC Temperature
.
Rysunek 2. Ustawianie temperatury w systemie HVAC (CS = CarService, VHAL = Vehicle HAL)
Obsługa właściwości niestandardowych
Aby zaspokoić potrzeby partnerów, VHAL umożliwia korzystanie z niestandardowych usług, które są ograniczone do aplikacji systemowych. Podczas pracy z własnymi usługami kieruj się tymi wskazówkami:
- Identyfikator usługi musisz wygenerować za pomocą tych pól:
VehiclePropertyGroup:VENDOR
GrupaVENDOR
jest używana tylko w przypadku usług niestandardowych.VehicleArea
Wybierz odpowiedni typ obszaru.VehiclePropertyType
Wybierz odpowiedni typ danych. TypBYTES
umożliwia przekazywanie nieprzetworzonych danych, co w większości przypadków wystarcza. Częste wysyłanie dużych ilości danych za pomocą właściwości niestandardowych może spowolnić dostęp do całej sieci pojazdu. Zachowaj ostrożność podczas dodawania dużej ilości danych.Property ID
Wybierz 4-bitowy identyfikator właściwości niestandardowej.
- Aby zapobiec fragmentacji ekosystemu, nie wolno używać właściwości niestandardowych do powielania właściwości pojazdu, które już istnieją w pakiecie SDK (VehiclepropertyIds).
- W polu
VehiclePropConfig.configString
podaj krótki opis właściwości niestandardowej. Dzięki temu narzędzia do sprawdzania poprawności mogą zgłaszać przypadkowe powielanie właściwości pojazdu. Na przykład: „stan świateł awaryjnych”. - Dostęp przez
CarPropertyManager
(w przypadku komponentów Java) lub przez interfejs Vehicle Network Service API (w przypadku komponentów natywnych). Nie modyfikuj innych interfejsów API samochodów, ponieważ może to spowodować problemy ze zgodnością w przyszłości. - Po zaimplementowaniu właściwości dostawcy wybierztylko listę uprawnień w enumeracji
VehicleVendorPermission
dla właściwości dostawcy. Mapowanie uprawnień dostawcy na właściwości systemowe spowoduje naruszenie zasad CTS i VTS.
Obsługa właściwości ogrzewania/wentylacji/klimatyzacji
Za pomocą VHAL możesz sterować systemem HVAC, ustawiając właściwości związane z klimatyzacją. Większość właściwości HVAC to właściwości z podziałem na strefy, ale wiele z nich to właściwości bez podziału na strefy (globalne). Przykładowe zdefiniowane właściwości:
Właściwość | Cel |
---|---|
VEHICLE_PROPERTY_HVAC_TEMPERATURE_SET |
Ustaw temperaturę w poszczególnych strefach. |
VEHICLE_PROPERTY_HVAC_RECIRC_ON |
Sterowanie recyrkulacją w poszczególnych strefach. |
Aby zobaczyć pełną listę właściwości związanych z klimatyzacją, wyszukaj VEHICLE_PROPERTY_HVAC_*
w types.hal
. Gdy usługa HVAC używa VehicleAreaSeat
, obowiązują dodatkowe reguły mapowania usługi HVAC z podziałem na strefy do identyfikatorów obszarów. Każde dostępne miejsce w samochodzie musi być częścią identyfikatora obszaru w tablicy Area ID.
Przykład 1. Samochód ma 2 przednie fotele (ROW_1_LEFT, ROW_1_RIGHT
)
i 3 tylne fotele (ROW_2_LEFT, ROW_2_CENTER, ROW_2_RIGHT
). Samochód ma 2 urządzenia sterujące temperaturą: po stronie kierowcy i pasażera.
- Prawidłowy zestaw mapowania identyfikatorów obszarów dla
HVAC_TEMPERATURE SET
:ROW_1_LEFT | ROW_2_LEFT
ROW_1_RIGHT | ROW_2_CENTER | ROW_2_RIGHT
- Alternatywnym mapowaniem dla tej samej konfiguracji sprzętowej jest:
ROW_1_LEFT | ROW_2_LEFT | ROW_2_CENTER
ROW_1_RIGHT | ROW_2_RIGHT
Przykład 2. Samochód ma 3 rzędy siedzeń: 2 siedzenia w przednim rzędzie (ROW_1_LEFT, ROW_1_RIGHT
), 3 siedzenia w drugim rzędzie (ROW_2_LEFT, ROW_2_CENTER, ROW_2_RIGHT
) i 3 siedzenia w trzecim rzędzie (ROW_3_LEFT, ROW_3_CENTER, ROW_3_RIGHT
). Samochód ma 3 sterowania temperaturą: po stronie kierowcy, pasażera i z tyłu. Rozsądnym sposobem mapowania HVAC_TEMPERATURE_SET
na identyfikatory obszarów jest tablica o 3 elementach:
ROW_1_LEFT
ROW_1_RIGHT
ROW_2_LEFT | ROW_2_CENTER | ROW_2_RIGHT | ROW_3_LEFT | ROW_3_CENTER | ROW_3_RIGHT
Obsługa właściwości czujnika
Właściwości czujnika VHAL reprezentują rzeczywiste dane czujnika lub informacje o zasadach, takie jak stan jazdy. Niektóre informacje z czujników (np. stan jazdy czy tryb dzienny/nocny) są dostępne dla każdej aplikacji bez ograniczeń, ponieważ są one niezbędne do stworzenia bezpiecznego pojazdu w aplikacji. Inne informacje z czujników (np. prędkość pojazdu) są bardziej poufne i wymagają określonych uprawnień, którymi użytkownicy mogą zarządzać.
Zobacz obsługiwane właściwości czujnika (w types.hal
).
usługa map dla pojazdów
Usługa map dla pojazdów (VMS) zapewnia mechanizm wymiany danych mapy między klientami za pomocą interfejsu pub/sub, aby obsługiwać typowe funkcje pojazdu, takie jak zaawansowane systemy wspomagania kierowcy (ADAS). Klientami mogą być systemy pojazdów, które komunikują się z usługą VMS w VHAL lub uprzywilejowanymi aplikacjami na Androida. Dane udostępniane w maszynach wirtualnych powinny być ograniczone do danych map na potrzeby systemów pojazdu i aplikacji pomocniczych.
VMS jest przeznaczony tylko do stosowania w implementacjach Androida Automotive. AOSP nie zawiera klientów domyślnych, które publikują ani subskrybują VMS. W przypadku usługi VMS w VHAL typy wiadomości i struktury danych są opisane w VHAL 2.0 w elemencie VmsMessageType
enum, który zawiera listę typów obsługiwanych wiadomości VMS. Ten enumerant jest używany jako pierwsza liczba całkowita w tablicy liczb całkowitych właściwości pojazdu i określa, jak jest dekodowana reszta wiadomości.