using Aitex.Core.RT.Device;
using Aitex.Core.RT.Log;
using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
using CyberX8_Core;
using CyberX8_RT.Devices.Metal;
using CyberX8_RT.Devices.Reservoir;
using MECF.Framework.Common.Persistent.Reservoirs;
using MECF.Framework.Common.RecipeCenter;
using MECF.Framework.Common.Routine;
using MECF.Framework.Common.ToolLayout;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CyberX8_RT.Modules.Metal
{
public class CompactEmbranceInitializeRoutine : RoutineBase, IRoutine
{
private enum InitializeStep
{
CheckPowerSupplierConnected,
LinmotReset,
LinmotResetWait,
WHUnclampOn,
FlowValveOn,
Delay,
ManualFlowCheck,
AutoFlowCheck,
End
}
#region 内部变量
///
/// 持久化对象
///
private MetalPersistentValue _persistentValue;
///
/// 设备对象
///
private CompactMembranMetalDevice _metalDevice;
///
/// Reservoir Recipe
///
private ResRecipe _resRecipe;
///
/// Cell Flow Delay Time
///
private int _cellFlowFaultHoldOffTime = 5000;
///
/// Cell Flow Start Low Limit
///
private double _cellFlowStartLowLimit = 3.0;
#endregion
///
/// 构造函数
///
///
public CompactEmbranceInitializeRoutine(string module) : base(module)
{
}
///
/// 中止
///
public void Abort()
{
Runner.Stop("Manual Abort");
}
///
/// 监控
///
///
public RState Monitor()
{
Runner.Run(InitializeStep.CheckPowerSupplierConnected, CheckPowerSupplierStatus, _delay_1ms)
.Run(InitializeStep.LinmotReset, _metalDevice.ResetLinmot, _delay_1ms)
.WaitWithStopCondition(InitializeStep.LinmotResetWait, _metalDevice.CheckLinmotRoutineEnd, _metalDevice.CheckLinmotRoutineError)
.Run(InitializeStep.WHUnclampOn, WaferHolderUnclampOn, _delay_1ms)
.Run(InitializeStep.FlowValveOn, () => _metalDevice.CellFlowValveOn("", null), _delay_1ms)
.Delay(InitializeStep.Delay, _cellFlowFaultHoldOffTime)
.RunIf(InitializeStep.ManualFlowCheck, _metalDevice.IsManual, ManualFlowCheck, _delay_1ms)
.RunIf(InitializeStep.AutoFlowCheck, _metalDevice.IsAuto, AutoFlowCheck, _delay_1ms)
.End(InitializeStep.End, NullFun, _delay_1ms);
return Runner.Status;
}
///
/// 检验Metal A/B 面PowerSupplier通讯状况
///
///
private bool CheckPowerSupplierStatus()
{
if (!_metalDevice.SideAPowerSupplier.IsConnected)
{
LOG.WriteLog(eEvent.ERR_METAL, Module, "side A power is not connected");
return false;
}
if (!_metalDevice.SideBPowerSupplier.IsConnected)
{
LOG.WriteLog(eEvent.ERR_METAL, Module, "side B power is not connected");
return false;
}
return true;
}
///
/// WaferHolder Unclamp on
///
///
private bool WaferHolderUnclampOn()
{
return _metalDevice.WaferHolderUnclampOn("", null);
}
///
/// 手动检验Flow
///
///
private bool ManualFlowCheck()
{
if (_metalDevice.MetalDeviceData.CellFlow < _cellFlowStartLowLimit)
{
LOG.WriteLog(eEvent.ERR_METAL, Module, $"Flow {_metalDevice.MetalDeviceData.CellFlow} is less than {_cellFlowStartLowLimit}");
_metalDevice.CellFlowValveOff("", null);
return false;
}
return true;
}
///
/// 自动检验Flow
///
///
private bool AutoFlowCheck()
{
if (_metalDevice.MetalDeviceData.CellFlow < _resRecipe.CAFlowRateErrorLow)
{
LOG.WriteLog(eEvent.ERR_METAL, Module, $"Flow {_metalDevice.MetalDeviceData.CellFlow} is less than {_resRecipe.CAFlowRateErrorLow}");
return false;
}
return true;
}
///
/// 启动
///
///
///
public RState Start(params object[] objs)
{
_persistentValue = (MetalPersistentValue)objs[0];
_metalDevice = DEVICE.GetDevice(Module);
_cellFlowFaultHoldOffTime = SC.GetValue("Metal.CellFlowFaultHoldOffTime");
_cellFlowStartLowLimit = SC.GetValue("Metal.CellFlowStartLowLimit");
string reservoir = ReservoirItemManager.Instance.GetReservoirByMetal(Module.ToString());
CompactMembranReservoirDevice reservoirDevice = DEVICE.GetDevice(reservoir);
if (reservoirDevice == null)
{
LOG.WriteLog(eEvent.ERR_METAL, Module, $"{reservoir} device is null");
return RState.Failed;
}
if (reservoirDevice.Recipe == null)
{
LOG.WriteLog(eEvent.ERR_METAL, Module, $"{reservoir} current recipe is null");
return RState.Failed;
}
_resRecipe = reservoirDevice.Recipe;
return Runner.Start(Module, "Start C&M Initialize");
}
}
}