/// <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) { }
/// <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; }
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(); }