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

Le système d'exploitation Android Automotive (AAOS) contient des propriétés VHAL communes qui peuvent être affichées dans la fenêtre VHAL d'un émulateur. En conséquence, vous pouvez afficher une multitude d'informations sur les VHAL, notamment 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 pour une utilisation exclusive sur vos appareils, l'affichage des métadonnées VHAL dans la fenêtre VHAL vous oblige à modifier le code et à créer un émulateur QEMU personnalisé. Pour contourner ce problème, vous pouvez écrire vos propres descriptions au format JSON et les intégrer à votre image système.

Aperçu

Cette page explique comment vous pouvez é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 du périphérique virtuel Android (AVD). Les fichiers JSON devraient être constitués d'un tableau d'objets Enum , comme indiqué ci-dessous.

Objet d'énumération

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

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

ObjetValeur

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

Pour VehicleProperty , le nom Enum décrit comment cette propriété est affichée dans la fenêtre VHAL de l'émulateur. La valeur est le property_id de la propriété décrite par ValueObject . data_enum associe ValueObject à un autre Enum . Cette association est utilisée pour mapper une valeur dans une chaîne lisible par l'homme et existe uniquement pour ValueObjects dans l' Enum du VehicleProperty . Un exemple de VehicleProperty est présenté ci-dessous :

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

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

Figure 1. VehicleProperty défini avec le nom et la valeur.

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

data_enum

Dans l'exemple ci-dessus, la valeur affichée est 4 lorsque le rapport est réglé sur P .

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

Comme prévu, dans l'onglet Propriétés VHAL de l'émulateur, le nom apparaît sous la forme CURRENT_GEAR . Cela contraste avec 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 AIDL .

Comme défini dans l'AIDL, la valeur de l'engrenage Park est 4 , ce qui signifie que vous devez traduire la valeur 4 en P . C'est à ce moment-là que vous utilisez data_enum , qui mappe cette valeur de propriété à une chaîne lisible par l'homme dans un autre Enum . L'émulateur utilise cette carte pour traduire les valeurs des propriétés. Par 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 une Enum nommée VehicleGear pour traduire la valeur de la propriété. Ajoutez une autre Enum nommée VehicleGear avec la valeur étant un tableau de ValueObject , où la valeur de la propriété (avec la valeur) doit être affichée sous forme de nom.

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

Dans l'onglet Propriétés VHAL de l'émulateur, le nom est actualisé pour lire CURRENT_GEAR , comme prévu. La valeur de propriété 4 est affichée sous la forme GEAR_PARK .

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

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

Le JSON résultant 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 est affiché 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 build

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 votre sortie cible construite.