/// /// Copyright (c) 2016 Sensus Metering Systems /// using System; using System.Collections.Generic; using System.Windows.Forms; using log4net; using TBF.Rig.GenericDevices; using TBF.Resources; namespace TBF.Rig.DataEntry.HeatMeters6 { public partial class TestStartEndForm : Form, GenericDevices.IHasCompleted { private static readonly ILog log = LogManager.GetLogger(typeof(TestStartEndForm)); // Set to 'true' when the form closes public bool Completed { get { return completed; } } bool completed; readonly EntryFormCfg entryFormCfg; /// Number of text boxes for serial numbers public readonly int WaterMetersCount; readonly IRegReader[] regReaders; readonly bool[] disabled; // To be retrieved after the form closes public double[] WMStartState; public readonly string[] WMStartStateStr; public double[] WMEndState; // To be retrieved after the form closes public double[] EnergyStartState; public readonly string[] EnergyStartStateStr; public double[] EnergyEndState; bool endStates; /// false=start states, true=end states double refVolume; double warningLimLo; /// limit to display exclamation mark, typically 2x errLimLo double warningLimHi; /// limit to display exclamation mark, typically 2x errLimHi double refEnergy; double energyWarningLimLo; /// limit to display exclamation mark, typically 2x energyErrLimLo double energyWarningLimHi; /// limit to display exclamation mark, typically 2x energyErrLimHi int TextBoxesCount; /// Label[] labels; TextBox[] startTextBoxes; TextBox[] endTextBoxes; Label[] energyLabels; TextBox[] energyStartTextBoxes; TextBox[] energyEndTextBoxes; IList enabledTextBoxes; /// /// Parameterless constructor initializing common part for start and endstate form /// public TestStartEndForm() { InitializeComponent(); ControlBox = false; TextBoxesCount = 6; labels = new Label[] { label1, label2, label3, label4, label5, label6 }; startTextBoxes = new TextBox[] { startTextBox1, startTextBox2, startTextBox3, startTextBox4, startTextBox5, startTextBox6, }; endTextBoxes = new TextBox[] { endTextBox1, endTextBox2, endTextBox3, endTextBox4, endTextBox5, endTextBox6, }; energyLabels = new Label[] { label13, label14, label15, label16, label17, label18 }; energyStartTextBoxes = new TextBox[] { startTextBox13, startTextBox14, startTextBox15, startTextBox16, startTextBox17, startTextBox18, }; energyEndTextBoxes = new TextBox[] { endTextBox13, endTextBox14, endTextBox15, endTextBox16, endTextBox17, endTextBox18, }; enabledTextBoxes = new List(); completed = false; StartForceCloseHandler(); } /// /// Constructor to fill in start states /// /// Number of water meters /// Information from CycleBeginningForm about availability of water meters public TestStartEndForm(EntryFormCfg cfg, int waterMetersCount, IRegReader[] regReaders, bool[] disabled) : this() { endStates = false; entryFormCfg = cfg; this.WaterMetersCount = waterMetersCount; this.regReaders = regReaders; this.disabled = disabled; ShuffleTextBoxes(); WMStartState = new double[waterMetersCount]; WMStartStateStr = new string[waterMetersCount]; EnergyStartState = new double[waterMetersCount]; EnergyStartStateStr = new string[waterMetersCount]; } /// /// Constructor to fill in end states /// /// Number of water meters /// Information entered on test start /// Information from CycleBeginningForm about availability of water meters /// Reference volume, it is used to verify the end state, show/hide exclamation if necessary /// Error limit low, it is used to verify the end state, show/hide exclamation if necessary /// Error limit high, it is used to verify the end state, show/hide exclamation if necessary public TestStartEndForm(EntryFormCfg cfg, int waterMetersCount, IRegReader[] regReaders, string[] wmStartStateStr, string[] energyStartStateStr, bool[] disabled, double refVolume, double errLimLo, double errLimHi, double refEnergy, double energyErrLimLo, double energyErrLimHi) : this() { endStates = true; entryFormCfg = cfg; this.WaterMetersCount = waterMetersCount; this.regReaders = regReaders; if (wmStartStateStr == null || wmStartStateStr.Length != waterMetersCount) throw (new Exception("Invalid 'wmStartStateStr' argument")); this.WMStartStateStr = wmStartStateStr; if (energyStartStateStr == null || energyStartStateStr.Length != waterMetersCount) throw (new Exception("Invalid 'energyStartStateStr' argument")); this.EnergyStartStateStr = energyStartStateStr; this.disabled = disabled; this.refVolume = refVolume; this.warningLimLo = 2 * errLimLo; this.warningLimHi = 2 * errLimHi; this.refEnergy = refEnergy; this.energyWarningLimLo = 2 * energyErrLimLo; this.energyWarningLimHi = 2 * energyErrLimHi; ShuffleTextBoxes(); WMEndState = new double[waterMetersCount]; EnergyEndState = new double[waterMetersCount]; } /// /// Make sure the layout of labels/text boxes on the screen /// corresponds to the layout of watermeters of the test bench. /// void ShuffleTextBoxes() { if (TBF.Data.HeatMetersCount < TextBoxesCount) { int nrLines = Math.Max(1, TBF.Data.HeatMetersCount / TBF.Data.LineSize); int gap = (TextBoxesCount - TBF.Data.HeatMetersCount) / nrLines; int dest = 0; for (int l = 0; l < nrLines; l++) { for (int i = 0; i < TBF.Data.LineSize; i++) { labels[dest] = labels[l * TBF.Data.LineSize + l * gap + i]; startTextBoxes[dest] = startTextBoxes[l * TBF.Data.LineSize + l * gap + i]; endTextBoxes[dest] = endTextBoxes[l * TBF.Data.LineSize + l * gap + i]; energyLabels[dest] = energyLabels[l * TBF.Data.LineSize + l * gap + i]; energyStartTextBoxes[dest] = energyStartTextBoxes[l * TBF.Data.LineSize + l * gap + i]; energyEndTextBoxes[dest] = energyEndTextBoxes[l * TBF.Data.LineSize + l * gap + i]; dest++; } } TextBoxesCount = TBF.Data.HeatMetersCount; } } private void TestStartEndForm_Load(object sender, EventArgs e) { Localize(); for (Common.Unit units = 0; units < Common.Unit.Count; units++) { if (Common.Units.IsEnergy(units)) unitsComboBox.Items.Add(units.ToString()); } unitsComboBox.Text = entryFormCfg.Units.ToString(); //Height = 115 + 90 * WaterMetersCount; for (int i = 0; i < TextBoxesCount; i++) { if (i < WaterMetersCount) { labels[i].Visible = startTextBoxes[i].Visible = endTextBoxes[i].Visible = true; energyLabels[i].Visible = energyStartTextBoxes[i].Visible = energyEndTextBoxes[i].Visible = true; } } if (endStates) { for (int i = 0; i < TextBoxesCount; i++) { if (WMStartStateStr != null && i < WMStartStateStr.Length) { startTextBoxes[i].Text = WMStartStateStr[i]; } if (EnergyStartStateStr != null && i < EnergyStartStateStr.Length) { energyStartTextBoxes[i].Text = EnergyStartStateStr[i]; } if (disabled != null && i < disabled.Length && disabled[i]) { endTextBoxes[i].Enabled = false; energyEndTextBoxes[i].Enabled = false; } else { endTextBoxes[i].Enabled = true; energyEndTextBoxes[i].Enabled = true; enabledTextBoxes.Add(endTextBoxes[i]); enabledTextBoxes.Add(energyEndTextBoxes[i]); } } } else { for (int i = 0; i < TextBoxesCount; i++) { if (disabled != null && i < disabled.Length && disabled[i]) { startTextBoxes[i].Enabled = false; energyStartTextBoxes[i].Enabled = false; } else { startTextBoxes[i].Enabled = true; energyStartTextBoxes[i].Enabled = true; enabledTextBoxes.Add(startTextBoxes[i]); enabledTextBoxes.Add(energyStartTextBoxes[i]); } } } } void Localize() { Text = Strings.Water_Meter_States; for (int i = 0; i < TextBoxesCount; i++) { labels[i].Text = string.Format("{0} {1} [l]", Strings.Volume + " ", i + 1); energyLabels[i].Text = string.Format("{0} {1}", Strings.Energy + " ", i + 1); } startLabel.Text = Strings.Start; endLabel.Text = Strings.End; okButton.Text = Strings.OkBtnText; } private void unitsComboBox_SelectedIndexChanged(object sender, EventArgs e) { for (Common.Unit u = 0; u < Common.Unit.Count; u++) { if (u.ToString() == unitsComboBox.Text) { entryFormCfg.Units = u; break; } } } private void okButton_Click(object sender, EventArgs eArgs) { try { if (endStates) { for (int i = 0; i < Math.Min(WaterMetersCount, TextBoxesCount); i++) { if (endTextBoxes[i].Visible && endTextBoxes[i].Enabled) { WMEndState[i] = Utils.ParseUDouble(endTextBoxes[i].Text); EnergyEndState[i] = Common.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(energyEndTextBoxes[i].Text)); } } } else { for (int i = 0; i < Math.Min(WaterMetersCount, TextBoxesCount); i++) { if (startTextBoxes[i].Visible && startTextBoxes[i].Enabled) { WMStartStateStr[i] = startTextBoxes[i].Text; WMStartState[i] = Utils.ParseUDouble(startTextBoxes[i].Text); EnergyStartStateStr[i] = energyStartTextBoxes[i].Text; EnergyStartState[i] = Common.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(energyStartTextBoxes[i].Text)); } } } } catch(Exception e) { log.ErrorFormat("Exception: {0}", e.Message); return; } completed = true; Close(); } #region Forced close handling public void StartForceCloseHandler() { UiBridge.Bridge.CloseModelessFormHandler += delegate(object sender, EventArgs args) { if (InvokeRequired) { Invoke(new EventHandler(OnForceClose), sender, args); } else OnForceClose(sender, args); }; } void OnForceClose(object sender, EventArgs args) { DialogResult = DialogResult.Cancel; Close(); } #endregion /// /// Calculate the approximate error and verify whether it is within limits. /// Make an exclamation mark visible if out of range. /// Similar event handler is implemented for all endTextBoxes (1..24). /// private void endTextBox1_TextChanged(object sender, EventArgs e) { double err = 0; try { double endState = Utils.ParseUDouble(endTextBox1.Text); double startState = Utils.ParseUDouble(startTextBox1.Text); err = 100.0 * (endState - startState - refVolume) / refVolume; } catch { }; exclamation1.Visible = (err < warningLimLo) || (warningLimHi < err); } private void endTextBox2_TextChanged(object sender, EventArgs e) { double err = 0; try { double endState = Utils.ParseUDouble(endTextBox2.Text); double startState = Utils.ParseUDouble(startTextBox2.Text); err = 100.0 * (endState - startState - refVolume) / refVolume; } catch { err = 1000.0f; }; exclamation2.Visible = (err < warningLimLo) || (warningLimHi < err); } private void endTextBox3_TextChanged(object sender, EventArgs e) { double err = 0; try { double endState = Utils.ParseUDouble(endTextBox3.Text); double startState = Utils.ParseUDouble(startTextBox3.Text); err = 100.0 * (endState - startState - refVolume) / refVolume; } catch { err = 1000.0f; }; exclamation3.Visible = (err < warningLimLo) || (warningLimHi < err); } private void endTextBox4_TextChanged(object sender, EventArgs e) { double err = 0; try { double endState = Utils.ParseUDouble(endTextBox4.Text); double startState = Utils.ParseUDouble(startTextBox4.Text); err = 100.0 * (endState - startState - refVolume) / refVolume; } catch { err = 1000.0f; }; exclamation4.Visible = (err < warningLimLo) || (warningLimHi < err); } private void endTextBox5_TextChanged(object sender, EventArgs e) { double err = 0; try { double endState = Utils.ParseUDouble(endTextBox5.Text); double startState = Utils.ParseUDouble(startTextBox5.Text); err = 100.0 * (endState - startState - refVolume) / refVolume; } catch { err = 1000.0f; }; exclamation5.Visible = (err < warningLimLo) || (warningLimHi < err); } private void endTextBox6_TextChanged(object sender, EventArgs e) { double err = 0; try { double endState = Utils.ParseUDouble(endTextBox6.Text); double startState = Utils.ParseUDouble(startTextBox6.Text); err = 100.0 * (endState - startState - refVolume) / refVolume; } catch { err = 1000.0f; }; exclamation6.Visible = (err < warningLimLo) || (warningLimHi < err); } private void endTextBox13_TextChanged(object sender, EventArgs e) { double err = 0; try { double endState = Common.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(endTextBox13.Text)); double startState = Common.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(startTextBox13.Text)); err = 100.0 * (endState - startState - refEnergy) / refEnergy; } catch { err = 1000.0f; }; exclamation13.Visible = (err < energyWarningLimLo) || (energyWarningLimHi < err); } private void endTextBox14_TextChanged(object sender, EventArgs e) { double err = 0; try { double endState = Common.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(endTextBox14.Text)); double startState = Common.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(startTextBox14.Text)); err = 100.0 * (endState - startState - refEnergy) / refEnergy; } catch { err = 1000.0f; }; exclamation14.Visible = (err < energyWarningLimLo) || (energyWarningLimHi < err); } private void endTextBox15_TextChanged(object sender, EventArgs e) { double err = 0; try { double endState = Common.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(endTextBox15.Text)); double startState = Common.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(startTextBox15.Text)); err = 100.0 * (endState - startState - refEnergy) / refEnergy; } catch { err = 1000.0f; }; exclamation15.Visible = (err < energyWarningLimLo) || (energyWarningLimHi < err); } private void endTextBox16_TextChanged(object sender, EventArgs e) { double err = 0; try { double endState = Common.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(endTextBox16.Text)); double startState = Common.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(startTextBox16.Text)); err = 100.0 * (endState - startState - refEnergy) / refEnergy; } catch { err = 1000.0f; }; exclamation16.Visible = (err < energyWarningLimLo) || (energyWarningLimHi < err); } private void endTextBox17_TextChanged(object sender, EventArgs e) { double err = 0; try { double endState = Common.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(endTextBox17.Text)); double startState = Common.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(startTextBox17.Text)); err = 100.0 * (endState - startState - refEnergy) / refEnergy; } catch { err = 1000.0f; }; exclamation17.Visible = (err < energyWarningLimLo) || (energyWarningLimHi < err); } private void endTextBox18_TextChanged(object sender, EventArgs e) { double err = 0; try { double endState = Common.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(endTextBox18.Text)); double startState = Common.Units.ConvertFrom(entryFormCfg.Units, Utils.ParseUDouble(startTextBox18.Text)); err = 100.0 * (endState - startState - refEnergy) / refEnergy; } catch { err = 1000.0f; }; exclamation18.Visible = (err < energyWarningLimLo) || (energyWarningLimHi < err); } /// /// Process a key press within any enabled text boxe /// /// /// /// TextBox control which received the event private void ProcKeyPress(object sender, KeyPressEventArgs e, TextBox currentFocusOwner) { if (e.KeyChar == '+') { /// Process '+' key ..... Form completed okButton_Click(sender, e); } if (e.KeyChar == '\r') { /// Process key ..... Next text field if (enabledTextBoxes.Count < 2) return; /// There is just one enabled textbox for (int i = 0; i < enabledTextBoxes.Count; i++) { if (enabledTextBoxes[i] == currentFocusOwner) { /// Change focus to the next enabled text box enabledTextBoxes[(i + 1) % enabledTextBoxes.Count].Focus(); return; } } } } private void startTextBox1_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox1); } private void startTextBox2_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox2); } private void startTextBox3_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox3); } private void startTextBox4_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox4); } private void startTextBox5_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox5); } private void startTextBox6_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox6); } private void startTextBox13_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox13); } private void startTextBox14_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox14); } private void startTextBox15_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox15); } private void startTextBox16_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox16); } private void startTextBox17_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox17); } private void startTextBox18_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, startTextBox18); } private void endTextBox1_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox1); } private void endTextBox2_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox2); } private void endTextBox3_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox3); } private void endTextBox4_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox4); } private void endTextBox5_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox5); } private void endTextBox6_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox6); } private void endTextBox13_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox13); } private void endTextBox14_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox14); } private void endTextBox15_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox15); } private void endTextBox16_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox16); } private void endTextBox17_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox17); } private void endTextBox18_KeyPress(object sndr, KeyPressEventArgs e) { ProcKeyPress(sndr, e, endTextBox18); } } }