var cameraLogLevel = ""; function setCameraLogLevel() { var level = logLevel.value; fetch("/api/camera/loglevel", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ level: level }), }) .then(function (r) { if (!r.ok) { return r.text().then(function (t) { throw new Error(t); }); } cameraLogLevel = level; }) .catch(function (e) { logLevel.value = cameraLogLevel; }); } function getCameraLogLevel() { fetch("/api/camera/loglevel") .then(function (r) { if (!r.ok) { return r.text().then(function (t) { throw new Error(t); }); } return r.json(); }) .then(function (d) { cameraLogLevel = d.log_level; logLevel.value = d.log_level; }) .catch(function (e) { cameraLogLevel = ""; logLevel.value = ""; }); } function downloadCameraLogFile(event) { var btn = event.currentTarget; btn.disabled = true; fetch("/api/camera/logfile") .then(function (r) { if (!r.ok) { throw new Error("HTTP " + r.status); } var disposition = r.headers.get("Content-Disposition"); var filename = "camera.log.tar.gz"; if (disposition) { var match = disposition.match(/filename="?([^";]+)"?/); if (match) { filename = match[1]; } } return r.blob().then(function (blob) { return { blob: blob, filename: filename }; }); }) .then(function (res) { downloadBlobFile(res.blob, res.filename); alert("下载成功"); }) .catch(function (e) { console.error("download failed:", e); alert("下载失败: " + e.message); }) .finally(function () { btn.disabled = false; btn.textContent = "下载"; }); } function restartCameraService(event) { if (!confirm("确定重启相机服务吗?")) { return; } if (cameraTakingPhoto || cameraPreviewRunning) { alert("相机使用中,请稍后再重试!"); return; } var btn = event.currentTarget; btn.disabled = true; fetch("/api/camera/restart", { method: "POST", }) .then(function (r) { if (!r.ok) { return r.text().then(function (t) { throw new Error(t); }); } alert("重启成功"); }) .catch(function (e) { console.error("restart failed:", e); alert("重启失败: " + e.message); }) .finally(function () { btn.disabled = false; }); } function getCameraStatus() { ["btn1", "btn2", "btn3", "btn4"].forEach(function (id) { return setBtnStatus(id, false, "page5"); }); fetch("/api/camera/status") .then(function (r) { if (!r.ok) { throw new Error("HTTP " + r.status); } return r.json(); }) .then(function (data) { ["avar1", "avar2", "avar3", "avar4", "avar5", "avar6"].forEach(function (id) { return setText(id, data[id], "page5"); }); }) .catch(function (e) { console.error("getCameraStatus() failed:", e); ["avar1", "avar2", "avar3", "avar4", "avar5", "avar6"].forEach(function (id) { return setText(id, null, "page5"); }); }) .finally(function () { updateCameraButtons(); }); getCameraLogLevel(); } function cameraPower(enable) { fetch("/api/camera/gpio22power", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ enable: enable, }), }) .then(function (r) { if (!r.ok) { return r.text().then(function (t) { throw new Error(t); }); } return r.json(); }) .then(function (data) { if (data.ok) { setText("avar5", enable === "true" ? { level: "ok", text: "打开" } : null, "page5"); alert(enable === "true" ? "上电成功" : "断电成功"); } else { // 目前后端不会这么返回,避免以后修改代码 alert("操作失败"); } }) .catch(function (e) { setText("avar5", null, "page5"); alert("操作失败: " + e.message); }); } function cameraPing() { fetch("/api/camera/pingGigeCamera", { method: "POST" }) .then(function (r) { return r.json(); }) .then(function (data) { setText("avar6", data.avar6, "page5"); alert( data.avar6 && data.avar6.level === "ok" ? "网口相机Ping测试成功" : "网口相机Ping测试失败" ); }) .catch(function () { setText("avar6", null, "page5"); alert("网口相机Ping测试失败"); }); } var cameraPreviewTimer = null; var cameraPreviewRunning = false; var cameraPreviewFrames = 0; var cameraPhotoIndex = 0; var cameraCurrentFile = ""; var cameraTakingPhoto = false; var cameraPhotoFiles = ["/tmp/camera_preview_0.jpg", "/tmp/camera_preview_1.jpg"]; function updateCameraButtons() { var normalEnable = !cameraPreviewRunning && !cameraTakingPhoto; ["btn1", "btn2", "btn3"].forEach(function (id) { return setBtnStatus(id, normalEnable, "page5"); }); setBtnStatus("btn4", cameraPreviewRunning, "page5"); } function cameraTakePhoto(filename) { return fetch("/api/camera/takePhoto", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ filename: filename, }), }).then(function (r) { if (!r.ok) { return r.text().then(function (t) { throw new Error(t); }); } return r.json(); }); } var imageLoadSeq = 0; function setImageSrc(id, url, showLoadStatus) { if (showLoadStatus === undefined) { showLoadStatus = true; } var img = document.getElementById(id); if (!img) return; var seq = ++imageLoadSeq; var start = Date.now(); img.onload = function () { if (seq !== imageLoadSeq || !showLoadStatus) return; setText("cvar1", "图片加载完成, 耗时:" + (Date.now() - start) + "ms", "page5"); }; img.onerror = function () { if (seq !== imageLoadSeq || !showLoadStatus) return; setText("cvar1", "图片加载失败, 耗时:" + (Date.now() - start) + "ms", "page5"); }; var separator = url.includes("?") ? "&" : "?"; img.src = url + separator + "t=" + Date.now(); } function takeOnePhoto() { if (cameraPreviewRunning || cameraTakingPhoto) { return; } setCameraWaitAEDone(true) .catch(function (e) { console.error("open wait AE failed:", e); }) .then(function () { cameraTakingPhoto = true; updateCameraButtons(); ["cvar1", "cvar2", "cvar3", "cvar4", "cvar5", "cvar6"].forEach(function (id) { return setText(id, null, "page5"); }); setText("cvar1", "拍照中, 请稍后...", "page5"); var filename = cameraPhotoFiles[cameraPhotoIndex]; cameraPhotoIndex = cameraPhotoIndex ? 0 : 1; return cameraTakePhoto(filename) .then(function (data) { if (!data.ok) throw new Error("take photo failed"); setText("cvar1", "预览中, 请稍后...", "page5"); setText("cvar2", "1", "page5"); setText("cvar3", data.var1, "page5"); setText("cvar4", data.var2, "page5"); setText("cvar5", data.var3, "page5"); setText("cvar6", data.var4 + "x" + data.var5, "page5"); cameraCurrentFile = filename; setImageSrc( "camera-image", "/api/camera/getImage?file=" + encodeURIComponent(cameraCurrentFile), true ); }) .catch(function (e) { console.error("takeOnePhoto failed:", e); setText("cvar1", "拍照失败", "page5"); }) .finally(function () { cameraTakingPhoto = false; updateCameraButtons(); }); }); } function setCameraWaitAEDone(waitAE) { return fetch("/api/camera/setWaitAEDoneForTakePhoto", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ waitAE: waitAE ? "1" : "0", }), }).then(function (r) { if (!r.ok) { return r.text().then(function (t) { throw new Error(t); }); } }); } function startCameraPreview() { if (cameraPreviewRunning || cameraTakingPhoto) { return; } setCameraWaitAEDone(false) .catch(function (e) { console.error("close wait AE failed:", e); }) .then(function () { cameraPreviewRunning = true; updateCameraButtons(); cameraPreviewFrames = 0; ["cvar1", "cvar2", "cvar3", "cvar4", "cvar5", "cvar6"].forEach(function (id) { return setText(id, null, "page5"); }); cameraPreviewLoop(); }); } function cameraPreviewLoop() { if (!cameraPreviewRunning) { return; } cameraTakingPhoto = true; updateCameraButtons(); setText("cvar1", "拍照中, 请稍后...", "page5"); var filename = cameraPhotoFiles[cameraPhotoIndex]; cameraPhotoIndex = cameraPhotoIndex ? 0 : 1; cameraTakePhoto(filename) .then(function (data) { if (!data.ok) throw new Error("take photo failed"); setText("cvar1", "预览中, 请稍后...", "page5"); cameraPreviewFrames++; setText("cvar2", String(cameraPreviewFrames), "page5"); setText("cvar3", data.var1, "page5"); setText("cvar4", data.var2, "page5"); setText("cvar5", data.var3, "page5"); setText("cvar6", data.var4 + "x" + data.var5, "page5"); cameraCurrentFile = filename; setImageSrc( "camera-image", "/api/camera/getImage?file=" + encodeURIComponent(cameraCurrentFile), false ); }) .catch(function (e) { console.error("cameraPreviewLoop failed:", e); stopCameraPreview(); setText("cvar1", "拍照失败", "page5"); }) .finally(function () { cameraTakingPhoto = false; updateCameraButtons(); if (cameraPreviewRunning) { cameraPreviewTimer = setTimeout(cameraPreviewLoop, 20); } else { setText("cvar1", "连拍已停止", "page5"); setCameraWaitAEDone(true).catch(function (e) { console.error("restore wait AE failed:", e); }); } }); } function stopCameraPreview() { if (!cameraPreviewRunning) { return; } cameraPreviewRunning = false; updateCameraButtons(); if (cameraPreviewTimer) { clearTimeout(cameraPreviewTimer); cameraPreviewTimer = null; } setText("cvar1", "停止连怕中, 请稍后...", "page5"); } function downloadCameraImage() { if (!cameraCurrentFile) { alert("暂无图片"); return; } var url = "/api/camera/getImage?file=" + encodeURIComponent(cameraCurrentFile) + "&download=1"; fetch(url) .then(function (r) { return r.blob(); }) .then(function (blob) { downloadBlobFile(blob, "camera.jpg"); }) .catch(function () { alert("下载失败"); }); } function initPage5() { getCameraStatus(); if (cameraTakingPhoto || cameraPreviewRunning) { setText("cvar1", "拍照中, 请稍后...", "page5"); } else if (cameraCurrentFile) { setText("cvar1", "加载最后拍摄的图片...", "page5"); setImageSrc( "camera-image", "/api/camera/getImage?file=" + encodeURIComponent(cameraCurrentFile), true ); } connectLog("yfkj-camera-capture.service", "text1"); } function exitPage5() { if (cameraPreviewRunning) { stopCameraPreview(); } disconnectLog(); }