Die Vehicle Hardware Abstraction Layer (VHAL)-Schnittstelle definiert die Eigenschaften, die OEMs implementieren können, und enthält Attributmetadaten (z. B. ob es sich um ein Int-Attribut handelt und welche Änderungsmodi zulässig sind). Die VHAL-Schnittstelle basiert auf dem Zugriff auf eine Property (Lesen, Schreiben, Abonnieren), die eine Abstraktion für eine bestimmte Funktion ist.
HAL-Schnittstellen
Die VHAL verwendet die folgenden Schnittstellen:
getAllPropConfigs()
generiert(vec<VehiclePropConfig>propConfigs)
Listet die Konfiguration aller von der VHAL unterstützten Properties auf. Für CarService werden nur unterstützte Properties verwendet.getPropConfigs(vec<int32_t> props)
generiert(StatusCode status,vec<VehiclePropConfig> propConfigs);
Gibt die Konfiguration der ausgewählten Properties zurück.set(VehiclePropValue propValue)
generiert(StatusCodestatus);
Schreibt einen Wert in die Property. Das Ergebnis der Schreibvorgänge wird pro Property definiert.subscribe(IVehicleCallback callback, vec<SubscribeOptions> options)
generiert(StatusCode status);
Überwachung einer Property-Wertänderung starten. Für eine Zoneneigenschaft wird mitunsubscribe(IVehicleCallback callback, int32_t propId)
(StatusCode status);
generiert.
Die VHAL verwendet die folgenden Callback-Schnittstellen:
oneway onPropertyEvent(vec<VehiclePropValue>propValues);
Benachrichtigt die Änderung des Werts der Fahrzeugeigenschaft. Sollte nur für abonnierte Properties erfolgen.oneway onPropertySetError(StatusCode errorCode,int32_t propId,int32_tareaId);
Gibt einen globalen Fehler auf VHAL-Ebene oder einen Fehler pro Property zurück. Ein globaler Fehler führt zum Neustart der HAL, was zum Neustart anderer Komponenten (einschließlich Anwendungen) führen kann.
Fahrzeugeigenschaften
Properties können schreibgeschützt, nur lesbar (zum Übergeben von Informationen an die VHAL-Ebene) oder les- und schreibbar sein. Die Unterstützung der meisten Properties ist optional. Jede Property wird durch einen int32-Schlüssel eindeutig identifiziert und hat einen vordefinierten Typ (value_type
):
BYTES
BOOLEAN
EPOCH_TIME
FLOAT
FLOAT[]
INT32
INT32[]
INT64
INT64[]
STRING
MIXED
Ein Zonenattribut kann mehr als einen Wert haben, je nachdem, wie viele Zonen vom Attribut unterstützt werden.
Gebietstypen
Die VHAL definiert mehrere Gebietstypen:
Gebietstyp | Beschreibung |
---|---|
GLOBAL |
Diese Property ist ein Singleton und hat keine weiteren Bereiche. |
WINDOW |
Bereich basierend auf Fenstern, verwendet VehicleAreaWindow enum. |
MIRROR |
Bereich basierend auf Spiegeln, verwendet VehicleAreaMirror enum. |
SEAT |
Bereich basierend auf Sitzplätzen, verwendet VehicleAreaSeat -Enum. |
DOOR |
Bereich basierend auf Türen, verwendet VehicleAreaDoor -Enum. |
WHEEL |
Fläche basierend auf Rädern, verwendet VehicleAreaWheel -Enum. |
Für jedes in Zonen aufgeteilte Attribut muss ein vordefinierter Bereichstyp verwendet werden. Für jeden Gebietstyp gibt es eine Reihe von Bitflags, die in einem Enum für den Gebietstyp definiert sind. Zum Beispiel definiert der Bereich SEAT
VehicleAreaSeat
-Enums:
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
- …
Gebiets-IDs
Zonenspezifische Properties werden über Gebiets-IDs adressiert. Jedes Zonenobjekt kann eine oder mehrere Gebiets-IDs unterstützen. Eine Regions-ID besteht aus einem oder mehreren Flags aus dem entsprechenden Enum. Für eine Property mit VehicleAreaSeat
können beispielsweise die folgenden Gebiets-IDs verwendet werden:
Artikel | Beschreibung |
---|---|
ROW_1_LEFT | ROW_1_RIGHT |
Die Zonen-ID gilt für beide Vordersitze. |
ROW_2_LEFT |
Gilt nur für den linken Rücksitz. |
ROW_2_RIGHT |
Gilt nur für den rechten Rücksitz. |
Status der Unterkunft
Jeder Property-Wert hat einen VehiclePropertyStatus
-Wert.
Hier sehen Sie den aktuellen Status der Property:
Artikel | Beschreibung |
---|---|
AVAILABLE |
Die Property ist verfügbar und der Wert ist gültig. |
UNAVAILABLE |
Der Property-Wert ist derzeit nicht verfügbar. Wird für vorübergehend deaktivierte Funktionen für eine unterstützte Property verwendet. |
ERROR |
Mit dieser Property ist ein Fehler aufgetreten. |
Property konfigurieren
Verwenden Sie VehiclePropConfig
, um Konfigurationsinformationen für jedes Attribut anzugeben. Zu den Informationen gehören:
Variable | Beschreibung |
---|---|
access |
r , w , rw |
changeMode |
Gibt an, wie eine Property überwacht wird: bei Änderungen oder kontinuierlich. |
areaConfigs |
areaId , min und max |
configArray |
Zusätzliche Konfigurationsparameter. |
configString |
Zusätzliche Informationen, die als String übergeben werden. |
minSampleRate |
maxSampleRate |
prop |
Property-ID, Ganzzahl |
Zoneneigenschaften verarbeiten
Eine Zonen-Property entspricht einer Sammlung mehrerer Properties, auf die über den angegebenen Wert der Gebiets-ID zugegriffen werden kann.
- Der
get
-Aufruf für eine Zoneneigenschaft enthält immer die Gebiets-ID in der Anfrage. Daher wird nur der aktuelle Wert für die angeforderte Gebiets-ID zurückgegeben. Wenn es sich um eine globale Property handelt, ist die Gebiets-ID 0. - Der
set
-Aufruf für eine Zoneneigenschaft enthält immer die Gebiets-ID in der Anfrage. Daher wird nur die angeforderte Gebiets-ID geändert. - Bei einem
subscribe
-Aufruf werden Ereignisse für alle Gebiets-IDs der Property generiert.
Anrufe erhalten
Während der Initialisierung ist der Wert für die Property möglicherweise noch nicht verfügbar, da die entsprechende Nachricht des Fahrzeugnetzwerks noch nicht empfangen wurde. In solchen Fällen sollte der get
-Aufruf -EAGAIN
zurückgeben. Einige Unterkünfte (z. B. HLK) haben ein separates Attribut für Ein-/Ausschalten. Wenn get
für eine solche Eigenschaft aufgerufen wird, sollte bei ausgeschaltetem Gerät ein UNAVAILABLE
-Status zurückgegeben werden, anstatt einen Fehler. Beispiel: HLK-Temperatur abrufen
Abbildung 1 HLK-Temperatur abrufen (CS = CarService, VHAL = Fahrzeug-HAL)
Anrufe
Bei einem normalen Vorgang führt ein set
-Aufruf zu einer Änderungsanfrage im gesamten Fahrzeugnetzwerk. Ein set
-Aufruf ist idealerweise ein asynchroner Vorgang, der so schnell wie möglich zurückgegeben wird. Er kann aber auch synchron sein. Bei einigen set
-Aufrufen müssen möglicherweise erste Daten bereit sein. Während der Initialisierung sind solche Daten jedoch möglicherweise noch nicht verfügbar. In solchen Fällen sollte der set
-Aufruf StatusCode#TRY_AGAIN
zurückgeben. Bei einigen Unterkünften mit separatem Ein- und Ausschalten sollte StatusCode#NOT_AVAILABLE
oder StatusCode#NOT_AVAILABLE_DISABLED
zurückgegeben werden, wenn die Unterkunft ausgeschaltet ist und set
nicht durchgeführt werden kann. Bis set
wirksam wird, gibt get
nicht unbedingt den festgelegten Wert zurück. Beispiel: set HVAC Temperature
.
Abbildung 2: HLK-Temperatur festlegen (CS = CarService, VHAL = Fahrzeug-HAL)
Benutzerdefinierte Eigenschaften verarbeiten
Zur Unterstützung partnerspezifischer Anforderungen lässt die VHAL benutzerdefinierte Attribute zu, die auf System-Apps beschränkt sind. Beachten Sie beim Arbeiten mit benutzerdefinierten Properties die folgenden Richtlinien:
- Die Property-ID sollte mit den folgenden Feldern generiert werden:
VehiclePropertyGroup:VENDOR
Die GruppeVENDOR
wird nur für benutzerdefinierte Properties verwendet.VehicleArea
Wählen Sie einen geeigneten Gebietstyp aus.VehiclePropertyType
Wählen Sie den richtigen Datentyp aus. DerBYTES
-Typ ermöglicht die Weitergabe von Rohdaten, was in den meisten Fällen ausreicht. Wenn Sie häufig Big Data über benutzerdefinierte Properties senden, kann das den Zugriff auf das gesamte Fahrzeugnetzwerk verlangsamen. Seien Sie daher vorsichtig, wenn Sie eine große Nutzlast hinzufügen.Property ID
Wählen Sie eine vierstellige Nibble-ID für die benutzerdefinierte Property aus.
- Um eine Fragmentierung der Umgebung zu vermeiden, dürfen keine benutzerdefinierten Eigenschaften verwendet werden, um Fahrzeugeigenschaften zu replizieren, die bereits im SDK (VehiclePropertyIds) vorhanden sind.
- Geben Sie in
VehiclePropConfig.configString
eine kurze Beschreibung der benutzerdefinierten Eigenschaft ein. So können Tools zur Plausibilitätsprüfung die versehentliche Replikation vorhandener Fahrzeugeigenschaften melden. Beispiel: „Stand der Warnblinkanlage“. - Zugriff über
CarPropertyManager
(für Java-Komponenten) oder über die Vehicle Network Service API (für native Apps). Ändern Sie keine anderen Auto-APIs, da dies zu zukünftigen Kompatibilitätsproblemen führen kann. - Wählen Sie nach der Implementierung von Anbieter-Properties nur die Berechtigungsliste im
VehicleVendorPermission
-Enum für Anbieter-Properties aus. Wenn Sie Anbieterberechtigungen Systemeigenschaften zuordnen, funktionieren CTS und VTS nicht mehr.
Umgang mit den Eigenschaften des Heizungs-/Lüftungs-/Klimasystems
Sie können die VHAL verwenden, um die HLK zu steuern, indem Sie HLK-bezogene Eigenschaften festlegen. Die meisten HLK-Properties sind Zonen-Properties, einige sind jedoch nicht zoniert (global). Beispiele für definierte Properties:
Attribut | Zweck |
---|---|
VEHICLE_PROPERTY_HVAC_TEMPERATURE_SET |
Stelle die Temperatur pro Zone ein. |
VEHICLE_PROPERTY_HVAC_RECIRC_ON |
Umwälzung pro Zone steuern |
Eine vollständige Liste der HLK-Properties finden Sie in types.hal
unter VEHICLE_PROPERTY_HVAC_*
. Wenn für die HLK-Property VehicleAreaSeat
verwendet wird, gelten zusätzliche Regeln für die Zuordnung einer HLK-Property mit Zonen zu Gebiets-IDs. Jeder verfügbare Platz im Auto muss Teil einer Bereichs-ID im Array „Area ID“ (Bereichs-ID) sein.
Beispiel 1: Ein Auto hat zwei Vordersitze (ROW_1_LEFT, ROW_1_RIGHT
) und drei Rücksitze (ROW_2_LEFT, ROW_2_CENTER, ROW_2_RIGHT
). Es hat zwei Temperaturregler: auf der Fahrer- und der Beifahrerseite.
- Ein gültiger Zuordnungssatz von Gebiets-IDs für
HVAC_TEMPERATURE SET
ist:ROW_1_LEFT | ROW_2_LEFT
ROW_1_RIGHT | ROW_2_CENTER | ROW_2_RIGHT
- Eine alternative Zuordnung für dieselbe Hardwarekonfiguration ist:
ROW_1_LEFT | ROW_2_LEFT | ROW_2_CENTER
ROW_1_RIGHT | ROW_2_RIGHT
Beispiel 2 Ein Auto hat drei Sitzreihen mit zwei Sitzen in der ersten Reihe (ROW_1_LEFT, ROW_1_RIGHT
), drei Sitzen in der zweiten Reihe (ROW_2_LEFT, ROW_2_CENTER, ROW_2_RIGHT
) und drei Sitzen in der dritten Reihe (ROW_3_LEFT, ROW_3_CENTER, ROW_3_RIGHT
). Das Auto hat drei Temperaturregler: Fahrerseite, Beifahrerseite und Rückseite. Eine sinnvolle Möglichkeit, HVAC_TEMPERATURE_SET
Flächen-IDs zuzuordnen, ist ein Array mit drei Elementen:
ROW_1_LEFT
ROW_1_RIGHT
ROW_2_LEFT | ROW_2_CENTER | ROW_2_RIGHT | ROW_3_LEFT | ROW_3_CENTER | ROW_3_RIGHT
Sensoreigenschaften verarbeiten
VHAL-Sensoreigenschaften stellen echte Sensordaten oder Richtlinieninformationen wie den Fahrstatus dar. Auf einige Sensordaten (z. B. Fahrstatus und Tag-/Nachtmodus) kann jede App uneingeschränkt zugreifen, da die Daten obligatorisch sind, um eine sichere Fahrzeuganwendung zu erstellen. Andere Sensorinformationen (z. B. die Fahrzeuggeschwindigkeit) sind sensibler und erfordern bestimmte Berechtigungen, die Nutzer verwalten können.
Siehe die unterstützten Sensoreigenschaften (in types.hal
).
Fahrzeugkartendienst
Der Fahrzeugkartendienst (Vehicle Map Service, VMS) bietet einen Mechanismus zum Austausch von Kartendaten zwischen Clients über eine Pub/Sub-Schnittstelle, um gängige Fahrzeugfunktionen wie erweiterte Fahrerassistenzsysteme (Advanced Driver Assistance Systems, ADAS) zu unterstützen. Clients können Fahrzeugsysteme umfassen, die über die VMS-Eigenschaft in der VHAL oder über privilegierte Android-Anwendungen kommunizieren. Die auf VMS freigegebenen Daten sollen beschränkt werden, um Daten zur Verwendung durch Fahrzeugsysteme und unterstützende Anwendungen zuzuordnen.
VMS ist nur für Android Automotive-Implementierungen vorgesehen. AOSP enthält keine Standardclients, die VMS veröffentlichen oder abonnieren. Für die VMS-Eigenschaft in der VHAL werden die Nachrichtentypen und Datenstrukturen in VHAL 2.0 im Enum VmsMessageType
beschrieben, in dem die Typen der unterstützten VMS-Nachrichten aufgeführt sind. Dieser Enum wird als erste Ganzzahl im Array der Ganzzahlen der Fahrzeugeigenschaft verwendet und bestimmt, wie der Rest der Nachricht decodiert wird.