using Aitex.Core.RT.Routine; using MECF.Framework.Common.Routine; using CyberX8_Core; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.InteropServices; namespace CyberX8_RT.Modules.LPs { sealed class LoadPortCycleLoadUnloadRoutine : RoutineBase, IRoutine { private enum CycleLoadStep { LoopStart, LoopLoad, LoopLoadWait, LoopDelay, LoopUnload, LoopUnloadWait, LoopEnd, End } #region 内部变量 private LoadPortModule _loadPortModule; private LoadPortLoadRoutine _loadRoutine; private LoadPortUnloadRoutine _unloadRoutine; private int _cycle = 0; #endregion /// /// 构造函数 /// /// public LoadPortCycleLoadUnloadRoutine(LoadPortModule loadPortModule) : base(loadPortModule.Module) { _loadRoutine = new LoadPortLoadRoutine(loadPortModule); _unloadRoutine=new LoadPortUnloadRoutine(loadPortModule); _loadPortModule = loadPortModule; } /// /// Abort /// public void Abort() { Runner.Stop("Manual Abort"); } public RState Monitor() { Runner.LoopStart(CycleLoadStep.LoopStart, "Loop Start Load/Uload", _cycle, NullFun, _delay_1ms) .LoopRun(CycleLoadStep.LoopLoad, () => _loadRoutine.Start() == RState.Running, _delay_1ms) .LoopRunWithStopStatus(CycleLoadStep.LoopLoadWait, () => CheckRoutineEndStatus(_loadRoutine), () => CheckRoutineStopStatus(_loadRoutine)) .LoopDelay(CycleLoadStep.LoopDelay,_delay_2s) .LoopRun(CycleLoadStep.LoopUnload, () => _unloadRoutine.Start() == RState.Running, _delay_1ms) .LoopRunWithStopStatus(CycleLoadStep.LoopUnloadWait, () => CheckRoutineEndStatus(_unloadRoutine), () => CheckRoutineStopStatus(_unloadRoutine)) .LoopEnd(CycleLoadStep.LoopEnd, NullFun, _delay_2s) .End(CycleLoadStep.End, NullFun, _delay_1ms); return Runner.Status; } private bool CheckRoutineEndStatus(IRoutine routine) { return routine.Monitor() == RState.End; } private bool CheckRoutineStopStatus(IRoutine routine) { RState state =routine.Monitor(); if(state==RState.Failed||state==RState.Timeout) { return true; } return false; } public RState Start(params object[] objs) { _cycle=(int)objs[0]; return Runner.Start(Module, "Start cycle Load/Unload"); } } }