Пример #1
0
        private void DisconnectFromDevice()
        {
            if (IsUserWantToSaveDeviceConfiguration())
            {
                OperationTask nextDisconnectTask = new OperationTask
                {
                    OperationToExecute = WorkerTasks.Disconnect,
                    OperationArgument  = null
                };
                OperationTask writeTask = new OperationTask
                {
                    OperationToExecute = WorkerTasks.Writing,
                    OperationArgument  = nextDisconnectTask
                };
                ChannelReady = false;
                _worker.RunWorkerAsync(writeTask);
                return;
            }

            ReaderSaver.DisconnectFromDevice();
            СonnectionStatus      = "Отключено";
            OperationStatus       = "";
            PortIsOpen            = false;
            IsConfigurationLoaded = false;
            _deviceSnapshotBefore = null;
        }
Пример #2
0
        private void worker_WorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            ChannelReady = true;
            if (e.Error != null)
            {
                OperationStatus = e.Error.Message;
            }
            else
            {
                if (((OperationResult)e.Result).OperationExecuted == WorkerTasks.Reading)
                {
                    if (((OperationResult)e.Result).OperationResultMessage.IndexOf("успешно") >= 0)
                    {
                        IsConfigurationLoaded = true;
                    }
                    Device.SlaveAddress = ReaderSaver.SlaveAddress;
                    //seialize loaded config for "is dirty" pattern
                    DeviceConfigurationChanged = false;

                    UpdateAllChildViewModelsProperties();
                }

                OperationStatus    = ((OperationResult)e.Result).OperationResultMessage;
                ProgressPercentage = 0;

                if (((OperationResult)e.Result).OperationExecuted == WorkerTasks.Writing)
                {
                    DeviceConfigurationChanged = false;
                    if (((OperationResult)e.Result).NextTask != null &&
                        ((OperationResult)e.Result).NextTask.OperationToExecute == WorkerTasks.Connect)
                    {
                        ConnectToDevice();
                        return;
                    }
                }

                if (((OperationResult)e.Result).NextTask != null)
                {
                    if (((OperationResult)e.Result).NextTask.OperationToExecute == WorkerTasks.Disconnect)
                    {
                        ReaderSaver.DisconnectFromDevice();
                        СonnectionStatus      = "Отключено";
                        OperationStatus       = "";
                        PortIsOpen            = false;
                        IsConfigurationLoaded = false;
                        _deviceSnapshotBefore = null;
                        return;
                    }
                    ChannelReady = false;
                    _worker.RunWorkerAsync(((OperationResult)e.Result).NextTask);
                }
            }
        }
Пример #3
0
        private void ConnectToDevice()
        {
            if (IsUserWantToSaveDeviceConfiguration())
            {
                OperationTask nextConnectTask = new OperationTask
                {
                    OperationToExecute = WorkerTasks.Connect,
                    OperationArgument  = null
                };
                OperationTask writeTask = new OperationTask
                {
                    OperationToExecute = WorkerTasks.Writing,
                    OperationArgument  = nextConnectTask
                };
                ChannelReady = false;
                _worker.RunWorkerAsync(writeTask);
                return;
            }
            try
            {
                OperationStatus = "Подключение...";
                ReaderSaver.ConnectToDevice(true);
            }
            catch (Exception exception)
            {
                MessageBox.Show("Ошибка подключения:" + exception.Message,
                                Constants.messageBoxTitle, MessageBoxButton.OK, MessageBoxImage.Exclamation);
                return;
            }

            /*OperationTask task = new OperationTask
             * {
             *  OperationToExecute = WorkerTasks.SetSlaveMode,
             *  OperationArgument = null
             * };*/
            OperationTask task = new OperationTask
            {
                OperationToExecute = WorkerTasks.Reading,
                OperationArgument  = null
            };

            ChannelReady = false;
            _worker.RunWorkerAsync(task);
        }
