/// /// Copyright (c) 2015-2021 Sensus Slovensko a.s. /// using System.Collections.Generic; using System.IO.Ports; using System.Xml.Serialization; using Common; using Config.Entities; using TBF.Rig.Generic; namespace TBF.Rig.Modbus.Common { public class ModbusCfg : ComponentCfgBase, IComponentCfg, IParamsProvider { public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(ModbusCfg) })[0]; public override XmlSerializer GetSerializer() { return Serializer; } public IComponentCfgCtrl GetControl(IList cmpntEntities) { return new Configs.ParamsProvider.ComponentCfgCtrl(this, null); } /// /// Serialized parameters /// public int ComPortNr; public int BaudRate; public Parity Parity; public int DataBits; public StopBits StopBits; public Handshake Handshake; /// Private parameterless constructor invoked by all other (public) constructors ModbusCfg() { } public ModbusCfg(string name, IComponentFactory factory) { Name = name; Factory = factory; ParentName = string.Empty; InitializeAll(); } public string ComponentName { get { return Name; } } public void InitializeAll() { ComPortNr = 3; BaudRate = 9600; Parity = System.IO.Ports.Parity.None; DataBits = 8; StopBits = System.IO.Ports.StopBits.One; Handshake = System.IO.Ports.Handshake.None; } string[] paramNames = new string[] { "Serial port number", /// 0 "Baud rate", /// 1 "Parity", /// 2 "Data bits", /// 3 "Stop bits", /// 4 "Handshake", /// 5 }; public string ParamName(int i) { return paramNames[i]; } public int ParamsCount() { return paramNames.Length; } public ICollection ParamValues(int i) { switch (i) { case 1: return new string[] { "150", "300", "600", "1200", "2400", "4800", "9600", "19200", "38400", "57600", "76800", "115200"}; case 2: return new string[] { Parity.None.ToString(), Parity.Odd.ToString(), Parity.Even.ToString() }; case 3: return new string[] { "7", "8" }; case 4: return new string[] { StopBits.None.ToString(), StopBits.One.ToString(), StopBits.OnePointFive.ToString(), StopBits.Two.ToString() }; case 5: return new string[] { Handshake.None.ToString(), Handshake.XOnXOff.ToString(), Handshake.RequestToSend.ToString(), Handshake.RequestToSendXOnXOff.ToString() }; default: return null; } } public string ToString(int i) { switch (i) { case 0: return ComPortNr.ToString(); case 1: return BaudRate.ToString(); case 2: return Parity.ToString(); case 3: return DataBits.ToString(); case 4: return StopBits.ToString(); case 5: return Handshake.ToString(); default: return string.Format("{0}: Com{1}, {2}Bd, {3}-bits, parity={4}, stopBits={5}, {6}", Name, ComPortNr, BaudRate, DataBits, Parity, StopBits, Handshake); } } public CfgUpdateFlags UpdateParam(int i, string str) { switch (i) { case 0: ComPortNr = int.Parse(str); return CfgUpdateFlags.RestartRqrd; case 1: BaudRate = int.Parse(str); return CfgUpdateFlags.RestartRqrd; case 2: Parity = TBF.Utils.GetParity(str); return CfgUpdateFlags.RestartRqrd; case 3: DataBits = int.Parse(str); return CfgUpdateFlags.RestartRqrd; case 4: StopBits = TBF.Utils.GetStopBits(str); return CfgUpdateFlags.RestartRqrd; case 5: Handshake = TBF.Utils.GetHandshake(str); return CfgUpdateFlags.RestartRqrd; default: return CfgUpdateFlags.None; } } public bool ValidateParam(int i, string strValue, out string message) { message = string.Empty; int idummy; switch (i) { case 0: if (int.TryParse(strValue, out idummy) && idummy > 0) return true; break; case 1: case 2: case 3: case 4: case 5: if (ParamValues(i).Contains(strValue)) return true; break; default: message = "Invalid index"; return false; } message = ParamName(i) + " is invalid"; return false; } void CopyContentTo(ModbusCfg prms) { prms.ComPortNr = this.ComPortNr; prms.BaudRate = this.BaudRate; prms.Parity = this.Parity; prms.DataBits = this.DataBits; prms.StopBits = this.StopBits; prms.Handshake = this.Handshake; } public IParamsProvider Clone() { ModbusCfg pars = new ModbusCfg(); CopyContentTo(pars); return pars; } public bool UpdateEmbeddedDbEntity() { return true; /// =OK, do nothing } } }