手套箱物理按键 · 需求与信号契约

本篇是「手套箱增加物理按键」(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 软按键按下的逻辑——
    1. 功能不可用(GlvBoxDcdFcnAvl=0x1: NotAvl 或信号丢失)→ 按 GlvBoxDcdDiRsn 弹 toast 告知原因;
    2. 功能可用(GlvBoxDcdFcnAvl=0x0: Avl)且密码启用 → 弹密码输入页,校验通过则请求 SC12 开箱;
    3. 可用且密码停用 → 做可用性校验,通过则请求开箱,失败退出并 toast;
    4. 手套箱已是开启状态 → 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 用途
GlvBoxBtnStsSC12 → HMI0x2: Psd = 开关按下(REQ003 只给了这一值;FDFR FR005 补充开关状态三态:按下/未按下/卡滞,按下 ≥20s 判卡滞,跳变未按下立即清卡滞)物理按键状态开箱触发源:变为 Psd 时启动开箱流程
GlvBoxDcdFcnAvlSC12 → HMI0x0: Avl = 可用;0x1: NotAvl = 不可用;丢失也按不可用处理手套箱功能可用性决定走「开箱」还是「toast」分支
GlvBoxDcdDiRsnSC12 → HMI0x0: 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)accesschangeModeinitialValue值枚举权限注解
Peripheral.GLOVE_BOX0x6140b407 / 1631630343READ_WRITEON_CHANGE0CommonParams.OpenClose{CLOSE=0, OPEN=1}PERMISSION_VENDOR_EXTENSION
Peripheral.GLOVE_BOX_MOTOR_CMD0x6140b408 / 1631630344READON_CHANGE0GloveBoxMotorCmd{IDLE=0, CLOCKWISE=1, COUNTER_CLOCKWISE=2, BREAK=3}PERMISSION_CAR_INFO
Peripheral.GLOVE_BOX_LOCK_TYPE_CONFIG0x6140b409 / 1631630345READON_CHANGE0GloveBoxLockTypeConfig{MANUAL=1, POWER=2}PERMISSION_CAR_INFO
Peripheral.GLOVE_BOX_UNAVL_REASON0x6140b40a / 1631630346READON_CHANGE0GloveBoxUnavlReason{IDLE=0, NOT_DIS_ARMED=1, ANTY_PLAY=2}PERMISSION_CAR_INFO
Body.GLOVE_BOX_BUTTON_STATUS0x61401781 / 1631590273READON_CHANGE0GloveBoxButtonStatus{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=0
  • 36512-36519:OTHER_GLOVE_BOX_MOTOR_CMD → READ / ON_CHANGE / 0
  • 36521-36528:OTHER_GLOVE_BOX_LOCK_TYPE_CONFIG → READ / ON_CHANGE / 0
  • 36530-36537:OTHER_GLOVE_BOX_UNAVL_REASON → READ / ON_CHANGE / 0
  • 2198-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.OPEN

VehiclePropertyUtil.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 全树 grep GlvBox*)检索不到任何映射实现——没有名为 FcnAvl 的属性,也没有 GlvBoxDcdFcnAvl 字样;
  • SDK 常量(javap 两文件全量)中也没有对应的独立属性。

因此 GlvBoxDcdFcnAvl 是底层 CAN 输入,其对 App 的可见表达只可能经由既有属性的 status 位(不可用/超时)或 value 折叠。具体折叠方式当前不可见,属底层确认项。

5.3 两条禁令(写代码/判问题时必须遵守)

  1. 禁止用 GLOVE_BOX.value == 0 推断可用。value=0 是 OpenClose.CLOSE,是合法状态值;可用性在 status 字段,不在 value。属性 initialValue 也是 0(DefaultAidlVehicleConfig.cpp:36509),用 value 判可用会在开机未上报窗口产生假「不可用」或假「关闭」。
  2. 禁止用 GLOVE_BOX_UNAVL_REASON == IDLE 反推可用。reason 的初值就是 0(IDLE,DefaultAidlVehicleConfig.cpp:36536),信号未到时它也是 IDLE;REQ003 的语义是「不可用时按 reason 给文案」,reason=Idle 只是「没有原因可报」,不等于「可用」。

