重构屏幕控制引擎 + 新增 Web 监控面板

- ScreenManager: 基于优先级(9/5/0)的统一屏幕控制引擎,替代 _tick 中的
  散乱 if-else 逻辑
- 四个亮屏事件: scheduled(p9), sensor(p9), manual(p5), external(p0)
- GPIO 回调: 电平变化立即触发亮屏(异步线程,不阻塞轮询)
- _fast_check: 每秒轻量评估,提高息屏超时精度(±1s 替代 ±30s)
- padsleep_web: 通过 IPC 读取守护进程状态的实时 Web 面板
  (GPIO 电平/屏幕状态/ADB 连接,端口 31400)
- padsleep-web.service: 关联 padsleep.service 的自启动服务
- install.sh: 修复 venv 初始化目录上下文,使用 requirements.txt
- IpcClient: 修复 socket 复用导致交替失败的问题
- padsleep_tui: 适配 ScreenManager 状态显示

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
kushidou
2026-07-20 00:15:07 +08:00
co-authored by Claude Fable 5
parent 9940db451f
commit e6fbe550bb
8 changed files with 1134 additions and 103 deletions
+53 -24
View File
@@ -63,6 +63,8 @@ info "已创建目录 $INSTALL_DIR"
# ── 复制文件 ──
cp "$SRC_DIR/padsleep.py" "$INSTALL_DIR/"
cp "$SRC_DIR/padsleep_tui.py" "$INSTALL_DIR/"
cp "$SRC_DIR/padsleep_web.py" "$INSTALL_DIR/" 2>/dev/null || true
cp -r "$SRC_DIR/templates" "$INSTALL_DIR/" 2>/dev/null || true
cp "$SRC_DIR/requirements.txt" "$INSTALL_DIR/" 2>/dev/null || true
# 配置文件:目标不存在则复制,存在则保留
@@ -77,25 +79,34 @@ fi
touch "$INSTALL_DIR/padsleep.log"
chmod 644 "$INSTALL_DIR/padsleep.log"
# ── 创建 Python 虚拟环境 ──
# ── 创建 Python 虚拟环境并安装依赖 ──
# 进入目标目录确保 venv 上下文正确
cd "$INSTALL_DIR"
if [ ! -d "$VENV_DIR" ]; then
info "正在创建 Python 虚拟环境..."
python3 -m venv "$VENV_DIR"
python3 -m venv .venv
info "虚拟环境已创建: $VENV_DIR"
else
info "虚拟环境已存在,跳过创建"
fi
# ── 安装 Python 依赖 ──
info "正在安装 Python 依赖..."
"$VENV_DIR/bin/pip" install --quiet adbutils rpi-lgpio 2>&1 || {
warn "pip 安装失败,尝试离线安装..."
if [ -f "$SRC_DIR/.venv" ]; then
cp -r "$SRC_DIR/.venv" "$VENV_DIR"
fi
}
info "正在安装 Python 依赖 (requirements.txt)..."
if [ -f "$INSTALL_DIR/requirements.txt" ]; then
.venv/bin/pip install --quiet -r requirements.txt 2>&1 || {
warn "pip 安装失败,尝试逐个安装..."
.venv/bin/pip install --quiet adbutils rpi-lgpio flask flask-socketio 2>&1 || {
warn "pip 安装仍然失败,请手动执行: cd $INSTALL_DIR && .venv/bin/pip install -r requirements.txt"
}
}
else
.venv/bin/pip install --quiet adbutils rpi-lgpio flask flask-socketio 2>&1 || \
warn "pip 安装失败,请手动安装依赖"
fi
info "Python 依赖安装完成"
cd "$SRC_DIR" # 回到源目录
# 设置执行权限
chmod 755 "$INSTALL_DIR/padsleep.py"
chmod 755 "$INSTALL_DIR/padsleep_tui.py"
@@ -121,22 +132,38 @@ WRAPPER
create_wrapper "padsleep.py" "$BIN_DIR/padsleep"
create_wrapper "padsleep_tui.py" "$BIN_DIR/padsleep-config"
if [ -f "$INSTALL_DIR/padsleep_web.py" ]; then
create_wrapper "padsleep_web.py" "$BIN_DIR/padsleep-web"
fi
info "已创建命令入口:"
info " $BIN_DIR/padsleep → 启动守护进程 ($PYTHON_BIN)"
info " $BIN_DIR/padsleep-config → 启动 TUI 配置工具 ($PYTHON_BIN)"
info " $BIN_DIR/padsleep-web → 启动 Web 监控面板 ($PYTHON_BIN)"
# ── 可选:复制 systemd 服务 ──
if [ -f "$SRC_DIR/padsleep.service" ]; then
cp "$SRC_DIR/padsleep.service" "$SERVICE_DIR/padsleep.service"
sed -i "s|WorkingDirectory=.*|WorkingDirectory=$INSTALL_DIR|" "$SERVICE_DIR/padsleep.service"
sed -i "s|ExecStart=.*|ExecStart=$PYTHON_BIN $INSTALL_DIR/padsleep.py|" "$SERVICE_DIR/padsleep.service"
sed -i "s|^User=.*|User=$RUN_USER|" "$SERVICE_DIR/padsleep.service"
systemctl daemon-reload
info "已复制 systemd 服务文件: $SERVICE_DIR/padsleep.service"
info "服务用户已设为: $RUN_USER"
info "可执行以下命令启用:"
info " sudo systemctl enable --now padsleep"
fi
install_service() {
local src="$1"
local dst="$2"
local script="$3"
if [ ! -f "$src" ]; then
warn "服务文件不存在: $src,跳过"
return
fi
cp "$src" "$dst"
sed -i "s|WorkingDirectory=.*|WorkingDirectory=$INSTALL_DIR|" "$dst"
sed -i "s|ExecStart=.*|ExecStart=$PYTHON_BIN $INSTALL_DIR/$script|" "$dst"
sed -i "s|^User=.*|User=$RUN_USER|" "$dst"
info "已安装 $dst"
}
install_service "$SRC_DIR/padsleep.service" "$SERVICE_DIR/padsleep.service" "padsleep.py"
install_service "$SRC_DIR/padsleep-web.service" "$SERVICE_DIR/padsleep-web.service" "padsleep_web.py"
systemctl daemon-reload
info "systemd 已重载"
echo ""
info "启用服务(自启动 + 立即启动):"
info " sudo systemctl enable --now padsleep padsleep-web"
# ── 检查 ADB ──
if command -v adb &>/dev/null; then
@@ -151,9 +178,11 @@ echo -e "${GREEN}═════════════════════
info "安装完成!"
echo ""
info "使用方法:"
echo " 1. 启动守护进程: padsleep"
echo " 2. 打开配置界面: padsleep-config"
echo " 3. 注册系统服务: sudo systemctl enable --now padsleep"
echo " 1. 启动守护进程: padsleep"
echo " 2. 打开 TUI 配置界面: padsleep-config"
echo " 3. 打开 Web 监控面板: padsleep-web"
echo " 4. 注册系统服务: sudo systemctl enable --now padsleep padsleep-web"
echo " 5. Web 面板地址: http://树莓派IP:31400"
echo ""
info "配置文件: $INSTALL_DIR/config.json"
info "日志文件: $INSTALL_DIR/padsleep.log"