车辆硬件抽象层 (VHAL)接口定义了 OEM 可以实现的属性并包含属性元数据(例如,属性是否为 int 以及允许哪些更改模式)。 VHAL 接口基于访问(读取、写入、订阅)属性,该属性是特定功能的抽象。
HAL 接口
VHAL 使用以下接口:
-
getAllPropConfigs()
生成(vec<VehiclePropConfig>propConfigs)
列出 VHAL 支持的所有属性的配置。 CarService 仅使用受支持的属性。 -
getPropConfigs(vec<int32_t> props)
生成(StatusCode status,vec<VehiclePropConfig> propConfigs);
返回所选属性的配置。 -
set(VehiclePropValue propValue)
生成(StatusCodestatus);
将值写入属性。写入的结果是按属性定义的。 -
subscribe(IVehicleCallback callback, vec<SubscribeOptions> options)
生成(StatusCode status);
开始监视属性值更改。对于分区属性,unsubscribe(IVehicleCallback callback, int32_t propId)
生成(StatusCode status);
VHAL 使用以下回调接口:
-
oneway onPropertyEvent(vec<VehiclePropValue>propValues);
通知车辆属性的值变化。应该只对订阅的属性进行。 -
oneway onPropertySetError(StatusCode errorCode,int32_t propId,int32_tareaId);
返回全局 VHAL 级别错误或每个属性的错误。全局错误会导致 HAL 重新启动,这可能会导致其他组件(包括应用程序)重新启动。
车辆属性
属性可以是只读的、只写的(用于将信息传递到 VHAL 级别)或读写(对大多数属性的支持是可选的)。每个属性都由一个 int32 键唯一标识,并具有预定义的类型 ( value_type
):
-
BYTES
-
BOOLEAN
-
EPOCH_TIME
-
FLOAT
-
FLOAT[]
-
INT32
-
INT32[]
-
INT64
-
INT64[]
-
STRING
-
MIXED
分区属性可能有多个值,具体取决于属性支持的区域数量。
区域类型
VHAL 定义了多种区域类型:
区域类型 | 描述 |
---|---|
GLOBAL | 该属性是单例的,没有多个区域。 |
WINDOW | 基于窗口的区域,使用VehicleAreaWindow 枚举。 |
MIRROR | 基于镜像的区域,使用VehicleAreaMirror 枚举。 |
SEAT | 基于座位的区域,使用VehicleAreaSeat 枚举。 |
DOOR | 基于门的区域,使用VehicleAreaDoor 枚举。 |
WHEEL | 基于车轮的区域,使用VehicleAreaWheel 枚举。 |
每个分区属性必须使用预定义的区域类型。每个区域类型都有一组在区域类型的枚举中定义的位标志。例如, SEAT
区域定义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
分区属性通过区域 ID 寻址。每个分区属性可能支持一个或多个区域 ID。区域 ID 由来自其各自枚举的一个或多个标志组成。例如,使用VehicleAreaSeat
的属性可能使用以下区域 ID:
物品 | 描述 |
---|---|
ROW_1_LEFT | ROW_1_RIGHT | 区域 ID 适用于两个前排座椅。 |
ROW_2_LEFT | 仅适用于左后座椅。 |
ROW_2_RIGHT | 仅适用于右后座。 |
物业状况
每个属性值都带有一个VehiclePropertyStatus
值。这表示属性的当前状态:
物品 | 描述 |
---|---|
AVAILABLE | 属性可用且值有效。 |
UNAVAILABLE | 属性值当前不可用。用于受支持属性的暂时禁用功能。 |
ERROR | 此属性有问题。 |
配置属性
使用VehiclePropConfig
为每个属性提供配置信息。信息包括:
多变的 | 描述 |
---|---|
access | r , w , rw |
changeMode | 表示如何监控属性,无论是变化还是连续。 |
areaConfigs | areaId 、 min 和max 值。 |
configArray | 附加配置参数。 |
configString | 作为字符串传递的附加信息。 |
minSampleRate | maxSampleRate |
prop | 属性 ID,整数 |
处理区域属性
分区属性相当于多个属性的集合,其中每个子属性都可以使用指定的区域 ID 值访问。
-
get
分区属性的调用始终在请求中包含区域 ID。因此,仅返回请求的区域 ID 的当前值。如果属性是全局属性,则区域 ID 为 0。 - 对分区属性的
set
调用始终在请求中包含区域 ID。因此,仅更改请求的区域 ID。 -
subscribe
调用为属性的所有区域 ID 生成事件。
接听电话
在初始化期间,该属性的值可能尚不可用,因为尚未接收到匹配的车辆网络消息。在这种情况下, get
调用应该返回-EAGAIN
。某些属性(例如 HVAC)具有单独的开/关电源属性。为此类属性调用get
(关闭电源时)应返回UNAVAILABLE
状态,而不是返回错误。例如,获取 HVAC 温度
图 1 。获取 HVAC 温度(CS = CarService,VHAL = Vehicle HAL)
设置通话
set
调用是一种异步操作,涉及在进行请求更改后的事件通知。在典型的操作中, set
调用会导致跨车辆网络发出更改请求。一些set
调用可能需要准备好初始数据,但在初始化期间,这些数据可能还不可用。在这种情况下, set
调用应该返回-EAGAIN
。某些具有单独电源开/关的属性应在属性关闭且无法完成设置时返回-ESHUTDOWN
。在set
生效之前, get
不一定返回与 set 相同的值。例如, set HVAC Temperature
。
图 2 。设置 HVAC 温度(CS = CarService,VHAL = Vehicle HAL)
处理自定义属性
为了支持特定于合作伙伴的需求,VHAL 允许仅限于系统应用程序的自定义属性。使用自定义属性时,请遵循以下准则:
- 应使用以下字段生成属性 ID:
-
VehiclePropertyGroup:VENDOR
VENDOR
组仅用于自定义属性。 -
VehicleArea
选择适当的区域类型。 -
VehiclePropertyType
选择正确的数据类型。BYTES
类型允许传递原始数据,这在大多数情况下就足够了。通过自定义属性频繁发送大数据会减慢整个车辆网络的访问速度——添加大负载时要小心。 -
Property ID
为自定义属性选择一个四半字节 ID。
-
- 为防止生态系统碎片化,不得使用自定义属性来复制 ( VehiclePropertyIds SDK) 中已存在的车辆属性。
- 用自定义属性的简短描述填写
VehiclePropConfig.configString
。这允许完整性检查工具标记现有车辆属性的意外复制。例如,“危险灯状态”。 - 通过
CarPropertyManager
(对于 Java 组件)或通过 Vehicle Network Service API(对于本机)进行访问。不要修改其他汽车 API,因为这样做会导致未来的兼容性问题。 - 实施供应商属性后,仅在
VehicleVendorPermission
枚举中选择供应商属性的权限列表。将供应商权限映射到系统属性将破坏 CTS 和 VTS。
处理 HVAC 属性
您可以通过设置 HVAC 相关属性来使用 VHAL 来控制 HVAC。大多数 HVAC 属性是分区属性,尽管有几个是非分区(全局)属性。示例定义的属性包括:
财产 | 目的 |
---|---|
VEHICLE_PROPERTY_HVAC_TEMPERATURE_SET | 设置每个区域的温度。 |
VEHICLE_PROPERTY_HVAC_RECIRC_ON | 控制每个区域的再循环。 |
要查看 HVAC 属性的完整列表,请在types.hal
中搜索VEHICLE_PROPERTY_HVAC_*
。当 HVAC 属性使用VehicleAreaSeat
时,用于将分区 HVAC 属性映射到区域 ID 的附加规则适用。汽车中的每个可用座位都必须是区域 ID 数组中区域 ID 的一部分。
例一。一辆车有两个前座( ROW_1_LEFT, ROW_1_RIGHT
)和三个后座( ROW_2_LEFT, ROW_2_CENTER, ROW_2_RIGHT
)。该车有两个温度控制单元:驾驶员侧和乘客侧。
-
HVAC_TEMPERATURE SET
的有效区域 ID 映射集是:-
ROW_1_LEFT | ROW_2_LEFT
-
ROW_1_RIGHT | ROW_2_CENTER | ROW_2_RIGHT
-
- 相同硬件配置的另一种映射是:
-
ROW_1_LEFT | ROW_2_LEFT | ROW_2_CENTER
-
ROW_1_RIGHT | ROW_2_RIGHT
-
例二。一辆车有三排座位,前排有两个座位( ROW_1_LEFT, ROW_1_RIGHT
),第二排有三个座位( ROW_2_LEFT, ROW_2_CENTER, ROW_2_RIGHT
),第三排有三个座位( ROW_3_LEFT, ROW_3_CENTER, ROW_3_RIGHT
)。该车具有三个温度控制单元:驾驶员侧、乘客侧和后部。将HVAC_TEMPERATURE_SET
映射到区域 ID 的合理方法是作为三元素数组:
-
ROW_1_LEFT
-
ROW_1_RIGHT
-
ROW_2_LEFT | ROW_2_CENTER | ROW_2_RIGHT | ROW_3_LEFT | ROW_3_CENTER | ROW_3_RIGHT
处理传感器属性
VHAL 传感器属性代表真实的传感器数据或策略信息,例如驾驶状态。任何应用程序都可以不受限制地访问某些传感器信息(例如驾驶状态和日/夜模式),因为这些数据是构建安全车辆应用程序所必需的。其他传感器信息(如车速)更敏感,需要用户可以管理的特定权限。
请参阅支持的传感器属性(在types.hal
中)。
车辆地图服务
车辆地图服务 (VMS) 提供了一种通过发布/订阅接口在客户端之间交换地图数据的机制,以支持常见的车辆功能,例如高级驾驶员辅助系统 (ADAS) 。客户端可以包括通过 VHAL 或特权 Android 应用程序中的 VMS 属性连接的车辆系统。在 VMS 上共享的数据旨在仅限于供车辆系统和支持应用程序使用的地图数据。
VMS 仅适用于 Android Automotive 实现; AOSP 不包含发布或订阅 VMS 的默认客户端。对于 VHAL 中的 VMS 属性,消息类型和数据结构在 VHAL 2.0 中的VmsMessageType
枚举中进行了描述,其中列出了支持的 VMS 消息的类型。此枚举用作车辆属性整数数组中的第一个整数,并确定如何解码消息的其余部分。