public void RecieveTest() { const int messagesCount = 10; const int perMessageDelay = 10; var testFrames = CanFrameHelper.GetRandomFrames().Take(messagesCount).ToList(); var mockPort = new MockCanPort(); var flow = new CanFlow(mockPort, testFrames.Select(f => f.Descriptor).Distinct().ToArray()); ThreadPool.QueueUserWorkItem(s => { foreach (var frame in testFrames) { mockPort.PushFrames(frame); Thread.Sleep(perMessageDelay); } }); var watch = new Stopwatch(); watch.Start(); var readedFrames = flow.Read(TimeSpan.FromMilliseconds(perMessageDelay * 5), false).ToList(); watch.Stop(); const double targetTime = messagesCount*perMessageDelay*2; Assert.IsTrue(watch.ElapsedMilliseconds <= targetTime, "Приём сообщений занял слишком много времени: {0}мс вместо {1}мс", watch.ElapsedMilliseconds, targetTime); Assert.AreEqual(testFrames.Count, readedFrames.Count, "Количество отправленых и принятых фреймов не совпадает"); for (int i = 0; i < messagesCount; i++) { Assert.AreEqual(testFrames[i].Id, readedFrames[i].Id, "Порядок сообщений нарушен"); Assert.IsTrue(testFrames[i].Data.SequenceEqual(readedFrames[i].Data), "Идентификатор сообщения не изменился, но данные исказились"); } }
/// <summary> /// Находит в сети все устройства с заданным шаблоном билетов. /// </summary> /// <param name="Template">Шаблон билета устройства</param> /// <param name="OnPort">Can-порт, через который осуществляется работа</param> /// <param name="Timeout">Таймаут (в милисекундах). Таймаут отсчитывается с момента получения последней IsoTP-транзакции, а не с момента начала опроса</param> /// <returns></returns> public static List<DeviceTicket> LocateDevices(DeviceTicket Template, CanPort OnPort, int Timeout = 100) { using (var flow = new CanFlow(OnPort, CanProg.FuDev, CanProg.FuInit, CanProg.FuProg)) { Template.BlockSerialNumber = 0; var helloMessage = new Messages.ProgInit(Template); IsoTp.Send(flow, CanProg.FuInit, CanProg.FuDev, helloMessage.Encode()); var res = new List<DeviceTicket>(); var sw = new Stopwatch(); sw.Start(); while (sw.ElapsedMilliseconds < Timeout) { try { var tr = IsoTp.Receive(flow, CanProg.FuDev, CanProg.FuProg, TimeSpan.FromMilliseconds(Timeout - sw.ElapsedMilliseconds)); var msg = Messages.Message.DecodeMessage(tr.Data); if (msg is Messages.ProgBCastResponse) res.Add((msg as Messages.ProgBCastResponse).Ticket); } catch (IsoTpReceiveTimeoutException) { break; } } return res.Distinct().ToList(); } }
public static TpReceiveTransaction SendRequestAndBeginReceive( CanFlow Flow, int RequestTransmitDescriptor, int RequestAcknowlegmentDescriptor, int AnsverTransmitDescriptor, int AnsverAcknowlegmentDescriptor, Byte[] RequestData, TimeSpan Timeout) { Send(Flow, RequestTransmitDescriptor, RequestAcknowlegmentDescriptor, RequestData).Wait(); return Receive(Flow, AnsverTransmitDescriptor, AnsverAcknowlegmentDescriptor, Timeout); }
private static void Main(string[] args) { if (args.Length == 0) { Console.WriteLine(Resources.HelpDisclamer); Console.WriteLine(); Console.WriteLine("Поддерживаемые команды:"); Console.WriteLine(); foreach (var builder in FudpMessageBuilder.Builders.OrderBy(b => b.Key)) { Console.ForegroundColor = ConsoleColor.Magenta; Console.Write(builder.Key); Console.ResetColor(); Console.Write(" "); Console.ForegroundColor = ConsoleColor.Yellow; Console.Write(builder.Value.MessageType.Name); Console.ResetColor(); Console.WriteLine(); foreach (FudpMessageBuilder.ParameterSetter setter in builder.Value.Setters.OrderBy(s => s.Index)) { Console.Write(" "); Console.ForegroundColor = ConsoleColor.Cyan; Console.Write(setter.Index + 2); Console.ResetColor(); Console.Write(": {0}", setter.PropertyInfo.Name); Console.ForegroundColor = ConsoleColor.DarkCyan; Console.Write(" ({0})", setter.PropertyInfo.PropertyType.Name); Console.WriteLine(); Console.ResetColor(); } Console.WriteLine(); } Console.ReadKey(); } else { if (File.Exists("can.log")) File.Delete("can.log"); FudpMessageBuilder builder = FudpMessageBuilder.Builders[int.Parse(args[0])]; try { builder.FillWith(args.Skip(1).ToList()); } catch (FormatException exception) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Какой-то из параметров указан в неверном формате"); Console.ResetColor(); return; } Message message = builder.Build(); Console.ForegroundColor = ConsoleColor.Yellow; Console.Write("-->"); Console.ResetColor(); Console.WriteLine(" {0}", message); using (var fs = new StreamWriter("fudp.log", true)) { fs.WriteLine("--> {0}\n {1}", message, BitConverter.ToString(message.Encode())); } using (AppiDev appi = WinusbAppiDev.GetDevices().First().OpenDevice()) { foreach (AppiCanPort port in appi.CanPorts.Values) { port.BaudRate = BaudRates.CBR_100K; port.Received += PortOnReceived; } using (var flow = new CanFlow(appi.CanPorts[AppiLine.Can1], CanProg.FuDev, CanProg.FuProg)) { try { IsoTp.Send(flow, CanProg.FuProg, CanProg.FuDev, message.Encode(), TimeSpan.FromMilliseconds(500)); } catch (IsoTpFlowControlTimeoutException) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Истёк таймаут при отправке ISO-TP сообщения"); } byte[] receivedBuffer = new byte[0]; try { receivedBuffer = IsoTp.Receive(flow, CanProg.FuDev, CanProg.FuProg, TimeSpan.FromMilliseconds(500)).Data; Message answerMessage = Message.DecodeMessage(receivedBuffer); Console.ForegroundColor = ConsoleColor.Magenta; Console.Write("<--"); Console.ResetColor(); Console.WriteLine(" {0}", answerMessage); using (var fs = new StreamWriter("fudp.log", true)) { fs.WriteLine("--> {0}\n {1}", answerMessage, BitConverter.ToString(receivedBuffer)); } } catch (IsoTpReceiveTimeoutException) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Истёк таймаут при ожидании ответа"); } catch (IsoTpProtocolException exception) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Какая-то ошибка в реализации протокола ISO-TP: {0}", exception.Message); Console.ResetColor(); Console.WriteLine("Был принят следующий буфер: {0}", BitConverter.ToString(receivedBuffer)); } } } } Console.ResetColor(); }
public static TpReceiveTransaction SendRequestAndBeginReceive(CanFlow Flow, int MasterDescriptor, int SlaveDescriptor, Byte[] RequestData, TimeSpan Timeout) { return SendRequestAndBeginReceive(Flow, MasterDescriptor, SlaveDescriptor, SlaveDescriptor, MasterDescriptor, RequestData, Timeout); }