using System; using Aitex.Core.RT.Device; using Aitex.Core.RT.Log; using Aitex.Core.RT.SCCore; using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts; namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.CarrierIdReaders.OmronRFID { public interface IRFIDMsg { string DeviceID { get; set; } string package(params object[] args); /// /// return value, completed /// /// /// bool unpackage(string msg); } public class handler : IHandler where T : IRFIDMsg, new() { public int ID { get; set; } public int Unit { get; set; } public bool IsBackground { get; set; } private static int retry_time = 3; private int retry_count = retry_time; private T _imp = new T(); private object[] _objs = null; public handler(string deviceID, params object[] objs) { _imp.DeviceID = deviceID; 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 value: bhandle /// /// /// /// /// /// public bool OnMessage(ref TPort port, string message, out bool completed) where TPort : ICommunication { completed = false; try { string msg = message.Trim(); string type = msg.Substring(0, 2); if (!type.Equals("00")) //0: command failed { /* if (retry_count-- <= 0) { string warning = string.Format("retry over {0} times", retry_time); LOG.Warning(warning); throw (new ExcuteFailedException(warning)); } */ string warning = string.Format("excute failed. cause is {0}.", getErrMsg(type)); LOG.Warning(warning); throw (new ExcuteFailedException(warning)); //port.Write(string.Format("{0}\r", _imp.package(this._objs))); //return true; } msg = msg.Substring(2, msg.Length - 2); completed = _imp.unpackage(msg); return true; } catch (ExcuteFailedException e) { throw (e); } catch (Exception ex) { LOG.Write(ex); throw (new InvalidPackageException(message)); } } private string getErrMsg(string error) { string msg = ""; switch (error) { case "14": msg = "Format error There is a mistake in the command format"; break; case "70": msg = "Communications error Noise or another hindrance occurs during communications with an ID Tag, and communications cannot be completed normally."; break; case "71": msg = "Verification error Correct data cannot be written to an ID Tag"; break; case "72": msg = "No Tag error Either there is no ID Tag in front of the CIDRW Head, or the CIDRW Head is unable to detect the ID Tag due to environmental factors"; break; case "7B": msg = "Outside write area error A write operation was not completed normally because the ID Tag was in an area in which the ID Tag could be read but not written"; break; case "7E": msg = "ID system error (1) The ID Tag is in a status where it cannot execute command processing"; break; case "7F": msg = "ID system error (2) An inapplicable ID Tag has been used"; break; case "9A": msg = "Hardware error in CPU An error occurred when writing to EEPROM."; break; } return msg; } } public class ReadHandler : IRFIDMsg //common move { public string DeviceID { get; set; } public ReadHandler() { } public string package(params object[] args) { string page = (string)args[0]; return string.Format("{0}{1}", "0100", page); } public bool unpackage(string msg) { OmronRfidReader device = DEVICE.GetDevice(DeviceID); string asciiValue = HEX2ASCII(msg.Substring(0, Math.Min(256, msg.Length))).Trim('\0'); if (asciiValue.IndexOf('\0') != -1) { asciiValue = asciiValue.Substring(0, asciiValue.IndexOf('\0')); } if (SC.ContainsItem("LoadPort.CarrierIdNeedTrimSpace") && SC.GetValue("LoadPort.CarrierIdNeedTrimSpace")) { asciiValue = asciiValue.Trim(); } device.SetCarrierIdReadResult(asciiValue); return true; } public string HEX2ASCII(string hex) { string res = String.Empty; try { for (int a = 0; a < hex.Length; a = a + 2) { string Char2Convert = hex.Substring(a, 2); int n = Convert.ToInt32(Char2Convert, 16); char c = (char)n; res += c.ToString(); } } catch (Exception e) { LOG.Write(e); } return res; } } public class WriteHandler : IRFIDMsg //common move { public string DeviceID { get; set; } public string Rfid { get; set; } public WriteHandler() { } public string package(params object[] args) { string page = (string)args[0]; Rfid = (string)args[1]; //Rfid = ASCII2HEX((string)args[1]); return string.Format("{0}{1}{2}", "0200", page, ASCII2HEX((string)args[1]).ToUpper()); } public string ASCII2HEX(string src) { while (src.Length < 128) { src = '\0' + src; } if (src.Length > 128) { src = src.Substring(0, 128); LOG.Write("RFID support max 128 characters"); } string res = String.Empty; try { char[] charValues = src.ToCharArray(); string hexOutput = ""; foreach (char _eachChar in charValues) { // Get the integral value of the character. int value = Convert.ToInt32(_eachChar); // Convert the decimal value to a hexadecimal value in string form. hexOutput += String.Format("{0:X2}", value); // to make output as your eg // hexOutput +=" "+ String.Format("{0:X}", value); } return hexOutput; } catch (Exception e) { LOG.Write(e); } return res; } public bool unpackage(string msg) { OmronRfidReader device = DEVICE.GetDevice(DeviceID); device.SetCarrierIdReadResult(Rfid); return true; } } }