249 lines
8.3 KiB
C#
249 lines
8.3 KiB
C#
|
|
///
|
|||
|
|
/// Copyright (c) 2018 Sensus Slovensko a.s.
|
|||
|
|
///
|
|||
|
|
using System.IO;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.IO.Ports;
|
|||
|
|
using System.Xml.Serialization;
|
|||
|
|
using Config.Entities;
|
|||
|
|
using TBF.BenchControl.Generic;
|
|||
|
|
|
|||
|
|
namespace TBF.BenchControl.Hart.Common
|
|||
|
|
{
|
|||
|
|
public class HartCfg : ComponentCfgBase, Generic.IComponentCfg, Config.Entities.IParamsProvider
|
|||
|
|
{
|
|||
|
|
public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(HartCfg) })[0];
|
|||
|
|
public override XmlSerializer GetSerializer() { return Serializer; }
|
|||
|
|
|
|||
|
|
static readonly int[] AllBaudRates = new int[] { 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 };
|
|||
|
|
static readonly Parity[] AllParities = new Parity[] { Parity.None, Parity.Even, Parity.Odd };
|
|||
|
|
static readonly int[] AllDataBits = new int[] { 7, 8 };
|
|||
|
|
static readonly StopBits[] AllStopBits = new StopBits[] { StopBits.None, StopBits.One, StopBits.OnePointFive, StopBits.Two };
|
|||
|
|
static readonly Handshake[] AllHandshakes = new Handshake[] { Handshake.None, Handshake.XOnXOff, Handshake.RequestToSend, Handshake.RequestToSendXOnXOff };
|
|||
|
|
|
|||
|
|
|
|||
|
|
public IComponentCfgCtrl GetControl()
|
|||
|
|
{
|
|||
|
|
return new Configs.ParamsProvider.ComponentCfgCtrl(this, null);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
///
|
|||
|
|
/// Serialized parameters
|
|||
|
|
///
|
|||
|
|
public int ComPortNr;
|
|||
|
|
public int BaudRate;
|
|||
|
|
public int DataBits;
|
|||
|
|
public Parity Parity;
|
|||
|
|
public StopBits StopBits;
|
|||
|
|
public Handshake Handshake;
|
|||
|
|
|
|||
|
|
/// Private parameterless constructor invoked by all other (public) constructors
|
|||
|
|
HartCfg()
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public HartCfg(string name, IComponentFactory factory)
|
|||
|
|
: this()
|
|||
|
|
{
|
|||
|
|
Name = name;
|
|||
|
|
Factory = factory;
|
|||
|
|
ParentName = string.Empty;
|
|||
|
|
InitializeAll();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public string ComponentName { get { return Name; } }
|
|||
|
|
|
|||
|
|
public void InitializeAll()
|
|||
|
|
{
|
|||
|
|
ComPortNr = 3;
|
|||
|
|
BaudRate = 9600;
|
|||
|
|
DataBits = 8;
|
|||
|
|
Parity = System.IO.Ports.Parity.None;
|
|||
|
|
StopBits = System.IO.Ports.StopBits.One;
|
|||
|
|
Handshake = System.IO.Ports.Handshake.None;
|
|||
|
|
}
|
|||
|
|
string[] paramNames = new string[]
|
|||
|
|
{
|
|||
|
|
"Com port number",
|
|||
|
|
"Baud rate",
|
|||
|
|
"Data bits",
|
|||
|
|
"Parity",
|
|||
|
|
"Stop bits",
|
|||
|
|
"Handshake"
|
|||
|
|
};
|
|||
|
|
public string ParamName(int i) { return paramNames[i]; }
|
|||
|
|
public int ParamsCount() { return paramNames.Length; }
|
|||
|
|
|
|||
|
|
public IList<string> ParamValues(int i)
|
|||
|
|
{
|
|||
|
|
IList<string> list = new List<string>();
|
|||
|
|
switch (i)
|
|||
|
|
{
|
|||
|
|
case 1: foreach (var v in AllBaudRates) list.Add(v.ToString()); break;
|
|||
|
|
case 2: foreach (var v in AllDataBits) list.Add(v.ToString()); break;
|
|||
|
|
case 3: foreach (var v in AllParities) list.Add(v.ToString()); break;
|
|||
|
|
case 4: foreach (var v in AllStopBits) list.Add(v.ToString()); break;
|
|||
|
|
case 5: foreach (var v in AllHandshakes) list.Add(v.ToString()); break;
|
|||
|
|
default: return null;
|
|||
|
|
}
|
|||
|
|
return list;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public string ToString(int i)
|
|||
|
|
{
|
|||
|
|
if (i == -1)
|
|||
|
|
{
|
|||
|
|
return string.Format("Com{0}, {1}Bd, {2}-bits, parity={3}, stopBits={4}, {5}",
|
|||
|
|
ComPortNr, BaudRate, DataBits, Parity, StopBits, Handshake);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
switch (i)
|
|||
|
|
{
|
|||
|
|
case 0: return ComPortNr.ToString();
|
|||
|
|
case 1: return BaudRate.ToString();
|
|||
|
|
case 2: return DataBits.ToString();
|
|||
|
|
case 3: return Parity.ToString();
|
|||
|
|
case 4: return StopBits.ToString();
|
|||
|
|
case 5: return Handshake.ToString();
|
|||
|
|
default: return string.Empty;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
public CfgUpdateFlags UpdateParam(int i, string strValue)
|
|||
|
|
{
|
|||
|
|
switch (i)
|
|||
|
|
{
|
|||
|
|
case 0:
|
|||
|
|
if (ComPortNr != int.Parse(strValue))
|
|||
|
|
{
|
|||
|
|
ComPortNr = int.Parse(strValue);
|
|||
|
|
return CfgUpdateFlags.RestartRqrd;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
return CfgUpdateFlags.None;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
case 1:
|
|||
|
|
foreach (var v in AllBaudRates)
|
|||
|
|
{
|
|||
|
|
if ((strValue == v.ToString()) && (BaudRate != v))
|
|||
|
|
{
|
|||
|
|
BaudRate = v;
|
|||
|
|
return CfgUpdateFlags.RestartRqrd;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return CfgUpdateFlags.None;
|
|||
|
|
|
|||
|
|
case 2:
|
|||
|
|
foreach (var v in AllDataBits)
|
|||
|
|
{
|
|||
|
|
if ((strValue == v.ToString()) && (DataBits != v))
|
|||
|
|
{
|
|||
|
|
DataBits = v;
|
|||
|
|
return CfgUpdateFlags.RestartRqrd;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return CfgUpdateFlags.None;
|
|||
|
|
|
|||
|
|
case 3:
|
|||
|
|
foreach (var v in AllParities)
|
|||
|
|
{
|
|||
|
|
if ((strValue == v.ToString()) && (Parity != v))
|
|||
|
|
{
|
|||
|
|
Parity = v;
|
|||
|
|
return CfgUpdateFlags.RestartRqrd;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return CfgUpdateFlags.None;
|
|||
|
|
|
|||
|
|
case 4:
|
|||
|
|
foreach (var v in AllStopBits)
|
|||
|
|
{
|
|||
|
|
if ((strValue == v.ToString()) && (StopBits != v))
|
|||
|
|
{
|
|||
|
|
StopBits = v;
|
|||
|
|
return CfgUpdateFlags.RestartRqrd;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return CfgUpdateFlags.None;
|
|||
|
|
|
|||
|
|
case 5:
|
|||
|
|
foreach (var v in AllHandshakes)
|
|||
|
|
{
|
|||
|
|
if ((strValue == v.ToString()) && (Handshake != v))
|
|||
|
|
{
|
|||
|
|
Handshake = v;
|
|||
|
|
return CfgUpdateFlags.RestartRqrd;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return CfgUpdateFlags.None;
|
|||
|
|
|
|||
|
|
default:
|
|||
|
|
return CfgUpdateFlags.None;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
public bool ValidateParam(int i, string strValue, out string message)
|
|||
|
|
{
|
|||
|
|
message = string.Empty;
|
|||
|
|
|
|||
|
|
switch (i)
|
|||
|
|
{
|
|||
|
|
case 0:
|
|||
|
|
int comPortNr;
|
|||
|
|
if (int.TryParse(strValue, out comPortNr) && comPortNr > 0 && comPortNr <= 999) return true;
|
|||
|
|
break;
|
|||
|
|
case 1:
|
|||
|
|
foreach (var v in AllBaudRates) if (strValue == v.ToString()) return true;
|
|||
|
|
break;
|
|||
|
|
case 2:
|
|||
|
|
foreach (var v in AllDataBits) if (strValue == v.ToString()) return true;
|
|||
|
|
break;
|
|||
|
|
case 3:
|
|||
|
|
foreach (var v in AllParities) if (strValue == v.ToString()) return true;
|
|||
|
|
break;
|
|||
|
|
case 4:
|
|||
|
|
foreach (var v in AllStopBits) if (strValue == v.ToString()) return true;
|
|||
|
|
break;
|
|||
|
|
case 5:
|
|||
|
|
foreach (var v in AllHandshakes) if (strValue == v.ToString()) return true;
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
default:
|
|||
|
|
message = "Invalid index";
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
message = ParamName(i) + " is invalid";
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CopyContentTo(HartCfg prms)
|
|||
|
|
{
|
|||
|
|
prms.ParentName = this.ParentName;
|
|||
|
|
prms.ComPortNr = this.ComPortNr;
|
|||
|
|
prms.BaudRate = this.BaudRate;
|
|||
|
|
prms.DataBits = this.DataBits;
|
|||
|
|
prms.Parity = this.Parity;
|
|||
|
|
prms.StopBits = this.StopBits;
|
|||
|
|
prms.Handshake = this.Handshake;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
public Config.Entities.IParamsProvider Clone()
|
|||
|
|
{
|
|||
|
|
HartCfg pars = new HartCfg();
|
|||
|
|
CopyContentTo(pars);
|
|||
|
|
return pars;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void UpdateEmbeddedDbEntity()
|
|||
|
|
{
|
|||
|
|
/// Do nothing
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|