using Aitex.Core.RT.Device;
using Aitex.Core.RT.Log;
using Aitex.Core.RT.RecipeCenter;
using Aitex.Core.RT.Routine;
using MECF.Framework.Common.RecipeCenter;
using MECF.Framework.Common.Routine;
using CyberX8_Core;
using CyberX8_RT.Devices.LinMot;
using CyberX8_RT.Devices.Prewet;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CyberX8_RT.Modules.Prewet
{
public class PrewetManualProcessRecipeRoutine : RoutineBase, IRoutine
{
private enum ProcessRecipeStep
{
Process,
WaitProcess,
End
}
private enum ProcessAbortStep
{
PumpValvaClose,
AbortLinmot,
TerminateStateMachine,
End
}
#region 内部变量
///
/// LintMot Axis
///
private LinMotAxis _linmotAxis;
///
/// recipe对象
///
private PwtRecipe _recipe;
///
/// Process状态机
///
private PrewetProcessStateMachine _processStateMachine;
public PrewetProcessStateMachine prewetProcessStateMachine { get { return _processStateMachine; } }
///
/// prewetDevice对象
///
private PrewetDevice _prewetDevice;
#endregion
///
/// 构造函数
///
///
public PrewetManualProcessRecipeRoutine(string module,LinMotAxis linMotAxis) : base(module)
{
_linmotAxis = linMotAxis;
_prewetDevice=DEVICE.GetDevice(Module);
}
///
/// 中止
///
public void Abort()
{
Runner.Stop("Manual abort");
_processStateMachine.Terminate();
_linmotAxis.AbortCurrentRoutine();
_prewetDevice.PumpValveClose();
}
///
/// 监控
///
///
public RState Monitor()
{
Runner.Run(ProcessRecipeStep.Process, StartProcess, _delay_1ms)
.WaitWithStopCondition(ProcessRecipeStep.WaitProcess, WaitProcessComplete, CheckProcessError)
.End(ProcessRecipeStep.End, NullFun, _delay_1ms);
return Runner.Status;
}
///
/// 启动Process
///
///
private bool StartProcess()
{
return _processStateMachine.CheckToPostMessage(eEvent.ERR_PREWET, Module.ToString(),
(int)PrewetProcessStateMachine.PrewetProcessMsg.ProcessStart, _recipe);
}
///
/// 等待Process结束
///
///
private bool WaitProcessComplete()
{
bool retult= _processStateMachine.State == PrewetProcessStateMachine.PrewetProcessState.Idle.ToString();
return retult;
}
///
/// 检验Process过程是否出现错误
///
///
private bool CheckProcessError()
{
return _processStateMachine.State==PrewetProcessStateMachine.PrewetProcessState.Error.ToString();
}
///
/// 启动
///
///
///
public RState Start(params object[] objs)
{
string recipe = objs[0].ToString();
PwtRecipe pwtRecipe = RecipeFileManager.Instance.LoadGenericityRecipe(recipe);
if (pwtRecipe == null)
{
LOG.WriteLog(eEvent.ERR_PREWET, Module, $"invalid {recipe} recipe");
return RState.Failed;
}
_recipe = pwtRecipe;
_processStateMachine = new PrewetProcessStateMachine(Module, _linmotAxis);
_processStateMachine.Initialize();
return Runner.Start(Module, "Manual Process Recipe");
}
}
}