信号 Status 值扩展说明
背景
由于原生 CarPropertyValue#getStatus 的状态中,不包含 timeout 逻辑,所以在最初实现中,将 timeout 和 unavailable 合二为一处理了(能覆盖 95% 的场景)(之前 E3 后期的部分需求不满足也是因为此,比如部分信号 timeout 和 unavailable 在仪表中,表现不一致)。
SC 中 Timeout 与 unavailable 表现不一致示例
以信号 VCUBookchrgnOnOffSts 为例(MICOCKPIT-6791),在 E3 仪表与车控的表现不一致,E4 阶段是一致的。
- 仪表中的期望表现(E3 Link)

- 车控中的期望表现(E3 Link)

目前待定方案
拓展 CarPropertyValue#getStatus 值,新增 timeout 属性。
原生定义(Link)
/**
* CarPropertyValue is available.
*/
public static final int STATUS_AVAILABLE = 0;
/**
* CarPropertyValue is unavailable.
*/
public static final int STATUS_UNAVAILABLE = 1;
/**
* CarPropertyVale has an error.
*/
public static final int STATUS_ERROR = 2;新定义
public static final int STATUS_AVAILABLE = 0;
public static final int STATUS_UNAVAILABLE = 1;
public static final int STATUS_ERROR = 2;
public static final int STATUS_TIMEOUT = 4;
/*
* STATUS_TIMEOUT | STATUS_UNAVAILABLE
*/
public static final int STATUS_TIMEOUT_UNAVAILABLE = 5;示例
以 Prop:Hvac#POWER (0x65404101) Area:MiVehicleAreaSeat#SEAT_FRONT_ROW(0x7) 前排空调开关(HvacOnOffSt)为例:
HvacOnOffSt : {"0": "Off", "1": "On", "2": "Not_Available", "3": "Not_Used"}下表展示不同 CAN 信号前状态下,各类新信号状态的 mValue/mStatus 映射。第二、三列为 rowspan 合并(对所有前状态相同),第四列为 Not_available/Not_Used,第五列为当前丢失策略:
| CAN 信号前状态 | 0:OFF | 1:On | 2:Not_available / 3:Not_Used( | 当前丢失策略 |
|---|---|---|---|---|
| mValue = 1(ON) mStatus = 1 | mValue = 0(OFF) mStatus = 0 | mValue = 1(ON) mStatus = 0 | mValue = 1(ON) mStatus = 1 | mValue = 1(ON) mStatus = 5 |
| mValue = 1(ON) mStatus = 0 | mValue = 0(OFF) mStatus = 0 | mValue = 1(ON) mStatus = 0 | mValue = 1(ON) mStatus = 1 | mValue = 1(ON) mStatus = 4 |
| mValue = 0(OFF) mStatus = 1 | mValue = 0(OFF) mStatus = 0 | mValue = 1(ON) mStatus = 0 | mValue = 0(OFF) mStatus = 1 | mValue = 0(OFF) mStatus = 5 |
| mValue = 0(OFF) mStatus = 0 | mValue = 0(OFF) mStatus = 0 | mValue = 1(ON) mStatus = 0 | mValue = 0(OFF) mStatus = 1 | mValue = 0(OFF) mStatus = 4 |
影响
对大部分应用带来的影响是判断条件改为 carPropertyValue.getStatus() == STATUS_AVAILABLE,而不是 carPropertyValue.getStatus() != STATUS_UNAVAILABLE,特殊场景需应用按需使用。
CarPropertyManager.CarPropertyEventCallback mCallback
= new CarPropertyManager.CarPropertyEventCallback() {
@Override
public void onChangeEvent(CarPropertyValue value) {
//if (value.getStatus() == CarPropertyValue.STATUS_UNAVAILABLE) {
if (value.getStatus() != CarPropertyValue.STATUS_AVAILABLE) {
disableView(value);
return;
}
refreshView(value);
}
@Override
public void onErrorEvent(int prop, int areaId) {
// no op
}
};提交
http://gerrit.auto.mioffice.cn/c/cockpit/core/platform/android/services/MiVehicleService/+/26484
图片来源:飞书 docx KjfgdM9Udoju0cxlN18c8GM2nkb,2 张截图(仪表/车控 timeout vs unavailable 表现对比)均通过 authcode URL 下载成功并转存至图床(minio.898311.xyz)。