Mi AAOS 信号体系实现
- 由于目前采用 QNX+Android 的车机系统,且基于标准 AAOS 来做车辆系统开发的背景下,需要一套既兼容标准车辆信号(136个),又满足全场景覆盖(最小需要 400)的信号实现。
目标 :
- 基于 SOA 服务接口定义表格 的全信号体系, 且兼容标准车辆信号(136个)
- 在 AAOS 的基础上,数据格式采用 SOA 中 Payload 格式定义,但依然对标准 CarApp 采用兼容方案(既标准 CarApp 可以直接运行在 Mi_AAOS 上)
- 对 car-lib 不做或少量改动,保证后续升级稳定以及其他兼容性问题
主要任务 :
以 Key/Value 的思路来考虑数据传递,Key 当然是 SOA 中的 Area_1_2_3 | CMD/STATE (非单独字段,只是上下行概念 ) , 而 Value 则是 Payload。
- CMD 下行信号: 以调节主驾空调温度为例, 则 Area_1_2_3 为 HVAC/Temperature/FrontLeft, 其对应的 MS11 信号为 DCDFirstLeTSet
- STATE 上行信号: 以获取主驾空调目标温度为例,Area_1_2_3 依然为 HVAC/Temperature/FrontLeft, 对应的 MS11 信号为 HvacFirstLeTSt
-
对于 Key 的传递,使用 String 是可行的方案,不过考虑到性能以及标准 AAOS 的实现,这里依然采用 propId + areaId 的方案来做 Key, 需要一定的机制来保证各端对 Key 的理解一致。
-
对信号的理解,完全采用 SOA 定义,其中 Area_1/Area_2 与 propId, Area3 与 areaId 相对应,在AAOS(VehicleProperty) 中已有定义的,propId 以AAOS 为准,未在AAOS中定义的,采用工具统一生成,作为 Q/A 体系公用,针对DBC中具体信号,以 Area_1_2_3 以及 CMD/STATE 共同映射来确定。
-
具体方案待定, 目前有以下方案
- 添加新的 types.hal 做补充,并添加详细的注释说明,来作为 SOA 与具体信号的关联(与标准方案类似)
- 通过新工具生成具体的 JAVA/CPP 代码供各端使用, JAVA 代码补充在 car-support-lib 中, CPP 代码供 VHAL 以及 QNX 使用
-
-
对于 Value,SOA 中定义的 Payload 比起 AAOS 来说,添加了2个额外字段, relative 与 extension , 这在一定程度上,可以增加信号使用的灵活度,以及减少不必要的信号定义, 这里目前有以下几种方案可供参考:
- 更改原生的 CarPropertyValue(Java|car-lib) / VehiclePropValue(VHAL|types.hal) / VehiclePropValue(VHAL|Protobuf), 添加 relative 与 extension 字段, 工程量最小,缺陷是标准 CarApp 需要重新打包(打包car-lib)才能正常使用, 而且对AOSP 有些许更改,对之后升级以及兼容性都存在一些问题。
- 使用双通道兼容方案, 提供 mi-car-support-lib, 在其中添加 mi_CarPropertyValue ,并且针对 mi_CarPropertyValue 根据已有 car-lib 进行新的 aidl 设计(copy ICarProperty 等类并改相关包名称, like androidx),在 CarPropertyService 中提供原生 property 与 mi_property service 来分别支持 car-lib 和 mi-car-support-lib,而 VHAL 中的实现方案参考 CustomVehicleHAL 接入原生 VehicleHAL 选型分析
- 在propId 中做修改,这种做法有点类似于报文头中添加自定义字段,在 mi-car-support-lib 中添加方法支持, 对 CarPropertyValue 添加额外的增加 relative 与 extension 方法,具体为在需要添加额外字段时候, 将 propId 改造,使得 type 为 MIXED 类型,并在具体的 value 里,将原始数据以及 其他字段填充在 Object[] 中,此链路在 Android 内部务须更改, 在 VHAL 与 QNX 通信中,需要额外解析这种自定义类型, 即 只在 mi-car-support-lib 与 VHAL 中做少量改动即可,缺点是这种自定义数据没有对标准 CarApp 做支持(app 不做支持,且CarService 不能分辨client 是 Custom_App or Original_App)。以语音控制空调温度为例, 在 extension 中添加操作来源:
预期数据
{"mPropertyId":0x15600503, "mAreaId":0x1, "mValue":20.5, "mExtension":{"triggerSource":"VoiceRecognition"}}
其中mPropertyId的定义为
HVAC_TEMPERATURE_SET = (
0x0503
| VehiclePropertyGroup:SYSTEM /* 0x10000000 */
| VehiclePropertyType:FLOAT /* 0x00600000 */
| VehicleArea:SEAT /* 0x05000000 */),
则最终数据变更为
HVAC_TEMPERATURE_SET = (
0x0503
| VehiclePropertyGroup:SYSTEM /* 0x10000000 */
| VehiclePropertyGroup:MI_CUSTOM /* 0x80000000 */
| VehiclePropertyType:MIXED /* 0x00e00000 */
| VehicleArea:SEAT /* 0x05000000 */),
{"mPropertyId":0x95e00503, "mAreaId":0x1, "mValue":[0x00600000/*VehiclePropertyType:FLOAT*/,0 /*relative:false*/, 20.5, /*extension*/{"triggerSource":"VoiceRecognition"}]}之前遇到使用 extension 的场景为,驾驶模式需要同时发送多个信号,为避免歧义或QNX中过多的逻辑判断,在 extension 中添加了加速/踏板能量回收等信息, 也有在控制投屏中添加全屏,播放等状态的场景。
PropId 构成
下表描述了 32 位 propId 各 bit 段的语义。AAOS 部分沿用 AOSP 标准定义;MiCar 部分新增 MICAR group、MiVehicleZone(A0/A1)、A2 自定义位段。
| MASK | 0xf0000000 | 0x0f000000 | 0x00ff0000 | 0x0000f000 | 0x00000f00 | 0x000000ff |
|---|---|---|---|---|---|---|
| 字段含义 | AAOS VehiclePropertyGroup | AAOS VehicleArea | AAOS VehiclePropertyType | (AAOS unique id 低段) | (MiCar A0/A1) | (MiCar A2) |
| AAOS | SYSTEM 1 VENDOR 2 | GLOBAL 1 WINDOW 3 MIRROR 4 SEAT 5 DOOR 6 WHEEL 7 BODY 8 | STRING 0x00100000 BOOLEAN 0x00200000 INT32 0x00400000 INT32_VEC 0x00410000 INT64 0x00500000 INT64_VEC 0x00510000 FLOAT 0x00600000 FLOAT_VEC 0x00610000 BYTES 0x00700000 MIXED 0x00e00000 | colspan=3 → unique id from 0x0000 - 0xffff | ||
| MiCar | MICAR 6 | A0 (0x0 - 0xf) MiVehicleZone | A1 (0x0 - 0xf) MiVehicleZone* | A2 (0x00 - 0xff) |
📷 [图片: PropId 构成表 — AAOS 与 MiCar 的位段分配对照,原文以 7 列 HTML 表格呈现,含 VehiclePropertyGroup / VehicleArea / VehiclePropertyType / unique id / MiVehicleZone A0·A1·A2 各列。已在上方以 Markdown 表格还原。]
参考链接:
- AAOS VehiclePropertyGroup: https://cs.android.com/android/platform/superproject/%20/master:out/soong/.intermediates/hardware/interfaces/automotive/vehicle/2.0/android.hardware.automotive.vehicle-V2.0-java-shallow/android_common/xref/srcjars.xref/android/hardware/automotive/vehicle/V2_0/VehiclePropertyGroup.java
- AAOS VehicleArea: https://cs.android.com/android/platform/superproject/%20/master:out/soong/.intermediates/hardware/interfaces/automotive/vehicle/2.0/android.hardware.automotive.vehicle-V2.0-java-shallow/android_common/xref/srcjars.xref/android/hardware/automotive/vehicle/V2_0/VehicleArea.java
- AAOS VehiclePropertyType: https://cs.android.com/android/platform/superproject/%20/master:packages/services/Car/car-lib/src/android/car/VehiclePropertyType.java
propId 组装示例:
KEYBOARD_UP = 1631589891 /* (0x03 | MiVehicleZoneBody:KEYBOARD | MiVehiclePropertyGroup:MICAR | VehiclePropertyType:INT32 | VehicleArea:GLOBAL) */,当前实现 :
目前采用 双通道兼容方案 (2.b) , 在 Android 内部使用2套通信链路,来保证各 MICar APP 以及 AOSP Car App 的正常使用。
📷 [图片: 双通道架构示意图 (readonly diagram block, id=doxcnCnfekDKpY9Og3IhWGG7v7m) — 展示 CarPropertyService 同时提供原生 property service (对应 car-lib, 兼容 AOSP CarApp) 与 mi_property service (对应 mi-car-support-lib, 提供 mi_CarPropertyValue), 两套链路在 VHAL 层汇聚与 QNX 通信。]