Giao diện VHAL

VHAL AIDL được xác định trong android.hardware.automotive.vehicle namespace. Giao diện VHAL được xác định tại IVehicle.aidl. Trừ phi được chỉ định, tất cả các phương thức đều phải được triển khai cho một phiên bản VHAL cụ thể.

Phiên bản

Phiên bản Android Phiên bản VHAL mới nhất Phiên bản mới nhất của thuộc tính VHAL Phiên bản VHAL tối thiểu tương thích
Android 16 V4 V4 V1
Android 15 V3 V3 V1
Android 14 V2 V2 V1
Android 13 V1 (Giao diện thuộc tính VHAL chưa được phân chia) V1

Bạn NÊN triển khai phiên bản VHAL mới nhất cho một phiên bản Android cụ thể.

Hàm và lệnh gọi lại

Các hàm VHAL được xác định tại IVehicle.aidl.

Phương thức
VehiclePropConfigs getAllPropConfigs()
Trả về danh sách tất cả Cấu hình thuộc tính mà HAL của xe này hỗ trợ.
VehiclePropConfigs getPropConfigs(in int[] props)
Trả về danh sách Cấu hình tài sản cho các mã tài sản đã cho.
void getValues(IVehicleCallback callback, in GetValueRequests requests)
Lấy giá trị thuộc tính của xe một cách không đồng bộ. Xử lý một lô GetValueRequest không đồng bộ. Kết quả được gửi qua phương thức gọi lại onGetValues.
void setValues(IVehicleCallback callback, in SetValueRequests requests)
Đặt giá trị thuộc tính của xe không đồng bộ. Xử lý một lô SetValueRequest theo cách không đồng bộ. Kết quả được gửi qua phương thức gọi lại onSetValues.
void subscribe(in IVehicleCallback callback, in SubscribeOptions[] options, int maxSharedMemoryFileCount)
Đăng ký các sự kiện thuộc tính với các lựa chọn được chỉ định. Các lựa chọn đăng ký bao gồm mã nhận dạng tài sản, mã nhận dạng khu vực tài sản và tốc độ lấy mẫu tính bằng Hz (đối với tài sản liên tục). maxSharedMemoryFileCount không được dùng.
void unsubscribe(in IVehicleCallback callback, in int[] propIds)
Huỷ đăng ký các sự kiện thuộc tính đã đăng ký trước đó cho các thuộc tính được chỉ định.
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
Không được dùng và có thể triển khai dưới dạng no-op.
(Tính năng mới trong Android 16)
SupportedValuesListResults getSupportedValuesLists(in List propIdAreaIds)
Nhận danh sách các giá trị được hỗ trợ cho các cặp mã nhận dạng tài sản và mã nhận dạng khu vực được chỉ định.
Ra mắt trong VHAL V4.
(Tính năng mới trong Android 16)
MinMaxSupportedValueResults getMinMaxSupportedValue(in List propIdAreaIds)
Nhận các giá trị tối thiểu và tối đa được hỗ trợ cho các cặp mã nhận dạng thuộc tính và mã nhận dạng khu vực đã chỉ định.
Ra mắt trong VHAL V4.
void registerSupportedValueChangeCallback(in IVehicleCallback callback, in List propIdAreaIds)
Đăng ký một lệnh gọi lại sẽ được gọi khi các giá trị được hỗ trợ thay đổi.
Ra mắt trong VHAL V4.
void unregisterSupportedValueChangeCallback(in IVehicleCallback callback, in List propIdAreaIds)
Huỷ đăng ký lệnh gọi lại thay đổi giá trị được hỗ trợ.
Ra mắt trong VHAL V4.

Các lệnh gọi lại được xác định tại IVehicleCallback.aidl và chứa các phương thức này.

Phương thức
oneway void onGetValues(in GetValueResults responses)
Lệnh gọi lại cho hàm getValues để phân phối kết quả nhận giá trị. Được gọi khi một số giá trị cần tìm nạp đã sẵn sàng.
oneway void onSetValues(in SetValueResults responses)
Lệnh gọi lại cho hàm setValues để phân phối kết quả giá trị đã đặt. Được gọi khi VHAL đã hoàn tất việc xử lý một số yêu cầu đặt thuộc tính.
oneway void onPropertyEvent(in VehiclePropValues propValues, int sharedMemoryFileCount)
Lệnh gọi lại để báo cáo các sự kiện cập nhật thuộc tính.
Thuộc tính
CONTINUOUS, sự kiện thuộc tính xảy ra dựa trên tốc độ lấy mẫu đăng ký theo Hz hoặc tần suất thông báo trên bus của xe. Sự kiện tài sản cũng có thể xảy ra nếu trạng thái của tài sản thay đổi. Ví dụ: từ không có sẵn thành có sẵn.
Đối với thuộc tính ON_CHANGE, sự kiện thuộc tính xảy ra khi giá trị hoặc trạng thái của một thuộc tính thay đổi.
Bạn cũng nên dùng phương thức này để phân phối các sự kiện thay đổi trạng thái của thuộc tính, ví dụ: khi thuộc tính không dùng được hoặc xảy ra lỗi khi đọc, bạn nên phân phối một VehiclePropValue có trạng thái không dùng được hoặc lỗi và giá trị trống.
SharedMemoryFileCount luôn là 0.
oneway void onPropertySetError(in VehiclePropErrors errors)
Lệnh gọi lại để báo cáo các lỗi không đồng bộ của tập hợp thuộc tính không có yêu cầu tập hợp tương ứng. Nếu chúng ta biết yêu cầu đặt nào gây ra lỗi, thì phải sử dụng onSetValues có kết quả lỗi thay vì yêu cầu này.
oneway void onSupportedValueChange(in List propIdAreaIds)
Lệnh gọi lại để báo cáo các thay đổi về giá trị tối thiểu và tối đa được hỗ trợ hoặc danh sách giá trị được hỗ trợ. Trình gọi phải gọi getMinMaxSupportedValue hoặc getSupportedValuesLists để nhận các giá trị đã cập nhật.

