Właściwości pojazdu

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 strefy unsubscribe(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, minmax.
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

Przykład wywołania interfejsu VHAL HVAC

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.

Przykład ustawienia systemu ogrzewania/wentylacji/klimatyzacji w VHAL

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
      Grupa VENDOR jest używana tylko w przypadku usług niestandardowych.
    • VehicleArea
      Wybierz odpowiedni typ obszaru.
    • VehiclePropertyType
      Wybierz odpowiedni typ danych. Typ BYTES 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_*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.