后屏投影:信号体系
本篇梳理后排投影涉及的全部车辆信号 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["锁定后排物理操控"]
| 信号 ID | hex | dec | 方向 | 用途 | 定义位置 |
|---|---|---|---|---|---|
PROJECTION_SCREEN_STATUS | 0x62b | 1579 | 上行 | 幕布当前状态(主信号) | Peripheral:1147 |
SCREEN_CONTROL_COMMAND | 0x637 | 1591 | 下行 | 模式切换命令 | Peripheral:1255 |
OFF_MODE_NOT_AVAILABLE_REASON | 0x62a | 1578 | 上行 | 「收起」不可用原因 | Peripheral:1138 |
PROJECTOR_NOT_AVAILABLE_REASON | 0x62f | 1583 | 上行 | 「投影」不可用原因 | Peripheral:1183 |
SCREEN_NOT_AVAILABLE_REASON | 0x630 | 1584 | 上行 | 「屏风模式」不可用原因 | Peripheral:1192 |
TEXT_TO_SPEECH_FOR_ANTI_COLLISION_OR_ANTI_PINCH | 0x63a | 1594 | 上行 | 防夹/防碰撞 TTS | Peripheral:1282 |
TEXT_TO_SPEECH_FOR_SEAT_LINKAGE_FAILED | 0x63b | 1595 | 上行 | 座椅联动失败 TTS | Peripheral:1291 |
PROJECTION_CHILD_LOCK_STATUS | 0x634 | 1588 | 双向 | 童锁状态/命令 | 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 处理 |
|---|---|---|---|
DEFAULT | 0x0 | 默认/无效 | else → -1 |
OFF | 0x1 | 收起稳态 | → Tab 0(收起) |
SUSPENSION_STATUS | 0x2 | 悬浮稳态 | ⚠️ 未处理(else) |
PROJECTION_STATUS | 0x3 | 投影稳态 | → Tab 1(投影) |
SCREEN_STATUS | 0x4 | 屏风模式稳态 | → Tab 2(屏风模式) |
FOLD_TO_OFF | 0x5 | 折叠中→收起 | → Tab 0 + processing |
UNFOLD_TO_SUSPENSION_STATUS | 0x6 | 展开中→悬浮 | → -1 + processing |
FOLD_TO_SUSPENSION_STATUS | 0x7 | 折叠中→悬浮 | → -1 + processing |
UNFOLD_TO_PROJECTION_STATUS | 0x8 | 展开中→投影 | → Tab 1 + processing |
UNFOLD_TO_SCREEN_STATUS | 0x9 | 展开中→屏风模式 | → Tab 2 + processing |
SUSPEND_DURING_FOLD_TO_OFF | 0xA | 收起过程中暂停 | ⚠️ 未处理 |
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_SUSPEND | 0xF | 防碰撞暂停 | ⚠️ 未处理 |
ANTI_PINCH_SUSPEND | 0x10 | 防夹暂停 | ⚠️ 未处理 |
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 是否使用 |
|---|---|---|---|
CLOSE | 0x0 | 收起 | ✅ Tab 0 |
SUSPENSION | 0x1 | 悬浮 | ❌ 未使用 |
PROJECTION | 0x2 | 投影 | ✅ Tab 1 |
SCREEN | 0x3 | 屏风模式 | ✅ Tab 2 |
STOP | 0x4 | 停止 | ❌ 未使用 |
OPEN_REMOTE_CONTROLLER | 0x5 | 打开遥控器 | ❌ 未使用 |
STOP_REMOTE_CONTROLLER | 0x6 | 关闭遥控器 | ❌ 未使用 |
底层支持 7 种命令,但当前 UI 只暴露 3 个模式 Tab(收起/投影/屏风模式)。悬浮、停止、遥控器等命令未在设置页暴露(可能由其他入口或后续 OTA 使用,见类注释”后续OTA悬浮”)。
四、不可用原因信号与枚举
三个 Tab 各自的不可用原因,由独立信号上报:
4.1 ProjectorNotAvailableReason(投影/屏风模式共用)
| 枚举 | hex | 含义 | Toast 文案 |
|---|---|---|---|
INVALID | 0x0 | 无故障(可用) | — |
PROJECTION_SYSTEM_FAILURE | 0x1 | 投影系统故障 | 投影系统故障,请联系线上服务中心 |
BED_BOARD_FOLD | 0x2 | 二层床板已升起 | 二层床板已升起,请放下床板后再使用 |
SPACE_IS_NOT_ENOUGH | 0x3 | 空间不足 | 空间不足,暂时无法使用 |
4.2 ProjectionCommandExecutionFailedReason(收起)
| 枚举 | hex | 含义 | ModeTab 处理 |
|---|---|---|---|
INVALID | 0x0 | 无故障(可用) | — |
PROJECTION_SYSTEM_FAILURE | 0x1 | 系统故障 | ✅ 弹 toast |
ANTI_COLLISION_OR_ANTI_PINCH | 0x2 | 防夹/防碰撞 | ⚠️ 未处理(走 else 日志) |
STOP_COMMAND | 0x3 | 停止命令 | ⚠️ 未处理 |
⚠️
showDisableReason对收起模式只处理了PROJECTION_SYSTEM_FAILURE,ANTI_COLLISION_OR_ANTI_PINCH和STOP_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_PINCH | 0x63a | CommonParams.Request.REQUEST | 幕布运动受阻,请检查是否有障碍物后再试 |
TTS_SEAT_LINKAGE_FAILED | 0x63b | CommonParams.Request.REQUEST | 座椅调整失败,请稍后再试 |
这两个信号在幕布展开/收起过程中若遇到障碍物或座椅联动失败,车端主动上报,Settings 弹 toast 告知用户。
六、童锁信号:ProjectionChildLockStatus
| 枚举 | hex | 开关状态 |
|---|---|---|
INVALID | 0x0 | 无效(置灰) |
LOCKED | 0x1 | 开(ON,童锁启用) |
UNLOCKED | 0x2 | 关(OFF) |
童锁收发同信号(0x634),不像模式 Tab 那样上下行分离。详见
05-核心类拆解/02-ChildLockController。
七、关键洞察:ModeTab 只处理枚举子集 ⚠️
这是写知识库时最重要的发现之一,容易被忽略:
| 枚举 | 完整值数 | ModeTab 显式处理 | 未处理 |
|---|---|---|---|
ProjectionScreenStatus | 17 | 8(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) |
ScreenControlCommand | 7 | 3(CLOSE/PROJECTION/SCREEN) | 4(SUSPENSION/STOP/遥控器) |
ProjectionCommandExecutionFailedReason | 4 | 1(PROJECTION_SYSTEM_FAILURE) | 3(ANTI_COLLISION_OR_ANTI_PINCH/STOP_COMMAND/INVALID) |
含义:ModeTab 当前实现针对「收起/投影/屏风模式」三个用户可见模式做了完整处理,但底层车辆信号定义了更丰富的状态(悬浮、停止、防夹暂停、遥控器等)。这些未处理的值大多落入 else 分支(返回 -1 或只打日志),不会崩溃,但 UI 上可能表现为”无 Tab 高亮”或”无 toast 提示”。未来若要支持悬浮模式 OTA(类注释提到),需要扩展 propValToTabIndex 和 buildTabData。
此节结论待对抗审查 Agent 验证(见任务 #2)。