using System;
using System.Xml;
using Aitex.Core.RT.Device;
using Aitex.Core.RT.IOCore;
using Aitex.Core.RT.Log;
using Aitex.Core.RT.OperationCenter;
using Venus_RT.Devices.IODevices;
using Aitex.Core.RT.Device.Unit;
namespace Venus_RT.Devices
{
///
/// 先送Setpoint, 然后再设置控制模式, 切换设置模式后立即生效
///
public class IoBacksideHe : BaseDevice, IDevice
{
private readonly MfcBase1 _mfc;
private readonly IoValve _DownValve;
private readonly IoValve _UpValve;
private readonly IoValve _Up2Valve;
private AOAccessor _aoPressure;
private AOAccessor _aoCtrlMode;
private eEvent _lastEvent;
private string _lastLogInfo;
public int MinFlowThreshold { get; set;}
public int MaxFlowThreshold { get; set; }
public bool OutOfRange { get; private set; }
public IoBacksideHe(string module, XmlElement node, string ioModule = "")
{
base.Module = module;
base.Name = node.GetAttribute("id");
base.Display = node.GetAttribute("display");
base.DeviceID = node.GetAttribute("schematicId");
_DownValve = ParseDeviceNode(Module, "downvalve", node);
_UpValve = ParseDeviceNode(Module, "upvalve", node);
_Up2Valve = ParseDeviceNode(Module, "up2valve", node);
_mfc = ParseDeviceNode(Module, "mfc", node);
_aoPressure = ParseAoNode("aoPressureSP", node, ioModule);
_aoCtrlMode = ParseAoNode("aoControlMode", node, ioModule);
}
public bool Initialize()
{
OutOfRange = false;
return true;
}
public void Monitor()
{
if (_mfc != null)
{
if (MinFlowThreshold > 0 && _mfc.FeedBack <= MinFlowThreshold)
{
OutOfRange = true;
_noRepeatLog(eEvent.WARN_BACKSIDE_HE, $"Backside Helium Flow: {_mfc.FeedBack} exceed min threshold value: {MinFlowThreshold}");
}
else if (MaxFlowThreshold > 0 && _mfc.FeedBack >= MaxFlowThreshold)
{
OutOfRange = true;
_noRepeatLog(eEvent.WARN_BACKSIDE_HE, $"Backside Helium Flow: {_mfc.FeedBack} exceed max threshold value: {MaxFlowThreshold}");
}
else
{
OutOfRange = false;
}
}
_DownValve.Monitor();
_mfc?.Monitor();
}
public void Terminate()
{
}
public void Reset()
{
}
public bool SetBacksideHelium(float mTorr)
{
_SetRealFloat(_aoPressure, mTorr);
if (mTorr >= 0.01)
{
_DownValve.TurnValve(true, out _);
//Kepler2300 not define upvalve up2valve
_UpValve?.TurnValve(true, out _);
_Up2Valve?.TurnValve(true, out _);
//this.FlowSP = setpoint;
}
else
{
_DownValve.TurnValve(false, out _);
//Kepler2300 not define upvalve up2valve
_UpValve?.TurnValve(false, out _);
_Up2Valve?.TurnValve(false, out _);
}
SetESCHeControlMode(true);
return true;
}
public bool SetFlowThreshold(int nMin, int nMax)
{
MinFlowThreshold = nMin;
MaxFlowThreshold = nMax;
return true;
}
public void Flow(double setpoint)
{
//setpoint = setpoint / 100 * 4000;
if (setpoint >= 0.01)
{
_DownValve.TurnValve(true, out _);
//this.FlowSP = setpoint;
}
else
{
_DownValve.TurnValve(false, out _);
}
_mfc.Ramp(setpoint, 1000);
SetESCHeControlMode(false);
}
public void SetESCHeControlMode(bool bPressureMode)
{
if(_aoCtrlMode != null)
_SetRealFloat(_aoCtrlMode, bPressureMode ? 1 : 0);
}
private void _noRepeatLog(eEvent evt, string logInfo)
{
if(evt != _lastEvent || logInfo != _lastLogInfo)
{
LOG.Write(evt, Module, logInfo);
_lastEvent = evt;
_lastLogInfo = logInfo;
}
}
}
}