Files
vms2016_kadisp/Sub/arMasterK/Project/Util.cs

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&amp;skin=sunburst&amp;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
}
}