banboshi_V1/halftoneproject-master/Code/Device/LightDev.cs

164 lines
5.8 KiB
C#
Raw Permalink Normal View History

2023-10-31 13:19:29 +08:00
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
using System.Windows.Forms;
using Newtonsoft.Json.Linq;
using static ControllerDllCSharp.ClassLibControllerDll;
namespace ProductionControl.Device
{
public class LightDev : IDisposable
{
#region (Rsee) X86DLL 64
//comHandle = RseeController_OpenCom(PortName, 19200, true); //Com_Handle!=0成功
[DllImport(@"RseeController.dll", EntryPoint = "RseeController_OpenCom", CallingConvention = CallingConvention.Cdecl)]
private extern static int RseeController_OpenCom(string szPort, int Baud_rate, bool overlapped);
//关闭传上面打开返回的comHandle
[DllImport(@"RseeController.dll", EntryPoint = "RseeController_CloseCom", CallingConvention = CallingConvention.Cdecl)]
private extern static bool RseeController_CloseCom(int comHandle);
//设置新值 channel通道号:1-4
[DllImport(@"RseeController.dll", EntryPoint = "RseeController_PM_D_BRTSetChannel", CallingConvention = CallingConvention.Cdecl)]
private extern static int RseeController_PM_D_BRTSetChannel(int comHandle, int channel, int range);
//读取当前值
[DllImport(@"RseeController.dll", EntryPoint = "RseeController_PM_D_BRTReadChannel", CallingConvention = CallingConvention.Cdecl)]
private static extern unsafe int RseeController_PM_D_BRTReadChannel(int comHandle, int channel, int* range);
#endregion
private int Com_Handle;
private LightDevNameEnum devName;
private long portHandle;
/// <summary>
/// 光源亮度值
/// </summary>
public int DigitalValue { get; private set; }
public Action<WarningEnum, string> WarningEvent;
/// <summary>
/// 光源亮度值<通道号,亮度值0-255>
/// </summary>
public Action<int, int> DigitalEvent;
/// <summary>
/// 是否打开设备成功
/// </summary>
public bool IsInit { get; private set; } = false;
//private System.Timers.Timer timer = new System.Timers.Timer();
public LightDev(LightDevNameEnum _devName)
{
devName = _devName;
}
public bool start(int comNum)
{
try
{
if (devName == LightDevNameEnum.)
{
int result = CreateSerialPort(comNum, ref portHandle); //创建串口
if (result != SUCCESS)
throw new Exception($"打开光源设备(COM{comNum})失败: {result}");
}
else if (devName == LightDevNameEnum.)
{
Com_Handle = RseeController_OpenCom("COM"+ comNum, 19200, true);
if (Com_Handle == 0)
throw new Exception($"打开光源设备(COM{comNum})失败;");
}
else
throw new Exception($"打开光源设备失败,未知设备型号!");
IsInit = true;
//timer.Elapsed += Timer_Elapsed;
//timer.Interval = 100;
//timer.Enabled = true;
return true;
}
catch(Exception ex)
{
WarningEvent?.Invoke(WarningEnum.High,ex.Message);
return false;
}
}
public void stop()
{
if (!IsInit) return;
try
{
IsInit = false;
//timer.Elapsed -= Timer_Elapsed;
//timer.Stop();
if (devName == LightDevNameEnum.)
ReleaseSerialPort(portHandle); //断开串口
else if (devName == LightDevNameEnum.)
RseeController_CloseCom(Com_Handle);
}
catch { }
}
public unsafe int getDigitalValue(int channelIndex)
{
if (!IsInit) return -1;
int value = 0;
if (devName == LightDevNameEnum.)
{
if (GetDigitalValue(ref value, channelIndex, portHandle) != SUCCESS)
return -1;
}
else if (devName == LightDevNameEnum.)
{
if (RseeController_PM_D_BRTReadChannel(Com_Handle, channelIndex, &value) != 0)
return -1;
}
else
return -1;
DigitalEvent?.Invoke(channelIndex, value);
return value;
}
/// <summary>
/// 设置亮度值
/// </summary>
/// <param name="channelIndex">通道</param>
/// <param name="value">0-255</param>
/// <returns></returns>
public bool setDigitalValue(int channelIndex, int value)
{
if (!IsInit) return false;
Task.Factory.StartNew(() => {
if (devName == LightDevNameEnum.)
{
if (SetDigitalValue(channelIndex, value, portHandle) != SUCCESS)
return;// false;
}
else if (devName == LightDevNameEnum.)
{
if (RseeController_PM_D_BRTSetChannel(Com_Handle, channelIndex, value) != 0)
return;// false;
}
});
return true;
}
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
if (!IsInit) return;
}
public void Dispose()
{
stop();
}
}
}