modify 修复前端展示配置与实际插件配置不一致的bug
This commit is contained in:
@@ -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}, "
|
||||
|
||||
Reference in New Issue
Block a user