camera.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. // electron/utils/readConfig.js
  2. const path = require('path');
  3. const fs = require('fs');
  4. const Log = require('ee-core/log');
  5. const { spawn } = require('child_process');
  6. const { EventEmitter } = require('events');
  7. const { liveShow, liveHide, setParams, capture, getParams,CMD,captureLive,closeOtherWindow,minimizeSmartShooter } = require('../api/camera');
  8. const { dialog } = require('electron'); // 引入 electron 的 dialog 模块
  9. const CoreWindow = require("ee-core/electron/window");
  10. const { readConfigFile, writeConfigFile } = require('../utils/config');
  11. // 进程状态管理
  12. let cameraProcess = null; // 子进程引用
  13. let isProcessRunning = false; // 进程运行状态
  14. const processEmitter = new EventEmitter(); // 进程事件发射器
  15. const exe = {
  16. "digiCamControl":"CameraControl.exe",
  17. "SmartShooter":"SmartShooter5.exe",
  18. }
  19. function getExePath () {
  20. let exePath = ""
  21. if(readConfigFile().controlType === 'digiCamControl'){
  22. exePath = path.join( readConfigFile().controlPath || readConfigFile().digiCamControlPath, exe["digiCamControl"]);
  23. }else if(readConfigFile().controlType === 'SmartShooter'){
  24. exePath = path.join( readConfigFile().controlPath || readConfigFile().SmartShooterPath, exe["SmartShooter"]);
  25. }
  26. console.log('ex============ePath');
  27. console.log(exePath);
  28. return exePath
  29. }
  30. async function checkCameraControlCmdExists() {
  31. try {
  32. // 拼接 CameraControlCmd.exe 的完整路径
  33. let exePath = getExePath()
  34. // 检查文件是否存在
  35. const exists = await fs.promises.access(exePath, fs.constants.F_OK)
  36. .then(() => true)
  37. .catch(() => false);
  38. if (!exists) {
  39. // 弹出文件夹选择对话框
  40. const { canceled, filePaths } = await dialog.showOpenDialog({
  41. title: '选择 相机控制安装软件 文件夹',
  42. properties: ['openDirectory']
  43. });
  44. if (!canceled && filePaths.length > 0) {
  45. const selectedPath = filePaths[0];
  46. // Check if SmartShooter5.exe exists in the selected directory
  47. const hasExe = path.join(selectedPath, exe["SmartShooter"]);
  48. if (fs.existsSync(hasExe)) {
  49. writeConfigFile("controlType","SmartShooter")
  50. }else{
  51. writeConfigFile("controlType","digiCamControl")
  52. }
  53. writeConfigFile("controlPath",selectedPath)
  54. } else {
  55. console.error('用户未选择文件夹');
  56. return {
  57. status:-1,
  58. msg:"无法找到 CameraControlCmd.exe 或者 SmartShooter5.exe",
  59. }
  60. }
  61. }
  62. const res = await openCameraControlCmd();
  63. // 如果是SmartShooter,启动后最小化窗口
  64. if(readConfigFile().controlType === 'SmartShooter'){
  65. // 等待软件启动完成
  66. setTimeout(async () => {
  67. try {
  68. await minimizeSmartShooter();
  69. } catch (error) {
  70. console.log('最小化SmartShooter失败:', error);
  71. }
  72. }, 3000); // 等待3秒让软件完全启动
  73. }
  74. return res;
  75. } catch (error) {
  76. Log.error('检查 第三方相机控制器 是否存在时出错:', error);
  77. throw error;
  78. }
  79. }
  80. async function openCameraControlCmd(digiCamControlPath) {
  81. return new Promise(async (resolve, reject) => {
  82. try {
  83. // 获取 digiCamControl 文件夹路径
  84. // 拼接 CameraControlCmd.exe 的完整路径
  85. let exePath = getExePath()
  86. // 检查文件是否存在
  87. await fs.promises.access(exePath, fs.constants.F_OK);
  88. try {
  89. // 保存进程引用并标记为运行中
  90. cameraProcess = spawn(exePath);
  91. isProcessRunning = true;
  92. cameraProcess.stdout.on('data', (data) => {
  93. resolve(true)
  94. });
  95. // 监听进程关闭事件
  96. cameraProcess.on('close', (code) => {
  97. isProcessRunning = false;
  98. cameraProcess = null;
  99. Log.info(`相机控制软件已关闭,退出码: ${code}`);
  100. processEmitter.emit('camera-process-closed');
  101. });
  102. cameraProcess.on('error', (err) => {
  103. isProcessRunning = false;
  104. cameraProcess = null;
  105. Log.error('相机控制软件进程错误:', err);
  106. });
  107. } catch (error) {
  108. Log.error('error 第三方相机控制器:', error);
  109. throw error;
  110. }
  111. } catch (error) {
  112. Log.error('无法找到或运行 第三方相机控制器:', error);
  113. throw error;
  114. }
  115. })
  116. }
  117. async function closeCameraControlTips() {
  118. try {
  119. await closeOtherWindow()
  120. }catch (e) {
  121. console.log(e)
  122. }
  123. }
  124. module.exports = {
  125. checkCameraControlCmdExists,
  126. closeCameraControlTips,
  127. minimizeSmartShooter,
  128. // 进程状态管理
  129. isProcessRunning: () => isProcessRunning,
  130. onProcessClosed: (callback) => processEmitter.on('camera-process-closed', callback),
  131. removeProcessClosedListener: (callback) => processEmitter.removeListener('camera-process-closed', callback),
  132. };