/// /// Copyright (c) 2013-2015 Sensus Metering Systems /// using System; using System.Collections.Generic; using log4net; using TBF.BenchControl; using TBF.BenchControl.GenericDevices; namespace TBF.BenchControl.DataEntry.Combined { public class EntryForm : ComponentBase, IOperation, IDataEntry, IHasCycleBeginForm, IHasCycleEndForm { private static readonly ILog log = LogManager.GetLogger(typeof(EntryForm)); public override string ToString() { return string.Format("DataEntry.Combined({0})", Cfg.ToString(1)); } readonly EntryFormCfg entryFormCfg; /// /// Properties set by the Begin and the End form /// string purchaseOrder; public string PurchaseOrder { get { return purchaseOrder; } } string[] serialNr; public string SerialNr(int wmNr) { return (wmNr >= 0 && wmNr < serialNr.Length) ? serialNr[wmNr] : string.Empty; } bool[] disabled; public bool Disabled(int wmNr) { return (wmNr >= 0 && wmNr < disabled.Length) ? disabled[wmNr] : false; } string[] wmCycleEndState; public string WMCycleEndState(int wmNr) { return (wmNr >= 0 && wmNr < wmCycleEndState.Length) ? wmCycleEndState[wmNr] : string.Empty; } float[] wmStartState; public float WMStartState(int wmNr) { return (wmNr >= 0 && wmNr < wmStartState.Length) ? wmStartState[wmNr] : 0; } float[] wmEndState; public float WMEndState(int wmNr) { return (wmNr >= 0 && wmNr < wmEndState.Length) ? wmEndState[wmNr] : 0; } string[] wmStartStateStr; System.Windows.Forms.Form modelessDlg; float refVolume; float errLimLo; float errLimHi; bool resultSaved; IList waterMeters; public enum CurrentOp { None, ShowFormAtCycleBeginning, ShowFormAtCycleEnd, EnterTestStartStates, EnterTestEndStates, } CurrentOp currentOp; public EntryForm() { } public EntryForm(EntryFormCfg cfg) : base(cfg) { serialNr = new string[Program.CompoundWMsCount * 2]; disabled = new bool[Program.CompoundWMsCount]; wmStartState = new float[Program.CompoundWMsCount * 2]; wmStartStateStr = new string[Program.CompoundWMsCount * 2]; wmEndState = new float[Program.CompoundWMsCount * 2]; wmCycleEndState = new string[Program.CompoundWMsCount * 2]; entryFormCfg = cfg; currentOp = CurrentOp.None; log.Debug(this.ToString()); } /// Reference to the operation public IOperation ShowCycleBeginFormOp(IList waterMeters) { if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); currentOp = CurrentOp.ShowFormAtCycleBeginning; this.waterMeters = waterMeters; return this; } /// Reference to the operation public IOperation ShowCycleEndFormOp(IList waterMeters) { if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); currentOp = CurrentOp.ShowFormAtCycleEnd; this.waterMeters = waterMeters; return this; } /// Reference to the operation public IOperation ShowTestStartFormOp() { if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); currentOp = CurrentOp.EnterTestStartStates; return this; } /// Reference to the operation public IOperation ShowTestEndFormOp(float refVolume, float errLimLo, float errLimHi) { if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); currentOp = CurrentOp.EnterTestEndStates; this.refVolume = refVolume; this.errLimLo = errLimLo; this.errLimHi = errLimHi; return this; } delegate void EntryFormDlgt(EntryForm myRef); /// void OpenBeginningDlg(EntryForm myRef) { myRef.modelessDlg = new CycleBeginningForm(Program.CompoundWMsCount); modelessDlg.Show(); } /// void OpenEndDlg(EntryForm myRef) { CycleEndForm endForm = new CycleEndForm(); myRef.modelessDlg = endForm; modelessDlg.Show(); } /// void OpenTestStartStatesDlg(EntryForm myRef) { myRef.modelessDlg = new TestStartEndForm(Program.CompoundWMsCount, disabled); modelessDlg.Show(); } /// void OpenTestEndStatesDlg(EntryForm myRef) { string[] mainStartSateStr = new string[Program.CompoundWMsCount]; string[] auxStartSateStr = new string[Program.CompoundWMsCount]; for (int i = 0; i < Program.CompoundWMsCount; i++) { mainStartSateStr[i] = wmStartStateStr[2 * i]; auxStartSateStr[i] = wmStartStateStr[2 * i + 1]; } myRef.modelessDlg = new TestStartEndForm(Program.CompoundWMsCount, mainStartSateStr, auxStartSateStr, disabled, refVolume, errLimLo, errLimHi); modelessDlg.Show(); } /// Start this operation public void Start() { resultSaved = false; switch (currentOp) { case CurrentOp.ShowFormAtCycleBeginning: Program.MainWnd.Invoke(new EntryFormDlgt(OpenBeginningDlg), this); break; case CurrentOp.ShowFormAtCycleEnd: if (entryFormCfg.ShowCycleEndForm) { Program.MainWnd.Invoke(new EntryFormDlgt(OpenEndDlg), this); } break; case CurrentOp.EnterTestStartStates: Program.MainWnd.Invoke(new EntryFormDlgt(OpenTestStartStatesDlg), this); break; case CurrentOp.EnterTestEndStates: Program.MainWnd.Invoke(new EntryFormDlgt(OpenTestEndStatesDlg), this); break; } } /// Run this operation /// Event.ResultsPrinted public Event Run() { if ((modelessDlg is IHasCompleted) && !(modelessDlg as IHasCompleted).Completed) { return Event.ModelessFormIsOpen; } if (!resultSaved) /// This is to save the result only once { if (currentOp == CurrentOp.ShowFormAtCycleBeginning) { CycleBeginningForm dlg = (modelessDlg as CycleBeginningForm); if (dlg != null) { purchaseOrder = dlg.PurchaseOrder; for (int i = 0; i < Math.Min(dlg.WaterMetersCount, waterMeters.Count / 2); i++) { if (waterMeters[i] != null) { serialNr[2 * i] = waterMeters[2 * i].SerialNr = dlg.MainSNText[i]; serialNr[2 * i + 1] = waterMeters[2 * i + 1].SerialNr = dlg.AuxSNText[i]; disabled[i] = waterMeters[i].Disabled = dlg.Disabled[i]; } } } } else if (currentOp == CurrentOp.ShowFormAtCycleEnd) { //CycleEndForm dlg = (modelessDlg as CycleEndForm); //int count = waterMeters.Count; //if ((dlg != null) && (count > dlg.WaterMetersCount)) count = dlg.WaterMetersCount; //for (int i = 0; i < count; i++) //{ // if (waterMeters[i] != null) // { // /// In case entryFormCfg.ShowCycleEndForm == false dlg would be null, values would be string.Empty // wmCycleEndState[i] = waterMeters[i].EndState = (dlg != null) ? dlg.EndStateText[i] : string.Empty; // } //} } else if (modelessDlg is TestStartEndForm && currentOp == CurrentOp.EnterTestStartStates) { /// Fixed start test - start TestStartEndForm dlg = (modelessDlg as TestStartEndForm); for (int i = 0; i < dlg.WaterMetersCount; i++) { wmStartState[2 * i] = dlg.MainStartState[i]; wmStartStateStr[2 * i] = dlg.MainStartStateStr[i]; wmStartState[2 * i + 1] = dlg.AuxStartState[i]; wmStartStateStr[2 * i + 1] = dlg.AuxStartStateStr[i]; } } else if (modelessDlg is TestStartEndForm && currentOp == CurrentOp.EnterTestEndStates) { /// Fixed start test - end TestStartEndForm dlg = (modelessDlg as TestStartEndForm); for (int i = 0; i < dlg.WaterMetersCount; i++) { wmEndState[2 * i] = dlg.MainEndState[i]; wmEndState[2 * i + 1] = dlg.AuxEndState[i]; } } resultSaved = true; modelessDlg = null; } return Event.ModelessFormClosed; /// Form closed } /// Stop this operation public void Stop() { if (modelessDlg is IHasCompleted) { UiBridge.Bridge.OnCloseModelessForm(this, null); modelessDlg = null; } currentOp = CurrentOp.None; } /// /// Updates test results with the information collected in watermeters. /// /// Watermetes with information entered in the forms /// Test results to be updated with the information public void UpdateTestResults(IList waterMeters, IList testResults) { foreach (var testRslt in testResults) { if (testRslt.MetersKind != Entities.MetersKind.Combined) continue; /// Todo: Generalize !!! Now implemented for Munich = one combined meter. //testRslt.Meters[0].SerialNr = waterMeters[0].SerialNr; //testRslt.Meters[0].EndState = waterMeters[0].EndState; //testRslt.Meters[1].SerialNr = waterMeters[1].SerialNr; //testRslt.Meters[1].EndState = waterMeters[1].EndState; for (int i = 0; i < testRslt.Meters.Count; i++) { testRslt.Meters[i].SerialNr = SerialNr(i); testRslt.Meters[i].Disabled = Disabled(i); testRslt.Meters[i].EndState = WMCycleEndState(i); } } } } }