From 671fde1bfc8bcefad4128e9025ded940ad859f9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A1=E5=8F=A3=E6=B5=AA=E4=BA=BA?= Date: Sun, 27 Sep 2026 10:25:56 +0800 Subject: [PATCH] fix: detect conflicting I2C controllers --- README.md | 4 ++-- SHA256SUMS | 4 ++-- install.sh | 35 ++++++++++++++++++++++++++++------- 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 9632953..237edc5 100644 --- a/README.md +++ b/README.md @@ -206,8 +206,8 @@ sudo ./install.sh 安装器会: - 安装必要依赖 -- 检查 I²C -- 禁用旧 `temp-control.service` +- 检查 I²C,并在安装前检测 `/dev/i2c-1` 是否被其他 OLED/LED 控制进程占用 +- 发现冲突时列出进程并退出,由用户决定如何处理;安装器不会停止、禁用或杀死其他服务 - 安装字体、程序、配置和 systemd unit - 完整保留用户现有配置(包括所有 section、用户值和注释),仅补入缺失的 `[led]` 和 `[api]` 选项,已有用户值优先 - 生成只读 root token,安装 API/Web 文件 diff --git a/SHA256SUMS b/SHA256SUMS index 7902c79..02f69a6 100644 --- a/SHA256SUMS +++ b/SHA256SUMS @@ -1,9 +1,9 @@ -e43448e7a3d6291aa06717069cf1a3dcbb3fba71fce709f17292d61f89543b43 README.md +0960943a15ae23cd067f1169df6640723500107e8c41af070b0c9b889f29914e README.md 72c46162c33f9587c6ccb01ad53fbaaf4ecec8cd21014b909e87e8707e253e36 app/oled_font_5x7.bin 29f59e41052e1e251bf2f38274cdd321fc195602220b61ac8890202128d7c50a app/pigway_pi_control.py f32be5b63fe2be51e39c106c232ae3cc14dab7c0c3719e2609b9e93a7802b6c3 app/pigway_pi_control_api.py 9f3b2be557b3cd93c309f8a1cadce7d34b23ca06c1ff69231d934e8180fefb48 config/pigway-pi-control.conf -f54b7d0f8c19052efb7b305b074c88aa110483160d2029b3ce44b4d1a15c3f59 install.sh +15b431e62b00886b6561597db059f01f116b5173bdae7a5817f617f7bc73a3ec install.sh 81aea0a89b298b2512fcb9bf6418618ba7a66474d425390cf95a0128c4093474 systemd/pigway-pi-control.service 5d7562c496de597f61b62af48f8f6350ad270e1ebf725426d9f1e5b5d698055e systemd/pigway-pi-control-api.service 9f59e7313ee58e687ae6dd29d175c67082674254ac5c5f54168b2735b64c20a4 uninstall.sh diff --git a/install.sh b/install.sh index 6b89464..91f38ad 100755 --- a/install.sh +++ b/install.sh @@ -12,6 +12,32 @@ done echo "[1/8] 检查 Raspberry Pi I2C..." [ -e /dev/i2c-1 ] || { echo "错误:/dev/i2c-1 不存在。先 sudo raspi-config -> Interface Options -> I2C -> Enable,然后重启。"; exit 1; } +# A running copy of this project is expected during an upgrade. Any other +# process holding the shared bus could race OLED/MCU writes, so report it and +# let the user decide how that process should be managed. +i2c_conflict_pids() { + local allowed_pid pid + allowed_pid="$(systemctl show -p MainPID --value pigway-pi-control.service 2>/dev/null || true)" + for pid in $(fuser /dev/i2c-1 2>/dev/null || true); do + case "$pid" in + ''|*[!0-9]*) continue ;; + esac + [ "$pid" = "$$" ] && continue + [ "$pid" = "$allowed_pid" ] && continue + kill -0 "$pid" 2>/dev/null && echo "$pid" + done +} + +I2C_CONFLICTS="$(i2c_conflict_pids)" +if [ -n "$I2C_CONFLICTS" ]; then + echo "ERROR: /dev/i2c-1 is already in use by another process:" >&2 + while read -r pid; do + ps -p "$pid" -o pid=,user=,comm=,args= >&2 || true + done <<< "$I2C_CONFLICTS" + echo "Stop or reconfigure the conflicting OLED/LED controller, then run the installer again." >&2 + exit 1 +fi + echo "[2/8] 等待 APT/DPKG..." for i in $(seq 1 60); do if ! fuser /var/lib/dpkg/lock-frontend /var/lib/apt/lists/lock /var/cache/apt/archives/lock >/dev/null 2>&1; then break; fi @@ -30,11 +56,6 @@ echo "$SCAN" | grep -qi '3c' || echo "警告:未扫描到 OLED 0x3C" echo "$SCAN" | grep -qi '0d' || echo "警告:未扫描到控制 MCU 0x0D" echo "[5/8] 安装程序与配置..." -if systemctl list-unit-files 2>/dev/null | grep '^temp-control.service' >/dev/null; then - echo "检测到旧 temp-control.service,正在停止并禁用..." - systemctl disable --now temp-control.service 2>/dev/null || true -fi -pkill -f '/temp_control/temp_control' 2>/dev/null || true mkdir -p /usr/local/share/pigway-pi-control install -m 0644 app/oled_font_5x7.bin /usr/local/share/pigway-pi-control/oled_font_5x7.bin mkdir -p /usr/local/share/pigway-pi-control/web @@ -118,8 +139,8 @@ check "OLED pages 0..3" grep -Fq 'cmd(0x22);cmd(0);cmd(3)' "$APP" check "UI CPU/TMP/DSK" grep -Fq 'f"TMP {temp:.1f}C"' "$APP" check "UI IP4/IP6" grep -Fq 'ip_label' "$APP" check "UI right column x=72" grep -Fq 'draw_text_5x7(pix,72,y,right[row])' "$APP" -legacy_stopped() { ! systemctl is-active --quiet temp-control.service; } -check "Legacy service stopped" legacy_stopped +no_other_i2c_owner() { [ -z "$(i2c_conflict_pids)" ]; } +check "No other I2C owner" no_other_i2c_owner check "Service running" systemctl is-active --quiet pigway-pi-control.service check "API/Web service running" systemctl is-active --quiet pigway-pi-control-api.service check "API/Web version 3.6.0" grep -Fq 'APP_VERSION="3.6.0"' /usr/local/sbin/pigway-pi-control-api