update at 2026-06-04 14:09:16

This commit is contained in:
陈赣
2026-06-04 14:09:16 +08:00
parent 41bd03123c
commit 4603914e85
11 changed files with 692 additions and 68 deletions

View File

@@ -13,7 +13,10 @@ const timingFrameEl = document.querySelector("#timing-frame");
let selectedDevice = "";
let pendingDevice = "";
let queuedDevice = "";
let switching = false;
let devicesSignature = "";
let lastWsSignature = "";
function setConnection(online, text) {
connection.textContent = text;
@@ -84,16 +87,54 @@ function renderDetections(detections) {
.join("");
}
async function switchDevice(deviceNum) {
async function performSwitch(deviceNum) {
switching = true;
pendingDevice = deviceNum;
devicesSignature = "";
setConnection(false, "切换中");
const response = await fetch(`/devices/${encodeURIComponent(deviceNum)}`, { method: "POST" });
if (!response.ok) {
throw new Error("切换摄像头失败");
console.log("[device-switch] start", { deviceNum });
try {
const response = await fetch(`/devices/${encodeURIComponent(deviceNum)}`, { method: "POST" });
if (!response.ok) {
throw new Error("切换摄像头失败");
}
const result = await response.json();
const video = document.querySelector("#video");
if (video) {
video.src = `/video?t=${Date.now()}`;
}
document.querySelectorAll(".grid-video").forEach((item) => {
item.src = `${item.dataset.src}?t=${Date.now()}`;
});
console.log("[device-switch] requested", { deviceNum, version: result.version });
} catch (error) {
pendingDevice = "";
devicesSignature = "";
setConnection(false, "切换失败");
console.error("[device-switch] failed", { deviceNum, error });
} finally {
switching = false;
if (queuedDevice && queuedDevice !== deviceNum) {
const nextDevice = queuedDevice;
queuedDevice = "";
return performSwitch(nextDevice);
}
queuedDevice = "";
}
const video = document.querySelector("#video");
video.src = `/video?t=${Date.now()}`;
}
function switchDevice(deviceNum) {
if (switching) {
queuedDevice = deviceNum;
pendingDevice = deviceNum;
devicesSignature = "";
setConnection(false, "等待切换");
console.log("[device-switch] queued", { deviceNum });
return Promise.resolve();
}
return performSwitch(deviceNum);
}
function connectWebSocket() {
@@ -109,6 +150,18 @@ function connectWebSocket() {
errorEl.textContent = data.error || (data.connected ? "正常" : "未连接");
sourceEl.textContent = data.source || "-";
setConnection(Boolean(data.connected), data.connected ? "已连接" : "重连中");
const wsSignature = `${data.current_device_num}|${data.connected}|${data.frame_id}|${data.error || ""}`;
if (wsSignature !== lastWsSignature) {
lastWsSignature = wsSignature;
console.log("[device-switch] ws", {
currentDeviceNum: data.current_device_num,
pendingDevice,
queuedDevice,
connected: data.connected,
frameId: data.frame_id,
error: data.error,
});
}
if (pendingDevice && data.current_device_num === pendingDevice) {
pendingDevice = "";
deviceSelect.disabled = false;