Giao diện VHAL

VHAL AIDL được định nghĩa 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.

Phương thức
VehiclePropConfigs getAllPropConfigs()
Trả về danh sách tất cả các giá trị trong danh sách Có hỗ trợ Cấu hình tài sản bằng lớp trừu tượng phần cứng (HAL) cho xe này.
VehiclePropConfigs getPropConfigs(in int[] props)
Trả về danh sách Cấu hình thuộc tính cho đã cho thuộc tính.
void getValues(IVehicleCallback callback, in GetValueRequests requests)
Nhận giá trị thuộc tính xe theo cách không đồng bộ. Xử lý một lô của GetValueRequest một cách không đồng bộ. Kết quả được cung cấp 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 theo cách không đồng bộ. Xử lý một loạt SetValueRequest không đồng bộ. Kết quả được cung cấp 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 của tài sản với những lựa chọn cụ thể. Các lựa chọn đăng ký bao gồm mã cơ sở lưu trú, mã khu vực của cơ sở lưu trú và tốc độ lấy mẫu tính bằng Hz (đối với một cơ sở lưu trú liên tục). maxSharedMemoryFileCount không được sử 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 một số tài sản cụ thể.
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
Không được sử dụng và có thể triển khai dưới dạng không hoạt động.

Các lệnh gọi lại được xác định ở 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 để nhận được kết quả có giá trị. Đã 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 để cung cấp kết quả giá trị đã đặt. Được gọi khi VHAL đã xử lý xong một số yêu cầu thiết lập thuộc tính.
oneway void onPropertyEvent(in VehiclePropValues propValues, int sharedMemoryFileCount)
Lệnh gọi lại để báo cáo sự kiện cập nhật tài sản.
Tài sản
CONTINUOUS, một sự kiện của tài sản xảy ra dựa trên tỷ lệ lấy mẫu đăng ký tính bằng Hz hoặc tần suất thông báo về xe buýt. Sự kiện thuộc tính cũng có thể xảy ra nếu các thay đổi về trạng thái. Ví dụ: từ không có sẵn sang có sẵn.
Đối với tài sản ON_CHANGE, sự kiện của tài sản xảy ra khi giá trị của một tài sản hoặc thay đổi trạng thái của một tài sản.
SharedMemoryFileCount luôn là 0.
oneway void onPropertySetError(in VehiclePropErrors errors)
Lệnh gọi lại để báo cáo lỗi tập hợp thuộc tính không đồng bộ không có nhóm nào tương ứng của bạn. Nếu chúng ta biết lỗi xảy ra với yêu cầu tập hợp nào, hãy onSetValues với phải sử dụng kết quả lỗi này thay cho kết quả này.

Để biết thêm thông tin, hãy xem IXe.aidlIXeCallback.aidl.

Việc triển khai VHAL được xác thực bởi VHAL VTS tại VtsHalAutomotiveXe_TargetTest.cpp. Thử nghiệm xác minh rằng các phương thức cơ bản được triển khai đúng cách và thuộc tính được hỗ trợ cấu hình là chính xác.

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

Sử dụng VehiclePropValue cấu trúc này để mô tả giá trị của mỗi thuộc tính, bao gồm các trường sau:

Trường Mô tả
timestamp Dấu thời gian thể hiện thời gian 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ã vùng cho giá trị này. Khu vực này phải là một trong các khu vực được hỗ trợ trong danh sách trong khu vực Cấu hình mã nhận dạng, hoặc 0 cho các 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 cơ sở lưu trú, một hoặc nhiều trường khác trong trường này được dùng để lưu trữ giá trị thực tế. Ví dụ: đầu tiên phần tử 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 Tài sản Cấu hình.

Các getValues và setValue không đồng bộ

Các thao tác getValuessetValues được thực hiện không đồng bộ, tức là hàm có thể trả về trước khi thao tác get hoặc set 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à thành công hoặc trạng thái lỗi của setValues) được gử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 một luồng trình xử lý riêng để xử lý các yêu cầu một cách không đồng bộ. Xem Triển khai tham chiếu cho chi tiết.

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

Gói hàng có kích thước lớn

Tất cả cấu trúc có tên XXXs, chẳng hạn như VehiclePropConfigs, SetValueRequestsVehiclePropValues được gọi LargeParcelable (hoặc StableLargeParcelable). Mỗi loại đạ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 liên kết (4KB trong LargeParcelable) qua ranh giới liên kết. Mỗi công cụ đều có định nghĩa cấu trúc chứa các trường sau.

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

Ví dụ: VehiclePropConfigs được định nghĩa 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 các tải trọng không trống hoặc không rỗng sharedMemoryFd

  • Nếu payloads không trống, lệnh này sẽ lưu trữ một danh sách các dữ liệu thực tế, cấu hình thuộc tính.
  • Nếu sharedMemoryFd khác rỗng, thì tệp này chứa một tệp bộ nhớ dùng chung có chức năng lưu trữ cấu trúc chuyển đổi 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 Bưu kiện.

Là một ứng dụng Java cho VHAL, Car Service xử lý quá trình chuyển đổi tuần tự và huỷ chuyển đổi tuần tự cho LargeParcelable. Đối với việc 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 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.
}

Quá trình triển khai VHAL mẫu sẽ gửi kết quả cho getValues thông qua trình liên kết là được hiển thị bên dưới:

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