camera.js 7.2 KB

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