using System;
using System.Collections;
using log4net;
using System.Threading;
namespace SA_LTT.Module
{
#region Enum
public enum SourcesType
{
INT,
EXT,
}
public enum TemperaturePointType
{
SHG = 0x00,
THG = 0x01,
LD1 = 0x02,
LD2 = 0x03,
LD3 = 0x04,
}
public enum BurstFiringModeType
{
Continuous = 0x00,
SingleShot = 0x01
}
public enum BurstTriggerSourceType
{
Command = 0x00,
Gate = 0x01,
}
public enum DutyControlModeType
{
Fixed = 0x00,
Track = 0x01,
}
#endregion
// Laser Set Current, Gate Source 말고는 다 고정값으로 사용함.
// 나머지는 사용 못하게 막으면됨. UI는 상태값만 표시.
///
/// Company : Photonics Industries International, Inc.
/// Site : www.Photonix.com.
/// PI laser control class.
///
public class PiLaser : ComPort
{
#region Enum
public enum WriteCommand
{
EnableShutter = 0x04,
SystemReset = 0x07,
EnableLDD = 0x10,
SetCurrent = 0x11,
MaxCurrent = 0x14,
PRF = 0x21,
PRFSource = 0x23,
GateSource = 0x24,
PECSource = 0x25,
FPKEnable = 0x27,
FPKRampTime = 0x28,
FPKRampRate = 0x29,
LPKEnable = 0x2B,
LPKRampTime = 0x2C,
LPKRampRate = 0x2D,
TemperatureSetPoint = 0x31,
DutyControl = 0x53,
DutyControlWidth = 0x54,
PECLevel = 0x55,
BurstStatus = 0x56,
BurstCount = 0x57,
BurstRate = 0x58,
BurstCycles = 0x59,
BurstFiringMode = 0x67,
BurstTriggerSource = 0x68,
DutyControlMode = 0x69,
}
public enum ReadCommand
{
EnableShutter = 0x04,
ReadSoftFaults = 0x0C,
ReadBoardFaults = 0x0D,
ReadStatus = 0x0F,
EnableLDD = 0x10,
SetCurrent = 0x11,
ReadActualCurrent = 0x12,
ReadDiodeVoltage = 0x13,
MaxCurrent = 0x14,
LDDHours = 0x15,
PRF = 0x21,
PRFSource = 0x23,
GateSource = 0x24,
PECSource = 0x25,
FPKEnable = 0x27,
FPKRampTime = 0x28,
FPKRampRate = 0x29,
LPKEnable = 0x2B,
LPKRampTime = 0x2C,
LPKRampRate = 0x2D,
TemperatureSetPoint = 0x31,
ActualTemperature = 0x32,
DutyControl = 0x53,
DutyControlWidth = 0x54,
PECLevel = 0x55,
BurstStatus = 0x56,
BurstCount = 0x57,
BurstRate = 0x58,
BurstCycles = 0x59,
BurstFiringMode = 0x67,
BurstTriggerSource = 0x68,
DutyControlMode = 0x69,
PowerMonitorReading = 0x71,
FlowReading = 0x74,
HumidityReading = 0x76,
NetworkAddress = 0x98,
}
#endregion
#region Property
///
/// Current pi laser status.
///
public PiLaserStatus CurrentPiLaserStatus
{
get
{
return _currentPiLaserStatus;
}
private set
{
_currentPiLaserStatus = value;
}
}
#endregion
#region Field
private ILog _piLaserLogger = LogManager.GetLogger("PiLaser");
private IEnumerator _piLaserReadCommands;
private PiLaserStatus _currentPiLaserStatus;
private Equipment _equipment;
private Thread t_statusUpdate;
private object _lockObject;
private bool _isLock;
#endregion
#region Construct
public PiLaser(Equipment equipment)
{
serialPort.PortName = "COM12";
serialPort.BaudRate = 115200;
serialPort.Parity = System.IO.Ports.Parity.None;
serialPort.DataBits = 8;
serialPort.StopBits = System.IO.Ports.StopBits.One;
Terminator = "\r";
_equipment = equipment;
_lockObject = new object();
_currentPiLaserStatus = new PiLaserStatus();
t_statusUpdate = new Thread(statusUpdate);
t_statusUpdate.Start();
}
#endregion
#region Function
public void statusUpdate()
{
while (_equipment.IsDisposed == false)
{
try
{
Thread.Sleep(10);
if (IsOpen)
{
if (_piLaserReadCommands == null || !_piLaserReadCommands.MoveNext())
{
_piLaserReadCommands = PiLaserReads();
}
else
{
bool value = (bool)_piLaserReadCommands.Current;
if (value == false)
{
// Alarm : Communication Alarm.
}
}
}
else
{
// Interlock : Connection Alarm 발생시 동작 안되도록 변경.
if (!Open())
{
// Alarm : Connection Alarm.
}
}
}
catch (Exception e)
{
EquipmentLogManager.Instance.WriteExceptionLog(e.StackTrace);
}
}
}
private void CheckSoftFaults()
{
if (CurrentPiLaserStatus.CurrentSoftFaults.HfSync)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0100_LASER_SOFT_FAULT_HFSYNC);
}
if (CurrentPiLaserStatus.CurrentSoftFaults.LddInterlock)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0101_LASER_SOFT_FAULT_LDD_INTERLOCK);
}
if (CurrentPiLaserStatus.CurrentSoftFaults.ShutterInterlock)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0102_LASER_SOFT_FAULT_SHUTTER_INTERLOCK);
}
if (CurrentPiLaserStatus.CurrentSoftFaults.LowExtFrequency)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0103_LASER_SOFT_FAULT_LOW_EXT_FREQUENCY);
}
}
private void CheckBoardFaults()
{
if (CurrentPiLaserStatus.CurrentBoardFaults.Main)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0103_LASER_SOFT_FAULT_LOW_EXT_FREQUENCY);
}
if (CurrentPiLaserStatus.CurrentBoardFaults.Common)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0105_LASER_BOARD_FAULT_COMMON);
}
if (CurrentPiLaserStatus.CurrentBoardFaults.Temperature)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0106_LASER_BOARD_FAULT_TEMPERATURE);
}
if (CurrentPiLaserStatus.CurrentBoardFaults.Sensor)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0107_LASER_BOARD_FAULT_SENSOR);
}
if (CurrentPiLaserStatus.CurrentBoardFaults.PowerMonitor)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0108_LASER_BOARD_FAULT_POWER_MONITOR);
}
if (CurrentPiLaserStatus.CurrentBoardFaults.Pulse)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0109_LASER_BOARD_FAULT_PULSE);
}
if (CurrentPiLaserStatus.CurrentBoardFaults.Ldd)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0110_LASER_BOARD_FAULT_LDD);
}
if (CurrentPiLaserStatus.CurrentBoardFaults.Motor)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0111_LASER_BOARD_FAULT_MOTOR);
}
}
private void CheckSystemFaults()
{
if (CurrentPiLaserStatus.CurrentSystemFaults.Memory)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0112_LASER_SYSTEM_FAULT_MEMORY);
}
if (CurrentPiLaserStatus.CurrentSystemFaults.SdCard)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0113_LASER_SYSTEM_FAULT_SDCARD);
}
if (CurrentPiLaserStatus.CurrentSystemFaults.BoardCommunication)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0114_LASER_SYSTEM_FAULT_BOARD_COMMUNICATION);
}
if (CurrentPiLaserStatus.CurrentSystemFaults.BoardState)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0115_LASER_SYSTEM_FAULT_BOARD_STATE);
}
}
private void CheckGeneralAlarms()
{
if (CurrentPiLaserStatus.CurrentGeneralAlarms.Ldd1)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0116_LASER_GENERAL_ALARM_LDD1);
}
if (CurrentPiLaserStatus.CurrentGeneralAlarms.Ldd2)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0117_LASER_GENERAL_ALARM_LDD2);
}
if (CurrentPiLaserStatus.CurrentGeneralAlarms.Qsw)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0118_LASER_GENERAL_ALARM_QSW);
}
if (CurrentPiLaserStatus.CurrentGeneralAlarms.Flow)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0119_LASER_GENERAL_ALARM_FLOW);
}
if (CurrentPiLaserStatus.CurrentGeneralAlarms.Wet)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0120_LASER_GENERAL_ALARM_WET);
}
if (CurrentPiLaserStatus.CurrentGeneralAlarms.Humidity)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0121_LASER_GENERAL_ALARM_HUMIDITY);
}
if (CurrentPiLaserStatus.CurrentGeneralAlarms.HfSync)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0122_LASER_GENERAL_ALARM_HFSYNC);
}
}
private void CheckTemperatureFaults()
{
if (CurrentPiLaserStatus.CurrentTemperatureControlFaults.TemperatureControlFault0)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0123_LASER_TEMPERATURE_FAULT_0);
}
if (CurrentPiLaserStatus.CurrentTemperatureControlFaults.TemperatureControlFault1)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0124_LASER_TEMPERATURE_FAULT_1);
}
if (CurrentPiLaserStatus.CurrentTemperatureControlFaults.TemperatureControlFault2)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0125_LASER_TEMPERATURE_FAULT_2);
}
if (CurrentPiLaserStatus.CurrentTemperatureControlFaults.TemperatureControlFault3)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0126_LASER_TEMPERATURE_FAULT_3);
}
if (CurrentPiLaserStatus.CurrentTemperatureControlFaults.TemperatureControlFault4)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0127_LASER_TEMPERATURE_FAULT_4);
}
if (CurrentPiLaserStatus.CurrentTemperatureControlFaults.TemperatureControlFault5)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0128_LASER_TEMPERATURE_FAULT_5);
}
if (CurrentPiLaserStatus.CurrentTemperatureControlFaults.TemperatureControlFault6)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0129_LASER_TEMPERATURE_FAULT_6);
}
if (CurrentPiLaserStatus.CurrentTemperatureControlFaults.TemperatureControlFault7)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0130_LASER_TEMPERATURE_FAULT_7);
}
}
private void CheckSystemStateFaults()
{
if(CurrentPiLaserStatus.CurrentSystemState.SoftFault)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0131_LASER_SOFT_FAULT);
}
if (CurrentPiLaserStatus.CurrentSystemState.HardFault)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0132_LASER_HARD_FAULT);
}
}
//=============================== Write ==========================================
///
/// Write enable shutter.
///
/// true : Enable, false : Disable
///
public bool WriteEnableShutter(bool enable)
{
if (_equipment.piLaser.CurrentPiLaserStatus.EnableShutter && enable == false)
{
if (_equipment.piLaser.CurrentPiLaserStatus.SetCurrent > 0)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0080_SET_CURRENT_IS_NOT_ZERO);
return false;
}
}
var bytesData = new byte[1];
if (enable)
bytesData[0] = 0x01;
else
bytesData[0] = 0x00;
return WriteData(WriteCommand.EnableShutter, bytesData);
}
///
/// System reset.
///
///
public bool WriteSystemReset()
{
return WriteData(WriteCommand.SystemReset);
}
///
/// Write enable laser diode driver.
///
/// true : Enable, false : Disable
///
public bool WriteEnableLdd(bool enable)
{
if (_equipment.piLaser.CurrentPiLaserStatus.EnableLdd && enable == false)
{
if (_equipment.piLaser.CurrentPiLaserStatus.SetCurrent > 0)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0080_SET_CURRENT_IS_NOT_ZERO);
return false;
}
}
var bytesData = new byte[1];
if (enable)
bytesData[0] = 0x01;
else
bytesData[0] = 0x00;
return WriteData(WriteCommand.EnableLDD, bytesData);
}
///
/// Write set current.
///
/// 0 - 100 (A)
public bool WriteSetCurrent(double ampere)
{
if (CurrentPiLaserStatus.CurrentSystemStatus.LddOn == false)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0078_LDD_IS_NOT_ON);
return false;
}
if (CurrentPiLaserStatus.CurrentSystemStatus.ShutterEnabled == false)
{
_equipment.alarmManager.Occur(AlarmCode.AL_0079_SHUTTER_IS_NOT_OPEN);
return false;
}
//Unit : 0.01A
ampere = ampere * 100;
if (ampere > 10000) ampere = 10000;
else if (ampere < 0) ampere = 0;
var ushortAmpere = ushort.Parse(ampere.ToString("F0"));
var bytesData = BitConverter.GetBytes(ushortAmpere);
if (BitConverter.IsLittleEndian) Array.Reverse(bytesData);
return WriteData(WriteCommand.SetCurrent, bytesData);
}
///
/// Write max current.
///
/// 0 - 100 (A)
public bool WriteMaxCurrent(double ampere)
{
//Unit : 0.01A
ampere = ampere * 100;
if (ampere > 10000) ampere = 10000;
else if (ampere < 0) ampere = 0;
var ushortAmpere = ushort.Parse(ampere.ToString("F0"));
var bytesData = BitConverter.GetBytes(ushortAmpere);
if (BitConverter.IsLittleEndian) Array.Reverse(bytesData);
return WriteData(WriteCommand.MaxCurrent, bytesData);
}
///
/// Write pulse repetition frequency.
///
/// 0 - 1000000 Hz
public bool WritePrf(int pulseRepetitionFrequency)
{
if (pulseRepetitionFrequency > 1000000) pulseRepetitionFrequency = 1000000;
else if (pulseRepetitionFrequency < 0) pulseRepetitionFrequency = 0;
var bytesData = new byte[3];
var bytesPulseRepetitionFrequency = BitConverter.GetBytes(pulseRepetitionFrequency);
if (BitConverter.IsLittleEndian) Array.Reverse(bytesPulseRepetitionFrequency);
bytesData[0] = bytesPulseRepetitionFrequency[1];
bytesData[1] = bytesPulseRepetitionFrequency[2];
bytesData[2] = bytesPulseRepetitionFrequency[3];
return WriteData(WriteCommand.PRF, bytesData);
}
///
/// Write pulse repetition frequency source.
///
/// Source type
///
public bool WritePrfSource(SourcesType source)
{
var bytesData = new byte[1];
if (source == SourcesType.EXT)
bytesData[0] = 0x01;
else
bytesData[0] = 0x00;
return WriteData(WriteCommand.PRFSource, bytesData);
}
///
/// Write gate source.
///
/// Source type
///
public bool WriteGateSource(SourcesType source)
{
var bytesData = new byte[1];
if (source == SourcesType.EXT)
bytesData[0] = 0x01;
else
bytesData[0] = 0x00;
return WriteData(WriteCommand.GateSource, bytesData);
}
///
/// Write pulse energy control source.
///
/// Source type
///
public bool WritePecSource(SourcesType source)
{
var bytesData = new byte[1];
if (source == SourcesType.EXT)
bytesData[0] = 0x01;
else
bytesData[0] = 0x00;
return WriteData(WriteCommand.PECSource, bytesData);
}
///
/// Write first pulse kill enable.
///
/// true : Enable, false : Disable
///
public bool WriteFpkEnable(bool enable)
{
var bytesData = new byte[1];
if (enable)
bytesData[0] = 0x01;
else
bytesData[0] = 0x00;
return WriteData(WriteCommand.FPKEnable, bytesData);
}
///
/// Write first pulse kill ramp time.
///
/// 0 - 655350 (ns)
public bool WriteFpkRampTime(int rampTime)
{
//Units : 10ns
rampTime = (int)(rampTime * 0.1);
if (rampTime > 65535) rampTime = 65535;
else if (rampTime < 0) rampTime = 0;
var ushortRampTime = ushort.Parse(rampTime.ToString("F0"));
var bytesData = BitConverter.GetBytes(ushortRampTime);
if (BitConverter.IsLittleEndian) Array.Reverse(bytesData);
return WriteData(WriteCommand.FPKRampTime, bytesData);
}
///
/// Write first pulse kill ramp rate.
///
/// 0 - 6553500 (ns)
public bool WriteFpkRampRate(int rampRate)
{
//Units : 100ns
rampRate = (int)(rampRate * 0.01);
if (rampRate > 65535) rampRate = 65535;
else if (rampRate < 0) rampRate = 0;
var ushortRampRate = ushort.Parse(rampRate.ToString("F0"));
var bytesData = BitConverter.GetBytes(ushortRampRate);
if (BitConverter.IsLittleEndian) Array.Reverse(bytesData);
return WriteData(WriteCommand.FPKRampRate, bytesData);
}
///
/// Write lpk enable.
///
/// true : Enable, false : Disable
///
public bool WriteLpkEnable(bool enable)
{
byte[] bytesData = new byte[1];
if (enable)
bytesData[0] = 0x01;
else
bytesData[0] = 0x00;
return WriteData(WriteCommand.LPKEnable, bytesData);
}
///
/// Write lpk ramp time.
///
/// 0 - 655350 (ns)
public bool WriteLpkRampTime(double rampTime)
{
//Units : 10ns.
rampTime = rampTime * 0.1f;
if (rampTime > 65535) rampTime = 65535;
else if (rampTime < 0) rampTime = 0;
var ushortRampTime = ushort.Parse(rampTime.ToString("F0"));
var bytesData = BitConverter.GetBytes(ushortRampTime);
if (BitConverter.IsLittleEndian) Array.Reverse(bytesData);
return WriteData(WriteCommand.LPKRampTime, bytesData);
}
///
/// Write lpk ramp rate.
///
/// 0 - 6553500 (ns)
public bool WriteLpkRampRate(int rampRate)
{
//Units : 100ns
rampRate = (int)(rampRate * 0.01);
if (rampRate > 65535) rampRate = 65535;
else if (rampRate < 0) rampRate = 0;
var ushortRampRate = ushort.Parse(rampRate.ToString("F0"));
var bytesData = BitConverter.GetBytes(ushortRampRate);
if (BitConverter.IsLittleEndian) Array.Reverse(bytesData);
return WriteData(WriteCommand.LPKRampRate, bytesData);
}
///
/// Write temperature set point.
///
/// Temperature point
/// 0 - 160 ℃
///
public bool WriteTemperatureSetPoint(TemperaturePointType temperaturePoint, double temperature)
{
//Units : 0.01℃
temperature = temperature * 100;
if (temperature > 16000) temperature = 16000;
else if (temperature < 0) temperature = 0;
var ushortTemperature = ushort.Parse(temperature.ToString("F0"));
var bytesData = BitConverter.GetBytes(ushortTemperature);
if (BitConverter.IsLittleEndian) Array.Reverse(bytesData);
return WriteData(WriteCommand.TemperatureSetPoint, bytesData, (int)temperaturePoint);
}
///
/// Write duty contorl.
///
/// true : Enable, false : Disable
///
public bool WriteDutyControl(bool enable)
{
var bytesData = new byte[1];
if (enable)
bytesData[0] = 0x01;
else
bytesData[0] = 0x00;
return WriteData(WriteCommand.DutyControl, bytesData);
}
///
/// Write duty control width.
///
/// 0 - (1/PRF - 0.1us)
public bool WriteDutyControlWidth(double dutyControlWidth)
{
//Units : 0.1us
dutyControlWidth = dutyControlWidth * 10;
if (dutyControlWidth > 16777215) dutyControlWidth = 16777215;
else if (dutyControlWidth < 0) dutyControlWidth = 0;
var intDutyControlWidth = int.Parse(dutyControlWidth.ToString("F0"));
var bytesData = new byte[3];
var bytesDutyControlWidth = BitConverter.GetBytes(intDutyControlWidth);
if (BitConverter.IsLittleEndian) Array.Reverse(bytesDutyControlWidth);
bytesData[0] = bytesDutyControlWidth[1];
bytesData[1] = bytesDutyControlWidth[2];
bytesData[2] = bytesDutyControlWidth[3];
return WriteData(WriteCommand.DutyControlWidth, bytesData);
}
///
/// Write pulse energy control level.
///
/// 0 - 100%
///
public bool WritePecLevel(double pulseEnergyControlLevel)
{
//Units : 0.1%
pulseEnergyControlLevel = pulseEnergyControlLevel * 10;
if (pulseEnergyControlLevel > 1000) pulseEnergyControlLevel = 1000;
else if (pulseEnergyControlLevel < 0) pulseEnergyControlLevel = 0;
var ushortPulseEnergyControlLevel = ushort.Parse(pulseEnergyControlLevel.ToString("F0"));
var bytesData = BitConverter.GetBytes(ushortPulseEnergyControlLevel);
if (BitConverter.IsLittleEndian) Array.Reverse(bytesData);
return WriteData(WriteCommand.PECLevel, bytesData);
}
///
/// Write burst status.
///
/// true : Enable, false : Disable
///
public bool WriteBurstStatus(bool burstStatus)
{
var bytesData = new byte[1];
if (burstStatus)
bytesData[0] = 0x01;
else
bytesData[0] = 0x00;
return WriteData(WriteCommand.BurstStatus, bytesData);
}
///
/// Write burst count.
///
/// from 1 to (Burst Rate -1)
public bool WriteBurstCount(ushort burstCount)
{
if (burstCount > 65535) burstCount = 65535;
else if (burstCount < 1) burstCount = 1;
var bytesData = BitConverter.GetBytes(burstCount);
if (BitConverter.IsLittleEndian) Array.Reverse(bytesData);
return WriteData(WriteCommand.BurstCount, bytesData);
}
///
/// Write burst rate.
///
/// from 1 to 65535
public bool WriteBurstRate(ushort burstRate)
{
// integer divisor of PRF
if (burstRate > 65535) burstRate = 65535;
else if (burstRate < 1) burstRate = 1;
var bytesData = BitConverter.GetBytes(burstRate);
if (BitConverter.IsLittleEndian) Array.Reverse(bytesData);
return WriteData(WriteCommand.BurstRate, bytesData);
}
///
/// Write burst cycles.
///
/// from 1 to 65535 (number of bursts)
public bool WriteBurstCycles(ushort burstCycles)
{
if (burstCycles > 65535) burstCycles = 65535;
else if (burstCycles < 1) burstCycles = 1;
var bytesData = BitConverter.GetBytes(burstCycles);
if (BitConverter.IsLittleEndian) Array.Reverse(bytesData);
return WriteData(WriteCommand.BurstCycles, bytesData);
}
///
/// Write burst firing mode.
///
/// Brust firing mode
///
public bool WriteBurstFiringMode(BurstFiringModeType burstFiringMode)
{
var bytesData = new byte[1];
if (burstFiringMode == BurstFiringModeType.SingleShot)
bytesData[0] = 0x01;
else
bytesData[0] = 0x00;
return WriteData(WriteCommand.BurstFiringMode, bytesData);
}
///
/// Write burst trigger source.
///
/// Burst trigger source
///
public bool WriteBurstTriggerSource(BurstTriggerSourceType burstTriggerSource)
{
var bytesData = new byte[1];
if (burstTriggerSource == BurstTriggerSourceType.Gate)
bytesData[0] = 0x01;
else
bytesData[0] = 0x00;
return WriteData(WriteCommand.BurstTriggerSource, bytesData);
}
///
/// Write duty control mode.
///
/// Duty control mode
///
public bool WriteDutyControlMode(DutyControlModeType dutyControlMode)
{
var bytesData = new byte[1];
if (dutyControlMode == DutyControlModeType.Track)
bytesData[0] = 0x01;
else
bytesData[0] = 0x00;
return WriteData(WriteCommand.DutyControlMode, bytesData);
}
//=============================== Read ==========================================
///
/// Read enable shutter.
///
///
public bool ReadEnableShutter()
{
var bytesData = ReadData(ReadCommand.EnableShutter);
if (bytesData == null)
{
return false;
}
else
{
_currentPiLaserStatus.EnableShutter = bytesData[0] == 0x01;
return true;
}
}
///
/// Read soft fauls.
///
///
public bool ReadSoftFaults()
{
var bytesdata = ReadData(ReadCommand.ReadSoftFaults);
if (bytesdata == null)
{
return false;
}
else
{
_currentPiLaserStatus.ChangeSoftFaults(bytesdata[1]);
CheckSoftFaults();
return true;
}
}
///
/// Read board faults.
///
///
public bool ReadBoardFaults()
{
var bytesData = ReadData(ReadCommand.ReadBoardFaults);
if (bytesData == null)
{
return false;
}
else
{
_currentPiLaserStatus.ChangeBoardFaults(bytesData[1]);
CheckBoardFaults();
return true;
}
}
///
/// Read status.
///
///
public bool ReadStatus()
{
var bytesData = ReadData(ReadCommand.ReadStatus);
if (bytesData == null)
{
return false;
}
else
{
_currentPiLaserStatus.ChangeSystemStatus(bytesData[0]);
_currentPiLaserStatus.ChangeSystemFaults(bytesData[1]);
_currentPiLaserStatus.ChangeGeneralAlarms(bytesData[2]);
_currentPiLaserStatus.ChangeTemperatureControlFaults(bytesData[3]);
_currentPiLaserStatus.ChangeSystemState(bytesData[4]);
CheckSystemFaults();
CheckGeneralAlarms();
CheckTemperatureFaults();
CheckSystemStateFaults();
return true;
}
}
///
/// Read enable ldd.
///
///
public bool ReadEnableLdd()
{
var bytesData = ReadData(ReadCommand.EnableLDD);
if (bytesData == null)
{
return false;
}
else
{
_currentPiLaserStatus.EnableLdd = bytesData[0] == 0x01;
return true;
}
}
///
/// Read set current.
///
///
public bool ReadSetCurrent()
{
var bytesData = ReadData(ReadCommand.SetCurrent);
if (bytesData == null)
{
return false;
}
else
{
if (BitConverter.IsLittleEndian)
Array.Reverse(bytesData);
_currentPiLaserStatus.SetCurrent = BitConverter.ToInt16(bytesData, 0) * 0.01f;
return true;
}
}
///
/// Read actual current.
///
///
public bool ReadActualCurrent()
{
var bytesData = ReadData(ReadCommand.ReadActualCurrent);
if (bytesData == null)
{
return false;
}
else
{
if (BitConverter.IsLittleEndian) Array.Reverse(bytesData);
_currentPiLaserStatus.ActualCurrent = BitConverter.ToInt16(bytesData, 0) * 0.01f;
return true;
}
}
///
/// Read diode voltage.
///
///
public bool ReadDiodeVoltage()
{
var bytesData = ReadData(ReadCommand.ReadDiodeVoltage);
if (bytesData == null)
{
return false;
}
else
{
if (BitConverter.IsLittleEndian) Array.Reverse(bytesData);
_currentPiLaserStatus.DiodeVoltage = BitConverter.ToInt16(bytesData, 0) * 0.01f;
return true;
}
}
///
/// Read max current.
///
///
public bool ReadMaxCurrent()
{
var bytesData = ReadData(ReadCommand.MaxCurrent);
if (bytesData == null)
{
return false;
}
else
{
if (BitConverter.IsLittleEndian) Array.Reverse(bytesData);
_currentPiLaserStatus.MaxCurrent = BitConverter.ToInt16(bytesData, 0) * 0.01f;
return true;
}
}
///
/// Read laser diode diver hours.
///
///
public bool ReadLddHours()
{
var bytesData = ReadData(ReadCommand.LDDHours);
if (bytesData == null)
{
return false;
}
else
{
if (BitConverter.IsLittleEndian) Array.Reverse(bytesData);
_currentPiLaserStatus.LddHours = BitConverter.ToInt32(bytesData, 0) * 0.1f;
return true;
}
}
///
/// Read pulse repetition frequency.
///
///
public bool ReadPrf()
{
var bytesData = ReadData(ReadCommand.PRF);
if (bytesData == null)
{
return false;
}
else
{
var bytesPulseRepetitionFrequency = new byte[4];
bytesPulseRepetitionFrequency[0] = 0;
bytesPulseRepetitionFrequency[1] = bytesData[0];
bytesPulseRepetitionFrequency[2] = bytesData[1];
bytesPulseRepetitionFrequency[3] = bytesData[2];
if (BitConverter.IsLittleEndian) Array.Reverse(bytesPulseRepetitionFrequency);
_currentPiLaserStatus.Prf = BitConverter.ToInt32(bytesPulseRepetitionFrequency, 0);
return true;
}
}
///
/// Read pulse repetition frequency source.
///
///
public bool ReadPRFSource()
{
var bytesData = ReadData(ReadCommand.PRFSource);
if (bytesData == null)
{
return false;
}
else
{
_currentPiLaserStatus.PrfSource = bytesData[0] == 0x01 ? SourcesType.EXT : SourcesType.INT;
return true;
}
}
///
/// Read gate source.
///
///
public bool ReadGateSource()
{
var bytesData = ReadData(ReadCommand.GateSource);
if (bytesData == null)
{
return false;
}
else
{
_currentPiLaserStatus.GateSource = bytesData[0] == 0x01 ? SourcesType.EXT : SourcesType.INT;
return true;
}
}
///
/// Read pulse energy control source.
///
///
public bool ReadPecSource()
{
var bytesData = ReadData(ReadCommand.PECSource);
if (bytesData == null)
{
return false;
}
else
{
_currentPiLaserStatus.PecSource = bytesData[0] == 0x01 ? SourcesType.EXT : SourcesType.INT;
return true;
}
}
///
/// Read first pulse kill enable.
///
///
public bool ReadFPKEnable()
{
var data_bytes = ReadData(ReadCommand.FPKEnable);
if (data_bytes == null)
{
return false;
}
else
{
_currentPiLaserStatus.FpkEnable = data_bytes[0] == 0x01;
return true;
}
}
///
/// Read first pulse kill ramp time.
///
///
public bool ReadFpkRampTime()
{
var bytesData = ReadData(ReadCommand.FPKRampTime);
if (bytesData == null)
{
return false;
}
else
{
if (BitConverter.IsLittleEndian) Array.Reverse(bytesData);
_currentPiLaserStatus.FpkRampTime = BitConverter.ToUInt16(bytesData, 0) * 10;
return true;
}
}
///
/// Read first pulse kill ramp rate.
///
///
public bool ReadFpkRampRate()
{
var bytesData = ReadData(ReadCommand.FPKRampRate);
if (bytesData == null)
{
return false;
}
else
{
if (BitConverter.IsLittleEndian) Array.Reverse(bytesData);
_currentPiLaserStatus.FpkRampRate = BitConverter.ToUInt16(bytesData, 0) * 100;
return true;
}
}
///
/// Read lpk enable.
///
///
public bool ReadLpkEnable()
{
var bytesData = ReadData(ReadCommand.LPKEnable);
if (bytesData == null)
{
return false;
}
else
{
_currentPiLaserStatus.LpkEnable = bytesData[0] == 0x01;
return true;
}
}
///
/// Read lpk ramp time.
///
///
public bool ReadLpkRampTime()
{
var bytesData = ReadData(ReadCommand.LPKRampTime);
if (bytesData == null)
{
return false;
}
else
{
if (BitConverter.IsLittleEndian) Array.Reverse(bytesData);
_currentPiLaserStatus.LpkRampTime = BitConverter.ToUInt16(bytesData, 0) * 10;
return true;
}
}
///
/// Read lpk ramp rate.
///
///
public bool ReadLpkRampRate()
{
var bytesData = ReadData(ReadCommand.LPKRampRate);
if (bytesData == null)
{
return false;
}
else
{
if (BitConverter.IsLittleEndian) Array.Reverse(bytesData);
_currentPiLaserStatus.LpkRampRate = BitConverter.ToUInt16(bytesData, 0) * 100;
return true;
}
}
///
/// Read temperature set point.
///
/// Temperature point
///
public bool ReadTemperatureSetPoint(TemperaturePointType temperaturePoint)
{
var bytesData = ReadData(ReadCommand.TemperatureSetPoint, (byte)temperaturePoint);
if (bytesData == null)
{
return false;
}
else
{
if (BitConverter.IsLittleEndian) Array.Reverse(bytesData);
if(temperaturePoint == TemperaturePointType.SHG)
_currentPiLaserStatus.ShgTemperatureSetPoint = BitConverter.ToInt16(bytesData, 0) * 0.01f;
if (temperaturePoint == TemperaturePointType.THG)
_currentPiLaserStatus.ThgTemperatureSetPoint = BitConverter.ToInt16(bytesData, 0) * 0.01f;
if (temperaturePoint == TemperaturePointType.LD1)
_currentPiLaserStatus.LdTemperatureSetPoint = BitConverter.ToInt16(bytesData, 0) * 0.01f;
return true;
}
}
///
/// Read actual temperature.
///
/// Temperature point
///
public bool ReadActualTemperature(TemperaturePointType temperaturePoint)
{
var bytesData = ReadData(ReadCommand.ActualTemperature, (byte)temperaturePoint);
if (bytesData == null)
{
return false;
}
else
{
if (BitConverter.IsLittleEndian) Array.Reverse(bytesData);
if (temperaturePoint == TemperaturePointType.SHG)
_currentPiLaserStatus.ShgActualTemperature = BitConverter.ToInt16(bytesData, 0) * 0.01f;
if (temperaturePoint == TemperaturePointType.THG)
_currentPiLaserStatus.ThgActualTemperature = BitConverter.ToInt16(bytesData, 0) * 0.01f;
if (temperaturePoint == TemperaturePointType.LD1)
_currentPiLaserStatus.LdActualTemperature = BitConverter.ToInt16(bytesData, 0) * 0.01f;
return true;
}
}
///
/// Read duty control.
///
///
public bool ReadDutyControl()
{
var bytesData = ReadData(ReadCommand.DutyControl);
if (bytesData == null)
{
return false;
}
else
{
_currentPiLaserStatus.DutyControl = bytesData[0] == 0x01;
return true;
}
}
///
/// Read duty control width.
///
///
public bool ReadDutyControlWidth()
{
var bytesData = ReadData(ReadCommand.DutyControlWidth);
if (bytesData == null)
{
return false;
}
else
{
var bytesDutyControlWidth = new byte[4];
bytesDutyControlWidth[0] = 0;
bytesDutyControlWidth[1] = bytesData[0];
bytesDutyControlWidth[2] = bytesData[1];
bytesDutyControlWidth[3] = bytesData[2];
if (BitConverter.IsLittleEndian) Array.Reverse(bytesDutyControlWidth);
_currentPiLaserStatus.DutyControlWidth = BitConverter.ToInt32(bytesDutyControlWidth, 0) * 0.1f;
return true;
}
}
///
/// Read pulse energy control level.
///
///
public bool ReadPecLevel()
{
var bytesData = ReadData(ReadCommand.PECLevel);
if (bytesData == null)
{
return false;
}
else
{
if (BitConverter.IsLittleEndian) Array.Reverse(bytesData);
if (bytesData.Length < 2)
{
}
else
{
_currentPiLaserStatus.PecLevel = BitConverter.ToInt16(bytesData, 0) * 0.1f;
}
return true;
}
}
///
/// Read burst status.
///
///
public bool ReadBurstStatus()
{
var bytesData = ReadData(ReadCommand.BurstStatus);
if (bytesData == null)
{
return false;
}
else
{
_currentPiLaserStatus.BurstStatus = bytesData[0] == 0x01;
return true;
}
}
///
/// Read burst count.
///
///
public bool ReadBurstCount()
{
var bytesData = ReadData(ReadCommand.BurstCount);
if (bytesData == null)
{
return false;
}
else
{
if (BitConverter.IsLittleEndian) Array.Reverse(bytesData);
_currentPiLaserStatus.BurstCount = BitConverter.ToUInt16(bytesData, 0);
return true;
}
}
///
/// Read burst rate.
///
///
public bool ReadBurstRate()
{
var bytesData = ReadData(ReadCommand.BurstRate);
if (bytesData == null)
{
return false;
}
else
{
if (BitConverter.IsLittleEndian) Array.Reverse(bytesData);
_currentPiLaserStatus.BurstRate = BitConverter.ToUInt16(bytesData, 0);
return true;
}
}
///
/// Read burst cycles.
///
///
public bool ReadBurstCycles()
{
var bytesData = ReadData(ReadCommand.BurstCycles);
if (bytesData == null)
{
return false;
}
else
{
if (BitConverter.IsLittleEndian) Array.Reverse(bytesData);
_currentPiLaserStatus.BurstCycles = BitConverter.ToUInt16(bytesData, 0);
return true;
}
}
///
/// Read burst firing mode.
///
///
public bool ReadBurstFiringMode()
{
var bytesData = ReadData(ReadCommand.BurstFiringMode);
if (bytesData == null)
{
return false;
}
else
{
_currentPiLaserStatus.BurstFiringMode = bytesData[0] == 0x01 ? BurstFiringModeType.SingleShot : BurstFiringModeType.Continuous;
return true;
}
}
///
/// Read burst trigger source.
///
///
public bool ReadBurstTriggerSource()
{
var bytesData = ReadData(ReadCommand.BurstTriggerSource);
if (bytesData == null)
{
return false;
}
else
{
_currentPiLaserStatus.BurstTriggerSource = bytesData[0] == 0x01 ? BurstTriggerSourceType.Gate : BurstTriggerSourceType.Command;
return true;
}
}
///
/// Read duty control mode.
///
///
public bool ReadDutyControlMode()
{
var bytesData = ReadData(ReadCommand.DutyControlMode);
if (bytesData == null)
{
return false;
}
else
{
_currentPiLaserStatus.DutyControlMode = bytesData[0] == 0x01 ? DutyControlModeType.Fixed : DutyControlModeType.Track;
return true;
}
}
///
/// Read power monitor reading.
///
///
public bool ReadPowerMonitorReading()
{
var bytesData = ReadData(ReadCommand.PowerMonitorReading);
if (bytesData == null)
{
return false;
}
else
{
if (BitConverter.IsLittleEndian) Array.Reverse(bytesData);
_currentPiLaserStatus.PowerMonitorReading = BitConverter.ToInt32(bytesData, 0) * 0.01f;
return true;
}
}
///
/// Read flow reading.
///
///
public bool ReadFlowReading()
{
var bytesData = ReadData(ReadCommand.FlowReading);
if (bytesData == null)
{
return false;
}
else
{
if (BitConverter.IsLittleEndian) Array.Reverse(bytesData);
_currentPiLaserStatus.FlowReading = BitConverter.ToUInt16(bytesData, 0) * 0.1f;
return true;
}
}
///
/// Read humidity reading.
///
///
public bool ReadHumidityReading()
{
var bytesData = ReadData(ReadCommand.HumidityReading);
if (bytesData == null)
{
return false;
}
else
{
if (BitConverter.IsLittleEndian) Array.Reverse(bytesData);
_currentPiLaserStatus.HumidityReading = BitConverter.ToUInt16(bytesData, 0);
return true;
}
}
///
/// Read network address
///
///
public bool ReadNetworkAddress()
{
var bytesData = ReadData(ReadCommand.NetworkAddress);
if (bytesData == null)
{
return false;
}
else
{
if (BitConverter.IsLittleEndian) Array.Reverse(bytesData);
_currentPiLaserStatus.IpAddress = $"{bytesData[0]:D3}.{bytesData[1]:D3}.{bytesData[2]:D3}.{bytesData[3]:D3}";
_currentPiLaserStatus.SubnetMask = $"{bytesData[4]:D3}.{bytesData[5]:D3}.{bytesData[6]:D3}.{bytesData[7]:D3}";
_currentPiLaserStatus.Gateway = $"{bytesData[8]:D3}.{bytesData[9]:D3}.{bytesData[10]:D3}.{bytesData[11]:D3}";
return true;
}
}
//=============================== 데이터 전송 기본 함수 ==========================================
///
/// 기존 데이터에 Checksum 추가하여 byte배열로 반환.
///
///
///
private byte[] AddChecksum(byte[] data)
{
var bytesChecksum = new byte[data.Length + 2];
data.CopyTo(bytesChecksum, 0);
var checksum = new byte[2];
int sum = 0;
foreach(byte value in data)
{
sum = sum + value;
}
checksum[0] = (byte)(sum / 256);
checksum[1] = (byte)(sum % 256);
checksum.CopyTo(bytesChecksum, data.Length);
return bytesChecksum;
}
///
/// 기존 데이터에 Checksum 추가하여 string 형태로 반환.
///
///
///
private string AddChecksum(string data)
{
string strChecksum = string.Empty;
int byteLength = data.Length / 2;
var bytes = new byte[byteLength];
for(int i = 0; i < byteLength; i++)
{
bytes[i] = Convert.ToByte(data.Substring(i * 2, 2), 16);
}
var checksum_bytes = AddChecksum(bytes);
for(int i = 0; i < checksum_bytes.Length; i++)
{
strChecksum += $"{checksum_bytes[i]:X2}";
}
return strChecksum;
}
///
/// Read 후 받은 데이터와 보낸 데이터의 Command가 일치하는지 확인.
///
///
///
///
private bool CheckCommand(byte data, Array commands)
{
foreach(var value in commands)
{
if(data == (int)value)
{
return true;
}
}
return false;
}
///
/// Read후 받은 데이터의 Checksum이 정확한지 확인.
///
///
///
private bool CheckChecksum(byte[] datas)
{
int dataSum = 0;
int checksumSum = 0;
var bytesChecksum = new byte[4];
bytesChecksum[0] = 0;
bytesChecksum[1] = 0;
bytesChecksum[2] = datas[datas.Length - 2];
bytesChecksum[3] = datas[datas.Length - 1];
if (BitConverter.IsLittleEndian) Array.Reverse(bytesChecksum);
checksumSum = BitConverter.ToInt32(bytesChecksum, 0);
for(int i = 0; i < datas.Length - 2; i++)
{
dataSum += datas[i];
}
if(dataSum == checksumSum)
return true;
else
return false;
}
///
/// Laser에 Read 명령어를 보낼 때 사용.
///
///
///
///
private byte[] ReadData(ReadCommand command, int addressCode = -1)
{
if (!IsOpen)
{
//SicLogger.WritePiLaserLog($"================ Pi laser ({PortName}) is not opened. ===============");
return null;
}
lock (_lockObject)
{
try
{
while (_isLock)
{
Monitor.Wait(_lockObject);
}
_isLock = true;
while ((DateTime.Now - checkDate).TotalSeconds < 0.1)
{
}
string strReceivedData = string.Empty;
string sendData;
if (addressCode == -1)
sendData = $"010000{(int)command:X2}";
else
sendData = $"0100{addressCode:X2}{(int)command:X2}";
sendData = AddChecksum(sendData) + "\r";
//SicLogger.WritePiLaserLog($"================ Read Data ===============");
//SicLogger.WritePiLaserLog($"[Send] >>> {sendData.Replace("\r", "")}");
var bytesReceivedData = WriteRead(sendData);
if (bytesReceivedData == null)
{
//SicLogger.WritePiLaserLog($"[Recv] <<< Recv is fail");
return null;
}
else
{
strReceivedData = bytesReceivedData.Replace("\r", "");
}
//SicLogger.WritePiLaserLog($"[Recv] <<< {strReceivedData}");
var bytesReceivedFormatData = new byte[strReceivedData.Length / 2];
for (int i = 0; i < bytesReceivedFormatData.Length; i++)
{
bytesReceivedFormatData[i] = Convert.ToByte(strReceivedData.Substring(i * 2, 2), 16);
}
if (!CheckCommand(bytesReceivedFormatData[3], Enum.GetValues(typeof(ReadCommand))))
{
//SicLogger.WritePiLaserLog($"Command is not exist.");
return null;
}
if (!CheckChecksum(bytesReceivedFormatData))
{
//SicLogger.WritePiLaserLog($"Checksum is fail");
return null;
}
var bytesData = new byte[bytesReceivedFormatData[1]];
for (int i = 0; i < bytesReceivedFormatData[1]; i++)
{
bytesData[i] = bytesReceivedFormatData[4 + i];
}
return bytesData;
}
catch(Exception e)
{
EquipmentLogManager.Instance.WriteExceptionLog(e.StackTrace);
return null;
}
finally
{
checkDate = DateTime.Now;
_isLock = false;
Monitor.Pulse(_lockObject);
}
}
}
///
/// Laser에 Write 명령어를 보낼 때 사용.
///
///
///
///
///
DateTime checkDate = DateTime.Now;
private bool WriteData(WriteCommand command, byte[] bytesData = null, int addressCode = -1)
{
if (!IsOpen)
{
//SicLogger.WritePiLaserLog($"================ Pi laser ({PortName}) is not opened. ===============");
return false;
}
lock (_lockObject)
{
try
{
while (_isLock)
{
Monitor.Wait(_lockObject);
}
_isLock = true;
while ((DateTime.Now - checkDate).TotalSeconds < 0.1)
{
}
string write_data;
if (bytesData == null)
{
if (addressCode == -1)
write_data = $"000000{(int)command:X2}";
else
write_data = $"0000{addressCode:X2}{(int)command:X2}";
}
else
{
if (addressCode == -1)
write_data = $"00{bytesData.Length:X2}00{(int)command:X2}";
else
write_data = $"00{bytesData.Length:X2}{addressCode:X2}{(int)command:X2}";
foreach (byte data in bytesData)
{
write_data += $"{data:X2}";
}
}
write_data = AddChecksum(write_data) + "\r";
//SicLogger.WritePiLaserLog($"================ Write Data ===============");
//SicLogger.WritePiLaserLog($"[Send] >>> {write_data.Replace("\r", "")}");
Write(write_data);
return true;
}
catch (Exception e)
{
EquipmentLogManager.Instance.WriteExceptionLog(e.StackTrace);
return false;
}
finally
{
checkDate = DateTime.Now;
_isLock = false;
Monitor.Pulse(_lockObject);
}
}
}
///
/// Pi laser read method 순차적으로 불러우는 함수.
///
///
public IEnumerator PiLaserReads()
{
yield return ReadStatus();
yield return ReadBoardFaults();
yield return ReadSoftFaults();
yield return ReadEnableShutter();
yield return ReadEnableLdd();
yield return ReadSetCurrent();
yield return ReadActualCurrent();
yield return ReadDiodeVoltage();
yield return ReadMaxCurrent();
yield return ReadLddHours();
yield return ReadPrf();
yield return ReadPRFSource();
yield return ReadGateSource();
yield return ReadPecSource();
yield return ReadFPKEnable();
yield return ReadFpkRampTime();
yield return ReadFpkRampRate();
yield return ReadLpkEnable();
yield return ReadLpkRampTime();
yield return ReadLpkRampRate();
yield return ReadTemperatureSetPoint(TemperaturePointType.SHG);
yield return ReadTemperatureSetPoint(TemperaturePointType.THG);
yield return ReadTemperatureSetPoint(TemperaturePointType.LD1);
yield return ReadActualTemperature(TemperaturePointType.SHG);
yield return ReadActualTemperature(TemperaturePointType.THG);
yield return ReadActualTemperature(TemperaturePointType.LD1);
yield return ReadDutyControl();
yield return ReadDutyControlWidth();
yield return ReadPecLevel();
yield return ReadBurstStatus();
yield return ReadBurstCount();
yield return ReadBurstRate();
yield return ReadBurstFiringMode();
yield return ReadBurstTriggerSource();
yield return ReadDutyControlMode();
yield return ReadPowerMonitorReading();
yield return ReadFlowReading();
yield return ReadHumidityReading();
//yield return _piLaser.ReadNetworkAddress();
}
#endregion
}
///
/// Pi laser status.
///
public class PiLaserStatus
{
#region Define
public struct SoftFaults
{
#region Property
public bool HfSync
{
get
{
return _hfSync;
}
set
{
_hfSync = value;
}
}
public bool LddInterlock
{
get
{
return _lddInterlock;
}
set
{
_lddInterlock = value;
}
}
public bool ShutterInterlock
{
get
{
return _shutterInterlock;
}
set
{
_shutterInterlock = value;
}
}
public bool LowExtFrequency
{
get
{
return _lowExtFrequency;
}
set
{
_lowExtFrequency = value;
}
}
#endregion
#region Field
private bool _hfSync;
private bool _lddInterlock;
private bool _shutterInterlock;
private bool _lowExtFrequency;
#endregion
}
public struct BoardFaults
{
#region Property
public bool Main
{
get
{
return _main;
}
set
{
_main = value;
}
}
public bool Common
{
get
{
return _common;
}
set
{
_common = value;
}
}
public bool Temperature
{
get
{
return _temperature;
}
set
{
_temperature = value;
}
}
public bool Sensor
{
get
{
return _sensor;
}
set
{
_sensor = value;
}
}
public bool PowerMonitor
{
get
{
return _powerMonitor;
}
set
{
_powerMonitor = value;
}
}
public bool Pulse
{
get
{
return _pulse;
}
set
{
_pulse = value;
}
}
public bool Ldd
{
get
{
return _ldd;
}
set
{
_ldd = value;
}
}
public bool Motor
{
get
{
return _motor;
}
set
{
_motor = value;
}
}
#endregion
#region Field
private bool _main;
private bool _common;
private bool _temperature;
private bool _sensor;
private bool _powerMonitor;
private bool _pulse;
private bool _ldd;
private bool _motor;
#endregion
}
public struct SystemStatus
{
#region Property
///
/// Power On
///
public bool PowerOn
{
get
{
return _powerOn;
}
set
{
_powerOn = value;
}
}
///
/// Shutter Enabled
///
public bool ShutterEnabled
{
get
{
return _shutterEnabled;
}
set
{
_shutterEnabled = value;
}
}
///
/// Key Switch
///
public bool KeySwitch
{
get
{
return _keySwitch;
}
set
{
_keySwitch = value;
}
}
///
/// Laser Diode Drive On
///
public bool LddOn
{
get
{
return _lddOn;
}
set
{
_lddOn = value;
}
}
///
/// Q Switch On
///
public bool QswOn
{
get
{
return _qswOn;
}
set
{
_qswOn = value;
}
}
///
/// Shutter Interlock
///
public bool ShutterInterlock
{
get
{
return _shutterInterlock;
}
set
{
_shutterInterlock = value;
}
}
///
/// Laser Diode Drive Interlock
///
public bool LddInterlock
{
get
{
return _lddInterlock;
}
set
{
_lddInterlock = value;
}
}
#endregion
#region Field
private bool _powerOn;
private bool _shutterEnabled;
private bool _keySwitch;
private bool _lddOn;
private bool _qswOn;
private bool _shutterInterlock;
private bool _lddInterlock;
#endregion
}
public struct SystemFaults
{
#region Property
public bool Memory
{
get
{
return _memory;
}
set
{
_memory = value;
}
}
public bool SdCard
{
get
{
return _sdCard;
}
set
{
_sdCard = value;
}
}
public bool BoardCommunication
{
get
{
return _boardCommunication;
}
set
{
_boardCommunication = value;
}
}
public bool BoardState
{
get
{
return _boardState;
}
set
{
_boardState = value;
}
}
#endregion
#region Field
private bool _memory;
private bool _sdCard;
private bool _boardCommunication;
private bool _boardState;
#endregion
}
public struct GeneralAlarms
{
#region Property
public bool Ldd1
{
get
{
return _ldd1;
}
set
{
_ldd1 = value;
}
}
public bool Ldd2
{
get
{
return _ldd2;
}
set
{
_ldd2 = value;
}
}
public bool Qsw
{
get
{
return _qsw;
}
set
{
_qsw = value;
}
}
public bool Flow
{
get
{
return _flow;
}
set
{
_flow = value;
}
}
public bool Wet
{
get
{
return _wet;
}
set
{
_wet = value;
}
}
public bool Humidity
{
get
{
return _humidity;
}
set
{
_humidity = value;
}
}
public bool HfSync
{
get
{
return _hfSync;
}
set
{
_hfSync = value;
}
}
#endregion
#region Field
private bool _ldd1;
private bool _ldd2;
private bool _qsw;
private bool _flow;
private bool _wet;
private bool _humidity;
private bool _hfSync;
#endregion
}
public struct TemperatureControlFaults
{
#region Property
public bool TemperatureControlFault0
{
get
{
return _temperatureControlFault0;
}
set
{
_temperatureControlFault0 = value;
}
}
public bool TemperatureControlFault1
{
get
{
return _temperatureControlFault1;
}
set
{
_temperatureControlFault1 = value;
}
}
public bool TemperatureControlFault2
{
get
{
return _temperatureControlFault2;
}
set
{
_temperatureControlFault2 = value;
}
}
public bool TemperatureControlFault3
{
get
{
return _temperatureControlFault3;
}
set
{
_temperatureControlFault3 = value;
}
}
public bool TemperatureControlFault4
{
get
{
return _temperatureControlFault4;
}
set
{
_temperatureControlFault4 = value;
}
}
public bool TemperatureControlFault5
{
get
{
return _temperatureControlFault5;
}
set
{
_temperatureControlFault5 = value;
}
}
public bool TemperatureControlFault6
{
get
{
return _temperatureControlFault6;
}
set
{
_temperatureControlFault6 = value;
}
}
public bool TemperatureControlFault7
{
get
{
return _temperatureControlFault7;
}
set
{
_temperatureControlFault7 = value;
}
}
#endregion
#region Field
private bool _temperatureControlFault0;
private bool _temperatureControlFault1;
private bool _temperatureControlFault2;
private bool _temperatureControlFault3;
private bool _temperatureControlFault4;
private bool _temperatureControlFault5;
private bool _temperatureControlFault6;
private bool _temperatureControlFault7;
#endregion
}
public struct SystemState
{
#region Property
public bool SystemInitialization
{
get
{
return _systemInitialization;
}
set
{
_systemInitialization = value;
}
}
public bool Setup
{
get
{
return _setup;
}
set
{
_setup = value;
}
}
public bool Running
{
get
{
return _running;
}
set
{
_running = value;
}
}
public bool Standby
{
get
{
return _standby;
}
set
{
_standby = value;
}
}
public bool SoftFault
{
get
{
return _softFault;
}
set
{
_softFault = value;
}
}
public bool HardFault
{
get
{
return _hardFault;
}
set
{
_hardFault = value;
}
}
#endregion
#region Field
private bool _systemInitialization;
private bool _setup;
private bool _running;
private bool _standby;
private bool _softFault;
private bool _hardFault;
#endregion
}
#endregion
#region Property
///
/// Current soft faults.
///
public SoftFaults CurrentSoftFaults
{
get
{
return _currentSoftFaults;
}
private set
{
_currentSoftFaults = value;
}
}
///
/// Current board faults.
///
public BoardFaults CurrentBoardFaults
{
get
{
return _currentBoardFaults;
}
private set
{
_currentBoardFaults = value;
}
}
///
/// current system status.
///
public SystemStatus CurrentSystemStatus
{
get
{
return _currentSystemStatus;
}
private set
{
_currentSystemStatus = value;
}
}
///
/// curerent system faults.
///
public SystemFaults CurrentSystemFaults
{
get
{
return _currentSystemFaults;
}
private set
{
_currentSystemFaults = value;
}
}
///
/// Current general alarms.
///
public GeneralAlarms CurrentGeneralAlarms
{
get
{
return _currentGeneralAlarms;
}
private set
{
_currentGeneralAlarms = value;
}
}
///
/// Current temperature control faults.
///
public TemperatureControlFaults CurrentTemperatureControlFaults
{
get
{
return _currentTemperatureControlFaults;
}
private set
{
_currentTemperatureControlFaults = value;
}
}
///
/// Current systems state.
///
public SystemState CurrentSystemState
{
get
{
return _currentSystemState;
}
private set
{
_currentSystemState = value;
}
}
///
/// Enable shutter (true : Enable, false : Disable).
///
public bool EnableShutter
{
get
{
return _enableShutter;
}
set
{
_enableShutter = value;
}
}
///
/// Enable Laser diode driver (true : Enable, false : Disable).
///
public bool EnableLdd
{
get
{
return _enableLdd;
}
set
{
_enableLdd = value;
}
}
///
/// Set current (A).
///
public float SetCurrent
{
get
{
return _setCurrent;
}
set
{
_setCurrent = value;
}
}
///
/// Actual current (A).
///
public float ActualCurrent
{
get
{
return _actualCurrent;
}
set
{
_actualCurrent = value;
}
}
///
/// Diode voltage (V).
///
public float DiodeVoltage
{
get
{
return _diodeVoltage;
}
set
{
_diodeVoltage = value;
}
}
///
/// Max current (A).
///
public float MaxCurrent
{
get
{
return _maxCurrent;
}
set
{
_maxCurrent = value;
}
}
///
/// Laser diode driver hours (Hour).
///
public float LddHours
{
get
{
return _lddHours;
}
set
{
_lddHours = value;
}
}
///
/// Pulse Repetition Frequency (Hz).
///
public int Prf
{
get
{
return _prf;
}
set
{
_prf = value;
}
}
///
/// Pulse repetition frequency source.
///
public SourcesType PrfSource
{
get
{
return _prfSource;
}
set
{
_prfSource = value;
}
}
///
/// Gate source.
///
public SourcesType GateSource
{
get
{
return _gateSource;
}
set
{
_gateSource = value;
}
}
///
/// Pulse energy control source.
///
public SourcesType PecSource
{
get
{
return _pecSource;
}
set
{
_pecSource = value;
}
}
///
/// First pulse kill enable (true : Enable, false : Disable).
///
public bool FpkEnable
{
get
{
return _fpkEnable;
}
set
{
_fpkEnable = value;
}
}
///
/// First pulse kill Time (ns).
///
public int FpkRampTime
{
get
{
return _fpkRampTime;
}
set
{
_fpkRampTime = value;
}
}
///
/// First pulse kill Ramp Rate (ns)
///
public int FpkRampRate
{
get
{
return _fpkRampRate;
}
set
{
_fpkRampRate = value;
}
}
///
/// Lpk Enable (true : Enable, false : Disable).
///
public bool LpkEnable
{
get
{
return _lpkEnable;
}
set
{
_lpkEnable = value;
}
}
///
/// LPK Ramp Time (ns).
///
public int LpkRampTime
{
get
{
return _lpkRampTime;
}
set
{
_lpkRampTime = value;
}
}
///
/// LPK Ramp Rate (ns).
///
public int LpkRampRate
{
get
{
return _lpkRampRate;
}
set
{
_lpkRampRate = value;
}
}
///
/// Shg temperature set point (℃).
///
public float ShgTemperatureSetPoint
{
get
{
return _shgTemperatureSetPoint;
}
set
{
_shgTemperatureSetPoint = value;
}
}
///
/// Thg temperature set point (℃).
///
public float ThgTemperatureSetPoint
{
get
{
return _thgTemperatureSetPoint;
}
set
{
_thgTemperatureSetPoint = value;
}
}
///
/// Ld temperature set point (℃).
///
public float LdTemperatureSetPoint
{
get
{
return _ldTemperatureSetPoint;
}
set
{
_ldTemperatureSetPoint = value;
}
}
///
/// Shg actual temperature (℃).
///
public float ShgActualTemperature
{
get
{
return _shgActualTemperature;
}
set
{
_shgActualTemperature = value;
}
}
///
/// Thg actual temperature (℃).
///
public float ThgActualTemperature
{
get
{
return _thgActualTemperature;
}
set
{
_thgActualTemperature = value;
}
}
///
/// Laser diode actual temperature (℃).
///
public float LdActualTemperature
{
get
{
return _ldActualTemperature;
}
set
{
_ldActualTemperature = value;
}
}
///
/// Duty control (true : Enable, false : Disable).
///
public bool DutyControl
{
get
{
return _dutyControl;
}
set
{
_dutyControl = value;
}
}
///
/// Duty control width (us).
///
public float DutyControlWidth
{
get
{
return _dutyControlWidth;
}
set
{
_dutyControlWidth = value;
}
}
///
/// Pulse energy control level (%).
///
public float PecLevel
{
get
{
return _pecLevel;
}
set
{
_pecLevel = value;
}
}
///
/// Burst status (true : Enable, false : Disable).
///
public bool BurstStatus
{
get
{
return _burstStatus;
}
set
{
_burstStatus = value;
}
}
///
/// Burst count.
///
public ushort BurstCount
{
get
{
return _burstCount;
}
set
{
_burstCount = value;
}
}
///
/// Burst rate.
///
public ushort BurstRate
{
get
{
return _burstRate;
}
set
{
_burstRate = value;
}
}
///
/// Burst cycles.
///
public ushort BurstCycles
{
get
{
return _burstCycles;
}
set
{
_burstCycles = value;
}
}
///
/// Burst firing mode.
///
public BurstFiringModeType BurstFiringMode
{
get
{
return _burstFiringMode;
}
set
{
_burstFiringMode = value;
}
}
///
/// Burst trigger source.
///
public BurstTriggerSourceType BurstTriggerSource
{
get
{
return _burstTriggerSource;
}
set
{
_burstTriggerSource = value;
}
}
///
/// Duty control mode.
///
public DutyControlModeType DutyControlMode
{
get
{
return _dutyControlMode;
}
set
{
_dutyControlMode = value;
}
}
///
/// Power monitor reading (W).
///
public float PowerMonitorReading
{
get
{
return _powerMonitorReading;
}
set
{
_powerMonitorReading = value;
}
}
///
/// Flow reading (L/min).
///
public float FlowReading
{
get
{
return _flowReading;
}
set
{
_flowReading = value;
}
}
///
/// Humidity reading (%).
///
public ushort HumidityReading
{
get
{
return _humidityReading;
}
set
{
_humidityReading = value;
}
}
///
/// Ip address.
///
public string IpAddress
{
get
{
return _ipAddress;
}
set
{
_ipAddress = value;
}
}
///
/// Subnet mask.
///
public string SubnetMask
{
get
{
return _subnetMask;
}
set
{
_subnetMask = value;
}
}
///
/// Gateway.
///
public string Gateway
{
get
{
return _gateway;
}
set
{
_gateway = value;
}
}
#endregion
#region Field
private SoftFaults _currentSoftFaults;
private BoardFaults _currentBoardFaults;
private SystemStatus _currentSystemStatus;
private SystemFaults _currentSystemFaults;
private GeneralAlarms _currentGeneralAlarms;
private TemperatureControlFaults _currentTemperatureControlFaults;
private SystemState _currentSystemState;
private bool _enableShutter;
private bool _enableLdd;
private float _setCurrent;
private float _actualCurrent;
private float _diodeVoltage;
private float _maxCurrent;
private float _lddHours;
private int _prf;
private SourcesType _prfSource;
private SourcesType _gateSource;
private SourcesType _pecSource;
private bool _fpkEnable;
private int _fpkRampTime;
private int _fpkRampRate;
private bool _lpkEnable;
private int _lpkRampTime;
private int _lpkRampRate;
private float _shgTemperatureSetPoint;
private float _thgTemperatureSetPoint;
private float _ldTemperatureSetPoint;
private float _shgActualTemperature;
private float _thgActualTemperature;
private float _ldActualTemperature;
private bool _dutyControl;
private float _dutyControlWidth;
private float _pecLevel;
private bool _burstStatus;
private ushort _burstCount;
private ushort _burstRate;
private ushort _burstCycles;
private BurstFiringModeType _burstFiringMode;
private BurstTriggerSourceType _burstTriggerSource;
private DutyControlModeType _dutyControlMode;
private float _powerMonitorReading;
private float _flowReading;
private ushort _humidityReading;
private string _ipAddress;
private string _subnetMask;
private string _gateway;
#endregion
#region Construct
public PiLaserStatus()
{
_currentSoftFaults = new SoftFaults();
_currentBoardFaults = new BoardFaults();
_currentSystemStatus = new SystemStatus();
_currentSystemFaults = new SystemFaults();
_currentGeneralAlarms = new GeneralAlarms();
_currentTemperatureControlFaults = new TemperatureControlFaults();
_currentSystemState = new SystemState();
IpAddress = "000.000.000.000";
SubnetMask = "000.000.000.000";
Gateway = "000.000.000.000";
}
#endregion
#region Function
///
/// Change soft fauls
///
/// Soft faults
public void ChangeSoftFaults(byte softFaults)
{
var bit = new BitArray(new byte[] { softFaults });
_currentSoftFaults.HfSync = bit[0];
_currentSoftFaults.LddInterlock = bit[1];
_currentSoftFaults.ShutterInterlock = bit[2];
_currentSoftFaults.LowExtFrequency = bit[3];
}
///
/// Change board faults
///
/// Board faulse
public void ChangeBoardFaults(byte boardFaults)
{
var bit = new BitArray(new byte[] { boardFaults });
_currentBoardFaults.Main = bit[0];
_currentBoardFaults.Common = bit[1];
_currentBoardFaults.Temperature = bit[2];
_currentBoardFaults.Sensor = bit[3];
_currentBoardFaults.PowerMonitor = bit[4];
_currentBoardFaults.Pulse = bit[5];
_currentBoardFaults.Ldd = bit[6];
_currentBoardFaults.Motor = bit[7];
}
///
/// Change system status.
///
/// System status
public void ChangeSystemStatus(byte systemStatus)
{
var bit = new BitArray(new byte[] { systemStatus });
_currentSystemStatus.PowerOn = bit[0];
_currentSystemStatus.ShutterEnabled= bit[1];
_currentSystemStatus.KeySwitch = bit[2];
_currentSystemStatus.LddOn = bit[3];
_currentSystemStatus.QswOn = bit[4];
_currentSystemStatus.ShutterInterlock = bit[5];
_currentSystemStatus.LddInterlock = bit[6];
}
///
/// Change system faults
///
/// System faults
public void ChangeSystemFaults(byte systemFaults)
{
var bit = new BitArray(new byte[] { systemFaults });
_currentSystemFaults.Memory = bit[0];
_currentSystemFaults.SdCard = bit[1];
_currentSystemFaults.BoardCommunication = bit[2];
_currentSystemFaults.BoardState = bit[3];
}
///
/// Change general alrams
///
/// General alarms
public void ChangeGeneralAlarms(byte generalAlarms)
{
var bit = new BitArray(new byte[] { generalAlarms });
_currentGeneralAlarms.Ldd1 = bit[0];
_currentGeneralAlarms.Ldd2 = bit[1];
_currentGeneralAlarms.Qsw = bit[2];
_currentGeneralAlarms.Flow = bit[3];
_currentGeneralAlarms.Wet = bit[4];
_currentGeneralAlarms.Humidity = bit[5];
_currentGeneralAlarms.HfSync = bit[6];
}
///
/// Change temperature control faults
///
/// Temperature control faults
public void ChangeTemperatureControlFaults(byte temperatureControlFaults)
{
var bit = new BitArray(new byte[] { temperatureControlFaults });
_currentTemperatureControlFaults.TemperatureControlFault0 = bit[0];
_currentTemperatureControlFaults.TemperatureControlFault1 = bit[1];
_currentTemperatureControlFaults.TemperatureControlFault2 = bit[2];
_currentTemperatureControlFaults.TemperatureControlFault3 = bit[3];
_currentTemperatureControlFaults.TemperatureControlFault4 = bit[4];
_currentTemperatureControlFaults.TemperatureControlFault5 = bit[5];
_currentTemperatureControlFaults.TemperatureControlFault6 = bit[6];
_currentTemperatureControlFaults.TemperatureControlFault7 = bit[7];
}
///
/// Change system state
///
/// System state
public void ChangeSystemState(byte systemState)
{
var bit = new BitArray(new byte[] { systemState });
_currentSystemState.SystemInitialization = bit[0];
_currentSystemState.Setup = bit[1];
_currentSystemState.Running = bit[2];
_currentSystemState.Standby = bit[3];
_currentSystemState.SoftFault = bit[4];
_currentSystemState.HardFault = bit[5];
}
#endregion
}
}