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; }
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); } } }
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); }
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; }
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; }