100 lines
3.1 KiB
C#
100 lines
3.1 KiB
C#
using System;
|
|
using System.Text;
|
|
|
|
namespace SharpSerial
|
|
{
|
|
public static class Tools
|
|
{
|
|
public static void SetupGlobalCatcher()
|
|
{
|
|
AppDomain.CurrentDomain.UnhandledException += ExceptionHandler;
|
|
}
|
|
|
|
public static void ExceptionHandler(object sender, UnhandledExceptionEventArgs args)
|
|
{
|
|
ExceptionHandler(args.ExceptionObject as Exception);
|
|
}
|
|
|
|
public static void ExceptionHandler(Exception ex)
|
|
{
|
|
Try(() => Stdio.Trace("!{0}", ex.ToString()));
|
|
Try(() => Stdio.WriteLine("!{0}", ex.ToString()));
|
|
Environment.Exit(1);
|
|
}
|
|
|
|
public static string StringHex(byte[] data)
|
|
{
|
|
var sb = new StringBuilder();
|
|
sb.Append("<");
|
|
foreach (var b in data) sb.Append(b.ToString("X2"));
|
|
return sb.ToString();
|
|
}
|
|
|
|
public static byte[] ParseHex(string text)
|
|
{
|
|
Assert(text.Length % 2 == 1, "Odd length expected for {0}:{1}", text.Length, text);
|
|
var bytes = new byte[text.Length / 2];
|
|
for (var i = 0; i < bytes.Length; i++)
|
|
{
|
|
var b2 = text.Substring(1 + i * 2, 2);
|
|
bytes[i] = Convert.ToByte(b2, 16);
|
|
}
|
|
return bytes;
|
|
}
|
|
|
|
public static void SetProperty(object target, string line)
|
|
{
|
|
var parts = line.Split(new char[] { '=' });
|
|
if (parts.Length != 2) throw Make("Expected 2 parts in {0}", Readable(line));
|
|
var propertyName = parts[0];
|
|
var propertyValue = parts[1];
|
|
var property = target.GetType().GetProperty(propertyName);
|
|
if (property == null) throw Make("Property not found {0}", Readable(propertyName));
|
|
var value = FromString(property.PropertyType, propertyValue);
|
|
property.SetValue(target, value, null);
|
|
}
|
|
|
|
public static object FromString(Type type, string text)
|
|
{
|
|
if (type.IsEnum) return Enum.Parse(type, text);
|
|
return Convert.ChangeType(text, type);
|
|
}
|
|
|
|
public static void Try(Action action)
|
|
{
|
|
try
|
|
{
|
|
action.Invoke();
|
|
}
|
|
catch (Exception)
|
|
{
|
|
//no clear use case for cleanup exception
|
|
}
|
|
}
|
|
|
|
public static Exception Make(string format, params object[] args)
|
|
{
|
|
var line = format;
|
|
if (args.Length > 0) line = string.Format(format, args);
|
|
return new Exception(line);
|
|
}
|
|
|
|
public static string Readable(string text)
|
|
{
|
|
var sb = new StringBuilder();
|
|
foreach (var c in text)
|
|
{
|
|
if (Char.IsControl(c)) sb.Append(((int)c).ToString("X2"));
|
|
else if (Char.IsWhiteSpace(c)) sb.Append(((int)c).ToString("X2"));
|
|
else sb.Append(c);
|
|
}
|
|
return sb.ToString();
|
|
}
|
|
|
|
public static void Assert(bool condition, string format, params object[] args)
|
|
{
|
|
if (!condition) throw Make(format, args);
|
|
}
|
|
}
|
|
}
|