public static void Main()
        {
            var signal = new Signal() { Name = "A1" };
            var signal2 = new Signal() { Name = "A2" };
            var signalist = new List<Signal>();
            signalist.Add(signal);
            signalist.Add(signal2);

            var statement = new LogialAnalyzerTrigger.Statement.RisingEdge(signal, 0.5);
            var triggerStateForkedStatement = new TriggerForkedState(statement);
            triggerStateForkedStatement.AddTriggerStateThenOperations(TriggerStateThenOperations.StartTimer);
            triggerStateForkedStatement.AddTriggerStateThenOperations(TriggerStateThenOperations.GotoNextState);
            var triggerstate = new TriggerState();
            triggerstate.AddTriggerStateForkedStatement(triggerStateForkedStatement);

            var statement2 = new LogialAnalyzerTrigger.Statement.RisingEdge(signal2, 0.5);
            var statement3 = new LogialAnalyzerTrigger.Statement.StatementTimeLessThen(600);
            var statement4 = new LogialAnalyzerTrigger.Statement.StatementCollection();
            statement4.AddStatement(statement2, LogialAnalyzerTrigger.Statement.LogicalOperators.First);
            statement4.AddStatement(statement3, LogialAnalyzerTrigger.Statement.LogicalOperators.And);
            var statement5 = new LogialAnalyzerTrigger.Statement.StatementTimeLargerThen(600);
            var foredstatement2 = new TriggerForkedState(statement4);
            foredstatement2.AddTriggerStateThenOperations(TriggerStateThenOperations.Trigger);
            var forkedStatemetn3 = new TriggerForkedState(statement5);
            forkedStatemetn3.AddTriggerStateThenOperations(TriggerStateThenOperations.GotoFirsState);
            var triggerstate2 = new TriggerState();
            triggerstate2.AddTriggerStateForkedStatement(foredstatement2);
            triggerstate2.AddTriggerStateForkedStatement(forkedStatemetn3);

            var trigger = new Trigger() {Name = "Test Trigger" };
            trigger.AddTriggerState(triggerstate);
            trigger.AddTriggerState(triggerstate2);

            var engine = new TriggerEngine();
            engine.AddTrigger(trigger);

            Thread thread = new Thread(() => engine.ShowConfigDialog(signalist));
            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();
            thread.Join();
        }
        public void TestTimeStatement3()
        {
            /*State1:
             * IF: Signal1 == 0
             * Then: 1. StartTimer 2.GotoNext
             *
             * State2:
             * If: Signal2 == 2 && Timer < 500ms
             * Then: Trigger
             * ElseIf: Timer > 500ms
             * Then: GotoFirst
             */
            _test.Reset();

            var signal = new Signal()
            {
                Name = "A1"
            };
            var signal2 = new Signal()
            {
                Name = "A2"
            };

            var statement = new LogialAnalyzerTrigger.Statement.Equals(signal, 0);
            var triggerStateForkedStatement = new TriggerStateForkedState(statement);

            triggerStateForkedStatement.AddTriggerStateThenOperations(TriggerStateThenOperations.StartTimer);
            triggerStateForkedStatement.AddTriggerStateThenOperations(TriggerStateThenOperations.GotoNextState);
            var triggerstate = new TriggerState();

            triggerstate.AddTriggerStateForkedStatement(triggerStateForkedStatement);

            var statement2 = new LogialAnalyzerTrigger.Statement.Equals(signal2, 2);
            var statement3 = new LogialAnalyzerTrigger.Statement.StatementTimeLessThen(500);
            var statement4 = new LogialAnalyzerTrigger.Statement.StatementCollection();

            statement4.AddStatement(statement2, LogialAnalyzerTrigger.Statement.LogicalOperators.First);
            statement4.AddStatement(statement3, LogialAnalyzerTrigger.Statement.LogicalOperators.And);
            var statement5      = new LogialAnalyzerTrigger.Statement.StatementTimeLargerThen(500);
            var foredstatement2 = new TriggerStateForkedState(statement4);

            foredstatement2.AddTriggerStateThenOperations(TriggerStateThenOperations.Trigger);
            var forkedStatemetn3 = new TriggerStateForkedState(statement5);

            forkedStatemetn3.AddTriggerStateThenOperations(TriggerStateThenOperations.GotoFirsState);
            var triggerstate2 = new TriggerState();

            triggerstate2.AddTriggerStateForkedStatement(foredstatement2);
            triggerstate2.AddTriggerStateForkedStatement(forkedStatemetn3);

            var trigger = new Trigger();

            trigger.AddTriggerState(triggerstate);
            trigger.AddTriggerState(triggerstate2);


            var engine = new TriggerEngine();

            engine.AddTrigger(trigger);
            engine.TriggeredUnitTest += engine_Triggered;

            //The time the first signal changes
            var firstSignalTimestamp = DateTime.Now.Ticks;

            // The trigger will jump to state two!
            engine.LogValueChange(signal, 0, firstSignalTimestamp);
            Assert.IsFalse(_test.WaitOne(10));

            // Signal 2 will change 600 ms after signal1
            engine.LogValueChange(signal2, 1, firstSignalTimestamp + 200);
            Assert.IsFalse(_test.WaitOne(10));
            engine.LogValueChange(signal2, 2, firstSignalTimestamp + 600);
            Assert.IsFalse(_test.WaitOne(10));

            // The trigger will jump back to state1 since the time excseeded 500ms
            engine.LogValueChange(signal, 2, firstSignalTimestamp);
            Assert.IsFalse(_test.WaitOne(10));

            //New time for the signal1 signalchange
            firstSignalTimestamp = DateTime.Now.Ticks;
            engine.LogValueChange(signal, 1, firstSignalTimestamp);
            Assert.IsFalse(_test.WaitOne(10));

            //New time for the signal1 signalchange //Will Jump to state2
            firstSignalTimestamp = DateTime.Now.Ticks;
            engine.LogValueChange(signal, 0, firstSignalTimestamp);
            Assert.IsFalse(_test.WaitOne(10));

            // Signal 2 will change 200 ms after signal1
            engine.LogValueChange(signal2, 2, firstSignalTimestamp + 400);

            Assert.IsTrue(_test.WaitOne(10));
        }
        public static void Main()
        {
            var signal = new Signal()
            {
                Name = "A1"
            };
            var signal2 = new Signal()
            {
                Name = "A2"
            };
            var signalist = new List <Signal>();

            signalist.Add(signal);
            signalist.Add(signal2);


            var statement = new LogialAnalyzerTrigger.Statement.RisingEdge(signal, 0.5);
            var triggerStateForkedStatement = new TriggerForkedState(statement);

            triggerStateForkedStatement.AddTriggerStateThenOperations(TriggerStateThenOperations.StartTimer);
            triggerStateForkedStatement.AddTriggerStateThenOperations(TriggerStateThenOperations.GotoNextState);
            var triggerstate = new TriggerState();

            triggerstate.AddTriggerStateForkedStatement(triggerStateForkedStatement);

            var statement2 = new LogialAnalyzerTrigger.Statement.RisingEdge(signal2, 0.5);
            var statement3 = new LogialAnalyzerTrigger.Statement.StatementTimeLessThen(600);
            var statement4 = new LogialAnalyzerTrigger.Statement.StatementCollection();

            statement4.AddStatement(statement2, LogialAnalyzerTrigger.Statement.LogicalOperators.First);
            statement4.AddStatement(statement3, LogialAnalyzerTrigger.Statement.LogicalOperators.And);
            var statement5      = new LogialAnalyzerTrigger.Statement.StatementTimeLargerThen(600);
            var foredstatement2 = new TriggerForkedState(statement4);

            foredstatement2.AddTriggerStateThenOperations(TriggerStateThenOperations.Trigger);
            var forkedStatemetn3 = new TriggerForkedState(statement5);

            forkedStatemetn3.AddTriggerStateThenOperations(TriggerStateThenOperations.GotoFirsState);
            var triggerstate2 = new TriggerState();

            triggerstate2.AddTriggerStateForkedStatement(foredstatement2);
            triggerstate2.AddTriggerStateForkedStatement(forkedStatemetn3);


            var trigger = new Trigger()
            {
                Name = "Test Trigger"
            };

            trigger.AddTriggerState(triggerstate);
            trigger.AddTriggerState(triggerstate2);

            var engine = new TriggerEngine();

            engine.AddTrigger(trigger);

            Thread thread = new Thread(() => engine.ShowConfigDialog(signalist));

            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();
            thread.Join();
        }