|
@@ -21,6 +21,7 @@ using Venus_RT.Devices.YASKAWA;
|
|
|
using Venus_RT.Devices.EFEM;
|
|
|
using Venus_RT.Modules.LPs;
|
|
|
using Venus_RT.Modules.EFEM;
|
|
|
+using System.Collections.Concurrent;
|
|
|
|
|
|
namespace Venus_RT.Modules
|
|
|
{
|
|
@@ -77,7 +78,6 @@ namespace Venus_RT.Modules
|
|
|
PMLiftPinDown, // 19
|
|
|
TurnOffBuzzer,
|
|
|
Abort,
|
|
|
- Map,
|
|
|
ToInit,
|
|
|
Cool,
|
|
|
Swap,
|
|
@@ -86,7 +86,23 @@ namespace Venus_RT.Modules
|
|
|
Flip,
|
|
|
LiftActionDone,
|
|
|
Offline,
|
|
|
+
|
|
|
+ BackroundCmd = 100,
|
|
|
Light,
|
|
|
+ SetThickness,
|
|
|
+ HomeLP,
|
|
|
+ Load,
|
|
|
+ Unload,
|
|
|
+ Dock,
|
|
|
+ Undock,
|
|
|
+ Clamp,
|
|
|
+ Unclamp,
|
|
|
+ Map,
|
|
|
+ ReadCarrierId,
|
|
|
+ WriteCarrierID,
|
|
|
+ ReadTagData,
|
|
|
+ WriteTagData,
|
|
|
+ MaxMsgValue,
|
|
|
}
|
|
|
|
|
|
public enum EfemType
|
|
@@ -142,7 +158,7 @@ namespace Venus_RT.Modules
|
|
|
private readonly string Name;
|
|
|
private readonly EfemBase _efem;
|
|
|
private readonly LoadPortModule[] _lpms = new LoadPortModule[3];
|
|
|
- private readonly EfemSignalTower _signalTower;
|
|
|
+ private readonly EfemBackroundMsgProcessor _signalTower;
|
|
|
|
|
|
private readonly EfemType _efemType;
|
|
|
public EfemBase EfemDevice => _efem;
|
|
@@ -178,7 +194,7 @@ namespace Venus_RT.Modules
|
|
|
_efemType = (EfemType)SC.GetValue<int>($"EFEM.EfemType");
|
|
|
|
|
|
_efem = new JetEfem();
|
|
|
- _signalTower = new EfemSignalTower(_efem);
|
|
|
+ _signalTower = new EfemBackroundMsgProcessor(_efem);
|
|
|
|
|
|
Name = ModuleName.EFEM.ToString();
|
|
|
|
|
@@ -275,7 +291,7 @@ namespace Venus_RT.Modules
|
|
|
AnyStateTransition(MSG.Online, fnOnline, FSM_STATE.SAME);
|
|
|
AnyStateTransition(MSG.Abort, fnAbortRobot, STATE.Idle);
|
|
|
AnyStateTransition(MSG.ToInit, fnToInit, STATE.Init);
|
|
|
- AnyStateTransition(MSG.Light, fnSetLight, FSM_STATE.SAME);
|
|
|
+ AnyStateTransition(MSG.BackroundCmd, fnBackroundCommand, FSM_STATE.SAME);
|
|
|
|
|
|
|
|
|
AnyStateTransition(MSG.CommReady, fnCommReady, STATE.Init);
|
|
@@ -468,12 +484,9 @@ namespace Venus_RT.Modules
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
- private bool fnSetLight(object[] param)
|
|
|
+ private bool fnBackroundCommand(object[] param)
|
|
|
{
|
|
|
- LightType light = (LightType)param[0];
|
|
|
- LightStatus st = (LightStatus)param[1];
|
|
|
-
|
|
|
- _signalTower.SetLight(light, st);
|
|
|
+ _signalTower.SendBackroundCommand(param);
|
|
|
return true;
|
|
|
}
|
|
|
|
|
@@ -757,10 +770,10 @@ namespace Venus_RT.Modules
|
|
|
return (int)FSM_MSG.NONE;
|
|
|
}
|
|
|
|
|
|
- public int InvokeSignalTower(LightType type, LightStatus status)
|
|
|
+ public int SendEfemBackroundCommand(params object[] args)
|
|
|
{
|
|
|
- if(CheckToPostMessage((int)MSG.Light, type, status))
|
|
|
- return (int)MSG.Light;
|
|
|
+ if(CheckToPostMessage((int)MSG.BackroundCmd, args))
|
|
|
+ return (int)MSG.BackroundCmd;
|
|
|
|
|
|
return (int)FSM_MSG.NONE;
|
|
|
}
|
|
@@ -1001,11 +1014,11 @@ namespace Venus_RT.Modules
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public class EfemSignalTower
|
|
|
+ public class EfemBackroundMsgProcessor
|
|
|
{
|
|
|
private EfemBase _efem;
|
|
|
- private Queue<KeyValuePair<LightType, LightStatus>> _pendingCmds = new Queue<KeyValuePair<LightType, LightStatus>>();
|
|
|
- public EfemSignalTower(EfemBase efem)
|
|
|
+ private ConcurrentQueue<object[]> _pendingCmds = new ConcurrentQueue<object[]>();
|
|
|
+ public EfemBackroundMsgProcessor(EfemBase efem)
|
|
|
{
|
|
|
_efem = efem;
|
|
|
}
|
|
@@ -1014,14 +1027,77 @@ namespace Venus_RT.Modules
|
|
|
{
|
|
|
if(Singleton<RouteManager>.Instance.EFEM.RobotStatus != RState.Running && _pendingCmds.Count > 0)
|
|
|
{
|
|
|
- var lightCommand = _pendingCmds.Dequeue();
|
|
|
- _efem.SetLamp(lightCommand.Key, lightCommand.Value);
|
|
|
+ if(_pendingCmds.TryDequeue(out object[] args))
|
|
|
+ {
|
|
|
+ EfemEntity.MSG cmd = (EfemEntity.MSG)args[0];
|
|
|
+ if ((int)cmd > (int)EfemEntity.MSG.BackroundCmd && (int)cmd < (int)EfemEntity.MSG.MaxMsgValue)
|
|
|
+ {
|
|
|
+ processBackroundCommand(cmd, args);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ LOG.Write(eEvent.ERR_EFEM_ROBOT, ModuleName.EFEM, $"Invalid EFEM backround command {cmd}");
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public void SetLight(LightType type, LightStatus status)
|
|
|
+ public void SendBackroundCommand(object[] args)
|
|
|
{
|
|
|
- _pendingCmds.Enqueue(new KeyValuePair<LightType, LightStatus>(type, status));
|
|
|
+ _pendingCmds.Enqueue(args);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private void processBackroundCommand(EfemEntity.MSG cmd, object[] args)
|
|
|
+ {
|
|
|
+ switch(cmd)
|
|
|
+ {
|
|
|
+ case EfemEntity.MSG.Light:
|
|
|
+ _efem.SetLamp((LightType)args[1], (LightStatus)args[2]);
|
|
|
+ break;
|
|
|
+ case EfemEntity.MSG.SetThickness:
|
|
|
+ _efem.SetThickness((ModuleName)args[1], (string)args[2]);
|
|
|
+ break;
|
|
|
+ case EfemEntity.MSG.HomeLP:
|
|
|
+ _efem.Home((ModuleName)args[1]);
|
|
|
+ break;
|
|
|
+ case EfemEntity.MSG.Load:
|
|
|
+ _efem.Load((ModuleName)args[1]);
|
|
|
+ break;
|
|
|
+ case EfemEntity.MSG.Unload:
|
|
|
+ _efem.Unload((ModuleName)args[1]);
|
|
|
+ break;
|
|
|
+ case EfemEntity.MSG.Dock:
|
|
|
+ _efem.Dock((ModuleName)args[1]);
|
|
|
+ break;
|
|
|
+ case EfemEntity.MSG.Undock:
|
|
|
+ _efem.Undock((ModuleName)args[1]);
|
|
|
+ break;
|
|
|
+ case EfemEntity.MSG.Clamp:
|
|
|
+ _efem.Clamp((ModuleName)args[1], (bool)args[2]);
|
|
|
+ break;
|
|
|
+ case EfemEntity.MSG.Unclamp:
|
|
|
+ _efem.Unclamp((ModuleName)args[1]);
|
|
|
+ break;
|
|
|
+ case EfemEntity.MSG.Map:
|
|
|
+ _efem.Map((ModuleName)args[1]);
|
|
|
+ break;
|
|
|
+ case EfemEntity.MSG.ReadCarrierId:
|
|
|
+ _efem.ReadCarrierId((ModuleName)args[1]);
|
|
|
+ break;
|
|
|
+ case EfemEntity.MSG.WriteCarrierID:
|
|
|
+ _efem.WriteCarrierId((ModuleName)args[1], (string)args[2]);
|
|
|
+ break;
|
|
|
+ case EfemEntity.MSG.ReadTagData:
|
|
|
+ _efem.ReadCarrierId((ModuleName)args[1]);
|
|
|
+ break;
|
|
|
+ case EfemEntity.MSG.WriteTagData:
|
|
|
+ _efem.WriteCarrierId((ModuleName)args[1], (string)args[2]);
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ LOG.Write(eEvent.ERR_EFEM_ROBOT, ModuleName.EFEM, $"unprocessed Efem command {cmd}");
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|