Exemple #1
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();
            }
        }
 /// <summary>
 /// Показывает, может ли быть указанный компонент применён к указанному устройству
 /// </summary>
 /// <param name="CompTarget">Компонент прошивки</param>
 /// <param name="ToDevice">Целевое устройство</param>
 /// <returns>True, если устройство содержится в списке целей для компонента</returns>
 public static bool CanApply(ComponentTarget CompTarget, DeviceTicket ToDevice)
 {
     return
         CompTarget.CellId == ToDevice.BlockId &&
         CompTarget.CellModification == ToDevice.Modification &&
         CompTarget.Module == ToDevice.Module &&
         CompTarget.Channel == ToDevice.Channel;
 }
        public void FlashDevice(DeviceTicket Ticket, CanPort port, FirmwaringProgressViewModel GlobalProgress, FirmwaringProgressViewModel LocalProgress)
        {
            _logger.Info("-----");
            _logger.Info("Подключаемся к {0}", Ticket);
            PostProgress(GlobalProgress,
                         string.Format("Подключение к модулю (№{0}/{1})...", Ticket.BlockSerialNumber, Ticket.Channel));

            using (CanProg session = CanProg.Connect(port, Ticket))
            {
                _logger.Info("Подключились и начинаем передачу прошивки на {0}", Ticket);
                PostProgress(GlobalProgress, "Передача прошивки {0:P0}", 0);

                var updater = new ComponentUpdater(
                    session);
                updater.SynchronizeComponent(Component, Information, GlobalProgress, LocalProgress);
                PostProgress(GlobalProgress, "Применение изменений...");
                SubmitAckStatus submitStatus = session.Submit(SubmitStatus.Submit);
                _logger.Info("Завершили программирование {0}, статус: {1}", Ticket, submitStatus);
                if (submitStatus != SubmitAckStatus.SubmitSuccessed)
                    throw new SubmitFailsException();
            }
        }
 public DeviceViewModel(DeviceTicket OnTicket)
     : this(OnTicket.BlockId, OnTicket.Modification, OnTicket.Module, OnTicket.BlockSerialNumber)
 {
 }
Exemple #5
0
 /// <summary>
 /// Находит в сети все устройства с заданным шаблоном билетов.
 /// </summary>
 /// <param name="Template">Шаблон билета устройства</param>
 /// <param name="Timeout">Таймаут (в милисекундах). Таймаут отсчитывается с момента получения последней IsoTP-транзакции, а не с момента начала опроса</param>
 public List<DeviceTicket> LocateDevices(DeviceTicket Template, int Timeout = 100)
 {
     return LocateDevices(Template, Port, Timeout);
 }
 /// <summary>Проверяет, соответствует ли данный билет устройства данной модели представления устройства</summary>
 private bool CanTicketApplyToDevice(DeviceViewModel dev, DeviceTicket ticket)
 {
     return
         ticket.BlockId == dev.CellId &&
         ticket.Module == dev.ModuleNumber &&
         ticket.Modification == dev.ModificationNumber &&
         ticket.BlockSerialNumber == dev.SerialNumber;
 }
Exemple #7
0
        static void Main(string[] args)
        {
            CanProg.Logs = new List<ICanProgLog>() { new ConsoleLogger(ConsoleColor.Yellow), new FileLogger("log.txt") };
            //try
            //{

            CanProg.Logs.PushTextEvent("----- STARTED ------");

            using (var appidev = Communications.Appi.Winusb.WinusbAppiDev.GetDevices().First().OpenDevice(true))
            {
                var p = appidev.CanPorts[Communications.Appi.AppiLine.Can1];
                p.Received += p_Recieved;

                //Console.WriteLine("ТЫ ГОТОВ???");
                //Console.ReadLine();
                //var vokak = Enumerable.Range(5, 1000).Select(i => Communications.Can.CanFrame.NewWithId(0x14, BitConverter.GetBytes(i))).ToList();
                //p.Send(vokak);
                //Console.WriteLine("ВОТ ТАК ДА!!!!");
                //Console.ReadLine();
                //return;

                //Console.ReadLine();

                #region Autodetect
                var dt = new DeviceTicket();
                var devices = DeviceLocator.LocateDevices(dt, p);
                ConsoleLogger.Print(() =>
                    {
                        Console.WriteLine("Обнаружено {0} устройств:", devices.Count);
                        Console.ForegroundColor = ConsoleColor.Cyan;
                        foreach (var устройство in devices)
                            Console.WriteLine("    {0}", устройство);
                        Console.ResetColor();
                    });

                //var ticket = devices.First();
                #endregion

                // !!!!!!!!!!!!!!!!!!!!!!!
                var ticket =
                    new DeviceTicket(
                        BlockId: 3,
                        Modification: 1,
                        Module: 1,
                        Channel: 1,
                        BlockSerialNumber: 10056);

                using (var flow = new Communications.Can.CanFlow(p, CanProg.FuDev, CanProg.FuInit, CanProg.FuProg))
                {
                    try
                    {
                        flow.Clear();
                        var progger = CanProg.Connect(flow, ticket);

                        PrintFileList(progger);
                        PrintProperties(progger);

                        //progger.Erase();
                        //System.Threading.Thread.Sleep(4000);

                        DirectoryInfo flashdir = new DirectoryInfo("flash");
                        if (flashdir.Exists)
                        {
                            var firmware = flashdir
                                        .EnumerateFiles("*." + FirmwarePacking.FirmwarePackage.FirmwarePackageExtension)
                                        .Select(f => FirmwarePacking.FirmwarePackage.Open(f))
                                        .Where(fw => fw.Components.SelectMany(c => c.Targets).Any(t => ComponentUpdater.CanApply(t, ticket)))
                                        .OrderByDescending(fw => fw.Information.FirmwareVersion)
                                        .FirstOrDefault();

                            if (firmware != null)
                            {
                                var component = firmware.Components.First(c => c.Targets.Any(t => ComponentUpdater.CanApply(t, ticket)));

                                var updater = new ComponentUpdater(progger, new ConsoleLogger(ConsoleColor.Blue));
                                DateTime t1 = DateTime.Now;
                                updater.SynchronizeComponent(component, firmware.Information);
                                var deltaT = (DateTime.Now - t1);
                                ConsoleLogger.Print(() =>
                                    {
                                        Console.ForegroundColor = ConsoleColor.Yellow;
                                        Console.WriteLine();
                                        Console.WriteLine("Время передачи: {0:F3} сек.", deltaT.TotalSeconds);
                                        Console.WriteLine("Скорость: {0:N0} Б/сек", component.Files.Sum(fl => fl.Content.Length) / deltaT.TotalSeconds);
                                        Console.ResetColor();
                                    });
                            }
                        }
                        PrintFileList(progger);
                        Console.ForegroundColor = ConsoleColor.Cyan;
                        Console.WriteLine("Готово");
                        Console.ResetColor();
                    }
                    catch (CanProgLimitConnectException connectionLimitException)
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine(connectionLimitException.Message);
                        Console.ResetColor();
                    }
                    //catch (Exception ex)
                    //{
                    //    Console.ForegroundColor = ConsoleColor.Red;
                    //    Console.WriteLine(ex.Message);
                    //    Console.ResetColor();
                    //}
                }
            }
            //}
            //catch (Exception exc)
            //{
            //    Console.ForegroundColor = ConsoleColor.Red;
            //    Console.WriteLine(exc.Message);
            //    Console.ResetColor();
            //}

            Console.WriteLine();
            Console.WriteLine("Нажмите любую клавишу для завершения...");
            Console.Read();
        }