/// /// Copyright (c) 2013-2015 Sensus Metering Systems /// using System; using System.Collections.Generic; using System.Windows.Forms; using TBF.UiBridge; using TBF.BenchControl; namespace TBF { public class TestProgressControls { System.Windows.Forms.Control parent; /// parent is progressFlowLayoutPanel of the only MainWnd instance IList progresses; UiControls.TestProgressCtrl currentProgress; public TestProgressControls(Control parent) { this.parent = parent; progresses = null; currentProgress = null; Bridge.ProcedureSelectedHandler += delegate(object sender, ProcedureSelectedEventArgs args) { if (Program.MainWnd.InvokeRequired) { Program.MainWnd.Invoke(new EventHandler(OnProcedureSelected), sender, args); } else OnProcedureSelected(sender, args); }; Bridge.TestSelectedHandler += delegate(object sender, TestSelectedEventArgs args) { if (Program.MainWnd.InvokeRequired) { Program.MainWnd.Invoke(new EventHandler(OnTestSelected), sender, args); } else OnTestSelected(sender, args); }; Bridge.TestProgressHandler += delegate(object sender, TestProgressEventArgs args) { if (Program.MainWnd.InvokeRequired) { Program.MainWnd.Invoke(new EventHandler(OnTestProgress), sender, args); } else OnTestProgress(sender, args); }; Bridge.TestCompletedHandler += delegate(object sender, TestCompletedEventArgs args) { if (Program.MainWnd.InvokeRequired) { Program.MainWnd.Invoke(new EventHandler(OnTestCompleted), sender, args); } else OnTestCompleted(sender, args); }; Bridge.ProcedureCompletedHandler += delegate(object sender, ProcedureCompletedEventArgs args) { if (Program.MainWnd.InvokeRequired) { Program.MainWnd.Invoke(new EventHandler(OnProcedureCompleted), sender, args); } else OnProcedureCompleted(sender, args); }; } void ResetProgressBars(Config.Entities.Procedure procedure) { currentProgress = null; parent.Controls.Clear(); progresses = new List(); bool isOuterLoopMode = false; int outerLoopRepeats = 0; int i = 0; while (i < procedure.Tests.Count) { Config.Entities.Test test = procedure.Tests[i++]; TBF.BenchControl.Generic.IComponent testMethod = TbfComponents.FindComponent(test.Method); if (testMethod is TBF.BenchControl.TestMethods.OuterLoop.Start.Component) { isOuterLoopMode = true; outerLoopRepeats = (i < procedure.Tests.Count) ? procedure.Tests[i].Repeats : 1; continue; } if (testMethod is TBF.BenchControl.TestMethods.OuterLoop.End.Component) { isOuterLoopMode = false; continue; } int repeats = test.Repeats; int newI = i; for (int r = 1; r <=repeats ; r++) { if (isOuterLoopMode) { int j = i - 1; while (j < procedure.Tests.Count) { Config.Entities.Test test2 = procedure.Tests[j++]; TBF.BenchControl.Generic.IComponent tm2 = TbfComponents.FindComponent(test2.Method); if (tm2 is TBF.BenchControl.TestMethods.OuterLoop.End.Component) { if (r == repeats) newI = j; break; } UiControls.TestProgressCtrl prgrs = new UiControls.TestProgressCtrl(test2.Id, Results.Utils.GetTestName(test2.Name, test2.Repeats, r), test2.Part, Utils.TestTitle(test2, r), r, test2.Repeats); progresses.Add(prgrs); parent.Controls.Add(prgrs); } } else { UiControls.TestProgressCtrl prgrs = new UiControls.TestProgressCtrl(test.Id, Results.Utils.GetTestName(test.Name, test.Repeats, r), test.Part, Utils.TestTitle(test, r), r, test.Repeats); progresses.Add(prgrs); parent.Controls.Add(prgrs); } } i = newI; } } public void ProcedureSelectedInUI(object sender, ProcedureSelectedEventArgs args) { ResetProgressBars(args.Procedure); } void OnProcedureSelected(object sender, ProcedureSelectedEventArgs args) { ResetProgressBars(args.Procedure); } void OnTestSelected(object sender, TestSelectedEventArgs args) { if (progresses != null) { foreach (var prgrs in progresses) { if ((prgrs.TestId == args.Test.Id) && (prgrs.RepetitionNr == args.RepetitionNr)) { currentProgress = prgrs; currentProgress.Progress = 0; currentProgress.TestResult = UiControls.TestProgressCtrl.Result.NotDone; return; } } } currentProgress = null; } void OnTestProgress(object sender, TestProgressEventArgs args) { foreach (var prgrs in progresses) { if (prgrs.TestName == args.TestName && prgrs.Part == args.Part) { prgrs.Progress = args.Progress; break; } } } void OnTestCompleted(object sender, TestCompletedEventArgs args) { if (currentProgress != null) { // Test is 'failed' if any meter failed /// TODO: Reimplement //foreach (var meterTestResult in args.TestResult.Meters) //{ // if (!meterTestResult.Passed) // { // currentProgress.TestResult = UiControls.TestProgressCtrl.Result.Failed; // return; // } //} currentProgress.TestResult = UiControls.TestProgressCtrl.Result.Failed; } } void OnProcedureCompleted(object sender, ProcedureCompletedEventArgs args) { ResetProgressBars(args.Procedure); } } }