camera.js 5.3 KB

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