using Aitex.Core.RT.Device;
using Aitex.Core.RT.Log;
using Aitex.Core.RT.RecipeCenter;
using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
using MECF.Framework.Common.RecipeCenter;
using MECF.Framework.Common.Routine;
using MECF.Framework.Common.Utilities;
using CyberX8_Core;
using CyberX8_RT.Devices.AXIS;
using CyberX8_RT.Devices.Facilities;
using CyberX8_RT.Devices.SRD;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace CyberX8_RT.Modules.SRD
{
internal class SRDPresenceTestRoutine : RoutineBase, IRoutine
{
private enum PresenceTestStep
{
Ready,
CloseDoor,
CheckCloseDoor,
ChuckVacuumOn,
RunWafer,
RunWaferWait,
InitialUnloadingStateMachine,
Unloading,
UnloadingWait,
End
}
#region 内部变量
///
/// Rotation Axis
///
private JetAxisBase _rotationAxis;
///
/// Arm Axis
///
private JetAxisBase _armAxis;
///
/// SRD Common
///
private SrdCommonDevice _srdCommon;
///
/// recipe名称
///
private string _recipe;
///
/// SRD Recipe
///
private SrdRecipe _srdRecipe;
///
/// Module
///
private string _module;
///
/// Wafer Presence Test功能是否启用
///
private bool _presenceTestEnabled;
///
/// Run wafer Recipe Routine
///
private SRDRunWaferRecipeRoutine _runWaferRecipRoutine;
///
/// Unload Routine
///
private SRDUnloadRoutine _unloadRoutine;
#endregion
#region 属性
///
/// 当前子状态机
///
public string CurrentStateMachine
{
get { return GetCurrentStateMachine(); }
}
#endregion
///
/// 构造函数
///
///
public SRDPresenceTestRoutine(string module) : base(module)
{
_module = module;
_srdCommon = DEVICE.GetDevice($"{module}.Common");
_runWaferRecipRoutine = new SRDRunWaferRecipeRoutine(module);
_unloadRoutine = new SRDUnloadRoutine(module);
}
///
/// Abort
///
public void Abort()
{
if(_unloadRoutine.Monitor() == RState.Running)
{
_unloadRoutine.Abort();
}
if (_runWaferRecipRoutine.Monitor() == RState.Running)
{
_runWaferRecipRoutine.Abort();
}
Runner.Stop("Presence Test Abort");
if (_srdCommon != null)
{
_srdCommon.EnterErrorOperation();
}
}
public RState Monitor()
{
Runner.Wait(PresenceTestStep.Ready, CheckReadyStatus, _delay_1ms)
.Run(PresenceTestStep.CloseDoor, CloseDoor, CheckDoorClosed, _delay_1s)
.Run(PresenceTestStep.ChuckVacuumOn, EngageChuckVacuum, CheckVacuum, _delay_1s)
.Run(PresenceTestStep.RunWafer, () => { return StartRunWaferRecipeRoutine(_recipe); }, _delay_1ms)
.WaitWithStopCondition(PresenceTestStep.RunWaferWait, CheckRunWaferRoutineCompleteStatus, CheckRunWaferRoutineErrorStatus)
.Run(PresenceTestStep.Unloading, () => { return StartUnloadingRoutine(); }, _delay_1ms)
.WaitWithStopCondition(PresenceTestStep.UnloadingWait, CheckUnloadingRoutineCompleteStatus, CheckUnloadingRoutineErrorStatus)
.End(PresenceTestStep.End, NullFun, _delay_1ms);
return Runner.Status;
}
///
/// 启动
///
///
///
public RState Start(params object[] objs)
{
_recipe = objs[0].ToString();
_srdRecipe = RecipeFileManager.Instance.LoadGenericityRecipe(_recipe);
if (_srdRecipe == null)
{
LOG.WriteLog(eEvent.INFO_SRD, Module.ToString(), $"Start Run Wafer State Machine, recipe[{_recipe}] is null");
return RState.Failed;
}
Runner.Start(Module, "PresenceTest");
return RState.Running;
}
private bool CheckReadyStatus()
{
//Arm是否开启,是否home
_armAxis = DEVICE.GetDevice($"{_module}.Arm");
if (_armAxis.IsSwitchOn)
{
if (!_armAxis.IsHomed)
{
LOG.WriteLog(eEvent.ERR_SRD, _module, "Arm is not swicth on");
return false;
}
}
else
{
LOG.WriteLog(eEvent.ERR_SRD, _module, "Arm is not home");
return false;
}
//Rotation是否开启,是否home
_rotationAxis = DEVICE.GetDevice($"{_module}.Rotation");
if (_rotationAxis.IsSwitchOn)
{
if (!_rotationAxis.IsHomed)
{
LOG.WriteLog(eEvent.ERR_SRD, _module, "Rotation is not homed");
return false;
}
}
else
{
LOG.WriteLog(eEvent.ERR_SRD, _module, "Rotation is not switched on ");
return false;
}
//检查N2与CDA
SystemFacilities systemFacilities = DEVICE.GetDevice("System.Facilities");
var result = systemFacilities.CheckCDAN2();
if (!result.result)
{
LOG.WriteLog(eEvent.ERR_SRD, _module, $"CheckCDAN2 is failed");
return false;
}
//Wafer Presence Test功能是否开启
if (SC.ContainsItem($"SRD.{_module}EnablePresenceCheckvalue"))
{
_presenceTestEnabled = SC.GetValue($"SRD.{_module}EnablePresenceCheckvalue");
if (!_presenceTestEnabled)
{
LOG.WriteLog(eEvent.ERR_SRD, _module, $"{_module}EnablePresenceCheckvalue is unable");
return false;
}
}
else
{
LOG.WriteLog(eEvent.ERR_SRD, _module, $"Config dosen't have EnablePresenceCheckvalue");
return false;
}
return true;
}
///
/// Close Door
///
///
///
private bool CloseDoor()
{
bool result = _srdCommon.DoorCloseAction("", null);
if (!result)
{
return false;
}
return result;
}
///
/// 检验DoorClosed
///
///
///
private bool CheckDoorClosed()
{
if (_srdCommon.Status == RState.Failed || _srdCommon.Status == RState.Timeout)
{
return false;
}
return _srdCommon.Status == RState.End && _srdCommon.CommonData.DoorClosed;
}
///
/// Chuck Vacuum On
///
///
///
private bool EngageChuckVacuum()
{
bool result = _srdCommon.ChuckVacuumOnAction("", null);
if (!result)
{
return false;
}
return result;
}
///
/// 检查真空状态
///
///
///
private bool CheckVacuum()
{
if (_srdCommon.Status == RState.Failed || _srdCommon.Status == RState.Timeout)
{
return false;
}
return _srdCommon.Status == RState.End && !_srdCommon.CommonData.ChuckVacuum;
}
#region SRD RunWaferRecipeRoutine
///
/// 启动RunWaferRecipeRoutine
///
///
///
private bool StartRunWaferRecipeRoutine(string recipe)
{
bool presenceTestFlag = true;
return _runWaferRecipRoutine.Start(_srdRecipe, presenceTestFlag) == RState.Running;
}
///
/// 检验RunWaferRecipeRoutine是否完成
///
///
private bool CheckRunWaferRoutineCompleteStatus()
{
return CommonFunction.CheckRoutineEndState(_runWaferRecipRoutine);
}
///
/// 检验RunWaferRecipeRoutine是否出错
///
///
private bool CheckRunWaferRoutineErrorStatus()
{
bool result = CommonFunction.CheckRoutineStopState(_runWaferRecipRoutine);
if (result && _srdCommon != null)
{
_srdCommon.EnterErrorOperation();
}
return result;
}
#endregion
#region SRD UnloadingRoutine
///
/// 启动UnloadingRoutine
///
///
///
private bool StartUnloadingRoutine()
{
return _unloadRoutine.Start() == RState.Running;
}
///
/// 检验UnloadingRoutine是否完成
///
///
private bool CheckUnloadingRoutineCompleteStatus()
{
return CommonFunction.CheckRoutineEndState(_unloadRoutine);
}
///
/// 检验UnloadingRoutine是否出错
///
///
private bool CheckUnloadingRoutineErrorStatus()
{
return CommonFunction.CheckRoutineStopState(_unloadRoutine);
}
#endregion
///
/// 获取当前子状态机
///
private string GetCurrentStateMachine()
{
string result;
if (Runner.CurrentStep.ToString() == "Ready")
{
result = "Ready";
}
else if (Runner.CurrentStep.ToString().Contains("RunWafer"))
{
result = _runWaferRecipRoutine.CurrentStep;
}
else if (Runner.CurrentStep.ToString().Contains("Unloading"))
{
result = _unloadRoutine.CurrentStep;
}
else
{
result = "End";
}
return result;
}
}
}