using Aitex.Core.RT.Device;
using Aitex.Core.RT.Log;
using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
using Aitex.Core.Util;
using MECF.Framework.Common.Alarm;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.RecipeCenter;
using MECF.Framework.Common.Routine;
using MECF.Framework.Common.SubstrateTrackings;
using PunkHPX8_Core;
using PunkHPX8_RT.Devices.AXIS;
using PunkHPX8_RT.Devices.VpwCell;
using PunkHPX8_RT.Devices.VpwMain;
using PunkHPX8_RT.Modules.VpwMain;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PunkHPX8_RT.Modules.VpwCell
{
public class VpwSpinOffRoutine : RoutineBase, IRoutine
{
private enum PrepareStep
{
CloseCellValve,
LoopStart,
LoopRun,
LoopEnd,
End
}
#region 内部变量
///
/// recipe
///
private VpwRecipe _recipe;
///
/// 设备
///
private VpwCellDevice _vpwCellDevice;
///
/// Main设备
///
private VpwMainDevice _mainDevice;
///
/// Lid Release Pressure
///
private int _lidReleasePressure = 730;
///
/// Lid Release Pressure
///
private int _lidReleasePressureTimeout = 10000;
///
/// 总时长
///
private int _totalMicrosecond = 0;
///
/// 步骤
///
private int _stepIndex = 0;
///
/// 启动步骤时间
///
private DateTime _startStepTime = DateTime.Now;
#endregion
///
/// 构造函数
///
///
public VpwSpinOffRoutine(string module) : base(module)
{
}
///
/// 中止
///
public void Abort()
{
Runner.Stop("Manual abort");
}
///
/// 监控
///
///
public RState Monitor()
{
Runner.Run(PrepareStep.CloseCellValve,CloseCellValve,_delay_1ms)
.LoopStart(PrepareStep.LoopStart,"Loop Step",1,NullFun,_delay_1ms)
.LoopRunWithStopStatus(PrepareStep.LoopRun, CheckStepComplete, () => { return false; }, _totalMicrosecond + 60 * 1000)//总时长再延迟1分种
.LoopEnd(PrepareStep.LoopEnd,NullFun,_delay_1ms)
.End(PrepareStep.End,NullFun,_delay_1ms);
return Runner.Status;
}
///
/// 打开相应的cell valve
///
///
private bool CloseCellValve()
{
int count = 0;
count += _vpwCellDevice.FlowDripOff()?1:0;
count += _vpwCellDevice.FlowLargeOff() ? 1 : 0;
count += _vpwCellDevice.FlowSmallOff() ? 1 : 0;
bool result= count == 3;
if (!result)
{
NotifyError(eEvent.ERR_VPW, "close cell valve failed", 0);
}
_totalMicrosecond += _recipe.SpinTime * 1000;
_startStepTime = DateTime.Now;
_stepIndex = 0;
return result;
}
///
/// 检验步骤是否完成
///
///
private bool CheckStepComplete()
{
_mainDevice.CellFlow = _vpwCellDevice.CommonData.DiwFlow;
if (_stepIndex >= 1)
{
LOG.WriteLog(eEvent.INFO_VPW, Module, $"step {_stepIndex} is over step count 1");
return true;
}
int length = _recipe.SpinTime;
if (DateTime.Now.Subtract(_startStepTime).TotalSeconds >= length)
{
_stepIndex++;
_startStepTime = DateTime.Now;
if (_stepIndex >= 1)
{
LOG.WriteLog(eEvent.INFO_VPW, Module, $"step {_stepIndex} is over step count 1");
return true;
}
bool result = _vpwCellDevice.ChangeRotationSpeed(_recipe.SpinSpeed*6);
if (result)
{
LOG.WriteLog(eEvent.INFO_VPW, Module, $"step {_stepIndex} complete");
}
return result;
}
int firstDelay = SC.GetValue($"{Module}.FlowCheckDelay") * 1000;
if (DateTime.Now.Subtract(_startStepTime).TotalMilliseconds >= firstDelay)
{
bool abnormal = CheckDisable();
if (abnormal)
{
return false;
}
}
return false;
}
///
/// 检验数据
///
///
private bool CheckDisable()
{
bool isSimulatorMode = SC.GetValue("System.IsSimulatorMode");
if (!isSimulatorMode)
{
if (!_vpwCellDevice.CheckRotationRunning())
{
NotifyError(eEvent.ERR_VPW, $"{Module} rotation is stopped", 0);
Abort();
return true;
}
}
return false;
}
///
/// 启动
///
///
///
public RState Start(params object[] objs)
{
_recipe=(VpwRecipe)objs[0];
_vpwCellDevice = DEVICE.GetDevice(Module);
_mainDevice = DEVICE.GetDevice(ModuleName.VPWMain1.ToString());
_lidReleasePressure = SC.GetValue($"{Module}.LidReleasePressure");
_lidReleasePressureTimeout = SC.GetValue($"{Module}.LidReleasePressureTimeout");
_totalMicrosecond = 0;
_stepIndex = 0;
return Runner.Start(Module, $"{Module} spin off");
}
///
/// 重试
///
///
public RState Retry(int step)
{
if (_recipe == null)
{
NotifyError(eEvent.ERR_VPW, "recipe is null", -1);
return RState.Failed;
}
List preStepIds = new List();
return Runner.Retry(PrepareStep.CloseCellValve, preStepIds, Module, "Spin off Retry");
}
}
}