/// <summary> /// Разбирает ответное сообщение /// </summary> /// <param name="message">Ответное сообщение</param> /// <returns>Структура данных ответа</returns> internal static IncomingMessageStuctureNodeGuard Parse(Frame message) { const Byte MASK_COBEID = 0x7F; // Выделяет 7 бит содержащих CodeId из поля Id IncomingMessageStuctureNodeGuard frame = new IncomingMessageStuctureNodeGuard(); frame.Answer = message; frame.CobeId = (Byte)(((Byte)message.Identifier) & MASK_COBEID); frame.DL = message.Data.Length; return(frame); }
/// <summary> /// Разбирает ответное сообщение /// </summary> /// <param name="message">Ответное сообщение</param> /// <returns>Структура данных ответа</returns> internal static IncomingMessageStuctureNodeGuard Parse(Frame message) { const Byte MASK_COBEID = 0x7F; // Выделяет 7 бит содержащих CodeId из поля Id IncomingMessageStuctureNodeGuard frame = new IncomingMessageStuctureNodeGuard(); frame.Answer = message; frame.CobeId = (Byte)(((Byte)message.Identifier) & MASK_COBEID); frame.DL = message.Data.Length; return frame; }
/// <summary> /// /// </summary> /// <param name="messages"></param> public override void HandleIncomingMessages(NGK.CAN.DataLinkLayer.Message.Frame[] messages) { String msg; IncomingMessageStuctureNodeGuard msghelper; DeviceBase device; if (Status != Status.Running) { return; } foreach (Frame message in messages) { msghelper = IncomingMessageStuctureNodeGuard.Parse(message); if (!msghelper.IsForService) { continue; } if (msghelper.HasIncorrectStructure) { if ((msghelper.DL == 1) && (msghelper.Code == 0)) { // Код состояния с 0 используется протоколом Boot-Up // поэтому данное собщенеие не считаем очибочным. Оно для // сервиса Boot-Up } else { // Формат сообщения неверен. msg = String.Format( "Network {0}: Принято сообщение с неверным форматом данных {1}", _NetworkController.Description, message.ToString()); //_Logger.Error(msg); } continue; } 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; } // Устройство найдено. lock (_SyncRoot) { // Завершаем транзакцию Transaction trns = _Context.FindDevice(msghelper.CobeId).CurrentTransaction; if (trns != null) { trns.Stop(message); // Устанавливаем новый статус устройству _NetworkController.Devices[msghelper.CobeId].Status = ServiceNodeGuard.ToDeviceStatus(msghelper.StatusCode); } else { // Принят ответ в отсутствии запроса throw new Exception(); } } // Пишем в журнал... Не реализовано } }