| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401 |
- let cameraLogLevel = "";
- function setCameraLogLevel() {
- const level = logLevel.value;
- fetch("/api/camera/loglevel", {
- method: "POST",
- headers: {"Content-Type": "application/json"},
- body: JSON.stringify({level})
- })
- .then(async r => {
- if (!r.ok) throw new Error(await r.text());
- cameraLogLevel = level;
- })
- .catch(e => {
- logLevel.value = cameraLogLevel;
- });
- }
- function getCameraLogLevel() {
- fetch("/api/camera/loglevel")
- .then(async r => {
- if (!r.ok) throw new Error(await r.text());
- return r.json();
- })
- .then(d => {
- cameraLogLevel = d.log_level;
- logLevel.value = d.log_level;
- })
- .catch(e => {
- cameraLogLevel = "";
- logLevel.value = "";
- });
- }
- function downloadCameraLogFile(event) {
- const btn = event.currentTarget;
- btn.disabled = true;
- fetch("/api/camera/logfile")
- .then(async r => {
- if (!r.ok) {
- throw new Error("HTTP " + r.status);
- }
- const disposition = r.headers.get("Content-Disposition");
- let filename = "camera.log.tar.gz";
- if (disposition) {
- const match = disposition.match(/filename="?([^";]+)"?/);
- if (match) {
- filename = match[1];
- }
- }
- return {
- blob: await r.blob(),
- filename
- };
- })
- .then(({ blob, filename }) => {
- const url = URL.createObjectURL(blob);
- const a = document.createElement("a");
- a.href = url;
- a.download = filename;
- document.body.appendChild(a);
- a.click();
- a.remove();
- setTimeout(() => {
- URL.revokeObjectURL(url);
- }, 1000);
- alert("下载成功");
- })
- .catch(e => {
- console.error("download failed:", e);
- alert("下载失败: " + e.message);
- })
- .finally(() => {
- btn.disabled = false;
- btn.textContent = "下载";
- });
- }
- function restartCameraService(event) {
- if (!confirm("确定重启相机服务吗?")) {
- return;
- }
- if (cameraTakingPhoto || cameraPreviewRunning) {
- alert("相机使用中,请稍后再重试!");
- return;
- }
- const btn = event.currentTarget;
- btn.disabled = true;
- fetch("/api/camera/restart", {
- method: "POST"
- })
- .then(async r => {
- if (!r.ok) {
- throw new Error(await r.text());
- }
- logLevel.value = "info";
- cameraLogLevel = logLevel.value;
- disconnectLog();
- connectLog("yfkj-camera-capture.service", "text1");
- alert("重启成功");
- })
- .catch(e => {
- console.error("restart failed:", e);
- alert("重启失败: " + e.message);
- })
- .finally(() => {
- btn.disabled = false;
- });
- }
- function getCameraStatus() {
- ["btn1", "btn2", "btn3", "btn4"]
- .forEach(id => setBtnStatus(id, false, "page5"));
- fetch("/api/camera/status")
- .then(async r => {
- if (!r.ok) {
- throw new Error("HTTP " + r.status);
- }
- return r.json();
- })
- .then(data => {
- ["avar1","avar2","avar3","avar4","avar5", "avar6"]
- .forEach(id => setText(id, data[id], "page5"));
- })
- .catch(e => {
- console.error("getCameraStatus() failed:", e);
- ["avar1","avar2","avar3","avar4","avar5", "avar6"]
- .forEach(id => setText(id, null, "page5"));
- })
- .finally(() => {
- updateCameraButtons();
- });
- getCameraLogLevel();
- }
- function cameraPower(enable) {
- fetch("/api/camera/gpio22power", {
- method: "POST",
- headers: {
- "Content-Type": "application/json"
- },
- body: JSON.stringify({
- enable: enable
- })
- })
- .then(async r => {
- if (!r.ok) {
- throw new Error(await r.text());
- }
- return r.json();
- })
- .then(data => {
- if (data.ok) {
- setText("avar5", enable === "true" ? "🟢打开" : null, "page5");
- alert(enable === "true" ? "上电成功" : "断电成功");
- } else { // 目前后端不会这么返回,避免以后修改代码
- alert("操作失败");
- }
- })
- .catch(e => {
- setText("avar5", null, "page5");
- alert("操作失败: " + e.message);
- });
- }
- function cameraPing() {
- fetch("/api/camera/pingGigeCamera", {method:"POST"})
- .then(r => r.json())
- .then(data => {
- setText("avar6", data.avar6, "page5");
- alert(data.avar6 === "🟢正常" ? "网口相机Ping测试成功" : "网口相机Ping测试失败");
- })
- .catch(() => {
- setText("avar6", null, "page5");
- alert("网口相机Ping测试失败");
- });
- }
- let cameraPreviewTimer = null;
- let cameraPreviewRunning = false;
- let cameraPreviewFrames = 0;
- let cameraPhotoIndex = 0;
- let cameraCurrentFile = "";
- let cameraTakingPhoto = false;
- const cameraPhotoFiles = [
- "/tmp/camera_preview_0.jpg",
- "/tmp/camera_preview_1.jpg"
- ];
- function updateCameraButtons() {
- const normalEnable = !cameraPreviewRunning && !cameraTakingPhoto;
- ["btn1", "btn2", "btn3"]
- .forEach(id => setBtnStatus(id, normalEnable, "page5"));
- setBtnStatus("btn4", cameraPreviewRunning, "page5");
- }
- async function cameraTakePhoto(filename) {
- const r = await fetch("/api/camera/takePhoto", {
- method: "POST",
- headers: {
- "Content-Type": "application/json"
- },
- body: JSON.stringify({
- filename: filename
- })
- });
- if (!r.ok) {
- throw new Error(await r.text());
- }
- return await r.json();
- }
- function setImageSrc(id, url)
- {
- const img = document.getElementById(id);
- if (img) img.src = url;
- }
- async function takeOnePhoto() {
- if (cameraPreviewRunning || cameraTakingPhoto) {
- return;
- }
- try {
- await setCameraWaitAEDone(true);
- } catch(e) {
- console.error("open wait AE failed:", e);
- }
- cameraTakingPhoto = true;
- updateCameraButtons();
- ["cvar1", "cvar2", "cvar3", "cvar4", "cvar5", "cvar6"]
- .forEach(id => setText(id, null, "page5"));
- setText("cvar1", "拍照中, 请稍后...", "page5");
- const filename = cameraPhotoFiles[cameraPhotoIndex];
- cameraPhotoIndex = cameraPhotoIndex ? 0 : 1;
- try {
- const data = await cameraTakePhoto(filename);
- if (!data.ok) throw new Error("take photo failed");
- cameraCurrentFile = filename;
- setImageSrc("camera-image", "/api/camera/getImage?file=" + encodeURIComponent(filename) + "&t=" + Date.now());
- 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");
- } catch(e) {
- console.error("takeOnePhoto failed:", e);
- setText("cvar1", "拍照失败", "page5");
- } finally {
- cameraTakingPhoto = false;
- updateCameraButtons();
- }
- }
- async function setCameraWaitAEDone(waitAE) {
- const r = await fetch("/api/camera/setWaitAEDoneForTakePhoto", {
- method:"POST",
- headers:{
- "Content-Type":"application/json"
- },
- body:JSON.stringify({
- waitAE: waitAE ? "1" : "0"
- })
- });
- if (!r.ok) {
- throw new Error(await r.text());
- }
- }
- async function startCameraPreview() {
- if (cameraPreviewRunning || cameraTakingPhoto) {
- return;
- }
- try {
- await setCameraWaitAEDone(false);
- } catch(e) {
- console.error("close wait AE failed:", e);
- }
- cameraPreviewRunning = true;
- updateCameraButtons();
- cameraPreviewFrames = 0;
- ["cvar1", "cvar2", "cvar3", "cvar4", "cvar5", "cvar6"]
- .forEach(id => setText(id, null, "page5"));
- cameraPreviewLoop();
- }
- async function cameraPreviewLoop() {
- if (!cameraPreviewRunning) {
- return;
- }
- cameraTakingPhoto = true;
- updateCameraButtons();
- setText("cvar1", "拍照中, 请稍后...", "page5");
- const filename = cameraPhotoFiles[cameraPhotoIndex];
- cameraPhotoIndex = cameraPhotoIndex ? 0 : 1;
- try {
- const data = await cameraTakePhoto(filename);
- if (!data.ok) throw new Error("take photo failed");
- cameraCurrentFile = filename;
- cameraPreviewFrames++;
- setImageSrc("camera-image", "/api/camera/getImage?file=" + encodeURIComponent(filename) + "&t=" + Date.now());
- setText("cvar1", "拍照完成", "page5");
- 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");
- } catch(e) {
- console.error("cameraPreviewLoop failed:", e);
- stopCameraPreview();
- setText("cvar1", "拍照失败", "page5");
- } finally {
- cameraTakingPhoto = false;
- updateCameraButtons();
- if (cameraPreviewRunning) {
- cameraPreviewTimer = setTimeout(cameraPreviewLoop, 20);
- } else {
- setCameraWaitAEDone(true)
- .catch(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;
- }
- const a = document.createElement("a");
- a.href = "/api/camera/getImage?file=" + encodeURIComponent(cameraCurrentFile) + "&download=1";
- a.download = "camera.jpg";
- document.body.appendChild(a);
- a.click();
- a.remove();
- }
- function initPage5() {
- getCameraStatus();
- if (cameraCurrentFile) {
- setImageSrc("camera-image", "/api/camera/getImage?file=" + encodeURIComponent(cameraCurrentFile) + "&t=" + Date.now());
- }
- if (cameraTakingPhoto || cameraPreviewRunning) {
- setText("cvar1", "拍照中, 请稍后...", "page5");
- }
- connectLog("yfkj-camera-capture.service", "text1");
- }
- function exitPage5() {
- if (cameraPreviewRunning) {
- stopCameraPreview();
- }
- disconnectLog();
- }
|