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()
|
|
VehiclePropConfigs getPropConfigs(in int[] props)
|
|
void getValues(IVehicleCallback callback, in GetValueRequests requests)
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)
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)
maxSharedMemoryFileCount không được sử dụng. |
|
void unsubscribe(in IVehicleCallback callback, in int[] propIds)
|
|
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
|
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)
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)
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)
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.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)
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.aidl và IXeCallback.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 getValues
và setValues
đượ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
,
SetValueRequests
và VehiclePropValues
đượ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ủaVehiclePropConfigs
. Cấu trúc này sử dụng HàmwriteToParcel
để 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::vectorresults = getResults(); GetValueResults parcelableResults; ScopedAStatus status = vectorToStableLargeParcelable(std::move(results), &parcelableResults); if (status.isOk()) { // Send parcelableResults through callback. } else { // Handle error. }