camera.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. 'use strict';
  2. const { Controller } = require('ee-core');
  3. const Log = require('ee-core/log');
  4. const { checkCameraControlCmdExists, closeCameraControlTips, isProcessRunning, onProcessClosed, removeProcessClosedListener } = require('../utils/camera');
  5. const {
  6. checkCamera,
  7. liveShow, liveHide, setParams, capture, getParams,CMD,captureLive,closeOtherWindow } = require('../api/camera');
  8. const { readConfigFile } = require('../utils/config');
  9. let isOPen = true
  10. let isSoftwareStarted = false; // 标记相机控制软件是否已经启动
  11. // 注册进程关闭事件监听器,当软件被关闭时重置标志
  12. onProcessClosed(() => {
  13. Log.info('相机控制软件已关闭,重置 isSoftwareStarted 标志');
  14. isSoftwareStarted = false;
  15. });
  16. class CameraController extends Controller {
  17. constructor(ctx) {
  18. super(ctx);
  19. }
  20. async connect() {
  21. try {
  22. console.log('==================');
  23. console.log(readConfigFile());
  24. // 主动检测:即使 isSoftwareStarted 为 true,也要检查进程是否还在运行(兜底机制)
  25. if (isSoftwareStarted && !isProcessRunning()) {
  26. Log.info('检测到 isSoftwareStarted 为 true 但进程已关闭,重置标志');
  27. isSoftwareStarted = false;
  28. }
  29. if(readConfigFile().controlType === 'digiCamControl'){
  30. console.log('========1==========');
  31. // 主动检测:如果软件未启动或进程已关闭,先启动软件
  32. if (!isSoftwareStarted || !isProcessRunning()) {
  33. console.log('启动 digiCamControl 软件...');
  34. await checkCameraControlCmdExists();
  35. await CMD('All_Minimize');
  36. await closeCameraControlTips();
  37. isSoftwareStarted = true;
  38. console.log('digiCamControl 软件启动完成,等待初始化...');
  39. await new Promise(resolve => setTimeout(resolve, 5000)); // 等待软件初始化
  40. }
  41. // 获取相机参数
  42. let res = await getParams('iso').catch(e=>{
  43. console.log('getParams failed:', e);
  44. isOPen = false;
  45. return null;
  46. });
  47. if(res === '未将对象引用设置到对象的实例。' || !res){
  48. return {
  49. status:-1,
  50. msg: "相机硬件未连接,请检查相机连接。",
  51. }
  52. }
  53. return {
  54. status:2,
  55. msg:res,
  56. }
  57. }else{
  58. // SmartShooter 逻辑
  59. // 主动检测:如果软件未启动或进程已关闭,先启动软件
  60. if (!isSoftwareStarted || !isProcessRunning()) {
  61. Log.info('启动 SmartShooter 软件...');
  62. await checkCameraControlCmdExists();
  63. isSoftwareStarted = true;
  64. Log.info('SmartShooter 软件启动完成,等待初始化...');
  65. await new Promise(resolve => setTimeout(resolve, 10000)); // 等待软件初始化
  66. }
  67. // 检查相机状态
  68. let res = await checkCamera().catch(e=>{
  69. Log.info('checkCamera:'+e);
  70. isOPen = false;
  71. return { device_status: -1 }; // 返回错误状态,让后续逻辑处理
  72. })
  73. // 如果相机未连接
  74. if (res?.device_status === -1) {
  75. return {
  76. status: -1,
  77. msg: "相机硬件未连接,请检查相机连接。",
  78. };
  79. }
  80. if(res?.device_status === 2){
  81. isOPen = true;
  82. return {
  83. ...res,
  84. status:2
  85. };
  86. }
  87. return {
  88. status:-1,
  89. msg:"相机未连接,请链接相机。",
  90. }
  91. }
  92. } catch (error) {
  93. let msg = '请安装SmartShooter5软件'
  94. if(readConfigFile().controlType === 'digiCamControl') msg = '请安装digiCamControl软件,并打开digiCamControl软件的web服务,端口为5513'
  95. return {
  96. status:-1,
  97. msg,
  98. }
  99. }
  100. }
  101. /**
  102. * 启动预览
  103. */
  104. async liveShow() {
  105. try {
  106. await liveShow();
  107. if(readConfigFile().controlType === 'digiCamControl'){
  108. await CMD('All_Minimize')
  109. }
  110. return true;
  111. } catch (error) {
  112. console.error('eeee启动直播失败:', error);
  113. throw error;
  114. }
  115. }
  116. /**
  117. * 结束预览
  118. */
  119. async liveHide() {
  120. try {
  121. await liveHide();
  122. return true;
  123. } catch (error) {
  124. throw error;
  125. }
  126. }
  127. /**
  128. * 设置参数
  129. */
  130. async setParams(params) {
  131. try {
  132. console.log(params);
  133. await setParams(params);
  134. return true;
  135. } catch (error) {
  136. throw error;
  137. }
  138. }
  139. async takePictures(isLive=true) {
  140. try {
  141. if(isLive){
  142. await captureLive();
  143. }else{
  144. await capture();
  145. }
  146. return true;
  147. } catch (error) {
  148. throw error;
  149. }
  150. }
  151. // 示例:使用 fetchData 函数进行 HTTP 请求
  152. async fetchExampleData() {
  153. const options = {
  154. hostname: 'example.com',
  155. port: 443,
  156. path: '/api/data',
  157. method: 'GET'
  158. };
  159. try {
  160. const data = await fetchData(options);
  161. console.log('Fetched data:', data);
  162. return data;
  163. } catch (error) {
  164. console.error('Fetch data failed:', error);
  165. throw error;
  166. }
  167. }
  168. }
  169. CameraController.toString = () => '[class CameraController]';
  170. module.exports = CameraController;