page5.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. var cameraLogLevel = "";
  2. function setCameraLogLevel() {
  3. var level = logLevel.value;
  4. fetch("/api/camera/loglevel", {
  5. method: "POST",
  6. headers: { "Content-Type": "application/json" },
  7. body: JSON.stringify({ level: level }),
  8. })
  9. .then(function (r) {
  10. if (!r.ok) {
  11. return r.text().then(function (t) {
  12. throw new Error(t);
  13. });
  14. }
  15. cameraLogLevel = level;
  16. })
  17. .catch(function (e) {
  18. logLevel.value = cameraLogLevel;
  19. });
  20. }
  21. function getCameraLogLevel() {
  22. fetch("/api/camera/loglevel")
  23. .then(function (r) {
  24. if (!r.ok) {
  25. return r.text().then(function (t) {
  26. throw new Error(t);
  27. });
  28. }
  29. return r.json();
  30. })
  31. .then(function (d) {
  32. cameraLogLevel = d.log_level;
  33. logLevel.value = d.log_level;
  34. })
  35. .catch(function (e) {
  36. cameraLogLevel = "";
  37. logLevel.value = "";
  38. });
  39. }
  40. function downloadCameraLogFile(event) {
  41. var btn = event.currentTarget;
  42. btn.disabled = true;
  43. fetch("/api/camera/logfile")
  44. .then(function (r) {
  45. if (!r.ok) {
  46. throw new Error("HTTP " + r.status);
  47. }
  48. var disposition = r.headers.get("Content-Disposition");
  49. var filename = "camera.log.tar.gz";
  50. if (disposition) {
  51. var match = disposition.match(/filename="?([^";]+)"?/);
  52. if (match) {
  53. filename = match[1];
  54. }
  55. }
  56. return r.blob().then(function (blob) {
  57. return { blob: blob, filename: filename };
  58. });
  59. })
  60. .then(function (res) {
  61. downloadBlobFile(res.blob, res.filename);
  62. alert("下载成功");
  63. })
  64. .catch(function (e) {
  65. console.error("download failed:", e);
  66. alert("下载失败: " + e.message);
  67. })
  68. .finally(function () {
  69. btn.disabled = false;
  70. btn.textContent = "下载";
  71. });
  72. }
  73. function restartCameraService(event) {
  74. if (!confirm("确定重启相机服务吗?")) {
  75. return;
  76. }
  77. if (cameraTakingPhoto || cameraPreviewRunning) {
  78. alert("相机使用中,请稍后再重试!");
  79. return;
  80. }
  81. var btn = event.currentTarget;
  82. btn.disabled = true;
  83. fetch("/api/camera/restart", {
  84. method: "POST",
  85. })
  86. .then(function (r) {
  87. if (!r.ok) {
  88. return r.text().then(function (t) {
  89. throw new Error(t);
  90. });
  91. }
  92. alert("重启成功");
  93. })
  94. .catch(function (e) {
  95. console.error("restart failed:", e);
  96. alert("重启失败: " + e.message);
  97. })
  98. .finally(function () {
  99. btn.disabled = false;
  100. });
  101. }
  102. function getCameraStatus() {
  103. ["btn1", "btn2", "btn3", "btn4"].forEach(function (id) {
  104. return setBtnStatus(id, false, "page5");
  105. });
  106. fetch("/api/camera/status")
  107. .then(function (r) {
  108. if (!r.ok) {
  109. throw new Error("HTTP " + r.status);
  110. }
  111. return r.json();
  112. })
  113. .then(function (data) {
  114. ["avar1", "avar2", "avar3", "avar4", "avar5", "avar6"].forEach(function (id) {
  115. return setText(id, data[id], "page5");
  116. });
  117. })
  118. .catch(function (e) {
  119. console.error("getCameraStatus() failed:", e);
  120. ["avar1", "avar2", "avar3", "avar4", "avar5", "avar6"].forEach(function (id) {
  121. return setText(id, null, "page5");
  122. });
  123. })
  124. .finally(function () {
  125. updateCameraButtons();
  126. });
  127. getCameraLogLevel();
  128. }
  129. function cameraPower(enable) {
  130. fetch("/api/camera/gpio22power", {
  131. method: "POST",
  132. headers: {
  133. "Content-Type": "application/json",
  134. },
  135. body: JSON.stringify({
  136. enable: enable,
  137. }),
  138. })
  139. .then(function (r) {
  140. if (!r.ok) {
  141. return r.text().then(function (t) {
  142. throw new Error(t);
  143. });
  144. }
  145. return r.json();
  146. })
  147. .then(function (data) {
  148. if (data.ok) {
  149. setText("avar5", enable === "true" ? { level: "ok", text: "打开" } : null, "page5");
  150. alert(enable === "true" ? "上电成功" : "断电成功");
  151. } else {
  152. // 目前后端不会这么返回,避免以后修改代码
  153. alert("操作失败");
  154. }
  155. })
  156. .catch(function (e) {
  157. setText("avar5", null, "page5");
  158. alert("操作失败: " + e.message);
  159. });
  160. }
  161. function cameraPing() {
  162. fetch("/api/camera/pingGigeCamera", { method: "POST" })
  163. .then(function (r) {
  164. return r.json();
  165. })
  166. .then(function (data) {
  167. setText("avar6", data.avar6, "page5");
  168. alert(
  169. data.avar6 && data.avar6.level === "ok"
  170. ? "网口相机Ping测试成功"
  171. : "网口相机Ping测试失败"
  172. );
  173. })
  174. .catch(function () {
  175. setText("avar6", null, "page5");
  176. alert("网口相机Ping测试失败");
  177. });
  178. }
  179. var cameraPreviewTimer = null;
  180. var cameraPreviewRunning = false;
  181. var cameraPreviewFrames = 0;
  182. var cameraPhotoIndex = 0;
  183. var cameraCurrentFile = "";
  184. var cameraTakingPhoto = false;
  185. var cameraPhotoFiles = ["/tmp/camera_preview_0.jpg", "/tmp/camera_preview_1.jpg"];
  186. function updateCameraButtons() {
  187. var normalEnable = !cameraPreviewRunning && !cameraTakingPhoto;
  188. ["btn1", "btn2", "btn3"].forEach(function (id) {
  189. return setBtnStatus(id, normalEnable, "page5");
  190. });
  191. setBtnStatus("btn4", cameraPreviewRunning, "page5");
  192. }
  193. function cameraTakePhoto(filename) {
  194. return fetch("/api/camera/takePhoto", {
  195. method: "POST",
  196. headers: {
  197. "Content-Type": "application/json",
  198. },
  199. body: JSON.stringify({
  200. filename: filename,
  201. }),
  202. }).then(function (r) {
  203. if (!r.ok) {
  204. return r.text().then(function (t) {
  205. throw new Error(t);
  206. });
  207. }
  208. return r.json();
  209. });
  210. }
  211. var imageLoadSeq = 0;
  212. function setImageSrc(id, url, showLoadStatus) {
  213. if (showLoadStatus === undefined) {
  214. showLoadStatus = true;
  215. }
  216. var img = document.getElementById(id);
  217. if (!img) return;
  218. var seq = ++imageLoadSeq;
  219. var start = Date.now();
  220. img.onload = function () {
  221. if (seq !== imageLoadSeq || !showLoadStatus) return;
  222. setText("cvar1", "图片加载完成, 耗时:" + (Date.now() - start) + "ms", "page5");
  223. };
  224. img.onerror = function () {
  225. if (seq !== imageLoadSeq || !showLoadStatus) return;
  226. setText("cvar1", "图片加载失败, 耗时:" + (Date.now() - start) + "ms", "page5");
  227. };
  228. var separator = url.includes("?") ? "&" : "?";
  229. img.src = url + separator + "t=" + Date.now();
  230. }
  231. function takeOnePhoto() {
  232. if (cameraPreviewRunning || cameraTakingPhoto) {
  233. return;
  234. }
  235. setCameraWaitAEDone(true)
  236. .catch(function (e) {
  237. console.error("open wait AE failed:", e);
  238. })
  239. .then(function () {
  240. cameraTakingPhoto = true;
  241. updateCameraButtons();
  242. ["cvar1", "cvar2", "cvar3", "cvar4", "cvar5", "cvar6"].forEach(function (id) {
  243. return setText(id, null, "page5");
  244. });
  245. setText("cvar1", "拍照中, 请稍后...", "page5");
  246. var filename = cameraPhotoFiles[cameraPhotoIndex];
  247. cameraPhotoIndex = cameraPhotoIndex ? 0 : 1;
  248. return cameraTakePhoto(filename)
  249. .then(function (data) {
  250. if (!data.ok) throw new Error("take photo failed");
  251. setText("cvar1", "预览中, 请稍后...", "page5");
  252. setText("cvar2", "1", "page5");
  253. setText("cvar3", data.var1, "page5");
  254. setText("cvar4", data.var2, "page5");
  255. setText("cvar5", data.var3, "page5");
  256. setText("cvar6", data.var4 + "x" + data.var5, "page5");
  257. cameraCurrentFile = filename;
  258. setImageSrc(
  259. "camera-image",
  260. "/api/camera/getImage?file=" + encodeURIComponent(cameraCurrentFile),
  261. true
  262. );
  263. })
  264. .catch(function (e) {
  265. console.error("takeOnePhoto failed:", e);
  266. setText("cvar1", "拍照失败", "page5");
  267. })
  268. .finally(function () {
  269. cameraTakingPhoto = false;
  270. updateCameraButtons();
  271. });
  272. });
  273. }
  274. function setCameraWaitAEDone(waitAE) {
  275. return fetch("/api/camera/setWaitAEDoneForTakePhoto", {
  276. method: "POST",
  277. headers: {
  278. "Content-Type": "application/json",
  279. },
  280. body: JSON.stringify({
  281. waitAE: waitAE ? "1" : "0",
  282. }),
  283. }).then(function (r) {
  284. if (!r.ok) {
  285. return r.text().then(function (t) {
  286. throw new Error(t);
  287. });
  288. }
  289. });
  290. }
  291. function startCameraPreview() {
  292. if (cameraPreviewRunning || cameraTakingPhoto) {
  293. return;
  294. }
  295. setCameraWaitAEDone(false)
  296. .catch(function (e) {
  297. console.error("close wait AE failed:", e);
  298. })
  299. .then(function () {
  300. cameraPreviewRunning = true;
  301. updateCameraButtons();
  302. cameraPreviewFrames = 0;
  303. ["cvar1", "cvar2", "cvar3", "cvar4", "cvar5", "cvar6"].forEach(function (id) {
  304. return setText(id, null, "page5");
  305. });
  306. cameraPreviewLoop();
  307. });
  308. }
  309. function cameraPreviewLoop() {
  310. if (!cameraPreviewRunning) {
  311. return;
  312. }
  313. cameraTakingPhoto = true;
  314. updateCameraButtons();
  315. setText("cvar1", "拍照中, 请稍后...", "page5");
  316. var filename = cameraPhotoFiles[cameraPhotoIndex];
  317. cameraPhotoIndex = cameraPhotoIndex ? 0 : 1;
  318. cameraTakePhoto(filename)
  319. .then(function (data) {
  320. if (!data.ok) throw new Error("take photo failed");
  321. setText("cvar1", "预览中, 请稍后...", "page5");
  322. cameraPreviewFrames++;
  323. setText("cvar2", String(cameraPreviewFrames), "page5");
  324. setText("cvar3", data.var1, "page5");
  325. setText("cvar4", data.var2, "page5");
  326. setText("cvar5", data.var3, "page5");
  327. setText("cvar6", data.var4 + "x" + data.var5, "page5");
  328. cameraCurrentFile = filename;
  329. setImageSrc(
  330. "camera-image",
  331. "/api/camera/getImage?file=" + encodeURIComponent(cameraCurrentFile),
  332. false
  333. );
  334. })
  335. .catch(function (e) {
  336. console.error("cameraPreviewLoop failed:", e);
  337. stopCameraPreview();
  338. setText("cvar1", "拍照失败", "page5");
  339. })
  340. .finally(function () {
  341. cameraTakingPhoto = false;
  342. updateCameraButtons();
  343. if (cameraPreviewRunning) {
  344. cameraPreviewTimer = setTimeout(cameraPreviewLoop, 20);
  345. } else {
  346. setText("cvar1", "连拍已停止", "page5");
  347. setCameraWaitAEDone(true).catch(function (e) {
  348. console.error("restore wait AE failed:", e);
  349. });
  350. }
  351. });
  352. }
  353. function stopCameraPreview() {
  354. if (!cameraPreviewRunning) {
  355. return;
  356. }
  357. cameraPreviewRunning = false;
  358. updateCameraButtons();
  359. if (cameraPreviewTimer) {
  360. clearTimeout(cameraPreviewTimer);
  361. cameraPreviewTimer = null;
  362. }
  363. setText("cvar1", "停止连怕中, 请稍后...", "page5");
  364. }
  365. function downloadCameraImage() {
  366. if (!cameraCurrentFile) {
  367. alert("暂无图片");
  368. return;
  369. }
  370. var url = "/api/camera/getImage?file=" + encodeURIComponent(cameraCurrentFile) + "&download=1";
  371. fetch(url)
  372. .then(function (r) {
  373. return r.blob();
  374. })
  375. .then(function (blob) {
  376. downloadBlobFile(blob, "camera.jpg");
  377. })
  378. .catch(function () {
  379. alert("下载失败");
  380. });
  381. }
  382. function initPage5() {
  383. getCameraStatus();
  384. if (cameraTakingPhoto || cameraPreviewRunning) {
  385. setText("cvar1", "拍照中, 请稍后...", "page5");
  386. } else if (cameraCurrentFile) {
  387. setText("cvar1", "加载最后拍摄的图片...", "page5");
  388. setImageSrc(
  389. "camera-image",
  390. "/api/camera/getImage?file=" + encodeURIComponent(cameraCurrentFile),
  391. true
  392. );
  393. }
  394. connectLog("yfkj-camera-capture.service", "text1");
  395. }
  396. function exitPage5() {
  397. if (cameraPreviewRunning) {
  398. stopCameraPreview();
  399. }
  400. disconnectLog();
  401. }