Étendre les descriptions des propriétés VHAL dans l'émulateur

Android Automotive OS (AAOS) contient des propriétés VHAL courantes qui peuvent être consultées dans la fenêtre VHAL d'un émulateur. Vous pouvez ainsi consulter de nombreuses informations sur les VHAL, y compris les noms, les descriptions et la signification des valeurs. Les informations sont extraites des métadonnées des propriétés VHAL, qui sont codées en dur dans l'émulateur QEMU.

Lorsque vous ajoutez vos propres propriétés VHAL à utiliser exclusivement sur vos appareils, l'affichage des métadonnées VHAL dans la fenêtre VHAL nécessite de modifier le code et de créer un émulateur QEMU personnalisé. Pour contourner ce problème, vous pouvez écrire vos propres descriptions au format JSON et les ajouter à votre image système.

Présentation

Cette page explique comment étendre les descriptions des propriétés VHAL dans un émulateur AAOS.

Créer des métadonnées JSON pour étendre les propriétés VHAL

L'émulateur recherche des métadonnées supplémentaires dans tous les fichiers se terminant par -types-meta.json dans le chemin d'accès de l'appareil virtuel Android (AVD). Les fichiers JSON doivent se composer d'un tableau d'objets Enum, comme illustré ci-dessous.

Objet enum

L'objet Enum portant le nom VehicleProperty est un cas particulier, car vous pouvez le considérer comme une racine. Son contenu est ajouté à la carte des propriétés des véhicules. Les autres Enums (avec un nom autre que VehicleProperty) définissent des mappages des noms des valeurs personnalisées.

Enum: {
  "name" : String,
  "values" : Array of { ValueObject }
}  

ValueObject

ValueObject: {
  "name" : String,
  "value" : Integer,
  "data_enum" : String, VehicleProperty only, optional,
}

Pour VehicleProperty, le nom Enum décrit la façon dont cette propriété est affichée dans la fenêtre VHAL de l'émulateur. La valeur correspond à l'property_id de la propriété décrite par le ValueObject. data_enum associe ValueObject à un autre Enum. Cette association permet de mapper une valeur dans une chaîne lisible par l'humain et n'existe que pour ValueObjects dans Enum pour VehicleProperty. Voici un exemple de VehicleProperty:

[
  {
      "name": "VehicleProperty",
      "values": [
          {
              "name": "CURRENT_GEAR",
              "value": 289408001
          }
      ]
  }
]

Dans cet exemple, un property_id avec un value de 289408001 est fourni en tant que name pour CURRENT_GEAR. Dans l'émulateur, cette propriété est déjà codée en dur sous le nom Current Gear (Vitesse actuelle). (Vous ne pouvez pas reproduire ce scénario, car cette page a été créée après la suppression de toutes les propriétés codées en dur à des fins de démonstration.)

Figure 1 : VehicleProperty défini avec un nom et une valeur.

Dans l'onglet Propriétés VHAL de l'émulateur, le nom est actualisé pour afficher CURRENT_GEAR, comme prévu.

data_enum

Dans l'exemple ci-dessus, la valeur affichée est 4 lorsque la vitesse est définie sur P.

Figure 2. Valeur affichée sous la forme de 4.

Comme prévu, dans l'onglet VHAL Properties (Propriétés VHAL) de l'émulateur, le nom s'affiche sous la forme CURRENT_GEAR. Contrairement à l'émulateur existant, où il est affiché sous la forme P.

enum VehicleGear {
  GEAR_UNKNOWN = 0x0000,
  GEAR_NEUTRAL = 0x0001,
  GEAR_REVERSE = 0x0002,
  GEAR_PARK = 0x0004,
  GEAR_DRIVE = 0x0008,
  GEAR_1 = 0x0010,
  GEAR_2 = 0x0020,
  GEAR_3 = 0x0040,
  GEAR_4 = 0x0080,
  GEAR_5 = 0x0100,
  GEAR_6 = 0x0200,
  GEAR_7 = 0x0400,
  GEAR_8 = 0x0800,
  GEAR_9 = 0x1000,
}

Pour en savoir plus, consultez la définition de AIDL.

Comme indiqué dans l'AIDL, la valeur de la vitesse Park est 4, ce qui signifie que vous devez traduire la valeur 4 en P. C'est le cas lorsque vous utilisez data_enum, qui mappe cette valeur de propriété à une chaîne lisible par l'humain dans un autre Enum. L'émulateur utilise cette carte pour traduire les valeurs des propriétés. Exemple :

[
    {
        "name": "VehicleProperty",
        "values": [
            {
                "name": "CURRENT_GEAR",
                "value": 289408001,
                "data_enum": "VehicleGear"
            }
        ]
    },
    {
        "name": "VehicleGear",
        "values": [
            {
                "name": "GEAR_UNKNOWN",
                "value": 0
            },
            {
                "name": "GEAR_PARK",
                "value": 4
            }
        ]
    }

]

Ajoutez "data_enum": "VehicleGear" pour que l'émulateur utilise un Enum nommé VehicleGear pour traduire la valeur de la propriété. Ajoutez un autre Enum nommé VehicleGear, dont la valeur est un tableau de ValueObject, où la valeur de la propriété (avec la valeur) doit s'afficher sous forme de nom.

Figure 3. Valeur affichée sous la forme GEAR_PARK.

Dans l'onglet VHAL Properties (Propriétés VHAL) de l'émulateur, le nom est actualisé pour afficher CURRENT_GEAR, comme prévu. La valeur de la propriété 4 s'affiche sous la forme GEAR_PARK.

Utiliser des métadonnées JSON pour étendre les propriétés VHAL

Pour utiliser des métadonnées JSON pour étendre vos propriétés VHAL, exécutez ce script Python (contenant la source Android) pour générer le fichier JSON de la propriété étendue à partir des informations de l'AIDL.

Le fichier JSON généré inclut des valeurs redondantes, telles que change_mode, access et unit. Bien que ces informations fassent partie de la propriété VHAL, ces valeurs JSON n'affectent pas ce qui s'affiche dans la fenêtre de propriété VHAL de l'émulateur.

Ajouter des métadonnées JSON à l'image système

N'oubliez pas qu'un nom de fichier doit se terminer par -types-meta.json. Sinon, le fichier est ignoré.

Ajouter une cible de compilation

Ajoutez le fichier -types-meta.json au PRODUCT_COPY_FILE. Par exemple :

PRODUCT_COPY_FILES += \
    device/generic/car/common/vehicle-types-meta.json:vehicle-types-meta.json

Ce code copie le fichier dans out/target/product/{your_target_path}/, la racine de la sortie cible compilée.