public void ProcessSpecificMessage(ISpecificMessage message) { using (var listener = new MessageListener(_protocol)) { _protocol.SendMessage(message); while (true) { if (!listener.WaitMessage(_dispatcher.RequestTimeout, out IMessage receivedMessage)) { throw new DeviceNotRespondException("Device Not responding"); } if (receivedMessage.Type != MessageType.Response) { continue; } // All high priority messages should be handled in separate thread. if (receivedMessage is HighPriorityMessage) { continue; } if (receivedMessage.SlaveDeviceAddress != _slaveDevice.Address) { _dispatcher.OnUnexpectedDeviceResponse(_slaveDevice, receivedMessage.SlaveDeviceAddress); continue; } if (receivedMessage is IErrorMessage errorMessage) { ProcessErrorMessage(errorMessage); } if (!(receivedMessage is ISpecificMessage response)) { throw new InvalidMetaDataException("Wrong response received"); } _slaveDevice.OnSpecificMessageReceived(response); break; } } }
public void ProcessNextMessage() { using (var listener = new MessageListener(_protocol)) { IRegisterMessage message = _registersUpdatePolicy.GetNextMessage(_slaveDevice); if (message is EmptyMessage) { _log.AppendMessage(LogMessageType.Info, $"Nothing to process. Skip {_slaveDevice.Name}"); return; } _log.AppendMessage(LogMessageType.Info, $"Sending {message.OperationType}-register message"); _protocol.SendAsPossible(message, out IReadOnlyCollection <IRegisterGroup> requestRegisters); _log.AppendMessage(LogMessageType.Info, $"Register groups with addresses {requestRegisters.GetAllAddressesAsString()} was requested"); while (true) { if (!listener.WaitMessage(_dispatcher.RequestTimeout, out IMessage receivedMessage)) { throw new DeviceNotRespondException("Device Not responding"); } if (receivedMessage.Type != MessageType.Response) { continue; } // All high priority messages should be handled in separate thread. if (receivedMessage is HighPriorityMessage) { continue; } if (receivedMessage.SlaveDeviceAddress != _slaveDevice.Address) { _dispatcher.OnUnexpectedDeviceResponse(_slaveDevice, receivedMessage.SlaveDeviceAddress); continue; } if (receivedMessage is IErrorMessage errorMessage) { ProcessErrorMessage(errorMessage); } if (!(receivedMessage is IReceivedMessage response)) { throw new InvalidMetaDataException("Wrong response received"); } _log.AppendMessage(LogMessageType.Info, "Response received, updating registers"); UpdateRegisters(requestRegisters, response.Registers, response.OperationType); _log.AppendMessage(LogMessageType.Info, "Registers updated"); break; } } }