Esempio n. 1
0
            /// <summary>
            /// Разбирает ответное сообщение
            /// </summary>
            /// <param name="message">Ответное сообщение</param>
            /// <returns>Структура данных ответа</returns>
            internal static IncomingMessageStuctureEmcy Parse(Frame message)
            {
                const Byte MASK_COBEID            = 0x7F; // Выделяет 7 бит содержащих CodeId из поля Id
                IncomingMessageStuctureEmcy frame =
                    new IncomingMessageStuctureEmcy();

                frame.Answer = message;
                frame.CobeId = (Byte)(((Byte)message.Identifier) & MASK_COBEID);
                frame.DL     = message.Data.Length;
                return(frame);
            }
Esempio n. 2
0
        /// <summary>
        /// Обработчик входящих сообщений из сети
        /// </summary>
        /// <param name="message">Входящее сообщение для обработки</param>
        //private void HandleIncomingMessages(Frame message)
        public override void HandleIncomingMessages(Frame[] messages)
        {
            String msg;
            IncomingMessageStuctureEmcy msghelper;
            DeviceBase device;
            UInt16     index;


            if (Status != Status.Running)
            {
                return;
            }

            foreach (Frame message in messages)
            {
                msghelper = IncomingMessageStuctureEmcy.Parse(message);

                if (!msghelper.IsForService)
                {
                    continue;
                }

                if (msghelper.HasIncorrectStructure)
                {
                    continue;
                }

                // Сообщение для этого сервиса.
                //msg = String.Format("Network {0}: Сервис {1}: Service Emcy принял сообщение: {2}",
                //    base.NetworkController.NetworkName(), this.ServiceName, message.ToString());
                //_Logger.Trace(msg);

                //Ищем устройство которое прислало сообщение
                if (!_NetworkController.Devices.Contains(msghelper.CobeId))
                {
                    // Устройство не найдено
                    msg = String.Format(
                        "Network {0}: Пришло сообщение от устройства с NodeId {1}, " +
                        "данное устройство не найдено конфигурации в сети. Message - {2}",
                        this.NetworkController.Description, msghelper.CobeId, message.ToString());
                    //Logger.Error(msg);
                    continue;
                }

                // Устройство найдено.
                // Устанавливаем новый статус устройству
                device = _NetworkController.Devices[msghelper.CobeId];

                //Анализируем код ошибки (источник или причина возникновения ошибки)
                switch (msghelper.ErrorCode)
                {
                case IncomingMessageStuctureEmcy.ErrCode.NoError:
                {
                    // Все ошибки исправлены
                    if (msghelper.ErrorRegister.FlagsByte != 0)
                    {
                        msg = String.Format(
                            "Неверное состояние - передан ErrCode=0 и ожидается err_reg=0, a получено err_reg = {0}",
                            msghelper.ErrorRegister);
                        throw new Exception(msg);
                    }

                    // Сбрасываем ошибки в устройстве если были
                    IEmcyErrors err = (IEmcyErrors)device;

                    lock (_SyncRoot)
                    {
                        err.BatteryError = false;
                        err.ConnectedServiceConnector = false;
                        err.DuplicateAddressError     = false;
                        err.MainSupplyPowerError      = false;
                        err.RegistrationError         = false;
                        err.Tamper = false;
                    }

                    break;
                }

                case IncomingMessageStuctureEmcy.ErrCode.Tamper:
                case IncomingMessageStuctureEmcy.ErrCode.BatteryError:
                case IncomingMessageStuctureEmcy.ErrCode.MainSupplyPowerError:
                case IncomingMessageStuctureEmcy.ErrCode.ConnectedServiceConnector:
                case IncomingMessageStuctureEmcy.ErrCode.DuplicateAddressError: // TODO: обработать поле Х - номер канала шлюза
                case IncomingMessageStuctureEmcy.ErrCode.RegistrationError:     // TODO: обработать поле Х - номер канала шлюза
                {
                    IEmcyErrors err = (IEmcyErrors)device;

                    lock (_SyncRoot)
                    {
                        err.BatteryError = msghelper.ErrorRegister.BatteryError;
                        err.ConnectedServiceConnector =
                            msghelper.ErrorRegister.ConnectedServiceConnector;
                        err.DuplicateAddressError =
                            msghelper.ErrorRegister.DuplicateAddressError;
                        err.MainSupplyPowerError =
                            msghelper.ErrorRegister.MainSupplyPowerError;
                        err.RegistrationError =
                            msghelper.ErrorRegister.RegistrationError;
                        err.Tamper = msghelper.ErrorRegister.Tamper;
                    }

                    break;
                }

                default:
                {
                    throw new NotImplementedException();
                }
                }

                //TODO: Пишем в журнал... Не реализовано
            }
        }
Esempio n. 3
0
 /// <summary>
 /// Разбирает ответное сообщение
 /// </summary>
 /// <param name="message">Ответное сообщение</param>
 /// <returns>Структура данных ответа</returns>
 internal static IncomingMessageStuctureEmcy Parse(Frame message)
 {
     const Byte MASK_COBEID = 0x7F; // Выделяет 7 бит содержащих CodeId из поля Id 
     IncomingMessageStuctureEmcy frame =
         new IncomingMessageStuctureEmcy();
     frame.Answer = message;
     frame.CobeId = (Byte)(((Byte)message.Identifier) & MASK_COBEID);   
     frame.DL = message.Data.Length;
     return frame;
 }