update at 2026-06-04 14:09:16
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user