Repository navigation
Conversation
新增 full_ota_update.py,将从爪 MCU OTA、电机型号与启动力矩配置、 MIT/Private 协议切换、电机 OTA、版本回读和最终自动标定校验串成一个状态机。 每次必须的 24 V 硬重启都锁定固件 SN 与 CH343 并等待真实掉线重连;默认保留 机械方向,同时提供显式方向选项和 0.8 rad 的短行程保护。 补充中英文使用说明及无硬件单测,覆盖降级保护、方向位、设备双重身份和断电 检测。验证:python/tests 132 passed、2 skipped;Ruff、typos、gitleaks 及全部 scoped pre-commit hooks 通过。实机 dry-run 因当前设备未返回固件 SN 安全拒绝, 未执行任何硬件写入。
针对重连后首次读回 MIT 导致 Private 预检立即退出的问题,增加有时限的 连续协议读回检查;保留 OTA preflight,超时停止且不自动重发切换命令。 设备缺席持续至少两秒才进入重连检查,扫描异常不作为断电证据;提示不再 把扫描不到设备声称为已经确认 24 V 断开。 计划、同版本跳过提示及最终汇总明确区分实际刷写和版本相同未刷写。 验证:Python 测试 140 passed, 2 skipped;本次文件 pre-commit 全部通过; git diff --check 通过。协议等待、超时、扫描异常、跳过/强刷均有模拟回归测试。 未对硬件执行 OTA,本次等待修复尚未经实机断电重跑验证。
解决 USB 拔插被当作 24 V 断电完成,以及重连后立即写配置遭遇 SysBusy。 基于 MCU uptime 与主机经过时间检查重启,要求连续两次读回;处理计数回绕, 不再依赖扫描必须观察到掉线。明确心跳只能证明 MCU 重启,不能替代物理断电。 管理命令先等待自动标定结束,仅针对明确的 SysBusy NACK 有界重试,错误标出 具体步骤;不重试 OTA 传输或其他未知结果。旧固件不强制要求 HomeDiag。 验证:152 passed, 2 skipped;本次文件 pre-commit 通过;git diff --check 通过。 覆盖 USB-only 重连、漏扫重启、uptime 回绕、标定阻塞、忙超时和非忙错误不重试。 仅使用模拟测试;未连接硬件执行 OTA,实机复测仍待用户操作。
合并本次 fetch 的 origin/main ff52f82,保留任务分支三次本地脚本提交。 随包从爪镜像及清单更新为 1.2.12,并纳入主线示例和文档修正,解决设备已是 1.2.12 时旧任务分支默认选用 1.2.11 导致升级流程被降级保护阻断的问题。 保持原有降级保护,不使用 allow-downgrade,不改写既有提交历史。 验证:Python 测试 152 passed, 2 skipped;合并文件 pre-commit 通过; git diff --cached --check 通过。离线解析默认镜像并校验清单匹配,确认 1.2.12 设备跳过同版本从爪刷写。未运行硬件 OTA。仅本地合并,不推送。
用户日志中 uptime 从 84691 增长到 85445、1051 增长到 2057、4717 增长到 5438,旧算法因 HAL tick 慢于主机时钟而错误宣布重启完成。 删除主机经过时间推算,要求观察到超过一秒的实际 uptime 回退,再读到仍低于 回退前值的递增计数;正常回绕、停滞和单个低位旧读数不放行。 无法观察到回退时保守超时,错误打印基线和最后计数,不宣称用户未断电。 验证:Python 测试 159 passed, 2 skipped;本次文件 pre-commit 与 diff 检查通过。 三组实测日志端点已纳入回归测试,中间采样明确为模拟值;未运行硬件 OTA。
将随包主爪和从爪镜像移动到 firmware/gripper,清单保持在 firmware 根目录并 更新相对路径;保留角色选择和旧裸文件名解析入口,同步示例与目录文档。 本地 RS00、EL05 镜像移动到 firmware/motor,保持原名和内容;通过 gitignore 及 sdist.exclude 排除本地电机二进制,仅提交目录说明。 验证:四份镜像 SHA-256 与移动前一致;160 passed, 2 skipped;本次文件 pre-commit 通过;源码包实测包含两份 gripper 镜像且不含本地 motor 二进制。 未进行设备操作;EL05 原始五段文件名未改名,升级解析支持不属于本次目录调整。
从爪和电机读回版本与镜像相同时分别提示 y/N,输入 y 才重复刷写,回车、n、 其他输入及 EOF 跳过该镜像。电机提示在 Private 下读回版本后出现。 显式 reflash 参数保留为重刷授权;dry-run 不询问不写入;yes 仍只跳过 SN 确认。 同步帮助及文档说明,保留降级保护和最终协议恢复流程。 验证:172 passed, 2 skipped;本次文件 pre-commit 通过;git diff --check 通过。 模拟覆盖从爪和电机的确认/拒绝、显式强刷及 dry-run;未执行实机 OTA。
针对实物 RS00 仍使用编译默认 EL05 的新夹爪,避免型号写入被旧量程标定阻塞。 要求输入实物型号确认,保存禁用自动标定后等待断电,确认空闲再写型号, 再次断电验证生效;恢复标定时保留新型号默认参数,中断后提示恢复流程。 常规 OTA 配置不再直接覆盖型号,补充操作文档与七项模拟回归测试。 验证:Python 测试 179 passed, 2 skipped;所改文件 pre-commit 与 diff check 通过。 未连接硬件,双重断电初始化流程仍需实机验证。
新增 --direction-only,要求显式选择方向并核对从爪、已记录型号、MIT 和自动标定配置。修改后读回方向,等待人工断开 24 V 后重新验证标定。 该模式不刷固件、不切协议、不修改型号或标定力矩;完整 OTA 在最终 MIT 重启前重新应用显式方向,避免仅依赖较早写入的配置。 补充模式文档与方向读回、dry-run、参数保护测试。 验证:185 passed, 2 skipped;pre-commit 和 git diff --check 通过。 未执行实机操作;物理端点含义仍需操作者观察确认。
仅传电机镜像时默认选择 positive,不再保留设备旧方向。 沿用方向写入读回及最终 Reverse/open_sign 校验,保留显式覆盖选项。 更新默认参数回归测试及操作文档。 验证:186 passed, 2 skipped;pre-commit 与 diff check 通过,未实机验证。
默认方向由 positive 改为 negative,沿用 Reverse 与 open_sign 的最终校验。 同步命令行帮助、默认参数测试及文档,保留显式方向覆盖。 验证:186 passed, 2 skipped;pre-commit 和 diff check 通过,未实机操作。
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> # Conflicts: # firmware/gripper/tc-gu-01-slave-1.2.12.bin # firmware/manifest.json # firmware/tc-gu-01-slave-1.2.12.bin # firmware/tc-gu-01-slave-1.2.14.bin
默认方向改为跟随型号(固件 1.2.12 默认:EL05 反向、RS00 不反向), 原来写死的 negative 让 RS00 先张开、把零位记在了张开端。 数值校验分不清物理端点,最终标定后由操作者确认是否先闭合; 回答否则自动反转方向、再断电重标一次,两次都否就报错停止。 --yes 不跳过这一步,EOF 也停止。--direction-only 走同样的确认。 验证:197 passed, 2 skipped;pre-commit 通过。 实机 TCGU01A28Z0092s(RS00):negative 时 close=0.3086 open=-1.2711, 改为 positive 后 close=0.0010 open=+1.2719,操作者确认先闭合再张开。 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
将 origin/main 8bcc9ce 合入升级脚本分支,保留现有升级、方向修正 和人工确认先闭合再张开的流程。解决固件清单及重命名冲突,采用 从爪 1.2.16 并放在 firmware/gripper,保留主爪 1.2.6。 验证:原生扩展编译通过;Python 197 passed, 2 skipped;固件大小与 CRC32 校验通过;相关 pre-commit 和 diff check 通过。 未运行 C++ 单元测试,未刷写硬件,未推送远端。
新增 motor_firmware_update.py,校验镜像版本及已记录型号,复用设备身份 锁定、Private/MIT 协议检查和人工断电流程。实时版本匹配后才保存记录, 降级需显式许可并交互确认,失败不自动重试或恢复运动。 修复公共镜像解析与读回格式,支持 EL05 五段厂家版本和四字节转换。 补充操作说明以及版本转换、降级策略、镜像不符、dry-run 测试。 验证:206 passed, 2 skipped;相关 pre-commit 与 diff check 通过。 未进行本次脚本的实机刷写,未推送。
控制启动前仅查询一次,标题与 show-envelope 输出显示厂家版本字符串。 区分实时应答和 Flash 非实时记录,无有效版本或查询异常时显示 unknown。 不切换协议、不写版本记录、不在控制循环内重复查询。 验证:211 passed, 2 skipped;相关 pre-commit 与 diff check 通过。 未驱动硬件,未推送。
面向 Ubuntu 24.04 普通用户提供受限固件更新界面,替换试用版 Tk 渲染方案,避免中文方块、重叠及高 DPI 按钮文字裁切。 - 使用 Qt 卡片布局、内置 Noto 中文字体、折叠日志与断电步骤弹窗 - MCU 和电机独立选文件;升级、重刷、回滚分别确认并校验哈希 - 保留 SN/型号/协议/实时版本检查,不提供参数覆盖与自动回滚 - 冻结 Python/SDK/Qt,修正 ELF 搜索路径及 BLAS 别名依赖 - 生成 0.1.1 amd64 deb,不包含任何 MCU 或电机 bin - 增加策略及无硬件 UI 测试、安装和 dialout 权限说明 验证:Python 测试 228 passed、7 skipped,其中 Qt 专项在构建环境 另测 5 passed;pre-commit 全部适用检查通过。最终 deb 在清空环境 变量后 SDK 自检通过,未加载包外非系统动态库;普通用户桌面 中文 UI 启动和截图检查通过。未执行硬件刷写或干净虚拟机验收。
- 移除宣传标题、步骤条和大型卡片,改为 680x430 紧凑单页表单 - 显式设置浅色调色板及根背景,避免系统深色主题导致文字不可读 - 日志按需展开;保留刷写、回滚确认与物理断电校验逻辑 - 重新生成本地 deb 修订包 0.1.1-1,不包含固件 bin 验证:Python 回归 228 passed、8 skipped;构建环境 Qt 专项 6 passed,包含深色调色板和窗口尺寸检查;pre-commit 通过。 最终 deb 清空环境变量后的 SDK 自检和普通用户界面测试通过。 未访问硬件、未执行刷写或回滚。
- deb 内置已校验 MCU 1.2.16、EL05 1.0.5.0.4、RS00 0.0.3.32 - 构建与运行自检验证镜像哈希,缺少镜像时拒绝打包 - 启动自动扫描,单设备自动读取,多设备需选择,不自动刷写 - 根据已记录型号选择默认镜像,保留手动版本、清除和恢复默认 - 未记录型号时提供 EL05/RS00 显式确认;断电读回后才选择固件 - 不覆盖已有型号,保留重刷/回滚确认与原有安全检查 - deb 本地修订号为 0.1.1-2;更新安装说明和镜像分发说明 验证:Python 回归 237 passed、14 skipped;Qt 环境单测 12 passed; pre-commit 检查通过。最终 deb 清空环境后 SDK/三份镜像自检与 无硬件 UI 启动通过,未加载包外非系统库。 本次未连接实物、未写入型号、未执行固件刷写;硬件验收仍需现场完成。
等待阶段显示当前步骤、耗时和定时状态,传输阶段显示真实字节或包数进度。 更新时自动展开日志,区分传输完成与校验完成,保留现有升级安全检查。 使用用户提供的夹爪图片作为窗口和桌面图标,重新构建 deb 0.1.1-3。 验证:Python 测试 244 passed、16 skipped;独立 Qt 测试 14 passed; pre-commit 检查通过;安装包隔离环境 SDK 自检和 UI 冒烟测试通过。 未执行实机 OTA,未改动设备配置。
替换为用户指定的夹爪图片,生成等比例透明补边的多尺寸 hicolor 图标, 补齐桌面 StartupWMClass 关联并统一 Xense TacCap 标题。 让布局遵守内容最小高度,按字体行高预留设备信息空间,收紧其余间距。 重新构建 Ubuntu 24.04 deb 0.1.1-4。 验证:Qt 界面 15 项测试通过(1 倍及 2 倍缩放),截图检查通过; 8 种图标尺寸及透明通道检查通过;pre-commit、安装包 SDK 自检及 UI 冒烟通过。 未操作连接的设备,未进行实机 OTA。
保留紧凑布局,以蓝绿橙红区分运行、就绪、人工操作和错误。 取消等待 MCU uptime 达到五秒的预循环;仍要求时钟回退及后续增长。 断电弹窗显示实际在线时钟、设备缺失及通信错误,保留物理断电与协议核验。 MCU 核验只读取 MCU 版本,同版本确认支持跳过该项刷写与刷写后断电。 电机版本仍实时核验,跳过重刷也恢复 MIT,不依赖存档代替实际版本。 构建 Ubuntu 24.04 deb 0.1.1-5。 验证:Python 248 passed、18 skipped;独立 Qt 16 项通过(2 倍缩放); pre-commit 与安装包自检、UI 冒烟通过。未实机刷写或测量升级耗时。
增加全部/主爪/从爪筛选,按设备 SN 校验角色,主爪仅更新主爪 MCU 并提示拔插 USB。 在策略层和硬件适配层拒绝错角色镜像,主爪隐藏电机固件且不执行电机配置或标定。 默认镜像从已审核清单选择最高版本,构建校验 MCU 清单与仓库 manifest 一致。 新增主爪 1.2.6 镜像,保留从爪 1.2.16、EL05 1.0.5.0.4、RS00 0.0.3.32。 日志展开收起按内容重新布局,移除固定高度和中间弹性空白。 构建 deb 0.1.1-6,固件仍需维护者审核后重新打包,不联网自动更新。 验证:Python 253 passed、20 skipped;独立 Qt 18 项通过,含 2 倍缩放与连续日志切换。 pre-commit、安装包 SDK/四镜像自检和 UI 冒烟通过;未执行实机 OTA。
未连接时按主从筛选决定默认镜像和控件,主爪隐藏整行电机固件。 切换角色立即清理旧设备与手动选择,禁止未就绪开始,扫描状态不再沿用绿色。 删除重复标题和品牌行,将角色、设备、固件统一网格,统一按钮及输入框高度。 默认固件未变化时不重复输出哈希日志,保留日志收放的内容自适应布局。 打包 Ubuntu 24.04 deb 0.1.1-7。 验证:Python 253 passed、22 skipped;独立 Qt 20 项通过(2 倍缩放), 包含主爪无设备/切回从爪、日志切换、日志去重测试;pre-commit 通过。 安装包 SDK 与四镜像自检、UI 冒烟通过;未执行实机 OTA。
自动匹配固件提示右对齐,显式统一控件字体族和字重,保留紧凑布局。 标题及自检包含应用版本、Git SHA 和 dirty 标记,区分源码预览与打包版本。 构建同时输出 deb 与自解压 run;便携包复用已校验的隔离 SDK/Qt/Python, 普通用户启动后临时解压、退出清理,不依赖 conda 或 FUSE。 补充参数传递、退出码、清理、字体和对齐测试及便携使用说明。 验证:Python 255 passed、23 skipped;Qt 21 项通过(2 倍缩放); pre-commit、冻结 SDK 自检、run 隔离环境自检与 UI 冒烟通过。 未实机刷写;本地提交后重新打包,使交付构建 SHA 对应此次提交。
界面仅显示 v0.1.1 与 build SHA,避免将 Debian 修订号误认为应用版本。 独立维护 PACKAGE_VERSION 0.1.1-9,deb 和 run 使用同一构建元数据。 保留包版本递增以支持 apt 升级,更新安装说明并补充版本与标题回归测试。 验证:升级器测试 47 通过,非 Qt 环境跳过 21 项;独立 Qt 2 倍缩放测试 21 通过。
移除 Debian 数字修订后缀,使界面、deb 包版本和 deb/run 文件名一致。 递增至 0.1.2,保留对既有 0.1.1-9 安装包的正常升级顺序。 更新安装说明及版本回归测试。 验证:Python 测试 258 通过、23 跳过;独立 Qt 界面测试 21 通过; pre-commit 全部通过;dpkg 确认 0.1.2 高于 0.1.1-9。
按用户要求将应用、Debian 包和便携包统一为无修订后缀的 0.1.0。 更新版本回归测试和安装说明,注明高编号测试包安装时会被视为降级。 历史构建产物移出 dist 到独立备份目录,避免误选并保留恢复能力。 验证:版本测试 3 项通过;pre-commit 全部通过。
分别比较 MCU 和电机与内置审核版本,一致为绿,旧版为红并提示更新。 未知与高于内置版本单独提示核实,避免将旧镜像回滚目标当成最新。 保留电机 Flash 存档非实时说明,主爪不显示电机状态,不增加设备查询。 补充数值版本比较、型号未记录、主爪、转义及紧凑布局测试。 验证:Python 268 通过、24 跳过;Qt 2 倍缩放界面 22 项通过。
从已验证 deb 构建 AppDir,复用程序、固件及原始 build SHA。 校验官方构建工具和 runtime SHA256,禁止覆盖现有产物和打包 dirty 构建。 配置图标、桌面入口及隔离环境启动器,保留普通用户运行要求。 补充构建与权限说明、摘要拒绝和 AppDir 生成测试。 验证:新增测试 2 项通过;pre-commit 全部通过;AppImage 普通挂载及 解压模式 SDK 自检通过;Ubuntu 桌面界面启动检查通过,未连接硬件。
沿用产线配置工具的 SDK 序列号与型号规则:RS00 左 17、右 18。 扫描只读显示状态,更新预检单独确认修正;重新核对身份与型号, 等待标定结束并失能后写入,断开 24 V 后读回校验,失败不自动重写。 已匹配则跳过;主爪和 EL05 不套用规则,未知侧别拒绝写入。 更新完成后再次校验 CAN ID,补充用户说明和紧凑界面测试。 验证:119 项更新器及 Qt 离屏测试通过,pre-commit 全部适用检查通过; 真实 SDK 离线解析确认左右手映射。未执行硬件写入,未重新打包。
手动刷新发现唯一的新角色设备时自动跟随主/从筛选,避免旧筛选把新设备过滤掉。 读取中仍可刷新:立即清除旧信息,串行等待旧读取释放后重扫,隔离迟到结果和错误。 读取失败后清除设备缓存并恢复空闲自动扫描;固件/型号写入期间保持目标锁定。 补充热插拔、读取中刷新、旧结果失效、失败重试及刷写锁定的 Qt 回归和用户说明。 验证:先在旧实现重现两项失败;修复后 Python/Qt 回归 334 passed、2 skipped (未连接主爪的 IMU 测试),本次适用 pre-commit 检查通过,git diff --check 通过。 使用硬件替身验证刷新流程,未执行实机主从拔插或 OTA 验收。
冻结 Fontconfig 库的默认配置路径仍指向构建机 conda 环境,客户系统 无法加载默认配置。启动入口与独立 Qt 入口均在字体初始化前选择 /etc/fonts/fonts.conf 及 /etc/fonts,仅修改当前进程环境。 保留显式 FONTCONFIG_FILE/FONTCONFIG_PATH;配置缺失不隐藏错误, 不修改系统字体、缓存或权限。增加默认选择、空变量、幂等、用户覆盖、 缺失配置及非 Linux 环境回归,并补充用户说明。 验证:升级工具测试 128 passed(2 subtests passed);格式化后的 字体配置测试 5 passed;本次文件 pre-commit 全部适用检查通过。 安装包启动及平台检查在此提交后重新构建验证,真机 OTA 未执行。
目的:让用户明确区分危险写入、谨慎操作和安全完成,降低误确认风险。 - 在已确认可用的 PC 0fba27b 基线上统一确认与通知弹框,不引入后续通信改动。 - 回滚/标定异常停止使用红色,刷写与配置确认使用黄色,完成/标定正常/跳过重刷使用绿色,取消保持中性灰色。 - 保留取消或跳过作为默认及 Esc 行为,修复动态样式未刷新和中文长按钮宽度不足。 - 增加渲染颜色、文本对比度、按钮布局与键盘安全回归测试,更新用户说明。 验证:隔离 Python 3.12 / PySide6 6.8.3 下相关回归 223 passed、12 subtests passed;Ruff 0.16.8 检查及格式检查、git diff --check 通过;三类弹框截图人工检查通过。未操作实体设备。
目的:客户 PC OTA 工具在从爪升级期间仍呈白灯,补齐工具侧实际刷写和重连时的指示灯生命周期。 - MCU 和电机真正刷写前显式发送现有固件 OtaBlink 预设,并预留 60ms 首帧刷新;电机 CAN 透传不再漏发 OTA 灯效。 - 已核对 SN 的升级中连接重新请求蓝闪,成功完成版本与标定确认后才请求正常白灯。 - 当前可通信连接发生异常时请求故障红闪,失败不再为写白灯而重连;灯效错误不覆盖原始 OTA 结果,且不反复重试灯效。 - 跳过、取消及主爪不增加从爪灯效写入;清理沿用已核验路径且再次检查 SN,不增加设备扫描等待。 - 保持已验证 PC 基线的 OTA/协议/运动安全逻辑和内置固件不变,保留前一提交的弹框配色。 验证:隔离 Python3.12/PySide6=6.8.3 回归 236 passed、14 subtests passed;Ruff 检查/格式和 diff --check 通过;匹配原生 SDK0.4.3 灯效枚举核验通过。未操作实物夹爪,蓝闪/红闪光学效果待现场验收。
目的:仅优化工具侧蓝闪节奏,不修改 MCU 固件、刷写时序或通信基线。 - 同一 MCU 运行期间,反复打开串口、核验协议和查询版本不再重发 OtaBlink,避免每次从头计时。 - 仅在 MCU 刷写成功提交或已有重启检测确认后,安排下一次身份核验通过的连接恢复一次蓝闪;不新增时钟查询、轮询或串口连接。 - 保留成功后白灯、错误时红闪、LED 失败不影响原升级结果及主爪不写灯效的行为。 - 增补串口多次重开、确认重启、软重启、重启超时和灯效失败测试,修正测试夹具的独立运行导入路径。 - 文档明确工具侧无法保证 MCU 高负载期间严格的 300ms/300ms 光学节奏。 验证:先在原实现复现4个行为失败,再修复通过;全量相关回归240 passed、14 subtests passed,1.91s;Ruff lint/format及diff --check通过。未对实物执行刷写或测量闪烁频率,待用户现场验收。
目的:依据本机测试输出,修复首轮 MCU 更新后蓝闪恢复延后到人工断电结束的工具侧空档,不修改 MCU 固件。 - 本机SDK输出显示18:16:22.012开始MCU OTA、18:16:23.211提交软重启,传输约1.199s;原工具随后固定等待3s,版本轮询和断电心跳连接都不处理待恢复灯效。 - 为现有版本轮询增加可选 on_ready 回调,仅在目标版本和SN核验通过时,复用当前版本查询连接恢复一次蓝闪;不另开串口、不增加扫描或启动时钟查询。 - 保留原有3秒缓冲、超时、物理断电、协议、版本和标定核验;旧CLI调用不传回调时行为不变,主爪不新增灯效写入。 - 等待提示明确软重启可能短暂白灯/熄灭、版本读回不等于整个升级完成;后续状态查询仍不重置相位。 - 增补首次版本就绪恢复、相同句柄复用、错误版本/身份拒绝写入、LED故障不中断升级、旧调用兼容测试。 验证:修改前新增检查5失败84通过;修改后相关回归246 passed、14 subtests passed,1.90s;Ruff lint/4文件format和diff --check通过。日志仅有通信时序、无光学脉冲记录;未执行新的硬件刷写,灯光改善待用户实测。
目的:为用户版固件升级工具提供可切换的完整英文显示,不改变已验证PC基线的升级策略与灯语修复。 - 顶部加入中文/English选择,空闲时即时重绘;按用户保存语言,支持--language en/zh单次覆盖。运行中拒绝切换,保留当前设备、固件选择和手动覆盖项。 - 在显示边界翻译主从爪页面、版本与CAN ID摘要、弹框、回滚警告、断电步骤、进度及工具日志;安全判断仍使用原始中文消息和原始设备数据,按钮颜色及默认取消行为不变。 - 保留原始日志,切换后重绘可见记录,清空显示不重新露出历史;导出使用当前语言。未知第三方中文诊断以无损Unicode转义保留,不伪造译文。设备ID/版本/文件路径保持原值。 - 英文文件选择使用Qt非原生对话框,避免系统中文按钮;长句换行、摘要间距和原有右对齐提示经英文截图检查。 - 新增语言持久化、完整文案与清单警告覆盖、真实模拟升级/跳过流程、忙时拒绝、日志导出、主从爪断电和弹框安全默认项回归;补充使用文档。 验证:基线246项测试及14子场景通过;新增检查迭代修复组合摘要、活动进度、回滚警告和选择测试夹具问题。最终相关回归263 passed、14 subtests passed;Ruff lint/format及diff --check通过;中英文源界面冒烟通过,英文主界面、连接状态、断电、回滚截图已查看。未执行硬件刷写,Jetson包不重建。新包与本机安装证据在打包后记录。
目的:让用户可在界面直接选择审核过的主从爪旧版 MCU,而不是依赖外部下载或放开任意 bin 刷写。 - MCU 行提供按主从角色筛选的版本菜单,保留手动文件入口和内置最新默认;选旧版本显示红色降级提示,切换语言不丢失选项,忙时禁止更改。 - 固定主爪 1.2.5、从爪 1.2.14 的仓库完整提交及路径;构建时从本地历史提取并逐个核对 SHA256,冻结包包含全部四份审核 MCU,客户运行不依赖 Git/网络。旧 bin 不重新加入源码树。 - 明确主爪目标下限 1.2.5、从爪目标/当前下限 1.2.14,继续阻止角色混刷、未知/篡改镜像;降级确认说明不恢复旧配置及旧版串口/RS00 方向风险,默认取消。 - 组合更新先确认 MCU 降级再执行任何电机/CAN ID 写入;取消不写入。实际 MCU 降级仍在电机核验后,确认前后版本变化则停止,不使用过期确认。 - 增加历史提取与校验、主从降级/读回失败、取消与 RS00 CAN ID、版本变化、菜单/手动选择/忙时/语言/布局回归,更新操作与构建说明。 验证:原基线 263 passed、14 subtests;新增缺口检查最初 8 failed、1 passed。修复后相关回归 283 passed、14 subtests passed(3.24s),Ruff lint/format 和 diff --check 通过。查看了中英文主爪降级界面、版本菜单与从爪红色风险确认截图;未操作物理设备,未改原生 SDK、MCU 源码、串口恢复策略或已验证蓝闪行为。包与安装验证后续记录于 dist/debug。
收尾核查发现 SDK CI 的基础环境不安装 Qt,且默认是浅克隆。为避免把缺少打包环境误报为降级逻辑失败: - UI 用例在无 PySide6 时明确跳过,与现有界面测试约定一致。 - 真实历史镜像集成检查先验证固定 Git 对象是否存在;浅克隆缺对象时明确跳过该项。构建器和冻结包校验仍保持缺镜像/哈希不符即失败,不放宽产品保护。 验证:带 Qt 的本次完整相关回归仍为 283 passed、14 subtests;另在普通无 Qt 的 SDK Python 中运行新降级测试,非 UI 场景通过,UI 场景明确跳过。此提交仅修复测试前置条件,不改变工具、固件或升级策略;为保持构建追踪一致重新打包。
历史 MCU 仅保留来源与 SHA256 审核记录,选择时要求用户提供精确匹配文件,移除构建与运行时的 Git 历史二进制恢复。补充从爪 1.2.15 及回滚风险提示,默认仍为四份最新主从 MCU/电机镜像。 统一主从爪升级、降级与同版本确认;写入前核对当前版本,拒绝确认后版本变化;归一化零 build 后缀,避免版本读回误判。补充中英文选择和失败保护回归、验证边界文档。 验证:318 项测试及 14 项子测试通过;无 Qt 环境 46 项通过、9 项 UI 检查跳过;Ruff 和 diff --check 通过。中英文离线界面与原生适配层参数检查通过,未进行真机固件刷写或硬件升降级验收。
按历史固件与当前用户文件的相同 SHA256 收录 1.1.6 审核记录,不内置旧二进制。 该固件使用固定 EL05 量程,因此拒绝 RS00;旧版只允许 MCU 刷写,不运行电机 OTA、型号/CAN ID/方向/力矩配置或新版控制器。未能读取型号时要求人工核对实物。 先通过通用 SN/版本接口识别旧 MCU,仅为 MCU 管理准备显式允许旧固件连接。 保留 MIT、失能、目标版本读回、物理断电与人工现场确认;确认后版本或可读型号 变化即停止。支持从 1.1.6 再升回内置新版,不降低 SDK 正常控制的版本门槛。 界面隐藏不适用的电机/型号入口,补充中英文警告与旧版验收边界,修复英文长摘要布局。 验证:343 项回归及 14 项子测试通过,Ruff lint/format、diff --check 通过。 两项实际 SDK 伪串口测试验证 1.1.6 身份读取及可选型号 NACK 后的管理操作; 无 Qt 环境 36 项通过、6 项 UI 检查明确跳过;中英文离线界面检查通过。 未扫描、刷写或驱动真实夹爪,真实 EL05 往返升降级、断电及机械验收仍待现场测试。
按用户要求完整撤销 3acc7ab 的 1.1.6 审核记录、旧版 MCU 专用路径、 旧固件 SDK 门槛豁免、界面与翻译、文档和专用测试。保留提交历史,不重置分支。 源码内容恢复为 f43a123,继续保留主爪和从爪受支持版本的升降级能力, 只内置四份最新默认固件;从爪目标下限恢复为 1.2.14。 验证:与 f43a123 的源码差异为空;用户的 1.1.6 文件重新被校验清单拒绝, 旧版执行路径已移除。318 项回归与 14 项子测试通过,无 Qt 环境 46 项通过、 9 项 UI 检查跳过;Ruff lint/format、diff --check 通过。 未扫描、刷写或驱动真实夹爪;后续仅重新构建并安装本机 PC 包,Jetson 包不变。
为固件更新后的空载检查增加独立功能测试窗口: - 复用 ForcePositionController,按实际电机规格生成低速、有限预算配置,滑条从当前开度初始化。 - 手动确认后才启用,显示实际开度、力矩、速度和温度;仅支持已记录型号、标定完成且具备有效包络的 MIT 从爪。 - RS00 检查按 SN 推导的方向和 CAN ID,不改 SDK、不写型号/标定/包络、不自动清故障。 - 测试与刷写、刷新互斥,合并滑条目标并限制会话时长;停止或关闭时先停止控制器再确认失能,反馈异常与清理失败明确报错。 - 保持简洁的中英文界面,扩展冻结包离线界面自检并补充操作与安全说明。 验证:355 项通过、14 个子测试通过;无 Qt 环境的控制后端测试 31 项通过、6 项界面测试跳过。 Ruff 检查和格式检查通过,中英文离屏布局检查通过。未扫描、刷写或驱动真实夹爪;真机验收待用户执行。 本次仅更新 PC 包,Jetson 仍保持既定固定版本。
用户版 PC 与 Jetson 共用两套 SDK 控制器及参数界面,避免长期冻结旧 Jetson 界面而丢失功能。 - 增加 ForcePositionController / ImpedanceController 选择和所有公开 Config 输入,常用项与高级项分组;阻抗速度显示预算/Kd估算,不伪造独立速度命令。 - 只读加载真实设备规格与保守默认值;停止状态编辑,启用前重新核对规格、包络及参数组合,不写设备配置、不放开持续力矩与反馈保护。 - 增加只读环境诊断与 CLI,区分内置 SDK 加载、USB、tty、访问权限、稳定链接及 MCU 无应答;保留既有 OTA 重连等待时序。 - DEB 声明 udev 依赖,为指定 USB 双串口 MCU 接口提供 0660/dialout/uaccess 与稳定链接规则;只重载规则,不自动加组、批量触发设备或安装驱动。 - 补充用户安装与诊断说明,明确安装包不要求完整 SDK/conda 开发环境;两平台分别构建原生运行环境。 验证:相关回归390项、14个子测试通过;无Qt环境65项通过、7项界面测试跳过;Ruff检查/格式、shell语法、udev规则校验通过。 原始5dd8cb5 ARM64包在无完整SDK/conda、无设备的隔离环境以普通用户加载自带SDK成功;不足以认定客户此前唯一根因为权限。 中英文双模式高级参数离屏布局已检查;未执行真实串口扫描、驱动电机或刷写,Jetson现场验收待用户测试。
取消恢复参数及高级参数按钮的自动默认行为,使 Enter、小键盘回车和 Tab 仅提交数值编辑,避免误触参数恢复或其他测试动作。 按可见参数重新计算堆叠页高度,窗口自动适配内容,反复切换控制器和 展开收起高级参数后不再保留展开高度;参数行顶部紧凑对齐。 补充双控制器键盘编辑、负数和整数输入、无动作副作用、中英文重复 展开收起回归,并补充用户操作说明。不修改 SDK、OTA 或电机行为。 验证:相关回归 398 passed、14 subtests passed;控制测试 72 passed; 新增 8 项在普通及 200% 缩放下通过;Ruff、格式及 diff 检查通过。 无物理设备扫描、固件刷写或电机运动验证。
用户版收敛为固件维护工具:移除功能测试按钮、控制器滑条窗口、 参数调节与串口控制会话实现,清理对应样式、翻译及说明。 保留主从爪 MCU、电机固件更新与回滚、型号设置、日志和环境诊断; 不修改 SDK 控制器、独立示例、固件镜像或 OTA 策略。 删除已下线控制测试的专用测试,增加主从角色及中英文四组合范围 回归,确认更新入口可用且无运动测试按钮、滑条、隐藏入口或模块。 离线自检标明 firmware_update 用途,不再加载控制测试代码。 验证:327 passed、18 subtests passed;Ruff/格式及 diff 检查通过。 未执行实际硬件刷写或电机运动。
目的:解除 2c6121b 快照冻结,合入 main 29ac807 的 14 个上游提交, 为 PC Ubuntu 24.04 和 Jetson Ubuntu 22.04 的新安装包提供同一源码基线。 主要变化: - 保留主干英文源码、EL05 自动选镜像及电机 OTA 改进,解决 README 改名、 示例索引、固件说明和电机版本解析冲突。 - 保留工具中英文 UI、严格实时版本核验、型号与 CAN ID 确认、协议恢复、 断电引导、灯语和无运动测试的用户版功能边界。 - 将受审 EL05 镜像归入 firmware/motor,同步 manifest 与裸文件名解析; 子目录内的已发布电机镜像仍校验 CRC32,不通过移动目录绕过检查。 - 保留 EL05 版本归一化兼容,增加嵌套路径、篡改 CRC 和版本等价回归。 实际验证: - 重新编译本工作区 SDK、C++ 示例及单元测试。 - Python 全套:469 passed,2 skipped(无主爪,IMU 真机测试),18 subtests passed。 - C++:471 tests passed;全部 pre-commit 检查通过。 - 对照固件 a7dc07f:73 命令、17 错误码、7 停止原因和 37 个结构匹配。 - 尚未执行本次源码的真机 OTA;安装包在本地提交后重新构建和独立验证。 本次仅本地提交,不推送、不更新 PR、不发布 Release。
目的:减少现有工具相较主干电机示例多出的无效断电步骤,同时保留 实际版本核验、MCU 硬重启和升降级安全边界。 主要变化: - 电机刷后先读取实际协议;仍为 Private 时直接查询实时版本,将刷后 必需的物理重启与恢复 MIT 合并,不再固定多重启一次 Private。 - 刷后已回到 MIT 时仍重新进入 Private 核实实际版本,不按镜像或 MCU 存档猜测成功;未知协议、失联和错误版本都停止,不自动重刷。 - 最终 MIT 即使已生效也保留实际刷写后的强制断电;MCU 降级前先完成 电机重启,保留 MCU 独立硬重启、CAN ID、标定及确认功能。 - 菜单仅展示主/从角色的最新内置固件与手动选文件入口;保留历史审核 元数据和手动升降级,实际负载仍仅四份最新默认镜像。 - 补充双语提示、条件断电次数说明和回归测试。正常已配置 EL05 从 MIT 开始,仅刷电机由三次降为两次,MCU+电机由四次降为三次;真机待验收。 实际验证: - 新测试先复现固定 Private 刷后断电与未强制最终重启的旧调度。 - Python 全套 484 passed、2 skipped(未连接主爪 IMU)、18 subtests passed。 - 新断电/失败/翻译回归 12 项单独运行通过;全部 pre-commit 检查通过。 - SDK/C++/Python bindings 源码未改变,复用 9f7c6db 的匹配原生 SDK。 - PC/Jetson 安装包将基于本提交重新构建;未进行真机 OTA。 仅本地提交,不推送、不修改 PR、不发布 Release。
启动和刷新扫描前检查内置 SDK、USB/MCU 串口、权限和可见占用;异常提示支持复制命令、异步复检和导出诊断报告。PC/Jetson 使用同一套只读检查,不自动修改权限、驱动或终止服务。 DEB 对夹爪 MCU interface 02 增加 ModemManager 端口忽略规则;AppImage 内置同一规则供用户审阅配置。保留现有固件维护、身份校验及中英文功能。 验证:Python 498 passed, 2 hardware skips, 18 subtests passed;全仓 pre-commit 通过。未执行真实 OTA 或电机操作;安装包验证另留本地构建记录。
目的:修复环境检查只有同色文本、未连接仍无明确结论,以及打开窗口后状态不更新的问题。 变化:新增红黄绿分项检查和主界面环境标记;区分 SDK 加载、USB/串口条件和 MCU 连接读回,绿色只代表可进入更新预检。诊断窗口空闲时每三秒只读复检,不自动连接或刷写;失联时清除旧设备信息并禁用更新。详情默认折叠,提供明确返回/连接验证操作和中英文提示。 验证:Python 513 passed, 2 hardware skips, 18 subtests passed;全仓 pre-commit 通过;中英文未连接/阻断/通信已验证界面检查通过。未执行真实固件刷写或电机操作;安装包验证另记本地交付记录。
修复环境检测仅接受空格描述符导致 USB Dual_Serial 设备被误判为 未连接、已连接信息被清空和固件更新按钮被禁用的回归。 - 诊断和 udev 规则同时兼容两种精确名称,保留 VID/MCU interface 02 范围以及非全局可写的访问规则,不放宽到任意 USB 串口。 - 将现有权限、驱动、型号、主从角色和界面就绪测试覆盖到两种描述符, 补充错误 VID、无效名称和已连接设备不被环境复检清除的回归。 - 文档说明两种描述符及角色仍由 MCU 序列号确认。 验证:Python 542 passed、2 skipped(未连接主爪 IMU)、18 subtests passed;全部 pre-commit 检查通过。本机只读采集已识别真实设备及 可读写 ttyACM1;未执行真机刷写、运动或设备配置写入。
目的:避免客户将未检测到串口占用的灰色参考信息误认为环境故障。 主要变化: - 中英文摘要明确“未检测到其他程序占用”为非故障提示。 - 诊断详情说明该项本身不阻止预检、仅检查可见进程,更新前仍校验通信。 - 保留真实占用时的红色阻断,新增双语状态及实际 Qt 展示回归测试。 验证:Python 全套 547 passed、2 skipped、18 subtests passed; 环境/翻译/UI 相关 118 passed、6 subtests passed;全部 pre-commit 检查通过。 未修改 SDK、固件、通信、权限判定或刷写流程;双平台包验收在提交后执行。
修复 PR #26 因未安装 PySide6 导致 GUI 测试失败的问题。 为 CI 安装 Qt 6.8.3、图形运行库和 Noto CJK 字体,使用 offscreen 运行完整回归,并在测试前显式检查 QApplication 能否启动。 两条 RS00 界面测试改用带独立哈希清单的合成镜像,不再依赖 未跟踪的厂商 BIN;继续执行真实默认选择和镜像校验,保留原有 语言、CAN ID 和布局断言,新增实际选择测试镜像的断言。 验证:全新 Ubuntu 24.04 / Python 3.12 / Qt 6.8.3 容器构建通过; C++ 471 项通过;Python 547 项和 18 个子测试通过,2 项因无真实 主爪跳过;全部 pre-commit 钩子通过。未修改应用或固件,未重打包。
为构建测试 job 的 checkout 设置 fetch-depth: 0,使 catalog 固定的 三个历史 MCU 固件对象在 CI 中可用,恢复此前跳过的七项集成测试。 启用 TACCAP_REQUIRE_FIRMWARE_HISTORY,缺对象时明确失败,不再 静默跳过;新增严格模式与普通本地模式的两个策略回归用例。 验证:临时浅克隆复现 50 通过、7 跳过;严格模式得到预期的 7 失败;补齐同一副本历史后 57 项全部通过。完整软件回归 549 项及 18 个子测试通过,仅主动排除 2 项真实主爪测试; C++ 471 项与全部 pre-commit 校验通过。GUI 测试保留且执行。 仅修改 CI 和测试,不修改客户程序、SDK、固件或安装包。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Add a standalone Chinese/English firmware maintenance tool for leader and follower grippers, with self-contained Ubuntu PC and Jetson packages. Users can discover a device, select reviewed firmware, confirm upgrade/downgrade/reflash operations, follow physical power-cycle prompts and verify the result without installing the SDK development environment.
Current PR head:
285584d. The latest commits fix CI dependencies, history availability and test fixtures only; application/SDK/firmware/packaging inputs are unchanged from the tested and packaged36cb498. The branch includesmainat29ac807, including upstream PRs #27 and #28, plus the latest power-cycle, environment-readiness, USB-compatibility and bilingual-guidance fixes. The previous frozen/unpublished-candidate notes no longer apply to this PR's code.This is a firmware-maintenance application, not a controller or motion-test application. Existing reviewer: @Vertax42. Physical-device acceptance remains pending for this exact build; software/package checks below are not a customer-release or merge approval.
Main changes
Guided, guarded firmware maintenance
.binfiles. Leader mode hides motor-firmware controls. Only the latest packaged MCU image is offered as a bundled choice; historical catalog entries are not presented as bundled binaries.Connection, readiness and operator feedback
USB Dual SerialandUSB Dual_Serial, consistently in diagnostics and the scoped MCU-interface udev rule. This avoids a false “no gripper connected” block without bypassing vendor/interface, permission, occupancy, identity or firmware checks.SDK, CLI and deployment boundary
full_ota_update.pyand targetedmotor_firmware_update.py, plus motor-version reporting in the console. The CLI has a broader configuration surface than the customer GUI and requires separate review.cpp/src/discovery.cppand its header as SDK-level changes, not GUI-only work. This discovery adjustment changes neither the wire protocol nor the native binding API.firmware/gripper/andfirmware/motor/, keeping the manifest/examples/documentation consistent. Validate the four packaged defaults by hash; vendor firmware redistribution and dependency-license review remain explicit maintainer items.dialout,0660,uaccess, a stable alias and a ModemManager-ignore marker. Post-install reloads rules without adding users to groups, replacing drivers, changing JetPack/CUDA, stopping system services or running a root GUI. AppImage users still need appropriate host system libraries, drivers and permissions.Supported firmware and local delivery
Only the four defaults are bundled. Historical MCU files must be supplied separately and match the reviewed catalog. “Latest” means this reviewed bundled snapshot, not an online update query. Hashes identify reviewed content; they are not vendor signatures.
Current customer deliverables are DEB and AppImage for each platform, all at application/package 0.1.0, build
36cb498298d7. Maintained helpers also support.run, but that format is not part of the current customer delivery set.Separate local PC and Jetson ZIP handoff bundles each contain the matching DEB/AppImage, platform-specific Chinese/English Markdown quick starts and an internal SHA-256 manifest. The guides cover extraction, installation/reinstallation, AppImage startup without FUSE, conditional dialout setup with full logout/login, safe update steps and log export. These generated archives, Markdown handoff copies, installers and detailed local evidence are not committed or uploaded by this PR update. No GitHub Release/download asset is being published.
Validation
CI dependency and historical-fixture coverage — current head
285584dThe previous failed run passed C++ build/unit tests but failed five Python cases because PySide6 was missing. The workflow now installs pinned Qt 6.8.3, explicit offscreen graphics/font libraries and Noto CJK, starts a real
QApplicationbefore pytest and runs the complete suite withQT_QPA_PLATFORM=offscreenand skip reasons visible. GUI tests are retained, not filtered out or made optional to hide the failure.A clean checkout also exposed two GUI cases depending on an untracked vendor RS00 BIN. Those cases now use a temporary, clearly synthetic UI payload and a separate test-only hash catalog; real default selection and image validation still execute. Original language/CAN-ID/layout assertions remain, and assertions verify that the synthetic motor image was selected. No vendor BIN was added to Git and no production validation policy was relaxed.
The build/test checkout now uses
fetch-depth: 0, making the three catalog-pinned historical MCU blobs available. That job also setsTACCAP_REQUIRE_FIRMWARE_HISTORY=1: missing objects cause a clear test failure instead of silently skipping seven integrations. Two policy regression cases cover strict CI failure versus optional local skipping. No historical firmware payload was added to the installer or source tree; tests read reviewed bytes from the existing public Git history and still verify SHA-256 and role/version selection.Local reproduction used the same temporary depth-1 Git copy before and after fetching full history. With missing objects, optional mode gave 50 passed / 7 skipped; strict mode gave the expected 50 passed / 7 failures, not skips. After unshallowing, all 57 related cases passed with zero skips, including the seven previously skipped integrations. The catalog's three historical commits were checked for ancestry and blob hashes.
Current-source SDK/examples/native bindings rebuilt using the existing isolated development environments (Python 3.12.14, Qt 6.8.3, pybind11 3.1.0, GCC 14.4). Strict full-history software regression passed 549 tests / 18 subtests, with only 2 physical-leader tests explicitly deselected to avoid hardware access; 471 C++ tests and all configured pre-commit hooks passed. This local development environment is separate from the self-contained customer packages and the clean Ubuntu GitHub runner.
Online validation: GitHub Actions run 39412234040, for this exact head, passed all three jobs: build + unit tests, lint and protocol mirror vs firmware. The build log confirms
fetch-depth: 0andTACCAP_REQUIRE_FIRMWARE_HISTORY: 1, 471 C++ tests passed, and 549 Python tests / 18 subtests passed. The seven previously skipped historical-image integrations now run and pass; the only 2 skips are the physical-leader IMU checks. No GUI or Git-history tests were skipped. This supersedes the previous head's 540-pass / 9-skip CI result.No installer rebuild/reinstallation is needed for this CI/test-only commit. Existing DEB/AppImage/ZIP evidence below remains explicitly tied to application build
36cb498298d7, not to the new CI head. No physical firmware update was performed.Application/package validation — build
36cb498Recorded for the clean source
36cb498on 2026-10-20; source identity and artifact hashes were rechecked before this push. Publishing unchanged source does not require rerunning these checks or rebuilding identical packages. These are local verification results, not claims about GitHub CI; live CI/review status belongs to the PR Checks/Review sections.QT_QPA_PLATFORM=offscreen build/updater-venv/bin/python -m pytest -q python/testspre-commit run --all-filesRuntime identity: SDK 0.4.3; PC Python 3.12 / Qt 6.8.3; ARM64 Python 3.10 / Qt 6.7.3. Package self-tests reported no non-system external-library dependencies. Temporary ARM64 QEMU registration and build/verification containers were restored after use.
Verified local installer checksums — not uploaded assets
taccap-firmware-updater_0.1.0_amd64.debfddb6dcd162bb7f86362c1e73c6468b7791d44647d7bb894b1c80a74441edcb4taccap-firmware-updater_0.1.0_x86_64.AppImagef85bf0467ac88514d272b00eec50ba1bf815e7a8c3913ae3bd7f9cb309de3bebtaccap-firmware-updater_0.1.0_arm64.debfecd28e32741943ed3b932c7f6b6635fb2413c3fec43ed70137c823de0da8fectaccap-firmware-updater_0.1.0_aarch64.AppImage8d98dec018a86a829bd867d4305580b54999712c7fe90bdd82b74b8aed445d43Hardware acceptance remains pending
No physical firmware update, motor movement, model/direction/torque/CAN-ID write or complete Jetson hardware acceptance was performed for this exact build. Earlier user-reported EL05/Jetson successes have other build identities and do not replace this matrix. Remaining acceptance includes leader/follower, EL05/RS00, upgrade/downgrade/reflash, power recovery, CAN-ID correction, calibration direction/travel, feedback and LED behavior.
Compatibility and remaining review
mainat29ac807; the former frozen-head conflict note is superseded by this published integration. Mergeability, CI, review approval and hardware acceptance must still be assessed independently. Do not merge or release automatically.Traceability
XenseRobotics-AI/TacCap-Gripper#26,codex/firmware-updater→main285584d; CI dependencies/history and test fixtures only36cb498; package build36cb498298d7main29ac807, including upstream PRs #27 and #2836cb498→c35e9e1(Qt dependencies/fixtures) →285584d(full history and strict coverage); no force push or rewritten history2c6121b→36cb498, 20 reachable commits including upstream integration8bcc9ce; branch-creation release evidence was not recorded, so none is invented