Interface VHAL

L'AIDL VHAL est défini dans l' android.hardware.automotive.vehicle namespace . L'interface VHAL est définie dans IVehicle.aidl . Sauf indication contraire, toutes les méthodes doivent être mises en œuvre.

Méthode
VehiclePropConfigs getAllPropConfigs()
Renvoie une liste de toutes les configurations de propriétés prises en charge par ce véhicule HAL.
VehiclePropConfigs getPropConfigs(in int[] props)
Renvoie une liste de configurations de propriété pour les ID de propriété donnés.
void getValues(IVehicleCallback callback, in GetValueRequests requests)
Obtenez les valeurs des propriétés du véhicule de manière asynchrone. Gère un lot de GetValueRequest de manière asynchrone. Le résultat est fourni via la méthode de rappel onGetValues .
void setValues(IVehicleCallback callback, in SetValueRequests requests)
Définissez les valeurs des propriétés du véhicule de manière asynchrone. Gère un lot de SetValueRequest de manière asynchrone. Le résultat est fourni via la méthode de rappel onSetValues .
void subscribe(in IVehicleCallback callback, in SubscribeOptions[] options, int maxSharedMemoryFileCount)
Abonne aux événements de propriété avec les options spécifiées. Les options d'abonnement incluent l'ID de propriété, l'ID de zone de propriété et la fréquence d'échantillonnage en Hz (pour une propriété continue). maxSharedMemoryFileCount n'est pas utilisé.
void unsubscribe(in IVehicleCallback callback, in int[] propIds)
Désabonne les événements de propriété précédemment souscrits pour les propriétés spécifiées.
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
Non utilisé et peut être implémenté sans opération.

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

Méthode
oneway void onGetValues(in GetValueResults responses)
Rappel pour la fonction getValues ​​pour fournir des résultats d'obtention de valeur. Appelé lorsque certaines des valeurs à récupérer sont prêtes.
oneway void onSetValues(in SetValueResults responses)
Rappel de la fonction setValues ​​pour fournir des résultats de valeurs définies. Appelé lorsque 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 de propriété.
Propriété CONTINUOUS , un événement de propriété se produit en fonction du taux d'échantillonnage d'abonnement en Hz ou de la fréquence des messages du bus du véhicule. Un événement de propriété peut également se produire si le statut d'une propriété change. Par exemple, de indisponible à disponible.
Pour la propriété ON_CHANGE , un événement de propriété se produit lorsque la valeur ou le statut 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 qui n’ont pas de demande d’ensemble correspondante. Si nous savons à quelle requête d'ensemble correspond l'erreur, onSetValues ​​avec un résultat d'erreur doit être utilisé à la place.

Pour plus d’informations, consultez IVehicle.aidl et IVehicleCallback.aidl .

L'implémentation de VHAL est validée par le VHAL VTS sur VtsHalAutomotiveVehicle_TargetTest.cpp . Le test vérifie que les méthodes de base sont correctement implémentées et que les configurations de propriétés prises en charge sont correctes.

Valeur de la propriété du véhicule

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

Champ Description
timestamp L'horodatage représentant l'heure à laquelle l'événement s'est produit et synchronisé avec l'horloge SystemClock.elapsedRealtimeNano() .
prop L'ID de propriété pour cette valeur.
areaid L'ID de zone pour cette valeur. La zone doit être l'une des zones prises en charge répertoriées dans la configuration de l'ID de zone, ou 0 pour les propriétés globales.
value Une structure de données contenant la valeur réelle de la propriété. En fonction du type de propriété, un ou plusieurs champs de ce champ sont utilisés pour stocker la valeur réelle. Par exemple, le premier élément de value.int32Values ​​est utilisé pour les propriétés de type Int32. Pour plus de détails, consultez Configurations de propriétés .

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 que l'opération get ou set réelle ne soit terminée. Les résultats de l'opération (par exemple, la valeur de la propriété pour getValues ​​et le statut de réussite ou d'erreur pour setValues ​​) sont fournis via les rappels passés en arguments.

L'implémentation ne doit pas bloquer le résultat dans le thread de liaison qui gère la requête. Au lieu de cela, nous vous recommandons de stocker la demande dans une file d’attente de demandes et d’utiliser un thread de gestionnaire distinct pour gérer les demandes de manière asynchrone. Voir l' implémentation de référence pour plus de détails.

Figure 1. Processus asynchrone.

Gros colis

Toutes les structures nommées XXXs , telles que VehiclePropConfigs , SetValueRequests et VehiclePropValues ​​sont appelées LargeParcelable (ou StableLargeParcelable ). Chacun représente une liste de valeurs utilisées pour transmettre des données volumineuses susceptibles de dépasser les limites du classeur (4 Ko dans l'implémentation de la bibliothèque LargeParcelable ) au-delà des limites du classeur. Chacun a une définition de structure similaire qui contient les champs suivants.

Conseils Description
payloads Liste de valeurs lorsque la taille de la valeur correspond à une limitation de mémoire du classeur ou à une liste vide.
sharedMemoryFd Descripteur de fichier nullable pointant vers un fichier de mémoire partagée qui stocke les charges utiles sérialisées si la liste de valeurs est trop longue.

Par exemple, VehiclePropConfigs est défini comme :

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 soit des charges utiles non vides, soit un sharedMemoryFd non nul.

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

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

Par exemple, un client natif analysant les requêtes getValues ​​reçues d'un classeur est le suivant :

// '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.
}

Un exemple d'implémentation VHAL qui envoie les résultats pour getValues ​​via le classeur est présenté 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.
}