using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace arDev { public partial class MasterK { protected int ReceiveByte() { bool done = false; int ret_val; // Await 1 char... if (!sw_ch.IsRunning) sw_ch.Start(); do { if (_device.BytesToRead > 0) { ret_val = _device.ReadByte(); done = true; } else ret_val = -1; } while ((!done) && ((sw_ch.ElapsedMilliseconds - char_tmo) < 10)); if (done) char_tmo = sw_ch.ElapsedMilliseconds; // Char received with no errors...reset timeout counter for next char! return ret_val; } protected int GetInterframeDelay() { int ret_val; if (_device.BaudRate > 19200) ret_val = 2; // Fixed value = 1.75ms up rounded else { int nbits = 1 + _device.DataBits; nbits += _device.Parity == System.IO.Ports.Parity.None ? 0 : 1; switch (_device.StopBits) { case System.IO.Ports.StopBits.One: nbits += 1; break; case System.IO.Ports.StopBits.OnePointFive: // Ceiling case System.IO.Ports.StopBits.Two: nbits += 2; break; } ret_val = Convert.ToInt32(Math.Ceiling(1 / (((double)_device.BaudRate / ((double)nbits * 3.5d)) / 1000))); } return ret_val; } protected int GetIntercharDelay() { int ret_val; if (_device.BaudRate > 19200) ret_val = 1; // Fixed value = 0.75 ms up rounded else { int nbits = 1 + _device.DataBits; nbits += _device.Parity == System.IO.Ports.Parity.None ? 0 : 1; switch (_device.StopBits) { case System.IO.Ports.StopBits.One: nbits += 1; break; case System.IO.Ports.StopBits.OnePointFive: // Ceiling case System.IO.Ports.StopBits.Two: nbits += 2; break; } ret_val = Convert.ToInt32(Math.Ceiling(1 / (((double)_device.BaudRate / ((double)nbits * 1.5d)) / 1000))); } return ret_val; } /// /// IO모니터가 실행중인지 확인합니다. /// [Description("I/O보드 핀 상태를 쓰레드를 이용하여 읽고 있는지 여부"), Browsable(false)] public Boolean isRunMonitor { get { if (thMonitor == null) return false; return this.thMonitor.IsAlive; } } /// /// 16진수 문자열 형태로 반환합니다. /// /// /// [Description("")] protected string GetHexString(Byte[] input) { if (input == null || input.Length < 1) return string.Empty; System.Text.StringBuilder sb = new System.Text.StringBuilder(); foreach (byte b in input) sb.Append(" " + b.ToString("X2")); return sb.ToString(); } /// /// 현재 시스템이 x64 인지 확인합니다. /// [Description("")] protected Boolean isX64 { get { if (IntPtr.Size == 8) return true; else return false; } } /// /// 초기화가 되어잇는지 체크합니다. /// [Description("")] public bool IsInit { get { if (!IsOpen() || !this._isInit) return false; else return true; } } /// /// 해당 버퍼가 NAK 응답인지 체크합니다. /// /// /// [Description("")] protected Boolean isNak(byte[] buffer) { if (buffer[0] == 0x15) { string hexString = GetHexString(buffer); RaiseMessage(true, "NAK Response : " + hexString); return true; } return false; } public bool IsOpen() { if (_device == null) return false; return _device.IsOpen; } protected void ClearBuffer(Boolean ClearDeviceBuffer=false) { _dlc = 0; _bDlc = false; _bStx = false; _CommandCode = 0x00; if (ClearDeviceBuffer) { this._device.DiscardInBuffer(); this._device.DiscardOutBuffer(); } } /// /// io모니터창을 표시합니다. /// [Description("")] public void ShowIOMonitor() { fIOMonitor f = new fIOMonitor(this); f.Show(); } #region "html generate" private string getHtmlHeader() { return "" + "" + "" + "" + "" + ""; } private string getHtmlTail() { return ""; } private string getTableHeadStr() { return ""; } private string getTableHead() { return "
Type Name Return Description
"; } private string getTableHeadEnum() { return "
Type NameDescription
"; } private string getTableTail() { return "
Return Name Description
"; } private string findReturnType(string fieldname) { if (fieldname.IndexOf('+') >= 0) { return fieldname.Split('+')[1]; } else return fieldname; } private string getMethodReturnType(Type source, MemberInfo member) { switch (member.MemberType) { case MemberTypes.Method: var met = source.GetMethod(member.Name); return source.GetMethod(member.Name).ReturnType.ToString().Substring(7); case MemberTypes.Property: var pt = source.GetProperty(member.Name); if (pt != null) return pt.PropertyType.FullName.Substring(7); break; case MemberTypes.Field: var fd = source.GetField(member.Name); string fieldname = fd.FieldType.FullName.Substring(7); return findReturnType(fieldname); } return ""; } /// /// HTML 메뉴얼작성용 코드를 생성합니다.(0==command,1==enum,2==structure) /// public string MakeHTML(byte type = 0) { System.Text.StringBuilder sb = new StringBuilder(); sb.AppendLine(getHtmlHeader()); if (type == 2) { var typeSmsg = typeof(sRecvMessage); sb.AppendLine("

[ " + typeSmsg.Name + " ]

"); sb.AppendLine(getTableHeadStr()); foreach (var member in typeSmsg.GetMembers()) { if (member.Name.StartsWith("get_") || member.Name.StartsWith("set_") || member.Name.StartsWith("Equals") || member.Name.StartsWith("GetHashCode") || member.Name.StartsWith("GetType")) continue; sb.AppendLine(""); sb.AppendLine(" " + member.MemberType.ToString() + ""); sb.AppendLine(" " + member.Name + ""); sb.AppendLine(" " + getMethodReturnType(typeSmsg, member) + ""); sb.AppendLine(" " + member.Name + ""); sb.AppendLine(""); } sb.AppendLine(getTableTail()); } else if (type == 1) { //enum list var typeeIO = typeof(eIOPINDIR); sb.AppendLine("

[ " + typeeIO.Name + " ]

"); sb.AppendLine(getTableHeadEnum()); foreach (var member in typeeIO.GetFields()) { if (member.Name.StartsWith("get_") || member.Name.StartsWith("set_") || member.Name.StartsWith("Equals") || member.Name.StartsWith("GetHashCode") || member.Name.StartsWith("GetType") || member.Name.EndsWith("__")) continue; sb.AppendLine(""); sb.AppendLine(" Byte"); sb.AppendLine(" " + member.Name + ""); sb.AppendLine(" " + member.Name + ""); sb.AppendLine(""); } sb.AppendLine(getTableTail()); typeeIO = typeof(eErrorCode); sb.AppendLine("

[ " + typeeIO.Name + " ]

"); sb.AppendLine(getTableHeadEnum()); foreach (var member in typeeIO.GetFields()) { if (member.Name.StartsWith("get_") || member.Name.StartsWith("set_") || member.Name.StartsWith("Equals") || member.Name.StartsWith("GetHashCode") || member.Name.StartsWith("GetType") || member.Name.EndsWith("__")) continue; sb.AppendLine(""); sb.AppendLine(" Byte"); sb.AppendLine(" " + member.Name + ""); sb.AppendLine(" " + member.Name + ""); sb.AppendLine(""); } sb.AppendLine(getTableTail()); typeeIO = typeof(eOpCode); sb.AppendLine("

[ " + typeeIO.Name + " ]

"); sb.AppendLine(getTableHeadEnum()); foreach (var member in typeeIO.GetFields()) { if (member.Name.StartsWith("get_") || member.Name.StartsWith("set_") || member.Name.StartsWith("Equals") || member.Name.StartsWith("GetHashCode") || member.Name.StartsWith("GetType") || member.Name.EndsWith("__")) continue; sb.AppendLine(""); sb.AppendLine(" Byte"); sb.AppendLine(" " + member.Name + ""); sb.AppendLine(" " + member.Name + ""); sb.AppendLine(""); } sb.AppendLine(getTableTail()); } else { //main sb.AppendLine("

[ Methods ]

"); sb.AppendLine(getTableHead()); foreach (var member in GetType().GetMethods()) { if (member.Name.StartsWith("get_") || member.Name.StartsWith("set_") || member.Name.StartsWith("Equals") || member.Name.StartsWith("GetHashCode") || member.Name.StartsWith("GetType") || member.Name.StartsWith("add_") || member.Name.StartsWith("remove_")) continue; sb.AppendLine(""); sb.AppendLine(" " + findReturnType(member.ReturnType.ToString().Substring(7)) + ""); sb.AppendLine(" " + member.Name + ""); sb.AppendLine(" " + member.Name + ""); sb.AppendLine(""); } sb.AppendLine(getTableTail()); sb.AppendLine("

[ Properties ]

"); sb.AppendLine(getTableHead()); foreach (var member in GetType().GetProperties()) { if (member.Name.StartsWith("get_") || member.Name.StartsWith("set_") || member.Name.StartsWith("Equals") || member.Name.StartsWith("GetHashCode") || member.Name.StartsWith("GetType") || member.Name.StartsWith("add_") || member.Name.StartsWith("remove_")) continue; sb.AppendLine(""); sb.AppendLine(" " + findReturnType(member.PropertyType.FullName.Substring(7)) + ""); sb.AppendLine(" " + member.Name + ""); sb.AppendLine(" " + member.Name + ""); sb.AppendLine(""); } sb.AppendLine(getTableTail()); sb.AppendLine("

[ Events ]

"); sb.AppendLine(getTableHead()); foreach (var member in GetType().GetEvents()) { if (member.Name.StartsWith("get_") || member.Name.StartsWith("set_") || member.Name.StartsWith("Equals") || member.Name.StartsWith("GetHashCode") || member.Name.StartsWith("GetType") || member.Name.StartsWith("add_") || member.Name.StartsWith("remove_")) continue; sb.AppendLine(""); sb.AppendLine(" " + "" + ""); sb.AppendLine(" " + member.Name + ""); sb.AppendLine(" " + member.Name + ""); sb.AppendLine(""); } sb.AppendLine(getTableTail()); sb.AppendLine("

[ Fields ]

"); sb.AppendLine(getTableHead()); foreach (var member in GetType().GetFields()) { if (member.Name.StartsWith("get_") || member.Name.StartsWith("set_") || member.Name.StartsWith("Equals") || member.Name.StartsWith("GetHashCode") || member.Name.StartsWith("GetType") || member.Name.StartsWith("add_") || member.Name.StartsWith("remove_")) continue; sb.AppendLine(""); sb.AppendLine(" " + findReturnType(member.FieldType.FullName.Substring(7)) + ""); sb.AppendLine(" " + member.Name + ""); sb.AppendLine(" " + member.Name + ""); sb.AppendLine(""); } sb.AppendLine(getTableTail()); } sb.AppendLine(getHtmlTail()); return sb.ToString(); } #endregion } }