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); }
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); }
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); }
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); }
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 не соответствует переданному массиву"); }
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, "Ошибка при вычислени размера пакета"); }
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); }