VHAL-Schnittstelle

Die AIDL VHAL wird in der android.hardware.automotive.vehicle namespace Die VHAL-Schnittstelle wird unter IVehicle.aidl Sofern nicht anders angegeben, müssen alle Methoden implementiert werden.

Method
VehiclePropConfigs getAllPropConfigs()
Gibt eine Liste aller Unterstützte Property-Konfigurationen von diesem Fahrzeug-HAL.
VehiclePropConfigs getPropConfigs(in int[] props)
Gibt eine Liste mit Property-Konfigurationen für bestimmte Property-IDs.
void getValues(IVehicleCallback callback, in GetValueRequests requests)
Rufen Sie Werte für Fahrzeugeigenschaften asynchron ab. Verarbeitet einen Batch von GetValueRequest asynchron. Das Ergebnis wird über die onGetValues-Callback-Methode
void setValues(IVehicleCallback callback, in SetValueRequests requests)
Legen Sie Werte für Fahrzeugeigenschaften asynchron fest. Verarbeitet einen Batch SetValueRequest asynchron. Das Ergebnis wird über die onSetValues-Callback-Methode
void subscribe(in IVehicleCallback callback, in SubscribeOptions[] options, int maxSharedMemoryFileCount)
Abonniert Property-Ereignisse mit den angegebenen Optionen. Die Abooptionen umfassen Property-ID, Property-Bereichs-ID und Abtastrate in Hz (für eine kontinuierliche Property). maxSharedMemoryFileCount wird nicht verwendet.
void unsubscribe(in IVehicleCallback callback, in int[] propIds)
Kündigt zuvor abonnierte Property-Ereignisse für bestimmte Properties.
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
Nicht verwendet und kann als No-Op implementiert werden.

Die Callbacks werden unter IVehicleCallback.aidl und enthält diese Methoden.

Method
oneway void onGetValues(in GetValueResults responses)
Callback für die getValues-Funktion zum Liefern von Wertergebnissen. Angerufen wenn einige der abzurufenden Werte bereit sind.
oneway void onSetValues(in SetValueResults responses)
Callback für die setValues-Funktion zum Liefern festgelegter Werte. Angerufen, wenn VHAL hat die Verarbeitung einiger Eigenschaftensatzanforderungen abgeschlossen.
oneway void onPropertyEvent(in VehiclePropValues propValues, int sharedMemoryFileCount)
Callback zum Melden von Property-Aktualisierungsereignissen.
CONTINUOUS Property passiert, basiert ein Property-Ereignis auf der Abtastrate für Abos. in Hz oder die Nachrichtenfrequenz im Fahrzeugbus. Ein Property-Ereignis kann auch auftreten, wenn die Statusänderungen. z. B. von „Nicht verfügbar“ zu „Verfügbar“.
Für die Property ON_CHANGE erfolgt ein Property-Ereignis, wenn der Wert einer Property oder der Status einer Unterkunft ändert.
SharedMemoryFileCount ist immer 0.
oneway void onPropertySetError(in VehiclePropErrors errors)
Callback zum Melden von asynchronen Property-Satz-Fehlern, die keinen entsprechenden Satz haben Wenn wir wissen, für welche Anfrage der Fehler gilt, onSetValues mit einem muss stattdessen verwendet werden.

Weitere Informationen finden Sie unter iVehicle.aidl und IVehicleCallback.aidl:

Die VHAL-Implementierung wird von den VHAL VTS unter VtsHalAutomotiveVehicle_TargetTest.cpp. Mit dem Test wird geprüft, ob die grundlegenden Methoden korrekt implementiert sind und die unterstützte Property Konfiguration korrekt sind.

Wert der Fahrzeugeigenschaft

Verwenden Sie die Methode VehiclePropValue zur Beschreibung des Werts jeder Eigenschaft, die die folgenden Felder enthält:

Feld Beschreibung
timestamp Der Zeitstempel, der den Zeitpunkt angibt, an dem das Ereignis eingetreten ist und mit dem Uhr: SystemClock.elapsedRealtimeNano().
prop Die Property-ID für diesen Wert.
areaid Die Bereichs-ID für diesen Wert. Das Gebiet muss eines der unterstützten Gebiete sein, das dort aufgeführt ist. ID-Konfiguration oder 0 für globale Properties.
value Eine Datenstruktur, die den tatsächlichen Property-Wert enthält. Je nach Property-Typ werden weitere Felder in diesem Feld verwendet, um den tatsächlichen Wert zu speichern. Zum Beispiel könnte die erste Das Element in value.int32Values wird für Int32-Typ-Properties verwendet. Weitere Informationen finden Sie unter Eigenschaften Konfigurationen.

Asynchrones getValues und setValues

Die Vorgänge getValues und setValues werden asynchron ausgeführt. d. h., die Funktion könnte zurückgegeben werden, bevor der eigentliche Get- oder Set-Vorgang abgeschlossen ist. Die Ergebnisse des Vorgangs (z. B. Attributwert für getValues und Erfolg oder Fehlerstatus für setValues) werden über die Callbacks übergeben, die als Argumente übergeben werden.

Die Implementierung darf das Ergebnis im Binder-Thread, der die Anfrage verarbeitet, nicht blockieren. Stattdessen empfehlen wir, 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 für Details.

Abbildung 1: Asynchroner Prozess.

Große Grundstücke

Alle Gebäude mit dem Namen XXXs, z. B. VehiclePropConfigs, SetValueRequests und VehiclePropValues werden aufgerufen LargeParcelable (oder StableLargeParcelable). Jedes steht für eine Liste von Werte, die zur Weitergabe großer Daten verwendet werden, die die Binder-Beschränkungen überschreiten können (4 KB in der LargeParcelable-Bibliotheksimplementierung) über Bindergrenzen hinweg. Jedes hat ein ähnliches Strukturdefinition, die die folgenden Felder enthält.

Anleitung Beschreibung
payloads Liste von Werten, wenn die Wertgröße in eine Binder-Speicherbeschränkung passt, oder eine leere Liste.
sharedMemoryFd Dateideskriptor mit Null-Zulässigkeit, der auf eine Datei im gemeinsamen Arbeitsspeicher verweist, in der die serialisierte Datei gespeichert ist Nutzlasten hinzu, wenn die Liste der Werte zu lang ist.

VehiclePropConfigs ist beispielsweise so 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 eine Nicht-Null-Werte sharedMemoryFd.

  • Wenn payloads nicht leer ist, wird eine Liste der tatsächlichen Daten gespeichert, also der Wert Property-Konfiguration.
  • Wenn sharedMemoryFd nicht null ist, enthält er eine Datei mit gemeinsam genutztem Arbeitsspeicher, in der serialisierten Struktur von VehiclePropConfigs. Die Struktur verwendet die writeToParcel, um ein Paket 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 wird eine LargeParcelable sollte serialisiert und deserialisiert werden mit dem LargeParcelable Bibliothek oder eine nützliche Wrapper-Klasse für die Bibliothek in ParcelableUtils.h

Beispiel: Ein nativer Client parst Anfragen für getValues, die von einem Binder empfangen wurden. lautet:

// '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 VHAL-Beispielimplementierung, die Ergebnisse für getValues über den Binder sendet, ist (siehe unten):

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