Google 致力于为黑人社区推动种族平等。查看具体举措

车辆属性

车辆硬件抽象层(VHAL)接口定义原始设备制造商可以实现的属性,并包含属性的元数据(例如,该属性是否是一个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);
    开始监视属性值更改。对于zoned属性, 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基于windows区,使用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 wrw
changeMode表示如何监视属性,更改与连续。
areaConfigs areaIdmin ,和max的值。
configArray附加配置参数。
configString作为字符串传递的附加信息。
minSampleRate maxSampleRate
prop属性 ID,整数

处理区域属性

分区属性相当于多个属性的集合,其中可以使用指定的区域 ID 值访问每个子属性。

  • get呼吁分区的属性总是包含请求的区域ID。因此,仅返回请求的区域 ID 的当前值。如果属性是全局的,则区域 ID 为 0。
  • set呼叫对划属性总是包括在请求中的区域ID。因此,仅更改请求的区域 ID。
  • subscribe调用生成事件的所有区域ID的属性。

接听电话

在初始化期间,由于尚未收到匹配的车辆网络消息,因此该属性的值可能尚不可用。在这种情况下, get调用应该返回-EAGAIN 。某些属性(例如 HVAC)具有单独的开/关电源属性。调用get的(关机时),这样的属性应该返回UNAVAILABLE状态,而不是返回一个错误。例如,获取 HVAC 温度

VHAL 获取 HVAC 示例

图1。获取 HVAC 温度(CS = CarService,VHAL = Vehicle HAL)

设置通话

set通话涉及的事件通知请求更改后的异步操作。在一个典型的操作,一set呼叫导致进行跨车载网络变更请求。一些set通话可能需要初始数据准备就绪,但在初始化过程中,这样的数据可能无法使用呢。在这种情况下, set呼应该返回-EAGAIN 。开/关独立的电源有些属性应该返回-ESHUTDOWN当属性断电并设置无法做到的。直到set变为有效, get不一定返回相同的数值设置的内容。例如, set HVAC Temperature

VHAL 设置暖通空调示例

图2。设置 HVAC 温度(CS = CarService,VHAL = Vehicle HAL)

处理自定义属性

为了支持特定于合作伙伴的需求,VHAL 允许仅限于系统应用程序的自定义属性。使用自定义属性时,请遵循以下准则:

  • 应使用以下字段生成属性 ID:
    • VehiclePropertyGroup:VENDOR
      VENDOR组仅用于自定义属性。
    • VehicleArea
      选择合适的区域类型。
    • VehiclePropertyType
      选择正确的数据类型。 BYTES类型允许其在大多数情况下,足够的原始数据的传递。通过自定义属性频繁发送大数据会减慢整个车辆网络的访问速度 - 添加大负载时要小心。
    • Property ID
      为自定义属性选择一个四字节 ID。
  • 为防止生态系统的碎片化,自定义属性不能用于已在(存在重复车辆性能VehiclePropertyIds SDK)。
  • 填写VehiclePropConfig.configString与自定义属性的简短说明。这允许健全性检查工具标记现有车辆属性的意外复制。例如,“危险灯状态”。
  • 通过访问CarPropertyManager (用于Java组件),或者通过车载网络服务API(本机)。不要修改其他汽车 API,因为这样做可能会导致未来的兼容性问题。
  • 实施供应商属性后,选择在权限列表VehicleVendorPermission枚举为供应商属性。将供应商权限映射到系统属性会破坏 CTS 和 VTS。

处理 HVAC 属性

您可以使用 VHAL 通过设置 HVAC 相关属性来控制 HVAC。大多数 HVAC 属性是分区属性,尽管有一些是非分区(全局)属性。示例定义的属性包括:

财产目的
VEHICLE_PROPERTY_HVAC_TEMPERATURE_SET设置每个区域的温度。
VEHICLE_PROPERTY_HVAC_RECIRC_ON控制每个区域的再循环。

要查看HVAC特性的完整列表,搜索VEHICLE_PROPERTY_HVAC_*types.hal 。当HVAC属性使用VehicleAreaSeat ,对分区的HVAC属性映射到区域ID特殊的规则。汽车中的每个可用座位都必须是区域 ID 数组中区域 ID 的一部分。

例一。汽车有两个前座( ROW_1_LEFT, ROW_1_RIGHT )和三个后排座椅( ROW_2_LEFT, ROW_2_CENTER, ROW_2_RIGHT )。汽车有两个温度控制单元:驾驶员侧和乘客侧。

  • 对设置的区域ID的有效映射HVAC_TEMPERATURE SET是:
    • 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

例二。甲车具有与所述前排两个座位(3排座位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)通过pub / sub接口提供了一种机制,以客户端之间交换的地图数据,支持普通车辆的功能,如高级驾驶员辅助系统(ADAS) 。客户端可以包括通过 VHAL 或特权 Android 应用程序中的 VMS 属性连接的车辆系统。在 VMS 上共享的数据旨在仅限于供车辆系统和支持应用程序使用的地图数据。

VMS 仅用于 Android Automotive 实现; AOSP 不包含发布或订阅 VMS 的默认客户端。对于在VHAL VMS的属性,该消息类型和数据结构在VHAL 2.0中所描述的VmsMessageType枚举,其列出了类型支持VMS消息。此枚举用作车辆属性整数数组中的第一个整数,并确定如何解码消息的其余部分。