5.4 底层确认项(提测前需与 SC12/平台拉齐的三个问题)

  1. 按键映射:GlvBoxBtnSts(CAN) → Body.GLOVE_BOX_BUTTON_STATUS(0x61401781) 的映射实现在哪个模块?MiVehicleService 可见源码 grep 不到 GlvBox* 信号名。卡滞(按下 ≥20s)态映射到 ERROR(0) 还是 NO_INFO(3)?CAN 值域(REQ003 只写 0x2:Psd)与属性四枚举如何一一对应?
  2. 可用性折叠:GlvBoxDcdFcnAvl 不可用/丢失时,底层是把 GLOVE_BOX 的 status 打成 UNAVAILABLE(或置 timeout bit),还是改 value?「信号丢失」在属性层如何表达?
  3. 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_INFO
    • GLOVE_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. 本篇结论一页纸

  1. 功能 = 物理按键按下(GlvBoxBtnSts=0x2:Psd)触发与软按键完全相同的开箱流;前置 Acc/Run;只做开不做关;边界仅 HMI,SC12/SC49 归他组。
  2. 契约 = 三个 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。
  3. 可用性判据 = GLOVE_BOX 的 status(isPropertyAvailable),原因看 UNAVL_REASON;禁止用 value=0 或 reason=IDLE 反推。
  4. SDK 0.11.70-SNAPSHOT 常量已齐,App 侧开发不依赖平台发版;剩三个底层确认项(§5.4)待与 SC12/平台拉齐。

证据清单

文件行号区间说明
/home/zbc/下载/test/车机Feature/Meego 5458412/docs/手套箱增加物理按键.md14-17PRD 背景:物理按键开箱、手动关闭、适配密码开锁
/home/zbc/下载/test/车机Feature/Meego 5458412/kb/SSC530171801-REQ003-物理按键按下交互方案.md17-59交互主依据:前置 Acc/Run、三信号值枚举、执行逻辑全文
/home/zbc/下载/test/车机Feature/Meego 5458412/kb/FDFR-Modena-L-MANN手套箱实体按键及电释放锁.md33-39方案 1 选定(不含 Awake)、SC53/SC12 FR005(卡滞 20s 可标定)
/home/zbc/下载/test/车机Feature/Meego 5458412/kb/FDFR-方案1与流程白板.md43-51, 83-95SC53/SC49/SC12 三方职责与密码/可用性协作时序
/home/zbc/下载/test/车机Feature/Meego 5458412/docs/meego-5458412-需求原文.md24-25, 55-57, 106-107负责人/估分/排期、交付版本 Mann 28A E4 与 Modena L 27C E4U3、提测与合入 DDL
vendor/micar/.../support-lib/src/mi/car/config/Peripheral.java572-610, 1414-1430四个手套箱属性定义(0x407-0x40a)与三个枚举类
vendor/micar/.../support-lib/src/mi/car/config/CommonParams.java45-48OpenClose{CLOSE=0, OPEN=1}
vendor/micar/.../support-lib/src/mi/car/config/Body.java1841-1848, 6948-6953GLOVE_BOX_BUTTON_STATUS=0x781 定义与 GloveBoxButtonStatus 四枚举
vendor/micar/.../support-lib/src/mi/car/config/Driving.java2423-2430, 2463-2470, 10876-10885, 11052-11063POWER_MODE/CAR_MODE_STATUS 定义与 PowerStatus(ACC=2/RUN=3)/CarModeStatus 枚举
vendor/micar/.../aidlproperty/MiVehicleProperty.aidl1614-1619, 26138-26164AIDL 侧五属性枚举值(hex+dec 注释)
vendor/micar/.../aidlproperty/DefaultAidlVehicleConfig.cpp2198-2205, 36503-36537五属性默认 access/changeMode/initialValue
vendor/micar/.../service/updatable/api37/AndroidManifest.xml123-126CONTROL_GLOVE_BOX 权限声明(signature|privileged)
Meego 5458412/research/javap-vehicle-support-0.11.70-手套箱与电源.txt65-68, 153-175SDK 侧四属性+枚举+PowerStatus 常量实证
Meego 5458412/research/javap-vehicle-support-0.11.70-物理按键.txt224, 603-608SDK 侧 GLOVE_BOX_BUTTON_STATUS 与枚举实证
MiCarSettings-5458412/.../miauto/vehicle/MiCarPropertyIds.java(base/settingsBaseLib)1485-1487App 侧 GLOVE_BOX / GLOVE_BOX_TYPE 属性别名
MiCarSettings-5458412/.../miauto/CarConfigManager.kt(base/settingsVehicleLib)139-146getGloveBoxLockType() 读配置字,默认 MANUAL
MiCarSettings-5458412/.../vehicle/glovebox/GloveBoxController.kt99-102, 173-178, 182-185, 222-228, 288-302订阅集合、可用性判据、代客/车主门控、写 OPEN 开箱、reason→toast 映射
MiCarSettings-5458412/.../vehicle/VehiclePropertyUtil.java(base/settingsVehicleLib)165-182isPropertyAvailable 判 STATUS_AVAILABLE;mock 不可用注入点
MiCarSettings-5458412/.../vehicle/SettingsCarPropertyManager.kt(base/settingsVehicleLib)333-335isPropertyAvailable(propId, areaId) 封装