arMaskterK 프로젝트를 vms2016_cs 레포에서 현 레포로 이동
This commit is contained in:
425
Sub/arMasterK/Project/Util.cs
Normal file
425
Sub/arMasterK/Project/Util.cs
Normal file
@@ -0,0 +1,425 @@
|
||||
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
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user