426 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			426 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| 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;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// IO모니터가 실행중인지 확인합니다.
 | |
|         /// </summary>
 | |
|         [Description("I/O보드 핀 상태를 쓰레드를 이용하여 읽고 있는지 여부"), Browsable(false)]
 | |
|         public Boolean isRunMonitor
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 if (thMonitor == null) return false;
 | |
|                 return this.thMonitor.IsAlive;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 16진수 문자열 형태로 반환합니다.
 | |
|         /// </summary>
 | |
|         /// <param name="input"></param>
 | |
|         /// <returns></returns>
 | |
|         [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();
 | |
|         }
 | |
| 
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 현재 시스템이 x64 인지 확인합니다.
 | |
|         /// </summary>
 | |
|         [Description("")]
 | |
|         protected Boolean isX64
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 if (IntPtr.Size == 8) return true;
 | |
|                 else return false;
 | |
|             }
 | |
|         }
 | |
| 
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 초기화가 되어잇는지 체크합니다.
 | |
|         /// </summary>
 | |
|         [Description("")]
 | |
|         public bool IsInit
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 if (!IsOpen() || !this._isInit) return false;
 | |
|                 else return true;
 | |
|             }
 | |
|         }
 | |
|         
 | |
|         /// <summary>
 | |
|         /// 해당 버퍼가 NAK 응답인지 체크합니다.
 | |
|         /// </summary>
 | |
|         /// <param name="buffer"></param>
 | |
|         /// <returns></returns>
 | |
|         [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();
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// io모니터창을 표시합니다.
 | |
|         /// </summary>
 | |
|         [Description("")]
 | |
|         public void ShowIOMonitor()
 | |
|         {
 | |
|             fIOMonitor f = new fIOMonitor(this);
 | |
|             f.Show();
 | |
|         }
 | |
| 
 | |
|         #region "html generate"
 | |
| 
 | |
|         private string getHtmlHeader()
 | |
|         {
 | |
|             return "<html>" +
 | |
|                     "<head>" +
 | |
|                     "<script src=\"https://rawgit.com/google/code-prettify/master/loader/run_prettify.js?autoload=true&skin=sunburst&lang=css\" defer></script>" +
 | |
|                     "<link rel=\"stylesheet\" href=\"styles.css\">" +
 | |
|                     "</head>" +
 | |
|                     "<body>";
 | |
|         }
 | |
| 
 | |
|         private string getHtmlTail()
 | |
|         {
 | |
|             return "</body></html>";
 | |
|         }
 | |
|         private string getTableHeadStr()
 | |
|         {
 | |
|             return "<table> <thead> <tr> <td>Type</td> <td>Name</td> <td>Return</td> <td>Description</td> </tr> </thead> <tbody>";
 | |
|         }
 | |
|         private string getTableHead()
 | |
|         {
 | |
|             return "<table> <thead> <tr> <td>Type</td> <td>Name</td><td>Description</td> </tr> </thead> <tbody>";
 | |
|         }
 | |
|         private string getTableHeadEnum()
 | |
|         {
 | |
|             return "<table> <thead> <tr> <td>Return</td> <td>Name</td> <td>Description</td> </tr> </thead> <tbody>";
 | |
|         }
 | |
|         private string getTableTail()
 | |
|         {
 | |
|             return "</tbody></table>";
 | |
|         }
 | |
|         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 "";
 | |
| 
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// HTML 메뉴얼작성용 코드를 생성합니다.(0==command,1==enum,2==structure)
 | |
|         /// </summary>
 | |
|         public string MakeHTML(byte type = 0)
 | |
|         {
 | |
|             System.Text.StringBuilder sb = new StringBuilder();
 | |
| 
 | |
|             sb.AppendLine(getHtmlHeader());
 | |
| 
 | |
|             if (type == 2)
 | |
|             {
 | |
| 
 | |
|                 var typeSmsg = typeof(sRecvMessage);
 | |
|                 sb.AppendLine("<h4 class=\"structure\">[ " + typeSmsg.Name + " ]</h4>");
 | |
|                 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("<tr>");
 | |
|                     sb.AppendLine(" <td>" + member.MemberType.ToString() + "</td>");
 | |
|                     sb.AppendLine(" <td class=\"tleft\">" + member.Name + "</td>");
 | |
|                     sb.AppendLine(" <td>" + getMethodReturnType(typeSmsg, member) + "</td>");
 | |
|                     sb.AppendLine(" <td class=\"tleft\">" + member.Name + "</td>");
 | |
|                     sb.AppendLine("</tr>");
 | |
|                 }
 | |
|                 sb.AppendLine(getTableTail());
 | |
| 
 | |
|             }
 | |
|             else if (type == 1)
 | |
|             {
 | |
|                 //enum list
 | |
| 
 | |
|                 var typeeIO = typeof(eIOPINDIR);
 | |
|                 sb.AppendLine("<h4 class=\"enum\">[ " + typeeIO.Name + " ]</h4>");
 | |
|                 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("<tr>");
 | |
|                     sb.AppendLine(" <td>Byte</td>");
 | |
|                     sb.AppendLine(" <td class=\"tleft\">" + member.Name + "</td>");
 | |
|                     sb.AppendLine(" <td class=\"tleft\">" + member.Name + "</td>");
 | |
|                     sb.AppendLine("</tr>");
 | |
|                 }
 | |
|                 sb.AppendLine(getTableTail());
 | |
| 
 | |
|                 typeeIO = typeof(eErrorCode);
 | |
|                 sb.AppendLine("<h4 class=\"enum\">[ " + typeeIO.Name + " ]</h4>");
 | |
|                 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("<tr>");
 | |
|                     sb.AppendLine(" <td>Byte</td>");
 | |
|                     sb.AppendLine(" <td class=\"tleft\">" + member.Name + "</td>");
 | |
|                     sb.AppendLine(" <td class=\"tleft\">" + member.Name + "</td>");
 | |
|                     sb.AppendLine("</tr>");
 | |
|                 }
 | |