Пример #4
0
        private void ConnectOnPort()
        {
            SerialPortSettingsView serialPortSettingsView = new SerialPortSettingsView
            {
                Owner           = _parentWindow,
                DataContext     = _serialPortSettingsViewModel,
                MainStackPannel = { Background = _parentWindow.DefaultBackgroundBrush }
            };

            if (serialPortSettingsView.ShowDialog() == false)
            {
                return;
            }

            if (!_serialPortSettingsViewModel.IsConnected)
            {
                return;
            }

            ReaderSaver.Port = _serialPortSettingsViewModel.Port;

            try
            {
                if (!ReaderSaver.Port.IsOpen)
                {
                    ReaderSaver.Port.Open();
                }
            }
            catch (Exception exception)
            {
                MessageBox.Show("Ошибка подключения:" + exception.Message, Constants.messageBoxTitle,
                                MessageBoxButton.OK, MessageBoxImage.Exclamation);
                СonnectionStatus = "Отключено";
            }
            СonnectionStatus = "Подключено: " + ReaderSaver.GetConnectionParametersString();
            PortIsOpen       = true;
        }
Пример #5
0
        private void worker_DoWork_InteractWithDevice(object sender, DoWorkEventArgs e)
        {
            var worker = (BackgroundWorker)sender;

            var    operationResult = new OperationResult();
            string mainOperation   = "";
            string operation       = "";
            var    operationTask   = (OperationTask)e.Argument;

            switch (operationTask.OperationToExecute)
            {
            case WorkerTasks.Reading:
                mainOperation = "Операция чтения";
                break;

            case WorkerTasks.Writing:
                mainOperation = "Операция записи";
                break;

            case WorkerTasks.ExecutingCommand:
                mainOperation = "Выполнение команды";
                break;

                /*case WorkerTasks.SetSlaveMode:
                 *  mainOperation = "Перевод устройства в режим";
                 *  break;*/
            }
            if (operationTask.OperationToExecute == WorkerTasks.Reading ||
                operationTask.OperationToExecute == WorkerTasks.Writing /*||
                                                                         * operationTask.OperationToExecute == WorkerTasks.SetSlaveMode*/)
            {
                mainOperation  += " конфигурации";
                OperationStatus = mainOperation + "...";
            }
            else
            {
                OperationStatus = mainOperation + "...";
            }

            //always set SLAVE mode before any operation
            OperationStatus = operation + "Перевод устройства в режим конфигурирования...";
            PO3SlaveModeSetter setter = new PO3SlaveModeSetter(ReaderSaver.Port);

            while (true)
            {
                bool retVal = false;
                for (int i = 0; i < 3; i++)//3 attempts
                {
                    retVal = setter.SetSlaveMode();
                    if (retVal)
                    {
                        break;
                    }
                }

                if (!retVal)
                {
                    if (MessageBox.Show(
                            "Не удалось перевести устройство в режим конфигурирования!\r\nПовторить попытку?",
                            Constants.messageBoxTitle, MessageBoxButton.YesNo, MessageBoxImage.Question)
                        == MessageBoxResult.No)
                    {
                        operationResult.OperationResultMessage = "Готов";
                        operationResult.OperationExecuted      = operationTask.OperationToExecute;
                        e.Result = operationResult;
                        return;
                    }
                }
                else
                {
                    break;
                }
            }
            if (setter.DetectedSlaveAddress != 0)
            {
                ReaderSaver.SlaveAddress = setter.DetectedSlaveAddress;
            }

            /*if (operationTask.OperationToExecute == WorkerTasks.SetSlaveMode)
             * {
             *  PO3SlaveModeSetter setter = new PO3SlaveModeSetter(ReaderSaver.Port);
             *  while (true)
             *  {
             *      bool retVal = false;
             *      for (int i = 0; i < 3; i++)//3 attempts
             *      {
             *          retVal = setter.SetSlaveMode();
             *          if (retVal)
             *              break;
             *      }
             *
             *      if (!retVal)
             *      {
             *          if (MessageBox.Show(
             *              "Не удалось перевести устройство в режим конфигурирования!\r\nПовторить попытку?",
             *              Constants.messageBoxTitle, MessageBoxButton.YesNo, MessageBoxImage.Question)
             *              == MessageBoxResult.No)
             *          {
             *              operationResult.OperationResultMessage = "Готов";
             *              operationResult.OperationExecuted = operationTask.OperationToExecute;
             *              e.Result = operationResult;
             *              return;
             *          }
             *      }
             *      else
             *          break;
             *  }
             *  if (setter.DetectedSlaveAddress != 0)
             *      ReaderSaver.SlaveAddress = setter.DetectedSlaveAddress;
             *
             *  operationResult.OperationResultMessage = mainOperation + " - успешно";
             *  operationResult.OperationExecuted = operationTask.OperationToExecute;
             *  operationResult.NextTask = new OperationTask();
             *  operationResult.NextTask.OperationToExecute = WorkerTasks.Reading;
             *  operationResult.NextTask.OperationArgument = null;
             *  e.Result = operationResult;
             *  return;
             * }*/

            int    percentComplete;
            string returnedCode;

            if (operationTask.OperationToExecute == WorkerTasks.ExecutingCommand)
            {
                percentComplete = 50;
                returnedCode    = ReaderSaver.ExecuteDeviceCommand((DeviceControlCommands)operationTask.OperationArgument);

                worker.ReportProgress(percentComplete, null);
                if (returnedCode != "OK")
                {
                    operationResult.OperationResultMessage = mainOperation + " завершено с ошибкой: " + returnedCode;
                    operationResult.OperationExecuted      = operationTask.OperationToExecute;
                    e.Result = operationResult;
                    return;
                }

                if (((DeviceControlCommands)operationTask.OperationArgument) != DeviceControlCommands.SetMasterMode) //all commands except SetMasterMode
                {
                    //setting up MASTER mode after each operation
                    percentComplete = 100;
                    operation       = "Перевод устройства в режим MASTER";
                    OperationStatus = operation + "...";
                    int commandsCount = 0;
                    while (true)
                    {
                        returnedCode = ReaderSaver.ExecuteDeviceCommand(DeviceControlCommands.SetMasterMode);
                        worker.ReportProgress(percentComplete, null);

                        if (((DeviceControlCommands)operationTask.OperationArgument) != DeviceControlCommands.Test) //all commands except Test & SetMasterMode
                        {
                            if (returnedCode != "OK")
                            {
                                operationResult.OperationResultMessage = operation + " завершен с ошибкой: " + returnedCode;
                                operationResult.OperationExecuted      = operationTask.OperationToExecute;
                                e.Result = operationResult;
                                return;
                            }
                            break;
                        }
                        else//Test command
                        {
                            if (returnedCode == "OK")
                            {
                                break;
                            }

                            commandsCount++;
                            if (commandsCount > 13)
                            {
                                if (MessageBox.Show(
                                        "Не удалось перевести устройство в режим MASTER!\r\nПовторить попытку?",
                                        Constants.messageBoxTitle, MessageBoxButton.YesNo, MessageBoxImage.Question)
                                    == MessageBoxResult.No)
                                {
                                    operationResult.OperationResultMessage = operation + " завершен с ошибкой: " + returnedCode;
                                    operationResult.OperationExecuted      = operationTask.OperationToExecute;
                                    e.Result = operationResult;
                                    return;
                                }
                                commandsCount = 0;
                                continue;
                            }
                            Thread.Sleep(1000);
                        }
                    }
                }
            }
            if (operationTask.OperationToExecute == WorkerTasks.Reading ||
                operationTask.OperationToExecute == WorkerTasks.Writing)
            {
                if (operationTask.OperationToExecute == WorkerTasks.Writing)//reset PO-3 before writing config
                {
                    percentComplete = 1 * 100 / (Device.PO3DeviceAsUnits.Count + 2);

                    operation       = "Cброс перед записью конфигурации";
                    OperationStatus = operation + "...";
                    returnedCode    = ReaderSaver.ExecuteDeviceCommand(DeviceControlCommands.Reset);
                    worker.ReportProgress(percentComplete, null);
                    if (returnedCode != "OK")
                    {
                        operationResult.OperationResultMessage = operation + " завершен с ошибкой: " + returnedCode;
                        operationResult.OperationExecuted      = operationTask.OperationToExecute;
                        e.Result = operationResult;
                        return;
                    }
                    Thread.Sleep(1500);
                }

                OperationStatus = mainOperation + "...";
                int step = 0;
                foreach (var unit in Device.PO3DeviceAsUnits)
                {
                    if (worker.CancellationPending)
                    {
                        e.Cancel = true;
                        break;
                    }
                    step++;
                    percentComplete = (step * 100 / (Device.PO3DeviceAsUnits.Count + 2));

                    returnedCode = (operationTask.OperationToExecute == WorkerTasks.Reading)
                        ? ReaderSaver.ReadUnitData(unit)
                        : ReaderSaver.WriteUnitData(unit);

                    worker.ReportProgress(percentComplete, null);

                    if (returnedCode != "OK")
                    {
                        operationResult.OperationResultMessage = mainOperation + " завершена с ошибкой: " + returnedCode;
                        operationResult.OperationExecuted      = operationTask.OperationToExecute;
                        e.Result = operationResult;
                        return;
                    }
                }

                /*if (operationTask.OperationToExecute == WorkerTasks.Writing)//reset PO-3 after writing config - уже не надо
                 * {
                 *  percentComplete = 100;
                 *  operation = "Cброс после записи конфигурации";
                 *  OperationStatus = operation + "...";
                 *
                 *  returnedCode = ReaderSaver.ExecuteDeviceCommand(DeviceControlCommands.Reset);
                 *
                 *  Thread.Sleep(1500);
                 *
                 *  worker.ReportProgress(percentComplete, null);
                 *  if (returnedCode != "OK")
                 *  {
                 *      operationResult.OperationResultMessage = operation + " завершен с ошибкой: " + returnedCode;
                 *      operationResult.OperationExecuted = operationTask.OperationToExecute;
                 *      e.Result = operationResult;
                 *      return;
                 *  }
                 * }*/

                //setting up MASTER mode after each operation
                percentComplete = 100;
                operation       = "Перевод устройства в режим MASTER";
                OperationStatus = operation + "...";
                returnedCode    = ReaderSaver.ExecuteDeviceCommand(DeviceControlCommands.SetMasterMode);
                worker.ReportProgress(percentComplete, null);
                if (returnedCode != "OK")
                {
                    operationResult.OperationResultMessage = operation + " завершен с ошибкой: " + returnedCode;
                    operationResult.OperationExecuted      = operationTask.OperationToExecute;
                    e.Result = operationResult;
                    return;
                }

                if (operationTask.OperationToExecute == WorkerTasks.Writing)//reconnect with new PO3DeviceUnitCommunicationSettings
                {
                    СonnectionStatus = "Переподключение...";
                    ReaderSaver.Port.Close();
                    PortIsOpen = false;

                    try
                    {
                        switch (Device.DeviceUnitCommunicationSettings.DeviceBaudRate)
                        {
                        case 0:
                            ReaderSaver.Port.BaudRate = 2400;
                            break;

                        case 1:
                            ReaderSaver.Port.BaudRate = 4800;
                            break;

                        case 2:
                            ReaderSaver.Port.BaudRate = 9600;
                            break;

                        case 3:
                            ReaderSaver.Port.BaudRate = 14400;
                            break;

                        case 4:
                            ReaderSaver.Port.BaudRate = 19200;
                            break;
                        }
                        switch (Device.DeviceUnitCommunicationSettings.DeviceParity)
                        {
                        case 0:
                            ReaderSaver.Port.Parity = Parity.None;
                            break;

                        case 2:
                            ReaderSaver.Port.Parity = Parity.Odd;
                            break;

                        case 3:
                            ReaderSaver.Port.Parity = Parity.Even;
                            break;
                        }
                        switch (Device.DeviceUnitCommunicationSettings.DeviceStopBits)
                        {
                        case 0:
                            ReaderSaver.Port.StopBits = StopBits.One;
                            break;

                        case 1:
                            ReaderSaver.Port.StopBits = StopBits.Two;
                            break;
                        }
                        ReaderSaver.SlaveAddress = (byte)Device.DeviceUnitCommunicationSettings.DeviceAddress;
                        ReaderSaver.ConnectToDevice(true);
                    }
                    catch (Exception exception)
                    {
                        MessageBox.Show("Ошибка подключения:" + exception.Message, Constants.messageBoxTitle,
                                        MessageBoxButton.OK, MessageBoxImage.Exclamation);
                        СonnectionStatus = "Отключено";
                    }
                    СonnectionStatus = "Подключено: " + ReaderSaver.GetConnectionParametersString();
                    PortIsOpen       = true;
                }

                if (operationTask.OperationArgument != null &&
                    operationTask.OperationToExecute == WorkerTasks.Writing)
                {
                    operationResult.NextTask = (OperationTask)(operationTask.OperationArgument);
                }
            }
            operationResult.OperationResultMessage = mainOperation + " - успешно";
            operationResult.OperationExecuted      = operationTask.OperationToExecute;
            e.Result = operationResult;
        }