142 lines
4.4 KiB
C#
142 lines
4.4 KiB
C#
using System;
|
|
using System.IO.Ports;
|
|
using System.Globalization;
|
|
using System.ComponentModel;
|
|
using System.Text.RegularExpressions;
|
|
|
|
namespace SharpSerial
|
|
{
|
|
public class SerialSettings
|
|
{
|
|
public SerialSettings() => CopyProperties(new SerialPort(), this);
|
|
public SerialSettings(string portName) => CopyProperties(new SerialPort(portName), this);
|
|
public SerialSettings(object source) => CopyProperties(source, this);
|
|
|
|
public void CopyFrom(object source) => CopyProperties(source, this);
|
|
public void CopyTo(object target) => CopyProperties(this, target);
|
|
|
|
[TypeConverter(typeof(PortNameConverter))]
|
|
public string PortName { get; set; }
|
|
[TypeConverter(typeof(BaudRateConverter))]
|
|
public int BaudRate { get; set; }
|
|
public int DataBits { get; set; }
|
|
public Parity Parity { get; set; }
|
|
public StopBits StopBits { get; set; }
|
|
public Handshake Handshake { get; set; }
|
|
|
|
public static void CopyProperties(Object source, Object target)
|
|
{
|
|
CopyProperty(source, target, "PortName");
|
|
CopyProperty(source, target, "BaudRate");
|
|
CopyProperty(source, target, "DataBits");
|
|
CopyProperty(source, target, "Parity");
|
|
CopyProperty(source, target, "StopBits");
|
|
CopyProperty(source, target, "Handshake");
|
|
}
|
|
|
|
static void CopyProperty(Object source, Object target, string name)
|
|
{
|
|
var propertySource = source.GetType().GetProperty(name);
|
|
var propertyTarget = target.GetType().GetProperty(name);
|
|
propertyTarget.SetValue(target, propertySource.GetValue(source, null), null);
|
|
}
|
|
}
|
|
|
|
public class PortNameConverter : TypeConverter
|
|
{
|
|
//windows only?
|
|
private readonly Regex re = new Regex(@"[^a-zA-Z0-9_]");
|
|
|
|
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
|
|
{
|
|
return new StandardValuesCollection(SerialPort.GetPortNames());
|
|
}
|
|
|
|
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
|
|
{
|
|
return (sourceType == typeof(string));
|
|
}
|
|
|
|
public override object ConvertFrom(ITypeDescriptorContext context,
|
|
CultureInfo culture, object value)
|
|
{
|
|
if (re.IsMatch(value.ToString())) throw Tools.Make("Invalid chars");
|
|
return value;
|
|
}
|
|
|
|
public override object ConvertTo(ITypeDescriptorContext context,
|
|
CultureInfo culture, object value, Type destinationType)
|
|
{
|
|
return value;
|
|
}
|
|
}
|
|
|
|
public class BaudRateConverter : TypeConverter
|
|
{
|
|
public readonly static int[] BaudRates = new int[] {
|
|
110,
|
|
300,
|
|
600,
|
|
1200,
|
|
2400,
|
|
4800,
|
|
9600,
|
|
14400,
|
|
19200,
|
|
28800,
|
|
38400,
|
|
56000,
|
|
57600,
|
|
115200,
|
|
128000,
|
|
153600,
|
|
230400,
|
|
256000,
|
|
460800,
|
|
921600
|
|
};
|
|
|
|
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
|
|
{
|
|
return new StandardValuesCollection(BaudRates);
|
|
}
|
|
|
|
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
|
|
{
|
|
return (sourceType == typeof(string));
|
|
}
|
|
|
|
public override object ConvertFrom(ITypeDescriptorContext context,
|
|
CultureInfo culture, object value)
|
|
{
|
|
return int.Parse(value.ToString());
|
|
}
|
|
|
|
public override object ConvertTo(ITypeDescriptorContext context,
|
|
CultureInfo culture, object value, Type destinationType)
|
|
{
|
|
return value.ToString();
|
|
}
|
|
}
|
|
}
|