fix(bt): M49 蓝牙控制面重建 — paired-devices/a2dp list-pcms+info/run_cmd 四态+写后真态复查+扫描 ANSI 解析
真机 0.8.49 现场 /usr/bin/meow_netmgrd 是 P1(eb07415) 之前的旧件:`bt status` 无
connected= 字段、`bt connected|devices|a2dp` 连子命令都不存在(被当成写级拒绝)、
`bt paired` 落到 `bluetoothctl paired` → "Invalid command in menu main"。上游只有
NETMGR_UNREACH 才回退直连,INVAL/PERM 直接返回 → 三个列表恒空。
本单修掉「部署新件后依然存在」的三个真 bug + 一个解析缺陷:
1. `bluetoothctl paired` → `paired-devices`(bt_status 计数、bt paired 子命令两处);
`devices` 只用于补名,不再当配对权威。
2. A2DP:v4.1.1 没有 `a2dp list`。改为 `list-pcms` 取端点 → 每端点 `info <path>`;
MAC 只从 D-Bus 路径的 `dev_XX_..` 段解(真机路径带 `/a2dpsrc/source` 段,
按「最后一段取 token」会拿到 "source")。info 查不到就跳过,不编造。
3. `run_cmd` 四态(成功有输出/成功无输出/非 0 退出/超时/起不来)+ stderr 有界抓取
(≤256B):旧实现只回字节数、失败也返回 0 → on/off/connect/disconnect/pair 恒报成功。
写操作改为下发后复查真态(hcitool con / bluetoothctl info Paired: / hciconfig
power),超时或未收敛如实报 MEOW_ERR_NODEV。兼容外壳 run_cmd() 契约不变。
4. 扫描缓存:实时 `[NEW] Device` 行以 ANSI ESC 开头(真机 od -c 证据),旧解析器只认
行首 → 实时行全丢。新增 bt_clean_ansi()/bt_scan_line_parse():剥 ESC/CSI/控制符、
去 `[bluetooth]# ` 提示符、只认 [NEW] 与裸 Device、排除 [CHG]/[DEL];bt_scan_on 改用
g_bluetoothctl(原来硬编码,桩对 scan 无效)。
解析器全部抽成纯函数并用真机原始字节做单测(test_bt_ctl.c 扩充:四态、ANSI 样本、
截断/空输出、list-pcms/info、hcitool con)。test_netmgrd.sh 桩改 list-pcms/info +
真机 ANSI 缓存样本;顺带修掉两处宿主可移植性问题(/tmp 不可写→$TMPDIR、桩脚本在
PATH=/bin:/usr/bin 下用了 cat/rm→改 shell 内建,test_wifi_connect 的 g_wpa_cli 悬垂
栈指针)。
按塔要求:本 commit 不含二进制、不改 fw_content.conf(netmgrd 产物由 M51 统一重编)。
build_netmgrd.sh 只做 ROOT/ZIGCC/OUT 环境变量化(旧硬编码 $HOME/Project/R3ProII),
M51 复用;time32 接入仍归 M43。
This commit is contained in:
1 parent
00e7271395
commit
370c290160
5 files changed
+1267
-312
No files matched your search
@@ -9,28 +9,36 @@
|
||||
# 用法:
|
||||
# ./build_netmgrd.sh # 交叉编译 → patch_v2/meow_netmgrd/meow_netmgrd(mipsel 静态)
|
||||
# ./build_netmgrd.sh host # 宿主编译 → patch_v2/meow_netmgrd/meow_netmgrd_host
|
||||
# OUT=/path/to/out ./build_netmgrd.sh # 产物另存(M49 起:仓库里不提交二进制,验证产物放仓库外)
|
||||
set -e
|
||||
cd "$(dirname "$0")"
|
||||
ROOT="$HOME/Project/R3ProII"
|
||||
CC="$ROOT/.tools/zig-mipsel-cc"
|
||||
# 仓库根按本脚本位置推导(<root>/patch_v2/meow_netmgrd/),MEOW_ROOT 可覆盖。
|
||||
# 旧版硬编码 $HOME/Project/R3ProII —— 换 checkout 路径/用 worktree 时直接编不动。
|
||||
ROOT="${MEOW_ROOT:-$(cd ../.. && pwd)}"
|
||||
# 交叉编译器:ZIGCC env 优先,其次 <root>/.tools/,最后 $HOME/.tools/(.tools 常只在主 checkout 里)
|
||||
CC="${ZIGCC:-$ROOT/.tools/zig-mipsel-cc}"
|
||||
[ -x "$CC" ] || CC="$HOME/.tools/zig-mipsel-cc"
|
||||
I_HDR="$ROOT/patch_v2/meow_launcherd" # meow_ipc.h(帧/MSG_NET_*/m_net_*)
|
||||
OUT="${OUT:-.}"
|
||||
[ -d "$OUT" ] || mkdir -p "$OUT"
|
||||
|
||||
if [ "$1" = "host" ]; then
|
||||
HOST_CC="${CC_HOST:-cc}"
|
||||
# -Wno-format-truncation:宿主 glibc 对固定缓冲 snprintf 的「安全截断」误报(musl 交叉不报)。
|
||||
"$HOST_CC" -Os -Wall -Wextra -U_FORTIFY_SOURCE -Wno-format-truncation -I"$I_HDR" \
|
||||
meow_netmgrd.c -o meow_netmgrd_host
|
||||
meow_netmgrd.c -o "$OUT/meow_netmgrd_host"
|
||||
echo "== host build =="
|
||||
ls -la meow_netmgrd_host
|
||||
file meow_netmgrd_host
|
||||
ls -la "$OUT/meow_netmgrd_host"
|
||||
file "$OUT/meow_netmgrd_host"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# meow_time32.c:独立 o32 time32 取时/睡眠(netmgrd 不链 meow_ui.a);修 DNS TTL 基准
|
||||
# 与 nanosleep 退避。守护/CLI 同一二进制,一次构建两处安装。
|
||||
# 与 nanosleep 退避。守护/CLI 同一二进制,一次构建两处安装。(M43 的 time32 接入,必须保留:
|
||||
# 少了它 mono_now()/轮询退避会踩 mipsel o32 的 time64/time32 结构错位。)
|
||||
"$CC" -Os -Wall -Wextra -static -I"$I_HDR" -DMEOW_TIME32_LIBC_OVERRIDES \
|
||||
meow_netmgrd.c ../sdk/meow_time32.c -o meow_netmgrd
|
||||
meow_netmgrd.c ../sdk/meow_time32.c -o "$OUT/meow_netmgrd"
|
||||
echo "== meow_netmgrd (mipsel static) =="
|
||||
ls -la meow_netmgrd
|
||||
md5sum meow_netmgrd
|
||||
file meow_netmgrd
|
||||
ls -la "$OUT/meow_netmgrd"
|
||||
md5sum "$OUT/meow_netmgrd"
|
||||
file "$OUT/meow_netmgrd"
|
||||
Reference in new issue
Block a user