using System;
using System.Collections.Generic;
using Aitex.Core.Common;
using Aitex.Core.RT.Event;
using Aitex.Core.Util;
using Aitex.Sorter.Common;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.SubstrateTrackings;
using VirgoCommon;
using VirgoRT.Device;
using VirgoRT.Device.YASKAWA;
using System.Diagnostics;
using System.Threading;
using Aitex.Core.RT.Log;
namespace VirgoRT.Devices
{
///
/// Base action
///
abstract class EfemActionBase : ActionBase
{
protected readonly EfemBase _efem;
public EfemOperation Type { get; protected set; }
protected EfemActionBase() : this(null) { }
protected EfemActionBase(EfemBase efem) : base(ModuleName.EFEM)
{
_efem = efem;
}
}
class DelayAction : ActionBase
{
private readonly DeviceTimer _timer = new DeviceTimer();
private readonly ushort _delayTime;
public bool IsDone => _timer.IsTimeout();
public DelayAction(ushort delaytime) : base(ModuleName.System)
{
this._delayTime = delaytime;
}
public override void Execute()
{
_timer.Start(this._delayTime * 1000);
}
public override void OnPostWork(string data)
{
EV.PostInfoLog(ModuleName.EFEM.ToString(), $"Delay time [{_delayTime}]");
}
}
}
namespace VirgoRT.Devices.YASKAWA
{
class EfemAction : EfemActionBase
{
public EfemAction(EfemBase device, ModuleName mod) : base(device)
{ }
public override void Execute()
{
_efem.MsgHandler.Send(new EfemMessage
{
Operation = this.Type,
Head = EfemMessage.MsgHead.MOV,
Parameters = new List { Constant.ModuleString[this.Module] }
});
base.Execute();
_efem.Status = DeviceState.Busy;
EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} Start");
}
public override void OnPostWork(string data = null)
{
_efem.Status = DeviceState.Idle;
EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} End");
}
}
///
///
///
class HomeAllAction : EfemAction
{
public HomeAllAction(EfemBase efem, ModuleName mod) : base(efem, mod)
{
Type = EfemOperation.Home;
this.Module = mod;
}
}
class HomeModuleAction : EfemAction
{
public HomeModuleAction(EfemBase efem, ModuleName mod) : base(efem, mod)
{
Type = EfemOperation.Home;
this.Module = mod;
}
}
class OrgshAction : EfemAction
{
public OrgshAction(EfemBase efem, ModuleName mod) : base(efem, mod)
{
Type = EfemOperation.Orgsh;
this.Module = mod;
}
}
class TrackAction : EfemAction
{
public TrackAction(EfemBase efem, ModuleName mod) : base(efem, mod)
{
//Type = EfemOperation.;
this.Module = mod;
}
}
class ClearErrorAction : EfemAction
{
public ClearErrorAction(EfemBase efem) : base(efem, ModuleName.EFEM)
{
Type = EfemOperation.ClearError;
IsBackground = true;
}
public override void Execute()
{
_efem.MsgHandler.Send(new EfemMessage
{
Operation = this.Type,
Head = EfemMessage.MsgHead.SET,
Parameters = new List { "CLEAR" }
});
this.Status = ActionStatus.SendCmd;
EV.PostInfoLog(this.Module.ToString(), "清除 EFEM 所有错误");
}
}
class MapAction : EfemAction
{
public MapAction(EfemBase efem, ModuleName mod) : base(efem, mod)
{
Type = EfemOperation.Map;
this.Module = mod;
}
public override void OnPostWork(string data)
{
_efem[Module].Status = DeviceState.Idle;
}
}
class PickAction : EfemAction
{
private MoveParam MoveParam { get; }
public PickAction(EfemBase efem, MoveParam mp) : base(efem, ModuleName.EFEM)
{
Type = EfemOperation.Pick;
MoveParam = mp;
}
public override void Execute()
{
//MOV:LOAD/P113/ARM2;
_efem.MsgHandler.Send(new EfemMessage
{
Operation = this.Type,
Head = EfemMessage.MsgHead.MOV,
Parameters = new List
{
MoveParam.SrcPos.ToHWString(),
Constant.ArmString[MoveParam.Arm],
MoveParam.WaferSize.ToString()
}
});
this.Status = ActionStatus.SendCmd;
_efem.Status = DeviceState.Busy;
}
public override void OnPostWork(string data)
{
WaferManager.Instance.WaferMoved(MoveParam.SrcModule, MoveParam.SrcSlot, MoveParam.DestModule, MoveParam.DestSlot);
_efem.Status = DeviceState.Idle;
//_bladeTarget = ModuleName.EfemRobot;
}
}
class PlaceAction : EfemAction
{
private MoveParam MoveParam { get; }
public PlaceAction(EfemBase device, MoveParam mp) : base(device, ModuleName.EFEM)
{
Type = EfemOperation.Place;
MoveParam = mp;
}
public override void Execute()
{
_efem.MsgHandler.Send(new EfemMessage
{
Operation = this.Type,
Head = EfemMessage.MsgHead.MOV,
Parameters = new List
{
MoveParam.DestPos.ToHWString(),
Constant.ArmString[MoveParam.Arm],
MoveParam.WaferSize.ToString()
}
});
this.Status = ActionStatus.SendCmd;
_efem.Status = DeviceState.Busy;
}
public override void OnPostWork(string data)
{
WaferManager.Instance.WaferMoved(MoveParam.SrcModule, MoveParam.SrcSlot, MoveParam.DestModule, MoveParam.DestSlot);
_efem.Status = DeviceState.Idle;
}
}
class GotoAction : EfemAction
{
private MoveParam MoveParam { get; }
public GotoAction(EfemBase device, MoveParam mp) : base(device, ModuleName.EFEM)
{
Type = EfemOperation.Goto;
MoveParam = mp;
}
public override void Execute()
{
_efem.MsgHandler.Send(new EfemMessage
{
Operation = this.Type,
Head = EfemMessage.MsgHead.MOV,
Parameters = new List
{
MoveParam.DestPos.ToHWString(),
Constant.ArmString[MoveParam.Arm],
MoveParam.WaferSize.ToString()
}
});
this.Status = ActionStatus.SendCmd;
_efem.Status = DeviceState.Busy;
}
public override void OnPostWork(string data)
{
_efem.Status = DeviceState.Idle;
}
}
class ExtendAction : EfemAction
{
private ExtendParam ExtParam { get; }
public ExtendPos TargetPosition => ExtParam.Pos;
public ExtendAction(EfemBase efem, ExtendParam ep)
: base(efem, ModuleName.EFEM)
{
Type = EfemOperation.Extend;
ExtParam = ep;
ExtParam.Arm = ep.Arm;
}
public override void Execute()
{
//MOV:EXTEND/LLA03/ARM2;
_efem.MsgHandler.Send(new EfemMessage
{
Operation = this.Type,
Head = EfemMessage.MsgHead.MOV,
Parameters = new List
{
ExtParam.Module.ToHWString(),
//Constant.ExtendPosString[ExtParam.Pos],
ExtParam.Pos.ToString(),
Constant.ArmString[ExtParam.Arm]
}
});
this.Status = ActionStatus.SendCmd;
_efem.Status = DeviceState.Busy;
}
public override void OnPostWork(string data)
{
_efem.Status = DeviceState.Idle;
switch (TargetPosition)
{
case ExtendPos.PB:
LOG.Write($"robot extend PB put: arm {ExtParam.Arm}, module {ExtParam.Module}");
//WaferManager.Instance.WaferMoved(ModuleName.EfemRobot, (int)ExtParam.Arm, ExtParam.Module, 0);
break;
case ExtendPos.G4:
LOG.Write($"robot extend G4 get: arm {ExtParam.Arm}, module {ExtParam.Module}");
// WaferManager.Instance.WaferMoved(ExtParam.Module, 0, ModuleName.EfemRobot, (int)ExtParam.Arm);
break;
default:
Debug.WriteLine($"MNPT:{TargetPosition} 不需要更新 WaferManager 信息");
break;
}
}
}
class GripAction : EfemAction
{
private Hand _blade;
private bool _isGrip;
public GripAction(EfemBase efem, Hand blade, bool isGrip)
: base(efem, ModuleName.EFEM)
{
Type = EfemOperation.Grip;
_blade = blade;
_isGrip = isGrip;
}
public override void Execute()
{
_efem.MsgHandler.Send(new EfemMessage
{
Operation = this.Type,
Head = EfemMessage.MsgHead.SET,
Parameters = new List
{
_isGrip ? "ON":"OFF",
Constant.ArmString[_blade]
}
});
this.Status = ActionStatus.SendCmd;
_efem.Status = DeviceState.Busy;
}
public override void OnPostWork(string data)
{
_efem.Status = DeviceState.Idle;
if (_blade == Hand.Blade1)
_efem.GripStateBlade1 = _isGrip ? "ON" : "OFF";
if (_blade == Hand.Blade2)
_efem.GripStateBlade2 = _isGrip ? "ON" : "OFF";
}
}
class LiftAction : EfemAction
{
// MOV:LIFT/ALIGN1;
public LiftAction(EfemBase device, ModuleName mod) : base(device, mod)
{
Type = EfemOperation.Lift;
Module = mod;
}
public override void OnPostWork(string data)
{ }
}
class AlignAction : EfemAction
{
private WaferSize _ws { get; }
public AlignAction(EfemBase device, ModuleName mod, WaferSize size) : base(device, mod)
{
Type = EfemOperation.Align;
this.Module = mod;
this._ws = size;
}
public override void Execute()
{
_efem.MsgHandler.Send(new EfemMessage
{
Operation = this.Type,
Head = EfemMessage.MsgHead.MOV,
Parameters = new List { Module.ToHWString(), this._ws.ToString() }
});
this.Status = ActionStatus.SendCmd;
}
public override void OnPostWork(string data) { }
}
class LedAction : EfemAction
{
private LightType Light { get; }
private LightStatus LtStatus { get; }
public LedAction(EfemBase device, LightType lt, LightStatus st) : base(device, ModuleName.EFEM)
{
Type = EfemOperation.Light;
Light = lt;
LtStatus = st;
IsBackground = true;
}
public override void Execute()
{
_efem.MsgHandler.Send(new EfemMessage
{
Operation = this.Type,
Head = EfemMessage.MsgHead.SET,
Parameters = new List { Constant.STOWER, Light.ToString(), LtStatus.ToString() }
});
_efem.Status = DeviceState.Busy;
this.Status = ActionStatus.SendCmd;
//EV.PostInfoLog(this.Module.ToString(), $"CMD[{this.ID}], Set {this.Light} = {LtStatus}");
}
public override void OnPostWork(string data)
{
}
}
class AbortAction: EfemAction
{
public AbortAction(EfemBase efem) : base(efem, ModuleName.EFEM)
{
Type = EfemOperation.Abort;
}
public override void Execute()
{
_efem.MsgHandler.Send(new EfemMessage
{
Operation = this.Type,
Head = EfemMessage.MsgHead.MOV
});
}
}
}