后屏投影:信号体系

本篇梳理后排投影涉及的全部车辆信号 ID 与枚举值,以及它们如何映射到 UI。 数据来源:mi.car.config.Peripheral(配置类)与 MiCarPropertyIds。 ⚠️ 配套对抗审查:见文末「ModeTab 只处理枚举子集」一节。

一、信号总览:上下行分离

flowchart LR
    subgraph 上行["上行 (读状态)"]
        S1["PROJECTION_SCREEN_STATUS<br/>0x62b<br/>幕布当前状态"]
        S2["OFF_MODE_NOT_AVAILABLE_REASON<br/>0x62a"]
        S3["PROJECTOR_NOT_AVAILABLE_REASON<br/>0x62f"]
        S4["SCREEN_NOT_AVAILABLE_REASON<br/>0x630"]
        S5["TTS_ANTI_COLLISION_OR_ANTI_PINCH<br/>0x63a"]
        S6["TTS_SEAT_LINKAGE_FAILED<br/>0x63b"]
    end
    subgraph 下行["下行 (写命令)"]
        C1["SCREEN_CONTROL_COMMAND<br/>0x637<br/>模式切换命令"]
        C2["PROJECTION_CHILD_LOCK<br/>0x634<br/>童锁(收发同信号)"]
    end
    S1 -.驱动.-> UI["Tab 选中/loading"]
    S2 & S3 & S4 -.驱动.-> AVAIL["Tab 可用性"]
    S5 & S6 -.驱动.-> TOAST["Toast 提示"]
    C1 -.下发.-> HW1["幕布执行"]
    C2 -.下发.-> HW2["锁定后排物理操控"]
信号 IDhexdec方向用途定义位置
PROJECTION_SCREEN_STATUS0x62b1579上行幕布当前状态(主信号)Peripheral:1147
SCREEN_CONTROL_COMMAND0x6371591下行模式切换命令Peripheral:1255
OFF_MODE_NOT_AVAILABLE_REASON0x62a1578上行「收起」不可用原因Peripheral:1138
PROJECTOR_NOT_AVAILABLE_REASON0x62f1583上行「投影」不可用原因Peripheral:1183
SCREEN_NOT_AVAILABLE_REASON0x6301584上行「屏风模式」不可用原因Peripheral:1192
TEXT_TO_SPEECH_FOR_ANTI_COLLISION_OR_ANTI_PINCH0x63a1594上行防夹/防碰撞 TTSPeripheral:1282
TEXT_TO_SPEECH_FOR_SEAT_LINKAGE_FAILED0x63b1595上行座椅联动失败 TTSPeripheral:1291
PROJECTION_CHILD_LOCK_STATUS0x6341588双向童锁状态/命令Peripheral:~1228

配置类路径:pangu/yu7/vendor/micar/packages/services/MiVehicleService/support-lib/src/mi/car/config/Peripheral.java(项目内通过 MiCarPropertyIds.Display.* 引用)。

二、上行状态:ProjectionScreenStatus(17 个值)

幕布状态枚举远比 UI 展示的 3 个模式复杂。完整 17 个值:

枚举hex含义ModeTab 处理
DEFAULT0x0默认/无效else → -1
OFF0x1收起稳态→ Tab 0(收起)
SUSPENSION_STATUS0x2悬浮稳态⚠️ 未处理(else)
PROJECTION_STATUS0x3投影稳态→ Tab 1(投影)
SCREEN_STATUS0x4屏风模式稳态→ Tab 2(屏风模式)
FOLD_TO_OFF0x5折叠中→收起→ Tab 0 + processing
UNFOLD_TO_SUSPENSION_STATUS0x6展开中→悬浮→ -1 + processing
FOLD_TO_SUSPENSION_STATUS0x7折叠中→悬浮→ -1 + processing
UNFOLD_TO_PROJECTION_STATUS0x8展开中→投影→ Tab 1 + processing
UNFOLD_TO_SCREEN_STATUS0x9展开中→屏风模式→ Tab 2 + processing
SUSPEND_DURING_FOLD_TO_OFF0xA收起过程中暂停⚠️ 未处理
SUSPEND_DURING_UNFOLD_TO_SUSPENSION_*0xB展开到悬浮暂停⚠️ 未处理
SUSPEND_DURING_FOLD_TO_SUSPENSION_*0xC折叠到悬浮暂停⚠️ 未处理
SUSPEND_DURING_UNFOLD_TO_PROJECTION_*0xD展开到投影暂停⚠️ 未处理
SUSPEND_DURING_UNFOLD_TO_SCREEN_*0xE展开到屏风模式暂停⚠️ 未处理
ANTI_COLLISION_SUSPEND0xF防碰撞暂停⚠️ 未处理
ANTI_PINCH_SUSPEND0x10防夹暂停⚠️ 未处理
stateDiagram-v2
    [*] --> OFF
    OFF --> UNFOLD_TO_PROJECTION: 点投影
    UNFOLD_TO_PROJECTION --> PROJECTION_STATUS
    OFF --> UNFOLD_TO_SCREEN: 点屏风模式
    UNFOLD_TO_SCREEN --> SCREEN_STATUS
    OFF --> UNFOLD_TO_SUSPENSION: 点悬浮
    PROJECTION_STATUS --> FOLD_TO_OFF: 点收起
    SCREEN_STATUS --> FOLD_TO_OFF: 点收起
    FOLD_TO_OFF --> OFF
    UNFOLD_TO_PROJECTION --> ANTI_PINCH_SUSPEND: 遇阻
    ANTI_PINCH_SUSPEND --> OFF: 回退

