using Aitex.Core.RT.Device;
using Aitex.Core.RT.Log;
using Aitex.Core.RT.Routine;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.RecipeCenter;
using MECF.Framework.Common.Routine;
using MECF.Framework.Common.Utilities;
using PunkHPX8_Core;
using PunkHPX8_RT.Devices.VpwCell;
using PunkHPX8_RT.Devices.VpwMain;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace PunkHPX8_RT.Modules.VpwCell
{
public class VpwManualRecipeRoutine : RoutineBase, IRoutine
{
private enum RecipeStep
{
Prepare,
WaitPrepare,
VacuumPrewet,
WaitVacuumPrewet,
VentPrewet,
WaitVentPrewet,
ExtendClean,
WaitExtendClean,
SpinOff,
WaitSpinOff,
StopRotation,
WaitStop,
End
}
#region 内部变量
///
/// 手动Prepare routine
///
private VpwManualPrepareRoutine _manualPrepareRoutine;
///
/// Vacuum prewet routine
///
private VpwVacuumPrewetRoutine _vacuumPrewetRoutine;
///
/// Vent Prewet
///
private VpwVentPrewetRoutine _ventPrewetRoutine;
///
/// Extend clean
///
private VpwExtendCleanRoutine _extendCleanRoutine;
///
/// Spin Off Routine
///
private VpwSpinOffRoutine _spinOffRoutine;
///
/// recipe
///
private VpwRecipe _recipe;
///
/// Cell device
///
private VpwCellDevice _vpwCellDevice;
///
/// Main device
///
private VpwMainDevice _mainDevice;
#endregion
///
/// 构造函数
///
///
public VpwManualRecipeRoutine(string module) : base(module)
{
_manualPrepareRoutine = new VpwManualPrepareRoutine(module);
_vacuumPrewetRoutine=new VpwVacuumPrewetRoutine(module);
_ventPrewetRoutine = new VpwVentPrewetRoutine(module);
_extendCleanRoutine= new VpwExtendCleanRoutine(module);
_spinOffRoutine=new VpwSpinOffRoutine(module);
}
///
/// 中止
///
public void Abort()
{
Runner.Stop("Manual stop");
_mainDevice.VPWBoostPumpTarget = VpwMain.VPWBoostPumpTarget.Pressure;
}
///
/// 监控
///
///
public RState Monitor()
{
Runner.Run(RecipeStep.Prepare, Prepare, _delay_1ms)
.WaitWithStopCondition(RecipeStep.WaitPrepare, () => CommonFunction.CheckRoutineEndState(_manualPrepareRoutine),
() => { return CheckSubRoutineError(_manualPrepareRoutine, _manualPrepareRoutine, 0); })
.Run(RecipeStep.VacuumPrewet, VacuumPrewet)
.WaitWithStopCondition(RecipeStep.WaitVacuumPrewet, () => CommonFunction.CheckRoutineEndState(_vacuumPrewetRoutine),
() => { return CheckSubRoutineError(_vacuumPrewetRoutine, _vacuumPrewetRoutine, 1); })
.Run(RecipeStep.VentPrewet, VentPrewet)
.WaitWithStopCondition(RecipeStep.WaitVentPrewet, () => CommonFunction.CheckRoutineEndState(_ventPrewetRoutine),
() => { return CheckSubRoutineError(_ventPrewetRoutine, _ventPrewetRoutine, 2); })
.Run(RecipeStep.ExtendClean, ExtendClean)
.WaitWithStopCondition(RecipeStep.WaitExtendClean, () => CommonFunction.CheckRoutineEndState(_extendCleanRoutine),
() => { return CheckSubRoutineError(_extendCleanRoutine, _extendCleanRoutine, 3); })
.Run(RecipeStep.SpinOff, SpinOff)
.WaitWithStopCondition(RecipeStep.WaitSpinOff, () => CommonFunction.CheckRoutineEndState(_spinOffRoutine),
() => { return CheckSubRoutineError(_spinOffRoutine, _spinOffRoutine, 4); })
.Run(RecipeStep.StopRotation, StopRotation, _delay_1ms)
.WaitWithStopCondition(RecipeStep.WaitStop, CheckStopEndStatus, CheckStopErrorStatus)
.End(RecipeStep.End, End, _delay_1ms);
return Runner.Status;
}
///
/// Prepare
///
///
private bool Prepare()
{
return _manualPrepareRoutine.Start(_recipe) == RState.Running;
}
///
/// Vacuum Prewet
///
///
private bool VacuumPrewet()
{
return _vacuumPrewetRoutine.Start(_recipe) == RState.Running;
}
///
/// Vent Prewet
///
///
private bool VentPrewet()
{
return _ventPrewetRoutine.Start(_recipe) == RState.Running;
}
///
/// Extend Clean
///
///
private bool ExtendClean()
{
return _extendCleanRoutine.Start(_recipe) == RState.Running;
}
///
/// Vacuum Prewet
///
///
private bool SpinOff()
{
return _spinOffRoutine.Start(_recipe) == RState.Running;
}
///
/// 检验子routine异常
///
///
///
///
///
private bool CheckSubRoutineError(IRoutine routine,RoutineBase routineBase,int index)
{
bool result = CommonFunction.CheckRoutineStopState(routine);
if (result)
{
NotifyError(eEvent.ERR_VPW, routineBase.ErrorMsg, index);
}
return result;
}
///
/// 停止rotation
///
///
private bool StopRotation()
{
bool result = _vpwCellDevice.StopProfilePosition();
if (!result)
{
NotifyError(eEvent.ERR_VPW, "Stop rotation failed", 0);
}
return result;
}
///
/// 检验停止完成状态
///
///
private bool CheckStopEndStatus()
{
return _vpwCellDevice.CheckRotationEndStatus();
}
///
/// 检验停止异常
///
///
private bool CheckStopErrorStatus()
{
bool result = _vpwCellDevice.CheckRotationStopStatus();
if (result)
{
NotifyError(eEvent.ERR_VPW, "Stop rotation failed", 0);
}
return result;
}
///
/// 结束
///
///
private bool End()
{
_mainDevice.VPWBoostPumpTarget = VpwMain.VPWBoostPumpTarget.Pressure;
_mainDevice.BoosterPumpDisableOperation("", null);
return true;
}
///
/// 启动
///
///
///
public RState Start(params object[] objs)
{
_recipe = objs[0] as VpwRecipe;
_vpwCellDevice = DEVICE.GetDevice(Module);
_mainDevice = DEVICE.GetDevice(ModuleName.VPWMain1.ToString());
return Runner.Start(Module, "start run manual recipe");
}
}
}