Browse Source

feat(camera): 支持 SmartShooter5 软件控制相机

- 新增 SmartShooter5 软件支持
- 更新相机控制软件路径配置
-优化相机控制软件检测和启动逻辑
- 添加默认配置文件
panqiuyao 5 months ago
parent
commit
fafa0a9adb
4 changed files with 167 additions and 123 deletions
  1. 8 119
      electron/controller/camera.js
  2. 135 0
      electron/utils/camera.js
  3. 8 0
      electron/utils/config.default.json
  4. 16 4
      electron/utils/config.js

+ 8 - 119
electron/controller/camera.js

@@ -1,137 +1,23 @@
 'use strict';
-
-const path = require('path');
-const fs = require('fs');
 const { Controller } = require('ee-core');
-const { spawn } = require('child_process');
+const { checkCameraControlCmdExists, closeCameraControlTips} = require('../utils/camera');
 const { liveShow, liveHide, setParams, capture, getParams,CMD,captureLive,closeOtherWindow } = require('../api/camera');
 
-const { dialog } = require('electron'); // 引入 electron 的 dialog 模块
-const { windowManager } = require('node-window-manager');
-const CoreWindow = require("ee-core/electron/window");
-
-async function checkCameraControlCmdExists(digiCamControlPath) {
-  try {
-
-    // 拼接 CameraControlCmd.exe 的完整路径
-    const exePath = path.join(digiCamControlPath, 'CameraControl.exe');
-
-    // 检查文件是否存在
-    const exists = await fs.promises.access(exePath, fs.constants.F_OK)
-      .then(() => true)
-      .catch(() => false);
-
-    if (!exists) {
-      // 弹出文件夹选择对话框
-      const { canceled, filePaths } = await dialog.showOpenDialog({
-        title: '选择 digiCamControl 文件夹',
-        properties: ['openDirectory']
-      });
-
-      if (!canceled && filePaths.length > 0) {
-        const selectedPath = filePaths[0];
-        // 更新 app.config.json 中的 digiCamControl 值
-       // config.digiCamControl = selectedPath;
-      //  fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
-        digiCamControlPath = selectedPath
-        const win = CoreWindow.getMainWindow()
-        win.webContents.send('controller.camera.digiCamControlPath', {
-          code:0,
-          data:selectedPath,
-        });
-      //  return true; // 重新检查文件是否存在
-      } else {
-        console.error('用户未选择文件夹');
-        return {
-          status:-1,
-          msg:"无法找到或运行 CameraControlCmd.exe",
-        }
-      }
-    }
-    const res = await openCameraControlCmd(digiCamControlPath);
-    return res;
-  } catch (error) {
-    console.error('检查 CameraControlCmd.exe 是否存在时出错:', error);
-    throw error;
-  }
-}
-
-
-async function openCameraControlCmd(digiCamControlPath) {
- return  new Promise(async (resolve, reject) => {
-    try {
-      // 获取 digiCamControl 文件夹路径
-
-      // 拼接 CameraControlCmd.exe 的完整路径
-      const exePath = path.join(digiCamControlPath, 'CameraControl.exe');
-
-      // 检查文件是否存在
-      await fs.promises.access(exePath, fs.constants.F_OK);
-      try {
-
-          const child = spawn(exePath);
-
-          child.stdout.on('data', (data) => {
+const { readConfigFile } = require('../utils/config');
 
-            resolve(true)
-          });
-
-          child.on('close', (code) => {
-            if (code === 0) {
-              reject(false)
-            }
-          });
-
-
-
-      } catch (error) {
-        console.error('error CameraControlCmd.exe:', error);
-        throw error;
-      }
-
-      console.log('CameraControlCmd.exe start');
-    } catch (error) {
-      console.error('无法找到或运行 CameraControlCmd.exe:', error);
-      throw error;
-    }
-  })
-}
-
-async function closeCameraControlTips() {
-  try {
-    await  closeOtherWindow()
-/*    const windows = windowManager.getWindows();
-
-    for (const window of windows) {
-      const title = window.getTitle();
-
-      if (title.indexOf('digiCamControl')>=0) {
-        console.log(title);
-        console.log(window);
-        window.minimize(); // 关闭窗口
-        //   window.hide()
-      //  break;
-      }
-    }*/
-  }catch (e) {
-    console.log(e)
-  }
-
-
-}
 let  isOPen = true
 class CameraController extends Controller {
   constructor(ctx) {
     super(ctx);
   }
 
-  async connect(digiCamControlPath) {
+  async connect() {
     try {
       await getParams('iso').catch(e=>{
         isOPen = false;
       })
       if(!isOPen){
-        await checkCameraControlCmdExists(digiCamControlPath)
+        await checkCameraControlCmdExists()
         await  CMD('All_Minimize')
         await closeCameraControlTips()
         isOPen = true
@@ -150,9 +36,12 @@ class CameraController extends Controller {
       }
       return true;
     } catch (error) {
+
+      let msg = '请安装digiCamControl软件,并打开digiCamControl软件的web服务,端口为5513'
+      if(readConfigFile().controlType === 'SmartShooter') msg = '请安装SmartShooter5软件'
       return {
         status:-1,
-        msg:"请安装digiCamControl软件,并打开digiCamControl软件的web服务,端口为5513",
+        msg,
       }
     }
   }

+ 135 - 0
electron/utils/camera.js

@@ -0,0 +1,135 @@
+// electron/utils/readConfig.js
+
+const path = require('path');
+const fs = require('fs');
+const Log = require('ee-core/log');
+const { spawn } = require('child_process');
+const { liveShow, liveHide, setParams, capture, getParams,CMD,captureLive,closeOtherWindow } = require('../api/camera');
+
+const { dialog } = require('electron'); // 引入 electron 的 dialog 模块
+const { windowManager } = require('node-window-manager');
+const CoreWindow = require("ee-core/electron/window");
+
+
+const { readConfigFile, writeConfigFile } = require('../utils/config');
+
+const exe = {
+  "digiCamControl":"CameraControl.exe",
+  "SmartShooter":"SmartShooter5.exe",
+}
+
+
+function getExePath () {
+  let exePath =  ""
+  if(readConfigFile().controlType === 'digiCamControl'){
+    exePath =  path.join( readConfigFile().digiCamControlPath, exe["digiCamControl"]);
+  }else if(readConfigFile().controlType === 'SmartShooter'){
+    exePath =  path.join( readConfigFile().SmartShooterPath,  exe["SmartShooter"]);
+  }
+  return exePath
+}
+
+
+
+
+async function checkCameraControlCmdExists() {
+  try {
+
+    // 拼接 CameraControlCmd.exe 的完整路径
+
+    let exePath = getExePath()
+    // 检查文件是否存在
+    const exists = await fs.promises.access(exePath, fs.constants.F_OK)
+        .then(() => true)
+        .catch(() => false);
+
+    if (!exists) {
+      // 弹出文件夹选择对话框
+      const { canceled, filePaths } = await dialog.showOpenDialog({
+        title: '选择 相机控制安装软件 文件夹',
+        properties: ['openDirectory']
+      });
+
+      if (!canceled && filePaths.length > 0) {
+        const selectedPath = filePaths[0];
+
+        // Check if SmartShooter5.exe exists in the selected directory
+        const hasExe = path.join(selectedPath, exe["SmartShooter"]);
+
+        if (fs.existsSync(hasExe)) {
+          writeConfigFile("controlType","SmartShooter")
+        }else{
+          writeConfigFile("controlType","digiCamControl")
+        }
+        writeConfigFile("controlPath",selectedPath)
+      } else {
+        console.error('用户未选择文件夹');
+        return {
+          status:-1,
+          msg:"无法找到 CameraControlCmd.exe 或者  SmartShooter5.exe",
+        }
+      }
+    }
+    const res = await openCameraControlCmd();
+    return res;
+  } catch (error) {
+    Log.error('检查 第三方相机控制器 是否存在时出错:', error);
+    throw error;
+  }
+}
+
+
+async function openCameraControlCmd(digiCamControlPath) {
+  return  new Promise(async (resolve, reject) => {
+    try {
+      // 获取 digiCamControl 文件夹路径
+
+      // 拼接 CameraControlCmd.exe 的完整路径
+      let exePath = getExePath()
+
+      // 检查文件是否存在
+      await fs.promises.access(exePath, fs.constants.F_OK);
+      try {
+
+        const child = spawn(exePath);
+
+        child.stdout.on('data', (data) => {
+
+          resolve(true)
+        });
+
+        child.on('close', (code) => {
+          if (code === 0) {
+            reject(false)
+          }
+        });
+
+
+
+      } catch (error) {
+        Log.error('error 第三方相机控制器:', error);
+        throw error;
+      }
+
+    } catch (error) {
+      Log.error('无法找到或运行 第三方相机控制器:', error);
+      throw error;
+    }
+  })
+}
+
+async function closeCameraControlTips() {
+  try {
+    await  closeOtherWindow()
+
+  }catch (e) {
+    console.log(e)
+  }
+
+
+}
+
+module.exports = {
+  checkCameraControlCmdExists,
+  closeCameraControlTips
+};

+ 8 - 0
electron/utils/config.default.json

@@ -0,0 +1,8 @@
+{
+  "openDevTools":false,
+  "remoteUrl": false,
+  "controlType": "SmartShooter",
+  "controlPath": "",
+  "digiCamControlPath":"C:\\Program Files (x86)\\digiCamControl",
+  "SmartShooterPath":"C:\\Program Files\\Smart Shooter 5"
+}

+ 16 - 4
electron/utils/config.js

@@ -3,6 +3,7 @@
 const fs = require('fs');
 const path = require('path');
 const { app } = require('electron');
+const defaultConfig = require('./config.default');
 
 const configPath = path.join(app.getPath("userData"),'config.default.json');
 
@@ -15,12 +16,18 @@ function readConfigFile() {
   try {
     if (fs.existsSync(configPath)) {
       const data = fs.readFileSync(configPath, 'utf8');
-      return JSON.parse(data);
+
+      return {
+        ...defaultConfig,
+        ...JSON.parse(data),
+      };
     } else {
       console.log('配置文件不存在');
       // 创建空白JSON文件
       fs.writeFileSync(configPath, '{}', 'utf8');
-      return {};
+      return {
+        ...defaultConfig,
+      };
     }
   } catch (error) {
     console.error('读取配置文件出错:', error);
@@ -41,12 +48,17 @@ function writeConfigFile(key, value) {
     // 如果配置文件存在,则读取现有内容
     if (fs.existsSync(configPath)) {
       const data = fs.readFileSync(configPath, 'utf8');
-      config = JSON.parse(data);
+      config = {
+        ...defaultConfig,
+        ...JSON.parse(data),
+      };
     }else {
       console.log('配置文件不存在');
       // 创建空白JSON文件
       fs.writeFileSync(configPath, '{}', 'utf8');
-      config = {}
+      config = {
+        ...defaultConfig,
+      }
     }
 
     // 更新配置项