diff --git a/Config/Entities/Procedure.cs b/Config/Entities/Procedure.cs index 64504c102..cbdce59a7 100644 --- a/Config/Entities/Procedure.cs +++ b/Config/Entities/Procedure.cs @@ -234,6 +234,42 @@ namespace Config.Entities return null; } + + /// + /// Processes the selection done by the bench control panel in the main sequence. + /// + /// Selection.Q1, .Q2, .Q3 or .Test + /// The selected test or null + public virtual Test GetTest(string expandedTestName, out int testIx, out int repetNr) + { + for (int ix = 0; ix < Tests.Count; ix++) + { + Test test = Tests[ix]; + if (test.Name.Equals(expandedTestName)) + { + /// Name is not expanded => Repeats==1 + testIx = ix; + repetNr = 1; + return test; + } + + for (int r = 1; r <= test.Repeats; r++) + { + if (test.GetExpandedTestName(r).Equals(expandedTestName)) + { + testIx = ix; + repetNr = r; + return test; + } + } + } + + testIx = 0; + repetNr = 1; + return null; + } + + public override string ToString() { return string.Format("{0}, rev.{1}", Name, Revision); diff --git a/Config/Entities/Test.cs b/Config/Entities/Test.cs index be3542bf6..11afe4b52 100644 --- a/Config/Entities/Test.cs +++ b/Config/Entities/Test.cs @@ -313,6 +313,33 @@ namespace Config.Entities return null; } + /// + /// Return test title for a this test and a given repetition number + /// + /// 1 .. Nr. repetitions + /// Test title (string) + public virtual string GetExpandedTestName(int repetitionNr) + { + if (Repeats == 1) + { + if (Part == 0) + { + /// Single test + return Name; + } + else + { + /// A part of a single test + return string.Format("{0} ({1})", Name, Part); + } + } + else + { + /// More test repetitions + return string.Format("{0} ({1}/{2})", Name, repetitionNr, Repeats); + } + } + public virtual double GetErrLimLo(double volumeCTV, double testTime) { if (ErrLimLo <= ErrLimHi) diff --git a/TBF/BenchControl/Elde/RegulValve/SetFlowOp.cs b/TBF/BenchControl/Elde/RegulValve/SetFlowOp.cs index 368aece46..5ec8bc1f6 100644 --- a/TBF/BenchControl/Elde/RegulValve/SetFlowOp.cs +++ b/TBF/BenchControl/Elde/RegulValve/SetFlowOp.cs @@ -207,7 +207,11 @@ namespace TBF.BenchControl.Elde.RegulValve /// Run this operation /// - /// Event.None, Event.FlowReached, Event.RegulValveTimeOut, Event.OpArgumentError + /// Event.OpArgumentError + /// Event.Starting + /// Event.Busy + /// Event.FlowReached + /// Event.RegulValveTimeOut /// public Event Run() { @@ -251,12 +255,12 @@ namespace TBF.BenchControl.Elde.RegulValve // '_regulValve.RegulValveCfg.PidCoef' replaced by a casted operation parameter 'pidCoef' controlBoard.SendCommand(Command.Start, flowMeter.Idx1, controlBoard.Route, int.MaxValue, int.MaxValue, tm, sd); - return Event.None; + return Event.Starting; } else if (opState == OpState.ValveMoveToPosition1) { opState = OpState.ValveMoveToPosition2; - return Event.None; + return Event.Starting; } else if (opState == OpState.ValveMoveToPosition2) /// Move to position { @@ -266,7 +270,7 @@ namespace TBF.BenchControl.Elde.RegulValve regulValve.StableTime); opState = OpState.SettingPosition; - return Event.None; + return Event.Starting; } else if (opState == OpState.ValveMoveToPosition3) { @@ -278,14 +282,14 @@ namespace TBF.BenchControl.Elde.RegulValve { opState = OpState.SettingPosition; } - return Event.None; + return Event.Starting; } else if (opState == OpState.CheckStatePosition) /// Verify { if (((ulong)controlBoard.StatusP & (ulong)StatusP.RefPulsesMsrmnt) == 0) { opState = OpState.SendCommandAgain; - return Event.None; + return Event.Starting; } else if (controlBoard.RegulValveState(regulValveNr) != RegulValveState.DacValueRegul) { @@ -298,12 +302,12 @@ namespace TBF.BenchControl.Elde.RegulValve regulValveNr, targetPositionLo, targetPositionHi, regulValve.StableTime); opState = OpState.ValveMoveToPosition3; - return Event.None; + return Event.Starting; } else { opState = OpState.SettingPosition; - return Event.None; + return Event.Starting; } } else if (opState == OpState.SettingPosition) @@ -313,12 +317,12 @@ namespace TBF.BenchControl.Elde.RegulValve { opState = OpState.ValveMoveToFlow1; } - return Event.None; + return Event.Starting; } else if (opState == OpState.ValveMoveToFlow1) { opState = OpState.ValveMoveToFlow2; - return Event.None; + return Event.Starting; } else if (opState == OpState.ValveMoveToFlow2) /// Move to flow { @@ -340,7 +344,7 @@ namespace TBF.BenchControl.Elde.RegulValve regulValve.StableTime); opState = OpState.ValveMoveToFlow3; - return Event.None; + return Event.Starting; } else if (opState == OpState.ValveMoveToFlow3) { @@ -352,7 +356,7 @@ namespace TBF.BenchControl.Elde.RegulValve { opState = OpState.SettingFlow; } - return Event.None; + return Event.Starting; } else if (opState == OpState.CheckStateFlow) /// Verify the flow setting { @@ -360,7 +364,7 @@ namespace TBF.BenchControl.Elde.RegulValve (controlBoard.RegulValveState(regulValveNr) & RegulValveState.PwOrFreqRegul) != RegulValveState.PwOrFreqRegul) { opState = OpState.SendCommandAgain; - return Event.None; + return Event.Starting; } else if (controlBoard.RegulValveState(regulValveNr) != RegulValveState.PwOrFreqRegul) { @@ -375,12 +379,12 @@ namespace TBF.BenchControl.Elde.RegulValve regulValveNr, freqLo, freqHi, regulValve.StableTime); opState = OpState.ValveMoveToFlow3; - return Event.None; + return Event.Starting; } else { opState = OpState.SettingFlow; - return Event.None; + return Event.Busy; } } else if (opState == OpState.SettingFlow) @@ -423,7 +427,7 @@ namespace TBF.BenchControl.Elde.RegulValve else { log.InfoFormat("flow = {0} m3/h (lo={1}, hi={2}, FLOW_OK_TIMER={3}s)", flow, currentReqFlowLo, currentReqFlowHi, flowWithinBoundsTime); - return Event.None; + return Event.Busy; } } else if (StateMachine.Time > expireTime) @@ -434,7 +438,7 @@ namespace TBF.BenchControl.Elde.RegulValve { log.InfoFormat("flow = {0} m3/h (lo={1}, hi={2})", flow, currentReqFlowLo, currentReqFlowHi); flowWithinBoundsTime = 0; - return Event.None; + return Event.Busy; } } else /// opState == OpState.FlowReached diff --git a/TBF/BenchControl/Events.cs b/TBF/BenchControl/Events.cs index dd5e48f32..12a6ca4f5 100644 --- a/TBF/BenchControl/Events.cs +++ b/TBF/BenchControl/Events.cs @@ -73,6 +73,7 @@ namespace TBF.BenchControl public enum Event { None = 0, + Starting, /// During initial phase of some process, sending a command to a device, etc. Busy, /// Useful when waiting in state until at least one is busy (all are done) Done, /// Useful when waiting in state until the first is done, the rest miht still be busy MakeSecondPass, /// Test completed OK but 2nd pass (evaluation) is required diff --git a/TBF/BenchControl/Sequences/MainSeq.cs b/TBF/BenchControl/Sequences/MainSeq.cs index 54cc8e55e..f2cb6efd1 100644 --- a/TBF/BenchControl/Sequences/MainSeq.cs +++ b/TBF/BenchControl/Sequences/MainSeq.cs @@ -819,9 +819,9 @@ namespace TBF.BenchControl.Sequences { //-------------------------------- State.Create("MainSeq : Continue in the cycle?") - .AddOperation(new Operations.AskYesNoOp(Strings.Continue_in_the_cycle)) - .AddOperation(checkUiOp) - .EnterState(); + .AddOperation(new Operations.AskYesNoOp(Strings.Continue_in_the_cycle)) + .AddOperation(checkUiOp) + .EnterState(); while (true) { e = StateMachine.WaitRunDevsRunOps(); @@ -848,23 +848,14 @@ namespace TBF.BenchControl.Sequences /// if (selection == Selection.RestOfCycle) /// ... otherwise { - Test slctdTest = TBF.BenchControl.StateMachine.GetTest(selectedTestName, out repetNr); - if (slctdTest == null) + Test slctdTest = TBF.BenchControl.StateMachine.Procedure.GetTest(selectedTestName, out selsctedTestIx, out repetNr); + if (slctdTest == null || (selsctedTestIx < simultWithPurgingCount) + || (selsctedTestIx >= StateMachine.Tests.Count - simultWithEvacuationCount)) { + /// Invalid test selection UiBridge.Bridge.OnError(this, string.Format("No test specified")); goto select_cycle_or_test; } - - selsctedTestIx = -1; - for (int i = simultWithPurgingCount; i < StateMachine.Tests.Count - simultWithEvacuationCount; i++) - { - if (slctdTest == StateMachine.Tests[i]) - { - selsctedTestIx = i; - break; - } - } - if (selsctedTestIx == -1) goto select_cycle_or_test; /// goto ... when selection is not valid } @@ -878,8 +869,8 @@ namespace TBF.BenchControl.Sequences /// Try to fetch all test paths and transitions /// to detect configuration errors as early as possible. - string errorMsg; - TBF.BenchControl.Generic.IComponent testMethodComp = TbfComponents.FindComponent(test.Method); + TBF.BenchControl.Generic.IComponent testMethodComp = TbfComponents.FindComponent(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), @@ -899,15 +890,65 @@ namespace TBF.BenchControl.Sequences int outerLoopRepeats = 0; while (currentTestIx < StateMachine.Tests.Count - simultWithEvacuationCount) { - Test test = StateMachine.Tests[currentTestIx]; Test nextTest = (currentTestIx + 1 < StateMachine.Tests.Count - simultWithEvacuationCount) ? StateMachine.Tests[currentTestIx + 1] : null; - /// Fetch the test paths and transitions - string errorMsg; - TBF.BenchControl.Generic.IComponent testMethodComp = TbfComponents.FindComponent(test.Method); - if (!(testMethodComp is TBF.BenchControl.TestMethods.OuterLoop.Start.Component) && + Test nextHydroTest = null; + for (int i = currentTestIx + 1; i < StateMachine.Tests.Count - simultWithEvacuationCount; i++) + { + Test tst = StateMachine.Tests[i]; + if (tst != null) + { + ITestMethod tm = TbfComponents.FindComponent(tst.Method) as ITestMethod; + if (tm != null && tm.DoTransitions()) + { + nextHydroTest = tst; + break; + } + } + } + + if (nextHydroTest != null) + { + /// Fetch paths and 'transition before' of the next test + TBF.BenchControl.Generic.IComponent nextTestMethodComp = TbfComponents.FindComponent(nextHydroTest.Method); + TransitionSequence dummy2, dummy3; + string errorMsg2; + if (!(nextTestMethodComp is TBF.BenchControl.TestMethods.OuterLoop.Start.Component) && + !(nextTestMethodComp is TBF.BenchControl.TestMethods.OuterLoop.End.Component) && + !StateMachine.GetPaths(nextHydroTest, (StateMachine.Procedure.MetersKind == MetersKind.HeatMeter), + out nextInPath, out nextBenchPath, out nextOutPath, out nextSensPath, + out nextHeatMetersPath, + out nextTransitionBefore, out dummy2, out dummy3, + out errorMsg2)) + { + UiBridge.Bridge.OnError(this, errorMsg2); + goto select_cycle_or_test; + } + + nextQfrom = nextHydroTest.Qfrom; + nextQto = nextHydroTest.Qto; + nextPumpPower = nextHydroTest.PumpPower; + nextTolerRed = nextHydroTest.TolerRed; + nextPidCoef = (nextOutPath != null) ? nextOutPath.PidCoef : 1.0F; + } + else + { + /// Clear paths and 'transition before' of the next test it does not exist + nextInPath = null; + nextBenchPath = null; + nextOutPath = null; + nextSensPath = null; + nextHeatMetersPath = null; + nextTransitionBefore = null; + } + + /// Fetch paths and transitions of this test + Test test = StateMachine.Tests[currentTestIx]; + TBF.BenchControl.Generic.IComponent testMethodComp = TbfComponents.FindComponent(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), out inPath, out benchPath, out outPath, out sensPath, @@ -920,9 +961,12 @@ namespace TBF.BenchControl.Sequences } /// Update format for the water mass - Mass.Format = outPath.Scale.Format; - StartMass.Format = outPath.Scale.Format; - EndMass.Format = outPath.Scale.Format; + if (outPath != null && outPath.Scale != null && !string.IsNullOrEmpty(outPath.Scale.Format)) + { + Mass.Format = outPath.Scale.Format; + StartMass.Format = outPath.Scale.Format; + EndMass.Format = outPath.Scale.Format; + } ITestMethod testMethod = testMethodComp as ITestMethod; @@ -1008,7 +1052,10 @@ namespace TBF.BenchControl.Sequences if (testMethod.DoTransitions() && !e.Contains(Event.RecoverableError)) { /// Make a transition after the last test repetition - TransitionContext endContext = currentTestFinished ? TransitionContext.AfterTest : TransitionContext.Stop; + 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); } @@ -1116,7 +1163,8 @@ namespace TBF.BenchControl.Sequences /// Single test will be executed int repetNr; - Test test = TBF.BenchControl.StateMachine.GetTest(selectedTestName, out repetNr); + int testIx; + Test test = TBF.BenchControl.StateMachine.Procedure.GetTest(selectedTestName, out testIx, out repetNr); if (test == null) { UiBridge.Bridge.OnError(this, string.Format("No test specified")); diff --git a/TBF/BenchControl/Sequences/SequenceBase.cs b/TBF/BenchControl/Sequences/SequenceBase.cs index b8be7f061..8d5adfc27 100644 --- a/TBF/BenchControl/Sequences/SequenceBase.cs +++ b/TBF/BenchControl/Sequences/SequenceBase.cs @@ -68,6 +68,21 @@ namespace TBF.BenchControl.Sequences protected static TransitionSequence transitionBetween; protected static TransitionSequence transitionAfter; + /// + /// Advanced information about the next test + /// + protected static BenchControl.FeedingPath nextInPath; + protected static BenchControl.BenchPath nextBenchPath; + protected static BenchControl.OutputPath nextOutPath; + protected static BenchControl.MetersPath nextSensPath; + protected static BenchControl.HeatMetersPath nextHeatMetersPath; + protected static TransitionSequence nextTransitionBefore; + protected static float nextQfrom; + protected static float nextQto; + protected static float nextPumpPower; + protected static float nextPidCoef; + protected static double nextTolerRed; + protected IOperation readRegistersOp; protected IOperation queryEnd1; @@ -439,10 +454,11 @@ namespace TBF.BenchControl.Sequences public enum TransitionContext { PurgeBegin, - BeforeTest, - BetweenTests, - AfterTest, - PurgeEnd, + BeforeTest, /// Before starting a test, paths are always applied aftr this sequence + BetweenTests, /// Between two repetitions of the same test + AfterTest, /// After completing a test + AfterTestWithOverlap, /// After completing transition sequence paths of the next test are selected and flow setting starts + PurgeEnd, Stop, } @@ -482,7 +498,12 @@ namespace TBF.BenchControl.Sequences case TransitionContext.PurgeBegin: message = Strings.Purging_i_n; break; case TransitionContext.BeforeTest: message = Strings.Test_start_sequence_i_n; break; case TransitionContext.BetweenTests: message = Strings.Between_tests_sequence_i_n; break; - case TransitionContext.AfterTest: message = Strings.Test_stop_sequence_i_n; break; + + case TransitionContext.AfterTestWithOverlap: + case TransitionContext.AfterTest: + message = Strings.Test_stop_sequence_i_n; + break; + case TransitionContext.PurgeEnd: message = Strings.Emptying_i_n; break; case TransitionContext.Stop: message = Strings.Test_stop_sequence_i_n; break; default: message = "Transition"; break; @@ -495,7 +516,7 @@ namespace TBF.BenchControl.Sequences /// /// No transition sequence defined --> Default action /// - if (context == TransitionContext.AfterTest) + if ((context == TransitionContext.AfterTest) || (context == TransitionContext.AfterTestWithOverlap)) { if (inPath.Pump is GenericDevices.IPumpFM) (inPath.Pump as GenericDevices.IPumpFM).TurnOff(); @@ -680,7 +701,8 @@ namespace TBF.BenchControl.Sequences for (int first = 1; first <= lastStartedRV; first++) { log.DebugFormat("SequenceBase.Transition() : Step {0} stop, opening={1}, closing={2}", step.ItemNr + 1, step.ValvesOpen, step.ValvesClose); - State stepStop = State.Create(string.Format("SequenceBase.Transition() : Step {0} stop, opening={1}, closing={2}", step.ItemNr + 1, step.ValvesOpen, step.ValvesClose)) + State stepStop = State + .Create(string.Format("SequenceBase.Transition() : Step {0} stop, opening={1}, closing={2}", step.ItemNr + 1, step.ValvesOpen, step.ValvesClose)) .AddOperation(checkUiOp) .AddOperation(conditionOperation) .AddOperation(new MettlerToledo.KeepReadingMassesOp()) @@ -717,11 +739,10 @@ namespace TBF.BenchControl.Sequences /// Stop the pump /// State.Create("SequenceBase.Transition() : Test stopped -> Stopping the pump") - .AddOperation(checkUiOp) - .AddOperation(StateMachine.ControlBoard.SetValvesOp(null, inPath.Pump)) - .EnterState(); - do - { + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(null, inPath.Pump)) + .EnterState(); + do { e = StateMachine.WaitRunDevsRunOps(); if (e.Contains(Event.Error)) return Event.Error; } @@ -730,17 +751,19 @@ namespace TBF.BenchControl.Sequences } else if (context == TransitionContext.BeforeTest) { - if (inPath != null && benchPath != null && outPath != null) + /// + /// Always set route at the beginning of this test + /// + if (inPath != null && benchPath != null && outPath != null) { State.Create("SequenceBase : Transition : TestStart - Default action") .AddOperation(checkUiOp) .AddOperation(new MettlerToledo.KeepReadingMassesOp()) .AddOperation(StateMachine.ControlBoard - .SetValvesOp(GenericDevices.ValveBase.Merge(inPath.ValvesOpen, benchPath.ValvesOpen, outPath.ValvesOpen), - GenericDevices.ValveBase.Merge(inPath.ValvesClose, benchPath.ValvesClose, outPath.ValvesClose))) + .SetValvesOp(GenericDevices.ValveBase.Merge(inPath.ValvesOpen, benchPath.ValvesOpen, outPath.ValvesOpen), + GenericDevices.ValveBase.Merge(inPath.ValvesClose, benchPath.ValvesClose, outPath.ValvesClose))) .EnterState(); - do - { + do { e = StateMachine.WaitRunDevsRunOps(); if (e.Contains(Event.Error)) return Event.Error; if (TestAndLogUiCmdStop(e)) return Event.UiCmdStop; @@ -748,8 +771,54 @@ namespace TBF.BenchControl.Sequences while (e.Contains(Event.ValvesBusy)); } } + else if ((context == TransitionContext.AfterTestWithOverlap) && (nextInPath != null) && (nextBenchPath != null) && (nextOutPath != null)) + { + /// Set route for the next test + State.Create("SequenceBase : AfterTestWithOverlap : Default action") + .AddOperation(checkUiOp) + .AddOperation(new MettlerToledo.KeepReadingMassesOp()) + .AddOperation(StateMachine.ControlBoard + .SetValvesOp(GenericDevices.ValveBase.Merge(nextInPath.ValvesOpen, nextBenchPath.ValvesOpen, nextOutPath.ValvesOpen), + GenericDevices.ValveBase.Merge(nextInPath.ValvesClose, nextBenchPath.ValvesClose, nextOutPath.ValvesClose))) + .EnterState(); + do { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) return Event.Error; + if (TestAndLogUiCmdStop(e)) return Event.UiCmdStop; + } + while (e.Contains(Event.ValvesBusy)); + /// Set PID coefficient, etc. + int[] filters = new int[] { 0, 0, 0, 0, 0, 0, 0, 0 }; + StateMachine.ControlBoard.SetFiltersPidShortPulses(filters, nextPidCoef, (nextTolerRed == 0) ? 0 : 1); + + /// Set pump power + if (nextInPath.Pump is GenericDevices.IPumpFM) (nextInPath.Pump as GenericDevices.IPumpFM).TurnOn(nextPumpPower); + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Setting_the_flow); + //------------------------------------------------ + /// Set flow for the next test + State.Create(string.Format("SequenceBase : AfterTestWithOverlap - Setting the flow to {0} - {1} m3/h", nextQfrom, nextQto)) + .AddOperation(checkUiOp) + .AddOperation(new MettlerToledo.KeepReadingMassesOp()) + .AddOperation(nextOutPath.RegulValve.SetFlowAndMeasureOp(nextOutPath.FlowMeter, nextQfrom, nextQto, RefFlow, FlowSettingTimeoutSec, 0)) + .EnterState(); + do { + e = StateMachine.WaitRunDevsRunOps(); + + if (e.Contains(Event.OpArgumentError)) return Event.Error; + if (TestAndLogUiCmdStop(e)) return Event.UiCmdStop; + if (e.Contains(Event.RegulValveTimeOut)) + { + Bridge.OnError(this, Strings.Flow_adjustment_failed); + return Event.UiCmdStop; + } + } + while (!e.Contains(Event.Busy) && !e.Contains(Event.FlowReached)); + } + if (errorFlag) return Event.Error; else if (stopFlag) @@ -866,6 +935,114 @@ namespace TBF.BenchControl.Sequences } + protected Event SetFlowEtc(Test test, IFlowMeter flowMeter, IRegulValve regulValve, IValve pump, IValve stopBFValve, IList extraOperations, bool doNotWait) + { + IList e; + Event retVal = Event.Done; + + if (pump is GenericDevices.IPumpFM) (pump as GenericDevices.IPumpFM).TurnOn(test.PumpPower); + /// + State.Create(string.Format("{0}({1}) : Starting the pump", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperations(extraOperations) + .AddOperation(pump != null ? StateMachine.ControlBoard.SetValvesOp(pump, null) : null) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + //Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + //Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(e)) return Event.UiCmdStop; + if (e.Contains(Event.Error)) return Event.Error; + } + while (e.Contains(Event.ValvesBusy) /* || !e.Contains(Event.AllPositionsReached)*/); + + + if (test.TimePump2StartV > 0) + { + State.Create(string.Format("{0}({1}) : Waiting after the pump started", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(new Operations.TimerOp(test.TimePump2StartV)) + .AddOperations(extraOperations) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + //Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + //Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(e)) return Event.UiCmdStop; + } + while (!e.Contains(Event.TimerExpired)); + } + + + if (stopBFValve != null) + { + State.Create(string.Format("{0}({1}) : Opening the stop backflow valve", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(StateMachine.ControlBoard.SetValvesOp(stopBFValve, null)) + .AddOperations(extraOperations) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (TestAndLogUiCmdStop(e)) return Event.UiCmdStop; + if (e.Contains(Event.Error)) return Event.Error; + } + while (!e.Contains(Event.ValvesSet)); + } + + + if (test.TimeBeforeFlow > 0) + { + State.Create(string.Format("{0}({1}) : Waiting before flow setting process starts", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(new Operations.TimerOp(test.TimeBeforeFlow)) + .AddOperations(extraOperations) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + //Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + //Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (TestAndLogUiCmdStop(e)) return Event.UiCmdStop; + } + while (!e.Contains(Event.TimerExpired)); + } + + //------------------------------------------------ + Bridge.OnActivity(this, Strings.Setting_the_flow); + //------------------------------------------------ + State.Create(string.Format("{0}({1}) : Setting the flow", test.Method, test.Name)) + .AddOperation(checkUiOp) + .AddOperation(doNotWait ? regulValve.SetFlowAndMeasureOp(flowMeter, test.Qfrom, test.Qto, RefFlow, FlowSettingTimeoutSec, 0) + : regulValve.SetFlowOp(flowMeter, test.Qfrom, test.Qto, RefFlow, FlowSettingTimeoutSec)) + .AddOperations(extraOperations) + .EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + //Bridge.OnProcessData(this, new ProcessDataEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + //Bridge.OnTestProgress(this, new TestProgressEventArgs(test, repetitionNr, Config.Entities.Progress.FlowSetting)); + + if (e.Contains(Event.OpArgumentError)) return Event.OpArgumentError; + if (TestAndLogUiCmdStop(e)) return Event.UiCmdStop; + if (e.Contains(Event.RegulValveTimeOut)) + { + Bridge.OnError(this, Strings.Flow_adjustment_failed); + return Event.RecoverableError; + } + if (e.Contains(Event.Next)) return Event.Done; + } + while (!(e.Contains(Event.FlowReached) || (doNotWait && e.Contains(Event.Busy)))); /// Stay in the loop while e.Contains(Event.Starting) + + return retVal; + } + + /// /// Main loop where measurements are collected. /// @@ -1631,7 +1808,7 @@ namespace TBF.BenchControl.Sequences /// /// Returns true and makes a log when 'e' contains Event.UiCmdStop /// - /// + /// test or null (only for logs) /// /// protected bool TestAndLogUiCmdStop(Test test, IList e) diff --git a/TBF/BenchControl/StateMachine.cs b/TBF/BenchControl/StateMachine.cs index 75b079bbb..93fe1c472 100644 --- a/TBF/BenchControl/StateMachine.cs +++ b/TBF/BenchControl/StateMachine.cs @@ -574,31 +574,6 @@ namespace TBF.BenchControl } } - /// - /// Processes the selection done by the bench control panel in the main sequence. - /// - /// Selection.Q1, .Q2, .Q3 or .Test - /// The selected test or null - public static Config.Entities.Test GetTest(string selectedTestName, out int repetNr) - { - repetNr = 1; - foreach (var test in Tests) - { - if (test.Name.Equals(selectedTestName)) return test; /// Test name specified, keep repetNr = 1 - - for (int i = 1; i <= test.Repeats; i++) - { - if (Utils.TestTitle(test, i).Equals(selectedTestName)) - { - repetNr = i; - return test; - } - } - } - - return null; - } - /// /// Called from the sequence to update paths based on the selected test /// @@ -623,6 +598,9 @@ namespace TBF.BenchControl out TransitionSequence transitionAfter, out string errorMsg) { + ITestMethod tm = TbfComponents.FindComponent(test.Method) as ITestMethod; + bool isHydroTest = (tm != null) ? tm.DoTransitions() : false; + pfeed = null; pben = null; pout = null; @@ -648,12 +626,12 @@ namespace TBF.BenchControl pmtrs = GetMetersPath(test); - if (pfeed == null) errorMsg = Strings.Cannot_load_feeding_path; - else if (pben == null) errorMsg = Strings.Cannot_load_bench_path; - else if (pout == null) errorMsg = Strings.Cannot_load_output_path; + if (isHydroTest && (pfeed == null)) errorMsg = Strings.Cannot_load_feeding_path; + else if (isHydroTest && (pben == null)) errorMsg = Strings.Cannot_load_bench_path; + else if (isHydroTest && (pout == null)) errorMsg = Strings.Cannot_load_output_path; else if (pmtrs == null) errorMsg = Strings.Cannot_load_sensor_path; else errorMsg = string.Empty; - if ((pfeed == null) || (pben == null) || (pout == null) || (pmtrs == null)) + if ((isHydroTest && (pfeed == null || pben == null || pout == null)) || (pmtrs == null)) { return false; } @@ -677,7 +655,7 @@ namespace TBF.BenchControl if (tr.Name == test.TransitionAfter) transitionAfter = tr; } - if (pout.Scale == null) + if (isHydroTest && pout.Scale == null) { errorMsg = string.Format("No balance specified in path {0}", test.OutputPath); return false; diff --git a/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs b/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs index 0f233fa83..0ce137f7b 100644 --- a/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs +++ b/TBF/BenchControl/TestMethods/iPerlCommunication/iPerlCommunicationForm.cs @@ -693,11 +693,19 @@ namespace TBF.BenchControl.TestMethods.iPerlCommunication UpdateRfidCommResult(tests); /// TODO: Pass the test info in a correct way } + long checkboxStates = GetCheckBoxStates(); + if (Program.LocalSettings.iPerlCommunicationsFormLeft != Location.X || + Program.LocalSettings.iPerlCommunicationsFormTop != Location.Y || + Program.LocalSettings.iPerlCommunicationsFormCheckboxes != checkboxStates) + { + /// Update local settings + Program.LocalSettings.iPerlCommunicationsFormLeft = Location.X; + Program.LocalSettings.iPerlCommunicationsFormTop = Location.Y; + Program.LocalSettings.iPerlCommunicationsFormCheckboxes = checkboxStates; + Program.LocalSettings.Save(); + } + formCompleted = true; - Program.LocalSettings.iPerlCommunicationsFormLeft = Location.X; - Program.LocalSettings.iPerlCommunicationsFormTop = Location.Y; - Program.LocalSettings.iPerlCommunicationsFormCheckboxes = GetCheckBoxStates(); - Program.LocalSettings.Save(); DialogResult = DialogResult.OK; Close(); diff --git a/TBF/UI/Shared/BenchControlPanel.cs b/TBF/UI/Shared/BenchControlPanel.cs index c580619da..22118822f 100644 --- a/TBF/UI/Shared/BenchControlPanel.cs +++ b/TBF/UI/Shared/BenchControlPanel.cs @@ -186,7 +186,7 @@ namespace TBF.UI.Shared { for (int i = 1; i <= test.Repeats; i++) { - testComboBox.Items.Add(Utils.TestTitle(test, i)); + testComboBox.Items.Add(test.GetExpandedTestName(i)); } } diff --git a/TBF/UI/TestProgressControls.cs b/TBF/UI/TestProgressControls.cs index 15a00aa9d..19b70f931 100644 --- a/TBF/UI/TestProgressControls.cs +++ b/TBF/UI/TestProgressControls.cs @@ -121,7 +121,7 @@ namespace TBF.UI string test2Name = global::Results.Utils.GetTestName(test2.Name, test2.Repeats, r); TestProgressCtrl progress = - new TestProgressCtrl(test2.Id, test2Name, test2.Part, Utils.TestTitle(test2, r), r, test2.Repeats); + new TestProgressCtrl(test2.Id, test2Name, test2.Part, test2.GetExpandedTestName(r), r, test2.Repeats); progresses.Add(progress); parent.Controls.Add(progress); Console.WriteLine(test2Name); @@ -131,7 +131,7 @@ namespace TBF.UI { string testName = global::Results.Utils.GetTestName(test.Name, test.Repeats, r); TestProgressCtrl progress = - new TestProgressCtrl(test.Id, testName, test.Part, Utils.TestTitle(test, r), r, test.Repeats); + new TestProgressCtrl(test.Id, testName, test.Part, test.GetExpandedTestName(r), r, test.Repeats); progresses.Add(progress); parent.Controls.Add(progress); Console.WriteLine(testName); diff --git a/TBF/Utils.cs b/TBF/Utils.cs index 540bae026..7ae2524de 100644 --- a/TBF/Utils.cs +++ b/TBF/Utils.cs @@ -265,32 +265,6 @@ namespace TBF return wmPartNr; } - /// - /// Return test title for a given test and a repetition number - /// - /// Test entity - /// 1 .. Nr. repetitions - /// Test title (string) - public static string TestTitle(Test test, int repetitonNr) - { - if (test.Repeats == 1) - { - if (test.Part == 0) - { - return test.Name; /// Single test - } - else - { - return string.Format("{0} ({1})", test.Name, test.Part); /// A part of a single test - } - } - else - { - /// More test repetitions - return string.Format("{0} ({1}/{2})", test.Name, repetitonNr, test.Repeats); - } - } - /// /// Return test title for a given test data and a repetition number ///