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()
|
|
VehiclePropConfigs getPropConfigs(in int[] props)
|
|
void getValues(IVehicleCallback callback, in GetValueRequests requests)
GetValueRequest de manière asynchrone. Le résultat est envoyé via la
Méthode de rappel onGetValues . |
|
void setValues(IVehicleCallback callback, in SetValueRequests requests)
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)
maxSharedMemoryFileCount n'est pas utilisé. |
|
void unsubscribe(in IVehicleCallback callback, in int[] propIds)
|
|
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
|
Les rappels sont définis
IVehicleCallback.aidl
et contient ces méthodes.
Méthode | |
---|---|
oneway void onGetValues(in GetValueResults responses)
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)
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)
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".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)
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 deVehiclePropConfigs
. La structure utilise lewriteToParcel
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::vectorresults = getResults(); GetValueResults parcelableResults; ScopedAStatus status = vectorToStableLargeParcelable(std::move(results), &parcelableResults); if (status.isOk()) { // Send parcelableResults through callback. } else { // Handle error. }