/// /// Copyright (c) 2013-2017 Sensus Metering Systems /// using System; using System.Collections.Generic; using log4net; using Config.Entities; using TBF.BenchControl; using TBF.BenchControl.GenericDevices; namespace TBF.BenchControl.DataEntry.Standard6 { public class EntryFormNoStartEnd : ComponentBase, IOperation, IDataEntry, IHasCycleBeginForm, IHasCycleEndForm { private static readonly ILog log = LogManager.GetLogger(typeof(EntryFormNoStartEnd)); public override string ToString() { return string.Format("DataEntry.Standard6({0})", Cfg.ToString(1)); } public bool UsesCameras() { return false; } readonly EntryFormCfg entryFormCfg; IRegisterReader[] regReaders; /// /// Properties set by the Begin, End and WMStates form /// string purchaseOrder; public string PurchaseOrder { get { return purchaseOrder; } } string batchRemark; bool[] disabled; /// This array is shared between forms double[] wmStartState; public double WMStartState(int wmNr) { return (wmNr >= 0 && wmNr < wmStartState.Length) ? wmStartState[wmNr] : 0; } double[] wmEndState; public double WMEndState(int wmNr) { return (wmNr >= 0 && wmNr < wmEndState.Length) ? wmEndState[wmNr] : 0; } string[] wmStartStateStr; System.Windows.Forms.Form modelessDlg; double refVolume; double errLimLo; double errLimHi; bool resultSaved; /// Set in Run() when results are saved Results.Entities.WaterMeter[] waterMeters; /// Reference to ...ProcessData.BatchRslts.WaterMeters[] public enum CurrentOp { None, ShowFormAtCycleBeginning, ShowFormAtCycleEnd, EnterTestStartStates, EnterTestEndStates, } CurrentOp currentOp; public EntryFormNoStartEnd() { } public EntryFormNoStartEnd(Generic.IComponentCfg cfg) : base(cfg) { entryFormCfg = cfg as EntryFormCfg; disabled = new bool[Config.Data.WMsCount]; wmStartState = new double[Config.Data.WMsCount]; wmStartStateStr = new string[Config.Data.WMsCount]; wmEndState = new double[Config.Data.WMsCount]; batchRemark = null; currentOp = CurrentOp.None; log.Debug(this.ToString()); } /// Reference to the operation public IOperation ShowCycleBeginFormOp() { if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); currentOp = CurrentOp.ShowFormAtCycleBeginning; this.waterMeters = TBF.BenchControl.Sequences.ProcessData.BatchRslts.WaterMeters; return this; } /// Reference to the operation public IOperation ShowCycleEndFormOp() { if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); currentOp = CurrentOp.ShowFormAtCycleEnd; this.waterMeters = TBF.BenchControl.Sequences.ProcessData.BatchRslts.WaterMeters; return this; } /// Reference to the operation public IOperation ShowTestStartFormOp(IRegisterReader[] regReaders) { if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); currentOp = CurrentOp.EnterTestStartStates; this.regReaders = regReaders; return this; } /// Reference to the operation public IOperation ShowTestEndFormOp(IRegisterReader[] regReaders, double refVolume, double errLimLo, double errLimHi) { if (currentOp != CurrentOp.None) throw new Exception("Sequence error"); currentOp = CurrentOp.EnterTestEndStates; this.regReaders = regReaders; this.refVolume = refVolume; this.errLimLo = errLimLo; this.errLimHi = errLimHi; return this; } delegate void EntryFormDlgt(EntryFormNoStartEnd myRef); /// void OpenBeginningDlg(EntryFormNoStartEnd myRef) { myRef.modelessDlg = new CycleBeginningForm(myRef.waterMeters.Length, (myRef.entryFormCfg.RemarkEnabled && !myRef.entryFormCfg.ShowCycleEndForm)); modelessDlg.Show(); } /// void OpenEndDlg(EntryFormNoStartEnd myRef) { myRef.modelessDlg = new CycleEndForm(myRef.waterMeters.Length, myRef.entryFormCfg.RemarkEnabled); modelessDlg.Show(); } /// void OpenTestStartStatesDlg(EntryFormNoStartEnd myRef) { myRef.modelessDlg = new TestStartEndForm(myRef.waterMeters.Length, myRef.regReaders, myRef.disabled); modelessDlg.Show(); } /// void OpenTestEndStatesDlg(EntryFormNoStartEnd myRef) { myRef.modelessDlg = new TestStartEndForm(myRef.waterMeters.Length, myRef.regReaders, wmStartStateStr, disabled, refVolume, errLimLo, errLimHi); modelessDlg.Show(); } /// Start this operation public void Start() { resultSaved = false; switch (currentOp) { case CurrentOp.ShowFormAtCycleBeginning: if (!entryFormCfg.EnterSerialNrsAtTheEnd) { Program.MainWnd.Invoke(new EntryFormDlgt(OpenBeginningDlg), this); } break; case CurrentOp.ShowFormAtCycleEnd: if (entryFormCfg.EnterSerialNrsAtTheEnd) { Program.MainWnd.Invoke(new EntryFormDlgt(OpenBeginningDlg), this); } else 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 ((!entryFormCfg.EnterSerialNrsAtTheEnd && currentOp == CurrentOp.ShowFormAtCycleBeginning) || (entryFormCfg.EnterSerialNrsAtTheEnd && currentOp == CurrentOp.ShowFormAtCycleEnd)) { CycleBeginningForm dlg = (modelessDlg as CycleBeginningForm); if (dlg != null) { purchaseOrder = dlg.PurchaseOrder; for (int i = 0; i < Math.Min(dlg.WaterMetersCount, waterMeters.Length); i++) { if (waterMeters[i] != null) { waterMeters[i].SerialNr = dlg.SNText[i]; disabled[i] = waterMeters[i].Disabled = dlg.Disabled[i]; if (dlg.RemarksEnabled) { waterMeters[i].Remark = dlg.Remark[i]; } } } } } else if (entryFormCfg.ShowCycleEndForm && currentOp == CurrentOp.ShowFormAtCycleEnd) { CycleEndForm dlg = (modelessDlg as CycleEndForm); int count = waterMeters.Length; 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 waterMeters[i].EndState = (dlg != null) ? dlg.EndStateText[i] : string.Empty; if (entryFormCfg.RemarkEnabled) { waterMeters[i].Remark = (dlg != null) ? dlg.Remark[i] : string.Empty; } } } if (entryFormCfg.RemarkEnabled) { batchRemark = dlg.BatchRemark; } } else if (modelessDlg is TestStartEndForm && currentOp == CurrentOp.EnterTestStartStates) { /// Fixed start test - start TestStartEndForm dlg = (modelessDlg as TestStartEndForm); if (dlg != null) { for (int i = 0; i < dlg.WaterMetersCount; i++) { wmStartState[i] = dlg.WMStartState[i]; wmStartStateStr[i] = dlg.WMStartStateStr[i]; } } } else if (modelessDlg is TestStartEndForm && currentOp == CurrentOp.EnterTestEndStates) { /// Fixed start test - end TestStartEndForm dlg = (modelessDlg as TestStartEndForm); if (dlg != null) { for (int i = 0; i < dlg.WaterMetersCount; i++) { wmEndState[i] = dlg.WMEndState[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. /// /// Test results to be updated with the information public void UpdateTestResults(Results.BatchResults batchResults) { if (batchRemark != null) { batchResults.Batch.Remark = batchRemark; } foreach (var wm in batchResults.WaterMeters) { if ((wm != null) && !wm.Disabled && (PurchaseOrder != null)) { wm.PurchaseOrder = PurchaseOrder; /// PurchaseOrder == null if form button OK has not been used => no update } } } } }