设置页写了参数不等于生效:ADB、alpha 纵向与总开关的下游链差在哪

作者:

在

结论:车载设置页的开关只做一件事——往 Params 写值并(在少数情况下)请求一次行车周期;参数写进去不等于硬件行为已经验证,UI 显示门也不是安全授权。软件更新页的「检查/下载」是发给更新器的信号请求,安装按钮只写 DoReboot;开发者页的 ADB/SSH、动作模式与 alpha 纵向涉及不同下游消费者;驾驶开关则通过 card、selfdrived 影响使能。大屏与 mici 两套界面在时间门、异步调度与锁键语义上并不完全对齐。以下为固定源码快照 c8fb906 的静态分析。

软件更新页:请求不是直接安装

大屏 SoftwareLayout 从 Params 显示当前描述/发行说明、UpdaterState、失败次数、可拉取/可安装状态与目标分支。_update_state() 只在 offroad 显示「检查/下载」和「安装」,且安装可见还要求 UpdateAvailable。按钮点击后的约 10 秒等待窗只处理「更新器未响应」的 UI 状态,不保证下载成功。

_on_download_update() 依据按钮文案选择 SIGUSR1 检查或 SIGHUP 拉取;_on_select_branch() 写 UpdaterTargetBranch 后发送检查信号。WaitTimeHelper 把 SIGUSR1 转成 CHECK、SIGHUP 转成 FETCH,由更新器负责分支解析与 staging/finalizing,再写 UpdaterFetchAvailable、UpdateAvailable 等 Params。两屏卸载都经确认后写 DoUninstall;manager_thread() 检出 DoUninstall/DoReboot/DoShutdown 后退出循环,由 main() 调用平台卸载或重启。实际固件切槽/卸载动作仍需平台级验证。

开发者页:参数到运行链

开发者页的控件覆盖 ADB/SSH 开关、SSH 公钥拉取、joystick 与纵横向动作模式、alpha 纵向控制确认以及 UI FPS/触摸调试。它们大多只写一个 Params 键,是否会真正改变硬件行为取决于设备系统层或进程表:例如 ADB 控件 offroad 禁用,而 SSH 开关未使用相同的 offroad 门;动作模式三者在 UI 回调中互斥写 Params,但参数可由其他进程直接修改,UI 互斥不是进程表的全局不变量。

SSH 公钥走 SshKeyFetcher:请求 GitHub 的 <username>.keys,把用户名与返回文本写 GithubUsername/GithubSshKeys,出错时清理;这是双键非原子写,系统级 authorized_keys 生效链仍需平台审计。

控件 下游或边界
ADB / SSH 写 AdbEnabled、SshEnabled;服务实际启停取决于设备系统层。ADB 控件 offroad 禁用,SSH 未使用相同门。
SSH 公钥 请求 GitHub <username>.keys,写 GithubUsername/GithubSshKeys;双键非原子写,错误时清理。
joystick / 纵向 / 横向动作 三者在 UI 回调中互斥写 Params;process_config.py 据参数选调试进程,参数可被其他进程改。
Alpha 纵向控制 非 release、车型 alphaLongitudinalAvailable、确认页之后写 AlphaLongitudinalEnabled 并请求行车周期;可能改变原车 ACC/AEB 组合。
UI 调试 写 ShowDebugInfo 并在本 UI 进程切换触摸点/FPS 叠加,不影响 CAN 安全许可。

行车周期与控制模式

restart_needed_callback() 写 OnroadCycleRequested。hardwared 消费后清零,并在一段时间内使 not_onroad_cycle 条件为假,迫使 started 周期重建——这不是操作系统硬重启。新设备需要测试「参数写入 → deviceState.started 边沿 → manager 进程重选 → card 车型参数重建 → panda 安全模式重新配置」的顺序。

这里有一个两屏不一致点值得注意:大屏动作模式回调写互斥参数,但并未像 mici 那样对纵/横向动作模式调用 restart_needed_callback(),两屏的即时生效路径可能不同。因此不能从「UI 控件已改变」推断当前控制进程已安全切换,需要通过回放或实机验证 manager 对参数变化的读取节奏。

