/// /// Copyright (c) 2020 Sensus Slovensko a.s. /// using System; using System.Collections.Generic; using log4net; using Config.Entities; using TBF.BenchControl; using TBF.BenchControl.GenericDevices; namespace TBF.BenchControl.DataEntry.S620 { public class EntryForm : ComponentBase, IOperation, IDataEntry, IHasCycleBeginForm, IHasCycleEndForm, IHasWMStatesForm { private static readonly ILog log = LogManager.GetLogger(typeof(EntryForm)); public override string ToString() { return string.Format("{0}({1})", this.GetType().Namespace.Substring(17), Cfg.ToString(1)); } public bool UsesCameras() { return false; } readonly EntryFormCfg entryFormCfg; readonly TBF.BenchControl.Output.DB.ProductionTracing.Tracing tracing; IRegReader[] regReaders; /// /// Properties set by the Begin, End and WMStates form /// bool[] disabled; /// This array is shared between forms string[] wmCycleEndState; public string WMCycleEndState(int wmNr) { return (wmNr >= 0 && wmNr < wmCycleEndState.Length) ? wmCycleEndState[wmNr] : string.Empty; } 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; public bool Completed { get { return (modelessDlg is IHasCompleted) ? (modelessDlg as IHasCompleted).Completed : true; } } double refVolume; double errLimLo; double errLimHi; bool resultSaved; /// Set in Run() when results are saved IList waterMeters; /// Reference to ...ProcessData.BatchRslts.WaterMeters[] public enum CurrentOp { None, ShowFormAtCycleBeginning, ShowFormAtCycleEnd, EnterTestStartStates, EnterTestEndStates, } CurrentOp currentOp; public EntryForm() { } public EntryForm(Generic.IComponentCfg cfg, IList components) : base(cfg) { entryFormCfg = cfg as EntryFormCfg; tracing = (TBF.BenchControl.Output.DB.ProductionTracing.Tracing)TbfComponents.FindComponent(cfg.ParentName, components); if (tracing == null) throw new Exception("Cannot find " + Name + " parent"); disabled = new bool[Config.Data.WMsCount]; wmStartState = new double[Config.Data.WMsCount]; wmStartStateStr = new string[Config.Data.WMsCount]; wmEndState = new double[Config.Data.WMsCount]; wmCycleEndState = new string[Config.Data.WMsCount]; currentOp = CurrentOp.None; log.Warn(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.Batch.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.Batch.WaterMeters; return this; } /// Reference to the operation public IOperation ShowTestStartFormOp(IRegReader[] 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(IRegReader[] 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(EntryForm myRef); /// void OnCycleStart(EntryForm myRef) { if (entryFormCfg.ProductionTracing) { myRef.modelessDlg = new FormForMechanicalMetersWithTracing(waterMeters, entryFormCfg.MaxWMsCount, entryFormCfg.CloseButton, false); } else { myRef.modelessDlg = new FormForMechanicalMeters(waterMeters); } modelessDlg.Show(); } /// void OnCycleEnd(EntryForm myRef) { if (entryFormCfg.ProductionTracing) { myRef.modelessDlg = new FormForMechanicalMetersWithTracing(waterMeters, entryFormCfg.MaxWMsCount, entryFormCfg.CloseButton, true); } else { myRef.modelessDlg = new FormForMechanicalMeters(waterMeters); } modelessDlg.Show(); } /// void OpenTestStartStatesDlg(EntryForm myRef) { myRef.modelessDlg = new TestStartEndForm(Config.Data.WMsCount, myRef.regReaders, disabled); modelessDlg.Show(); } /// void OpenTestEndStatesDlg(EntryForm myRef) { myRef.modelessDlg = new TestStartEndForm(Config.Data.WMsCount, myRef.regReaders, wmStartStateStr, disabled, refVolume, errLimLo, errLimHi); modelessDlg.Show(); } /// Start this operation public void Start() { resultSaved = false; switch (currentOp) { default: case CurrentOp.ShowFormAtCycleBeginning: Program.MainWnd.Invoke(new EntryFormDlgt(OnCycleStart), this); return; case CurrentOp.ShowFormAtCycleEnd: Program.MainWnd.Invoke(new EntryFormDlgt(OnCycleEnd), 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) { ICycleBeginOrEndForm dlg = (modelessDlg as ICycleBeginOrEndForm); if (dlg != null) { for (int i = 0; i < waterMeters.Count; i++) { if (waterMeters[i] != null) { waterMeters[i].Disabled = disabled[i] = dlg.Disabled[i]; waterMeters[i].SerialNr = dlg.BodyNrText[i]; } } } } else if (currentOp == CurrentOp.ShowFormAtCycleEnd) { ICycleBeginOrEndForm dlg = (modelessDlg as ICycleBeginOrEndForm); if (dlg != null) { for (int i = 0; i < waterMeters.Count; i++) { if (waterMeters[i] != null) { waterMeters[i].Disabled = disabled[i] = dlg.Disabled[i]; waterMeters[i].SerialNr = dlg.BodyNrText[i]; #if ORACLE_DB waterMeters[i].AssignedSerialNr = dlg.AssignedSerialNr[i]; waterMeters[i].Prefix = dlg.Prefix; waterMeters[i].Suffix = dlg.Suffix; waterMeters[i].CompleteSerialNr = dlg.CompleteSerialNr[i]; #endif if (dlg.PurchaseOrder != null) waterMeters[i].PurchaseOrder = dlg.PurchaseOrder; } } } } 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++) { if (!(((i < disabled.Length) && disabled[i]) || ((i < regReaders.Length) && (regReaders[i] == null)))) { 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++) { if (!(((i < disabled.Length) && disabled[i]) || ((i < regReaders.Length) && (regReaders[i] == null)))) { 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; } } }