Việc triển khai VHAL được VTS VHAL xác thực tại VtsHalAutomotiveVehicle_TargetTest.cpp.

Bài kiểm thử này xác minh rằng các phương thức cơ bản được triển khai đúng cách và các cấu hình thuộc tính được hỗ trợ là chính xác. Thử nghiệm chạy trên tất cả các phiên bản VHAL trên thiết bị, tuy nhiên, AAOS chỉ sử dụng phiên bản mặc định (android.hardware.automotive.vehicle.IVehicle/default)

Giá trị thuộc tính của xe

Sử dụng cấu trúc VehiclePropValue để mô tả giá trị của từng thuộc tính, có các trường sau:

Trường Mô tả
timestamp Dấu thời gian biểu thị thời điểm sự kiện diễn ra và được đồng bộ hoá với đồng hồ SystemClock.elapsedRealtimeNano().
prop Mã nhận dạng cơ sở lưu trú cho giá trị này.
areaid Mã nhận dạng khu vực cho giá trị này. Khu vực này phải là một trong những khu vực được hỗ trợ có trong cấu hình mã nhận dạng khu vực hoặc 0 đối với các tài sản trên toàn cầu.
value Một cấu trúc dữ liệu chứa giá trị thực tế của thuộc tính. Dựa trên loại tài sản, một hoặc nhiều trường trong trường này được dùng để lưu trữ giá trị thực tế. Ví dụ: phần tử đầu tiên trong value.int32Values được dùng cho các thuộc tính thuộc loại Int32. Để biết thông tin chi tiết, hãy xem phần Cấu hình thuộc tính.
status Trạng thái của tài sản để đọc. Đối với thuộc tính đọc/ghi, điều này cũng có thể áp dụng cho việc ghi nhưng không được đảm bảo, ví dụ: thuộc tính có thể đọc nhưng không ghi được. Trong trường hợp này, trạng thái là AVAILABLE và trường giá trị chứa thông tin hợp lệ. Để biết các trạng thái có thể xảy ra, hãy xem VehiclePropertyStatus.

getValues và setValues không đồng bộ

Các thao tác getValuessetValues được thực hiện không đồng bộ, nghĩa là hàm có thể trả về trước khi thao tác nhận hoặc đặt thực tế hoàn tất. Kết quả của thao tác (ví dụ: giá trị thuộc tính cho getValues và trạng thái thành công hoặc lỗi cho setValues) được gửi qua các lệnh gọi lại được truyền dưới dạng đối số.

Quá trình triển khai không được chặn kết quả trong luồng liên kết xử lý yêu cầu. Thay vào đó, bạn nên lưu trữ yêu cầu trong hàng đợi yêu cầu và sử dụng một luồng trình xử lý riêng để xử lý các yêu cầu không đồng bộ. Hãy xem Triển khai tham chiếu để biết thông tin chi tiết.

Hình 1. Quy trình không đồng bộ.

Các đối tượng Parcelable lớn

Tất cả các cấu trúc có tên XXXs, chẳng hạn như VehiclePropConfigs, SetValueRequestsVehiclePropValues đều được gọi là LargeParcelable (hoặc StableLargeParcelable). Mỗi cấu trúc đại diện cho một danh sách các giá trị dùng để truyền dữ liệu lớn có thể vượt quá giới hạn của trình liên kết (4 KB trong quá trình triển khai thư viện LargeParcelable) trên các ranh giới của trình liên kết. Mỗi đối tượng có một định nghĩa cấu trúc tương tự chứa các trường sau.

Hướng dẫn Mô tả
payloads Danh sách các giá trị khi kích thước giá trị nằm trong giới hạn bộ nhớ của trình liên kết hoặc danh sách trống.
sharedMemoryFd Trình mô tả tệp có thể rỗng trỏ đến một tệp bộ nhớ dùng chung lưu trữ các tải trọng được chuyển đổi tuần tự nếu danh sách giá trị quá lớn.

Ví dụ: VehiclePropConfigs được xác định là:

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 chứa tải trọng không trống hoặc sharedMemoryFd không rỗng.

  • Nếu payloads không trống, thì nó sẽ lưu trữ một danh sách dữ liệu thực tế, đó là cấu hình thuộc tính.
  • Nếu sharedMemoryFd không phải là giá trị rỗng, thì nó sẽ chứa một tệp bộ nhớ dùng chung, lưu trữ cấu trúc được chuyển đổi tuần tự của VehiclePropConfigs. Cấu trúc này dùng hàm writeToParcel để chuyển đổi tuần tự một Parcel.

Là một ứng dụng Java cho VHAL, Car Service xử lý quá trình tuần tự hoá và huỷ tuần tự hoá cho LargeParcelable. Đối với các hoạt động triển khai VHAL và ứng dụng gốc, LargeParcelable phải được chuyển đổi tuần tự và giải tuần tự bằng thư viện LargeParcelable hoặc một lớp trình bao bọc hữu ích cho thư viện trong ParcelableUtils.h.

Ví dụ: một yêu cầu phân tích cú pháp ứng dụng gốc cho getValues nhận được từ một liên kết như sau:

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

Dưới đây là một ví dụ về hoạt động triển khai VHAL gửi kết quả cho getValues thông qua liên kết:

std::vector results = getResults();
GetValueResults parcelableResults;
ScopedAStatus status = vectorToStableLargeParcelable(std::move(results), &parcelableResults);
if (status.isOk()) {
    // Send parcelableResults through callback.
} else {
    // Handle error.
}