modify 修复前端展示配置与实际插件配置不一致的bug

This commit is contained in:
2026-09-17 15:34:34 +08:00
parent 293254c61a
commit e0211105bd
6 changed files with 261 additions and 40 deletions
+33 -12
View File
@@ -23,15 +23,19 @@ import threading
import httpx
from .diwatch.backends import SysfsBackend
from .diwatch.config import IN2_INDEX, find_status_file
from .diwatch.backends import EventBackend, make_in2_backend
from .diwatch.core import DIChannel
logger = logging.getLogger(__name__)
class In2TaskSwitch:
"""IN2 数字输入 → 全部算法任务启停开关。"""
"""IN2 数字输入 → 全部算法任务启停开关。
后端自适应(make_in2_backend):SE9 走 sysfs gpio_status 轮询;
SE5 无 gpio-in-2 时回退 gpio-keys event 设备(默认键码 KEY_DOWN=108,
可用 device/key 参数覆盖,键码用 diwatch detect 查询)。
"""
def __init__(
self,
@@ -41,6 +45,8 @@ class In2TaskSwitch:
poll_interval: float = 0.05,
debounce: int = 3,
active_low: bool = False,
device: str | None = None,
key: int | None = None,
timeout: float = 10.0,
):
self.api_base = api_base.rstrip("/")
@@ -49,6 +55,8 @@ class In2TaskSwitch:
self.poll_interval = poll_interval
self.debounce = debounce
self.active_low = active_low
self.device = device
self.key = key
self.timeout = timeout
self._channel: DIChannel | None = None
@@ -58,16 +66,18 @@ class In2TaskSwitch:
# ---- 生命周期 ----
def start(self, loop: asyncio.AbstractEventLoop) -> bool:
"""启动监听线程;找不到 IN2 状态文件时返回 False(非盒子环境属正常)。"""
status = find_status_file(IN2_INDEX)
if not status:
"""启动监听线程;找不到 IN2 可用后端时返回 False(非盒子环境属正常)。"""
backend = make_in2_backend(
device=self.device, key=self.key,
interval=self.poll_interval, debounce=self.debounce,
)
if backend is None:
logger.warning(
"[TaskSwitch] 找不到 IN2 状态文件,任务启停开关未启动"
"(非盒子环境属正常现象)"
"[TaskSwitch] 找不到 IN2 可用后端(sysfs 状态文件与 gpio-keys "
"event 设备均不存在),任务启停开关未启动(非盒子环境属正常现象)"
)
return False
backend = SysfsBackend(status, debounce=self.debounce, interval=self.poll_interval)
self._channel = DIChannel(
"IN2", backend,
active_low=self.active_low,
@@ -79,11 +89,21 @@ class In2TaskSwitch:
target=self._run_channel, name="in2-task-switch", daemon=True,
)
self._thread.start()
backend_desc = (
f"event:{getattr(backend, 'device', '?')}, 键码={backend.key}"
if isinstance(backend, EventBackend)
else f"sysfs:{backend.path}"
)
logger.info(
f"[TaskSwitch] IN2 任务启停开关已启动: 状态文件={status}, "
f"[TaskSwitch] IN2 任务启停开关已启动: 后端={backend_desc}, "
f"api_base={self.api_base}, "
f"启动命令={self.start_command}, 停止命令={self.stop_command}"
)
if isinstance(backend, EventBackend):
logger.info(
"[TaskSwitch] event 后端无初始电平,以首个事件为准;"
"若操作 IN2 无反应,用 diwatch detect 查实际键码并配置 task_switch.key"
)
return True
def stop(self) -> None:
@@ -96,7 +116,7 @@ class In2TaskSwitch:
def _run_channel(self) -> None:
try:
self._channel.run()
self._channel.run() # type: ignore
except Exception as e:
logger.error(f"[TaskSwitch] IN2 监听线程异常退出: {type(e).__name__}: {e}")
@@ -156,7 +176,8 @@ class In2TaskSwitch:
"""查询全部任务的 AlgTaskSession 列表;失败返回空列表。"""
try:
async with httpx.AsyncClient(timeout=self.timeout) as client:
resp = await client.post(f"{self.api_base}/api/alg_task_fetch", json={})
# resp = await client.post(f"{self.api_base}/api/alg_task_fetch", json={})
resp = await client.get(f"{self.api_base}/api/alg_task_fetch")
if not resp.is_success:
logger.warning(
f"[TaskSwitch] 查询任务失败: Status={resp.status_code}, "