信号 Status 值扩展说明

背景

由于原生 CarPropertyValue#getStatus 的状态中,不包含 timeout 逻辑,所以在最初实现中,将 timeout 和 unavailable 合二为一处理了(能覆盖 95% 的场景)(之前 E3 后期的部分需求不满足也是因为此,比如部分信号 timeout 和 unavailable 在仪表中,表现不一致)。

SC 中 Timeout 与 unavailable 表现不一致示例

以信号 VCUBookchrgnOnOffSts 为例(MICOCKPIT-6791),在 E3 仪表与车控的表现不一致,E4 阶段是一致的。

  1. 仪表中的期望表现(E3 Link

仪表(IC)中 VCUBookchrgnOnOffSts 信号 timeout 与 unavailable 表现对比状态图:展示 E3 阶段仪表对该信号在丢失(unavailable)与超时(timeout)两种场景下不同的显示策略与状态切换时序。

  1. 车控中的期望表现(E3 Link

车控中 VCUBookchrgnOnOffSts 信号 timeout 与 unavailable 表现对比状态图:展示 E3 阶段车控应用对该信号在丢失(unavailable)与超时(timeout)两种场景下的显示策略与状态切换时序,与仪表侧表现存在差异。

目前待定方案

拓展 CarPropertyValue#getStatus 值,新增 timeout 属性。

    /**
     * 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:OFF1:On2: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)。