diff --git a/Common/SerializableDictionary.cs b/Common/SerializableDictionary.cs
index 453e3ab46..72ad02447 100644
--- a/Common/SerializableDictionary.cs
+++ b/Common/SerializableDictionary.cs
@@ -1,4 +1,7 @@
-using System;
+///
+/// Copyright (c) 2021 Sensus Slovensko a.s.
+///
+using System;
using System.Collections.Generic;
using System.Xml.Serialization;
diff --git a/Common/Utils.cs b/Common/Utils.cs
index 2f24c7a8d..3f9bbaadc 100644
--- a/Common/Utils.cs
+++ b/Common/Utils.cs
@@ -1,4 +1,7 @@
-using System;
+///
+/// Copyright (c) 2021 Sensus Slovensko a.s.
+///
+using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@@ -8,5 +11,11 @@ namespace Common
{
public class Utils
{
+ public static string GetTestName(string name, int repeats, int repetitionNr)
+ {
+ if (name == null) return null;
+ if (repeats == 1) return name;
+ return string.Format("{0} ({1}/{2})", name, repetitionNr, repeats);
+ }
}
}
diff --git a/Config/Config.csproj b/Config/Config.csproj
index 28dacd210..223e08084 100644
--- a/Config/Config.csproj
+++ b/Config/Config.csproj
@@ -91,6 +91,7 @@
+
@@ -141,6 +142,10 @@
+
+ {c8939821-ba5c-4988-a3d0-bf53b74865c7}
+ Common
+
{6E5CB0E9-E1B6-4E5D-AC6E-B1049E180F2B}
Users
diff --git a/Config/Entities/Procedure.cs b/Config/Entities/Procedure.cs
index 5210cf22d..66a7f86cd 100644
--- a/Config/Entities/Procedure.cs
+++ b/Config/Entities/Procedure.cs
@@ -1,5 +1,5 @@
///
-/// Copyright (c) 2013-2020 Sensus Slovensko a.s.
+/// Copyright (c) 2013-2021 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
@@ -11,7 +11,7 @@ namespace Config.Entities
///
/// Stores one test procedure, supports revisions and history log
///
- public class Procedure : IHasName, IHasItemNr
+ public class Procedure : IHasName, IHasItemNr
{
public virtual int Id { get; protected set; }
public virtual int ItemNr { get; set; }
@@ -53,14 +53,13 @@ namespace Config.Entities
public virtual IList MoreParams { get; set; }
public virtual IList Tests { get; set; }
+ TestInstance[] testInstances;
+
/// Wrapper
public virtual IList RegularTests()
{
IList rslt = new List();
- foreach (var t in Tests)
- {
- if ((t.Name.Length > 0 && t.Name[0] != '[') || !t.Name.Contains("]")) rslt.Add(t);
- }
+ foreach (var t in Tests) if (t.IsRegular()) rslt.Add(t);
return rslt;
}
@@ -70,6 +69,7 @@ namespace Config.Entities
{
MoreParams = new List();
Tests = new List();
+ testInstances = null;
///
/// Default values
@@ -96,6 +96,70 @@ namespace Config.Entities
ItemNr = itemNr;
}
+ public virtual TestInstance[] UpdateTestInstances(IList loopStartNames, IList loopEndNames, IList autoTests = null)
+ {
+ List instances = new List();
+
+ if (Tests != null)
+ {
+ int i = 0;
+ while (i < Tests.Count)
+ {
+ if (!loopStartNames.Contains(Tests[i].Method) && !loopEndNames.Contains(Tests[i].Method)) /// Loop.End is ignored outside a loop
+ {
+ ///
+ /// Outside a loop
+ ///
+ for (int j = 1; j <= Tests[i].Repeats; j++)
+ if (Tests[i].BelongsTo(autoTests))
+ instances.Add(new TestInstance(Tests[i], j));
+ }
+ else if (loopStartNames.Contains(Tests[i].Method))
+ {
+ ///
+ /// Entering a loop
+ ///
+ int loopsCount = Tests[i].Repeats;
+ List testsInsideLoop = new List();
+ i++;
+
+ while (i < Tests.Count && !loopEndNames.Contains(Tests[i].Method))
+ {
+ ///
+ /// Inside a loop
+ ///
+ if (Tests[i].Repeats == loopsCount && !loopStartNames.Contains(Tests[i].Method)) /// Loop.Start is ignored inside a loop
+ {
+ if (Tests[i].BelongsTo(autoTests))
+ testsInsideLoop.Add(Tests[i]);
+ }
+
+ i++;
+ }
+
+ ///
+ /// Append instances of tests inside the last loop to the list
+ ///
+ for (int j = 1; j <= loopsCount; j++)
+ {
+ foreach (var t in testsInsideLoop)
+ instances.Add(new TestInstance(t, j));
+ }
+ }
+
+ i++;
+ }
+ }
+
+ testInstances = instances.ToArray();
+ return testInstances;
+ }
+
+ public virtual TestInstance[] GetTestInstances()
+ {
+ return testInstances;
+ }
+
public virtual Procedure Clone()
{
Procedure result = new Procedure();
diff --git a/Config/Entities/Test.cs b/Config/Entities/Test.cs
index 42b0b85f0..7112d5c7d 100644
--- a/Config/Entities/Test.cs
+++ b/Config/Entities/Test.cs
@@ -1,5 +1,5 @@
///
-/// Copyright (c) 2013-2019 Sensus Slovensko a.s.
+/// Copyright (c) 2013-2021 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
@@ -108,6 +108,22 @@ namespace Config.Entities
Procedure = procedure;
}
+ public virtual bool IsRegular()
+ {
+ /// Irregular / event triggered test names have form "[event] TestName"
+ return (Name.Length > 0 && Name[0] != '[') || !Name.Contains("]");
+ }
+
+ public virtual bool BelongsTo(IList autoTests)
+ {
+ if (IsRegular()) return true;
+
+ if (autoTests == null) return false;
+
+ string action = Name.Substring(1, Name.IndexOf(']') - 1);
+ return autoTests.Contains(action);
+ }
+
// Makes a new copy of this object (not just a reference)
public virtual Test Clone()
{
diff --git a/Config/Entities/TestInstance.cs b/Config/Entities/TestInstance.cs
new file mode 100644
index 000000000..5a829a476
--- /dev/null
+++ b/Config/Entities/TestInstance.cs
@@ -0,0 +1,32 @@
+///
+/// Copyright (c) 2021 Sensus Slovensko a.s.
+///
+using System;
+
+namespace Config.Entities
+{
+ public class TestInstance
+ {
+ public Test Test;
+ public int Repetition;
+
+ public string Name
+ {
+ get
+ {
+ return (Test != null) ? Common.Utils.GetTestName(Test.Name, Test.Repeats, Repetition) : string.Empty;
+ }
+ }
+
+ public TestInstance(Test test, int repetition)
+ {
+ Test = test;
+ Repetition = repetition;
+ }
+
+ public override string ToString()
+ {
+ return Name;
+ }
+ }
+}
diff --git a/Results/Results.csproj b/Results/Results.csproj
index 228671dfb..e0fec7b5b 100644
--- a/Results/Results.csproj
+++ b/Results/Results.csproj
@@ -195,6 +195,10 @@
+
+ {c8939821-ba5c-4988-a3d0-bf53b74865c7}
+ Common
+
{743DF7DB-C7B6-42EB-986D-0F485E5588E4}
Config
diff --git a/Results/Utils.cs b/Results/Utils.cs
index ec04fe7ad..6e351fd16 100644
--- a/Results/Utils.cs
+++ b/Results/Utils.cs
@@ -1,5 +1,5 @@
///
-/// Copyright (c) 2016-2019 Sensus Slovensko a.s.
+/// Copyright (c) 2016-2021 Sensus Slovensko a.s.
///
using System;
using System.Text;
@@ -11,9 +11,7 @@ namespace Results
{
public static string GetTestName(string name, int repeats, int repetitionNr)
{
- if (name == null) return null;
- if (repeats == 1) return name;
- return string.Format("{0} ({1}/{2})", name, repetitionNr, repeats);
+ return Common.Utils.GetTestName(name, repeats, repetitionNr);
}
diff --git a/TBF/BenchControl/Sequences/MainSeq.cs b/TBF/BenchControl/Sequences/MainSeq.cs
index 81f1cbe1d..b992b5ee8 100644
--- a/TBF/BenchControl/Sequences/MainSeq.cs
+++ b/TBF/BenchControl/Sequences/MainSeq.cs
@@ -1,5 +1,5 @@
///
-/// Copyright (c) 2013-2020 Sensus Slovensko a.s.
+/// Copyright (c) 2013-2021 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
@@ -106,7 +106,6 @@ namespace TBF.BenchControl.Sequences
Selection selection;
string selectedTestName;
-#if !DEBUG
Bridge.OnActivity(this, Strings.Starting_system);
WaitForOkButton();
SetValvesToDefaultState();
@@ -159,7 +158,6 @@ namespace TBF.BenchControl.Sequences
if (e.Contains(Event.UiCmdStop)) goto stop;
}
while (!e.Contains(Event.BalanceDone));
-#endif
select_procedure:
@@ -707,29 +705,40 @@ namespace TBF.BenchControl.Sequences
IList deferredData = new List();
bool veryFirstTestInTheRestOfCycle = true;
- int selsctedTestIx = simultWithPurgingCount; /// Applies when selection == Selection.Cycle
- int repetNr = 1;
+ int selsctedTestIx = -1; ///= undefined
///
- if (selection == Selection.RestOfCycle) /// ... otherwise
- {
- Test slctdTest = TBF.BenchControl.StateMachine.Procedure.GetTest(selectedTestName, out selsctedTestIx, out repetNr);
- if (slctdTest == null || (selsctedTestIx < simultWithPurgingCount)
- || (selsctedTestIx >= StateMachine.Tests.Count - simultWithEvacuationCount))
- {
+ if (selection == Selection.RestOfCycle) /// ... otherwise
+ {
+ for (int i = 0; i < StateMachine.TestInstances.Length; i++)
+ {
+ if (selectedTestName == StateMachine.TestInstances[i].Name)
+ {
+ selsctedTestIx = i;
+ break;
+ }
+ }
+
+ if ((selsctedTestIx < simultWithPurgingCount) ||
+ (selsctedTestIx >= StateMachine.TestInstances.Length - simultWithEvacuationCount))
+ {
/// Invalid test selection
- UiBridge.Bridge.OnError(this, string.Format("No test specified"));
- goto select_cycle_or_test;
- }
- }
+ UiBridge.Bridge.OnError(this, string.Format("No test specified"));
+ goto select_cycle_or_test;
+ }
+ }
+ else
+ {
+ selsctedTestIx = simultWithPurgingCount; /// Applies when selection == Selection.Cycle
+ }
float TimeEstimateTotal = 0; /// Time estimate of the selected cycle or test
- for (int i = selsctedTestIx; i < StateMachine.Tests.Count - simultWithEvacuationCount; i++)
+ for (int i = selsctedTestIx; i < StateMachine.TestInstances.Length - simultWithEvacuationCount; i++)
{
- Test test = StateMachine.Tests[i];
+ Test test = StateMachine.TestInstances[i].Test;
- TimeEstimateTotal += (test.Repeats * (test.TstTime + 10.0f));
+ TimeEstimateTotal += (test.TstTime + 10.0f);
/// Try to fetch all test paths and transitions
/// to detect configuration errors as early as possible.
@@ -749,19 +758,16 @@ namespace TBF.BenchControl.Sequences
}
int currentTestIx = selsctedTestIx;
- bool isOuterLoopMode = false;
- int outerLoopStartIx = -1; /// This is to identify program errors
- int outerLoopRepeats = 0;
- while (currentTestIx < StateMachine.Tests.Count - simultWithEvacuationCount)
+ while (currentTestIx < StateMachine.TestInstances.Length - simultWithEvacuationCount)
{
- Test nextTest = (currentTestIx + 1 < StateMachine.Tests.Count - simultWithEvacuationCount)
- ? StateMachine.Tests[currentTestIx + 1]
- : null;
+ TestInstance nextTest = (currentTestIx + 1 < StateMachine.TestInstances.Length - simultWithEvacuationCount)
+ ? StateMachine.TestInstances[currentTestIx + 1]
+ : null;
Test nextHydroTest = null;
- for (int i = currentTestIx + 1; i < StateMachine.Tests.Count - simultWithEvacuationCount; i++)
+ for (int i = currentTestIx + 1; i < StateMachine.TestInstances.Length - simultWithEvacuationCount; i++)
{
- Test tst = StateMachine.Tests[i];
+ Test tst = StateMachine.TestInstances[i].Test;
if (tst != null)
{
ITestMethod tm = TbfComponents.FindComponent(tst.Method) as ITestMethod;
@@ -809,12 +815,10 @@ namespace TBF.BenchControl.Sequences
}
/// Fetch paths and transitions of this test
- Test test = StateMachine.Tests[currentTestIx];
- TBF.BenchControl.Generic.IComponent testMethodComp = TbfComponents.FindComponent(test.Method);
+ TestInstance testInst = StateMachine.TestInstances[currentTestIx];
+ TBF.BenchControl.Generic.IComponent testMethodComp = TbfComponents.FindComponent(testInst.Test.Method);
string errorMsg;
- if (!(testMethodComp is TBF.BenchControl.TestMethods.OuterLoop.Start.Component) &&
- !(testMethodComp is TBF.BenchControl.TestMethods.OuterLoop.End.Component) &&
- !StateMachine.GetPaths(test, (StateMachine.Procedure.MetersKind == MetersKind.HeatMeter),
+ if (!StateMachine.GetPaths(testInst.Test, (StateMachine.Procedure.MetersKind == MetersKind.HeatMeter),
out inPath, out benchPath, out outPath, out sensPath,
out heatMetersPath,
out transitionBefore, out transitionBetween, out transitionAfter,
@@ -836,15 +840,10 @@ namespace TBF.BenchControl.Sequences
ITestMethod testMethod = testMethodComp as ITestMethod;
if (testMethod != null && testMethod.CanTest(StateMachine.Procedure.MetersKind))
{
- if (isOuterLoopMode && (outerLoopRepeats != test.Repeats) && !(testMethod is TestMethods.OuterLoop.End.Component))
- {
- goto config_error;
- }
-
- StateMachine.LoadTestParams(test);
+ StateMachine.LoadTestParams(testInst.Test);
string errMsg;
- if (!testMethod.CheckDeviceCaps(test, outPath, out errMsg))
+ if (!testMethod.CheckDeviceCaps(testInst.Test, outPath, out errMsg))
{
UiBridge.Bridge.OnError(this, errMsg);
goto select_cycle_or_test;
@@ -880,120 +879,80 @@ namespace TBF.BenchControl.Sequences
int timeEstTransBetween = testMethod.DoTransitions() ? GetTransitionTimeEst(transitionBetween) : 1;
int timeEstTransAfter = testMethod.DoTransitions() ? GetTransitionTimeEst(transitionAfter) : 1;
- TestProgressEventArgs.SetEstimatedTimes(new int[] { 1, timeEstTransBefore, 1, 30, 0, Convert.ToInt32(test.TstTime) + 15, timeEstTransAfter, 0 });
- Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetNr, Config.Entities.Progress.JustStarted));
+ TestProgressEventArgs.SetEstimatedTimes(new int[] { 1, timeEstTransBefore, 1, 30, 0, Convert.ToInt32(testInst.Test.TstTime) + 15, timeEstTransAfter, 0 });
+ Bridge.OnTestProgress(this, new TestProgressEventArgs(testInst.Test, testInst.Repetition, Config.Entities.Progress.JustStarted));
bool currentTestFinished = true;
bool doOneMoreRepetition = false;
- do
+
+ bool doExecuteTransitionBefore = (currentTestIx == simultWithPurgingCount) || (testInst.Test != StateMachine.TestInstances[currentTestIx - 1].Test) || veryFirstTestInTheRestOfCycle;
+ bool isLastRepetition = (currentTestIx == StateMachine.TestInstances.Length - simultWithEvacuationCount - 1) || (testInst.Test != StateMachine.TestInstances[currentTestIx + 1].Test);
+ veryFirstTestInTheRestOfCycle = false;
+ if (testMethod.DoTransitions())
{
- bool doExecuteTransitionBefore = isOuterLoopMode || (repetNr == 1) || veryFirstTestInTheRestOfCycle;
- veryFirstTestInTheRestOfCycle = false;
-
- if (testMethod.DoTransitions())
- {
- /// Make a transition before a test and before each test repetition
- rsltTransBefore = Transition(doExecuteTransitionBefore ? transitionBefore : null, TransitionContext.BeforeTest); /// Transition or SetRoute - start of test
- log.InfoFormat("Test {0}: Transition({1}, BeforeTest) returned {2}", test.Name, (transitionBefore == null ? "null" : transitionBefore.Name), rsltTransBefore);
- }
- if (rsltTransBefore != Event.Done) break;
-
- log.InfoFormat("Test {0}: Execute(., {1}, {2})", test.Name, repetNr, isOuterLoopMode || repetNr == test.Repeats);
- e = testMethod.Execute(test, repetNr, isOuterLoopMode || repetNr == test.Repeats);
-
- if (e.Contains(Event.MakeSecondPass) && testMethod is ITestMethodWith2ndPass)
- {
- deferredData.Add(new DeferredTestEvaluationData(test, repetNr, (testMethod as ITestMethodWith2ndPass).IntermediateData));
- }
-
- currentTestFinished = (rsltTransBefore == Event.Done && !e.Contains(Event.Error)
- && !e.Contains(Event.ConfigurationError)
- && !e.Contains(Event.OpArgumentError)
- && !e.Contains(Event.UiCmdStop));
-
- Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetNr, currentTestFinished ? Config.Entities.Progress.Completed
- : Config.Entities.Progress.Aborted));
-
- if (e.Contains(Event.OuterLoopStart)) break; /// Do not repeat OuterLoopStart test in this loop
- if (currentTestFinished && !isOuterLoopMode) repetNr++;
-
- doOneMoreRepetition = currentTestFinished && !isOuterLoopMode && (repetNr <= test.Repeats);
-
- if (testMethod.DoTransitions() && doOneMoreRepetition)
- {
- /// Make a transition between two test repetitions
- rsltTransBetween = Transition(transitionBetween, TransitionContext.BetweenTests); /// Transition or SetRoute - start of test
- log.InfoFormat("Test {0}: Transition({1}, BetweenTests) returned {2}", test.Name, (transitionBetween == null ? "null" : transitionBetween.Name), rsltTransBetween);
- }
+ /// Make a transition before a test and before each test repetition
+ rsltTransBefore = Transition(doExecuteTransitionBefore ? transitionBefore : null, TransitionContext.BeforeTest); /// Transition or SetRoute - start of test
+ log.InfoFormat("Test {0}: Transition({1}, BeforeTest) returned {2}", testInst.Name, (transitionBefore == null ? "null" : transitionBefore.Name), rsltTransBefore);
}
- while ((rsltTransBetween == Event.Done) && doOneMoreRepetition);
+ if (rsltTransBefore != Event.Done) break;
- if (currentTestFinished && !isOuterLoopMode && repetNr > test.Repeats) repetNr = 1; /// Reset repetNr
+ log.InfoFormat("Test {0}: Execute(., {1}, {2})", testInst.Name, testInst.Repetition, isLastRepetition);
+ e = testMethod.Execute(testInst.Test, testInst.Repetition, isLastRepetition);
+
+ if (e.Contains(Event.MakeSecondPass) && testMethod is ITestMethodWith2ndPass)
+ {
+ deferredData.Add(new DeferredTestEvaluationData(testInst.Test, testInst.Repetition, (testMethod as ITestMethodWith2ndPass).IntermediateData));
+ }
+
+ currentTestFinished = (rsltTransBefore == Event.Done && !e.Contains(Event.Error)
+ && !e.Contains(Event.ConfigurationError)
+ && !e.Contains(Event.OpArgumentError)
+ && !e.Contains(Event.UiCmdStop));
+
+ Bridge.OnTestProgress(this, new TestProgressEventArgs(testInst.Test, testInst.Repetition, currentTestFinished ? Config.Entities.Progress.Completed
+ : Config.Entities.Progress.Aborted));
if (testMethod.DoTransitions() && !e.Contains(Event.RecoverableError))
{
- /// Make a transition after the last test repetition
- TransitionContext endContext =
- !currentTestFinished ? TransitionContext.Stop
- : ((nextTransitionBefore != null) && (nextTransitionBefore.Name.ToLower().Contains("fastflow"))) ? TransitionContext.AfterTestWithOverlap
- : TransitionContext.AfterTest;
- rsltTransAfter = Transition(transitionAfter, endContext); /// Transition or SetRoute - end of test
- log.InfoFormat("Test {0}: Transition({1}, {2}) returned {3}", test.Name, (transitionAfter == null ? "null" : transitionAfter.Name), endContext, rsltTransAfter);
+ if (currentTestFinished && !isLastRepetition)
+ {
+ /// Make a transition between two test repetitions
+ rsltTransBetween = Transition(transitionBetween, TransitionContext.BetweenTests); /// Transition or SetRoute - start of test
+ log.InfoFormat("Test {0}: Transition({1}, BetweenTests) returned {2}", testInst.Name, (transitionBetween == null ? "null" : transitionBetween.Name), rsltTransBetween);
+ }
+ else
+ {
+ /// Make a transition after the last test repetition
+ TransitionContext endContext =
+ !currentTestFinished ? TransitionContext.Stop
+ : ((nextTransitionBefore != null) && (nextTransitionBefore.Name.ToLower().Contains("fastflow"))) ? TransitionContext.AfterTestWithOverlap
+ : TransitionContext.AfterTest;
+ rsltTransAfter = Transition(transitionAfter, endContext); /// Transition or SetRoute - end of test
+ log.InfoFormat("Test {0}: Transition({1}, {2}) returned {3}", testInst.Name, (transitionAfter == null ? "null" : transitionAfter.Name), endContext, rsltTransAfter);
+ }
}
}
if (rsltTransBefore == Event.Error || rsltTransBetween == Event.Error|| e.Contains(Event.Error))
{
- isOuterLoopMode = false;
goto error;
}
else if (e.Contains(Event.ConfigurationError))
{
- isOuterLoopMode = false;
goto select_cycle_or_test; /// OR goto config_error; ???
}
else if (e.Contains(Event.OpArgumentError))
{
- isOuterLoopMode = false;
goto config_error;
}
else if (rsltTransBefore == Event.UiCmdStop || e.Contains(Event.UiCmdStop) || e.Contains(Event.RecoverableError))
{
- isOuterLoopMode = false;
goto stop_within_cycle;
}
- else if (e.Contains(Event.OuterLoopStart))
- {
- if (isOuterLoopMode)
- {
- goto config_error;
- }
-
- isOuterLoopMode = true;
- outerLoopRepeats = (nextTest != null) ? nextTest.Repeats : 1;
- repetNr = 1;
- outerLoopStartIx = currentTestIx;
- }
- else if (e.Contains(Event.OuterLoopEnd))
- {
- if (!isOuterLoopMode)
- {
- goto config_error;
- }
- else if (++repetNr <= outerLoopRepeats)
- {
- currentTestIx = outerLoopStartIx;
- }
- else
- {
- isOuterLoopMode = false;
- repetNr = 1; /// Reset repetNr
- }
- }
}
else
{
- UiBridge.Bridge.OnError(this, string.Format(Strings.Method_0_cannot_be_used, test.Method));
+ UiBridge.Bridge.OnError(this, string.Format(Strings.Method_0_cannot_be_used, testInst.Test.Method));
goto select_cycle_or_test;
}
@@ -1052,15 +1011,27 @@ namespace TBF.BenchControl.Sequences
/// selection == Selection.Test or Selection.Q1 or Selection.Q2 or Selection.Q3
/// Single test will be executed
- int repetNr;
- int testIx;
- Test test = TBF.BenchControl.StateMachine.Procedure.GetTest(selectedTestName, out testIx, out repetNr);
- if (test == null)
+ int testIx = -1; ///= undefined
+ ///
+ for (int i = 0; i < StateMachine.TestInstances.Length; i++)
{
+ if (selectedTestName == StateMachine.TestInstances[i].Name)
+ {
+ testIx = i;
+ break;
+ }
+ }
+
+ if (testIx < 0)
+ {
+ /// Invalid test selection
UiBridge.Bridge.OnError(this, string.Format("No test specified"));
goto select_cycle_or_test;
}
+ Test test = StateMachine.TestInstances[testIx].Test;
+ int repetNr = StateMachine.TestInstances[testIx].Repetition;
+
/// Fetch the test paths and transitions
string errorMsg;
TBF.BenchControl.Generic.IComponent testMethodComp = TbfComponents.FindComponent(test.Method);
@@ -1388,7 +1359,7 @@ namespace TBF.BenchControl.Sequences
State.Create("MainSeq : Procedure configuration error")
.AddOperation(checkUiOp)
.AddOperation(StateMachine.BenchErrorOp)
- .AddOperation(new Operations.MessageBoxOp("Test configration error"))
+ .AddOperation(new Operations.MessageBoxOp("Test configuration error"))
.EnterState();
do
{
diff --git a/TBF/BenchControl/Sequences/MainSeqUtils.cs b/TBF/BenchControl/Sequences/MainSeqUtils.cs
index 7ddf9e95a..8da0b9a7d 100644
--- a/TBF/BenchControl/Sequences/MainSeqUtils.cs
+++ b/TBF/BenchControl/Sequences/MainSeqUtils.cs
@@ -1,5 +1,5 @@
///
-/// Copyright (c) 2020 Sensus Slovensko a.s.
+/// Copyright (c) 2020-2021 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
@@ -700,15 +700,15 @@ namespace TBF.BenchControl.Sequences
simultWithPurgingTests.Clear();
simultWithPurgingParams.Clear();
///
- foreach (var test in StateMachine.Tests)
+ foreach (var ti in StateMachine.TestInstances)
{
- Generic.IComponent testMethodComp = TbfComponents.FindComponent(test.Method);
+ Generic.IComponent testMethodComp = TbfComponents.FindComponent(ti.Test.Method);
if (testMethodComp == null) break;
- testMethodComp.Cfg.LoadTestParamsFromDB(test);
+ testMethodComp.Cfg.LoadTestParamsFromDB(ti.Test);
ISimultTestMethod simultTest = testMethodComp as ISimultTestMethod;
- MetersPath sensPath = StateMachine.GetMetersPath(test);
+ MetersPath sensPath = StateMachine.GetMetersPath(ti.Test);
if (simultTest == null || !simultTest.SimultWithPrevious || sensPath == null) break;
@@ -721,7 +721,7 @@ namespace TBF.BenchControl.Sequences
break;
}
- simultWithPurgingTests.Add(test);
+ simultWithPurgingTests.Add(ti.Test);
simultWithPurgingParams.Add(testMethodComp.Cfg.GetRuntimeTestParamsProvider().Clone() as Generic.ITestParams);
simultWithPurgingCount++;
}
@@ -734,9 +734,9 @@ namespace TBF.BenchControl.Sequences
simultWithEvacuationTests.Clear();
simultWithEvacuationParams.Clear();
///
- for (int i = StateMachine.Tests.Count - 1; i >= simultWithPurgingCount; i--)
+ for (int i = StateMachine.TestInstances.Length - 1; i >= simultWithPurgingCount; i--)
{
- var test = StateMachine.Tests[i];
+ var test = StateMachine.TestInstances[i].Test;
Generic.IComponent testMethodComp = TbfComponents.FindComponent(test.Method);
if (testMethodComp == null) break;
diff --git a/TBF/BenchControl/Sequences/SequenceBase.cs b/TBF/BenchControl/Sequences/SequenceBase.cs
index b81dd381d..256c0ceee 100644
--- a/TBF/BenchControl/Sequences/SequenceBase.cs
+++ b/TBF/BenchControl/Sequences/SequenceBase.cs
@@ -1,5 +1,5 @@
///
-/// Copyright (c) 2013-2015 Sensus Metering Systems
+/// Copyright (c) 2013-2021 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
@@ -1711,7 +1711,7 @@ namespace TBF.BenchControl.Sequences
/// Test result
protected void MakeSimulatedHeatMeters(Config.Entities.Test test, int repetitionNr, int part, float errorPct, double energy, float energyErrLimLo, float energyErrLimHi, bool evaluateVolume)
{
- string fullTestName = Results.Utils.GetTestName(test.Name, test.Repeats, repetitionNr);
+ string fullTestName = Common.Utils.GetTestName(test.Name, test.Repeats, repetitionNr);
Results.Entities.TestRslt tstRslt = ProcessData.BatchRslts.GetTestRslt(fullTestName, part);
diff --git a/TBF/BenchControl/StateMachine.cs b/TBF/BenchControl/StateMachine.cs
index 0270dd784..7be0d1bc2 100644
--- a/TBF/BenchControl/StateMachine.cs
+++ b/TBF/BenchControl/StateMachine.cs
@@ -1,5 +1,5 @@
///
-/// Copyright (c) 2013-2019 Sensus Slovensko a.s.
+/// Copyright (c) 2013-2021 Sensus Slovensko a.s.
///
using System;
using System.Text;
@@ -65,6 +65,9 @@ namespace TBF.BenchControl
public static IList CoupledValves; /// list of coupled valves
public static IList ExtendedValves; /// list of extended valves
+ public static IList LoopStartNames;
+ public static IList LoopEndNames;
+
/// Test method classes fo all test methods
public static Dictionary TestMethod2Class;
@@ -115,7 +118,7 @@ namespace TBF.BenchControl
/// Loaded by LoadProcedure() or IOperation LoadProcedureOp(...)
///
public static Procedure Procedure; /// Procedure
- public static IList Tests; /// Tests
+ public static TestInstance[] TestInstances; /// Tests
public static bool IsRemoteProcedure;
@@ -154,6 +157,8 @@ namespace TBF.BenchControl
SequenceBase.PumpsWithFM = new List();
SequenceBase.WaterMeters = new List();
SequenceBase.Cameras = new List();
+ LoopStartNames = new List();
+ LoopEndNames = new List();
ProcessData.IperlHeads = new List();
}
@@ -287,6 +292,9 @@ namespace TBF.BenchControl
BenchErrorOp = (cmpnt as GenericDevices.IParallelOutput).ShowBenchErrorOp();
}
+ if (cmpnt is ITestMethod && cmpnt.ClassName == "TestMethods.OuterLoop.Start") LoopStartNames.Add(cmpnt.Name);
+ if (cmpnt is ITestMethod && cmpnt.ClassName == "TestMethods.OuterLoop.End") LoopEndNames.Add(cmpnt.Name);
+
if (cmpnt is IScaleOrTank)
{
IScaleOrTank tank = cmpnt as IScaleOrTank;
@@ -592,28 +600,13 @@ namespace TBF.BenchControl
{
IsRemoteProcedure = isRemote;
Procedure = selectedProcs[0];
-
- Tests = selectedProcs[0].Tests;
- for (int i = Tests.Count - 1; i >= 0; i--)
- {
- Test test = Tests[i];
- if ((test.Name.Length > 0) && (test.Name[0] == '[') && test.Name.Contains("]"))
- {
- /// This is an AutoAction test => If 'actionName' is not on 'autoTests' list the test should be removed
- int actionNameEndPos = test.Name.IndexOf(']');
- string actionName = test.Name.Substring(1, actionNameEndPos - 1);
- if (autoTests == null || autoTests.Count == 0 || !autoTests.Contains(actionName))
- {
- /// AutoAction test was not selected and should be deleted
- Tests.RemoveAt(i);
- }
- }
- }
-
+ TestInstances = selectedProcs[0].UpdateTestInstances(LoopStartNames, LoopEndNames, autoTests);
return true;
}
-
- return false;
+ else
+ {
+ return false;
+ }
}
public static void LoadProcedureParams(Procedure procedure)
diff --git a/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs b/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs
index 34568c8a4..149d3f09f 100644
--- a/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs
+++ b/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs
@@ -2674,9 +2674,9 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication
DateTime endTime = DateTime.Now;
int testTime = StateMachine.Time - startTimeSec;
- if (!tests.Contains(StateMachine.Tests[0]))
+ if (!tests.Contains(StateMachine.TestInstances[0].Test))
{
- tests.Insert(0, StateMachine.Tests[0]); /// Add RFID test as the 1st item
+ tests.Insert(0, StateMachine.TestInstances[0].Test); /// Add RFID test as the 1st item
}
foreach (var test in tests)
diff --git a/TBF/UI/Procedures/TestWizard/OracleWZTypSelection.cs b/TBF/UI/Procedures/TestWizard/OracleWZTypSelection.cs
index 612283178..0b667cff1 100644
--- a/TBF/UI/Procedures/TestWizard/OracleWZTypSelection.cs
+++ b/TBF/UI/Procedures/TestWizard/OracleWZTypSelection.cs
@@ -196,7 +196,7 @@ namespace TBF.UI.Procedures.TestWizard
{
if (t.Publish != (byte)Config.Entities.Publish.Never &&
t.Publish != (byte)Config.Entities.Publish.Internal &&
- ((t.Name.Length > 0 && t.Name[0] != '[') || !t.Name.Contains("]")))
+ t.IsRegular())
{
/// This is a regular test,
/// not an internal/unpublished test, neither an auto action test
diff --git a/TBF/UI/Shared/BenchControlPanel.cs b/TBF/UI/Shared/BenchControlPanel.cs
index 13aca7cd6..4db3e37e5 100644
--- a/TBF/UI/Shared/BenchControlPanel.cs
+++ b/TBF/UI/Shared/BenchControlPanel.cs
@@ -1,5 +1,5 @@
///
-/// Copyright (c) 2013-2017 Senus Slovensko a.s.
+/// Copyright (c) 2013-2021 Senus Slovensko a.s.
///
using System;
using System.Collections.Generic;
@@ -183,14 +183,15 @@ namespace TBF.UI.Shared
}
Program.MainWnd.CurrentProcedure = procedures[0];
+ if (procedures[0].GetTestInstances() == null)
+ {
+ procedures[0].UpdateTestInstances(TBF.BenchControl.StateMachine.LoopStartNames, TBF.BenchControl.StateMachine.LoopEndNames, null);
+ }
testComboBox.Items.Clear();
- foreach (var test in procedures[0].Tests)
+ foreach (var tinst in procedures[0].GetTestInstances())
{
- for (int i = 1; i <= test.Repeats; i++)
- {
- testComboBox.Items.Add(test.GetExpandedTestName(i));
- }
+ testComboBox.Items.Add(tinst);
}
if (testComboBox.Items.Contains(oriTestName))
@@ -198,24 +199,10 @@ namespace TBF.UI.Shared
testComboBox.Text = oriTestName;
TestName = oriTestName;
}
- else if (procedures[0].Tests.Count > 0)
+ else if (testComboBox.Items.Count > 0)
{
- Test test = procedures[0].Tests[0];
- string title;
- if (test.Repeats == 1)
- {
- if (test.Part == 0)
- title = test.Name; /// Single test
- else
- title = string.Format("{0} ({1})", test.Name, test.Part); /// A part of a single test
- }
- else
- {
- title = string.Format("{0} ({1}/{2})", test.Name, 1, test.Repeats); /// More test repetitions
- }
-
- testComboBox.Text = title;
- TestName = title;
+ testComboBox.Text = testComboBox.Items[0].ToString();
+ TestName = testComboBox.Items[0].ToString();
}
else
{
diff --git a/TBF/UI/Shared/TestProgressCtrl.cs b/TBF/UI/Shared/TestProgressCtrl.cs
index 502850f71..8cdec8e0a 100644
--- a/TBF/UI/Shared/TestProgressCtrl.cs
+++ b/TBF/UI/Shared/TestProgressCtrl.cs
@@ -1,5 +1,5 @@
///
-/// Copyright (c) 2013-2015 Senus Slovensko a.s.
+/// Copyright (c) 2013-2021 Senus Slovensko a.s.
///
using System;
using System.Drawing;
@@ -29,28 +29,16 @@ namespace TBF.UI.Shared
}
}
- public bool Selected;
-
- int testId;
- public int TestId { get { return testId; } }
-
- string testName;
- public string TestName { get { return testName; } }
-
- int part;
- public int Part { get { return part; } }
-
- string title;
- public string Title2 { get { return title; } }
-
- int repetitionNr;
- public int RepetitionNr { get { return repetitionNr; } }
-
- public string Title { set { testNameLabel.Text = value; } }
+ public readonly string ComplTestName;
+ public readonly int TestId;
+ public readonly int Part;
+ public readonly int RepetitionNr;
public int Progress { set { testProgressBar.Value = value; } }
public ProgressBar TestProgressBar { get { return testProgressBar; } }
+ public bool Selected;
+
public TestProgressCtrl()
{
InitializeComponent();
@@ -58,16 +46,16 @@ namespace TBF.UI.Shared
this.TestResult = TestProgressCtrl.Result.NotDone;
}
- public TestProgressCtrl(int testId, string testName, int part, string title, int repetitionNr, int testRepeats)
+ public TestProgressCtrl(string complTestName, int testId, int part, int repetitionNr)
: this()
{
- this.testId = testId;
- this.part = part;
- this.testName = testName;
- this.title = title;
- this.repetitionNr = repetitionNr;
- this.Title = title;
- }
+ this.ComplTestName = complTestName;
+ this.TestId = testId;
+ this.Part = part;
+ this.RepetitionNr = repetitionNr;
+
+ testNameLabel.Text = complTestName;
+ }
private void TestProgressCtrl_Click(object sender, System.EventArgs e)
{
diff --git a/TBF/UI/TestProgressControls.cs b/TBF/UI/TestProgressControls.cs
index c85e83a56..54a7a276a 100644
--- a/TBF/UI/TestProgressControls.cs
+++ b/TBF/UI/TestProgressControls.cs
@@ -1,5 +1,5 @@
///
-/// Copyright (c) 2013-2015 Sensus Slovensko a.s.
+/// Copyright (c) 2013-2021 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
@@ -19,7 +19,7 @@ namespace TBF.UI
public TestProgressControls(Control parent)
{
this.parent = parent;
- progresses = null;
+ progresses = new List();
currentProgress = null;
Bridge.ProcedureSelectedHandler += delegate(object sender, ProcedureSelectedEventArgs args)
@@ -67,78 +67,22 @@ namespace TBF.UI
void ResetProgressBars(Config.Entities.Procedure procedure)
{
- foreach (var test in procedure.Tests)
- {
- var component = TbfComponents.FindComponent(test.Method);
- if (component != null)
- {
- test.IsOuterLoopStart = component is TBF.BenchControl.TestMethods.OuterLoop.Start.Component;
- test.IsOuterLoopEnd = component is TBF.BenchControl.TestMethods.OuterLoop.End.Component;
- }
- }
-
parent.SuspendLayout();
currentProgress = null;
parent.Controls.Clear();
- progresses = new List();
- bool isOuterLoopMode = false;
- int outerLoopRepeats = 0;
+ progresses.Clear();
- int i = 0;
- while (i < procedure.Tests.Count)
+ if (procedure.GetTestInstances() == null)
{
- Config.Entities.Test test = procedure.Tests[i++];
+ procedure.UpdateTestInstances(TBF.BenchControl.StateMachine.LoopStartNames, TBF.BenchControl.StateMachine.LoopEndNames, null);
+ }
- if (!isOuterLoopMode && test.IsOuterLoopStart)
- {
- isOuterLoopMode = true;
- outerLoopRepeats = (i < procedure.Tests.Count) ? procedure.Tests[i].Repeats : 1;
- continue;
- }
- else if (isOuterLoopMode && test.IsOuterLoopEnd)
- {
- 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++];
-
- if (test2.IsOuterLoopEnd)
- {
- if (r == repeats) newI = j;
- break;
- }
-
- string test2Name = Results.Utils.GetTestName(test2.Name, test2.Repeats, r);
- TestProgressCtrl progress =
- new TestProgressCtrl(test2.Id, test2Name, test2.Part, test2.GetExpandedTestName(r), r, test2.Repeats);
- progresses.Add(progress);
- parent.Controls.Add(progress);
- Console.WriteLine(test2Name);
- }
- }
- else
- {
- string testName = Results.Utils.GetTestName(test.Name, test.Repeats, r);
- TestProgressCtrl progress =
- new TestProgressCtrl(test.Id, testName, test.Part, test.GetExpandedTestName(r), r, test.Repeats);
- progresses.Add(progress);
- parent.Controls.Add(progress);
- Console.WriteLine(testName);
- }
- }
-
- i = newI;
+ foreach (var ti in procedure.GetTestInstances())
+ {
+ var progress = new TestProgressCtrl(ti.Name, ti.Test.Id, ti.Test.Part, ti.Repetition);
+ progresses.Add(progress);
+ parent.Controls.Add(progress);
}
parent.ResumeLayout();
@@ -177,7 +121,7 @@ namespace TBF.UI
{
foreach (var prgrs in progresses)
{
- if (prgrs.TestName == args.TestName && prgrs.Part == args.Part)
+ if (prgrs.ComplTestName == args.TestName && prgrs.Part == args.Part && prgrs.RepetitionNr == args.RepetitionNr)
{
prgrs.Progress = args.Progress;
break;