using System; using System.Text.RegularExpressions; using Aitex.Core.RT.Log; using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts; namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.OcrReaders { public interface IReaderMsg { string package(params object[] args); /// /// return value, completed /// /// /// bool unpackage(string type, string[] items); bool background { get; } } public class handler : IHandler { public int ID { get; set; } public int Unit { get; set; } public bool IsBackground { get { return _imp.background; } } private static int retry_time = 1; private int retry_count = retry_time; private IReaderMsg _imp ; private object[] _objs = null; public handler(IReaderMsg imp, params object[] objs) { _imp = imp; this._objs = objs; } public bool Execute(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(this._objs))); } /// /// return value: bhandle /// /// /// /// /// /// public bool OnMessage(ref TPort port, string message, out bool completed) where TPort : ICommunication { completed = false; try { string msg = message.Trim(); if (msg.IndexOf("Welcome") >= 0) { return true; } msg = msg.Replace("User:",""); if (string.IsNullOrWhiteSpace(msg)) { return true; } if (msg.Length <= 2) { if (!msg.Equals("1")) //0: command failed { if (retry_count-- <= 0) { string warning = string.Format("retry over {0} times", retry_time); //LOG.Warning(warning); if (!IsBackground) throw (new ExcuteFailedException(warning)); else { completed = true; return true; } } port.Write(string.Format("{0}\r\n", _imp.package(this._objs))); } if (!IsBackground) { _imp.unpackage("", null); completed = true; } return true; } if (IsBackground) { msg = message.TrimStart('['); msg = msg.TrimEnd(']'); string[] data = Regex.Split(msg, ","); completed = _imp.unpackage("", data); // if (!completed) // { // port.Write(string.Format("{0}\r", _imp.package(this._objs))); //read failed. retry // } } return true; } catch (ExcuteFailedException e) { throw (e); } catch (Exception ex) { LOG.WriteExeption(ex); throw (new InvalidPackageException(message)); } } } public class ReadHandler : IReaderMsg //common move { public bool background { get; private set; } private OcrReader _device ; public ReadHandler(OcrReader device) { _device = device; background = true; } public string package(params object[] args) { return string.Format("SM\"READ\"0 "); } public bool unpackage(string type, string[] items) { if (_device.ReadLaserMaker) { _device.LaserMaker = items[0]; } else { _device.T7Code = items[0]; } _device.ReadOK = double.Parse(items[2]) > 0; return true; } } public class OnlineHandler : IReaderMsg //common move { public bool background { get; private set; } private OcrReader _device ; private bool _online = false; public OnlineHandler(OcrReader device) { _device = device; background = false; } public string package(params object[] args) { _online = (bool)args[0]; if(_online) return string.Format("SO1"); return string.Format("SO0"); } public bool unpackage(string type, string[] items) { return true; } } public class GetJobHandler : IReaderMsg { public bool background { get; private set; } private OcrReader _device ; public GetJobHandler(OcrReader device) { _device = device; background = true; } public string package(params object[] args) { return string.Format("GF"); } public bool unpackage(string type, string[] items) { _device.JobName = (string)items[0]; return true; } } public class LoadJobHandler : IReaderMsg //common move { public bool background { get; private set; } private OcrReader _device ; private string _job; public LoadJobHandler(OcrReader device) { _device = device; background = false; } public string package(params object[] args) { _job = (string)args[0]; //full path // _job = _job.Substring(_job.LastIndexOf("\\") + 1); //remove dir // _job = _job.Substring(0, _job.LastIndexOf(".")); //remove expand return string.Format("LF{0}.job",_job); } public bool unpackage(string type, string[] items) { _device.JobName = _job; return true; } } }