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