page5.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. let cameraLogLevel = "";
  2. function setCameraLogLevel() {
  3. const level = logLevel.value;
  4. fetch("/api/camera/loglevel", {
  5. method: "POST",
  6. headers: {"Content-Type": "application/json"},
  7. body: JSON.stringify({level})
  8. })
  9. .then(async r => {
  10. if (!r.ok) throw new Error(await r.text());
  11. cameraLogLevel = level;
  12. })
  13. .catch(e => {
  14. logLevel.value = cameraLogLevel;
  15. });
  16. }
  17. function getCameraLogLevel() {
  18. fetch("/api/camera/loglevel")
  19. .then(async r => {
  20. if (!r.ok) throw new Error(await r.text());
  21. return r.json();
  22. })
  23. .then(d => {
  24. cameraLogLevel = d.log_level;
  25. logLevel.value = d.log_level;
  26. })
  27. .catch(e => {
  28. cameraLogLevel = "";
  29. logLevel.value = "";
  30. });
  31. }
  32. function downloadCameraLogFile() {
  33. const btn = event.currentTarget;
  34. btn.disabled = true;
  35. fetch("/api/camera/logfile")
  36. .then(async r => {
  37. if (!r.ok) {
  38. throw new Error("HTTP " + r.status);
  39. }
  40. const disposition = r.headers.get("Content-Disposition");
  41. let filename = "camera.log.tar.gz";
  42. if (disposition) {
  43. const match = disposition.match(/filename="?([^";]+)"?/);
  44. if (match) {
  45. filename = match[1];
  46. }
  47. }
  48. return {
  49. blob: await r.blob(),
  50. filename
  51. };
  52. })
  53. .then(({ blob, filename }) => {
  54. const url = URL.createObjectURL(blob);
  55. const a = document.createElement("a");
  56. a.href = url;
  57. a.download = filename;
  58. document.body.appendChild(a);
  59. a.click();
  60. a.remove();
  61. setTimeout(() => {
  62. URL.revokeObjectURL(url);
  63. }, 1000);
  64. alert("下载成功");
  65. })
  66. .catch(e => {
  67. console.error("download failed:", e);
  68. alert("下载失败: " + e.message);
  69. })
  70. .finally(() => {
  71. btn.disabled = false;
  72. btn.textContent = "下载";
  73. });
  74. }
  75. function restartCameraService() {
  76. if (!confirm("确定重启相机服务吗?")) {
  77. return;
  78. }
  79. const btn = event.currentTarget;
  80. btn.disabled = true;
  81. fetch("/api/camera/restart", {
  82. method: "POST"
  83. })
  84. .then(async r => {
  85. if (!r.ok) {
  86. throw new Error(await r.text());
  87. }
  88. logLevel.value = "info";
  89. cameraLogLevel = logLevel.value;
  90. disconnectLog();
  91. connectLog("yfkj-camera-capture.service", "text1");
  92. alert("重启成功");
  93. })
  94. .catch(e => {
  95. console.error("restart failed:", e);
  96. alert("重启失败: " + e.message);
  97. })
  98. .finally(() => {
  99. btn.disabled = false;
  100. });
  101. }
  102. function getCameraStatus() {
  103. ["btn1", "btn2", "btn3", "btn4"]
  104. .forEach(id => setBtnStatus(id, false, "page5"));
  105. fetch("/api/camera/status")
  106. .then(async r => {
  107. if (!r.ok) {
  108. throw new Error("HTTP " + r.status);
  109. }
  110. return r.json();
  111. })
  112. .then(data => {
  113. ["avar1","avar2","avar3","avar4","avar5", "avar6"]
  114. .forEach(id => setText(id, data[id], "page5"));
  115. })
  116. .catch(e => {
  117. console.error("getCameraStatus() failed:", e);
  118. ["avar1","avar2","avar3","avar4","avar5", "avar6"]
  119. .forEach(id => setText(id, null, "page5"));
  120. })
  121. .finally(() => {
  122. ["btn1", "btn2", "btn3", "btn4"]
  123. .forEach(id => setBtnStatus(id, true, "page5"));
  124. });
  125. getCameraLogLevel();
  126. }
  127. function cameraPower(enable) {
  128. fetch("/api/camera/gpio22power", {
  129. method: "POST",
  130. headers: {
  131. "Content-Type": "application/json"
  132. },
  133. body: JSON.stringify({
  134. enable: enable
  135. })
  136. })
  137. .then(async r => {
  138. if (!r.ok) {
  139. throw new Error(await r.text());
  140. }
  141. return r.json();
  142. })
  143. .then(data => {
  144. if (data.ok) {
  145. setText("avar5", enable === "true" ? "🟢打开" : null, "page5");
  146. alert(enable === "true" ? "上电成功" : "断电成功");
  147. } else { // 目前后端不会这么返回,避免以后修改代码
  148. alert("操作失败");
  149. }
  150. })
  151. .catch(e => {
  152. setText("avar5", null, "page5");
  153. alert("操作失败: " + e.message);
  154. });
  155. }
  156. function cameraPing() {
  157. fetch("/api/camera/pingGigeCamera", {method:"POST"})
  158. .then(r => r.json())
  159. .then(data => {
  160. setText("avar6", data.avar6, "page5");
  161. alert(data.avar6 === "🟢正常" ? "网口相机Ping测试成功" : "网口相机Ping测试失败");
  162. })
  163. .catch(() => {
  164. setText("avar6", null, "page5");
  165. alert("网口相机Ping测试失败");
  166. });
  167. }
  168. let cameraPreviewTimer = null;
  169. let cameraPreviewRunning = false;
  170. let cameraPhotoIndex = 0;
  171. let cameraCurrentFile = "";
  172. let cameraTakingPhoto = false;
  173. const cameraPhotoFiles = [
  174. "/tmp/camera_preview_0.jpg",
  175. "/tmp/camera_preview_1.jpg"
  176. ];
  177. async function cameraTakePhoto(filename) {
  178. const r = await fetch("/api/camera/takePhoto", {
  179. method: "POST",
  180. headers: {
  181. "Content-Type": "application/json"
  182. },
  183. body: JSON.stringify({
  184. filename: filename
  185. })
  186. });
  187. if (!r.ok) {
  188. throw new Error(await r.text());
  189. }
  190. return await r.json();
  191. }
  192. function setImageSrc(id, url)
  193. {
  194. const img = document.getElementById(id);
  195. if (img) img.src = url;
  196. }
  197. async function takeOnePhoto() {
  198. if (cameraTakingPhoto) {
  199. return;
  200. }
  201. cameraTakingPhoto = true;
  202. ["btn1", "btn2", "btn3", "btn4"]
  203. .forEach(id => setBtnStatus(id, false, "page5"));
  204. ["cvar1", "cvar2", "cvar3", "cvar4", "cvar5", "cvar6"]
  205. .forEach(id => setText(id, null, "page5"));
  206. setText("cvar1", "拍照中, 请稍后...", "page5");
  207. const filename = cameraPhotoFiles[cameraPhotoIndex];
  208. cameraPhotoIndex = cameraPhotoIndex ? 0 : 1;
  209. try {
  210. const data = await cameraTakePhoto(filename);
  211. if (!data.ok) throw new Error("take photo failed");
  212. cameraCurrentFile = filename;
  213. setImageSrc("camera-image", "/api/camera/getImage?file=" + encodeURIComponent(filename) + "&t=" + Date.now());
  214. setText("cvar1", "拍照完成", "page5");
  215. setText("cvar2", "1", "page5");
  216. setText("cvar3", data.var1, "page5");
  217. setText("cvar4", data.var2, "page5");
  218. setText("cvar5", data.var3, "page5");
  219. setText("cvar6", data.var4 + "x" + data.var5, "page5");
  220. } catch(e) {
  221. console.error("takeOnePhoto failed:", e);
  222. setText("cvar1", "拍照失败", "page5");
  223. } finally {
  224. cameraTakingPhoto = false;
  225. ["btn1", "btn2", "btn3", "btn4"]
  226. .forEach(id => setBtnStatus(id, true, "page5"));
  227. }
  228. }
  229. function initPage5() {
  230. getCameraStatus();
  231. if (cameraTakingPhoto) {
  232. setText("cvar1", "拍照中, 请稍后...", "page5");
  233. }
  234. connectLog("yfkj-camera-capture.service", "text1");
  235. }
  236. function exitPage5() {
  237. disconnectLog();
  238. }