giao diện VHAL

AIDL VHAL được định nghĩa 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ả các phương pháp phải được thực hiện.

Phương pháp
VehiclePropConfigs getAllPropConfigs()
Trả về danh sách tất cả các Cấu hình thuộc tính được HAL phương tiện này hỗ trợ.
VehiclePropConfigs getPropConfigs(in int[] props)
Trả về danh sách Cấu hình thuộc tính cho ID thuộc tính nhất định.
void getValues(IVehicleCallback callback, in GetValueRequests requests)
Nhận giá trị thuộc tính xe một cách không đồng bộ. Xử lý một loạt 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 không đồng bộ. Xử lý một loạt 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 thuộc tính với các tùy chọn được chỉ định. Các tùy chọn đăng ký bao gồm ID thuộc tính, ID vùng thuộc tính và tốc độ mẫu tính bằng Hz (đối với thuộc tính liên tục). maxSharedMemoryFileCount không được sử dụng.
void unsubscribe(in IVehicleCallback callback, in int[] propIds)
Hủy đăng ký các sự kiện thuộc tính đã đăng ký trước đó đối với các thuộc tính được chỉ định.
returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId)
Không được sử dụng và có thể được thực hiện dưới dạng no-op.

Các cuộc 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 pháp
oneway void onGetValues(in GetValueResults responses)
Gọi lại cho hàm getValues ​​để mang lại kết quả 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)
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 về tập thuộc tính.
oneway void onPropertyEvent(in VehiclePropValues propValues, int sharedMemoryFileCount)
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 , một sự kiện thuộc tính xảy ra dựa trên tốc độ mẫu đăng ký tính bằng Hz hoặc tần số tin nhắn trên xe buýt. Một sự kiện thuộc tính cũng có thể xảy ra nếu trạng thái của thuộc tính thay đổi. Ví dụ: từ không có sẵn đến 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ị của thuộc tính hoặc trạng thái của thuộc tính thay đổi.
SharedMemoryFileCount luôn là 0 .
oneway void onPropertySetError(in VehiclePropErrors errors)
Gọi lại để báo cáo lỗi đặt thuộc tính không đồng bộ không có yêu cầu đặt tương ứng. Nếu chúng tôi biết lỗi xảy ra với yêu cầu tập hợp nào thì phải sử dụng onSetValues ​​có kết quả lỗi thay vì kết quả này.

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

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

Giá trị tài sản 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:

Cánh đồng Sự miêu tả
timestamp Dấu thời gian biểu thị thời gian sự kiện xảy ra và được đồng bộ hóa với đồng hồ SystemClock.elapsedRealtimeNano() .
prop ID thuộc tính cho giá trị này.
areaid ID 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 liệt kê trong cấu hình ID khu vực hoặc 0 đối với thuộc tính 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 sử dụng để lưu trữ giá trị thực. Ví dụ: phần tử đầu tiên trong value.int32Values ​​được sử dụng cho thuộc tính loại Int32. Để biết chi tiết, hãy xem Cấu hình thuộc tính .

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

Các thao tác getValues ​​và setValues ​​được thực hiện không đồng bộ, nghĩa 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ả hoạt động (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 chuyển dưới dạng đối số.

Việc triển khai không được chặn kết quả trong chuỗi liên kết xử lý yêu cầu. Thay vào đó, chúng tôi khuyên 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 chuỗi xử lý riêng để xử lý các yêu cầu một cách không đồng bộ. Xem phần Triển khai tham khảo để biết chi tiết.

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

Bưu kiện 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 giá trị đại diện cho một danh sách các giá trị được sử dụng để truyền dữ liệu lớn có thể vượt quá giới hạn liên kết (4KB trong triển khai thư viện LargeParcelable ) qua các ranh giới liên kết. Mỗi cái có một định nghĩa cấu trúc tương tự bao gồm các trường sau.

hướng dẫn Sự miêu tả
payloads Danh sách các giá trị khi kích thước giá trị vừa với giới hạn bộ nhớ liên kết hoặc danh sách trống.
sharedMemoryFd Bộ mô tả tệp không thể xóa trỏ đến tệp bộ nhớ dùng chung lưu trữ các tải trọng được tuần tự hóa nếu danh sách các 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 tải trọng không trống hoặc sharedMemoryFd không rỗng.

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

Là một máy khách Java cho VHAL, Car Service xử lý việc tuần tự hóa và giải tuần tự hóa cho LargeParcelable . Đối với các triển khai VHAL và máy khách gốc, một LargeParcelable phải được tuần tự hóa và giải tuần tự hóa 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ụ: các yêu cầu phân tích cú pháp của máy khách gốc cho getValues ​​nhận được từ chất kết dính như sau:

// 'requests' are from the binder.
GetValueRequests requests;
expected, ScopedAStatus> deserializedResults = fromStableLargeParcelable(requests);
if (deserializedResults.ok()) {
    const std::vector& getValueRequests = deserializedResults.value().getObject()->payloads;
    // Use the getValueRequests.
  } else {
    // handle error.
}

Một triển khai VHAL mẫu gửi kết quả cho getValues ​​thông qua chất kết dính đượ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.
}