手套箱物理按键 · 需求与信号契约
本篇是「手套箱增加物理按键」(Meego 5458412) 专项的第一篇:回答这个功能要做什么、涉及哪些 CAN 信号与车辆属性、每个值什么意思、功能可用性到底以谁为准。 现有软按键手套箱功能全景见 00-手套箱-README,四个手套箱属性的读写通道与现有语义见 06-属性通道与台架mock,本篇只讲物理按键带来的增量契约。
基线声明
- 主锚点(W):
/home/zbc/car/fuben4_micarsettings/MiCarSettings-5458412,origin/dev @ 930be9145。行号默认以此为准。 - 出货对照:
/home/zbc/car/pack_a17_cn_20260923(pack_a17_cn_20260923 快照)——已核实该快照GloveBoxController.kt:176/289与 dev 同型,且全文检索不到GLOVE_BOX_BUTTON_STATUS,即物理按键适配在出货线尚未开始。 - 平台源码:
/home/zbc/pangu/xcd_xring_a17_fermi/vendor/micar。 - 需求素材:
/home/zbc/下载/test/车机Feature/Meego 5458412/(docs/kb/research 三个子目录)。
1. 功能是什么(30 秒版)
现状(已有功能):设置 → 车辆控制 → 手套箱,软按键开箱——点击后 HMI 向属性 Peripheral.GLOVE_BOX 写 OPEN(1),手套箱电动弹开;关闭永远是用户手动物理合上,软件只开不关。可选 4 位数字密码,启用后开箱先校验密码。
本需求新增(Meego 5458412):Modena-L / MANN 车型手套箱增加物理按键,按下物理按键可打开手套箱,仍需手动关闭;物理按键必须适配密码开锁(PRD 背景原文,手套箱增加物理按键.md:14-17)。
交互主依据是 SSC REQ003(SSC530171801-REQ003-物理按键按下交互方案.md:17-59):
- 前置条件:车辆模式为 Acc/Run(方案 1,FD&FR 明确 Awake 场景不做,见
FDFR-Modena-L-MANN手套箱实体按键及电释放锁.md:33-35)。 - 触发源:SC12 反馈手套箱实体开关状态变为【开关按下】,即 CAN
GlvBoxBtnSts = 0x2: Psd。 - 执行逻辑:同 HMI 软按键按下的逻辑——
- 功能不可用(
GlvBoxDcdFcnAvl=0x1: NotAvl或信号丢失)→ 按GlvBoxDcdDiRsn弹 toast 告知原因; - 功能可用(
GlvBoxDcdFcnAvl=0x0: Avl)且密码启用 → 弹密码输入页,校验通过则请求 SC12 开箱; - 可用且密码停用 → 做可用性校验,通过则请求开箱,失败退出并 toast;
- 手套箱已是开启状态 → toast 提示请手动关闭。
- 功能不可用(
交付边界(重要):本需求 HMI 侧只做「接收按键事件 → 复用软按键开箱流 → 不可用 toast」三件事。
- SC12 电动门控制(他组):采集硬按键状态并反馈、20s 卡滞判定(可标定)、软件滤波、休眠唤醒后仍反馈真实状态、驱动电释放锁(FDFR FR005,
FDFR-Modena-L-MANN手套箱实体按键及电释放锁.md:37-39)。 - SC49 系统设置与基础服务(他组):密码信息校验协作——流程白板 a 路径明确「手套箱可用性请求 非代客泊车&车主账号 → 手套箱可用应答」(
FDFR-方案1与流程白板.md:83-85),b 路径「密码校验请求 → 密码校验通过」(FDFR-方案1与流程白板.md:94-95)。 - 交付车型/版本:Mann 28A / E4;Modena L 27C / E4U3,Sprint2610(
meego-5458412-需求原文.md:55-56)。开发 3 人天,排期 10-20~10-22,提测 2026-10-19,代码合入 DDL 2026-10-23(meego-5458412-需求原文.md:24-25,106-107)。
flowchart LR subgraph 他组 SC12["SC12 电动门控制<br/>采集按键/卡滞判定/驱动电释放锁"] SC49["SC49 系统设置与基础服务<br/>密码信息/可用性协作"] end subgraph 本需求["本需求 = SC53 控制设置HMI(MiCarSettings)"] HMI["接收按键按下事件<br/>复用软按键开箱流<br/>不可用 toast"] end SC12 -- "GlvBoxBtnSts=0x2:Psd" --> HMI HMI -- "密码校验/可用性请求" --> SC49 SC49 -- "校验结果" --> HMI HMI -- "请求手套箱开启" --> SC12
2. CAN 信号三件套
SSC REQ003 全文只出现三个 CAN 信号,全部来自 SC12(手套箱 DCD 所在域)。这是 HMI 与底层之间的全部输入契约:
| CAN 信号 | 方向 | 值枚举 | 含义 | HMI 用途 |
|---|---|---|---|---|
GlvBoxBtnSts | SC12 → HMI | 0x2: Psd = 开关按下(REQ003 只给了这一值;FDFR FR005 补充开关状态三态:按下/未按下/卡滞,按下 ≥20s 判卡滞,跳变未按下立即清卡滞) | 物理按键状态 | 开箱触发源:变为 Psd 时启动开箱流程 |
GlvBoxDcdFcnAvl | SC12 → HMI | 0x0: Avl = 可用;0x1: NotAvl = 不可用;丢失也按不可用处理 | 手套箱功能可用性 | 决定走「开箱」还是「toast」分支 |
GlvBoxDcdDiRsn | SC12 → HMI | 0x0: Idle = 可用;0x1: NotDisArmed = 未解防;0x2: AntyPlay = 防玩 | 不可用原因 | 不可用时 toast 的文案依据 |
注意 REQ003 原文对 GlvBoxDcdDiRsn 的措辞是「0x0: Idle 表示可用」——即 reason=Idle 与 fcnAvl=Avl 在语义上对齐,但不可用原因只在不可用时才有意义(详见 §5 的禁用推论)。
3. 平台属性映射层
CAN 信号不会直接到 App,中间经 VHAL 属性化。平台 support-lib 已定义五个手套箱相关属性 = 四个 Peripheral 属性(既有软按键时代就有) + 一个 Body 属性(为物理按键新增)。
3.1 属性总表
| 属性 | propId(hex / dec) | access | changeMode | initialValue | 值枚举 | 权限注解 |
|---|---|---|---|---|---|---|
Peripheral.GLOVE_BOX | 0x6140b407 / 1631630343 | READ_WRITE | ON_CHANGE | 0 | CommonParams.OpenClose{CLOSE=0, OPEN=1} | PERMISSION_VENDOR_EXTENSION |
Peripheral.GLOVE_BOX_MOTOR_CMD | 0x6140b408 / 1631630344 | READ | ON_CHANGE | 0 | GloveBoxMotorCmd{IDLE=0, CLOCKWISE=1, COUNTER_CLOCKWISE=2, BREAK=3} | PERMISSION_CAR_INFO |
Peripheral.GLOVE_BOX_LOCK_TYPE_CONFIG | 0x6140b409 / 1631630345 | READ | ON_CHANGE | 0 | GloveBoxLockTypeConfig{MANUAL=1, POWER=2} | PERMISSION_CAR_INFO |
Peripheral.GLOVE_BOX_UNAVL_REASON | 0x6140b40a / 1631630346 | READ | ON_CHANGE | 0 | GloveBoxUnavlReason{IDLE=0, NOT_DIS_ARMED=1, ANTY_PLAY=2} | PERMISSION_CAR_INFO |
Body.GLOVE_BOX_BUTTON_STATUS | 0x61401781 / 1631590273 | READ | ON_CHANGE | 0 | GloveBoxButtonStatus{ERROR=0, NOT_PRESSED=1, PRESSED=2, NO_INFO=3} | PERMISSION_CONTROL_CAR_FEATURES |
3.2 定义出处(逐条核实)
四个 Peripheral 属性定义在 Peripheral.java:572-610(GLOVE_BOX=0x407 ~ GLOVE_BOX_UNAVL_REASON=0x40a,均 MiVehicleArea.GLOBAL | INT32 | MiVehicleZone.PERIPHERAL),枚举类在 Peripheral.java:1414-1430(GloveBoxMotorCmd/GloveBoxLockTypeConfig/GloveBoxUnavlReason)。OpenClose 枚举在 CommonParams.java:45-48(CLOSE=0/OPEN=1)。
GLOVE_BOX_BUTTON_STATUS 定义在 Body.java:1841-1848:
@PropertyDef(
permission = @RequiresPermission(Car.PERMISSION_CONTROL_CAR_FEATURES),
value = @ValueDef(valueEnum = GloveBoxButtonStatus.class))
public static final int GLOVE_BOX_BUTTON_STATUS = 0x781
| MiVehiclePropertyGroup.MI_CAR
| MiVehicleArea.GLOBAL
| VehiclePropertyType.INT32
| MiVehicleZone.BODY; /*0x61401781*/其枚举在 Body.java:6948-6953:ERROR=0x0 / NOT_PRESSED=0x1 / PRESSED=0x2 / NO_INFO=0x3。注意这里与 CAN 侧 GlvBoxBtnSts=0x2:Psd 的语义对齐——PRESSED=0x2 就是按键按下的属性化表达;卡滞(stuck)态在四枚举中没有独立值,映射关系属底层确认项(§5 末尾)。
3.3 VHAL 默认配置(AIDL 层)
AIDL 枚举值:MiVehicleProperty.aidl:26138-26164 给出 OTHER_GLOVE_BOX(0x6140B407/1631630343)、OTHER_GLOVE_BOX_MOTOR_CMD(/1631630344)、OTHER_GLOVE_BOX_LOCK_TYPE_CONFIG(/1631630345)、OTHER_GLOVE_BOX_UNAVL_REASON(/1631630346);MiVehicleProperty.aidl:1614-1619 给出 SYSTEM_GLOVE_BOX_BUTTON_STATUS(0x61401781/1631590273)。
默认配置(DefaultAidlVehicleConfig.cpp):
36503-36510:OTHER_GLOVE_BOX→ READ_WRITE / ON_CHANGE / initialValue=036512-36519:OTHER_GLOVE_BOX_MOTOR_CMD→ READ / ON_CHANGE / 036521-36528:OTHER_GLOVE_BOX_LOCK_TYPE_CONFIG→ READ / ON_CHANGE / 036530-36537:OTHER_GLOVE_BOX_UNAVL_REASON→ READ / ON_CHANGE / 02198-2205:SYSTEM_GLOVE_BOX_BUTTON_STATUS→ READ / ON_CHANGE / 0
要点:五个属性全部 ON_CHANGE 推送;HMI 唯一可写的是 GLOVE_BOX(写 OPEN 开箱);按键状态属性 READ-only,HMI 只能订阅不能回写。
3.4 前置条件属性(电源/车辆模式)
REQ003 前置条件「车辆模式为 Acc/Run」对应平台属性 Driving.POWER_MODE = 0x207 → 0x61407207(dec 1631613447,换算值),定义 Driving.java:2423-2430,枚举 PowerStatus(Driving.java:10876-10885):OFF=0 / AWAKE=1 / ACC=2 / RUN=3(ON=3、START=4 已 @Deprecated)。
另外流程中「非代客泊车&车主账号」门控用到 Driving.CAR_MODE_STATUS = 0x20B → 0x6140720B(dec 1631613451,换算值),定义 Driving.java:2463-2470,枚举 CarModeStatus(Driving.java:11052-11063,NORMAL=0 等)。现有软按键页已在订阅它(GloveBoxController.kt:99-102),代客判断走 AccountUtils.isValetMode(GloveBoxController.kt:182-185)。
4. SDK 常量实证(0.11.70-SNAPSHOT)
对 vehicle-support-0.11.70-SNAPSHOT 编译产物跑 javap,证明 SDK 已含全部所需常量,App 侧不需要等平台发新版:
research/javap-vehicle-support-0.11.70-手套箱与电源.txt:
65: public static final int GLOVE_BOX = 1631630343;
66: public static final int GLOVE_BOX_MOTOR_CMD = 1631630344;
67: public static final int GLOVE_BOX_LOCK_TYPE_CONFIG = 1631630345;
68: public static final int GLOVE_BOX_UNAVL_REASON = 1631630346;同文件 153-165 行含 Peripheral$GloveBoxMotorCmd(IDLE=0/CLOCKWISE=1/COUNTER_CLOCKWISE=2/BREAK=3)与 Peripheral$GloveBoxUnavlReason(IDLE=0/NOT_DIS_ARMED=1/ANTY_PLAY=2);168-175 行含 Driving$PowerStatus(OFF=0/AWAKE=1/ACC=2/RUN=3)。
research/javap-vehicle-support-0.11.70-物理按键.txt:
224: public static final int GLOVE_BOX_BUTTON_STATUS = 1631590273;
603-608: Body$GloveBoxButtonStatus { ERROR = 0; NOT_PRESSED = 1; PRESSED = 2; NO_INFO = 3; }十进制值与 §3 的 hex 定义逐一吻合(1631630343=0x6140b407 … 1631590273=0x61401781)。
5. 功能可用性以谁为准(重要)
这是本需求最容易做错的一点。结论先行:
HMI 侧的事实标准是
GLOVE_BOX属性的 CarPropertyValue.status(STATUS_AVAILABLE与否),用VehiclePropertyUtil.isPropertyAvailable()判;不可用的原因用GLOVE_BOX_UNAVL_REASON的值解释。
5.1 现有代码就是这样做的(实证)
GloveBoxController.kt:173-178(软按键页,dev 与出货快照同型):
val gloveBoxStatus = getProperty(MiCarPropertyIds.DrivingCtrl.GLOVE_BOX)
...
gloveBoxSwitchTab?.isAvailable = VehiclePropertyUtil.isPropertyAvailable(gloveBoxStatus)
gloveBoxSwitchTab?.mIsSelected = VehiclePropertyUtil
.getIntPropertyValue(gloveBoxStatus) == CommonParams.OpenClose.OPENVehiclePropertyUtil.java:173-182:null 即不可用,mock 不可用优先,最终判据是 vehicleProperty.getStatus() == MiCarPropertyValue.STATUS_AVAILABLE。SettingsCarPropertyManager.kt:333-335 提供 isPropertyAvailable(propId) 便捷封装。
不可用 toast 的原因取值在 GloveBoxController.kt:288-302:读 Peripheral.GLOVE_BOX_UNAVL_REASON,NOT_DIS_ARMED → 「需要先解锁车辆」,ANTY_PLAY → 「防玩模式下不可用」,其余落到代客模式兜底判断。
物理按键按下后应复用同一套判据(REQ003 原文即「同 HMI 软按键按下的逻辑」):先判 GLOVE_BOX 属性 status 可用性,不可用则按 GLOVE_BOX_UNAVL_REASON 弹 toast,可用再进密码分支。
5.2 GlvBoxDcdFcnAvl 的地位:底层输入,App 无独立属性可订阅
REQ003 把「不可用」定义为 [CAN] GlvBoxDcdFcnAvl=0x1: NotAvl 或 丢失。但对这条 CAN 信号:
- 平台可见源码(
vendor/micar全树 grepGlvBox*)检索不到任何映射实现——没有名为 FcnAvl 的属性,也没有GlvBoxDcdFcnAvl字样; - SDK 常量(javap 两文件全量)中也没有对应的独立属性。
因此 GlvBoxDcdFcnAvl 是底层 CAN 输入,其对 App 的可见表达只可能经由既有属性的 status 位(不可用/超时)或 value 折叠。具体折叠方式当前不可见,属底层确认项。
5.3 两条禁令(写代码/判问题时必须遵守)
- 禁止用
GLOVE_BOX.value == 0推断可用。value=0 是OpenClose.CLOSE,是合法状态值;可用性在 status 字段,不在 value。属性 initialValue 也是 0(DefaultAidlVehicleConfig.cpp:36509),用 value 判可用会在开机未上报窗口产生假「不可用」或假「关闭」。 - 禁止用
GLOVE_BOX_UNAVL_REASON == IDLE反推可用。reason 的初值就是 0(IDLE,DefaultAidlVehicleConfig.cpp:36536),信号未到时它也是 IDLE;REQ003 的语义是「不可用时按 reason 给文案」,reason=Idle 只是「没有原因可报」,不等于「可用」。
5.4 底层确认项(提测前需与 SC12/平台拉齐的三个问题)
- 按键映射:
GlvBoxBtnSts(CAN) →Body.GLOVE_BOX_BUTTON_STATUS(0x61401781) 的映射实现在哪个模块?MiVehicleService 可见源码 grep 不到GlvBox*信号名。卡滞(按下 ≥20s)态映射到ERROR(0)还是NO_INFO(3)?CAN 值域(REQ003 只写 0x2:Psd)与属性四枚举如何一一对应? - 可用性折叠:
GlvBoxDcdFcnAvl不可用/丢失时,底层是把GLOVE_BOX的 status 打成 UNAVAILABLE(或置 timeout bit),还是改 value?「信号丢失」在属性层如何表达? - reason 同步时序:
GlvBoxDcdDiRsn→GLOVE_BOX_UNAVL_REASON是否值域 1:1(0/1/2 完全对齐)?GLOVE_BOX被打成不可用时 reason 是否保证已刷新(否则 toast 会读到上一次的残值)?
6. 区域与权限
- 区域:五个属性全部
MiVehicleArea.GLOBAL(整车唯一,不分左右/座位);zone 前缀上,四个 Peripheral 属MiVehicleZone.PERIPHERAL(0x6140b4xx),按键状态属MiVehicleZone.BODY的 SYSTEM 段(0x61401781)。App 侧订阅用DEFAULT_AREA_ID即可(SettingsCarPropertyManager.kt:333-335签名)。 - 权限注解(@RequiresPermission,实际校验以此为准):
GLOVE_BOX:Car.PERMISSION_VENDOR_EXTENSION(写开箱需要,Peripheral.java:572-573)GLOVE_BOX_MOTOR_CMD/GLOVE_BOX_LOCK_TYPE_CONFIG/GLOVE_BOX_UNAVL_REASON:Car.PERMISSION_CAR_INFOGLOVE_BOX_BUTTON_STATUS:Car.PERMISSION_CONTROL_CAR_FEATURES(Body.java:1842)- 前置条件
POWER_MODE/CAR_MODE_STATUS:Car.PERMISSION_CAR_DRIVING_STATE(Driving.java:2424, 2464)
- 平台另有声明
android.car.permission.CONTROL_GLOVE_BOX(signature|privileged,MiVehicleService/service/updatable/api37/AndroidManifest.xml:123-126,api33 同位置亦有),但 MiVehicleService 的 Java/Kotlin 源码中检索不到该权限的引用点——即它是声明在册的平台权限,手套箱属性实际访问控制以各属性的@RequiresPermission注解为准。
7. 全链路与 mock 注入点
flowchart LR subgraph CAN["CAN 总线(SC12 域)"] S1["GlvBoxBtnSts<br/>0x2:Psd 按下"] S2["GlvBoxDcdFcnAvl<br/>0x0:Avl / 0x1:NotAvl / 丢失"] S3["GlvBoxDcdDiRsn<br/>0x0:Idle / 0x1:NotDisArmed / 0x2:AntyPlay"] end subgraph VHAL["VHAL 层(vehicled)"] M["CAN→属性映射实现<br/>⚠️可见源码未找到 = 底层确认项 §5.4"] Cfg["DefaultAidlVehicleConfig.cpp<br/>36503-36537 四属性 + 2198-2205 按键属性<br/>全部 ON_CHANGE / initial=0"] end subgraph FW["CarService(PropServer)→ CarPropertyManager(SDK 0.11.70)"] P1["Peripheral.GLOVE_BOX 0x6140b407 RW"] P2["GLOVE_BOX_UNAVL_REASON 0x6140b40a RO"] P3["GLOVE_BOX_LOCK_TYPE_CONFIG 0x6140b409 RO"] P4["Body.GLOVE_BOX_BUTTON_STATUS 0x61401781 RO"] end subgraph APP["MiCarSettings(App)"] SPM["SettingsCarPropertyManager<br/>isPropertyAvailable(propId) :333"] VPU["VehiclePropertyUtil.isPropertyAvailable :173<br/>判 STATUS_AVAILABLE"] CTL["GloveBoxController<br/>订阅 :99-102 / 开箱写 OPEN :222-228<br/>toast :288-302"] UI["车辆控制页 UI<br/>软按键 + 物理按键共用逻辑"] end S1 --> M S2 --> M S3 --> M M --> Cfg --> P1 & P2 & P3 & P4 P1 & P2 & P4 --> SPM --> VPU --> CTL --> UI P3 -. 配置字门控(显示与否) .-> CTL MOCK["🧪 App 侧 mock 注入点:VehiclePropertyUtil.isPropertyMockUnavailable :165-170<br/>(sMockUnavailable + MOCK_PROPERTY_ID_ALL 指定 propId 强制不可用)"] -.-> VPU
- App 侧注入点(有码可证):
VehiclePropertyUtil.java:165-170,sMockUnavailable打开后按 propId 强制不可用,可直接验证「不可用 → toast」分支。 - VHAL/台架侧注入(信号级 mock,把 GlvBoxBtnSts/Avl/Rsn 注进 vehicled):属通用信号 mock 流程,配方见 skill
car-signal-mock-test与本库后续篇章,本篇不展开。
8. 本篇结论一页纸
- 功能 = 物理按键按下(
GlvBoxBtnSts=0x2:Psd)触发与软按键完全相同的开箱流;前置 Acc/Run;只做开不做关;边界仅 HMI,SC12/SC49 归他组。 - 契约 = 三个 CAN 信号 + 五个平台属性;
GLOVE_BOX(RW,写 OPEN 开箱)、GLOVE_BOX_UNAVL_REASON(RO,toast 依据)、GLOVE_BOX_BUTTON_STATUS(RO,0x61401781,按键事件入口,新增)、外加配置字GLOVE_BOX_LOCK_TYPE_CONFIG与前置POWER_MODE/CAR_MODE_STATUS。 - 可用性判据 =
GLOVE_BOX的 status(isPropertyAvailable),原因看UNAVL_REASON;禁止用 value=0 或 reason=IDLE 反推。 - SDK 0.11.70-SNAPSHOT 常量已齐,App 侧开发不依赖平台发版;剩三个底层确认项(§5.4)待与 SC12/平台拉齐。
证据清单
| 文件 | 行号区间 | 说明 |
|---|---|---|
/home/zbc/下载/test/车机Feature/Meego 5458412/docs/手套箱增加物理按键.md | 14-17 | PRD 背景:物理按键开箱、手动关闭、适配密码开锁 |
/home/zbc/下载/test/车机Feature/Meego 5458412/kb/SSC530171801-REQ003-物理按键按下交互方案.md | 17-59 | 交互主依据:前置 Acc/Run、三信号值枚举、执行逻辑全文 |
/home/zbc/下载/test/车机Feature/Meego 5458412/kb/FDFR-Modena-L-MANN手套箱实体按键及电释放锁.md | 33-39 | 方案 1 选定(不含 Awake)、SC53/SC12 FR005(卡滞 20s 可标定) |
/home/zbc/下载/test/车机Feature/Meego 5458412/kb/FDFR-方案1与流程白板.md | 43-51, 83-95 | SC53/SC49/SC12 三方职责与密码/可用性协作时序 |
/home/zbc/下载/test/车机Feature/Meego 5458412/docs/meego-5458412-需求原文.md | 24-25, 55-57, 106-107 | 负责人/估分/排期、交付版本 Mann 28A E4 与 Modena L 27C E4U3、提测与合入 DDL |
vendor/micar/.../support-lib/src/mi/car/config/Peripheral.java | 572-610, 1414-1430 | 四个手套箱属性定义(0x407-0x40a)与三个枚举类 |
vendor/micar/.../support-lib/src/mi/car/config/CommonParams.java | 45-48 | OpenClose{CLOSE=0, OPEN=1} |
vendor/micar/.../support-lib/src/mi/car/config/Body.java | 1841-1848, 6948-6953 | GLOVE_BOX_BUTTON_STATUS=0x781 定义与 GloveBoxButtonStatus 四枚举 |
vendor/micar/.../support-lib/src/mi/car/config/Driving.java | 2423-2430, 2463-2470, 10876-10885, 11052-11063 | POWER_MODE/CAR_MODE_STATUS 定义与 PowerStatus(ACC=2/RUN=3)/CarModeStatus 枚举 |
vendor/micar/.../aidlproperty/MiVehicleProperty.aidl | 1614-1619, 26138-26164 | AIDL 侧五属性枚举值(hex+dec 注释) |
vendor/micar/.../aidlproperty/DefaultAidlVehicleConfig.cpp | 2198-2205, 36503-36537 | 五属性默认 access/changeMode/initialValue |
vendor/micar/.../service/updatable/api37/AndroidManifest.xml | 123-126 | CONTROL_GLOVE_BOX 权限声明(signature|privileged) |
Meego 5458412/research/javap-vehicle-support-0.11.70-手套箱与电源.txt | 65-68, 153-175 | SDK 侧四属性+枚举+PowerStatus 常量实证 |
Meego 5458412/research/javap-vehicle-support-0.11.70-物理按键.txt | 224, 603-608 | SDK 侧 GLOVE_BOX_BUTTON_STATUS 与枚举实证 |
MiCarSettings-5458412/.../miauto/vehicle/MiCarPropertyIds.java(base/settingsBaseLib) | 1485-1487 | App 侧 GLOVE_BOX / GLOVE_BOX_TYPE 属性别名 |
MiCarSettings-5458412/.../miauto/CarConfigManager.kt(base/settingsVehicleLib) | 139-146 | getGloveBoxLockType() 读配置字,默认 MANUAL |
MiCarSettings-5458412/.../vehicle/glovebox/GloveBoxController.kt | 99-102, 173-178, 182-185, 222-228, 288-302 | 订阅集合、可用性判据、代客/车主门控、写 OPEN 开箱、reason→toast 映射 |
MiCarSettings-5458412/.../vehicle/VehiclePropertyUtil.java(base/settingsVehicleLib) | 165-182 | isPropertyAvailable 判 STATUS_AVAILABLE;mock 不可用注入点 |
MiCarSettings-5458412/.../vehicle/SettingsCarPropertyManager.kt(base/settingsVehicleLib) | 333-335 | isPropertyAvailable(propId, areaId) 封装 |