/// <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); }
/// <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: Пишем в журнал... Не реализовано } }
/// <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; }