Giao diện VHAL

AIDL VHAL được xác định trong android.hardware.automotive.vehicle namespace. Giao diện VHAL được xác định tại IVehicle.aidl. Trừ khi được chỉ định, tất 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 thuộc tính VHAL mới nhất Phiên bản VHAL tương thích tối thiểu
Android 16 Phiên bản 4 Phiên bản 4 Phiên bản 1
Android 15 V3 V3 Phiên bản 1
Android 14 Phiên bản 2 Phiên bản 2 Phiên bản 1
Android 13 Phiên bản 1 (Giao diện thuộc tính VHAL không được phân tách) Phiên bản 1

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 được hỗ trợ bởi HAL xe này.
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 xe không đồng bộ. Xử lý một lô GetValueRequest không đồng bộ. Kết quả được phân phối thông qua phương thức gọi lại onGetValues.
void setValues(IVehicleCallback callback, in SetValueRequests requests)
Đặt giá trị thuộc tính xe một cách không đồng bộ. Xử lý một lô SetValueRequest không đồng bộ. Kết quả được phân phối thông 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 tài sản bằng các tuỳ chọn được chỉ định. Các tuỳ chọn đăng ký bao gồm ID tài sản, ID 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). Không sử dụng maxSharedMemoryFileCount.
void unsubscribe(in IVehicleCallback callback, in int[] propIds)
Huỷ đăng ký các sự kiện tài sản đã đăng ký trước đó cho các tài sản được chỉ định.
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
Không được sử dụng và có thể được triển khai dưới dạng không hoạt động.
(Mới trong Android 16)
SupportedValuesListResults getSupportedValuesLists(in List propIdAreaIds)
Lấy danh sách giá trị được hỗ trợ cho các cặp mã tài sản và mã khu vực đã chỉ định.
Được giới thiệu trong VHAL V4.
(Mới trong Android 16)
MinMaxSupportedValueResults getMinMaxSupportedValue(in List propIdAreaIds)
Lấy các giá trị tối thiểu và tối đa được hỗ trợ cho các cặp mã tài sản và mã khu vực đã chỉ định.
Được giới thiệu trong VHAL V4.
void registerSupportedValueChangeCallback(in IVehicleCallback callback, in List propIdAreaIds)
Đăng ký lệnh gọi lại để được gọi khi các giá trị được hỗ trợ thay đổi.
Được giới thiệu 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ợ.
Được giới thiệu 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 đã xử lý xong một số yêu cầu về tập hợp 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 cơ sở lưu trú.
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 của bus 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 sẽ xảy ra khi giá trị của thuộc tính hoặc trạng thái của thuộc tính thay đổi.
Bạn cũng nên sử dụng thuộc tính này để phân phối các sự kiện thay đổi trạng thái thuộc tính, ví dụ: khi thuộc tính không có sẵn hoặc lỗi khi đọc, VehiclePropValue có trạng thái không có sẵn hoặc lỗi và giá trị trống sẽ được phân phối.
SharedMemoryFileCount luôn là 0.
oneway void onPropertySetError(in VehiclePropErrors errors)
Lệnh gọi lại để báo cáo lỗi không đồng bộ của tập hợp thuộc tính không có yêu cầu đặt tương ứng. Nếu chúng ta biết lỗi này là do yêu cầu đặt nào, thì phải sử dụng onSetValues có kết quả lỗi thay vì lỗi này.
oneway void onSupportedValueChange(in List propIdAreaIds)
Lệnh gọi lại để báo cáo giá trị tối thiểu và tối đa được hỗ trợ hoặc thay đổi danh sách giá trị được hỗ trợ. Phương thức gọi phải gọi getMinMaxSupportedValue hoặc getSupportedValuesLists để nhận các giá trị đã cập nhật.

Quá trình triển khai VHAL được xác thực bằng VHAL VTS tại VtsHalAutomotiveVehicle_TargetTest.cpp.

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

Giá trị thuộc tính xe

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

Trường Mô tả
timestamp Dấu thời gian thể hiện thời điểm sự kiện xảy ra và được đồng bộ hoá với đồng hồ SystemClock.elapsedRealtimeNano().
prop Mã thuộc tính cho giá trị này.
areaid Mã khu vực cho giá trị này. Khu vực phải là một trong các khu vực được hỗ trợ được liệt kê trong cấu hình mã nhận dạng khu vực hoặc 0 đối với tài sản chung.
value Cấu trúc dữ liệu chứa giá trị thuộc tính thực tế. Dựa trên loại thuộc tính, 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 loại Int32. Để biết thông tin chi tiết, hãy xem phần Cấu hình tài sản.
status Trạng thái của thuộc tính để đọc. Đối với thuộc tính đọc/ghi, thuộc tính 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 đọc nhưng không thể ghi. Trong trường hợp đó, trạng thái là AVAILABLE và trường value chứa thông tin hợp lệ. Đối với 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 hoàn tất thao tác lấy hoặc đặt thực 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 phân phối thông 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 luồng trình xử lý riêng để xử lý các yêu cầu không đồng bộ. Hãy xem phần 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 gói lớn

Tất cả cấu trúc có tên XXXs, chẳng hạn như VehiclePropConfigs, SetValueRequestsVehiclePropValues đượ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 liên kết (4 KB trong quá trình triển khai thư viện LargeParcelable) qua các ranh giới liên kết. Mỗi loại đều có đị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 liên kết hoặc danh sách trống.
sharedMemoryFd Chỉ số mô tả tệp rỗng trỏ đến một tệp bộ nhớ dùng chung lưu trữ các tải trọng đã 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ì thuộc tính này sẽ lưu trữ danh sách dữ liệu thực tế, tức là cấu hình thuộc tính.
  • Nếu sharedMemoryFd không rỗng, thì tệp này sẽ chứa một tệp bộ nhớ dùng chung, lưu trữ cấu trúc tuần tự của VehiclePropConfigs. Cấu trúc này sử dụng hàm writeToParcel để chuyển đổi tuần tự một Gói.

Là một ứng dụng Java cho VHAL, Dịch vụ ô tô xử lý việc chuyển đổi tuần tự và huỷ chuyển đổi tuần tự cho LargeParcelable. Đối với các triển khai VHAL và ứng dụng gốc, bạn nên chuyển đổi tuần tự và chuyển đổi tuần tự lại LargeParcelable 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 ứng dụng gốc phân tích cú pháp các yêu cầu 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à ví dụ về cách triển khai VHAL để gửi kết quả cho getValues thông qua trình 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.
}