diff --git a/TBF/Boxes/DoubleBox.cs b/TBF/Boxes/DoubleBox.cs index d66eb3698..6cc20a0e7 100644 --- a/TBF/Boxes/DoubleBox.cs +++ b/TBF/Boxes/DoubleBox.cs @@ -76,7 +76,7 @@ namespace TBF.Boxes } else { - return string.Format(Format, Val * Factor); + return string.Format(string.Format("{{0:{0}}}", Format), Val * Factor); } } diff --git a/TBF/Rig/BuiltIn/SetValvesOp.cs b/TBF/Rig/BuiltIn/SetValvesOp.cs index 5745b2d69..404440ddd 100644 --- a/TBF/Rig/BuiltIn/SetValvesOp.cs +++ b/TBF/Rig/BuiltIn/SetValvesOp.cs @@ -3,6 +3,7 @@ /// using System; using System.Collections.Generic; +using Common; using log4net; using Dirichlet.Numerics; using TBF.Boxes; @@ -273,6 +274,11 @@ namespace TBF.Rig.BuiltIn /// Start this operation public void Start() { + if (cb.DebugLevel == DebugMode.Simulate) + { + return ; + } + UInt128 changed = cb.SetValves(switchPoints[0].MasksOpen, switchPoints[0].MasksClose, StateMachine.LogicalFnValves); if (timeStamp != null && switchPoints[0].TimeSec == timeShift) @@ -291,7 +297,12 @@ namespace TBF.Rig.BuiltIn /// public Event Run() { - if (nextIx >= switchPoints.Count) + if (cb.DebugLevel == DebugMode.Simulate) + { + return Event.ValvesSet; + } + + if (nextIx >= switchPoints.Count) { return (StateMachine.Time >= swStartTime + maxDelayTime + waitOnCBDelay) ? Event.ValvesSet : Event.ValvesBusy; } @@ -320,6 +331,11 @@ namespace TBF.Rig.BuiltIn /// Start this operation public void Stop() { + if (cb.DebugLevel == DebugMode.Simulate) + { + return; + } + if (switchTime != null && startStopValveBitNr >= 16 && startStopValveBitNr <= 23 && cb is ControlBoard.Uni.UniCB) { switchTime.Val = (cb as ControlBoard.Uni.UniCB).Data.ValveSwitchTime[startStopValveBitNr - 16]; diff --git a/TBF/Rig/RegisterReaders/FrequencyMeterFromUniCB/Factory.cs b/TBF/Rig/RegisterReaders/FrequencyMeterFromUniCB/Factory.cs new file mode 100644 index 000000000..3c1304afe --- /dev/null +++ b/TBF/Rig/RegisterReaders/FrequencyMeterFromUniCB/Factory.cs @@ -0,0 +1,24 @@ +using System.Collections.Generic; +using Config.Entities; +using TBF.Rig.Generic; + +namespace TBF.Rig.RegisterReaders.FrequencyMeterFromUniCB +{ + public class Factory : IComponentFactory + { + public string ClassName { get { return GetType().Namespace.Substring(8); } } + + public override string ToString() { return ClassName; } + + public IComponent DummyComponent() { return new FrequencyRegisterReader(); } + + public IComponent GetComponent(IComponentCfg cfg, IList components) { return new FrequencyRegisterReader(cfg, components); } + + public IComponentCfg DefaultConfig() { return new RRCfg("Frequency", this); } + + public IComponentCfg CmpntCfgFromCmpntEntity(Component component) + { + return ComponentCfgBase.CreateFromDbEntity(RRCfg.Serializer, component, this); + } + } +} \ No newline at end of file diff --git a/TBF/Rig/RegisterReaders/FrequencyMeterFromUniCB/FrequencyRegisterReader.cs b/TBF/Rig/RegisterReaders/FrequencyMeterFromUniCB/FrequencyRegisterReader.cs new file mode 100644 index 000000000..0d0e15e36 --- /dev/null +++ b/TBF/Rig/RegisterReaders/FrequencyMeterFromUniCB/FrequencyRegisterReader.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using Common; +using log4net; +using TBF.Rig.GenericDevices; + +namespace TBF.Rig.RegisterReaders.FrequencyMeterFromUniCB +{ + public class FrequencyRegisterReader : ComponentBase, GenericDevices.IRegReader + { + private static readonly ILog log = LogManager.GetLogger(typeof(FrequencyRegisterReader)); + + public override string ToString() { return string.Format("{0}({1})", ClassName, Cfg.ToString(-1)); } + + readonly RRCfg rrCfg; + readonly TBF.Rig.ControlBoard.IControlBoard cb; + + public int Position { get{ return rrCfg.Position; } } + public Common.RegisterReaderType RegisterReaderType { get { return Common.RegisterReaderType.Pulses; } } + public double PulsesPerLtr { get { return rrCfg.ProcParams.PulsesPerLtr; } } + public double LtrsPerPulse { get { return (PulsesPerLtr <= float.Epsilon) ? 1.0 : (1 / PulsesPerLtr); ; } } + public int Filter { get { return rrCfg.ProcParams.Filter; } } + + public int WMPulses { get { return cb.PulsesWM(Position); } } + public int WMRefPulses { get { return cb.RefPulsesWM(Position); } } + public double WMVolume { get { return LtrsPerPulse * Convert.ToDouble(WMPulses); } } + + public double BeginWMState { get { return 0; } } /// Always 0 + public double EndWMState { get { return WMVolume; } } /// Derived from WMVolume + + + public FrequencyRegisterReader() { } + + public FrequencyRegisterReader(Generic.IComponentCfg cfg, IList components) + : base(cfg) + { + rrCfg = cfg as RRCfg; + + cb = TbfComponents.FindComponent(cfg.ParentName, components) as TBF.Rig.ControlBoard.IControlBoard; + if (cb == null) throw new Exception("Cannot find " + Name + " parent"); + + log.Warn(this.ToString()); + } + + public override void Initialize() { } + } +} \ No newline at end of file diff --git a/TBF/Rig/RegisterReaders/FrequencyMeterFromUniCB/RRCfg.cs b/TBF/Rig/RegisterReaders/FrequencyMeterFromUniCB/RRCfg.cs new file mode 100644 index 000000000..eb4250125 --- /dev/null +++ b/TBF/Rig/RegisterReaders/FrequencyMeterFromUniCB/RRCfg.cs @@ -0,0 +1,51 @@ +using System.Collections.Generic; +using System.Xml.Serialization; +using Common; +using Config.Entities; +using TBF.Rig.Generic; + +namespace TBF.Rig.RegisterReaders.FrequencyMeterFromUniCB +{ + public class RRCfg : ComponentCfgBase, Generic.IChildComponentCfg + { + + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(RRCfg) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + IComponentCfgCtrl IComponentCfg.GetControl(IList cmpntEntities) { return new RRCfgCtrl(); } + + /// + /// Serialized parameters + /// + public int Position; /// 1..nrWaterMeters + + /// Procedure parameters + [XmlIgnore] + public RRProcParams ProcParams; + public override IParamsProvider GetRuntimeProcParamsProvider() { return ProcParams; } + public override IParamsProvider CreateProcParamsProvider() { return new RRProcParams(true); } + + /// Private parameterless constructor invoked by all other (public) constructors + RRCfg() + { + ProcParams = new RRProcParams(true); + } + + public RRCfg(string name, IComponentFactory factory) + : this() + { + Name = name; + Factory = factory; + ParentName = "UniCB"; + Position = 1; + } + + string IComponentCfg.ToString(int i) + { + return string.Format("Name={0}, Parent={1}, Position={2}", + Name, + (string.IsNullOrEmpty(ParentName) ? "-" : ParentName), + Position); + } + } +} \ No newline at end of file diff --git a/TBF/Rig/RegisterReaders/FrequencyMeterFromUniCB/RRCfgCtrl.cs b/TBF/Rig/RegisterReaders/FrequencyMeterFromUniCB/RRCfgCtrl.cs new file mode 100644 index 000000000..9d148c43f --- /dev/null +++ b/TBF/Rig/RegisterReaders/FrequencyMeterFromUniCB/RRCfgCtrl.cs @@ -0,0 +1,106 @@ +/// +/// Copyright (c) 2021 Sensus Slovensko a.s. +/// +using System; +using System.Windows.Forms; +using Common; +using TBF.Rig.Generic; +using TBF.UI.Bench.Components; + +namespace TBF.Rig.RegisterReaders.FrequencyMeterFromUniCB +{ + public partial class RRCfgCtrl : UserControl, IComponentCfgCtrl + { + ComponentParametersDlg parent; + + bool IComponentCfgCtrl.ShowMore { get { return false; } } + + RRCfg config; + + IComponentCfg IComponentCfgCtrl.Config + { + get { return config as IComponentCfg; } + set + { + config = value as RRCfg; + Redraw(); + } + } + + public RRCfgCtrl() + { + InitializeComponent(); + } + + private void RegisterReaderCfgCtrl_Load(object sender, EventArgs e) + { + parent = ParentForm as ComponentParametersDlg; + if (parent == null) return; + + if (parent.CmpntEntities != null) + { + foreach (var cmpnt in parent.CmpntEntities) + { + if (TbfComponents.CmpntFactoryFromClassName(cmpnt.ClassName) is ControlBoard.Uni.Factory) + { + parentNameComboBox.Items.Add(cmpnt.Name); + } + } + } + + Redraw(); + } + + void IComponentCfgCtrl.Closing() + { + } + + void Redraw() + { + if (config == null) return; /// Control was not loaded, settings were not changed + + componentNameLabel.Text = config.Factory.ClassName; + nameTextBox.Text = config.Name; + parentNameComboBox.Text = string.IsNullOrEmpty(config.ParentName) ? "---" : config.ParentName; + positionTextBox.Text = config.Position.ToString(); + } + + void IComponentCfgCtrl.Unlock() + { + nameTextBox.Enabled = true; + parentNameComboBox.Enabled = true; + positionTextBox.Enabled = true; + } + + CfgUpdateFlags IComponentCfgCtrl.VerifyCfg(ref string message) + { + CfgUpdateFlags flags = CfgUpdateFlags.None; + + int dummy; + if (!parentNameComboBox.Items.Contains(parentNameComboBox.Text)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "Invalid 'Parent Name'"; + } + if (!int.TryParse(positionTextBox.Text, out dummy) || (dummy < 1)) + { + flags |= CfgUpdateFlags.Error; + message += Environment.NewLine + "'Position' should be >= 1"; + } + return flags; + } + + CfgUpdateFlags IComponentCfgCtrl.UpdateCfg() + { + CfgUpdateFlags flags = CfgUpdateFlags.RestartRqrd; + + if (config == null) return CfgUpdateFlags.Error; /// Control was not loaded, settings were not changed + + config.Name = nameTextBox.Text; + config.ParentName = parentNameComboBox.Text.Equals("---") ? string.Empty : parentNameComboBox.Text; + config.Position = int.Parse(positionTextBox.Text); + + return flags; + } + } +} diff --git a/TBF/Rig/RegisterReaders/FrequencyMeterFromUniCB/RRCfgCtrl.designer.cs b/TBF/Rig/RegisterReaders/FrequencyMeterFromUniCB/RRCfgCtrl.designer.cs new file mode 100644 index 000000000..b001066db --- /dev/null +++ b/TBF/Rig/RegisterReaders/FrequencyMeterFromUniCB/RRCfgCtrl.designer.cs @@ -0,0 +1,133 @@ +/// +/// Copyright (c) 2021 Sensus Slovensko a.s. +/// +namespace TBF.Rig.RegisterReaders.FrequencyMeterFromUniCB +{ + partial class RRCfgCtrl + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.positionTextBox = new System.Windows.Forms.TextBox(); + this.positionLabel = new System.Windows.Forms.Label(); + this.parentNameLabel = new System.Windows.Forms.Label(); + this.nameTextBox = new System.Windows.Forms.TextBox(); + this.nameLabel = new System.Windows.Forms.Label(); + this.componentNameLabel = new System.Windows.Forms.Label(); + this.parentNameComboBox = new System.Windows.Forms.ComboBox(); + this.SuspendLayout(); + // + // positionTextBox + // + this.positionTextBox.Enabled = false; + this.positionTextBox.Location = new System.Drawing.Point(136, 119); + this.positionTextBox.Name = "positionTextBox"; + this.positionTextBox.Size = new System.Drawing.Size(46, 20); + this.positionTextBox.TabIndex = 6; + // + // positionLabel + // + this.positionLabel.AutoSize = true; + this.positionLabel.Location = new System.Drawing.Point(26, 122); + this.positionLabel.Name = "positionLabel"; + this.positionLabel.Size = new System.Drawing.Size(44, 13); + this.positionLabel.TabIndex = 5; + this.positionLabel.Text = "Position"; + // + // parentNameLabel + // + this.parentNameLabel.AutoSize = true; + this.parentNameLabel.Location = new System.Drawing.Point(26, 96); + this.parentNameLabel.Name = "parentNameLabel"; + this.parentNameLabel.Size = new System.Drawing.Size(69, 13); + this.parentNameLabel.TabIndex = 3; + this.parentNameLabel.Text = "Parent Name"; + // + // nameTextBox + // + this.nameTextBox.Enabled = false; + this.nameTextBox.Location = new System.Drawing.Point(136, 67); + this.nameTextBox.Name = "nameTextBox"; + this.nameTextBox.Size = new System.Drawing.Size(130, 20); + this.nameTextBox.TabIndex = 2; + // + // nameLabel + // + this.nameLabel.AutoSize = true; + this.nameLabel.Location = new System.Drawing.Point(26, 70); + this.nameLabel.Name = "nameLabel"; + this.nameLabel.Size = new System.Drawing.Size(35, 13); + this.nameLabel.TabIndex = 1; + this.nameLabel.Text = "Name"; + // + // componentNameLabel + // + this.componentNameLabel.AutoSize = true; + this.componentNameLabel.Location = new System.Drawing.Point(133, 43); + this.componentNameLabel.Name = "componentNameLabel"; + this.componentNameLabel.Size = new System.Drawing.Size(83, 13); + this.componentNameLabel.TabIndex = 0; + this.componentNameLabel.Text = "ComonentName"; + // + // parentNameComboBox + // + this.parentNameComboBox.Enabled = false; + this.parentNameComboBox.FormattingEnabled = true; + this.parentNameComboBox.Location = new System.Drawing.Point(136, 93); + this.parentNameComboBox.Name = "parentNameComboBox"; + this.parentNameComboBox.Size = new System.Drawing.Size(130, 21); + this.parentNameComboBox.TabIndex = 4; + // + // RegisterReaderCfgCtrl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.parentNameComboBox); + this.Controls.Add(this.positionTextBox); + this.Controls.Add(this.positionLabel); + this.Controls.Add(this.parentNameLabel); + this.Controls.Add(this.nameTextBox); + this.Controls.Add(this.nameLabel); + this.Controls.Add(this.componentNameLabel); + this.Name = "RegisterReaderCfgCtrl"; + this.Size = new System.Drawing.Size(300, 200); + this.Load += new System.EventHandler(this.RegisterReaderCfgCtrl_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox positionTextBox; + private System.Windows.Forms.Label positionLabel; + private System.Windows.Forms.Label parentNameLabel; + private System.Windows.Forms.TextBox nameTextBox; + private System.Windows.Forms.Label nameLabel; + private System.Windows.Forms.Label componentNameLabel; + private System.Windows.Forms.ComboBox parentNameComboBox; + } +} diff --git a/TBF/Rig/RegisterReaders/FrequencyMeterFromUniCB/RRCfgCtrl.resx b/TBF/Rig/RegisterReaders/FrequencyMeterFromUniCB/RRCfgCtrl.resx new file mode 100644 index 000000000..d58980a38 --- /dev/null +++ b/TBF/Rig/RegisterReaders/FrequencyMeterFromUniCB/RRCfgCtrl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/TBF/Rig/RegisterReaders/FrequencyMeterFromUniCB/RRProcParams.cs b/TBF/Rig/RegisterReaders/FrequencyMeterFromUniCB/RRProcParams.cs new file mode 100644 index 000000000..228c8a8c3 --- /dev/null +++ b/TBF/Rig/RegisterReaders/FrequencyMeterFromUniCB/RRProcParams.cs @@ -0,0 +1,132 @@ +/// +/// Copyright (c) 2021 Sensus Slovensko a.s. +/// +using System; +using System.IO; +using System.Text; +using System.Xml.Serialization; +using Common; +using Config.Entities; +using TBF.Rig.Generic; +using TBF.Resources; + +namespace TBF.Rig.RegisterReaders.FrequencyMeterFromUniCB +{ + public class RRProcParams : ProcedureParamsBase, IParamsProvider, IProcedureParams + { + public static XmlSerializer Serializer = XmlSerializer.FromTypes(new[] { typeof(RRProcParams) })[0]; + public override XmlSerializer GetSerializer() { return Serializer; } + + public double PulsesPerLtr; /// [l^-1] + public int Filter; + + public override void InitializeAll() + { + PulsesPerLtr = 1.0; + Filter = 0; + } + + string[] paramNames = new string[] + { + Strings.PulsesPerLtr, + Strings.Filter, + }; + public override string ParamName(int i) { return paramNames[i]; } + public override int ParamsCount() { return paramNames.Length; } + + public override string ToString(int i) + { + switch (i) + { + case 0: return PulsesPerLtr.ToString(); + case 1: return Filter.ToString(); + default: return string.Empty; + } + } + + /// Retrieves parameters from UI controls + CfgUpdateFlags IParamsProvider.UpdateParam(int i, string strValue) + { + switch (i) + { + case 0: PulsesPerLtr = Utils.ParseUDouble(strValue); return CfgUpdateFlags.None; + case 1: Filter = int.Parse(strValue); return CfgUpdateFlags.None; + default: return CfgUpdateFlags.None; + } + } + + /// Verifies whether strings in UI controls represent valid parameters + bool IParamsProvider.ValidateParam(int i, string strValue, out string message) + { + message = string.Empty; + + double dummy; + int idummy; + switch (i) + { + case 0: + if (Utils.TryParseUDouble(strValue, out dummy)) return true; + break; + + case 1: + if (int.TryParse(strValue, out idummy) && (idummy >= 0)) return true; + break; + + default: + message = "Invalid index"; + return false; + } + + message = ParamName(i) + " is invalid"; + return false; + } + + void CopyContentTo(RRProcParams prms) + { + prms.PulsesPerLtr = this.PulsesPerLtr; + prms.Filter = this.Filter; + } + + IParamsProvider IParamsProvider.Clone() + { + RRProcParams pars = new RRProcParams(); + CopyContentTo(pars); + return pars; + } + + public override void UpdateFromDbEntity(ComponentProcedure dbEntity) + { + if (dbEntity == null) return; + try + { + RRProcParams tmp = Serializer.Deserialize(new StringReader(dbEntity.Parameters)) as RRProcParams; + + procedureParamsEntity = dbEntity; + componentName = dbEntity.CmpntName; + procedure = dbEntity.Procedure; + + if (tmp != null) tmp.CopyContentTo(this); + } + catch + { + } + } + + + public RRProcParams() + { + } + + public RRProcParams(bool initialize) + { + if (initialize) InitializeAll(); + } + + public RRProcParams(ComponentProcedure procedureParamsEntity, string componentName, Procedure procedure) + { + this.procedureParamsEntity = procedureParamsEntity; + this.componentName = componentName; + this.procedure = procedure; + } + } +} diff --git a/TBF/Rig/Sequences/ProcessData.cs b/TBF/Rig/Sequences/ProcessData.cs index 869ae5333..105741a3c 100644 --- a/TBF/Rig/Sequences/ProcessData.cs +++ b/TBF/Rig/Sequences/ProcessData.cs @@ -539,12 +539,10 @@ namespace TBF.Rig.Sequences //---endnew2 (outPath.Scale is IScale) ? (outPath.Scale as IScale).Mass : 0, /// collected water mass in kg "VolMM", - //---new2 - AmbTemp.ToString(), /// ambient temperature in degree C - AmbHumi.ToString(), /// ambient humidity in R% - AmbPress.ToString(), /// ambient pressure in mbar (= 1 hPa) - //---endnew2 - outPath.RegValve.Position.ToString("F1")); /// regulation valve position in % (0=closed / 100=open) + AmbTemp, /// ambient temperature in degree C + AmbHumi, /// ambient humidity in R% + AmbPress, /// ambient pressure in mbar (= 1 hPa) + outPath.RegValve?.Position.ToString("F1")); /// regulation valve position in % (0=closed / 100=open) } public void LogProcessDataHeaderHeatMeters(ILog logger, string sectionName) diff --git a/TBF/Rig/Sequences/SequenceBase.cs b/TBF/Rig/Sequences/SequenceBase.cs index 437f880fe..55859fe1c 100644 --- a/TBF/Rig/Sequences/SequenceBase.cs +++ b/TBF/Rig/Sequences/SequenceBase.cs @@ -1505,23 +1505,25 @@ namespace TBF.Rig.Sequences tstRslt.DensityLine = Formulas.RealDensity(); tstRslt.DensityDiv = Formulas.RealDensity(); + double flowMeterLtrPerPulse = outPath.FlowMeter?.LtrPerPulse ?? 1; + tstRslt.MethodClass = TbfComponents.FindComponent(test.Method).ClassName; tstRslt.StartTime = DateTime.Now; tstRslt.EndTime = DateTime.Now + new TimeSpan(0, 0, 1); tstRslt.FlowSetTime = 10; tstRslt.TestTime = tstRslt.TargetTime(); - tstRslt.PulsesMaster = (outPath.FlowMeter.LtrPerPulse > 1E-6) ? (1.0075 * tstRslt.TargetVolume() / outPath.FlowMeter.LtrPerPulse) : 1; + tstRslt.PulsesMaster = (flowMeterLtrPerPulse > 1E-6) ? (1.0075 * tstRslt.TargetVolume() / flowMeterLtrPerPulse) : 1; tstRslt.MassStartRaw = 0; tstRslt.MassStart = MeasurementCorrection.CorrectedValue(tstRslt.MassStartRaw, outPath.Scale.Corrections); tstRslt.MassEndRaw = tstRslt.TargetVolume() * Formulas.RealDensity() / 1000.0f; tstRslt.MassEnd = MeasurementCorrection.CorrectedValue(tstRslt.MassEndRaw, outPath.Scale.Corrections); - tstRslt.Flow = 3.6 * outPath.FlowMeter.LtrPerPulse * tstRslt.PulsesMaster / tstRslt.TestTime; + tstRslt.Flow = 3.6 * flowMeterLtrPerPulse * tstRslt.PulsesMaster / tstRslt.TestTime; tstRslt.MassOfEvapWater = 0; tstRslt.VolumeCTV = 1000 * tstRslt.Batch.Buoyancy * (tstRslt.MassEnd - tstRslt.MassStart) / tstRslt.DensityLine; /// [l] commercially true volume - tstRslt.VolumeMaster = outPath.FlowMeter.LtrPerPulse * tstRslt.PulsesMaster; /// [l] volume from the master flow meter - tstRslt.ConstMasterRaw = outPath.FlowMeter.LtrPerPulse; /// Uncorrected master flowmeter coefficient - tstRslt.ConstMasterCorr = outPath.FlowMeter.LtrPerPulseCorrected(tstRslt.Flow, tstRslt.TempDownMean); /// Corrected master pulses per liter - tstRslt.ConstMaster = (tstRslt.VolumeMaster == 0) ? tstRslt.ConstMasterCorr : (outPath.FlowMeter.LtrPerPulse * tstRslt.VolumeCTV / tstRslt.VolumeMaster); + tstRslt.VolumeMaster = flowMeterLtrPerPulse * tstRslt.PulsesMaster; /// [l] volume from the master flow meter + tstRslt.ConstMasterRaw = flowMeterLtrPerPulse; /// Uncorrected master flowmeter coefficient + tstRslt.ConstMasterCorr = outPath.FlowMeter?.LtrPerPulseCorrected(tstRslt.Flow, tstRslt.TempDownMean) ?? 1; /// Corrected master pulses per liter + tstRslt.ConstMaster = (tstRslt.VolumeMaster == 0) ? tstRslt.ConstMasterCorr : (flowMeterLtrPerPulse * tstRslt.VolumeCTV / tstRslt.VolumeMaster); tstRslt.ErrorMaster = Formulas.ErrorFromVolumes(tstRslt.VolumeMaster, tstRslt.VolumeCTV); diff --git a/TBF/Rig/TbfComponents.cs b/TBF/Rig/TbfComponents.cs index e18216a7d..e27775ed3 100644 --- a/TBF/Rig/TbfComponents.cs +++ b/TBF/Rig/TbfComponents.cs @@ -125,6 +125,7 @@ namespace TBF.Rig new BuiltIn.PumpTandem.PumpFactory(), new RegisterReaders.DataStream.MefImport.Factory(), /// 'Interface for data stream stream via MEF' new RegisterReaders.DataStream.Reader.Factory(), /// 'RegisterReader for data stream stream via MEF' + new RegisterReaders.FrequencyMeterFromUniCB.Factory(), /// new RegisterReaders.PulsesFromUniCB.Factory(), /// 'RegisterReader' new RegisterReaders.StandingStartStop.Factory(), /// 'RegisterReader for standing start/stop' new TestMethods.iPerlCommunication.iPerlHead.Factory(), /// 'RegisterReader for iPerl' diff --git a/TBF/Rig/TestMethods/LeakTest/LeakTestSeq.cs b/TBF/Rig/TestMethods/LeakTest/LeakTestSeq.cs index b7f3c9313..8a3a3b8a1 100644 --- a/TBF/Rig/TestMethods/LeakTest/LeakTestSeq.cs +++ b/TBF/Rig/TestMethods/LeakTest/LeakTestSeq.cs @@ -123,6 +123,11 @@ namespace TBF.Rig.TestMethods.LeakTest Bridge.OnActivity(this, Strings.Setting_the_water_pressure); Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.FlowSetting)); //------------------------------------------------ + + //TODO BUMI - check this possition for sstart logging - when finish remove this comment + //--- log start process in this section + LogProcessDataTestInfo(processDataLogger, test.Procedure.Name, test.Name); + float pumpPower = test.PumpPower; int startTime = StateMachine.Time; @@ -214,10 +219,14 @@ namespace TBF.Rig.TestMethods.LeakTest Bridge.OnActivity(this, Strings.Test_in_progress); Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.Test)); //------------------------------------------------ + + LogProcessDataHeader(processDataLogger, "Maximum water pressure set"); + State.Create(string.Format("{0}({1}) : Maximum water pressure set", test.Method, test.Name)) .AddOperation(checkUiOp) .AddOperations(readTempPressOps) .AddOperation(new Operations.TimerOp(testParams.DurationPMax)) + .AddOperation(processDataLoggingOp) .EnterState(); do { e = StateMachine.WaitRunDevsRunOps(); @@ -246,10 +255,14 @@ namespace TBF.Rig.TestMethods.LeakTest //----------------------------------------------------- Bridge.OnActivity(this, Strings.Measuring_the_weight); //----------------------------------------------------- + + LogProcessDataHeader(processDataLogger, "Measuring the start mass"); + State.Create(string.Format("{0}({1}) : Measuring the start mass", test.Method, test.Name)) .AddOperation(checkUiOp) .AddOperations(readTempPressOps) .AddOperation(scale.ReadStableMassOp(ref StartMass, test.TimeFlow2Mass, test.MassMethod, test.MassRepeats, test.MassSpread)) + .AddOperation(processDataLoggingOp) .EnterState(); do { e = StateMachine.WaitRunDevsRunOps(); @@ -275,10 +288,14 @@ namespace TBF.Rig.TestMethods.LeakTest ///------------------------------------------------ Bridge.OnActivity(this, Strings.Test_in_progress); ///------------------------------------------------ + + LogProcessDataHeader(processDataLogger, "Starting the test"); + State.Create(string.Format("{0}({1}) : Starting the test", test.Method, test.Name)) .AddOperation(checkUiOp) .AddOperations(readTempPressOps) .AddOperation(new Operations.TimerOp(testParams.DurationLeak)) + .AddOperation(processDataLoggingOp) .EnterState(); do { e = StateMachine.WaitRunDevsRunOps(); @@ -305,10 +322,14 @@ namespace TBF.Rig.TestMethods.LeakTest //----------------------------------------------------- Bridge.OnActivity(this, Strings.Measuring_the_weight); //----------------------------------------------------- + + LogProcessDataHeader(processDataLogger, " Measuring the end mass"); + State.Create(string.Format("{0}({1}) : Measuring the end mass", test.Method, test.Name)) .AddOperation(checkUiOp) .AddOperations(readTempPressOps) .AddOperation(scale.ReadStableMassOp(ref EndMass, test.TimeStop2Mass, test.MassMethod, test.MassRepeats, test.MassSpread)) + .AddOperation(processDataLoggingOp) .EnterState(); do { e = StateMachine.WaitRunDevsRunOps(); diff --git a/TBF/Rig/TestMethods/PMaxTest/PMaxTestSeq.cs b/TBF/Rig/TestMethods/PMaxTest/PMaxTestSeq.cs index a69cd7ffb..876b5ae2d 100644 --- a/TBF/Rig/TestMethods/PMaxTest/PMaxTestSeq.cs +++ b/TBF/Rig/TestMethods/PMaxTest/PMaxTestSeq.cs @@ -111,7 +111,7 @@ namespace TBF.Rig.TestMethods.PMaxTest Bridge.OnActivity(this, Strings.Setting_the_water_pressure); Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.FlowSetting)); //------------------------------------------------ - + float pumpPower = test.PumpPower; while (true) { @@ -175,11 +175,21 @@ namespace TBF.Rig.TestMethods.PMaxTest int startTime = StateMachine.Time; int endTime = startTime + testParams.DurationPMax; + + //TODO BUMI - check this possition for sstart logging - when finish remove this comment + //--- log start process in this section + LogProcessDataTestInfo(processDataLogger, test.Procedure.Name, test.Name); //------------------------------------------------ Bridge.OnActivity(this, Strings.Test_in_progress); Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Progress.Test)); //------------------------------------------------ + + //TODO BUMI - check if is ok possition to start logging - at last remove comment + //--- log start process in this section + LogProcessDataHeader(processDataLogger, "Starting the test"); + + /*//---new1 LogProcessDataTestInfo(processDataLogger, test.Procedure.Name, test.Name); @@ -194,10 +204,8 @@ namespace TBF.Rig.TestMethods.PMaxTest .AddOperation(checkUiOp) .AddOperations(readTempPressOps) .AddOperation(new Operations.TimerOp(testParams.DurationPMax)) - //---new1 - .AddOperation(processDataLoggingOp) - //---endNew1 - .EnterState(); + .AddOperation(processDataLoggingOp) + .EnterState(); do { e = StateMachine.WaitRunDevsRunOps(); @@ -213,7 +221,8 @@ namespace TBF.Rig.TestMethods.PMaxTest Bridge.OnActivity(this, string.Format("{0} ... {1} s", Strings.Test_in_progress, remainingTime)); } while (e.Contains(Event.TimerBusy)); - + + /// /// PMaxTest completed /// diff --git a/TBF/TBF.csproj b/TBF/TBF.csproj index 9c6f280cb..20c0d8927 100644 --- a/TBF/TBF.csproj +++ b/TBF/TBF.csproj @@ -1152,6 +1152,16 @@ WriterCfgCtrl.cs + + + + + UserControl + + + RRCfgCtrl.cs + + @@ -3041,6 +3051,9 @@ WriterCfgCtrl.cs + + RRCfgCtrl.cs + CycleBeginningForm.cs diff --git a/TBF/UI/Bench/Components/ComponentsManagerDlg.cs b/TBF/UI/Bench/Components/ComponentsManagerDlg.cs index a8aee6825..534e9f0a1 100644 --- a/TBF/UI/Bench/Components/ComponentsManagerDlg.cs +++ b/TBF/UI/Bench/Components/ComponentsManagerDlg.cs @@ -1,9 +1,11 @@ /// /// Copyright (c) 2013-2021 Sensus Slovensko a.s. /// + using System; using System.Collections.Generic; using System.IO; +using System.Web.UI; using System.Windows.Forms; using log4net; using NHibernate; @@ -13,27 +15,31 @@ using Config.Entities; using TBF.Rig; using TBF.Rig.Generic; using TBF.Resources; +using TBF.Rig.GenericDevices; +using TBF.Rig.WaterMeters.WaterMeter; using TBF.UI.Shared; namespace TBF.UI.Bench.Components { - public partial class ComponentsManagerDlg : Form, IParentOfListViewEx - { - static readonly ILog log = LogManager.GetLogger(typeof(ComponentsManagerDlg)); + public partial class ComponentsManagerDlg : Form, IParentOfListViewEx + { + static readonly ILog log = LogManager.GetLogger(typeof(ComponentsManagerDlg)); - /// - /// List of components (=component configuration instances) - /// - IList cmpntEntities; + /// + /// List of components (=component configuration instances) + /// + IList cmpntEntities; - IList toBeDeletedEntities; + IList toBeDeletedEntities; - ISession session; + ISession session; - SelectComponentClassDlg selectComponentTypeDlg; /// Constructed once, the selection is kept between dialog usages + SelectComponentClassDlg selectComponentTypeDlg; - CfgUpdateFlags flags; /// Or-ed from particular Flags from ComponentParametersDlg - + /// Constructed once, the selection is kept between dialog usages + CfgUpdateFlags flags; + + /// Or-ed from particular Flags from ComponentParametersDlg /// /// ListViewEx columns /// @@ -50,27 +56,29 @@ namespace TBF.UI.Bench.Components } MySortOrder sortOrder = MySortOrder.Ascending; - int sortColumn = -1; /// 0-based index of column to be used for sorting + int sortColumn = -1; - /// Editors used by listViewEx + /// 0-based index of column to be used for sorting + /// Editors used by listViewEx ComboBox debugCB; + ComboBox logCB; - bool unlocked; + bool unlocked; - public ComponentsManagerDlg() - { - toBeDeletedEntities = new List(); + public ComponentsManagerDlg() + { + toBeDeletedEntities = new List(); - InitializeComponent(); + InitializeComponent(); - flags = CfgUpdateFlags.None; + flags = CfgUpdateFlags.None; - selectComponentTypeDlg = new SelectComponentClassDlg(); + selectComponentTypeDlg = new SelectComponentClassDlg(); - /// SharedDlgButtons configuration + /// SharedDlgButtons configuration sharedButtons.ParentForm = this; - sharedButtons.RequiredGroupMembership = new GID[] { GID.Metrologists }; + sharedButtons.RequiredGroupMembership = new GID[] { GID.Metrologists }; sharedButtons.OptionalButtons = SharedButtons.Buttons.Add | SharedButtons.Buttons.Remove | @@ -81,34 +89,35 @@ namespace TBF.UI.Bench.Components SharedButtons.Buttons.Export | SharedButtons.Buttons.Import; sharedButtons.Unlocked += Unlocked; - sharedButtons.OKClicked += okButton_Click; - sharedButtons.CancelClicked += cancelButton_Click; - sharedButtons.AddClicked += addButton_Click; - sharedButtons.RemoveClicked += removeButton_Click; - sharedButtons.UpClicked += upButton_Click; - sharedButtons.DownClicked += downButton_Click; - sharedButtons.EditClicked += editButton_Click; + sharedButtons.OKClicked += okButton_Click; + sharedButtons.CancelClicked += cancelButton_Click; + sharedButtons.AddClicked += addButton_Click; + sharedButtons.RemoveClicked += removeButton_Click; + sharedButtons.UpClicked += upButton_Click; + sharedButtons.DownClicked += downButton_Click; + sharedButtons.EditClicked += editButton_Click; sharedButtons.CopyClicked += copyButton_Click; sharedButtons.ExportClicked += exportButton_Click; sharedButtons.ImportClicked += importButton_Click; } - private void ComponentsManagerDlg_Load(object sender, EventArgs e) - { + private void ComponentsManagerDlg_Load(object sender, EventArgs e) + { LoadFormPosition(); Text = Strings.Test_Bench_Components_Configuration; LocalSettings ls = Program.LocalSettings; - listViewEx.Columns.Add(Strings.Nr, (ls.ComponentsColumnCount > 0) ? ls.ComponentsColumnWidths[0] : 40); - listViewEx.Columns.Add(Strings.Name, (ls.ComponentsColumnCount > 1) ? ls.ComponentsColumnWidths[1] : 80); - listViewEx.Columns.Add(Strings.Type, (ls.ComponentsColumnCount > 2) ? ls.ComponentsColumnWidths[2] : 120); - listViewEx.Columns.Add(Strings.Parent, (ls.ComponentsColumnCount > 3) ? ls.ComponentsColumnWidths[3] : 55); - listViewEx.Columns.Add(Strings.Mode, (ls.ComponentsColumnCount > 4) ? ls.ComponentsColumnWidths[4] : 55); - listViewEx.Columns.Add(Strings.Logging, (ls.ComponentsColumnCount > 5) ? ls.ComponentsColumnWidths[5] : 55); - listViewEx.Columns.Add(Strings.Parameters, (ls.ComponentsColumnCount > 6) ? ls.ComponentsColumnWidths[6] : 600); + listViewEx.Columns.Add(Strings.Nr, (ls.ComponentsColumnCount > 0) ? ls.ComponentsColumnWidths[0] : 40); + listViewEx.Columns.Add(Strings.Name, (ls.ComponentsColumnCount > 1) ? ls.ComponentsColumnWidths[1] : 80); + listViewEx.Columns.Add(Strings.Type, (ls.ComponentsColumnCount > 2) ? ls.ComponentsColumnWidths[2] : 120); + listViewEx.Columns.Add(Strings.Parent, (ls.ComponentsColumnCount > 3) ? ls.ComponentsColumnWidths[3] : 55); + listViewEx.Columns.Add(Strings.Mode, (ls.ComponentsColumnCount > 4) ? ls.ComponentsColumnWidths[4] : 55); + listViewEx.Columns.Add(Strings.Logging, (ls.ComponentsColumnCount > 5) ? ls.ComponentsColumnWidths[5] : 55); + listViewEx.Columns.Add(Strings.Parameters, + (ls.ComponentsColumnCount > 6) ? ls.ComponentsColumnWidths[6] : 600); listViewEx.HeaderStyle = ColumnHeaderStyle.Clickable; - debugCB = new ComboBox(); + debugCB = new ComboBox(); for (DebugMode level = 0; level < DebugMode.Count; level++) debugCB.Items.Add(level.ToDescription()); splitContainer.Panel1.Controls.Add(debugCB); @@ -119,23 +128,23 @@ namespace TBF.UI.Bench.Components listViewEx.SubItemClicked += new SubItemEventHandler(listViewEx_SubItemClicked); listViewEx.SubItemEndEditing += new SubItemEndEditingEventHandler(listViewEx_SubItemEndEditing); - sharedButtons.DisableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Edit); + sharedButtons.DisableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Edit); - session = TBF.DB.CreateSession(DBKind.Config); - cmpntEntities = session.QueryOver() - .OrderBy(x => x.ItemNr).Asc - .List(); + session = TBF.DB.CreateSession(DBKind.Config); + cmpntEntities = session.QueryOver() + .OrderBy(x => x.ItemNr).Asc + .List(); - RedrawAll(); - } + RedrawAll(); + } void listViewEx_SubItemClicked(object sender, SubItemEventArgs e) { - if (unlocked && e.SubItem == (int)Column.DebugMode) + if (unlocked && e.SubItem == (int)Column.DebugMode) { listViewEx.StartEditing(debugCB, e.Item, e.SubItem); } - else if (unlocked && e.SubItem == (int)Column.Logging) + else if (unlocked && e.SubItem == (int)Column.Logging) { listViewEx.StartEditing(logCB, e.Item, e.SubItem); } @@ -146,7 +155,7 @@ namespace TBF.UI.Bench.Components if (!unlocked || ((e.SubItem != (int)Column.DebugMode) && (e.SubItem != (int)Column.Logging))) return; if (DialogResult.Yes == MessageBox.Show(Strings.Do_you_want_to_copy_this_value_to_all_cells_below_this_cell, - Strings.Confirmation, MessageBoxButtons.YesNo, MessageBoxIcon.Question)) + Strings.Confirmation, MessageBoxButtons.YesNo, MessageBoxIcon.Question)) { int columnNr = e.SubItem; string value = null; @@ -204,10 +213,11 @@ namespace TBF.UI.Bench.Components if (debugCB.Text.Equals(level.ToDescription())) { cmpnt.DebugMode = level; - flags |= CfgUpdateFlags.RestartRqrd; + flags |= CfgUpdateFlags.RestartRqrd; return; } } + e.DisplayText = cmpnt.DebugMode.ToString(); } else if (e.SubItem == (int)Column.Logging) @@ -217,35 +227,36 @@ namespace TBF.UI.Bench.Components if (logCB.Text.Equals(level.ToDescription())) { cmpnt.LogLevel = level; - flags |= CfgUpdateFlags.RestartRqrd; - return; + flags |= CfgUpdateFlags.RestartRqrd; + return; } } + e.DisplayText = cmpnt.LogLevel.ToString(); } } - private void Unlocked(object sender, EventArgs e) - { - unlocked = true; + private void Unlocked(object sender, EventArgs e) + { + unlocked = true; - if (listViewEx.SelectedItems.Count == 1) - { - int ix = listViewEx.SelectedIndices[0]; - Focus(); - listViewEx.Items[ix].Selected = true; - listViewEx.Items[ix].EnsureVisible(); - } - } + if (listViewEx.SelectedItems.Count == 1) + { + int ix = listViewEx.SelectedIndices[0]; + Focus(); + listViewEx.Items[ix].Selected = true; + listViewEx.Items[ix].EnsureVisible(); + } + } - void RedrawAll() - { - listViewEx.Items.Clear(); - foreach (var cmpnt in cmpntEntities) DrawOne(cmpnt); - } + void RedrawAll() + { + listViewEx.Items.Clear(); + foreach (var cmpnt in cmpntEntities) DrawOne(cmpnt); + } - void DrawOne(Component cmpnt) - { + void DrawOne(Component cmpnt) + { ListViewItem lvi = new ListViewItem(cmpnt.ItemNr.ToString()); lvi.Tag = cmpnt; lvi.SubItems.Add(cmpnt.Name); @@ -254,18 +265,17 @@ namespace TBF.UI.Bench.Components IComponentCfg cmpCfg = TbfComponents.CmpntCfgFromCmpntEntity(cmpnt); if (cmpCfg != null) - { + { lvi.SubItems.Add(cmpCfg.DebugLevel.ToDescription()); - lvi.SubItems.Add(cmpCfg.LogLevel.ToDescription()); - lvi.SubItems.Add(cmpCfg.ToString(-1)); - - } - else - { - lvi.SubItems.Add("---"); - lvi.SubItems.Add("---"); - lvi.SubItems.Add("Not a component"); - } + lvi.SubItems.Add(cmpCfg.LogLevel.ToDescription()); + lvi.SubItems.Add(cmpCfg.ToString(-1)); + } + else + { + lvi.SubItems.Add("---"); + lvi.SubItems.Add("---"); + lvi.SubItems.Add("Not a component"); + } listViewEx.Items.Add(lvi); } @@ -304,10 +314,10 @@ namespace TBF.UI.Bench.Components private void LoadFormPosition() { LocalSettings ls = Program.LocalSettings; - Width = (ls.ComponentsDlgWidth > 0) ? ls.ComponentsDlgWidth : 850; + Width = (ls.ComponentsDlgWidth > 0) ? ls.ComponentsDlgWidth : 850; Height = (ls.ComponentsDlgHeight > 0) ? ls.ComponentsDlgHeight : 500; - Left = (ls.ComponentsDlgLeft != 0) ? ls.ComponentsDlgLeft : 200; - Top = (ls.ComponentsDlgTop != 0) ? ls.ComponentsDlgTop : 100; + Left = (ls.ComponentsDlgLeft != 0) ? ls.ComponentsDlgLeft : 200; + Top = (ls.ComponentsDlgTop != 0) ? ls.ComponentsDlgTop : 100; } /// @@ -334,7 +344,11 @@ namespace TBF.UI.Bench.Components { for (int i = 0; i < (int)Column.ColumnsCount; i++) { - if (listViewEx.Columns[i].Width != ls.ComponentsColumnWidths[i]) { anyColumnDiffers = true; break; } + if (listViewEx.Columns[i].Width != ls.ComponentsColumnWidths[i]) + { + anyColumnDiffers = true; + break; + } } } @@ -366,84 +380,149 @@ namespace TBF.UI.Bench.Components } /// - /// OK + /// OK /// private void okButton_Click(object sender, EventArgs e) - { - if ((flags & CfgUpdateFlags.AnyChange) != 0 || (flags & CfgUpdateFlags.RestartRqrd) != 0) - { + { + ValidateComponents(); + if ((flags & CfgUpdateFlags.AnyChange) != 0 || (flags & CfgUpdateFlags.RestartRqrd) != 0) + { SaveDBChanges(session); - flags = CfgUpdateFlags.None; /// Changes saved + flags = CfgUpdateFlags.None; /// Changes saved } SaveUISettings(); DialogResult = DialogResult.OK; - Close(); - return; - } + Close(); + return; + } - /// Cancel - private void cancelButton_Click(object sender, EventArgs e) - { + private void ValidateComponents() + { + Boolean invalid = false; + string validationMessage = ""; + //validation cycle + invalid = !ValidateMetersBatchCount(out validationMessage); + + if (invalid) + { + MessageBox.Show(validationMessage, Strings.Warning, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + } + } + + private Boolean ValidateMetersBatchCount(out string message) + { + bool invalid = false; + + TBF.Rig.DataContainer.BenchInfo.ComponentCfg benchInfo = null; + int waterMetersCount = 0; + int iWaterMeterComponentCount = 0; + foreach (Component component in cmpntEntities) + { + if (component == null) + { + continue; + } + + string className = (string.IsNullOrEmpty(component.ClassName) ? string.Empty : component.ClassName); + if (className == "DataContainer.BenchInfo") + { + try + { + var cfg = new TBF.Rig.DataContainer.BenchInfo.Factory().CmpntCfgFromCmpntEntity(component) + as TBF.Rig.DataContainer.BenchInfo.ComponentCfg; + + waterMetersCount = cfg.WaterMetersCount; + } + catch (Exception e) + { + log.Error("Finding of DataContainer.BenchInfo data unsuccessfully!"); + } + } + + if (className == "WaterMeter") + { + iWaterMeterComponentCount++; + } + } + + + invalid = (waterMetersCount != iWaterMeterComponentCount); + + + if (invalid) + { + message = "The count of water meters on the bench does not match the count of their components!"; + return false; + } + + message = ""; + return true; + } + + /// Cancel + private void cancelButton_Click(object sender, EventArgs e) + { SaveUISettings(); - if ((flags & CfgUpdateFlags.AnyChange) != 0 || (flags & CfgUpdateFlags.RestartRqrd) != 0) - { - DialogResult dr = MessageBox.Show(Strings.Changes_will_be_lost_Do_you_want_to_proceed, - Strings.Warning, - MessageBoxButtons.YesNo, - MessageBoxIcon.Question); - if (dr != DialogResult.Yes) return; - } + if ((flags & CfgUpdateFlags.AnyChange) != 0 || (flags & CfgUpdateFlags.RestartRqrd) != 0) + { + DialogResult dr = MessageBox.Show(Strings.Changes_will_be_lost_Do_you_want_to_proceed, + Strings.Warning, + MessageBoxButtons.YesNo, + MessageBoxIcon.Question); + if (dr != DialogResult.Yes) return; + } - flags = CfgUpdateFlags.None; /// Abandoning changes confirmed + flags = CfgUpdateFlags.None; /// Abandoning changes confirmed DialogResult = DialogResult.Cancel; - Close(); - return; - } + Close(); + return; + } - /// Add a new component - private void addButton_Click(object sender, EventArgs e) - { - selectComponentTypeDlg.SelectedScriptName = null; - DialogResult dialogRslt = selectComponentTypeDlg.ShowDialog(); - if (dialogRslt != DialogResult.OK) return; + /// Add a new component + private void addButton_Click(object sender, EventArgs e) + { + selectComponentTypeDlg.SelectedScriptName = null; + DialogResult dialogRslt = selectComponentTypeDlg.ShowDialog(); + if (dialogRslt != DialogResult.OK) return; - IComponentFactory factory = selectComponentTypeDlg.SlctdCmpntFactory; + IComponentFactory factory = selectComponentTypeDlg.SlctdCmpntFactory; IComponentCfg cfg = factory.DefaultConfig(); if (selectComponentTypeDlg.SelectedScriptName == null) - { + { /// /// Create a single component of the selected type /// IComponentCfgCtrl cfgControl = cfg.GetControl(cmpntEntities); - cfgControl.Config = cfg; - cfgControl.Config.ItemNr = (cmpntEntities.Count > 0) ? (cmpntEntities[cmpntEntities.Count - 1].ItemNr + 1) : 1; + cfgControl.Config = cfg; + cfgControl.Config.ItemNr = + (cmpntEntities.Count > 0) ? (cmpntEntities[cmpntEntities.Count - 1].ItemNr + 1) : 1; - ComponentParametersDlg cfgForm = new ComponentParametersDlg(this); - cfgForm.CmpntEntities = cmpntEntities; - cfgForm.ComponentCfgCtrl = cfgControl; - cfgForm.UnlockAfterStart = true; - dialogRslt = cfgForm.ShowDialog(); - if (dialogRslt != DialogResult.OK) return; + ComponentParametersDlg cfgForm = new ComponentParametersDlg(this); + cfgForm.CmpntEntities = cmpntEntities; + cfgForm.ComponentCfgCtrl = cfgControl; + cfgForm.UnlockAfterStart = true; + dialogRslt = cfgForm.ShowDialog(); + if (dialogRslt != DialogResult.OK) return; - flags |= CfgUpdateFlags.RestartRqrd; - AddOne(cfgForm.Config.CreateDbEntity()); - } - else - { + flags |= CfgUpdateFlags.RestartRqrd; + AddOne(cfgForm.Config.CreateDbEntity()); + } + else + { /// /// Create more components, read their names and other properties from a file /// using (TextReader reader = new StreamReader(selectComponentTypeDlg.SelectedScriptName)) - { - int zeroBasedIdx = 0; - string line = reader.ReadLine(); - while (line != null) - { - line.Trim(); + { + int zeroBasedIdx = 0; + string line = reader.ReadLine(); + while (line != null) + { + line.Trim(); if (line.Length > 0) { string[] words = line.Split(new char[] { ' ', '\t' }); @@ -451,83 +530,85 @@ namespace TBF.UI.Bench.Components if (UpdateCfg(ref cfg, words, ref zeroBasedIdx)) { flags |= CfgUpdateFlags.RestartRqrd; - cfg.ItemNr = (cmpntEntities.Count > 0) ? (cmpntEntities[cmpntEntities.Count - 1].ItemNr + 1) : 1; + cfg.ItemNr = (cmpntEntities.Count > 0) + ? (cmpntEntities[cmpntEntities.Count - 1].ItemNr + 1) + : 1; AddOne(cfg.CreateDbEntity()); } - + zeroBasedIdx++; } - line = reader.ReadLine(); - } - } - } - } + line = reader.ReadLine(); + } + } + } + } - void AddOne(Component cmpnt) - { - cmpntEntities.Add(cmpnt); - DrawOne(cmpnt); - } + void AddOne(Component cmpnt) + { + cmpntEntities.Add(cmpnt); + DrawOne(cmpnt); + } - /// Delete the component - private void removeButton_Click(object sender, EventArgs e) - { - if (listViewEx.SelectedIndices.Count != 1) return; - int ix = listViewEx.SelectedIndices[0]; - if (ix < 0) return; - - Component selectedCmpnt = (Component)listViewEx.Items[ix].Tag; + /// Delete the component + private void removeButton_Click(object sender, EventArgs e) + { + if (listViewEx.SelectedIndices.Count != 1) return; + int ix = listViewEx.SelectedIndices[0]; + if (ix < 0) return; + + Component selectedCmpnt = (Component)listViewEx.Items[ix].Tag; if (selectedCmpnt.Id != 0) toBeDeletedEntities.Add(selectedCmpnt); cmpntEntities.Remove(selectedCmpnt); flags |= CfgUpdateFlags.AnyChange; - RedrawAll(); - } + RedrawAll(); + } - /// DoubleClick -> Edit the component - private void listViewEx_MouseDoubleClick(object sender, MouseEventArgs e) - { - editButton_Click(sender, e); - } + /// DoubleClick -> Edit the component + private void listViewEx_MouseDoubleClick(object sender, MouseEventArgs e) + { + editButton_Click(sender, e); + } - /// Edit a component - private void editButton_Click(object sender, EventArgs e) - { + /// Edit a component + private void editButton_Click(object sender, EventArgs e) + { if (listViewEx.SelectedIndices.Count != 1) return; ListViewItem lvi = listViewEx.SelectedItems[0]; Component component = lvi.Tag as Component; if (component == null) return; - IComponentCfg cfg = TbfComponents.CmpntCfgFromCmpntEntity(component); - if (cfg != null) - { + IComponentCfg cfg = TbfComponents.CmpntCfgFromCmpntEntity(component); + if (cfg != null) + { ComponentParametersDlg cfgForm = new ComponentParametersDlg(this, component.Id); - cfgForm.CmpntEntities = cmpntEntities; + cfgForm.CmpntEntities = cmpntEntities; cfgForm.ComponentCfgCtrl = cfg.GetControl(cmpntEntities); - cfgForm.ComponentCfgCtrl.Config = cfg; - DialogResult dr = cfgForm.ShowDialog(); - if (dr != DialogResult.OK) return; + cfgForm.ComponentCfgCtrl.Config = cfg; + DialogResult dr = cfgForm.ShowDialog(); + if (dr != DialogResult.OK) return; - flags |= cfgForm.Flags; + flags |= cfgForm.Flags; - sharedButtons.UnlockButtons(); /// Unlock this dialog buttons as changes were enabled - unlocked = true; /// in the ComponentParametersDlg. + sharedButtons.UnlockButtons(); /// Unlock this dialog buttons as changes were enabled + unlocked = true; /// in the ComponentParametersDlg. - Component modified = cfgForm.Config.CreateDbEntity(); - Component original = (Component)lvi.Tag; + Component modified = cfgForm.Config.CreateDbEntity(); + Component original = (Component)lvi.Tag; - original.Name = modified.Name; - original.ClassName = modified.ClassName; - original.Parent = modified.Parent; - original.DebugMode = modified.DebugMode; - original.LogLevel = modified.LogLevel; - original.Parameters = modified.Parameters; + original.Name = modified.Name; + original.ClassName = modified.ClassName; + original.Parent = modified.Parent; + original.DebugMode = modified.DebugMode; + original.LogLevel = modified.LogLevel; + original.Parameters = modified.Parameters; - RedrawAll(); - } - } + RedrawAll(); + } + } /// Copy a component private void copyButton_Click(object sender, EventArgs e) @@ -535,7 +616,7 @@ namespace TBF.UI.Bench.Components if (listViewEx.SelectedIndices.Count != 1) return; ListViewItem lvi = listViewEx.SelectedItems[0]; - IComponentCfg cfg = TbfComponents.CmpntCfgFromCmpntEntity((Component)lvi.Tag); + IComponentCfg cfg = TbfComponents.CmpntCfgFromCmpntEntity((Component)lvi.Tag); if (cfg != null) { cfg.Name += Strings.New_name_copy; @@ -543,7 +624,9 @@ namespace TBF.UI.Bench.Components { IComponentCfgCtrl cfgControl = cfg.GetControl(cmpntEntities); cfgControl.Config = cfg; - cfgControl.Config.ItemNr = (cmpntEntities.Count > 0) ? (cmpntEntities[cmpntEntities.Count - 1].ItemNr + 1) : 1; + cfgControl.Config.ItemNr = (cmpntEntities.Count > 0) + ? (cmpntEntities[cmpntEntities.Count - 1].ItemNr + 1) + : 1; ComponentParametersDlg cfgForm = new ComponentParametersDlg(this); cfgForm.CmpntEntities = cmpntEntities; @@ -588,7 +671,8 @@ namespace TBF.UI.Bench.Components IComponentCfgCtrl cfgControl = cfg.GetControl(cmpntEntities); cfgControl.Config = cfg; cfgControl.Config.Name = cfgControl.Config.Name + " imported"; - cfgControl.Config.ItemNr = (cmpntEntities.Count > 0) ? (cmpntEntities[cmpntEntities.Count - 1].ItemNr + 1) : 1; + cfgControl.Config.ItemNr = + (cmpntEntities.Count > 0) ? (cmpntEntities[cmpntEntities.Count - 1].ItemNr + 1) : 1; ComponentParametersDlg cfgForm = new ComponentParametersDlg(this); cfgForm.CmpntEntities = cmpntEntities; @@ -601,88 +685,90 @@ namespace TBF.UI.Bench.Components } } - private void upButton_Click(object sender, EventArgs e) - { - if (listViewEx.SelectedIndices.Count != 1) return; - int ix = listViewEx.SelectedIndices[0]; - if (ix < 1) return; + private void upButton_Click(object sender, EventArgs e) + { + if (listViewEx.SelectedIndices.Count != 1) return; + int ix = listViewEx.SelectedIndices[0]; + if (ix < 1) return; - Component item1 = (Component)(listViewEx.Items[ix - 1].Tag); - Component item2 = (Component)(listViewEx.Items[ix].Tag); - (item1 as IHasItemNr).ItemNr++; - (item2 as IHasItemNr).ItemNr--; - cmpntEntities.RemoveAt(ix); - cmpntEntities.Insert(ix - 1, item2); + Component item1 = (Component)(listViewEx.Items[ix - 1].Tag); + Component item2 = (Component)(listViewEx.Items[ix].Tag); + (item1 as IHasItemNr).ItemNr++; + (item2 as IHasItemNr).ItemNr--; + cmpntEntities.RemoveAt(ix); + cmpntEntities.Insert(ix - 1, item2); - flags |= CfgUpdateFlags.AnyChange; + flags |= CfgUpdateFlags.AnyChange; - RedrawAll(); + RedrawAll(); - Focus(); - listViewEx.Items[ix - 1].Selected = true; - listViewEx.Items[ix - 1].EnsureVisible(); - } + Focus(); + listViewEx.Items[ix - 1].Selected = true; + listViewEx.Items[ix - 1].EnsureVisible(); + } - private void downButton_Click(object sender, EventArgs e) - { - if (listViewEx.SelectedIndices.Count != 1) return; - int ix = listViewEx.SelectedIndices[0]; - if (ix >= listViewEx.Items.Count - 1) return; + private void downButton_Click(object sender, EventArgs e) + { + if (listViewEx.SelectedIndices.Count != 1) return; + int ix = listViewEx.SelectedIndices[0]; + if (ix >= listViewEx.Items.Count - 1) return; - Component item1 = (Component)(listViewEx.Items[ix].Tag); - Component item2 = (Component)(listViewEx.Items[ix + 1].Tag); - (item1 as IHasItemNr).ItemNr++; - (item2 as IHasItemNr).ItemNr--; - cmpntEntities.RemoveAt(ix + 1); - cmpntEntities.Insert(ix, item2); + Component item1 = (Component)(listViewEx.Items[ix].Tag); + Component item2 = (Component)(listViewEx.Items[ix + 1].Tag); + (item1 as IHasItemNr).ItemNr++; + (item2 as IHasItemNr).ItemNr--; + cmpntEntities.RemoveAt(ix + 1); + cmpntEntities.Insert(ix, item2); - flags |= CfgUpdateFlags.AnyChange; + flags |= CfgUpdateFlags.AnyChange; - RedrawAll(); + RedrawAll(); - Focus(); - listViewEx.Items[ix + 1].Selected = true; - listViewEx.Items[ix + 1].EnsureVisible(); - } + Focus(); + listViewEx.Items[ix + 1].Selected = true; + listViewEx.Items[ix + 1].EnsureVisible(); + } - private void componentsListView_SelectedIndexChanged(object sender, EventArgs e) - { - if (listViewEx.SelectedIndices.Count == 1) - { - sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Edit); - } - else - { - sharedButtons.DisableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Edit); - } - } + private void componentsListView_SelectedIndexChanged(object sender, EventArgs e) + { + if (listViewEx.SelectedIndices.Count == 1) + { + sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Edit); + } + else + { + sharedButtons.DisableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Edit); + } + } - public void UpdateButtonStates(SharedButtons.SelectedItemPos selectedItemPos) - { - if (selectedItemPos == SharedButtons.SelectedItemPos.None) - { - sharedButtons.DisableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Up | SharedButtons.Buttons.Down); - } - else if (selectedItemPos == SharedButtons.SelectedItemPos.First) - { - sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Down); - sharedButtons.DisableButtons(SharedButtons.Buttons.Up); - } - else if (selectedItemPos == SharedButtons.SelectedItemPos.Last) - { - sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Up); - sharedButtons.DisableButtons(SharedButtons.Buttons.Down); - } - else if (selectedItemPos == SharedButtons.SelectedItemPos.FirstAndLast) - { - sharedButtons.EnableButtons(SharedButtons.Buttons.Remove); - sharedButtons.DisableButtons(SharedButtons.Buttons.Up | SharedButtons.Buttons.Down); - } - else - { - sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Up | SharedButtons.Buttons.Down); - } - } + public void UpdateButtonStates(SharedButtons.SelectedItemPos selectedItemPos) + { + if (selectedItemPos == SharedButtons.SelectedItemPos.None) + { + sharedButtons.DisableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Up | + SharedButtons.Buttons.Down); + } + else if (selectedItemPos == SharedButtons.SelectedItemPos.First) + { + sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Down); + sharedButtons.DisableButtons(SharedButtons.Buttons.Up); + } + else if (selectedItemPos == SharedButtons.SelectedItemPos.Last) + { + sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Up); + sharedButtons.DisableButtons(SharedButtons.Buttons.Down); + } + else if (selectedItemPos == SharedButtons.SelectedItemPos.FirstAndLast) + { + sharedButtons.EnableButtons(SharedButtons.Buttons.Remove); + sharedButtons.DisableButtons(SharedButtons.Buttons.Up | SharedButtons.Buttons.Down); + } + else + { + sharedButtons.EnableButtons(SharedButtons.Buttons.Remove | SharedButtons.Buttons.Up | + SharedButtons.Buttons.Down); + } + } private void ComponentsManagerDlg_FormClosing(object sender, FormClosingEventArgs e) { @@ -691,9 +777,9 @@ namespace TBF.UI.Bench.Components if ((flags & CfgUpdateFlags.AnyChange) != 0 || (flags & CfgUpdateFlags.RestartRqrd) != 0) { DialogResult dr = MessageBox.Show(Strings.Do_you_want_to_save_changes, - Strings.Warning, - MessageBoxButtons.YesNo, - MessageBoxIcon.Question); + Strings.Warning, + MessageBoxButtons.YesNo, + MessageBoxIcon.Question); if (dr == DialogResult.Yes) { SaveDBChanges(session); @@ -702,7 +788,7 @@ namespace TBF.UI.Bench.Components if (CurrentUser.Restore(this)) Program.MainWnd.UpdateUser(); } - + /// /// Updates component configuration from a script file @@ -713,7 +799,7 @@ namespace TBF.UI.Bench.Components /// true = udated component configuration should be saved, new component should be created bool UpdateCfg(ref IComponentCfg cfg, string[] words, ref int zeroBasedIdx) { - string name = words[words.Length - 1]; /// The last word is the component name + string name = words[words.Length - 1]; /// The last word is the component name cfg.Name = name.Replace("#", (zeroBasedIdx + 1).ToString()); if (cfg is Rig.BuiltIn.Valve.ValveCfg) @@ -760,9 +846,9 @@ namespace TBF.UI.Bench.Components } else if (cfg is Rig.Modbus.Meret.AdjustableScale.AdjustableMeterCfg) { - (cfg as IChildComponentCfg).ParentName = "CB"; - (cfg as Rig.Modbus.Meret.AdjustableScale.AdjustableMeterCfg).ModbusAddress = (byte)(zeroBasedIdx + 1); - return true; + (cfg as IChildComponentCfg).ParentName = "CB"; + (cfg as Rig.Modbus.Meret.AdjustableScale.AdjustableMeterCfg).ModbusAddress = (byte)(zeroBasedIdx + 1); + return true; } else if (cfg is Rig.RegisterReaders.PulsesFromUniCB.RRCfg) { @@ -818,4 +904,4 @@ namespace TBF.UI.Bench.Components listViewEx.Sort(); } } -} +} \ No newline at end of file diff --git a/TBF/UI/Process/ProcessTabPageCtrl.cs b/TBF/UI/Process/ProcessTabPageCtrl.cs index 2c4415113..aeb391a81 100644 --- a/TBF/UI/Process/ProcessTabPageCtrl.cs +++ b/TBF/UI/Process/ProcessTabPageCtrl.cs @@ -1181,6 +1181,10 @@ namespace TBF.UI.Process if (args.TestRslt != null) { + if (ProcessData.BatchRslts.Batch.WaterMeters.Count < wmsCount) + { + throw new Exception("Water Meter components cout is smaller as Bench Info water meter count!"); + } for (int i = 0; i < wmsCount; i++) { var wm = ProcessData.BatchRslts.Batch.WaterMeters[i];