07 · 速查卡(能量回收自定义 slider)
1. propId 三件套
| 信号 | hex | dec | 类型/范围 | 关键值 |
|---|---|---|---|---|
| BAN_REASON(禁用原因) | 0x6140757b | 1631614331 | INT32, area=0 | 0=NO_INHIBIT 可用 |
| BRAKING_MODE(回收模式) | 0x61408120 | 1631617312 | INT32, area=0 | 3=ADVANCED(自定义);slider 可见性门控 |
| ENERGY_REGENERATION_LEVEL(强度值) | 0x6140757d | 1631614333 | INT32, area=0, 0~100 | slider 本体;恒等映射(offset=0,无 100-x) |
权威获取法:javap -constants 读 MiCarPropertyIds$DrivingCtrl.class 编译期常量;或运行时日志 >>> Done set propVal: N to propId: 0x6140757d 实证。
2. 关键文件与行号锚点
代码仓:/home/zbc/car/fuben23_micarsettings/MiCarSettings。
行号以 rls-xcd-u-mp-26-v7.0 HEAD e8b5a7ba5(V3/PS4 最终内容) 为准;
修复前基底 f63fe1cdc 单独标注(dev 分支 1~3 行漂移,以符号定位为准)。
| 锚点 | e8b5a7ba5(V3) | f63fe1cdc(修复前) |
|---|---|---|
SliderPreference.java MAX_PROGRESS_CHANGE_TIMES=1 | :81 | :81 |
SliderPreference.java onValueChange(listener 内) | :202;先计数 :229-231(mSliderValue != getIntSliderValue(value)),后下发门 >1 :234 | :221-227:>0 门先下发、无条件 mProgressChangeTimes++ 后置 :225 |
SliderPreference.java onStopTrackingTouch → 调 onSliderStopTrackingTouch | :169 / :174 | 同区域 |
SliderPreference.java alignAdjustProgress(取整核心) | :336;三门 roundup && !isIgnoreClick() && ==MAX :345-346;先 slider.setValue :357,再手动回调 :360 | :325;条件 <= MAX :327;先回调 :334、后 setValue :336 |
SliderPreference.java onSliderProgressChanged / 内调 syncValueInternal | :364 / :372 | :339 区域 |
SliderPreference.java onSliderStopTrackingTouch(松手兜底终值) | :384(force 兜底 :397) | :359 |
SliderPreference.java syncValueInternal / callChangeListener / 回滚分支 | :995 / :1006 / :1009 | :970 |
SliderPreference.java setValueInternal(mSliderValue 覆盖点) | :931(:933-934) | 同区域 |
SliderPreference.java setValueRoundUp | :510 | :485 |
IFusionSlider.kt isIgnoreClick() 默认 false(V3 新增接口) | :54-56 | 不存在 |
MiCarIconSlider.kt override 透传组件库(V3 新增) | :64-67 | 不存在 |
MiCarSlider.kt override 透传组件库(V3 新增) | :40-43 | 不存在 |
MiCarIconSeekBarPreference.java onSliderProgressChanged / updateThumbText | :113 / :121(用参数);无参旧版保留于 :124-126 | :113 / :115(无参读 mSlider=旧值) |
BrakingStrengthPreferenceController.java setValueRoundUp(true)+SLIDER_NORMAL | :112-113 | :112 |
| 同文件 BRAKING_MODE==ADVANCED 可见性门控 | :199-203 | :199-202 |
CustomEnergyRecoveryStrengthController.kt 同款配置 | :58-59 | :58 |
MainCustomEnergyRecoveryStrengthController.kt 同款配置 | :60-61 | :60-61 |
BaseVehicleProgressPrefController.java propValToProgress/progressToPropVal(恒等) | :142 / :153 | :142 / :153 |
MiCarPropertyIds.java BRAKING_MODE / ENERGY_REGENERATION_LEVEL / BAN_REASON | :993 / :995 / :997 | :993 / :995 / :997 |
CustomSteeringModeFragment.java mach 移除 M1 页能量回收项 | :225-226 | :225-226 |
MiCarSettings.java isCustomEnergyRecoveryEnabled=isLuxOrMann | :1204-1206 | :1204-1206 |
RoofSunShadeSliderPreference.kt 同款「回调读当前值」旧写法(未开取整,不触发) | :152-155(观察) | 同 |
3. 日志签名速查(logcat)
| 签名 | 含义 |
|---|---|
CarSettings: >>> Done set propVal: N to propId: 0x6140757d | App SET 下发完成(N=实际写车值) |
CarSettings-SliderPreference: onStartTrackingTouch() ... mSliderValue = N | 触摸开始,N=组件内部当前值 |
onStopTrackingTouch() ... mSliderValue = N | 触摸结束;start/stop 同毫秒=轻触 |
onSliderStopTrackingTouch() ... mOriginProgress:0.0, slider.getValue():M.0 | 松手兜底;M≠mSliderValue 即被取整改写 |
CarSettings-MiCarIconSeekBarPreference: updateThumbText() ... progress=N, thumbText=N | 数值标签刷新(修复后带参数) |
* Ignore propId: 0x6140757d feedback: N | 防回弹拦截(回显自愈被屏蔽) |
| `CarPropertyCacheManager: | onChangeEvent id=0x6140757d … v=N` |
onDataVerifyFailed propId: 0x..., propVal: N | SET 后回读校验失败,UI 回滚(台架 vehicled 不持久特征) |
milogcat CARSIGNAL(3-MW):prop client set vals : prop : 6140757d ... int32_values : [N] / pub p=0x6140757d,a=0,v=N | App→中间件段透传对账(set↔pub 逐值应相等) |
MCU 方向:send to pps ok, n=7, d=[202,166,165,47,2,0,X] | d[3]=47 是常量字段(175/175 恒 47,初版报告误读为强度值,已证伪);末字节 d[6]=App 下发值+1 = MCU 透传跟踪锚点(12/12 逐 ms 样本吻合,相邻包差值=SET 差值,非序号);CARSIGNAL 止于 10:58:01.77,不覆盖 67→70 段(该段属合理外推) |
milogcat 位置:bugreport 内 FS/data/milog/milogcat/CARSIGNAL/milogcat(目录文件);主 txt 里只有空壳 section。
4. 取整公式一行版(V3 最终)
step=10;余数≥5 进位(half-up:67→70, 33→30, 45→50)
触发条件(V3,SliderPreference.java:345-346):mIsRoundUpWhenClick && !slider.isIgnoreClick()
&& mProgressChangeTimes == 1 —— step=10、余数≥5、恰好 1 次 int 变化、且组件库非 ignoreClick(GT 不取整)
不触发:拖动(>1 次)/ 摸 thumb 未拖(0 次)/ GT 主题任何点击(库强制 ignoreClick=true)
关键时序(V2 起):计数先于下发(:229-231→:234);先 setValue(:357)再手动回调刷新(:360),无原值泄漏帧
修复前→后:MiCarIconSeekBarPreference.updateThumbText() 无参读旧值 → updateThumbText(progress) 立即跟随(:121)
5. 定界流程(值不一致先别慌,逐段对账)
flowchart TD A[slider 显示值 ≠ 别处显示值] --> B[① App SET 值: grep 'Done set propVal' 主 txt] B --> C{SET 值 = 用户设定值?} C -- "不等(如 67→70)" --> D["App 取整改写<br/>查 onSliderStopTrackingTouch getValue()<br/>与 mProgressChangeTimes 计数"] C -- 等 --> E[② 中间件 pub 值: CARSIGNAL grep 'pub p=0x6140757d'] E --> F{pub = SET?} F -- 不等 --> G[中间件/发布限速方向] F -- 等 --> H[③ 下游订阅端: BatteryHandler mValue / 雷达图日志] H --> I{下游值 = pub?} I -- 不等 --> J[下游消费端方向] I -- 等 --> K["视觉滞留方向: 对照视频帧与 updateThumbText 日志<br/>(setValue 前后回调读旧值)"]
6. 常见误判警示(全都实踩过/证伪过)
- ❌ 别再提 100-x 反转(JarviX 初版论断)——
propValToProgress/progressToPropVal恒等(offset=0), CARSIGNAL set↔pub 逐值相等,双重证伪。 - ❌ 别去 MiCarX 组件库找取整逻辑——取整在 Settings 仓
base/settingsBaseUi/SliderPreference.java; 「3.2.4 称已修 → 3.2.6 仍在」之谜 = 修错了层,组件库升级对该半边天然无效。 - ❌ 检索只 grep
.java——controller 大量是.kt,必须双扩展名。 - ❌ 把
d=[202,166,165,47,...]的 d[3] 当能量回收强度透传证据——175 条恒 47,是常量字段(已证伪); 正确锚点是末字节 d[6]=下发值+1(SET:47→d[6]=48 同毫秒,12/12 吻合)。 - ❌ 台架上让 App 自己 SET BRAKING_MODE=3——vehicled 不持久写入,必回滚(
onDataVerifyFailed); 只能 mock 注入。(2026-10-13 修订,mach 限定):settings put GLOBAL vehicle_mock_data 1后 App 自己 SET 生效不回滚(点「自定义」cache v=3 实证);该开关只管写值下行,信号仍须注入。 - ❌ GT 主题「摸 thumb」按视觉位置下针——视觉/触摸错位 ~96px,极易误点轨道(误触放大器,待立项)。
- ❌ fermi(A17)上装 v7.0(A14)包——
NoSuchFieldError: ADVANCE_MEDIA_T_UUID起即崩; A17 验证用 dev 分支 xcd_cn_a17 包。 - ❌ 「松手不停在拖动值 = 中间件丢值」——中间件仅 ≤150ms 发布限速,稳态逐值相等;先查取整。
- ❌ GT 主题「点轨道不跳值/点不动」当卡死或「不响应」报 bug——那是组件库 GT 强制
ignoreClick=true的特性(点轨道=就地 grab + 按压动画,无值变化,08 篇 §3.4),叠加 2026-10-13 产品裁决「GT 只支持拖动」与 V3 取整关闭,属设计行为;对照组按键背光亮度 (不开取整)在 GT 同样点不动且无抖动(05 篇 §9.3)。 - ❌ 台架上验证「计数/时序」类回归——vehicled 不持久走回滚分支(:1009),mSliderValue 不被覆盖,台架物理上不可复现(06 篇坑 #7);须正式环境包或计数日志。
7. 历史工单与修复索引
| 单号/编号 | 一句话 | 状态 |
|---|---|---|
| N801PROB-86420 | 非整十数点击按四舍五入跳到整十 | 关单 By Design(点击取整=设计行为,修复必须保留兼容;2026-10-13 产品裁决重申:普通主题点击必整十) |
| N801PROB-132401 | GT 主题 slider 显示值与中控不对应 | 定案 high;三轮修复史(05 篇 §9):V1(原案)→V1 回归(连续拖动松手被取整,计数后置被 mSliderValue 覆盖)→V2(PS3 计数前置)→第三轮 GT 点击抖动(==1 门被按下微抖随机击穿)→V3(PS4 加 !isIgnoreClick() 门,GT 关取整)。同一 Change-Id I4a34b69c…766e,Gerrit dev=387202 / rls=387204,当前 PS4,查询时点 2026-10-13 仍 NEW;本地 rls commit e8b5a7ba5 |
| 残留-GT 错位 | GT 主题 slider 视觉/触摸错位 ~96px | 待立项(组件库 GtSliderThemeDelegate 方向;组件库侧立项将引用 08 篇);micarx 反馈「升级到 3.2.7」,截至 10-13 未发布 |
| 残留-RoofSunShade | 同款旧写法未修(无取整不触发) | 观察(RoofSunShadeSliderPreference.kt:152-155) |
| 残留-净零位移 | 往返 53→54→53 误判点击(理论级) | 不处理(产品裁决否决净位移方案,05 篇 §9.4) |
分析产物:/home/zbc/下载/test/车机JIRA/jira-data/N801PROB-132401/analysis/(root-cause.md / review.json / frames f_01~f_15)。