347 lines
11 KiB
C#
347 lines
11 KiB
C#
using Aitex.Core.RT.Device;
|
|
using MECF.Framework.Common.Communications;
|
|
using Newtonsoft.Json.Linq;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
|
|
namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.SMIFs.Brooks
|
|
{
|
|
public abstract class BrooksSMIFHandler : HandlerBase
|
|
{
|
|
public BrooksSMIF Device { get; }
|
|
|
|
public string _commandType;
|
|
public string _command;
|
|
public string _parameter;
|
|
protected string _completeEvent;
|
|
|
|
protected BrooksSMIFHandler(BrooksSMIF device, string commandType,string command, string completeEvent = null,string parameter = null)
|
|
: base(BuildMessage(commandType, command, parameter))
|
|
{
|
|
Device = device;
|
|
_commandType = commandType;
|
|
_command = command;
|
|
_completeEvent = completeEvent;
|
|
_parameter = parameter;
|
|
Name = command;
|
|
}
|
|
private static string BuildMessage(string commandType, string command, string parameter)
|
|
{
|
|
string commandStr = commandType;
|
|
if(command != null)
|
|
{
|
|
commandStr += " " + command;
|
|
}
|
|
if (parameter != null)
|
|
{
|
|
commandStr += " " + parameter;
|
|
}
|
|
return commandStr + "\r\n";
|
|
}
|
|
protected static string F2S(float value)
|
|
{
|
|
return value < 0 ? value.ToString() : " " + value.ToString();
|
|
}
|
|
public override bool HandleMessage(MessageBase msg, out bool transactionComplete)
|
|
{
|
|
BrooksSMIFMessage response = msg as BrooksSMIFMessage;
|
|
ResponseMessage = msg;
|
|
|
|
|
|
if (msg.IsError)
|
|
{
|
|
Device.NoteError(response.Data);
|
|
}
|
|
else
|
|
{
|
|
Device.NoteError(null);
|
|
if(msg.IsAck)
|
|
{
|
|
this.SetState(EnumHandlerState.Acked);
|
|
}
|
|
|
|
if (_completeEvent == null)
|
|
{
|
|
if (this.IsAcked)
|
|
{
|
|
SetState(EnumHandlerState.Completed);
|
|
transactionComplete = true;
|
|
return true;
|
|
}
|
|
}
|
|
else if (this.IsAcked && msg.IsEvent && _completeEvent == response.Data)
|
|
{
|
|
SetState(EnumHandlerState.Completed);
|
|
transactionComplete = true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
transactionComplete = false;
|
|
return false;
|
|
}
|
|
|
|
}
|
|
|
|
public class BrooksSMIFRawCommandHandler : BrooksSMIFHandler
|
|
{
|
|
public BrooksSMIFRawCommandHandler(BrooksSMIF device, string commandType, string command, string completeEvent,string parameter = null)
|
|
: base(device, commandType, command, completeEvent,parameter)
|
|
{
|
|
}
|
|
public override bool HandleMessage(MessageBase msg, out bool handled)
|
|
{
|
|
if (base.HandleMessage(msg, out handled))
|
|
{
|
|
var result = msg as BrooksSMIFMessage;
|
|
Device.NoteRawCommandInfo(_commandType,_command, result.RawMessage, msg.IsAck);
|
|
|
|
ResponseMessage = msg;
|
|
handled = true;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
public class BrooksSMIFEnableActionHandler : BrooksSMIFHandler
|
|
{
|
|
public BrooksSMIFEnableActionHandler(BrooksSMIF device, string action, bool isEnable)
|
|
: base(device, "HCS", isEnable? "ENABLE":"DISABLE",null, action)
|
|
{
|
|
}
|
|
|
|
public override bool HandleMessage(MessageBase msg, out bool handled)
|
|
{
|
|
if (base.HandleMessage(msg, out handled))
|
|
{
|
|
var result = msg as BrooksSMIFMessage;
|
|
Device.NoteEnable(_parameter, _command == "ENABLE");
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
|
|
public class BrooksSMIFFetchCassetteHandler : BrooksSMIFHandler
|
|
{
|
|
public BrooksSMIFFetchCassetteHandler(BrooksSMIF device)
|
|
: base(device, "HCS", "FETCH", "CMPL_FETCH")
|
|
{
|
|
}
|
|
}
|
|
public class BrooksSMIFLoadCassetteHandler : BrooksSMIFHandler
|
|
{
|
|
public BrooksSMIFLoadCassetteHandler(BrooksSMIF device)
|
|
: base(device, "HCS", "LOAD", null)
|
|
{
|
|
}
|
|
public override bool HandleMessage(MessageBase msg, out bool handled)
|
|
{
|
|
if (!base.HandleMessage(msg, out handled))
|
|
{
|
|
BrooksSMIFMessage response = msg as BrooksSMIFMessage;
|
|
if (response.Data.Contains("ABORT_LOAD"))
|
|
{
|
|
Device.NoteError("ABORT_LOAD");
|
|
handled = true;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
|
|
public class BrooksSMIFHomeHandler : BrooksSMIFHandler
|
|
{
|
|
public BrooksSMIFHomeHandler(BrooksSMIF device)
|
|
: base(device, "HCS", "HOME", null)
|
|
{
|
|
}
|
|
}
|
|
|
|
public class BrooksSMIFRecoveryHandler : BrooksSMIFHandler
|
|
{
|
|
public BrooksSMIFRecoveryHandler(BrooksSMIF device)
|
|
: base(device, "HCS", "RECOVERY", null)
|
|
{
|
|
}
|
|
}
|
|
|
|
public class BrooksSMIFStopHandler : BrooksSMIFHandler
|
|
{
|
|
public BrooksSMIFStopHandler(BrooksSMIF device)
|
|
: base(device, "HCS", "STOP", null)
|
|
{
|
|
}
|
|
}
|
|
|
|
public class BrooksSMIFResetHandler : BrooksSMIFHandler
|
|
{
|
|
public BrooksSMIFResetHandler(BrooksSMIF device)
|
|
: base(device, "HCS", "RESET", null)
|
|
{
|
|
}
|
|
}
|
|
|
|
public class BrooksSMIFOpenPodHandler : BrooksSMIFHandler
|
|
{
|
|
public BrooksSMIFOpenPodHandler(BrooksSMIF device)
|
|
: base(device, "HCS", "OPEN", "CMPL_OPEN")
|
|
{
|
|
}
|
|
}
|
|
public class BrooksSMIFUnloadCassetteHandler : BrooksSMIFHandler
|
|
{
|
|
public BrooksSMIFUnloadCassetteHandler(BrooksSMIF device)
|
|
: base(device, "HCS", "UNLOAD", null)
|
|
{
|
|
}
|
|
//mabye need and the guide document miss this info ??
|
|
//public override bool HandleMessage(MessageBase msg, out bool handled)
|
|
//{
|
|
// if (!base.HandleMessage(msg, out handled))
|
|
// {
|
|
// BrooksSMIFMessage response = msg as BrooksSMIFMessage;
|
|
// if (response.Data.Contains("ABORT_UNLOAD"))
|
|
// {
|
|
// Device.NoteError("ABORT_UNLOAD");
|
|
// handled = true;
|
|
// }
|
|
// }
|
|
// return true;
|
|
//}
|
|
}
|
|
public class BrooksSMIFClosePodHandler : BrooksSMIFHandler
|
|
{
|
|
public BrooksSMIFClosePodHandler(BrooksSMIF device)
|
|
: base(device, "HCS", "CLOSE", "CMPL_UNLOAD")
|
|
{
|
|
}
|
|
}
|
|
public class BrooksSMIFRequestConstantHandler : BrooksSMIFHandler
|
|
{
|
|
public BrooksSMIFRequestConstantHandler(BrooksSMIF device, string constantId)
|
|
: base(device, "ECR", null, null, constantId)
|
|
{
|
|
}
|
|
|
|
public override bool HandleMessage(MessageBase msg, out bool handled)
|
|
{
|
|
var result = msg as BrooksSMIFMessage;
|
|
|
|
if (result.MessagePart[0] == "ECD")
|
|
{
|
|
msg.IsAck = true;
|
|
}
|
|
else
|
|
{
|
|
handled = false;
|
|
return false;
|
|
}
|
|
|
|
if (base.HandleMessage(msg, out handled))
|
|
{
|
|
Device.NoteConstant(result.MessagePart[1]);
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
|
|
public class BrooksSMIFRequestStatusHandler : BrooksSMIFHandler
|
|
{
|
|
int _formCode;
|
|
string AlarmId = "ALMID";//0000 = No alarm
|
|
string Mode = "MODE";//AUTO,MANUAL
|
|
string PodPresent = "PIP";//FALSE=no pod present,TRUE=pod present
|
|
string PortStatus = "PRTST";//UNLK=port unlocked,LOCK=port locked,OTHER=none of the above
|
|
string GripperStatus = "GRPST";//OPEN=gripper opened;CLOSE=gripper closed;OT=overtraveled;OTHER=none of the above
|
|
string Ready = "READY";//FALSE=busy;TRUE=ready for new command
|
|
string Home = "HOME";//FALSE=not home;TRUE=home
|
|
string Elevator = "ELUP";//FALSE=elevator not at home limit;TRUE=elevator at home limit
|
|
string ArmRetract = "ARM_RETR";//TRUE=arm retract;FALSE=arm not retract
|
|
public BrooksSMIFRequestStatusHandler(BrooksSMIF device, int formCode)
|
|
: base(device, "FSR", null, null, "FC="+formCode.ToString())
|
|
{
|
|
_formCode = formCode;
|
|
}
|
|
|
|
public override bool HandleMessage(MessageBase msg, out bool handled)
|
|
{
|
|
var result = msg as BrooksSMIFMessage;
|
|
|
|
if (result.MessagePart[0].Contains($"FSD{_formCode}"))
|
|
{
|
|
msg.IsAck = true;
|
|
}
|
|
else
|
|
{
|
|
handled = false;
|
|
return false;
|
|
}
|
|
|
|
bool isPodPresent = false;
|
|
bool isReady = false;
|
|
bool isArmRetract = false;
|
|
bool isHomed = false;
|
|
for (int i = 0;i< result.MessagePart.Length;i++)
|
|
{
|
|
var statusArray = result.MessagePart[i].Split('=');
|
|
if (statusArray.Length != 2)
|
|
continue;
|
|
|
|
if (statusArray[0] == AlarmId)
|
|
{
|
|
if (statusArray[1] != "0000")
|
|
Device.SetError(statusArray[1]);
|
|
}
|
|
else if (statusArray[0] == Mode)
|
|
{
|
|
|
|
}
|
|
else if (statusArray[0] == PodPresent)
|
|
{
|
|
if (statusArray[1].ToUpper() == "TRUE")
|
|
isPodPresent = true;
|
|
}
|
|
else if (statusArray[0] == PortStatus)
|
|
{
|
|
|
|
}
|
|
else if (statusArray[0] == GripperStatus)
|
|
{
|
|
|
|
}
|
|
else if (statusArray[0] == Ready)
|
|
{
|
|
if (statusArray[1].ToUpper() == "TRUE")
|
|
isReady = true;
|
|
}
|
|
else if (statusArray[0] == Home)
|
|
{
|
|
if (statusArray[1].ToUpper() == "TRUE")
|
|
isHomed = true;
|
|
}
|
|
else if (statusArray[0] == Elevator)
|
|
{
|
|
|
|
}
|
|
else if (statusArray[0] == ArmRetract)
|
|
{
|
|
if (statusArray[1].ToUpper() == "TRUE")
|
|
isArmRetract = true;
|
|
}
|
|
}
|
|
|
|
Device.SetStatus(isReady, isHomed, isPodPresent, isArmRetract);
|
|
|
|
if (base.HandleMessage(msg, out handled))
|
|
{
|
|
Device.NoteStatus(result.MessagePart[0], result.Data);
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
|
|
}
|