革博士V2程序
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

195 строки
7.9 KiB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Runtime.InteropServices;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using System.Timers;
  8. namespace LeatherApp.Device
  9. {
  10. public class LightDev : IDisposable
  11. {
  12. #region 第二款光源(Rsee) X86DLL 64位可用吗?
  13. //comHandle = RseeController_OpenCom(PortName, 19200, true); //Com_Handle!=0成功
  14. [DllImport(@"RseeController.dll", EntryPoint = "RseeController_OpenCom", CallingConvention = CallingConvention.Cdecl)]
  15. private extern static IntPtr RseeController_OpenCom(string szPort, int Baud_rate, bool overlapped);
  16. //关闭传上面打开返回的comHandle
  17. [DllImport(@"RseeController.dll", EntryPoint = "RseeController_CloseCom", CallingConvention = CallingConvention.Cdecl)]
  18. private extern static bool RseeController_CloseCom(string szPort, IntPtr comHandle);
  19. //设置新值 channel通道号:1-4
  20. //[DllImport(@"RseeController.dll", EntryPoint = "RseeController_PM_D_BRTSetChannel", CallingConvention = CallingConvention.Cdecl)]
  21. //private extern static int RseeController_PM_D_BRTSetChannel(int comHandle, int channel, int range);
  22. ////读取当前值
  23. //[DllImport(@"RseeController.dll", EntryPoint = "RseeController_PM_D_BRTReadChannel", CallingConvention = CallingConvention.Cdecl)]
  24. //private static extern unsafe int RseeController_PM_D_BRTReadChannel(int comHandle, int channel, int* range);
  25. //AHC系列
  26. /// <summary>
  27. /// 设置通道亮度等级
  28. /// </summary>
  29. /// <param name="comHandle"></param>
  30. /// <param name="channel">通道序号,范围:1-2</param>
  31. /// <param name="range">亮度等级,范围:0-255</param>
  32. /// <returns>0 - 设置发送成功; -1 - 串口未初始化; -2 - 输入参数范围有误</returns>
  33. [DllImport(@"RseeController.dll", EntryPoint = "RseeController_AHC_SetChannel", CallingConvention = CallingConvention.Cdecl)]
  34. private extern static int RseeController_AHC_SetChannel(IntPtr comHandle, int channel, int range);
  35. /// <summary>
  36. /// 读取通道亮度等级
  37. /// </summary>
  38. /// <param name="comHandle"></param>
  39. /// <param name="channel">通道序号,范围:1-2</param>
  40. /// <returns>大于等于0 - 通道亮度等级; -1 – 串口/网口未初始化; -2 - 输入参数范围有误; -3 - 读取返回出错</returns>
  41. [DllImport(@"RseeController.dll", EntryPoint = "RseeController_AHC_ReadChannel", CallingConvention = CallingConvention.Cdecl)]
  42. private extern static int RseeController_AHC_ReadChannel(IntPtr comHandle, int channel);
  43. /// <summary>
  44. /// 设置一个通道常亮/常灭
  45. /// </summary>
  46. /// <param name="comHandle"></param>
  47. /// <param name="mode">state - 0:常灭,1:常亮</param>
  48. /// <returns></returns>
  49. [DllImport(@"RseeController.dll", EntryPoint = "RseeController_AHC_SetOnoff", CallingConvention = CallingConvention.Cdecl)]
  50. private extern static int RseeController_AHC_SetOnoff(IntPtr comHandle, bool state);
  51. #endregion
  52. private IntPtr Com_Handle;
  53. private LightDevNameEnum devName;
  54. private long portHandle;
  55. private string comName;
  56. /// <summary>
  57. /// 光源亮度值
  58. /// </summary>
  59. public int DigitalValue { get; private set; }
  60. public Action<DateTime,WarningEnum, string> WarningEvent;
  61. /// <summary>
  62. /// 光源亮度值<通道号,亮度值0-255>
  63. /// </summary>
  64. public Action<int, int> DigitalEvent;
  65. /// <summary>
  66. /// 是否打开设备成功
  67. /// </summary>
  68. public bool IsInit { get; private set; } = false;
  69. //private System.Timers.Timer timer = new System.Timers.Timer();
  70. public LightDev(LightDevNameEnum _devName)
  71. {
  72. devName = _devName;
  73. }
  74. public bool start(int comNum)
  75. {
  76. try
  77. {
  78. if (devName == LightDevNameEnum.海康)
  79. {
  80. //int result = CreateSerialPort(comNum, ref portHandle); //创建串口
  81. //if (result != SUCCESS)
  82. // throw new Exception($"打开光源设备(COM{comNum})失败: {result}");
  83. }
  84. else if (devName == LightDevNameEnum.锐视)
  85. {
  86. Com_Handle = RseeController_OpenCom("COM" + comNum, 19200, true);
  87. if (Com_Handle == IntPtr.Zero)
  88. throw new Exception($"打开光源设备(COM{comNum})失败;");
  89. comName = "COM" + comNum;
  90. //常亮
  91. var res=RseeController_AHC_SetOnoff(Com_Handle,true);
  92. WarningEvent?.Invoke(DateTime.Now, WarningEnum.Normal, "常亮res:" + res);
  93. }
  94. else
  95. throw new Exception($"打开光源设备失败,未知设备型号!");
  96. IsInit = true;
  97. //timer.Elapsed += Timer_Elapsed;
  98. //timer.Interval = 100;
  99. //timer.Enabled = true;
  100. return true;
  101. }
  102. catch (Exception ex)
  103. {
  104. WarningEvent?.Invoke(DateTime.Now,WarningEnum.High, ex.Message);
  105. return false;
  106. }
  107. }
  108. public void stop()
  109. {
  110. if (!IsInit) return;
  111. try
  112. {
  113. IsInit = false;
  114. //timer.Elapsed -= Timer_Elapsed;
  115. //timer.Stop();
  116. if (devName == LightDevNameEnum.海康)
  117. ;
  118. //ReleaseSerialPort(portHandle); //断开串口
  119. else if (devName == LightDevNameEnum.锐视)
  120. RseeController_CloseCom(comName, Com_Handle);
  121. }
  122. catch { }
  123. }
  124. public unsafe int getDigitalValue(int channelIndex)
  125. {
  126. if (!IsInit) return -1;
  127. int value = 0;
  128. if (devName == LightDevNameEnum.海康)
  129. {
  130. //if (GetDigitalValue(ref value, channelIndex, portHandle) != SUCCESS)
  131. return -1;
  132. }
  133. else if (devName == LightDevNameEnum.锐视)
  134. {
  135. value = RseeController_AHC_ReadChannel(Com_Handle, channelIndex);
  136. if (value<0)
  137. return -1;
  138. }
  139. else
  140. return -1;
  141. DigitalEvent?.Invoke(channelIndex, value);
  142. return value;
  143. }
  144. /// <summary>
  145. /// 设置亮度值
  146. /// </summary>
  147. /// <param name="channelIndex">通道</param>
  148. /// <param name="value">0-255</param>
  149. /// <returns></returns>
  150. public bool setDigitalValue(int channelIndex, int value)
  151. {
  152. if (!IsInit) return false;
  153. //Task.Factory.StartNew(() => {
  154. if (devName == LightDevNameEnum.海康)
  155. {
  156. //if (SetDigitalValue(channelIndex, value, portHandle) != SUCCESS)
  157. return false;
  158. }
  159. else if (devName == LightDevNameEnum.锐视)
  160. {
  161. var res = RseeController_AHC_SetChannel(Com_Handle, channelIndex, value);
  162. WarningEvent?.BeginInvoke(DateTime.Now,WarningEnum.Normal, res.ToString(),null,null);
  163. if (res != 0)
  164. return false;
  165. }
  166. //});
  167. return true;
  168. }
  169. private void Timer_Elapsed(object sender, ElapsedEventArgs e)
  170. {
  171. if (!IsInit) return;
  172. }
  173. public void Dispose()
  174. {
  175. stop();
  176. }
  177. }
  178. }