505 lines
15 KiB
C#
505 lines
15 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Text.RegularExpressions;
|
|
using Aitex.Core.RT.Event;
|
|
using Aitex.Core.RT.Log;
|
|
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts;
|
|
|
|
|
|
namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.OcrReaders
|
|
{
|
|
public enum CongnexHandlerType
|
|
{
|
|
None,
|
|
LoginUsername,
|
|
LoginPassword,
|
|
ReadLM,
|
|
Online,
|
|
ReadImage,
|
|
GetJob,
|
|
GetJobList,
|
|
LoadJob,
|
|
}
|
|
public enum CongnexHandlerState
|
|
{
|
|
None,
|
|
CMDSend,
|
|
CMDSuccess,
|
|
CMDFail,
|
|
ExecuteComplete,
|
|
Error,
|
|
Timeout,
|
|
}
|
|
|
|
public class CongexHandler : IHandler
|
|
{
|
|
private static readonly int retry_time = 1;
|
|
|
|
private readonly IReaderMsg _imp;
|
|
|
|
private readonly object[] _objs;
|
|
private int retry_count = retry_time;
|
|
|
|
public CongexHandler(IReaderMsg imp, params object[] objs)
|
|
{
|
|
_imp = imp;
|
|
_objs = objs;
|
|
}
|
|
|
|
public int ID { get; set; }
|
|
public int Unit { get; set; }
|
|
|
|
public bool IsBackground => _imp.background;
|
|
|
|
public bool Execute<TPort>(ref TPort port) where TPort : ICommunication
|
|
{
|
|
retry_count = retry_time;
|
|
//return port.Write(string.Format("{0}\r", _imp.package(this._objs)));
|
|
return port.Write(string.Format("{0}\r\n", _imp.package(_objs)));
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// return value: bhandle
|
|
/// </summary>
|
|
/// <typeparam name="TPort"></typeparam>
|
|
/// <param name="port"></param>
|
|
/// <param name="msg"></param>
|
|
/// <param name="completed"></param>
|
|
/// <returns></returns>
|
|
public bool OnMessage<TPort>(ref TPort port, string message, out bool completed) where TPort : ICommunication
|
|
{
|
|
completed = false;
|
|
try
|
|
{
|
|
var msg = message.Trim();
|
|
|
|
if (string.IsNullOrWhiteSpace(msg)) return true;
|
|
|
|
if(msg.Equals("-1"))
|
|
{
|
|
if (retry_count-- <= 0)
|
|
{
|
|
var warning = string.Format("retry over {0} times", retry_time);
|
|
LOG.Warning(warning);
|
|
if (!IsBackground)
|
|
{
|
|
throw new ExcuteFailedException(warning);
|
|
}
|
|
completed = true;
|
|
return true;
|
|
}
|
|
port.Write(string.Format("{0}\r\n", _imp.package(_objs)));
|
|
}
|
|
|
|
//msg = message.Trim().Trim("[]".ToCharArray());
|
|
var data = Regex.Split(msg, "\r\n");
|
|
completed = _imp.unpackage("", data);
|
|
return true;
|
|
}
|
|
catch (ExcuteFailedException e)
|
|
{
|
|
throw e;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
LOG.Write(ex);
|
|
|
|
throw new InvalidPackageException(message);
|
|
}
|
|
}
|
|
}
|
|
|
|
public class CognexUserNameHandler : IReaderMsg //common move
|
|
{
|
|
private readonly CognexOcrReader _device;
|
|
|
|
public CognexUserNameHandler(CognexOcrReader device)
|
|
{
|
|
_device = device;
|
|
background = true;
|
|
|
|
}
|
|
|
|
public bool background { get; }
|
|
|
|
public string package(params object[] args)
|
|
{
|
|
_device.CurrentHandlerType = CongnexHandlerType.LoginUsername;
|
|
return "admin";
|
|
}
|
|
|
|
public void SetExeError()
|
|
{
|
|
_device.Error = true; ;
|
|
}
|
|
|
|
public bool unpackage(string type, string[] items)
|
|
{
|
|
if (items.Length != 1) return false;
|
|
|
|
if (items[0].Contains("Password"))
|
|
{
|
|
_device.CurrentHandlerState = CongnexHandlerState.ExecuteComplete;
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
_device.CurrentHandlerState = CongnexHandlerState.CMDFail;
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
public class CognexPasswordHandler : IReaderMsg //common move
|
|
{
|
|
private readonly CognexOcrReader _device;
|
|
|
|
public CognexPasswordHandler(CognexOcrReader device)
|
|
{
|
|
_device = device;
|
|
background = true;
|
|
}
|
|
|
|
public bool background { get; }
|
|
|
|
public string package(params object[] args)
|
|
{
|
|
_device.CurrentHandlerType = CongnexHandlerType.LoginPassword;
|
|
return "";
|
|
}
|
|
public void SetExeError()
|
|
{
|
|
_device.Error = true; ;
|
|
}
|
|
|
|
public bool unpackage(string type, string[] items)
|
|
{
|
|
if (items.Length != 1) return false;
|
|
if(items[0].Contains("User Logged In"))
|
|
{
|
|
_device.CurrentHandlerState = CongnexHandlerState.ExecuteComplete;
|
|
_device.IsLogined = true;
|
|
return true;
|
|
}
|
|
if(items[0].Contains("Invalid Password"))
|
|
{
|
|
_device.CurrentHandlerState = CongnexHandlerState.CMDFail;
|
|
_device.IsLogined = false;
|
|
return false;
|
|
}
|
|
return false;
|
|
|
|
}
|
|
}
|
|
|
|
public class CognexReadHandler : IReaderMsg //common move
|
|
{
|
|
private readonly CognexOcrReader _device;
|
|
|
|
public CognexReadHandler(CognexOcrReader device)
|
|
{
|
|
_device = device;
|
|
background = true;
|
|
|
|
}
|
|
public void SetExeError()
|
|
{
|
|
_device.Error = true; ;
|
|
}
|
|
public bool background { get; }
|
|
|
|
public string package(params object[] args)
|
|
{
|
|
_device.CurrentHandlerType = CongnexHandlerType.ReadLM;
|
|
return "SM\"READ\"0 ";
|
|
}
|
|
|
|
|
|
public bool unpackage(string type, string[] items)
|
|
{
|
|
string[] stritems;
|
|
if(items[0] == "1" && items.Length == 1)
|
|
{
|
|
_device.CurrentHandlerState = CongnexHandlerState.CMDSuccess;
|
|
return true;
|
|
}
|
|
if(items[0] == "1" && items.Length == 2)
|
|
{
|
|
stritems = items[1].Trim("[]".ToCharArray()).Split(',');
|
|
|
|
}
|
|
else stritems = items[0].Trim("[]".ToCharArray()).Split(',');
|
|
if (_device.ReadLaserMaker) {
|
|
|
|
_device.LaserMark1ReadResult = "";
|
|
foreach(string item in stritems)
|
|
{
|
|
_device.LaserMark1ReadResult = _device.LaserMark1ReadResult + item + ",";
|
|
}
|
|
|
|
_device.LaserMark1 = stritems[0].Trim("[]".ToCharArray());
|
|
_device.CurrentLaserMark = _device.LaserMark1;
|
|
_device.LaserMark1Score = 0;
|
|
if (stritems.Length > 1 && double.TryParse(stritems[1], out double score))
|
|
{
|
|
_device.LaserMark1Score = score;
|
|
|
|
}
|
|
else _device.LaserMark1ReadResult = _device.LaserMark1ReadResult + "Failed!";
|
|
if (stritems.Length > 2) _device.LaserMark1ReadTime = stritems[2];
|
|
|
|
EV.PostInfoLog("WIDReader",$"Wafer laser mark1 read : {stritems[0]}, score:{_device.LaserMark1Score},time:{_device.LaserMark1ReadTime}.");
|
|
}
|
|
else
|
|
{
|
|
_device.LaserMark2ReadResult = "";
|
|
foreach (string item in stritems)
|
|
{
|
|
_device.LaserMark2ReadResult = _device.LaserMark2ReadResult + item + ",";
|
|
}
|
|
_device.LaserMark2 = stritems[0].Trim("[]".ToCharArray());
|
|
_device.CurrentLaserMark = _device.LaserMark2;
|
|
_device.LaserMark2Score = 0;
|
|
if (stritems.Length > 1 && double.TryParse(stritems[1], out double score))
|
|
_device.LaserMark2Score = score;
|
|
else _device.LaserMark2ReadResult = _device.LaserMark2ReadResult + "Failed!";
|
|
if (stritems.Length > 2) _device.LaserMark2ReadTime = stritems[2];
|
|
EV.PostInfoLog("WIDReader",$"Wafer laser mark2 read : {stritems[0]}, score:{_device.LaserMark2Score},time:{_device.LaserMark2ReadTime}.");
|
|
}
|
|
_device.ReadOK = true;
|
|
_device.CurrentHandlerState = CongnexHandlerState.ExecuteComplete;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
public class CognexOnlineHandler : IReaderMsg //common move
|
|
{
|
|
private CognexOcrReader _device;
|
|
|
|
private bool _online;
|
|
|
|
public CognexOnlineHandler(CognexOcrReader device)
|
|
{
|
|
_device = device;
|
|
background = false;
|
|
|
|
}
|
|
public void SetExeError()
|
|
{
|
|
_device.Error = true; ;
|
|
}
|
|
public bool background { get; }
|
|
|
|
public string package(params object[] args)
|
|
{
|
|
_device.CurrentHandlerType = CongnexHandlerType.Online;
|
|
_online = (bool) args[0];
|
|
if (_online)
|
|
return "SO1";
|
|
|
|
return "SO0";
|
|
}
|
|
|
|
|
|
public bool unpackage(string type, string[] items)
|
|
{
|
|
if(items.Length ==1 && items[0].Trim() =="1")
|
|
{
|
|
_device.CurrentHandlerState = CongnexHandlerState.ExecuteComplete;
|
|
_device.IsOnline = _online;
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
|
|
public class CognexReadImageHandler : IReaderMsg
|
|
{
|
|
private readonly CognexOcrReader _device;
|
|
//private bool _readStart;
|
|
private int _imageLength;
|
|
private StringBuilder _stringBuilder;
|
|
|
|
public CognexReadImageHandler(CognexOcrReader device)
|
|
{
|
|
_device = device;
|
|
background = true;
|
|
//_readStart = false;
|
|
_imageLength = 0;
|
|
_stringBuilder = new StringBuilder();
|
|
|
|
}
|
|
public void SetExeError()
|
|
{
|
|
_device.Error = true; ;
|
|
}
|
|
public bool background { get; }
|
|
|
|
public string package(params object[] args)
|
|
{
|
|
_device.CurrentHandlerType = CongnexHandlerType.ReadImage;
|
|
_device.NeedSocketLog = false;
|
|
return "RI";
|
|
}
|
|
|
|
|
|
public bool unpackage(string type, string[] items)
|
|
{
|
|
if(_device.CurrentHandlerState == CongnexHandlerState.CMDSend)
|
|
{
|
|
if (items.Length>=2 && items[0].Trim() == "1" && int.TryParse(items[1], out _imageLength))
|
|
{
|
|
_device.CurrentHandlerState = CongnexHandlerState.CMDSuccess;
|
|
|
|
}
|
|
else _device.CurrentHandlerState = CongnexHandlerState.CMDFail;
|
|
return true;
|
|
}
|
|
if(_device.CurrentHandlerState == CongnexHandlerState.CMDSuccess)
|
|
{
|
|
foreach(string str in items)
|
|
{
|
|
_stringBuilder?.Append(str.Trim());
|
|
}
|
|
if (_stringBuilder.Length >= _imageLength)
|
|
{
|
|
string strimage = _stringBuilder?.ToString().Substring(0, _imageLength);
|
|
_device.SaveImage(strimage);
|
|
_device.CurrentHandlerState = CongnexHandlerState.ExecuteComplete;
|
|
_device.NeedSocketLog = true;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|
|
|
|
public class CognexGetJobHandler : IReaderMsg
|
|
{
|
|
private readonly CognexOcrReader _device;
|
|
|
|
public void SetExeError()
|
|
{
|
|
_device.Error = true; ;
|
|
}
|
|
|
|
public CognexGetJobHandler(CognexOcrReader device)
|
|
{
|
|
_device = device;
|
|
background = true;
|
|
|
|
}
|
|
|
|
public bool background { get; }
|
|
|
|
public string package(params object[] args)
|
|
{
|
|
_device.CurrentHandlerType = CongnexHandlerType.GetJob;
|
|
return "GF";
|
|
}
|
|
|
|
|
|
public bool unpackage(string type, string[] items)
|
|
{
|
|
if (items[0].Trim() == "1")
|
|
{
|
|
if (items.Length > 1) _device.CurrentJobName = items[1].Trim();
|
|
else _device.CurrentJobName = "";
|
|
_device.CurrentHandlerState = CongnexHandlerState.ExecuteComplete;
|
|
}
|
|
else
|
|
{
|
|
_device.CurrentHandlerState = CongnexHandlerState.CMDFail;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|
|
|
|
public class CognexGetJobListHandler : IReaderMsg
|
|
{
|
|
private readonly CognexOcrReader _device;
|
|
public void SetExeError()
|
|
{
|
|
_device.Error = true; ;
|
|
}
|
|
|
|
public CognexGetJobListHandler(CognexOcrReader device)
|
|
{
|
|
_device = device;
|
|
background = true;
|
|
|
|
}
|
|
|
|
public bool background { get; }
|
|
|
|
public string package(params object[] args)
|
|
{
|
|
_device.CurrentHandlerType = CongnexHandlerType.GetJobList;
|
|
return "Get Filelist";
|
|
}
|
|
|
|
|
|
public bool unpackage(string type, string[] items)
|
|
{
|
|
if (items[0].Trim() == "1" && items.Length >=2)
|
|
{
|
|
int filecount;
|
|
int.TryParse(items[1].Trim(), out filecount);
|
|
var job = items.Where(i => i.Contains(".job")).ToList();
|
|
_device.JobFileList = job;
|
|
_device.CurrentHandlerState = CongnexHandlerState.ExecuteComplete;
|
|
}
|
|
else
|
|
{
|
|
_device.CurrentHandlerState = CongnexHandlerState.CMDFail;
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
|
|
public class CognexLoadJobHandler : IReaderMsg //common move
|
|
{
|
|
private readonly CognexOcrReader _device;
|
|
|
|
private string _job;
|
|
|
|
public CognexLoadJobHandler(CognexOcrReader device)
|
|
{
|
|
_device = device;
|
|
background = false;
|
|
|
|
}
|
|
public void SetExeError()
|
|
{
|
|
_device.Error = true; ;
|
|
}
|
|
public bool background { get; }
|
|
|
|
public string package(params object[] args)
|
|
{
|
|
_device.CurrentHandlerType = CongnexHandlerType.LoadJob;
|
|
_job = (string) args[0]; //full path
|
|
// _job = _job.Substring(_job.LastIndexOf("\\") + 1); //remove dir
|
|
// _job = _job.Substring(0, _job.LastIndexOf(".")); //remove expand
|
|
return $"LF{_job}.job";
|
|
}
|
|
|
|
|
|
public bool unpackage(string type, string[] items)
|
|
{
|
|
if (items[0].Trim() == "1")
|
|
{
|
|
_device.CurrentJobName = _job;
|
|
_device.CurrentHandlerState = CongnexHandlerState.ExecuteComplete;
|
|
}
|
|
else
|
|
{
|
|
_device.CurrentHandlerState = CongnexHandlerState.CMDFail;
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
} |