VHAL-Schnittstelle

Das AIDL VHAL ist im android.hardware.automotive.vehicle namespace definiert. Die VHAL-Schnittstelle ist unter IVehicle.aidl definiert. Sofern nicht anders angegeben, müssen alle Methoden implementiert werden.

Methode
VehiclePropConfigs getAllPropConfigs()
Gibt eine Liste aller von diesem Fahrzeug-HAL unterstützten Eigenschaftskonfigurationen zurück.
VehiclePropConfigs getPropConfigs(in int[] props)
Gibt eine Liste von Eigenschaftskonfigurationen für bestimmte Eigenschafts-IDs zurück.
void getValues(IVehicleCallback callback, in GetValueRequests requests)
Fahrzeugeigenschaftswerte asynchron abrufen. Behandelt einen Batch von GetValueRequest asynchron. Das Ergebnis wird über die Rückrufmethode onGetValues ​​geliefert.
void setValues(IVehicleCallback callback, in SetValueRequests requests)
Legen Sie Fahrzeugeigenschaftswerte asynchron fest. Behandelt einen Stapel von SetValueRequest asynchron. Das Ergebnis wird über die Rückrufmethode onSetValues ​​geliefert.
void subscribe(in IVehicleCallback callback, in SubscribeOptions[] options, int maxSharedMemoryFileCount)
Abonniert Eigenschaftsereignisse mit angegebenen Optionen. Zu den Abonnementoptionen gehören die Eigenschafts-ID, die Eigenschaftsbereichs-ID und die Abtastrate in Hz (für eine kontinuierliche Eigenschaft). maxSharedMemoryFileCount wird nicht verwendet.
void unsubscribe(in IVehicleCallback callback, in int[] propIds)
Meldet zuvor abonnierte Eigenschaftsereignisse für bestimmte Eigenschaften ab.
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
Wird nicht verwendet und kann als No-Op implementiert werden.

Die Rückrufe sind in IVehicleCallback.aidl definiert und enthalten diese Methoden.

Methode
oneway void onGetValues(in GetValueResults responses)
Rückruf für die getValues Funktion, um Get-Values-Ergebnisse zu liefern. Wird aufgerufen, wenn einige der abzurufenden Werte bereit sind.
oneway void onSetValues(in SetValueResults responses)
Rückruf für die Funktion setValues , um festgelegte Wertergebnisse zu liefern. Wird aufgerufen, wenn VHAL die Verarbeitung einiger Eigenschaftensatzanforderungen abgeschlossen hat.
oneway void onPropertyEvent(in VehiclePropValues propValues, int sharedMemoryFileCount)
Rückruf zum Melden von Eigenschaftsaktualisierungsereignissen.
Bei der Eigenschaft CONTINUOUS erfolgt ein Eigenschaftsereignis basierend auf der Abonnement-Abtastrate in Hz oder der Nachrichtenfrequenz des Fahrzeugbusses. Ein Eigenschaftsereignis kann auch eintreten, wenn sich der Status einer Eigenschaft ändert. Beispielsweise von „nicht verfügbar“ zu „verfügbar“.
Bei der Eigenschaft ON_CHANGE tritt ein Eigenschaftsereignis ein, wenn sich der Wert oder der Status einer Eigenschaft ändert.
SharedMemoryFileCount ist immer 0 .
oneway void onPropertySetError(in VehiclePropErrors errors)
Rückruf zum Melden von asynchronen Eigenschaftssatzfehlern, für die es keine entsprechende Satzanforderung gibt. Wenn wir wissen, für welche Set-Anforderung der Fehler vorliegt, müssen stattdessen onSetValues ​​mit einem Fehlerergebnis verwendet werden.

Weitere Informationen finden Sie unter IVehicle.aidl und IVehicleCallback.aidl .

Die VHAL-Implementierung wird vom VHAL VTS unter VtsHalAutomotiveVehicle_TargetTest.cpp validiert. Der Test überprüft, ob grundlegende Methoden korrekt implementiert sind und die unterstützten Eigenschaftskonfigurationen korrekt sind.

Wert des Fahrzeugeigentums

Verwenden Sie die Struktur VehiclePropValue , um den Wert jeder Eigenschaft zu beschreiben, die über die folgenden Felder verfügt:

