Giao diện Lớp trừu tượng hóa phần cứng phương tiện (VHAL) xác định các thuộc tính mà OEM có thể triển khai và chứa siêu dữ liệu thuộc tính (ví dụ: thuộc tính có phải là int hay không và chế độ thay đổi nào được phép). Giao diện VHAL dựa trên việc truy cập (đọc, viết, đăng ký) một thuộc tính, là một sự trừu tượng hóa cho một chức năng cụ thể.
giao diện HAL
VHAL sử dụng các giao diện sau:
-
getAllPropConfigs()
tạo ra(vec<VehiclePropConfig>propConfigs)
Liệt kê cấu hình của tất cả các thuộc tính được hỗ trợ bởi VHAL. CarService chỉ sử dụng các thuộc tính được hỗ trợ. -
getPropConfigs(vec<int32_t> props)
tạo ra(StatusCode status,vec<VehiclePropConfig> propConfigs);
Trả về cấu hình của các thuộc tính đã chọn. -
set(VehiclePropValue propValue)
tạo ra(StatusCodestatus);
Viết một giá trị cho tài sản. Kết quả ghi được xác định cho mỗi thuộc tính. -
subscribe(IVehicleCallback callback, vec<SubscribeOptions> options)
tạo ra(StatusCode status);
Bắt đầu theo dõi sự thay đổi giá trị tài sản. Đối với thuộc tính được khoanh vùng,unsubscribe(IVehicleCallback callback, int32_t propId)
tạo(StatusCode status);
VHAL sử dụng các giao diện gọi lại sau:
-
oneway onPropertyEvent(vec<VehiclePropValue>propValues);
Thông báo thay đổi giá trị tài sản xe. Chỉ nên thực hiện đối với các thuộc tính đã đăng ký. -
oneway onPropertySetError(StatusCode errorCode,int32_t propId,int32_tareaId);
Trả về lỗi cấp độ VHAL toàn cầu hoặc lỗi cho mỗi thuộc tính. Lỗi toàn cầu khiến HAL khởi động lại, điều này có thể dẫn đến việc khởi động lại các thành phần khác (bao gồm cả ứng dụng).
tài sản xe
Các thuộc tính có thể là chỉ đọc, chỉ ghi (được sử dụng để truyền thông tin tới mức VHAL) hoặc đọc và ghi (hỗ trợ của hầu hết các thuộc tính là tùy chọn). Mỗi thuộc tính được xác định duy nhất bằng khóa int32 và có loại được xác định trước ( value_type
):
-
BYTES
-
BOOLEAN
-
EPOCH_TIME
-
FLOAT
-
FLOAT[]
-
INT32
-
INT32[]
-
INT64
-
INT64[]
-
STRING
-
MIXED
Thuộc tính được khoanh vùng có thể có nhiều giá trị, dựa trên số vùng được thuộc tính hỗ trợ.
các loại diện tích
VHAL định nghĩa nhiều loại vùng:
Loại khu vực | Sự miêu tả |
---|---|
GLOBAL | Thuộc tính này là một singleton và không có nhiều khu vực. |
WINDOW | Khu vực dựa trên cửa sổ, sử dụng VehicleAreaWindow enum. |
MIRROR | Khu vực dựa trên gương, sử dụng VehicleAreaMirror enum. |
SEAT | Diện tích dựa trên ghế ngồi, sử dụng VehicleAreaSeat enum. |
DOOR | Diện tích dựa trên cửa ra vào, sử dụng VehicleAreaDoor enum. |
WHEEL | Diện tích dựa trên bánh xe, sử dụng VehicleAreaWheel enum. |
Mỗi thuộc tính được khoanh vùng phải sử dụng một loại khu vực được xác định trước. Mỗi loại khu vực có một bộ cờ bit được xác định trong một enum cho loại khu vực. Ví dụ, khu vực SEAT
định nghĩa các enum VehicleAreaSeat
:
-
ROW_1_LEFT = 0x0001
-
ROW_1_CENTER = 0x0002
-
ROW_1_RIGHT = 0x0004
-
ROW_2_LEFT = 0x0010
-
ROW_2_CENTER = 0x0020
-
ROW_2_RIGHT = 0x0040
-
ROW_3_LEFT = 0x0100
- ...
ID khu vực
Các thuộc tính được khoanh vùng được giải quyết thông qua ID khu vực. Mỗi thuộc tính được khoanh vùng có thể hỗ trợ một hoặc nhiều ID khu vực. ID khu vực bao gồm một hoặc nhiều cờ từ enum tương ứng của nó. Ví dụ: một thuộc tính sử dụng VehicleAreaSeat
có thể sử dụng các ID khu vực sau:
Mục | Sự miêu tả |
---|---|
ROW_1_LEFT | ROW_1_RIGHT | ID khu vực áp dụng cho cả hai ghế trước. |
ROW_2_LEFT | Chỉ áp dụng cho ghế sau bên trái. |
ROW_2_RIGHT | Chỉ áp dụng cho ghế sau bên phải. |
Tình Trạng Tài Sản
Mọi giá trị thuộc tính đều đi kèm với giá trị VehiclePropertyStatus
. Điều này cho biết trạng thái hiện tại của tài sản:
Mục | Sự miêu tả |
---|---|
AVAILABLE | Tài sản có sẵn và giá trị có giá trị. |
UNAVAILABLE | Giá trị tài sản hiện không có sẵn. Được sử dụng cho các tính năng tạm thời bị vô hiệu hóa cho thuộc tính được hỗ trợ. |
ERROR | Có gì đó không ổn với tài sản này. |
Định cấu hình thuộc tính
Sử dụng VehiclePropConfig
để cung cấp thông tin cấu hình cho từng thuộc tính. Thông tin bao gồm:
Biến đổi | Sự miêu tả |
---|---|
access | r , w , rw |
changeMode | Thể hiện cách một thuộc tính được theo dõi, khi thay đổi so với liên tục. |
areaConfigs | các giá trị areaId , min và max . |
configArray | Thông số cấu hình bổ sung. |
configString | Thông tin bổ sung được chuyển dưới dạng chuỗi. |
minSampleRate | maxSampleRate |
prop | ID tài sản, int |
Xử lý thuộc tính vùng
Thuộc tính được khoanh vùng tương đương với một tập hợp nhiều thuộc tính trong đó mỗi thuộc tính phụ có thể được truy cập bằng giá trị ID khu vực được chỉ định.
-
get
cuộc gọi cho thuộc tính được khoanh vùng luôn bao gồm ID khu vực trong yêu cầu. Do đó, chỉ giá trị hiện tại cho ID khu vực được yêu cầu được trả về. Nếu thuộc tính là toàn cầu, thì ID khu vực là 0. -
set
cuộc gọi cho thuộc tính được khoanh vùng luôn bao gồm ID khu vực trong yêu cầu. Do đó, chỉ ID khu vực được yêu cầu được thay đổi. - cuộc gọi
subscribe
tạo sự kiện cho tất cả ID khu vực cho thuộc tính.
Nhận cuộc gọi
Trong quá trình khởi tạo, giá trị của thuộc tính có thể chưa khả dụng do chưa nhận được thông báo mạng xe phù hợp. Trong những trường hợp như vậy, lệnh gọi get
sẽ trả về -EAGAIN
. Một số thuộc tính (chẳng hạn như HVAC) có thuộc tính nguồn bật/tắt riêng biệt. Gọi get
cho một thuộc tính như vậy (khi tắt nguồn) sẽ trả về trạng thái UNAVAILABLE
thay vì trả về lỗi. Ví dụ: lấy Nhiệt độ HVAC
Hình 1 . Nhận nhiệt độ HVAC (CS = CarService, VHAL = Vehicle HAL)
Đặt cuộc gọi
Trong một hoạt động điển hình, một cuộc gọi set
dẫn đến việc thực hiện một yêu cầu thay đổi trên mạng xe. Một lệnh gọi set
lý tưởng là một hoạt động không đồng bộ trả về ngay khi có thể, nhưng nó cũng có thể là đồng bộ. Một số cuộc gọi set
có thể yêu cầu dữ liệu ban đầu sẵn sàng nhưng trong quá trình khởi tạo, dữ liệu đó có thể chưa có sẵn. Trong những trường hợp như vậy, lệnh gọi set
sẽ trả về StatusCode#TRY_AGAIN
. Một số thuộc tính có tính năng bật và tắt nguồn riêng biệt sẽ trả về StatusCode#NOT_AVAILABLE
hoặc StatusCode#NOT_AVAILABLE_DISABLED
khi thuộc tính bị tắt nguồn và không thể set
được. Cho đến khi set
có hiệu lực, get
không nhất thiết phải trả về cùng giá trị như giá trị đã set. Ví dụ: set HVAC Temperature
.
Hình 2 . Đặt nhiệt độ HVAC (CS = CarService, VHAL = Vehicle HAL)
Xử lý thuộc tính tùy chỉnh
Để hỗ trợ các nhu cầu dành riêng cho đối tác, VHAL cho phép các thuộc tính tùy chỉnh được giới hạn cho các ứng dụng hệ thống. Sử dụng các nguyên tắc sau khi làm việc với các thuộc tính tùy chỉnh:
- ID thuộc tính phải được tạo bằng các trường sau:
-
VehiclePropertyGroup:VENDOR
NhómVENDOR
chỉ được sử dụng cho các thuộc tính tùy chỉnh. -
VehicleArea
Chọn một Loại Khu vực thích hợp. -
VehiclePropertyType
Chọn kiểu dữ liệu phù hợp. LoạiBYTES
cho phép truyền dữ liệu thô là đủ trong hầu hết các trường hợp. Việc gửi dữ liệu lớn thường xuyên thông qua các thuộc tính tùy chỉnh có thể làm chậm toàn bộ truy cập mạng của xe — hãy cẩn thận khi thêm một trọng tải lớn. -
Property ID
Chọn một ID bốn nibble cho thuộc tính tùy chỉnh.
-
- Để ngăn chặn sự phân mảnh hệ sinh thái, không được sử dụng các thuộc tính tùy chỉnh để sao chép các thuộc tính phương tiện đã tồn tại trong ( VehiclePropertyIds SDK).
- Điền vào
VehiclePropConfig.configString
một mô tả ngắn về thuộc tính tùy chỉnh. Điều này cho phép các công cụ kiểm tra độ chính xác gắn cờ sự sao chép vô tình của các thuộc tính phương tiện hiện có. Ví dụ: "trạng thái ánh sáng nguy hiểm." - Truy cập thông qua
CarPropertyManager
(đối với các thành phần Java) hoặc thông qua API Dịch vụ Mạng Xe (đối với bản địa). Không sửa đổi các API ô tô khác vì làm như vậy có thể dẫn đến các sự cố tương thích trong tương lai. - Sau khi triển khai các thuộc tính của nhà cung cấp, chỉ chọn danh sách quyền trong enum
VehicleVendorPermission
cho các thuộc tính của nhà cung cấp. Ánh xạ các quyền của nhà cung cấp tới các thuộc tính hệ thống sẽ phá vỡ CTS và VTS.
Xử lý thuộc tính HVAC
Bạn có thể sử dụng VHAL để điều khiển HVAC bằng cách đặt các thuộc tính liên quan đến HVAC. Hầu hết các thuộc tính HVAC là thuộc tính được khoanh vùng, mặc dù một số thuộc tính không được khoanh vùng (toàn cầu). Các thuộc tính được xác định mẫu bao gồm:
Tài sản | Mục đích |
---|---|
VEHICLE_PROPERTY_HVAC_TEMPERATURE_SET | Đặt nhiệt độ cho mỗi vùng. |
VEHICLE_PROPERTY_HVAC_RECIRC_ON | Kiểm soát tuần hoàn trên mỗi khu vực. |
Để xem danh sách đầy đủ các thuộc tính HVAC, hãy tìm kiếm VEHICLE_PROPERTY_HVAC_*
trong types.hal
. Khi thuộc tính HVAC sử dụng VehicleAreaSeat
, các quy tắc bổ sung để ánh xạ thuộc tính HVAC được phân vùng thành ID khu vực sẽ được áp dụng. Mỗi ghế có sẵn trong ô tô phải là một phần của ID khu vực trong mảng ID khu vực.
Ví dụ Một. Ô tô có hai ghế trước ( ROW_1_LEFT, ROW_1_RIGHT
) và ba ghế sau ( ROW_2_LEFT, ROW_2_CENTER, ROW_2_RIGHT
). Xe có hai bộ phận kiểm soát nhiệt độ: phía người lái và phía hành khách.
- Tập hợp ID khu vực ánh xạ hợp lệ cho
HVAC_TEMPERATURE SET
là:-
ROW_1_LEFT | ROW_2_LEFT
-
ROW_1_RIGHT | ROW_2_CENTER | ROW_2_RIGHT
-
- Một ánh xạ thay thế cho cùng một cấu hình phần cứng là:
-
ROW_1_LEFT | ROW_2_LEFT | ROW_2_CENTER
-
ROW_1_RIGHT | ROW_2_RIGHT
-
Ví dụ Hai. Ô tô có ba hàng ghế với hai ghế ở hàng trước ( ROW_1_LEFT, ROW_1_RIGHT
), ba ghế ở hàng thứ hai ( ROW_2_LEFT, ROW_2_CENTER, ROW_2_RIGHT
) và ba ghế ở hàng thứ ba ( ROW_3_LEFT, ROW_3_CENTER, ROW_3_RIGHT
). Xe có ba bộ phận kiểm soát nhiệt độ: phía người lái, phía hành khách và phía sau. Một cách hợp lý để ánh xạ HVAC_TEMPERATURE_SET
tới ID khu vực dưới dạng một mảng ba phần tử:
-
ROW_1_LEFT
-
ROW_1_RIGHT
-
ROW_2_LEFT | ROW_2_CENTER | ROW_2_RIGHT | ROW_3_LEFT | ROW_3_CENTER | ROW_3_RIGHT
Xử lý thuộc tính cảm biến
Thuộc tính cảm biến VHAL đại diện cho dữ liệu cảm biến thực hoặc thông tin chính sách, chẳng hạn như trạng thái lái xe. Bất kỳ ứng dụng nào cũng có thể truy cập một số thông tin cảm biến (chẳng hạn như trạng thái lái xe và chế độ ngày/đêm) mà không bị hạn chế vì dữ liệu là bắt buộc để xây dựng ứng dụng phương tiện an toàn. Thông tin cảm biến khác (chẳng hạn như tốc độ xe) nhạy cảm hơn và yêu cầu quyền cụ thể mà người dùng có thể quản lý.
Xem các thuộc tính cảm biến được hỗ trợ (trong types.hal
).
Dịch vụ bản đồ xe
Dịch vụ Bản đồ Phương tiện (VMS) cung cấp cơ chế trao đổi dữ liệu bản đồ giữa các máy khách thông qua giao diện pub/sub để hỗ trợ các tính năng phổ biến của phương tiện, chẳng hạn như Hệ thống Hỗ trợ Người lái Nâng cao (ADAS) . Khách hàng có thể bao gồm các hệ thống phương tiện giao tiếp thông qua thuộc tính VMS trong VHAL hoặc các ứng dụng Android đặc quyền. Dữ liệu được chia sẻ trên VMS nhằm mục đích giới hạn ở dữ liệu bản đồ để các hệ thống phương tiện và ứng dụng hỗ trợ sử dụng.
VMS chỉ dành cho mục đích sử dụng trong triển khai Android Automotive; AOSP không chứa các ứng dụng khách mặc định xuất bản hoặc đăng ký VMS. Đối với thuộc tính VMS trong VHAL, các loại thông báo và cấu trúc dữ liệu được mô tả trong VHAL 2.0 trong enum VmsMessageType
, liệt kê các loại thông báo VMS được hỗ trợ. Enum này được sử dụng làm số nguyên đầu tiên trong mảng số nguyên thuộc tính phương tiện và xác định cách giải mã phần còn lại của thông báo.