camera.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. 'use strict';
  2. const path = require('path');
  3. const fs = require('fs');
  4. const { Controller } = require('ee-core');
  5. const { spawn } = require('child_process');
  6. const { liveShow, liveHide, setParams, capture, getParams,CMD,captureLive,closeOtherWindow } = require('../api/camera');
  7. const { dialog } = require('electron'); // 引入 electron 的 dialog 模块
  8. const { windowManager } = require('node-window-manager');
  9. const CoreWindow = require("ee-core/electron/window");
  10. async function checkCameraControlCmdExists(digiCamControlPath) {
  11. try {
  12. // 拼接 CameraControlCmd.exe 的完整路径
  13. const exePath = path.join(digiCamControlPath, 'CameraControl.exe');
  14. // 检查文件是否存在
  15. const exists = await fs.promises.access(exePath, fs.constants.F_OK)
  16. .then(() => true)
  17. .catch(() => false);
  18. if (!exists) {
  19. // 弹出文件夹选择对话框
  20. const { canceled, filePaths } = await dialog.showOpenDialog({
  21. title: '选择 digiCamControl 文件夹',
  22. properties: ['openDirectory']
  23. });
  24. if (!canceled && filePaths.length > 0) {
  25. const selectedPath = filePaths[0];
  26. // 更新 app.config.json 中的 digiCamControl 值
  27. // config.digiCamControl = selectedPath;
  28. // fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
  29. digiCamControlPath = selectedPath
  30. const win = CoreWindow.getMainWindow()
  31. win.webContents.send('controller.camera.digiCamControlPath', {
  32. code:0,
  33. data:selectedPath,
  34. });
  35. // return true; // 重新检查文件是否存在
  36. } else {
  37. console.error('用户未选择文件夹');
  38. return {
  39. status:-1,
  40. msg:"无法找到或运行 CameraControlCmd.exe",
  41. }
  42. }
  43. }
  44. const res = await openCameraControlCmd(digiCamControlPath);
  45. return res;
  46. } catch (error) {
  47. console.error('检查 CameraControlCmd.exe 是否存在时出错:', error);
  48. throw error;
  49. }
  50. }
  51. async function openCameraControlCmd(digiCamControlPath) {
  52. return new Promise(async (resolve, reject) => {
  53. try {
  54. // 获取 digiCamControl 文件夹路径
  55. // 拼接 CameraControlCmd.exe 的完整路径
  56. const exePath = path.join(digiCamControlPath, 'CameraControl.exe');
  57. // 检查文件是否存在
  58. await fs.promises.access(exePath, fs.constants.F_OK);
  59. try {
  60. const child = spawn(exePath);
  61. child.stdout.on('data', (data) => {
  62. resolve(true)
  63. });
  64. child.on('close', (code) => {
  65. if (code === 0) {
  66. reject(false)
  67. }
  68. });
  69. } catch (error) {
  70. console.error('error CameraControlCmd.exe:', error);
  71. throw error;
  72. }
  73. console.log('CameraControlCmd.exe start');
  74. } catch (error) {
  75. console.error('无法找到或运行 CameraControlCmd.exe:', error);
  76. throw error;
  77. }
  78. })
  79. }
  80. async function closeCameraControlTips() {
  81. try {
  82. await closeOtherWindow()
  83. /* const windows = windowManager.getWindows();
  84. for (const window of windows) {
  85. const title = window.getTitle();
  86. if (title.indexOf('digiCamControl')>=0) {
  87. console.log(title);
  88. console.log(window);
  89. window.minimize(); // 关闭窗口
  90. // window.hide()
  91. // break;
  92. }
  93. }*/
  94. }catch (e) {
  95. console.log(e)
  96. }
  97. }
  98. let isOPen = true
  99. class CameraController extends Controller {
  100. constructor(ctx) {
  101. super(ctx);
  102. }
  103. async connect(digiCamControlPath) {
  104. try {
  105. await getParams('iso').catch(e=>{
  106. isOPen = false;
  107. })
  108. if(!isOPen){
  109. await checkCameraControlCmdExists(digiCamControlPath)
  110. await CMD('All_Minimize')
  111. await closeCameraControlTips()
  112. isOPen = true
  113. }
  114. const res = await getParams('iso')
  115. if(res === '未将对象引用设置到对象的实例。'){
  116. return {
  117. status:-1,
  118. msg:"相机未连接,请链接相机。",
  119. }
  120. }
  121. return {
  122. status:2,
  123. msg:res,
  124. }
  125. return true;
  126. } catch (error) {
  127. return {
  128. status:-1,
  129. msg:"请安装digiCamControl软件,并打开digiCamControl软件的web服务,端口为5513",
  130. }
  131. }
  132. }
  133. /**
  134. * 启动预览
  135. */
  136. async liveShow() {
  137. try {
  138. await liveShow();
  139. await CMD('All_Minimize')
  140. return true;
  141. } catch (error) {
  142. console.error('eeee启动直播失败:', error);
  143. throw error;
  144. }
  145. }
  146. /**
  147. * 结束预览
  148. */
  149. async liveHide() {
  150. try {
  151. await liveHide();
  152. return true;
  153. } catch (error) {
  154. throw error;
  155. }
  156. }
  157. /**
  158. * 设置参数
  159. */
  160. async setParams(params) {
  161. try {
  162. console.log(params);
  163. await setParams(params);
  164. return true;
  165. } catch (error) {
  166. throw error;
  167. }
  168. }
  169. async takePictures(isLive=true) {
  170. try {
  171. if(isLive){
  172. await captureLive();
  173. }else{
  174. await capture();
  175. }
  176. return true;
  177. } catch (error) {
  178. throw error;
  179. }
  180. }
  181. // 示例:使用 fetchData 函数进行 HTTP 请求
  182. async fetchExampleData() {
  183. const options = {
  184. hostname: 'example.com',
  185. port: 443,
  186. path: '/api/data',
  187. method: 'GET'
  188. };
  189. try {
  190. const data = await fetchData(options);
  191. console.log('Fetched data:', data);
  192. return data;
  193. } catch (error) {
  194. console.error('Fetch data failed:', error);
  195. throw error;
  196. }
  197. }
  198. }
  199. CameraController.toString = () => '[class CameraController]';
  200. module.exports = CameraController;