Feld Beschreibung
timestamp Der Zeitstempel, der den Zeitpunkt des Ereignisses darstellt und mit der SystemClock.elapsedRealtimeNano() Uhr synchronisiert ist.
prop Die Eigenschafts-ID für diesen Wert.
areaid Die Bereichs-ID für diesen Wert. Der Bereich muss einer der unterstützten Bereiche sein, die in der Bereichs-ID-Konfiguration aufgeführt sind, oder 0 für globale Eigenschaften.
value Eine Datenstruktur, die den tatsächlichen Eigenschaftswert enthält. Je nach Eigenschaftstyp werden ein oder mehrere Felder innerhalb dieses Feldes zum Speichern des tatsächlichen Werts verwendet. Beispielsweise wird das erste Element in value.int32Values ​​für Eigenschaften vom Typ Int32 verwendet. Einzelheiten finden Sie unter Eigenschaftskonfigurationen .

Asynchrone getValues ​​und setValues

Die Vorgänge getValues ​​und setValues ​​werden asynchron ausgeführt, was bedeutet, dass die Funktion möglicherweise zurückkehrt, bevor der eigentliche Get- oder Set-Vorgang abgeschlossen ist. Die Operationsergebnisse (z. B. Eigenschaftswert für getValues ​​und Erfolgs- oder Fehlerstatus für setValues ) werden über die als Argumente übergebenen Rückrufe übermittelt.

Die Implementierung darf das Ergebnis im Binder-Thread, der die Anforderung verarbeitet, nicht blockieren. Stattdessen empfehlen wir Ihnen, die Anfrage in einer Anfragewarteschlange zu speichern und einen separaten Handler-Thread zu verwenden, um die Anfragen asynchron zu verarbeiten. Weitere Informationen finden Sie in der Referenzimplementierung .

Abbildung 1. Asynchroner Prozess.

Große Parzellen

Alle Strukturen mit dem Namen XXXs , wie VehiclePropConfigs , SetValueRequests und VehiclePropValues ​​, heißen LargeParcelable (oder StableLargeParcelable ). Jeder stellt eine Liste von Werten dar, die zum Übergeben großer Datenmengen verwendet werden, die die Binderbeschränkungen (4 KB in der LargeParcelable Bibliotheksimplementierung) über Bindergrenzen hinweg überschreiten könnten. Jedes hat eine ähnliche Strukturdefinition, die die folgenden Felder enthält.

Orientierungshilfe Beschreibung
payloads Liste von Werten, wenn die Wertgröße innerhalb einer Ordnerspeicherbeschränkung liegt, oder eine leere Liste.
sharedMemoryFd Nullable-Dateideskriptor, der auf eine gemeinsam genutzte Speicherdatei verweist, in der die serialisierten Nutzlasten gespeichert werden, wenn die Werteliste zu groß ist.

VehiclePropConfigs ist beispielsweise wie folgt definiert:

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 enthält entweder nicht leere Nutzlasten oder einen sharedMemoryFd ungleich Null.

  • Wenn payloads nicht leer ist, wird eine Liste der tatsächlichen Daten gespeichert, bei der es sich um die Eigenschaft „config“ handelt.
  • Wenn sharedMemoryFd nicht null ist, enthält es eine gemeinsam genutzte Speicherdatei, die die serialisierte Struktur von VehiclePropConfigs speichert. Die Struktur verwendet die writeToParcel Funktion, um ein Parcel zu serialisieren.

Als Java-Client für VHAL übernimmt Car Service die Serialisierung und Deserialisierung für LargeParcelable . Für VHAL-Implementierungen und native Clients sollte ein LargeParcelable mit der LargeParcelable Bibliothek oder einer nützlichen Wrapper-Klasse für die Bibliothek in ParcelableUtils.h serialisiert und deserialisiert werden.

Beispielsweise sieht ein nativer Client, der von einem Ordner empfangene getValues Anforderungen analysiert, wie folgt aus:

// 'requests' are from the binder.
GetValueRequests requests;
expected, ScopedAStatus> deserializedResults = fromStableLargeParcelable(requests);
if (deserializedResults.ok()) {
    const std::vector& getValueRequests = deserializedResults.value().getObject()->payloads;
    // Use the getValueRequests.
  } else {
    // handle error.
}

Eine Beispiel-VHAL-Implementierung, die Ergebnisse für getValues ​​über den Binder sendet, ist unten dargestellt:

std::vector results = getResults();
GetValueResults parcelableResults;
ScopedAStatus status = vectorToStableLargeParcelable(std::move(results), &parcelableResults);
if (status.isOk()) {
    // Send parcelableResults through callback.
} else {
    // Handle error.
}