Example #1
0
        private void SendNextMessage(NandakaDevice device)
        {
            MasterSession session = _deviceSessions[device.Address];

            ISpecificMessage specificMessage = default;

            try
            {
                if (device.TryGetSpecific(out specificMessage))
                {
                    session.ProcessSpecificMessage(specificMessage);
                }
                else
                {
                    session.ProcessNextMessage();
                }

                _dispatcher.OnMessageReceived(device);
            }
            catch (DeviceNotRespondException deviceNotRespondException)
            {
                _log.AppendMessage(LogMessageType.Warning, deviceNotRespondException.Message);
                _dispatcher.OnErrorOccured(device, DeviceError.NotResponding);
            }
            catch (InvalidAddressException invalidAddressException)
            {
                _log.AppendMessage(LogMessageType.Error, invalidAddressException.Message);
                _dispatcher.OnUnexpectedDeviceResponse(device, invalidAddressException.ReceivedAddress);
            }
            catch (InvalidMessageException invalidMessageException)
            {
                _log.AppendMessage(LogMessageType.Error, invalidMessageException.ToString());
                _dispatcher.OnErrorOccured(device, DeviceError.WrongPacketData);
            }
        }
Example #2
0
        private void Routine()
        {
            try
            {
                while (true)
                {
                    if (_isStopped)
                    {
                        break;
                    }

                    NandakaDevice device = _dispatcher.GetNextDevice();

                    _log.AppendMessage(LogMessageType.Info, $"Set current device: {device}");

                    SendNextMessage(device);
                }
            }
            catch (Exception exception)
            {
                _log.AppendMessage(LogMessageType.Error, "Unexpected error occured");
                _log.AppendMessage(LogMessageType.Error, exception.ToString());
                Dispose();
            }

            _log.AppendMessage(LogMessageType.Warning, "Master thread has been stopped");
        }
Example #3
0
 private SlaveSession(NandakaDevice device, IProtocol protocol, ILog log)
 {
     _device   = device;
     _protocol = protocol;
     _log      = log;
     _listener = new MessageListener(protocol);
 }
Example #4
0
        public static SlaveThread Create(NandakaDevice device, IProtocol protocol, ILog log)
        {
            var threadLog = new PrefixLog(log, $"[{device.Name} Slave]");
            var session   = SlaveSession.Create(device, protocol, threadLog);

            return(new SlaveThread(session, threadLog));
        }
        public IRegisterMessage GetNextMessage(NandakaDevice device)
        {
            IRegisterGroup[] writeOnlyGroupsToUpdate = device.RegisterGroups
                                                       .Where(group => group.RegisterType == RegisterType.ReadWrite)
                                                       .Where(group => !group.IsUpdated)
                                                       .OrderBy(group => group.Address)
                                                       .ToArray();

            if (!writeOnlyGroupsToUpdate.IsEmpty())
            {
                return(new CommonMessage(device.Address, MessageType.Request, OperationType.Write, writeOnlyGroupsToUpdate));
            }

            IRegisterGroup[] readOnlyGroupsToUpdate = device.RegisterGroups
                                                      .Where(group => group.RegisterType == RegisterType.Read)
                                                      .OrderBy(group => group.LastUpdateTime)
                                                      .ThenBy(group => group.Address)
                                                      .ToArray();

            if (!readOnlyGroupsToUpdate.IsEmpty())
            {
                return(new CommonMessage(device.Address, MessageType.Request, OperationType.Read, readOnlyGroupsToUpdate));
            }

            return(new EmptyMessage());
        }
Example #6
0
 public MasterSession(IProtocol protocol, NandakaDevice slaveDevice, MasterDeviceDispatcher dispatcher, ILog log)
 {
     _log                   = new PrefixLog(log, $"[{slaveDevice.Name} Session]");
     _protocol              = protocol;
     _slaveDevice           = slaveDevice;
     _registersUpdatePolicy = slaveDevice.UpdatePolicy;
     _dispatcher            = dispatcher;
 }
Example #7
0
        public IRegisterMessage GetNextMessage(NandakaDevice device)
        {
            IRegisterGroup[] orderedByVersionGroups = device.RegisterGroups
                                                      .OrderBy(group => group.LastUpdateTime)
                                                      .ToArray();

            RegisterType firstGroupType = orderedByVersionGroups.First().RegisterType;

            IRegisterGroup[] groupsToUpdate = orderedByVersionGroups
                                              .Where(group => group.RegisterType == firstGroupType)
                                              .ToArray();

            OperationType operationType = firstGroupType == RegisterType.ReadWrite
                ? OperationType.Write
                : OperationType.Read;

            return(new CommonMessage(device.Address, MessageType.Request, operationType, groupsToUpdate));
        }
Example #8
0
        public static SlaveSession Create(NandakaDevice device, IProtocol protocol, ILog log)
        {
            var sessionLog = new PrefixLog(log, "[Session]");

            return(new SlaveSession(device, protocol, sessionLog));
        }