using Aitex.Core.RT.Log;
using Aitex.Core.RT.Routine;
using CyberX8_Core;
using CyberX8_RT.Devices.EFEM;
using CyberX8_RT.Modules.Rinse;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.Routine;
using MECF.Framework.Common.Utilities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CyberX8_RT.Modules.EFEM
{
public class CycleRobotCycleRoutine : ModuleRoutineBase, IRoutine
{
private enum CycleRobotCycleStep
{
LoopStart,
LoopRunRobotCycle,
LoopRunRobotCycleWait,
LoopEnd,
End
}
///
/// Cycle次数
///
private int _cycleTimes;
///
/// 当前处于第几次Cycle
///
private int _currentCycle;
private object[] param;
private RobotCycleRoutine _robotCycleRoutine;
public CycleRobotCycleRoutine(EfemBase efem) : base(ModuleName.EfemRobot)
{
_robotCycleRoutine = new RobotCycleRoutine(efem);
}
public RState Start(params object[] objs)
{
param = objs;
_currentCycle = 1;//初始化当前Cycle次数
if (objs.Length >= 6)
{
_cycleTimes = (int)objs[4];
if (_cycleTimes < 1)
{
LOG.Write(eEvent.ERR_EFEM_ROBOT, Module, $"Input Robot Cycle Times{_cycleTimes} error");
return RState.Failed;
}
}
return Runner.Start(Module, "Start CycleRobotCycleRoutine");
}
public RState Monitor()
{
Runner.LoopStart(CycleRobotCycleStep.LoopStart, "Loop StartCycleRobotCycleRoutine", _cycleTimes, NullFun, _delay_1ms)
.LoopRun(CycleRobotCycleStep.LoopRunRobotCycle, () => _robotCycleRoutine.Start(param) == RState.Running,_delay_1ms)
.LoopRunWithStopStatus(CycleRobotCycleStep.LoopRunRobotCycleWait, () => { return CommonFunction.CheckRoutineEndState(_robotCycleRoutine); },
() => CheckRoutineStopStatus(_robotCycleRoutine, "CycleRobotCycleRoutine failed"))
.LoopEnd(CycleRobotCycleStep.LoopEnd, UpdateCycleCount, _delay_1ms)
.End(CycleRobotCycleStep.End, AchievedCycleCount, _delay_1ms);
return Runner.Status;
}
private bool CheckRoutineStopStatus(IRoutine routine, string error)
{
bool result = CommonFunction.CheckRoutineStopState(routine);
if (result)
{
Stop($"{error}");
}
return result;
}
///
/// Abort
///
public void Abort()
{
Runner.Stop("CycleRobotCycleRoutine Abort");
}
///
/// 统计完成的Cycle次数
///
///
private bool UpdateCycleCount()
{
_currentCycle += 1;
return true;
}
///
///
///
///
private bool AchievedCycleCount()
{
_currentCycle -= 1;
return true;
}
///
/// 获取当前Cycle次数
///
///
public int GetCurrentCycle()
{
return _currentCycle;
}
}
}