diff --git a/cake/BuildContext.cs b/cake/BuildContext.cs index 681468a8a..b2344ea02 100644 --- a/cake/BuildContext.cs +++ b/cake/BuildContext.cs @@ -148,7 +148,7 @@ public static void ApaxTest(this BuildContext context, (string folder, string na { context.ProcessRunner.Start(Helpers.GetApaxCommand(), new ProcessSettings() { - Arguments = "pack", + Arguments = "test", WorkingDirectory = context.GetAxFolder(lib), RedirectStandardOutput = false, RedirectStandardError = false, diff --git a/cake/Program.cs b/cake/Program.cs index 0c4da0293..00f9d5db5 100644 --- a/cake/Program.cs +++ b/cake/Program.cs @@ -93,32 +93,10 @@ private static void ProvisionTools(BuildContext context) [IsDependentOn(typeof(ProvisionTask))] public sealed class BuildTask : FrostingTask { - - private void UpdateApaxVersion(string file, string version) - { - var sb = new StringBuilder(); - foreach (var line in System.IO.File.ReadLines(file)) - { - var newLine = line; - - if (line.Trim().StartsWith("version")) - { - var semicPosition = line.IndexOf(":"); - var lenght = line.Length - semicPosition; - - newLine = $"{line.Substring(0, semicPosition)} : '{version}'"; - } - sb.AppendLine(newLine); - } - - System.IO.File.WriteAllText(file, sb.ToString()); - } - public override void Run(BuildContext context) { context.Libraries.ToList().ForEach(lib => { - UpdateApaxVersion(context.GetApaxFile(lib), GitVersionInformation.SemVer); context.ApaxInstall(lib); context.ApaxBuild(lib); }); @@ -153,6 +131,26 @@ public override void Run(BuildContext context) [IsDependentOn(typeof(TestsTask))] public sealed class CreateArtifactsTask : FrostingTask { + private void UpdateApaxVersion(string file, string version) + { + var sb = new StringBuilder(); + foreach (var line in System.IO.File.ReadLines(file)) + { + var newLine = line; + + if (line.Trim().StartsWith("version")) + { + var semicPosition = line.IndexOf(":"); + var lenght = line.Length - semicPosition; + + newLine = $"{line.Substring(0, semicPosition)} : '{version}'"; + } + sb.AppendLine(newLine); + } + + System.IO.File.WriteAllText(file, sb.ToString()); + } + public override void Run(BuildContext context) { if (!context.BuildParameters.DoPublish) @@ -161,7 +159,11 @@ public override void Run(BuildContext context) return; } - context.Libraries.ToList().ForEach(lib => context.ApaxPack(lib)); + context.Libraries.ToList().ForEach(lib => + { + UpdateApaxVersion(context.GetApaxFile(lib), GitVersionInformation.SemVer); + context.ApaxPack(lib); + }); PackPackages(context, Path.Combine(context.RootDir, "ix.framework-packable-only.slnf")); } diff --git a/src/core/ctrl/apax.yml b/src/core/ctrl/apax.yml index d7a65476e..028b9a221 100644 --- a/src/core/ctrl/apax.yml +++ b/src/core/ctrl/apax.yml @@ -1,5 +1,5 @@ name: "@ix-ax/ix.framework.core" -version: '0.1.0-alpha.3' +version : '0.1.0-updates-from-pku-org.1' type: lib targets: - "1500" diff --git a/src/core/ctrl/src/Coordination/Sequencer/Sequencer.st b/src/core/ctrl/src/Coordination/Sequencer/Sequencer.st index bc107c609..5a168764b 100644 --- a/src/core/ctrl/src/Coordination/Sequencer/Sequencer.st +++ b/src/core/ctrl/src/Coordination/Sequencer/Sequencer.st @@ -11,7 +11,8 @@ NAMESPACE ix.framework.core StepBackwardCommand : CommandTask; END_VAR VAR PRIVATE - _configurationFlowOrder : ULINT; + _configurationFlowOrder : ULINT; + _numberOfConfiguredSteps : ULINT; _coordinatorState : CoordinatorStates; _step : IStep; _steppingMode : eSteppingMode; @@ -27,12 +28,16 @@ NAMESPACE ix.framework.core /// METHOD PUBLIC Open IF SUPER.Execute() THEN - IF THIS.InvalidContext() THEN RETURN; END_IF; + IF THIS. InvalidContext() THEN RETURN; END_IF; _openCycleCounter := THIS.GetContext().OpenCycleCount(); CASE _coordinatorState OF CoordinatorStates#Idle : _configurationFlowOrder := ULINT#0; + _numberOfConfiguredSteps := ULINT#0; _coordinatorState := CoordinatorStates#Configuring; + StepForwardCommand.Initialize(THIS.GetContext()); + StepIn.Initialize(THIS.GetContext()); + StepBackwardCommand.Initialize(THIS.GetContext()); CoordinatorStates#Configuring : CurrentOrder := ULINT#1; _coordinatorState := CoordinatorStates#Running; @@ -40,65 +45,6 @@ NAMESPACE ix.framework.core END_IF; END_METHOD - /// - /// Completes (finishes) the execution of this sequencer. - /// Returns the `order of execution` pointer to the first step of the sequence. - /// - METHOD PUBLIC CompleteSequence - IF SUPER.Execute() THEN - IF THIS.InvalidContext(_step) THEN RETURN; END_IF; - IF _coordinatorState = CoordinatorStates#Running THEN - _step.DoneWhen(TRUE); - _coordinatorState := CoordinatorStates#Idle; - CurrentOrder := ULINT#1; - SUPER.DoneWhen(_sequenceMode =eSequenceMode#RunOnce); - // Finalize the StepIn Command in a case of step mode - StepIn.DoneWhen(_steppingMode = eSteppingMode#StepByStep); - END_IF; - END_IF; - END_METHOD - - /// - /// Moves the execution to the next step. - /// - METHOD PUBLIC MoveNext - IF SUPER.Execute() THEN - IF THIS.InvalidContext(_step) THEN RETURN; END_IF; - IF _coordinatorState = CoordinatorStates#Running THEN - _step.DoneWhen(TRUE); - CurrentOrder := CurrentOrder + ULINT#1; - // Finalize the StepIn Command in a case of step mode - StepIn.DoneWhen(_steppingMode = eSteppingMode#StepByStep); - END_IF; - END_IF; - END_METHOD - - /// - /// Gets the state of the coordinator - /// - METHOD PUBLIC GetCoordinatorState : CoordinatorStates - GetCoordinatorState := _coordinatorState; - END_METHOD - - /// - /// Terminates the currently executed step and initiates the RequestedStep to be executed - /// - METHOD PUBLIC RequestStep - VAR_INPUT - RequestedStep : IStep; - END_VAR - IF SUPER.Execute() THEN - IF THIS.InvalidContext(RequestedStep) THEN RETURN; END_IF; - IF RequestedStep.GetStepOrder() <> ULINT#0 AND - _coordinatorState = CoordinatorStates#Running THEN - _step.DoneWhen(TRUE); - CurrentOrder := RequestedStep.GetStepOrder(); - // Finalize the StepIn Command in a case of step mode - StepIn.DoneWhen(_steppingMode = eSteppingMode#StepByStep); - END_IF; - END_IF; - END_METHOD - /// /// Returns `TRUE` if the specified step is currently executing. /// @@ -114,7 +60,42 @@ NAMESPACE ix.framework.core _step := step; THIS.DetermineOrder(step); - + + // Stepping inside the sequence + IF _coordinatorState = CoordinatorStates#Running THEN + // Stepping is possible only in StepByStepMode + IF _steppingMode = eSteppingMode#StepByStep THEN + // Stepping Forwards and Backwards commands cannot be executed simultaneously + StepForwardCommand.IsDisabled := StepBackwardCommand.IsBusy() + // Stepping Forwards disabled from last step + OR CurrentOrder >= _numberOfConfiguredSteps; + StepIn.IsDisabled := FALSE; + StepBackwardCommand.IsDisabled := StepForwardCommand.IsBusy() + // Stepping Backwards disabled from first step + OR CurrentOrder <= ULINT#1; + // StepForward command increments the CurrentOrder just to a maximum value of _numberOfConfiguredSteps + IF StepForwardCommand.Execute() THEN + IF CurrentOrder < _numberOfConfiguredSteps THEN + THIS.RestoreCurrentStep(); + CurrentOrder := CurrentOrder + ULINT#1; + END_IF; + StepForwardCommand.DoneWhen(TRUE); + END_IF; + // StepBackward command decrements the CurrentOrder just to a minimum value of 1 + IF StepBackwardCommand.Execute() THEN + IF CurrentOrder > ULINT#1 THEN + THIS.RestoreCurrentStep(); + CurrentOrder := CurrentOrder - ULINT#1; + END_IF; + StepBackwardCommand.DoneWhen(TRUE); + END_IF; + ELSE + THIS.DisableAllSteppingComands(); + END_IF; + ELSE + THIS.DisableAllSteppingComands(); + END_IF; + IF _coordinatorState = CoordinatorStates#Running AND (CurrentOrder = step.GetStepOrder()) AND step.IsCalledJustOnceInThisPlcCycle() THEN IF Enable THEN step.SetIsActive(TRUE); @@ -146,8 +127,70 @@ NAMESPACE ix.framework.core Execute := step.Execute(); END_IF; - END_METHOD - + END_METHOD + + /// + /// Moves the execution to the next step. + /// + METHOD PUBLIC MoveNext + IF SUPER.Execute() THEN + IF THIS.InvalidContext(_step) THEN RETURN; END_IF; + IF _coordinatorState = CoordinatorStates#Running THEN + _step.DoneWhen(TRUE); + _step.SetIsActive(FALSE); + CurrentOrder := CurrentOrder + ULINT#1; + // Finalize the StepIn Command in a case of step mode + StepIn.DoneWhen(_steppingMode = eSteppingMode#StepByStep); + END_IF; + END_IF; + END_METHOD + + /// + /// Terminates the currently executed step and initiates the RequestedStep to be executed + /// + METHOD PUBLIC RequestStep + VAR_INPUT + RequestedStep : IStep; + END_VAR + IF SUPER.Execute() THEN + IF THIS.InvalidContext(RequestedStep) THEN RETURN; END_IF; + IF RequestedStep.GetStepOrder() <> ULINT#0 AND + _coordinatorState = CoordinatorStates#Running THEN + _step.DoneWhen(TRUE); + _step.SetIsActive(FALSE); + CurrentOrder := RequestedStep.GetStepOrder(); + // Finalize the StepIn Command in a case of step mode + StepIn.DoneWhen(_steppingMode = eSteppingMode#StepByStep); + END_IF; + END_IF; + END_METHOD + + /// + /// Completes (finishes) the execution of this sequencer. + /// Returns the `order of execution` pointer to the first step of the sequence. + /// + METHOD PUBLIC CompleteSequence + IF SUPER.Execute() THEN + IF THIS.InvalidContext(_step) THEN RETURN; END_IF; + IF _coordinatorState = CoordinatorStates#Running THEN + _step.DoneWhen(TRUE); + _step.SetIsActive(FALSE); + _coordinatorState := CoordinatorStates#Idle; + CurrentOrder := ULINT#1; + SUPER.DoneWhen(_sequenceMode =eSequenceMode#RunOnce); + // Finalize the StepIn Command in a case of step mode + StepIn.DoneWhen(_steppingMode = eSteppingMode#StepByStep); + END_IF; + END_IF; + END_METHOD + + /// + /// Gets the state of the coordinator + /// + METHOD PUBLIC GetCoordinatorState : CoordinatorStates + GetCoordinatorState := _coordinatorState; + END_METHOD + /// /// Sets the stepping mode of the sequencer /// @@ -191,6 +234,7 @@ NAMESPACE ix.framework.core step.Restore(); _step := step; _configurationFlowOrder := _configurationFlowOrder + ULINT#1; + _numberOfConfiguredSteps := _configurationFlowOrder; step.SetStepOrder(THIS,_configurationFlowOrder); IF NOT step.IsCalledJustOnceInThisPlcCycle() THEN @@ -202,6 +246,15 @@ NAMESPACE ix.framework.core DetermineOrder := step.GetStepOrder(); END_METHOD + METHOD PUBLIC GetNumberOfConfiguredSteps : ULINT + IF _coordinatorState = CoordinatorStates#Running THEN + _numberOfConfiguredSteps := _configurationFlowOrder; + GetNumberOfConfiguredSteps := _numberOfConfiguredSteps; + ELSE + GetNumberOfConfiguredSteps := ULINT#0; + END_IF; + END_METHOD + METHOD PROTECTED InvalidContext : BOOL IF THIS.GetContext() = NULL THEN InvalidContext := TRUE; // TODO: We will need to message this, when messaging ready. @@ -222,6 +275,24 @@ NAMESPACE ix.framework.core InvalidContext := FALSE; END_IF; END_METHOD + + METHOD INTERNAL DisableAllSteppingComands + StepForwardCommand.IsDisabled := TRUE; + StepIn.IsDisabled := TRUE; + StepBackwardCommand.IsDisabled := TRUE; + END_METHOD + + METHOD INTERNAL RestoreCurrentStep + // Restore current step if running + IF _step.IsBusy() THEN + _step.Restore(); + END_IF; + // Restore step in command if running, otherwise this commnad will be executed on the following step + IF StepIn.IsBusy() THEN + StepIn.Restore(); + END_IF; + _step.SetIsActive(FALSE); + END_METHOD END_CLASS END_NAMESPACE diff --git a/src/core/ctrl/src/Coordination/eSequencerStates.st b/src/core/ctrl/src/Coordination/eSequencerStates.st deleted file mode 100644 index 626864fad..000000000 --- a/src/core/ctrl/src/Coordination/eSequencerStates.st +++ /dev/null @@ -1,11 +0,0 @@ -NAMESPACE ix.framework.core - TYPE PUBLIC - eSequencerStates : INT - ( - Idle :=0, - RunningStepMode := 1, - RunningCycleMode := 2, - Error := 10 - ) := Idle; - END_TYPE -END_NAMESPACE \ No newline at end of file diff --git a/src/core/ctrl/test/Coordination/SequencerTests.st b/src/core/ctrl/test/Coordination/SequencerTests.st index b49d8bd4a..ae376265f 100644 --- a/src/core/ctrl/test/Coordination/SequencerTests.st +++ b/src/core/ctrl/test/Coordination/SequencerTests.st @@ -108,16 +108,33 @@ NAMESPACE ix.core.sequencer_tests _context.Close(); END_METHOD - METHOD PRIVATE ExecuteSequenceUpToStep_3 + METHOD PRIVATE ExecuteSequence + VAR_INPUT + CompleteStep : BOOL; + CompleteSequence : BOOL; + END_VAR + THIS.PrepareSequence(); _context.Open(); _sequencer.Open(); - _step_1.Execute(_sequencer); - _sequencer.MoveNext(); - _step_2.Execute(_sequencer); - _sequencer.MoveNext(); - _step_3.Execute(_sequencer); + + IF _step_1.Execute(_sequencer) THEN + IF CompleteStep THEN + _sequencer.MoveNext(); + END_IF; + END_IF; + IF _step_2.Execute(_sequencer) THEN + IF CompleteStep THEN + _sequencer.MoveNext(); + END_IF; + END_IF; + IF _step_3.Execute(_sequencer) THEN + IF CompleteSequence THEN + _sequencer.CompleteSequence(); + END_IF; + END_IF; + _context.Close(); END_METHOD {Test} @@ -605,7 +622,7 @@ NAMESPACE ix.core.sequencer_tests {Test} METHOD PUBLIC CompleteSequence_should_set_currently_executed_step_to_Done - THIS.ExecuteSequenceUpToStep_3(); + THIS.ExecuteSequence(TRUE,FALSE); Assert.Equal(FALSE, _step_3.IsDone()); _sequencer.CompleteSequence(); Assert.Equal(TRUE, _step_3.IsDone()); @@ -613,7 +630,7 @@ NAMESPACE ix.core.sequencer_tests {Test} METHOD PUBLIC CompleteSequence_should_reset_the_Busy_state_of_the_currently_executed_step - THIS.ExecuteSequenceUpToStep_3(); + THIS.ExecuteSequence(TRUE,FALSE); Assert.Equal(TRUE, _step_3.IsBusy()); _sequencer.CompleteSequence(); Assert.Equal(FALSE, _step_3.IsBusy()); @@ -621,21 +638,21 @@ NAMESPACE ix.core.sequencer_tests {Test} METHOD PUBLIC CompleteSequence_should_set_the_Current_Order_to_1 - THIS.ExecuteSequenceUpToStep_3(); + THIS.ExecuteSequence(TRUE,FALSE); _sequencer.CompleteSequence(); Assert.Equal(ULINT#1, _sequencer.CurrentOrder); END_METHOD {Test} METHOD PUBLIC CompleteSequence_should_set_the_coordinator_state_to_Idle - THIS.ExecuteSequenceUpToStep_3(); + THIS.ExecuteSequence(TRUE,FALSE); _sequencer.CompleteSequence(); Assert.Equal(TRUE, THIS.Equal(CoordinatorStates#Idle , _sequencer.GetCoordinatorState())); END_METHOD {Test} METHOD PUBLIC CompleteSequence_should_set_the_first_step_in_the_sequence_as_active_after_two_PLC_cycle - THIS.ExecuteSequenceUpToStep_3(); + THIS.ExecuteSequence(TRUE,FALSE); Assert.Equal(TRUE, _step_3.IsBusy()); _sequencer.CompleteSequence(); _context.Close(); @@ -763,7 +780,7 @@ NAMESPACE ix.core.sequencer_tests {Test} METHOD PUBLIC sequence_should_be_in_configuring_state_after_complete_sequence_and_all_steps_should_be_restored - THIS.ExecuteSequenceUpToStep_3(); + THIS.ExecuteSequence(TRUE,FALSE); _sequencer.CompleteSequence(); _context.Close(); @@ -842,7 +859,7 @@ NAMESPACE ix.core.sequencer_tests {Test} METHOD PUBLIC RunOnce_mode_CompleteSequence_should_set_currently_executed_step_to_Done - THIS.ExecuteSequenceUpToStep_3(); + THIS.ExecuteSequence(TRUE,FALSE); _sequencer.SetSequenceMode(eSequenceMode#RunOnce); Assert.Equal(FALSE, _step_3.IsDone()); _sequencer.CompleteSequence(); @@ -851,7 +868,7 @@ NAMESPACE ix.core.sequencer_tests {Test} METHOD PUBLIC RunOnce_mode_CompleteSequence_should_reset_the_Busy_state_of_the_currently_executed_step - THIS.ExecuteSequenceUpToStep_3(); + THIS.ExecuteSequence(TRUE,FALSE); _sequencer.SetSequenceMode(eSequenceMode#RunOnce); Assert.Equal(TRUE, _step_3.IsBusy()); _sequencer.CompleteSequence(); @@ -860,7 +877,7 @@ NAMESPACE ix.core.sequencer_tests {Test} METHOD PUBLIC RunOnce_mode_CompleteSequence_should_set_the_Current_Order_to_1 - THIS.ExecuteSequenceUpToStep_3(); + THIS.ExecuteSequence(TRUE,FALSE); _sequencer.SetSequenceMode(eSequenceMode#RunOnce); _sequencer.CompleteSequence(); Assert.Equal(ULINT#1, _sequencer.CurrentOrder); @@ -868,32 +885,25 @@ NAMESPACE ix.core.sequencer_tests {Test} METHOD PUBLIC RunOnce_mode_CompleteSequence_should_set_the_coordinator_state_to_Idle - THIS.ExecuteSequenceUpToStep_3(); + THIS.ExecuteSequence(TRUE,FALSE); _sequencer.SetSequenceMode(eSequenceMode#RunOnce); _sequencer.CompleteSequence(); Assert.Equal(TRUE, THIS.Equal(CoordinatorStates#Idle , _sequencer.GetCoordinatorState())); END_METHOD {Test} - METHOD PUBLIC RunOnce_mode_CompleteSequence_should_set_the_first_step_in_the_sequence_as_active_in_the_next_PLC_cycle - THIS.ExecuteSequenceUpToStep_3(); + METHOD PUBLIC RunOnce_mode_CompleteSequence_should_set_the_CurrentOrder_to_1 + THIS.ExecuteSequence(TRUE,FALSE); _sequencer.SetSequenceMode(eSequenceMode#RunOnce); _sequencer.CompleteSequence(); _context.Close(); - _context.Open(); - _sequencer.Open(); - - Assert.Equal(FALSE, _step_1.Execute(_sequencer)); - Assert.Equal(FALSE, _step_2.Execute(_sequencer)); - Assert.Equal(FALSE, _step_3.Execute(_sequencer)); - Assert.Equal(TRUE , _step_1.IsActive); - _context.Close(); + Assert.Equal(ULINT#1, _sequencer.CurrentOrder); END_METHOD {Test} METHOD PUBLIC RunOnce_mode_CompleteSequence_should_stops_the_execution_of_the_active_step_in_the_next_PLC_cycles - THIS.ExecuteSequenceUpToStep_3(); + THIS.ExecuteSequence(TRUE,FALSE); _sequencer.SetSequenceMode(eSequenceMode#RunOnce); _sequencer.CompleteSequence(); _context.Close(); @@ -915,7 +925,7 @@ NAMESPACE ix.core.sequencer_tests {Test} METHOD PUBLIC RunOnce_mode_CompleteSequence_coordinator_state_should_stay_in_Idle_in_the_next_PLC_cycles - THIS.ExecuteSequenceUpToStep_3(); + THIS.ExecuteSequence(TRUE,FALSE); _sequencer.SetSequenceMode(eSequenceMode#RunOnce); _sequencer.CompleteSequence(); _context.Close(); @@ -936,6 +946,539 @@ NAMESPACE ix.core.sequencer_tests Assert.Equal(TRUE, THIS.Equal(CoordinatorStates#Idle , _sequencer.GetCoordinatorState())); _context.Close(); END_METHOD + + {Test} + METHOD PUBLIC should_return_number_of_steps_in_our_case_three + THIS.ExecuteSequence(TRUE,FALSE); + Assert.Equal(ULINT#3, _sequencer.GetNumberOfConfiguredSteps()); + END_METHOD + + {Test} + METHOD PUBLIC all_stepping_commands_should_be_disabled_when_StepByStep_mode_is_not_running + THIS.ExecuteSequence(TRUE,FALSE); + Assert.Equal(TRUE,_sequencer.StepForwardCommand.IsDisabled); + Assert.Equal(TRUE,_sequencer.StepIn.IsDisabled); + Assert.Equal(TRUE,_sequencer.StepBackwardCommand.IsDisabled); + END_METHOD + + {Test} + METHOD PUBLIC all_stepping_commands_should_be_disabled_when_Sequencer_is_not_running_mode + _sequencer.SetSteppingMode(eSteppingMode#StepByStep); + Assert.Equal(TRUE ,THIS.Equal(_sequencer.GetSteppingMode(), eSteppingMode#StepByStep)); + THIS.PrepareSequence(); + Assert.Equal(TRUE, THIS.Equal(CoordinatorStates#Configuring , _sequencer.GetCoordinatorState())); + Assert.Equal(TRUE,_sequencer.StepForwardCommand.IsDisabled); + Assert.Equal(TRUE,_sequencer.StepIn.IsDisabled); + Assert.Equal(TRUE,_sequencer.StepBackwardCommand.IsDisabled); + END_METHOD + + {Test} + METHOD PUBLIC StepForward_and_StepIn_commands_should_not_be_disabled_when_Sequencer_is_running_mode + _sequencer.SetSteppingMode(eSteppingMode#StepByStep); + Assert.Equal(TRUE ,THIS.Equal(_sequencer.GetSteppingMode(), eSteppingMode#StepByStep)); + THIS.ExecuteSequence(TRUE,TRUE); + Assert.Equal(TRUE, THIS.Equal(CoordinatorStates#Running , _sequencer.GetCoordinatorState())); + Assert.Equal(FALSE,_sequencer.StepForwardCommand.IsDisabled); + Assert.Equal(FALSE,_sequencer.StepIn.IsDisabled); + END_METHOD + + {Test} + METHOD PUBLIC StepBackward_command_should_not_be_disabled_when_Sequencer_is_running_mode_and_CurrentOrder_is_greather_then_one + _sequencer.SetSteppingMode(eSteppingMode#StepByStep); + Assert.Equal(TRUE ,THIS.Equal(_sequencer.GetSteppingMode(), eSteppingMode#StepByStep)); + THIS.ExecuteSequence(TRUE,TRUE); + _sequencer.RequestStep(_step_2); + THIS.ExecuteSequence(TRUE,TRUE); + Assert.Equal(TRUE, THIS.Equal(CoordinatorStates#Running , _sequencer.GetCoordinatorState())); + Assert.Equal(FALSE,_sequencer.StepBackwardCommand.IsDisabled); + END_METHOD + + {Test} + METHOD PUBLIC StepInCommand_should_invoke_the_current_step + // Arrange + _sequencer.SetSteppingMode(eSteppingMode#StepByStep); + Assert.Equal(TRUE ,THIS.Equal(_sequencer.GetSteppingMode(), eSteppingMode#StepByStep)); + THIS.ExecuteSequence(FALSE,FALSE); + Assert.Equal(ULINT#1, _sequencer.CurrentOrder); + Assert.Equal(TRUE,_step_1.IsActive); + Assert.Equal(TRUE,_step_1.IsReady()); + Assert.Equal(FALSE,_step_1.IsBusy()); + Assert.Equal(FALSE,_step_1.IsDone()); + Assert.Equal(FALSE,_sequencer.StepIn.IsBusy()); + Assert.Equal(FALSE,_sequencer.StepIn.IsDone()); + + // Act + _sequencer.StepIn.Invoke(); + THIS.ExecuteSequence(FALSE,FALSE); + + // Assert + Assert.Equal(TRUE ,_step_1.IsActive); + Assert.Equal(FALSE,_step_1.IsReady()); + Assert.Equal(TRUE ,_step_1.IsBusy()); + Assert.Equal(FALSE,_step_1.IsDone()); + Assert.Equal(TRUE ,_sequencer.StepIn.IsBusy()); + Assert.Equal(FALSE,_sequencer.StepIn.IsDone()); + END_METHOD + + {Test} + METHOD PUBLIC StepInCommand_should_invoke_the_current_step_if_Current_step_is_Done_StepIn_should_be_also_Done + // Arrange + _sequencer.SetSteppingMode(eSteppingMode#StepByStep); + Assert.Equal(TRUE ,THIS.Equal(_sequencer.GetSteppingMode(), eSteppingMode#StepByStep)); + THIS.ExecuteSequence(TRUE,FALSE); + Assert.Equal(ULINT#1, _sequencer.CurrentOrder); + Assert.Equal(TRUE,_step_1.IsActive); + Assert.Equal(TRUE,_step_1.IsReady()); + Assert.Equal(FALSE,_step_1.IsBusy()); + Assert.Equal(FALSE,_step_1.IsDone()); + Assert.Equal(FALSE,_sequencer.StepIn.IsBusy()); + Assert.Equal(FALSE,_sequencer.StepIn.IsDone()); + + // Act + _sequencer.StepIn.Invoke(); + THIS.ExecuteSequence(TRUE,FALSE); + + // Assert + Assert.Equal(FALSE,_step_1.IsActive); + Assert.Equal(FALSE,_step_1.IsReady()); + Assert.Equal(FALSE,_step_1.IsBusy()); + Assert.Equal(TRUE ,_step_1.IsDone()); + Assert.Equal(FALSE,_sequencer.StepIn.IsBusy()); + Assert.Equal(TRUE ,_sequencer.StepIn.IsDone()); + END_METHOD + + {Test} + METHOD PUBLIC when_step_by_step_mode_is_switched_on_during_any_step_execution_this_step_should_continue_its_execution + // Arrange + THIS.ExecuteSequence(FALSE,FALSE); + Assert.Equal(ULINT#1, _sequencer.CurrentOrder); + Assert.Equal(TRUE ,_step_1.IsActive); + Assert.Equal(FALSE,_step_1.IsReady()); + Assert.Equal(TRUE ,_step_1.IsBusy()); + Assert.Equal(FALSE,_step_1.IsDone()); + + Assert.Equal(FALSE,_step_2.IsActive); + Assert.Equal(FALSE,_step_2.IsReady()); + Assert.Equal(FALSE,_step_2.IsBusy()); + Assert.Equal(FALSE,_step_2.IsDone()); + + // Act + _sequencer.SetSteppingMode(eSteppingMode#StepByStep); + Assert.Equal(TRUE ,THIS.Equal(_sequencer.GetSteppingMode(), eSteppingMode#StepByStep)); + THIS.ExecuteSequence(TRUE,FALSE); + + // Assert + Assert.Equal(FALSE,_step_1.IsActive); + Assert.Equal(FALSE,_step_1.IsReady()); + Assert.Equal(FALSE,_step_1.IsBusy()); + Assert.Equal(TRUE ,_step_1.IsDone()); + + Assert.Equal(TRUE ,_step_2.IsActive); + Assert.Equal(TRUE ,_step_2.IsReady()); + Assert.Equal(FALSE,_step_2.IsBusy()); + Assert.Equal(FALSE,_step_2.IsDone()); + END_METHOD + + {Test} + METHOD PUBLIC StepForward + VAR + _previousOrder : ULINT; + END_VAR + // Arrange + _sequencer.SetSteppingMode(eSteppingMode#StepByStep); + THIS.ExecuteSequence(FALSE,FALSE); + _sequencer.StepIn.Invoke(); + THIS.ExecuteSequence(FALSE,FALSE); + + Assert.Equal(TRUE ,_sequencer.StepForwardCommand.IsReady()); + Assert.Equal(FALSE,_sequencer.StepForwardCommand.IsBusy()); + Assert.Equal(FALSE,_sequencer.StepForwardCommand.IsDone()); + + Assert.Equal(FALSE,_sequencer.StepIn.IsReady()); + Assert.Equal(TRUE ,_sequencer.StepIn.IsBusy()); + Assert.Equal(FALSE,_sequencer.StepIn.IsDone()); + + Assert.Equal(TRUE ,_step_1.IsActive); + Assert.Equal(FALSE,_step_1.IsReady()); + Assert.Equal(TRUE ,_step_1.IsBusy()); + Assert.Equal(FALSE,_step_1.IsDone()); + + Assert.Equal(FALSE,_step_2.IsActive); + Assert.Equal(FALSE,_step_2.IsReady()); + Assert.Equal(FALSE,_step_2.IsBusy()); + Assert.Equal(FALSE,_step_2.IsDone()); + + _previousOrder := _sequencer.CurrentOrder; + + // Act + _context.Open(); + _sequencer.Open(); + _sequencer.StepForwardCommand.Invoke(); + Assert.Equal(FALSE,_sequencer.StepForwardCommand.IsReady()); + Assert.Equal(FALSE,_sequencer.StepForwardCommand.IsBusy()); + Assert.Equal(FALSE,_sequencer.StepForwardCommand.IsDone()); + _step_1.Execute(_sequencer); + Assert.Equal(FALSE,_sequencer.StepForwardCommand.IsReady()); + Assert.Equal(FALSE,_sequencer.StepForwardCommand.IsBusy()); + Assert.Equal(TRUE ,_sequencer.StepForwardCommand.IsDone()); + _step_2.Execute(_sequencer); + _step_3.Execute(_sequencer); + + // Assert + Assert.Equal(FALSE,_step_1.IsActive); + Assert.Equal(FALSE,_step_1.IsReady()); + Assert.Equal(FALSE,_step_1.IsBusy()); + Assert.Equal(FALSE,_step_1.IsDone()); + + Assert.Equal(TRUE ,_step_2.IsActive); + Assert.Equal(TRUE ,_step_2.IsReady()); + Assert.Equal(FALSE,_step_2.IsBusy()); + Assert.Equal(FALSE,_step_2.IsDone()); + + Assert.Equal(_previousOrder + ULINT#1 ,_sequencer.CurrentOrder); + END_METHOD + + {Test} + METHOD PUBLIC StepForward_should_restore_the_currently_executing_step + // Arrange + _sequencer.SetSteppingMode(eSteppingMode#StepByStep); + THIS.ExecuteSequence(FALSE,FALSE); + _sequencer.StepIn.Invoke(); + THIS.ExecuteSequence(FALSE,FALSE); + + Assert.Equal(TRUE ,_step_1.IsActive); + Assert.Equal(FALSE,_step_1.IsReady()); + Assert.Equal(TRUE ,_step_1.IsBusy()); + Assert.Equal(FALSE,_step_1.IsDone()); + + // Act + _context.Open(); + _sequencer.Open(); + _sequencer.StepForwardCommand.Invoke(); + _step_1.Execute(_sequencer); + _step_2.Execute(_sequencer); + _step_3.Execute(_sequencer); + _context.Close(); + + // Assert + Assert.Equal(FALSE,_step_1.IsActive); + Assert.Equal(FALSE,_step_1.IsReady()); + Assert.Equal(FALSE,_step_1.IsBusy()); + Assert.Equal(FALSE,_step_1.IsDone()); + END_METHOD + + {Test} + METHOD PUBLIC StepForward_should_prepare_following_step_to_be_ready_to_execute + // Arrange + _sequencer.SetSteppingMode(eSteppingMode#StepByStep); + THIS.ExecuteSequence(FALSE,FALSE); + _sequencer.StepIn.Invoke(); + THIS.ExecuteSequence(FALSE,FALSE); + + Assert.Equal(FALSE,_step_2.IsActive); + Assert.Equal(FALSE,_step_2.IsReady()); + Assert.Equal(FALSE,_step_2.IsBusy()); + Assert.Equal(FALSE,_step_2.IsDone()); + + // Act + _context.Open(); + _sequencer.Open(); + _sequencer.StepForwardCommand.Invoke(); + _step_1.Execute(_sequencer); + _step_2.Execute(_sequencer); + _step_3.Execute(_sequencer); + + // Assert + Assert.Equal(TRUE ,_step_2.IsActive); + Assert.Equal(TRUE ,_step_2.IsReady()); + Assert.Equal(FALSE,_step_2.IsBusy()); + Assert.Equal(FALSE,_step_2.IsDone()); + END_METHOD + + {Test} + METHOD PUBLIC StepForward_command_should_be_in_done_state_after_succesfull_execution + // Arrange + _sequencer.SetSteppingMode(eSteppingMode#StepByStep); + THIS.ExecuteSequence(FALSE,FALSE); + _sequencer.StepIn.Invoke(); + THIS.ExecuteSequence(FALSE,FALSE); + + Assert.Equal(TRUE ,_sequencer.StepForwardCommand.IsReady()); + Assert.Equal(FALSE,_sequencer.StepForwardCommand.IsBusy()); + Assert.Equal(FALSE,_sequencer.StepForwardCommand.IsDone()); + + // Act + _context.Open(); + _sequencer.Open(); + _sequencer.StepForwardCommand.Invoke(); + + //Assert + Assert.Equal(FALSE,_sequencer.StepForwardCommand.IsReady()); + Assert.Equal(FALSE,_sequencer.StepForwardCommand.IsBusy()); + Assert.Equal(FALSE,_sequencer.StepForwardCommand.IsDone()); + _step_1.Execute(_sequencer); + Assert.Equal(FALSE,_sequencer.StepForwardCommand.IsReady()); + Assert.Equal(FALSE,_sequencer.StepForwardCommand.IsBusy()); + Assert.Equal(TRUE ,_sequencer.StepForwardCommand.IsDone()); + END_METHOD + + {Test} + METHOD PUBLIC StepForward_command_should_increment_Current_order_if_its_value_is_lower_then_number_of_steps + VAR + _previousOrder : ULINT; + END_VAR + // Arrange + _sequencer.SetSteppingMode(eSteppingMode#StepByStep); + THIS.ExecuteSequence(FALSE,FALSE); + _sequencer.StepIn.Invoke(); + THIS.ExecuteSequence(FALSE,FALSE); + _previousOrder := _sequencer.CurrentOrder; + + // Act + _context.Open(); + _sequencer.Open(); + _sequencer.StepForwardCommand.Invoke(); + _step_1.Execute(_sequencer); + _step_2.Execute(_sequencer); + _step_3.Execute(_sequencer); + _context.Close(); + + //Assert + Assert.Equal(_previousOrder + ULINT#1,_sequencer.CurrentOrder); + END_METHOD + + {Test} + METHOD PUBLIC StepForward_command_should_not_increment_Current_order_if_its_value_is_equal_to_number_of_steps + VAR + _previousOrder : ULINT; + END_VAR + // Arrange + _sequencer.SetSteppingMode(eSteppingMode#StepByStep); + THIS.ExecuteSequence(FALSE,FALSE); + _sequencer.RequestStep(_step_3); + _sequencer.StepIn.Invoke(); + THIS.ExecuteSequence(FALSE,FALSE); + _previousOrder := _sequencer.CurrentOrder; + + // Act + _context.Open(); + _sequencer.Open(); + _sequencer.StepForwardCommand.Invoke(); + _step_1.Execute(_sequencer); + _step_2.Execute(_sequencer); + _step_3.Execute(_sequencer); + _context.Close(); + + //Assert + Assert.Equal(_previousOrder,_sequencer.CurrentOrder); + END_METHOD + + {Test} + METHOD PUBLIC StepForward_command_should_be_disabled_when_CurrentOrder_is_equal_to_last_step_order + _sequencer.SetSteppingMode(eSteppingMode#StepByStep); + THIS.ExecuteSequence(FALSE,FALSE); + _sequencer.RequestStep(_step_3); + THIS.ExecuteSequence(FALSE,FALSE); + + Assert.Equal(ULINT#3,_sequencer.CurrentOrder); + Assert.Equal(TRUE ,_sequencer.StepForwardCommand.IsDisabled); + Assert.Equal(FALSE,_sequencer.StepForwardCommand.IsReady()); + Assert.Equal(FALSE,_sequencer.StepForwardCommand.IsBusy()); + Assert.Equal(FALSE,_sequencer.StepForwardCommand.IsDone()); + END_METHOD + + {Test} + METHOD PUBLIC StepBackward + VAR + _previousOrder : ULINT; + END_VAR + // Arrange + _sequencer.SetSteppingMode(eSteppingMode#StepByStep); + THIS.ExecuteSequence(FALSE,FALSE); + _sequencer.RequestStep(_step_3); + _sequencer.StepIn.Invoke(); + THIS.ExecuteSequence(FALSE,FALSE); + + Assert.Equal(TRUE ,_sequencer.StepBackwardCommand.IsReady()); + Assert.Equal(FALSE,_sequencer.StepBackwardCommand.IsBusy()); + Assert.Equal(FALSE,_sequencer.StepBackwardCommand.IsDone()); + + Assert.Equal(FALSE,_sequencer.StepIn.IsReady()); + Assert.Equal(TRUE ,_sequencer.StepIn.IsBusy()); + Assert.Equal(FALSE,_sequencer.StepIn.IsDone()); + + Assert.Equal(TRUE ,_step_3.IsActive); + Assert.Equal(FALSE,_step_3.IsReady()); + Assert.Equal(TRUE ,_step_3.IsBusy()); + Assert.Equal(FALSE,_step_3.IsDone()); + + Assert.Equal(FALSE,_step_2.IsActive); + Assert.Equal(FALSE,_step_2.IsReady()); + Assert.Equal(FALSE,_step_2.IsBusy()); + Assert.Equal(FALSE,_step_2.IsDone()); + + _previousOrder := _sequencer.CurrentOrder; + + // Act + _context.Open(); + _sequencer.Open(); + _sequencer.StepBackwardCommand.Invoke(); + Assert.Equal(FALSE,_sequencer.StepBackwardCommand.IsReady()); + Assert.Equal(FALSE,_sequencer.StepBackwardCommand.IsBusy()); + Assert.Equal(FALSE,_sequencer.StepBackwardCommand.IsDone()); + _step_1.Execute(_sequencer); + Assert.Equal(FALSE,_sequencer.StepBackwardCommand.IsReady()); + Assert.Equal(FALSE,_sequencer.StepBackwardCommand.IsBusy()); + Assert.Equal(TRUE ,_sequencer.StepBackwardCommand.IsDone()); + _step_2.Execute(_sequencer); + _step_3.Execute(_sequencer); + + // Assert + Assert.Equal(FALSE,_step_3.IsActive); + Assert.Equal(FALSE,_step_3.IsReady()); + Assert.Equal(FALSE,_step_3.IsBusy()); + Assert.Equal(FALSE,_step_3.IsDone()); + + Assert.Equal(TRUE ,_step_2.IsActive); + Assert.Equal(TRUE ,_step_2.IsReady()); + Assert.Equal(FALSE,_step_2.IsBusy()); + Assert.Equal(FALSE,_step_2.IsDone()); + + Assert.Equal(_previousOrder - ULINT#1 ,_sequencer.CurrentOrder); + END_METHOD + + {Test} + METHOD PUBLIC StepBackward_should_restore_the_currently_executing_step + VAR + _previousOrder : ULINT; + END_VAR + // Arrange + _sequencer.SetSteppingMode(eSteppingMode#StepByStep); + THIS.ExecuteSequence(FALSE,FALSE); + _sequencer.RequestStep(_step_3); + _sequencer.StepIn.Invoke(); + THIS.ExecuteSequence(FALSE,FALSE); + + Assert.Equal(TRUE ,_step_3.IsActive); + Assert.Equal(FALSE,_step_3.IsReady()); + Assert.Equal(TRUE ,_step_3.IsBusy()); + Assert.Equal(FALSE,_step_3.IsDone()); + + // Act + _context.Open(); + _sequencer.Open(); + _sequencer.StepBackwardCommand.Invoke(); + _step_1.Execute(_sequencer); + _step_2.Execute(_sequencer); + _step_3.Execute(_sequencer); + + // Assert + Assert.Equal(FALSE,_step_3.IsActive); + Assert.Equal(FALSE,_step_3.IsReady()); + Assert.Equal(FALSE,_step_3.IsBusy()); + Assert.Equal(FALSE,_step_3.IsDone()); + END_METHOD + + {Test} + METHOD PUBLIC StepBackward_should_prepare_previous_step_to_be_ready_to_execute + VAR + _previousOrder : ULINT; + END_VAR + // Arrange + _sequencer.SetSteppingMode(eSteppingMode#StepByStep); + THIS.ExecuteSequence(FALSE,FALSE); + _sequencer.RequestStep(_step_3); + _sequencer.StepIn.Invoke(); + THIS.ExecuteSequence(FALSE,FALSE); + + Assert.Equal(FALSE,_step_2.IsActive); + Assert.Equal(FALSE,_step_2.IsReady()); + Assert.Equal(FALSE,_step_2.IsBusy()); + Assert.Equal(FALSE,_step_2.IsDone()); + + // Act + _context.Open(); + _sequencer.Open(); + _sequencer.StepBackwardCommand.Invoke(); + _step_1.Execute(_sequencer); + _step_2.Execute(_sequencer); + _step_3.Execute(_sequencer); + + // Assert + Assert.Equal(TRUE ,_step_2.IsActive); + Assert.Equal(TRUE ,_step_2.IsReady()); + Assert.Equal(FALSE,_step_2.IsBusy()); + Assert.Equal(FALSE,_step_2.IsDone()); + END_METHOD + + {Test} + METHOD PUBLIC StepBackward_command_should_be_in_done_state_after_succesfull_execution + VAR + _previousOrder : ULINT; + END_VAR + // Arrange + _sequencer.SetSteppingMode(eSteppingMode#StepByStep); + THIS.ExecuteSequence(FALSE,FALSE); + _sequencer.RequestStep(_step_3); + _sequencer.StepIn.Invoke(); + THIS.ExecuteSequence(FALSE,FALSE); + + Assert.Equal(TRUE ,_sequencer.StepBackwardCommand.IsReady()); + Assert.Equal(FALSE,_sequencer.StepBackwardCommand.IsBusy()); + Assert.Equal(FALSE,_sequencer.StepBackwardCommand.IsDone()); + + // Act + _context.Open(); + _sequencer.Open(); + _sequencer.StepBackwardCommand.Invoke(); + _step_1.Execute(_sequencer); + _step_2.Execute(_sequencer); + _step_3.Execute(_sequencer); + + // Assert + Assert.Equal(FALSE,_sequencer.StepBackwardCommand.IsReady()); + Assert.Equal(FALSE,_sequencer.StepBackwardCommand.IsBusy()); + Assert.Equal(TRUE ,_sequencer.StepBackwardCommand.IsDone()); + END_METHOD + + {Test} + METHOD PUBLIC StepBackward_command_should_decrement_Current_order_if_its_value_is_higher_then_one + VAR + _previousOrder : ULINT; + END_VAR + // Arrange + _sequencer.SetSteppingMode(eSteppingMode#StepByStep); + THIS.ExecuteSequence(FALSE,FALSE); + _sequencer.RequestStep(_step_3); + _sequencer.StepIn.Invoke(); + THIS.ExecuteSequence(FALSE,FALSE); + + _previousOrder := _sequencer.CurrentOrder; + + // Act + _context.Open(); + _sequencer.Open(); + _sequencer.StepBackwardCommand.Invoke(); + _step_1.Execute(_sequencer); + _step_2.Execute(_sequencer); + _step_3.Execute(_sequencer); + + // Assert + Assert.Equal(_previousOrder - ULINT#1 ,_sequencer.CurrentOrder); + END_METHOD + + {Test} + METHOD PUBLIC StepBackward_command_should_be_disabled_when_CurrentOrder_is_equal_to_last_step_order + _sequencer.SetSteppingMode(eSteppingMode#StepByStep); + THIS.ExecuteSequence(FALSE,FALSE); + + Assert.Equal(ULINT#1,_sequencer.CurrentOrder); + Assert.Equal(TRUE ,_sequencer.StepBackwardCommand.IsDisabled); + Assert.Equal(FALSE,_sequencer.StepBackwardCommand.IsReady()); + Assert.Equal(FALSE,_sequencer.StepBackwardCommand.IsBusy()); + Assert.Equal(FALSE,_sequencer.StepBackwardCommand.IsDone()); + END_METHOD + END_CLASS END_NAMESPACE diff --git a/src/workspace.ix.framework.code-workspace b/src/workspace.ix.framework.code-workspace new file mode 100644 index 000000000..a7eb14f23 --- /dev/null +++ b/src/workspace.ix.framework.code-workspace @@ -0,0 +1,13 @@ +{ + "folders": [ + { + "name": "integrations", + "path": "integrations\\ctrl" + }, + { + "name": "core", + "path": "core\\ctrl" + } + ], + "settings": {} +} \ No newline at end of file