稳态(Tab 高亮):OFF / PROJECTION_STATUS / SCREEN_STATUS(+ 悬浮态无对应 Tab)。 过渡态(loading 转圈 + “调整中” toast):所有 FOLD_TO_* / UNFOLD_TO_*异常暂停态:防夹/防碰撞/中途暂停——这些底层存在但 ModeTab 未显式映射。

三、下行命令:ScreenControlCommand(7 个值)

枚举hex含义ModeTab 是否使用
CLOSE0x0收起✅ Tab 0
SUSPENSION0x1悬浮❌ 未使用
PROJECTION0x2投影✅ Tab 1
SCREEN0x3屏风模式✅ Tab 2
STOP0x4停止❌ 未使用
OPEN_REMOTE_CONTROLLER0x5打开遥控器❌ 未使用
STOP_REMOTE_CONTROLLER0x6关闭遥控器❌ 未使用

底层支持 7 种命令,但当前 UI 只暴露 3 个模式 Tab(收起/投影/屏风模式)。悬浮、停止、遥控器等命令未在设置页暴露(可能由其他入口或后续 OTA 使用,见类注释”后续OTA悬浮”)。

四、不可用原因信号与枚举

三个 Tab 各自的不可用原因,由独立信号上报:

4.1 ProjectorNotAvailableReason(投影/屏风模式共用)

枚举hex含义Toast 文案
INVALID0x0无故障(可用)
PROJECTION_SYSTEM_FAILURE0x1投影系统故障投影系统故障,请联系线上服务中心
BED_BOARD_FOLD0x2二层床板已升起二层床板已升起,请放下床板后再使用
SPACE_IS_NOT_ENOUGH0x3空间不足空间不足,暂时无法使用

4.2 ProjectionCommandExecutionFailedReason(收起)

枚举hex含义ModeTab 处理
INVALID0x0无故障(可用)
PROJECTION_SYSTEM_FAILURE0x1系统故障✅ 弹 toast
ANTI_COLLISION_OR_ANTI_PINCH0x2防夹/防碰撞⚠️ 未处理(走 else 日志)
STOP_COMMAND0x3停止命令⚠️ 未处理

⚠️ showDisableReason 对收起模式只处理了 PROJECTION_SYSTEM_FAILURE,ANTI_COLLISION_OR_ANTI_PINCHSTOP_COMMAND 落入 else 分支只打日志(见 01-ModeTabController §4.9)。

4.3 信号 → Tab 映射

flowchart LR
    R0["OFF_MODE_NOT_AVAILABLE_REASON<br/>0x62a"] -->|"!=INVALID"| T0["收起 Tab 禁用"]
    R1["PROJECTOR_NOT_AVAILABLE_REASON<br/>0x62f"] -->|"!=INVALID"| T1["投影 Tab 禁用"]
    R2["SCREEN_NOT_AVAILABLE_REASON<br/>0x630"] -->|"!=INVALID"| T2["屏风模式 Tab 禁用"]

判定逻辑(见 01-ModeTabController §4.7):isPropertyAvailable(信号) && 信号.value == INVALID → Tab 可用。

五、TTS 信号(安全提示)

信号hex触发值Toast 文案
TTS_ANTI_COLLISION_OR_ANTI_PINCH0x63aCommonParams.Request.REQUEST幕布运动受阻,请检查是否有障碍物后再试
TTS_SEAT_LINKAGE_FAILED0x63bCommonParams.Request.REQUEST座椅调整失败,请稍后再试

这两个信号在幕布展开/收起过程中若遇到障碍物或座椅联动失败,车端主动上报,Settings 弹 toast 告知用户。

六、童锁信号:ProjectionChildLockStatus

枚举hex开关状态
INVALID0x0无效(置灰)
LOCKED0x1开(ON,童锁启用)
UNLOCKED0x2关(OFF)

童锁收发同信号(0x634),不像模式 Tab 那样上下行分离。详见 05-核心类拆解/02-ChildLockController

七、关键洞察:ModeTab 只处理枚举子集 ⚠️

这是写知识库时最重要的发现之一,容易被忽略:

枚举完整值数ModeTab 显式处理未处理
ProjectionScreenStatus178(OFF/FOLD_TO_OFF/PROJECTION/SCREEN/UNFOLD_TO_PROJECTION/UNFOLD_TO_SCREEN/UNFOLD_TO_SUSPENSION/FOLD_TO_SUSPENSION)9(含 SUSPENSION_STATUS 稳态、所有 SUSPEND_DURING_、ANTI__SUSPEND)
ScreenControlCommand73(CLOSE/PROJECTION/SCREEN)4(SUSPENSION/STOP/遥控器)
ProjectionCommandExecutionFailedReason41(PROJECTION_SYSTEM_FAILURE)3(ANTI_COLLISION_OR_ANTI_PINCH/STOP_COMMAND/INVALID)

含义:ModeTab 当前实现针对「收起/投影/屏风模式」三个用户可见模式做了完整处理,但底层车辆信号定义了更丰富的状态(悬浮、停止、防夹暂停、遥控器等)。这些未处理的值大多落入 else 分支(返回 -1 或只打日志),不会崩溃,但 UI 上可能表现为”无 Tab 高亮”或”无 toast 提示”。未来若要支持悬浮模式 OTA(类注释提到),需要扩展 propValToTabIndexbuildTabData

此节结论待对抗审查 Agent 验证(见任务 #2)。