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
|
|
|
|
|
|
}
|
|
}
|