Interface VHAL

Le VHAL AIDL est défini dans android.hardware.automotive.vehicle namespace L'interface VHAL est définie au niveau IVehicle.aidl Sauf indication contraire, toutes les méthodes doivent être implémentées.

Méthode
VehiclePropConfigs getAllPropConfigs()
Renvoie la liste de tous les Configurations de propriétés acceptées par l'HAL de ce véhicule.
VehiclePropConfigs getPropConfigs(in int[] props)
Renvoie une liste de Configurations de propriétés pour les ID des propriétés.
void getValues(IVehicleCallback callback, in GetValueRequests requests)
Obtenez les valeurs des propriétés d'un véhicule de manière asynchrone. Gère un lot de GetValueRequest de manière asynchrone. Le résultat est envoyé via la Méthode de rappel onGetValues.
void setValues(IVehicleCallback callback, in SetValueRequests requests)
Définissez les valeurs des propriétés d'un véhicule de manière asynchrone. Gère un lot de SetValueRequest de manière asynchrone. Le résultat est envoyé via la Méthode de rappel onSetValues.
void subscribe(in IVehicleCallback callback, in SubscribeOptions[] options, int maxSharedMemoryFileCount)
S'abonne aux événements de l'établissement avec les options spécifiées. Les options d'abonnement incluent ID de la propriété, ID de la zone de la propriété et taux d'échantillonnage en Hz (pour une propriété continue). maxSharedMemoryFileCount n'est pas utilisé.
void unsubscribe(in IVehicleCallback callback, in int[] propIds)
Désabonne des événements de propriété précédemment abonnés pour des propriétés spécifiées.
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
Non utilisé et peut être implémenté en tant qu'opération no-op.

Les rappels sont définis IVehicleCallback.aidl et contient ces méthodes.

Méthode
oneway void onGetValues(in GetValueResults responses)
Rappel pour la fonction getValues afin de fournir des résultats d'obtention de valeur. Appelé lorsque certaines valeurs à récupérer sont prêtes.
oneway void onSetValues(in SetValueResults responses)
Rappel pour la fonction setValues afin de fournir des résultats associés à une valeur définie. Appelé lorsque Le VHAL a fini de traiter certaines requêtes d'ensemble de propriétés.
oneway void onPropertyEvent(in VehiclePropValues propValues, int sharedMemoryFileCount)
Rappel pour signaler les événements de mise à jour d'établissement.
CONTINUOUS, un événement de propriété se produit en fonction du taux d'échantillonnage des abonnements. en Hz ou en fréquence des messages de bus du véhicule. Un événement de propriété peut également se produire les changements d'état. Par exemple, de "indisponible" à "disponible".
Pour la propriété ON_CHANGE, un événement de propriété se produit lorsque la valeur d'une propriété ou si l'état d'une propriété change.
SharedMemoryFileCount est toujours 0.
oneway void onPropertySetError(in VehiclePropErrors errors)
Rappel pour signaler les erreurs d'ensemble de propriétés asynchrones sans ensemble correspondant requête. Si nous savons à quelle requête d'ensemble l'erreur concerne, onSetValues avec une le résultat d'erreur doit être utilisé à la place de celui-ci.

Pour en savoir plus, consultez IVehicle.aidl et IVehicleCallback.aidl

L’implémentation VHAL est validée par le VHAL VHAL au niveau VtsHalAutomotiveVehicle_TargetTest.cpp : Le test vérifie que les méthodes de base sont correctement implémentées et que la propriété compatible sont correctes.

Valeur de la propriété du véhicule

Utilisez les VehiclePropValue structure pour décrire la valeur de chaque propriété, qui comporte les champs suivants:

Champ Description
timestamp Le code temporel représentant l'heure à laquelle l'événement s'est produit et synchronisé avec le SystemClock.elapsedRealtimeNano() horloge.
prop ID de propriété pour cette valeur.
areaid Identifiant de zone pour cette valeur. La zone doit faire partie des zones couvertes listées Configuration de l'ID, ou 0 pour les propriétés globales.
value Une structure de données contenant la valeur réelle de la propriété. Selon le type de propriété, plusieurs champs dans ce champ sont utilisés pour stocker la valeur réelle. Par exemple, le premier dans value.int32Values est utilisé pour les propriétés de type Int32. Pour en savoir plus, consultez Propriété Configurations.

Valeurs getValues et setValues asynchrones

Les opérations getValues et setValues sont effectuées de manière asynchrone. ce qui signifie que la fonction peut être renvoyée avant la fin de l'opération get ou set réelle. Les résultats de l'opération (par exemple, la valeur de la propriété pour getValues et l'état de réussite ou état d'erreur pour setValues) sont transmises via les rappels transmis en tant qu'arguments.

L'implémentation ne doit pas bloquer le résultat dans le thread de liaison qui gère la requête. Nous vous recommandons plutôt de stocker la requête dans une file d'attente de requêtes et d'utiliser un thread de gestionnaire distinct. pour gérer les requêtes de manière asynchrone. Consultez le Implémentation de référence pour plus de détails.

Figure 1 : Processus asynchrone.

Parcelables volumineux

Toutes les structures nommées XXXs, telles que VehiclePropConfigs, SetValueRequests et VehiclePropValues sont appelés LargeParcelable (ou StableLargeParcelable). Chaque représente une liste de utilisées pour transmettre des données volumineuses pouvant dépasser les limites de liaison (4 Ko dans l'implémentation de la bibliothèque LargeParcelable) au-delà des limites de liaison. Chacune d'elles présente définition de la structure contenant les champs suivants.

Conseils Description
payloads Liste de valeurs lorsque la taille de la valeur respecte une limite de mémoire de liaison, ou liste vide.
sharedMemoryFd Descripteur de fichier pouvant être de valeur nulle pointant vers un fichier de mémoire partagée qui stocke les données sérialisées si la liste des valeurs est trop longue.

Par exemple, VehiclePropConfigs est défini comme suit:

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 contient des charges utiles non vides ou une valeur non nulle sharedMemoryFd

  • Si payloads n'est pas vide, il stocke une liste des données réelles, qui correspond au la configuration de la propriété.
  • Si sharedMemoryFd n'est pas nul, il contient un fichier de mémoire partagée, qui stocke le structure sérialisée de VehiclePropConfigs. La structure utilise le writeToParcel pour sérialiser un élément Parcel.

En tant que client Java pour VHAL, Car Service gère la sérialisation et la désérialisation pour LargeParcelable Pour les implémentations VHAL et les clients natifs, LargeParcelable doit être sérialisé et désérialisé avec le LargeParcelable ou une classe wrapper utile pour la bibliothèque ParcelableUtils.h

Par exemple, un client natif analyse les requêtes pour getValues reçues d'un binder. se présente comme suit:

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

Voici un exemple d'implémentation VHAL qui envoie les résultats pour getValues via la liaison : comme indiqué ci-dessous:

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