/// <summary>
        /// The progress changed handler for the background worker
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void bwTx_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            Dictionary <int, CSentMessageViewModel> dicMainCurrentSendetMessages = (Dictionary <int, CSentMessageViewModel>)e.UserState;

            SolutionCurrentTime = (int)e.ProgressPercentage;
            foreach (KeyValuePair <int, CSentMessageViewModel> msg in dicMainCurrentSendetMessages)
            {
                if ((SolutionCurrentTime == msg.Value.StartTime) || (SolutionCurrentTime == msg.Value.StopTime))
                {
                    CurrentSendetMessages.Add(new CSentMessageViewModel(msg.Value.Message, msg.Value.StartTime, msg.Value.StopTime));
                }
            }
        }
        /// <summary>
        /// The trigger command for the sequence, which is processed asynchronous
        /// </summary>
        void StartExecute()
        {
            CurrentSendetMessages.Clear();
            bwTx.WorkerReportsProgress      = true;
            bwTx.WorkerSupportsCancellation = true;
            bwTx.DoWork += delegate(object s, DoWorkEventArgs args)
            {
                CSequenceViewModel sequence = (CSequenceViewModel)args.Argument;
                Dictionary <int, CSentMessageViewModel> dicCurrentSendetMessages = new Dictionary <int, CSentMessageViewModel>();
                XLClass.xl_can_message      xlMsg             = new XLClass.xl_can_message();
                XLClass.xl_event_collection xlEventCollection = new XLClass.xl_event_collection(0);
                XLClass.xl_event            xlEvent;
                int time;
                time = 0;
                xlStartCan(ref _iEventHandleTx, ref _iPortHandleTx, ref _ui64TransmitMaskTx);

                while (true)
                {
                    if (bwTx.CancellationPending)
                    {
                        _xlDriverTx.XL_ClosePort(_iPortHandleTx);
                        _xlDriverTx.XL_CloseDriver();
                        args.Cancel = true;
                        break;
                    }
                    else
                    {
                        foreach (CStepViewModel step in sequence.Steps)
                        {
                            if (time == step.StepTime)
                            {
                                switch (step.StepCommand)
                                {
                                case "Set":
                                {
                                    if (!dicCurrentSendetMessages.ContainsKey(step.StepMessage.MessageId))
                                    {
                                        dicCurrentSendetMessages.Add(step.StepMessage.MessageId, new CSentMessageViewModel(step));
                                    }
                                    dicCurrentSendetMessages[step.StepMessage.MessageId].Message.MessageData = getMessageValue(step.StepMessage.MessageData, step.StepValue, step.StepSignal.SignalStartBit, step.StepSignal.SignalLenght);
                                    dicCurrentSendetMessages[step.StepMessage.MessageId].StartTime           = Convert.ToInt32(time);
                                    dicCurrentSendetMessages[step.StepMessage.MessageId].StopTime            = Int32.MaxValue;
                                    break;
                                }

                                case "Set with ASR":
                                {
                                    break;
                                }

                                case "Step 500ms":
                                {
                                    if (!dicCurrentSendetMessages.ContainsKey(step.StepMessage.MessageId))
                                    {
                                        dicCurrentSendetMessages.Add(step.StepMessage.MessageId, new CSentMessageViewModel(step));
                                    }
                                    dicCurrentSendetMessages[step.StepMessage.MessageId].Message.MessageData = getMessageValue(step.StepMessage.MessageData, step.StepValue, step.StepSignal.SignalStartBit, step.StepSignal.SignalLenght);
                                    dicCurrentSendetMessages[step.StepMessage.MessageId].StartTime           = time;
                                    dicCurrentSendetMessages[step.StepMessage.MessageId].StopTime            = time + 500;
                                    break;
                                }

                                case "Timeout":
                                {
                                    if (dicCurrentSendetMessages.ContainsKey(step.StepMessage.MessageId))
                                    {
                                        dicCurrentSendetMessages.Remove(step.StepMessage.MessageId);
                                    }
                                    break;
                                }

                                case "Break":
                                {
                                    if (MessageBox.Show(string.Format("Breaked sequence {0}, do you want to continue?", this.SolutionCurrentSequence.SequenceName), "Break", MessageBoxButton.YesNo, MessageBoxImage.Hand) != MessageBoxResult.Yes)
                                    {
                                        return;
                                    }
                                    break;
                                }

                                case "Restart":
                                {
                                    //RestartExecute();
                                    break;
                                }

                                default:
                                {
                                    break;
                                }
                                }
                            }
                        }
                        foreach (KeyValuePair <int, CSentMessageViewModel> msg in dicCurrentSendetMessages)
                        {
                            if (msg.Value.StopTime == time)
                            {
                                msg.Value.Message.MessageData = getMessageValue(msg.Value.Message.MessageData, 0, msg.Value.Signal.SignalStartBit, msg.Value.Signal.SignalLenght);
                            }
                        }
                        xlEventCollection.xlEvent.Clear();
                        foreach (KeyValuePair <int, CSentMessageViewModel> msg in dicCurrentSendetMessages)
                        {
                            xlEvent = new XLClass.xl_event();
                            xlEvent.tagData.can_Msg.id   = (uint)msg.Value.Message.MessageId;
                            xlEvent.tagData.can_Msg.dlc  = (ushort)msg.Value.Message.MessageDlc;
                            xlEvent.tagData.can_Msg.data = msg.Value.Message.MessageData;
                            xlEvent.tag = (byte)XLClass.XLeventType.XL_TRANSMIT_MSG;
                            xlEventCollection.xlEvent.Add(xlEvent);
                        }
                        xlEventCollection.messageCount = (uint)xlEventCollection.xlEvent.Count;
                        if (xlEventCollection.messageCount > 0)
                        {
                            _xlDriverTx.XL_CanTransmit(_iPortHandleTx, _ui64TransmitMaskTx, xlEventCollection);
                        }
                    }
                    bwTx.ReportProgress(time++, dicCurrentSendetMessages);
                    Thread.Sleep(1);
                }
            };
            bwTx.ProgressChanged += bwTx_ProgressChanged;
            CurrentSendetMessages.Clear();
            bwTx.RunWorkerAsync(this._currentSequenceViewModel);
        }