Ejemplo n.º 1
0
        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), "Идентификатор сообщения не изменился, но данные исказились");
            }
        }
Ejemplo n.º 2
0
        /// <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();
            }
        }
Ejemplo n.º 3
0
 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);
 }
Ejemplo n.º 4
0
        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();
        }
Ejemplo n.º 5
0
 public static TpReceiveTransaction SendRequestAndBeginReceive(CanFlow Flow, int MasterDescriptor, int SlaveDescriptor, Byte[] RequestData, TimeSpan Timeout)
 {
     return SendRequestAndBeginReceive(Flow, MasterDescriptor, SlaveDescriptor, SlaveDescriptor, MasterDescriptor, RequestData, Timeout);
 }