Mở rộng nội dung mô tả thuộc tính VHAL trong trình mô phỏng

Android Automotive OS (AAOS) chứa các thuộc tính VHAL phổ biến mà bạn có thể xem trong cửa sổ VHAL của trình mô phỏng. Do đó, bạn có thể xem nhiều thông tin về VHAL, bao gồm tên, nội dung mô tả và ý nghĩa của các giá trị. Thông tin này được trích xuất từ siêu dữ liệu của các thuộc tính VHAL, được mã hoá cứng vào trình mô phỏng QEMU.

Khi thêm các thuộc tính VHAL của riêng bạn để sử dụng riêng trên thiết bị, bạn cần sửa đổi mã và tạo trình mô phỏng QEMU tuỳ chỉnh để xem siêu dữ liệu VHAL trong cửa sổ VHAL. Để giải quyết vấn đề này, bạn có thể viết nội dung mô tả của riêng mình ở định dạng JSON và thêm vào hình ảnh hệ thống.

Tổng quan

Trang này trình bày chi tiết cách bạn có thể mở rộng nội dung mô tả thuộc tính VHAL trong trình mô phỏng AAOS.

Tạo siêu dữ liệu JSON để mở rộng các thuộc tính VHAL

Trình mô phỏng tìm siêu dữ liệu bổ sung trong tất cả các tệp có đuôi -types-meta.json trong đường dẫn Thiết bị Android ảo (AVD). Tệp JSON dự kiến sẽ bao gồm một mảng các đối tượng Enum như minh hoạ bên dưới.

Đối tượng enum

Đối tượng Enum có tên VehicleProperty là một trường hợp đặc biệt trong đó bạn có thể coi đối tượng này là gốc. Nội dung của tệp này được thêm vào bản đồ thuộc tính xe. Các Enums khác (có tên khác với VehicleProperty) xác định các bản đồ tên của các giá trị tuỳ chỉnh.

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

ValueObject

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

Đối với VehicleProperty, tên Enum mô tả cách thuộc tính này hiển thị trong cửa sổ VHAL của trình mô phỏng. Giá trị này là property_id của thuộc tính do ValueObject mô tả. data_enum liên kết ValueObject với một Enum khác. Mối liên kết này được dùng để liên kết một giá trị vào một chuỗi mà con người có thể đọc được và chỉ tồn tại đối với ValueObjects trong Enum cho VehicleProperty. Dưới đây là ví dụ về VehicleProperty:

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

Trong ví dụ này, property_idvalue289408001 được cung cấp dưới dạng name cho CURRENT_GEAR. Trong trình mô phỏng, thuộc tính này đã được mã hoá cứng dưới dạng tên Current Gear (Băng số hiện tại). (Bạn không thể tái hiện trường hợp này vì trang này được tạo sau khi xoá tất cả các thuộc tính được mã hoá cứng cho mục đích minh hoạ.)

Hình 1. VehicleProperty được xác định bằng tên và giá trị.

Trong thẻ VHAL Properties (Thuộc tính VHAL) của trình mô phỏng, tên sẽ được làm mới để hiển thị là CURRENT_GEAR như dự kiến.

data_enum

Trong ví dụ trên, giá trị hiển thị là 4 khi chế độ số được đặt thành P.

Hình 2. Giá trị hiển thị là 4.

Như dự kiến, trên thẻ VHAL Properties (Thuộc tính VHAL) trong trình mô phỏng, tên sẽ xuất hiện là CURRENT_GEAR. Điều này trái ngược với trình mô phỏng hiện có, trong đó nút này hiển thị dưới dạng 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,
}

Để tìm hiểu thêm, hãy xem định nghĩa về AIDL.

Như đã xác định trong AIDL, giá trị của chế độ Đỗ xe4, nghĩa là bạn cần dịch giá trị 4 thành P. Đây là lúc bạn sử dụng data_enum để ánh xạ giá trị thuộc tính này đến một chuỗi mà con người có thể đọc được trong một Enum khác. Trình mô phỏng sử dụng bản đồ này để dịch các giá trị thuộc tính. Ví dụ:

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

]

Thêm "data_enum": "VehicleGear" để trình mô phỏng sử dụng Enum có tên là VehicleGear để dịch giá trị thuộc tính. Thêm một Enum khác có tên là VehicleGear với giá trị là một mảng ValueObject, trong đó giá trị thuộc tính (có giá trị) sẽ hiển thị dưới dạng tên.

Hình 3. Giá trị hiển thị dưới dạng GEAR_PARK.

Trên thẻ VHAL Properties (Thuộc tính VHAL) cho trình mô phỏng, tên sẽ được làm mới để hiển thị là CURRENT_GEAR, như dự kiến. Giá trị thuộc tính của 4 hiển thị dưới dạng GEAR_PARK.

Sử dụng siêu dữ liệu JSON để mở rộng các thuộc tính VHAL

Để sử dụng siêu dữ liệu JSON nhằm mở rộng các thuộc tính VHAL, hãy chạy tập lệnh Python này (có trong nguồn Android) để tạo JSON thuộc tính mở rộng từ thông tin trong AIDL.

JSON thu được bao gồm một số giá trị thừa, chẳng hạn như change_mode, accessunit. Mặc dù thông tin này là một phần của thuộc tính VHAL, nhưng các giá trị JSON này không ảnh hưởng đến nội dung hiển thị trong cửa sổ thuộc tính VHAL của trình mô phỏng.

Thêm siêu dữ liệu JSON vào hình ảnh hệ thống

Xin lưu ý rằng tên tệp phải kết thúc bằng -types-meta.json. Nếu không, tệp sẽ bị bỏ qua.

Thêm mục tiêu bản dựng

Thêm tệp -types-meta.json vào PRODUCT_COPY_FILE. Ví dụ:

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

Mã này sao chép tệp vào out/target/product/{your_target_path}/, thư mục gốc của đầu ra mục tiêu đã tạo.