banboshi_V1/halftoneproject-master/Code/Device/LightDev.cs
2023-10-31 13:19:29 +08:00

164 lines
5.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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();
}
}
}