/// /// Copyright (c) 2018 Sensus Slovensko a.s. /// using System.IO; using System.Collections.Generic; using System.IO.Ports; using System.Xml.Serialization; using Common; using Config.Entities; using TBF.Rig.Generic; namespace TBF.Rig.Hart.Common { public class HartCfg : ComponentCfgBase, Generic.IComponentCfg, 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(IList cmpntEntities) { 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 = 1200; DataBits = 8; Parity = System.IO.Ports.Parity.Odd; 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 ICollection ParamValues(int i) { IList list = new List(); 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 IParamsProvider Clone() { HartCfg pars = new HartCfg(); CopyContentTo(pars); return pars; } public bool UpdateEmbeddedDbEntity() { return true; /// =OK, do nothing } } }