From a2bb50117e8d4905d0a58dc9ecdaa25da111582a Mon Sep 17 00:00:00 2001 From: Milan Hanajik Date: Sat, 16 Mar 2019 10:08:15 +0100 Subject: [PATCH] StartInfo is read from DB when previous results were reloaded. --- TBF/BenchControl/Sequences/MainSeq.cs | 215 +++++++++++---------- TBF/BenchControl/Sequences/SequenceBase.cs | 17 +- 2 files changed, 126 insertions(+), 106 deletions(-) diff --git a/TBF/BenchControl/Sequences/MainSeq.cs b/TBF/BenchControl/Sequences/MainSeq.cs index c82aea1ab..554eae7bb 100644 --- a/TBF/BenchControl/Sequences/MainSeq.cs +++ b/TBF/BenchControl/Sequences/MainSeq.cs @@ -225,34 +225,19 @@ namespace TBF.BenchControl.Sequences /// - /// Main sequence + /// /// - /// - /// - public void Execute() + /// true = OK, false = error + bool DrainTanks() { IList e; - Selection selection; - string selectedTestName; - - Bridge.OnActivity(this, Strings.Starting_system); - WaitForOkButton(); - SetValvesToDefaultState(); - - string scaleName; - string message; - if (TestCommunicationWithScales(out scaleName, out message) == false) - { - Bridge.OnError(this, string.Format("{0} : {1}", scaleName, message)); - goto error; - } /// - /// Enable stop draining buttons - /// - Bridge.Bench2UI(((StateMachine.DrainValve1 != null) ? ButtonsEtc.DrainTankBtn1Hi : 0) | - ((StateMachine.DrainValve2 != null) ? ButtonsEtc.DrainTankBtn2Hi : 0) | - ((StateMachine.DrainValve3 != null) ? ButtonsEtc.DrainTankBtn3Hi : 0)); + /// Enable stop draining buttons + /// + Bridge.Bench2UI(((StateMachine.DrainValve1 != null) ? ButtonsEtc.DrainTankBtn1Hi : 0) | + ((StateMachine.DrainValve2 != null) ? ButtonsEtc.DrainTankBtn2Hi : 0) | + ((StateMachine.DrainValve3 != null) ? ButtonsEtc.DrainTankBtn3Hi : 0)); /// /// Determine lists of drain valves and drain times (max. of all tank drain times) @@ -299,17 +284,16 @@ namespace TBF.BenchControl.Sequences .AddOperation(new TimerOp(areTwoDrainPhases ? firstPhaseTime : totalDrainTime, timerTime)) .AddOperation(StateMachine.ControlBoard.SetValvesOp(fullDrainValves, null)) .EnterState(); - do - { + do { int remTime = areTwoDrainPhases ? (timerTime.Val + totalDrainTime - firstPhaseTime) : timerTime.Val; Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", Strings.Emptying_tank, remTime / 60, "min", remTime % 60, Strings.sec)); e = StateMachine.WaitRunDevsRunOps(); - if (e.Contains(Event.Error)) goto error; - bool stopDrainingCmd = e.Contains(Event.UiCmdStopDrainingTank1) || e.Contains(Event.UiCmdStopDrainingTank2) || e.Contains(Event.UiCmdStopDrainingTank3); - if (stopDrainingCmd && !e.Contains(Event.ValvesBusy) && !e.Contains(Event.CameraBusy)) break; + if (e.Contains(Event.Error)) return false; + bool stopDrainingCmd = e.Contains(Event.UiCmdStopDrainingTank1) || e.Contains(Event.UiCmdStopDrainingTank2) || e.Contains(Event.UiCmdStopDrainingTank3); + if (stopDrainingCmd && !e.Contains(Event.ValvesBusy) && !e.Contains(Event.CameraBusy)) break; } - while (e.Contains(Event.TimerBusy) || e.Contains(Event.CameraBusy) || e.Contains(Event.ValvesBusy)); + while (e.Contains(Event.TimerBusy) || e.Contains(Event.CameraBusy) || e.Contains(Event.ValvesBusy)); if (areTwoDrainPhases) { @@ -318,13 +302,12 @@ namespace TBF.BenchControl.Sequences .AddOperation(new TimerOp(totalDrainTime - firstPhaseTime, timerTime)) .AddOperation(StateMachine.ControlBoard.SetValvesOp(secondHalfDrainValves, null)) .EnterState(); - do - { + do { int remTime = timerTime.Val; Bridge.OnActivity(this, string.Format("{0} ... {1} {2} {3} {4}", Strings.Emptying_tank, remTime / 60, "min", remTime % 60, Strings.sec)); e = StateMachine.WaitRunDevsRunOps(); - if (e.Contains(Event.Error)) goto error; + if (e.Contains(Event.Error)) return false; bool stopDrainingCmd = e.Contains(Event.UiCmdStopDrainingTank1) || e.Contains(Event.UiCmdStopDrainingTank2) || e.Contains(Event.UiCmdStopDrainingTank3); if (stopDrainingCmd && !e.Contains(Event.ValvesBusy) && !e.Contains(Event.CameraBusy)) break; } @@ -333,22 +316,56 @@ namespace TBF.BenchControl.Sequences Bridge.OnActivity(this, Strings.Emptying_tank); - State stopDraining = State.Create("MainSeq : Stop draining water tanks") + State stopDraining = State.Create("MainSeq : Stop draining water tanks") .AddOperation(checkUiOp) .AddOperation(StateMachine.ControlBoard.SetValvesOp(null, allDrainValves)) .EnterState(); - do - { + do { e = StateMachine.WaitRunDevsRunOps(); - if (e.Contains(Event.Error)) goto error; + if (e.Contains(Event.Error)) return false; } while (e.Contains(Event.ValvesBusy)); } + return true; /// OK + } + + + /// + /// Main sequence + /// + /// + /// + public void Execute() + { + IList e; + Selection selection; + string selectedTestName; + + Bridge.OnActivity(this, Strings.Starting_system); + WaitForOkButton(); + SetValvesToDefaultState(); + + + string scaleName; + string message; + if (TestCommunicationWithScales(out scaleName, out message) == false) + { + Bridge.OnError(this, string.Format("{0} : {1}", scaleName, message)); + goto error; + } + + + if (!DrainTanks()) + { + Bridge.OnError(this, "Error when draining tanks"); + goto error; + } + + //-------------------------------------------------------------------------------------------- Bridge.OnActivity(this, Strings.Resetting_scales); - //-------------------------------------------------------------------------------------------- - Bridge.Bench2UI(ButtonsEtc.StopBtnEn); /// Resetting scales : Enable STOP button + Bridge.Bench2UI(ButtonsEtc.StopBtnEn); /// Resetting scales -> Enable STOP button DoubleBox tara1 = new DoubleBox(0); DoubleBox tara2 = new DoubleBox(0); @@ -485,19 +502,43 @@ namespace TBF.BenchControl.Sequences StateMachine.CycleStartTimeStamp = BatchRslts.Batch.StartTime; - - Bridge.OnProcedureSelected(this, new ProcedureSelectedEventArgs(StateMachine.Procedure)); + /// /// Display 'Cycle Begin Form' in case of a normal batch (not a restored batch) /// - if (selection != Selection.RestoreBatch) - { - if (OpenCycleBeginForm()) goto stop; + if ((selection != Selection.RestoreBatch) && !OpenCycleBeginForm()) + { + goto stop; } + /// + /// Prepare operations for reading start info @ cycle start + /// + IList startInfoReadOps = new List(); + string[] resultWriters = StateMachine.Procedure.ResultsWriter.Split(new char[] { '~' }); + foreach (var writerName in resultWriters) + { + IStartInfoReader infoReader = TbfComponents.FindComponent(writerName) as IStartInfoReader; + if (infoReader != null) + { + try + { + IOperation op = infoReader.ReadStartInfoOp(ProcessData.BatchRslts.WaterMeters); + if (op != null) startInfoReadOps.Add(op); + } + catch (Exception exc) + { + Bridge.OnError(this, string.Format(Strings.Component_0_crashed_Results_not_saved, writerName)); + log.FatalFormat("StartInfoReader {0} crashed: {1}", writerName, exc.Message); + } + } + } + + /// /// Find purge suquences + /// TransitionSequence purgeBegin = null; TransitionSequence purgeEnd = null; foreach (var transition in StateMachine.TransitionSequences) @@ -518,9 +559,9 @@ namespace TBF.BenchControl.Sequences /// Always ask a question in case of a restored batch /// State.Create("MainSeq : Answer a question") - .AddOperation(new Operations.AskYesNoOp(Strings.Fill_with_water)) - .AddOperation(checkUiOp) - .EnterState(); + .AddOperation(new Operations.AskYesNoOp(Strings.Fill_with_water)) + .AddOperation(checkUiOp) + .EnterState(); do { e = StateMachine.WaitRunDevsRunOps(); @@ -544,7 +585,6 @@ namespace TBF.BenchControl.Sequences Program.MainWnd.Invoke(new iPerlCommFormDlgt(OpenIPerlCommForm), new object[] { this, simultWithPurgingCfg, simultWithPurgingTests, simultWithPurgingParams }); } - /// /// Purging @ cycle start /// @@ -561,34 +601,10 @@ namespace TBF.BenchControl.Sequences break; } - /// - /// Prepare reading start info from the DB @ cycle start - /// - State readingStartInfo = State.Create("MainSeq : Reading start info from DB"); - /// - string[] resultWriters = StateMachine.Procedure.ResultsWriter.Split(new char[] { '~' }); - foreach (var writerName in resultWriters) - { - IStartInfoReader infoReader = TbfComponents.FindComponent(writerName) as IStartInfoReader; - if (infoReader != null) - { - try - { - IOperation op = infoReader.ReadStartInfoOp(ProcessData.BatchRslts.WaterMeters); - if (op != null) readingStartInfo.AddOperation(op); - } - catch (Exception exc) - { - Bridge.OnError(this, string.Format(Strings.Component_0_crashed_Results_not_saved, writerName)); - log.FatalFormat("StartInfoReader {0} crashed: {1}", writerName, exc.Message); - } - } - } - /// /// Wait until iPerl communications or S/N data entry are completed /// - if ((simultWithPurgingCount > 0) || (readingStartInfo.Operations.Count > 0)) + if ((simultWithPurgingCount > 0) || (startInfoReadOps.Count > 0)) { /// Get 'bool completed' bool completed = !(modelessDlg is GenericDevices.IHasCompleted) || (modelessDlg as GenericDevices.IHasCompleted).Completed; @@ -618,38 +634,41 @@ namespace TBF.BenchControl.Sequences modelessDlg = null; } - /// - /// Read start info from the DB @ cycle start - /// - - if (readingStartInfo.Operations.Count > 0) + assume_bench_filled: + + benchFilled = true; + Bridge.Bench2UI(ButtonsEtc.ShowBenchFilled); + + if ((selection == Selection.Cycle) || (selection == Selection.RestoreBatch)) { - readingStartInfo.AddOperation(checkUiOp).EnterState(); - do + /// + /// Read start info from the DB @ cycle start + /// + if (startInfoReadOps.Count > 0) { - e = StateMachine.WaitRunDevsRunOps(); - if (e.Contains(Event.Error)) goto error; - if (e.Contains(Event.UiCmdStop)) goto stop; - } - while (e.Contains(Event.Busy)); + State.Create("MainSeq : Reading start info from DB") + .AddOperations(startInfoReadOps) + .AddOperation(checkUiOp).EnterState(); + do + { + e = StateMachine.WaitRunDevsRunOps(); + if (e.Contains(Event.Error)) goto error; + if (e.Contains(Event.UiCmdStop)) goto stop; + } + while (e.Contains(Event.Busy)); - if (e.Contains(Event.InfoNotRead)) - { - log.ErrorFormat("StartInfoReader failed to read data from the database"); - /// TODO: Message for an operator? Error? - } + if (e.Contains(Event.InfoNotRead)) + { + log.ErrorFormat("StartInfoReader failed to read data from the database"); + /// TODO: Message for an operator? Error? + } - /// Redraw on-screen results - Bridge.OnTestCompleted(this, new TestCompletedEventArgs(string.Empty, null)); + /// Redraw on-screen results + Bridge.OnTestCompleted(this, new TestCompletedEventArgs(string.Empty, null)); + } } - - assume_bench_filled: - - benchFilled = true; - Bridge.Bench2UI(ButtonsEtc.ShowBenchFilled); - - if (selection != Selection.PurgeBegin && selection != Selection.RestoreBatch) + if ((selection != Selection.PurgeBegin) && (selection != Selection.RestoreBatch)) { goto cycle_or_test_selected; } diff --git a/TBF/BenchControl/Sequences/SequenceBase.cs b/TBF/BenchControl/Sequences/SequenceBase.cs index 1bfcd254c..5a8cc6303 100644 --- a/TBF/BenchControl/Sequences/SequenceBase.cs +++ b/TBF/BenchControl/Sequences/SequenceBase.cs @@ -760,22 +760,23 @@ namespace TBF.BenchControl.Sequences /// /// Opens a modeless dialog for entering data at the beginning of a procedure (serial numbers) /// - /// false = OK, true = stop pressed + /// true = OK, false = stop pressed protected bool OpenCycleBeginForm() { - IList e; lastDataEntryCmpnt = TbfComponents.FindComponent(StateMachine.Procedure.DataEntry) as GenericDevices.IDataEntry; + if (lastDataEntryCmpnt is IHasCycleBeginForm) { Bridge.OnActivity(this, Strings.Enter_water_meter_data); State.Create("MainSeq : Enter begin data") - .AddPermanentOperation((lastDataEntryCmpnt as IHasCycleBeginForm).ShowCycleBeginFormOp()) - .AddOperation(checkUiOp) - .EnterState(); - e = StateMachine.WaitRunDevsRunOps(); - if (TestAndLogUiCmdStop(e)) return true; + .AddPermanentOperation((lastDataEntryCmpnt as IHasCycleBeginForm).ShowCycleBeginFormOp()) + .AddOperation(checkUiOp) + .EnterState(); + + if (TestAndLogUiCmdStop(StateMachine.WaitRunDevsRunOps())) return false; /// Return false when STOP pressed } - return false; + + return true; /// OK (=either a cycle beginning form is open or DataEntry component is not IHasCycleBeginForm) }