internal void Run(FirmwaringProgressViewModel GlobalProgress, FirmwaringProgressViewModel LocalProgress)
        {
            if (GlobalProgress == null) throw new ArgumentNullException("GlobalProgress");
            GlobalProgress.MessageFormat = "Поиск модулей...";

            var componentsAndTargets = Firmware.Components.SelectMany(c => c.Targets.Select(t => new { Component = c, Target = t }));
            foreach (var cnt in componentsAndTargets)
            {
                var updater = new OneTargetUpdater(cnt.Target, cnt.Component, Firmware.Information);
                updater.Run(GlobalProgress, LocalProgress);
            }
            GlobalProgress.MessageFormat = "Готово";
        }
        public MainViewModel()
        {
            Progress = new FirmwaringProgressViewModel();
            SubProgress = new FirmwaringProgressViewModel();
            Source = new ManualFirmwareSource(new Dialogs.DialogFileSelector());
            OpenFirmwareCommand = new ActionCommand<String[]>(OpenFirmware, CanOpenFirmware);
            UpdateFirmwareCommand = new ActionCommand(UpdateFirmware, CanUpdateFirmware);
            OpenLogDirectoryCommand = new ActionCommand(OpenLogDirectory);

            var startupFile = GetStartupFile();
            if (startupFile != null)
                Source.OpenFirmware(startupFile);
        }
        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 void Run(FirmwaringProgressViewModel GlobalProgress, FirmwaringProgressViewModel LocalProgress)
        {
            _logger.Info("Начинаем обновлять цель {0}", Target);
            while (true)
            {
                try
                {
                    using (AppiDev appi = GetAndConfigureAppiDev(GlobalProgress))
                    {
                        AppiCanPort port = appi.CanPorts[AppiLine.Can1];

                        PostProgress(GlobalProgress, string.Format("Поиск модулей (ПК{0})...", Target.Channel));

                        int counter = Settings.Default.OverlocateCount;
                        var devices = new List<DeviceTicket>();
                        do
                        {
                            List<DeviceTicket> newDevices = new DeviceLocator(port).LocateDevices(GetTicketFor(Target),
                                                                                                  Settings.Default.DeviceLocationTimeoutMs);
                            if (newDevices.Any())
                                devices.AddRange(newDevices);
                            if (devices.Any())
                                counter--;
                            Thread.Yield();
                        } while (!devices.Any() || counter > 0);
                        devices = devices.Distinct().ToList();

                        _logger.Info("Нашли {0} устройств: {1}", devices.Count, string.Join(", ", devices.Select(d => d.ToString())));

                        if (GlobalProgress != null) GlobalProgress.Busy = false;
                        foreach (DeviceTicket dev in devices)
                        {
                            while (true)
                            {
                                try
                                {
                                    FlashDevice(dev, port, GlobalProgress, LocalProgress);
                                    break;
                                }
                                catch (CanProgException) { }
                                catch (FudpException) { }
                                // TODO: Нужно подумать, не стоит ли обрабатывать AppiException здесь, и переподключаться к АППИ внутри этого цикла...
                            }
                        }
                    }
                    break;
                }
                catch (AppiException) { }
            }
        }
 private static void PostProgress(FirmwaringProgressViewModel Progress, String Message, Boolean IsBusy = true,
                                  Double Value = 0)
 {
     if (Progress != null)
     {
         Progress.MessageFormat = Message;
         Progress.Busy = IsBusy;
         Progress.Value = Value;
     }
 }
 private static void PostProgress(FirmwaringProgressViewModel Progress, String Message,
                                  Double Value)
 {
     PostProgress(Progress, Message, false, Value);
 }
        private static AppiDev GetAndConfigureAppiDev(FirmwaringProgressViewModel progress = null)
        {
            PostProgress(progress, "Поиск АППИ");
            AppiDeviceSlot slot;
            do
            {
                slot = WinusbAppiDev.GetDevices().FirstOrDefault();
            } while (slot == null);

            PostProgress(progress, "Подключение к АППИ");
            AppiDev dev = slot.OpenDevice(true);

            PostProgress(progress, "Конфигурация АППИ");
            // Установка скорости в для всех портов
            dev.CanPorts[AppiLine.Can1].BaudRate = App.CurrentApp.Parameters.Can1BaudRate;
            dev.CanPorts[AppiLine.Can2].BaudRate = App.CurrentApp.Parameters.Can2BaudRate;

            return dev;
        }