Example #1
0
            public static Frame Parse(byte[] message)
            {
                Frame ret = null;

                switch (DetermineFrameType(message[0]))
                {
                case FrameType.Single:
                    ret = new SingleFrame(message);
                    break;

                case FrameType.First:
                    ret = new FirstFrame(message);
                    break;

                case FrameType.Consecutive:
                    ret = new ConsecutiveFrame(message);
                    break;

                case FrameType.Flow:
                    ret = new FlowControlFrame(message);
                    break;

                default:
                    break;
                }
                return(ret);
            }
Example #2
0
            public static Frame Parse(byte[] message, bool awaitingConsecutive)
            {
                Frame ret = null;

                if (awaitingConsecutive)
                {
                    ret         = new Frame(message);
                    ret.RawData = message.Skip(1).ToArray();
                    return(ret);
                }

                switch (DetermineFrameType(message[0]))
                {
                case FrameType.Single:
                    ret = new SingleFrame(message);
                    break;

                case FrameType.First:
                    ret = new FirstFrame(message);
                    break;

                case FrameType.Consecutive:
                    ret = new ConsecutiveFrame(message);
                    break;

                case FrameType.Flow:
                    ret = new FlowControlFrame(message);
                    break;

                default:
                    break;
                }
                return(ret);
            }
Example #3
0
        public override IAwaitable TestExecute(IServices services)
        {
            var firstFrame = LastFrame.Int32(services);
            var lastFrame  = FirstFrame.Int32(services);

            ServiceId.Rendering[services].AnimateBackground(firstFrame, lastFrame);
            return(DummyAwaitable.Instance);
        }
Example #4
0
        public void First_CreateFrame_OutOfRangeException()
        {
            _random = new Random();
            var data = new byte[6];

            while (data.Length == 6)
            {
                data = new byte[_random.Next(100)];
            }
            _random.NextBytes(data);

            var firstFrame = new FirstFrame(data, 100);
        }
Example #5
0
        public void First_Create()
        {
            _random = new Random();
            var packetSize = _random.Next(4096);
            var data       = new byte[6];

            _random.NextBytes(data);

            var firstFrame = new FirstFrame(data, packetSize);

            Assert.AreEqual(packetSize, firstFrame.PacketSize, "Значение свойства PacketSize не соответствует переданному числу.");
            Assert.AreEqual(BitConverter.ToString(data), BitConverter.ToString(firstFrame.Data), "Значение свойства Data не соответствует переданному массиву");
        }
Example #6
0
        public void First_FillWithBytes()
        {
            _random = new Random();
            var packetSize = _random.Next(4096);
            var data       = new byte[8];

            _random.NextBytes(data);
            var firstFrame = new FirstFrame();

            data[0] = (byte)(((byte)firstFrame.FrameType & 0x0f) << 4 | (packetSize & 0xf00) >> 8);
            data[1] = (byte)(packetSize & 0x0ff);


            firstFrame = IsoTpFrame.ParsePacket <FirstFrame>(data);

            Assert.AreEqual(BitConverter.ToString(data, 2), BitConverter.ToString(firstFrame.Data), "Ошибка при заполнении данными");
            Assert.AreEqual(firstFrame.PacketSize, packetSize, "Ошибка при вычислени размера пакета");
        }
Example #7
0
        public void First_GetCanFrame()
        {
            _random = new Random();
            const int descriptor = 0xfc08;
            var       packetSize = _random.Next(4096);
            var       data       = new byte[6];

            _random.NextBytes(data);

            var firstFrame = new FirstFrame(data, packetSize);

            var firstCanFrame = firstFrame.GetCanFrame(descriptor);

            var result = string.Format("{0:X2}-{1:X2}-{2}", (byte)(((byte)firstFrame.FrameType & 0x0f) << 4 | (packetSize & 0xf00) >> 8), (byte)(packetSize & 0x0ff), BitConverter.ToString(firstFrame.Data));

            Assert.AreEqual(firstCanFrame.Descriptor, descriptor, "Ошибка при вычислении дескриптора");
            Assert.AreEqual(BitConverter.ToString(firstCanFrame.Data), result, "Ошибка при записи данных");
        }
        public Byte[] Receive()
        {
            if (this.Status != TpTransactionStatus.Ready)
            {
                throw new IsoTpTransactionReuseException(this);
            }
            this.Status = TpTransactionStatus.Active;

            bool TransactionStarted = false;

            try
            {
                // Инициализируем чтение с заданным таймаутом,
                // при истечении таймаута - выбрасываем ошибку.
                var FramesStream = Flow.Read(Timeout, true).Where(f => f.Descriptor == TransmitDescriptor);

                try
                {
                    // Ждём первого кадра передачи
                    FirstFrame First = null;
                    foreach (var f in FramesStream)
                    {
                        var ft = f.GetIsoTpFrameType();
                        if (ft == IsoTpFrameType.First)
                        {
                            First = (FirstFrame)f;
                            break;
                        }
                        if (ft == IsoTpFrameType.Single)
                        {
                            Buff   = ((SingleFrame)f).Data;
                            Status = TpTransactionStatus.Done;
                            return(Data);
                        }
                    }
                    TransactionStarted = true;

                    // После того, как поймали первый кадр - подготавливаем буфер
                    Buff = new Byte[First.PacketSize];
                    Buffer.BlockCopy(First.Data, 0, Buff, 0, First.Data.Length);
                    Pointer += First.Data.Length;

                    ExpectingConsIndex = 1;

                    // Начинаем приём данных
                    while (Pointer < Buff.Length)
                    {
                        SendFlowControl();          // Сообщаем о готовности
                        ReadBlock(FramesStream);    // Читаем следующий блок
                    }
                }
                catch
                {
                    this.Status = TpTransactionStatus.Error;
                    // Если в процессе передачи возникла ошибка, отправляем отмену
                    if (TransactionStarted)
                    {
                        Flow.Send(FlowControlFrame.AbortFrame.GetCanFrame(AcknowlegmentDescriptor));
                    }
                    throw;      // и пробрасываем ошибку дальше по стеку
                }
            }
            catch (TimeoutException timeoutException)
            {
                throw new IsoTpReceiveTimeoutException(timeoutException);
            }

            this.Status = TpTransactionStatus.Done;
            return(Buff);
        }