|                 sb.AppendLine(getTableTail());
 | |
| 
 | |
|                 typeeIO = typeof(eOpCode);
 | |
|                 sb.AppendLine("<h4 class=\"enum\">[ " + typeeIO.Name + " ]</h4>");
 | |
|                 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("<tr>");
 | |
|                     sb.AppendLine(" <td>Byte</td>");
 | |
|                     sb.AppendLine(" <td class=\"tleft\">" + member.Name + "</td>");
 | |
|                     sb.AppendLine(" <td class=\"tleft\">" + member.Name + "</td>");
 | |
|                     sb.AppendLine("</tr>");
 | |
|                 }
 | |
|                 sb.AppendLine(getTableTail());
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 //main
 | |
|                 sb.AppendLine("<h4 class=\"method\">[ Methods ]</h4>");
 | |
|                 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("<tr>");
 | |
|                     sb.AppendLine(" <td>" + findReturnType(member.ReturnType.ToString().Substring(7)) + "</td>");
 | |
|                     sb.AppendLine(" <td class=\"tleft\">" + member.Name + "</td>");
 | |
|                     sb.AppendLine(" <td class=\"tleft\">" + member.Name + "</td>");
 | |
|                     sb.AppendLine("</tr>");
 | |
|                 }
 | |
|                 sb.AppendLine(getTableTail());
 | |
| 
 | |
| 
 | |
|                 sb.AppendLine("<h4 class=\"method\">[ Properties ]</h4>");
 | |
|                 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("<tr>");
 | |
|                     sb.AppendLine(" <td>" + findReturnType(member.PropertyType.FullName.Substring(7)) + "</td>");
 | |
|                     sb.AppendLine(" <td class=\"tleft\">" + member.Name + "</td>");
 | |
|                     sb.AppendLine(" <td class=\"tleft\">" + member.Name + "</td>");
 | |
|                     sb.AppendLine("</tr>");
 | |
|                 }
 | |
|                 sb.AppendLine(getTableTail());
 | |
| 
 | |
| 
 | |
|                 sb.AppendLine("<h4 class=\"method\">[ Events ]</h4>");
 | |
|                 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("<tr>");
 | |
|                     sb.AppendLine(" <td>" + "" + "</td>");
 | |
|                     sb.AppendLine(" <td class=\"tleft\">" + member.Name + "</td>");
 | |
|                     sb.AppendLine(" <td class=\"tleft\">" + member.Name + "</td>");
 | |
|                     sb.AppendLine("</tr>");
 | |
|                 }
 | |
|                 sb.AppendLine(getTableTail());
 | |
| 
 | |
| 
 | |
| 
 | |
|                 sb.AppendLine("<h4 class=\"method\">[ Fields ]</h4>");
 | |
|                 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("<tr>");
 | |
|                     sb.AppendLine(" <td>" + findReturnType(member.FieldType.FullName.Substring(7)) + "</td>");
 | |
|                     sb.AppendLine(" <td class=\"tleft\">" + member.Name + "</td>");
 | |
|                     sb.AppendLine(" <td class=\"tleft\">" + member.Name + "</td>");
 | |
|                     sb.AppendLine("</tr>");
 | |
|                 }
 | |
|                 sb.AppendLine(getTableTail());
 | |
|             }
 | |
| 
 | |
|             sb.AppendLine(getHtmlTail());
 | |
|             return sb.ToString();
 | |
|         }
 | |
|         #endregion
 | |
| 
 | |
|      
 | |
|     }
 | |
| }
 | 