驾驶开关与消费关系

TogglesLayout 定义 OpenpilotEnabledToggle、ExperimentalMode、加速踏板退出、LDW、Always-On DM、座舱摄像头/麦克风记录及单位切换。它按车型 CarParams 是否有 openpilot 纵向控制动态限制实验模式与驾驶风格;实验模式首次启用要求确认,涉及重启的开关在 engaged 时禁用。

消费侧,card 在初始化时结合 OpenpilotEnabledToggle、控制器是否存在与车型 dashcamOnly 决定 CP.passive;selfdrived 与 card 的运行状态读取实验模式。LongitudinalPersonality 还可通过车辆距离按钮变化并反映到 UI,因此 UI 选项不是唯一写入者。两套页面的限制也不等价:大屏遍历各开关的 *Lock 参数,mici 在当前页面只显式处理 RecordFrontLock,移植配置策略时须逐键核对。

对比项 大屏 SoftwareLayout / TogglesLayout mici 对应界面
更新请求发送 直接发 SIGUSR1/SIGHUP,约 10 秒等待窗 后台线程发送,系统时间无效时阻止按钮请求
动作模式重启 写互斥参数,未调用 restart_needed_callback() 对纵/横向动作模式调用 restart_needed_callback()
锁键处理 遍历各开关的 *Lock 参数 当前页面只显式处理 RecordFrontLock

自制硬件与插件化建议

源文档给出一组建议:把设置描述为「能力 + 策略 + 执行者」,UI 插件只呈现能力,更新器/进程管理器/平台服务执行请求;给更新与危险操作定义结构化请求及结果,而非让多个 UI 复制 pkill、布尔 Params、10 秒本地计时;保留 offroad/engaged 二次校验,确保从外部 API 调用也无法绕过。

对 alpha 纵向、动作模式、openpilot 总开关,应采用车型能力声明和独立安全审核;插件不得替换 panda 的 TX/RX 安全策略,硬件安全默认态仍为失效安全。所有这些端到端行为(ADB/SSH 真实启停、公钥更新原子性、下载中断与升级回滚、断电恢复)都需在目标板上验证,本文只证明代码路径存在。

常见问题

点了「安装」是不是就完成更新了?

不是。两屏的安装按钮最终都写 DoReboot,并非在 UI 里直接把 overlay 写入当前分区;真正的前台切换由启动脚本完成。UI 的检查与下载也只是请求语义。

改了 ADB 或 SSH 开关就一定能连上设备吗?

不一定。源码快照只能确认参数被写入 AdbEnabled/SshEnabled,服务实际启停取决于设备系统层;而且 ADB 控件 offroad 禁用,SSH 开关未使用相同的 offroad 门。

动作模式切换为什么有时要重启?

因为 restart_needed_callback() 会写 OnroadCycleRequested,由 hardwared 触发一次行车周期重建(不是操作系统硬重启)。大屏动作模式未调用该回调,mici 调用了,两屏即时生效路径可能不同。

UI 里的实验模式和驾驶风格为什么有时不显示?

因为 TogglesLayout 按车型 CarParams 是否有 openpilot 纵向控制动态隐藏实验模式与驾驶风格;没有纵向能力的车型看不到这两项,实验模式首次启用还要求确认。

延伸阅读

参考资料

  • 项目 02 —— openpilot-research/SOFTWARE_DEVELOPER_SETTINGS_DEEP_DIVE.md(软件/开发者/驾驶开关三页的 UI 函数、Params 与下游消费者)。
  • 项目 02 —— openpilot-research/ 同目录探针记录:更新请求信号、行车周期重建与两屏锁键差异的静态核对结论。

说明:本文为对固定源码快照的静态结构分析,未运行完整测试套件、未连接硬件、未验证目标车型的真实参数组合。文中所有阈值、行号索引与配置均出自源文档,标注为未验证的结论保留其原有边界。

更新记录

首次发布 2026-10-11 最近核对:2026-10-11

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注