using Microsoft.Win32; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using Tango.Core.Commands; using Tango.Integration.Operation; using Tango.SharedUI; namespace Tango.MachineStudio.UI.ViewModels { public class FirmwareUpgradeViewVM : DialogViewVM { private IMachineOperator _operator; private FileStream _stream; private FirmwareUpgradeHandler _handler; public FirmwareUpgradeHandler Handler { get { return _handler; } set { _handler = value; RaisePropertyChangedAuto(); } } private String _selectedFile; public String SelectedFile { get { return _selectedFile; } set { _selectedFile = value; RaisePropertyChangedAuto(); } } private int _currentPage; public int CurrentPage { get { return _currentPage; } set { _currentPage = value; RaisePropertyChangedAuto(); } } public RelayCommand SelectCommand { get; set; } public RelayCommand UpgradeCommand { get; set; } public RelayCommand AbortCommand { get; set; } public FirmwareUpgradeViewVM(IMachineOperator machineOperator) : base() { _operator = machineOperator; SelectCommand = new RelayCommand(BrowseForFile); UpgradeCommand = new RelayCommand(StartUpgrade, () => SelectedFile != null); AbortCommand = new RelayCommand(AbortUpgrade, () => Handler != null && Handler.Status != FirmwareUpgradeStatus.Validating && Handler.Status != FirmwareUpgradeStatus.Activating); } private void BrowseForFile() { OpenFileDialog dlg = new OpenFileDialog(); dlg.Title = "Select tango firmware package file"; dlg.Filter = "Tango Firmware Package|*.tfp"; if (dlg.ShowDialog().Value) { SelectedFile = dlg.FileName; InvalidateRelayCommands(); } } private async void StartUpgrade() { CurrentPage = 1; _stream = new FileStream(SelectedFile, FileMode.Open); Handler = await _operator.UpgradeFirmware(_stream); Handler.Progress += (_, e) => { InvokeUI(() => { AbortCommand.RaiseCanExecuteChanged(); }); }; Handler.Completed += (_, __) => { _stream.Dispose(); CurrentPage = 2; }; Handler.Canceled += (_, __) => { _stream.Dispose(); }; Handler.Failed += (_, __) => { _stream.Dispose(); }; } private async void AbortUpgrade() { await Handler.Cancel(); } } }