camera.js 5.9 KB

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