aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.MachineDesigner/Views/MainView.xaml.cs
blob: 7e1b60a282ecdcbe052c651e89cf0c91337a9644 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Tango.Core.DI;
using Tango.MachineStudio.MachineDesigner.Contracts;

namespace Tango.MachineStudio.MachineDesigner.Views
{
    /// <summary>
    /// Interaction logic for MainView.xaml
    /// </summary>
    public partial class MainView : UserControl , IMainView
    {
        public MainView()
        {
            InitializeComponent();
            TangoIOC.Default.Register<IMainView>(this);
        }

        public void NavigateTo(MachineDesignerNavigationView view)
        {
            navigationControl.NavigateTo(view.ToString());
        }
    }
}
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.Core;
using Tango.Core.Commands;
using Tango.Core.Helpers;
using Tango.Integration.Operation;
using Tango.Logging;
using Tango.PMR.Connection;
using Tango.PPC.Common;
using Tango.PPC.Common.Application;
using Tango.PPC.Common.Connection;
using Tango.PPC.Common.MachineSetup;
using Tango.PPC.Common.Navigation;
using Tango.PPC.Common.OS;
using Tango.PPC.UI.ViewsContracts;
using Tango.Settings;
using Tango.SharedUI.Helpers;
using Tango.SQLExaminer;
using Tango.Transport.Adapters;
using Tango.Web;

namespace Tango.PPC.UI.ViewModels
{
    /// <summary>
    /// Represents the machine setup view ViewModel.
    /// </summary>
    /// <seealso cref="Tango.PPC.Common.PPCViewModel{Tango.PPC.UI.ViewsContracts.IMachineSetupView}" />
    public class MachineSetupViewVM : PPCViewModel<IMachineSetupView>
    {
        /// <summary>
        /// Represents the various machine setup view states.
        /// </summary>
        public enum MachineSetupStates
        {
            None,
            Working,
            Completed,
            Failed,
        }

        public enum MachineSetupView
        {
            WelcomeView,
            WiFiSelectionView,
            WiFiTestView,
            TimeZoneView,
            EnvironmentView,
            SetupWelcomeView,
            SetupProgressView,
            SetupCompletedView,
            SetupFailedView,
        }

        private MachineSetupResult _setup_result;
        private IOperationSystemManager _operationSystemManager;

        #region Properties

        /// <summary>
        /// Gets or sets the machine setup manager.
        /// </summary>
        public IMachineSetupManager MachineSetupManager { get; set; }

        private String _serialNumber;
        /// <summary>
        /// Gets or sets the serial number.
        /// </summary>
        public String SerialNumber
        {
            get { return _serialNumber; }
            set { _serialNumber = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); }
        }

        private String _hostAddress;
        /// <summary>
        /// Gets or sets the host address.
        /// </summary>
        public String HostAddress
        {
            get { return _hostAddress; }
            set { _hostAddress = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); }
        }

        private String _log;
        /// <summary>
        /// Gets or sets the log.
        /// </summary>
        public String Log
        {
            get { return _log; }
            set { _log = value; RaisePropertyChangedAuto(); }
        }

        private MachineSetupStates _state;
        /// <summary>
        /// Gets or sets the state.
        /// </summary>
        public MachineSetupStates State
        {
            get { return _state; }
            set { _state = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); }
        }

        private String _failedError;
        /// <summary>
        /// Gets or sets the setup failed error.
        /// </summary>
        public String FailedError
        {
            get { return _failedError; }
            set { _failedError = value; RaisePropertyChangedAuto(); }
        }

        /// <summary>
        /// Gets or sets the available time zones.
        /// </summary>
        public List<TimeZoneInfo> TimeZones { get; set; }

        private TimeZoneInfo _selectedTimeZone;
        /// <summary>
        /// Gets or sets the selected time zone.
        /// </summary>
        public TimeZoneInfo SelectedTimeZone
        {
            get { return _selectedTimeZone; }
            set { _selectedTimeZone = value; RaisePropertyChangedAuto(); }
        }

        private DeploymentSlot _deploymentSlot;
        /// <summary>
        /// Gets or sets the deployment slot.
        /// </summary>
        public DeploymentSlot DeploymentSlot
        {
            get { return _deploymentSlot; }
            set { _deploymentSlot = value; RaisePropertyChangedAuto(); }
        }

        #endregion

        #region Commands

        /// <summary>
        /// Gets or sets the complete command.
        /// </summary>
        public RelayCommand CompleteCommand { get; set; }

        /// <summary>
        /// Gets or sets the navigate to WiFi command.
        /// </summary>
        public RelayCommand NavigateToWiFiCommand { get; set; }

        /// <summary>
        /// Gets or sets the install command.
        /// </summary>
        public RelayCommand InstallCommand { get; set; }

        /// <summary>
        /// Gets or sets the restart command.
        /// </summary>
        public RelayCommand RestartCommand { get; set; }

        /// <summary>
        /// Gets or sets the time zone selected command.
        /// </summary>
        public RelayCommand TimeZoneSelectedCommand { get; set; }

        /// <summary>
        /// Gets or sets the environment selected command.
        /// </summary>
        public RelayCommand EnvironmentSelectedCommand { get; set; }
        #endregion

        #region Constructors

        /// <summary>
        /// Initializes a new instance of the <see cref="MachineSetupViewVM"/> class.
        /// </summary>
        /// <param name="applicationManager">The application manager.</param>
        /// <param name="machineSetupManager">The machine setup manager.</param>
        public MachineSetupViewVM(IPPCApplicationManager applicationManager, IMachineSetupManager machineSetupManager, IOperationSystemManager operationSystemManager)
        {
            MachineSetupManager = machineSetupManager;

            DeploymentSlot = Settings.DeploymentSlot;

            SerialNumber = "";

            CompleteCommand = new RelayCommand(CompleteSetup, () => State == MachineSetupStates.Completed);

            applicationManager.SetupRequired += ApplicationManager_SetupRequired;

            NavigateToWiFiCommand = new RelayCommand(EnsureWiFi);

            InstallCommand = new RelayCommand(Install);
            RestartCommand = new RelayCommand(() => { NavigateTo(MachineSetupView.WelcomeView); });
            TimeZoneSelectedCommand = new RelayCommand(() => { NavigateTo(MachineSetupView.EnvironmentView); });
            EnvironmentSelectedCommand = new RelayCommand(() => 
            {
                NavigateTo(MachineSetupView.SetupWelcomeView);
                Settings.DeploymentSlot = DeploymentSlot;
                HostAddress = Settings.GetMachineServiceAddress();
            });

            _operationSystemManager = operationSystemManager;

            TimeZones = _operationSystemManager.GetAvailableTimeZones().ToList();
            SelectedTimeZone = TimeZones.SingleOrDefault(x => x.ToString() == "(UTC+02:00) Jerusalem");
        }

        #endregion

        #region Event Handlers

        /// <summary>
        /// Handles the SetupRequired event of the ApplicationManager.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
        private void ApplicationManager_SetupRequired(object sender, EventArgs e)
        {
            if (!LogManager.Categories.Contains(LogCategory.Debug))
            {
                LogManager.Categories.Add(LogCategory.Debug);
            }

            var logger = new SimpleStringLogger();
            logger.Categories.Remove(LogCategory.Debug);
            LogManager.RegisterLogger(logger);
            logger.LogReceived += Logger_LogReceived;

            LogManager.Log("SetupRequired event received. Navigating to MachineSetupView...");
            NavigationManager.NavigateTo(NavigationView.MachineSetupView);
        }


        private void Logger_LogReceived(object sender, LogItemBase e)
        {
            AppendLog(e.Message);
        }

        #endregion

        #region Private Methods

        /// <summary>
        /// Appends the log.
        /// </summary>
        /// <param name="msg">The MSG.</param>
        private void AppendLog(String msg)
        {
            if (msg != null && !msg.Contains("SQL Examiner"))
            {
                InvokeUI(() =>
                {
                    View.AppendLog(msg + Environment.NewLine);
                });
            }
        }

        /// <summary>
        /// Completes the setup.
        /// </summary>
        private void CompleteSetup()
        {
            String updater_exe = Path.Combine(_setup_result.UpdatePackagePath, "Tango.PPC.Updater.exe");

            LogManager.Log("Completing machine setup...");
            LogManager.Log($"Executing '{updater_exe}' with arguments '{PathHelper.GetStartupPath()}'...");
            Process.Start(updater_exe, PathHelper.GetStartupPath());
            LogManager.Log("Terminating application process!");
            Environment.Exit(0);
        }

        /// <summary>
        /// Navigates to the specified view.
        /// </summary>
        /// <param name="view">The view.</param>
        private Task NavigateTo(MachineSetupView view)
        {
            return View.NavigateTo(view);
        }

        #endregion

        #region WiFi

        private async void EnsureWiFi()
        {
            await NavigateTo(MachineSetupView.WiFiTestView);

            await Task.Delay(2000);

            bool connected = await ConnectivityProvider.CheckInternetConnection();

            if (connected)
            {
                await NavigateTo(MachineSetupView.TimeZoneView);
            }
            else
            {
                await NavigateTo(MachineSetupView.WiFiSelectionView);
                await ConnectivityProvider.RefreshAvailableWiFiNetworks();

                ConnectivityProvider.ConnectionStateChanged += ConnectivityProvider_ConnectionStateChanged;
            }
        }

        private void ConnectivityProvider_ConnectionStateChanged(object sender, Common.Connectivity.ConnectionStateEventArgs e)
        {
            if (e.IsConnected)
            {
                ConnectivityProvider.ConnectionStateChanged -= ConnectivityProvider_ConnectionStateChanged;
                EnsureWiFi();
            }
        }

        #endregion

        #region Setup

        private async void Install()
        {
            await NavigateTo(MachineSetupView.SetupProgressView);

            LogManager.Log("Starting machine setup...");

            State = MachineSetupStates.Working;

            try
            {
                await _operationSystemManager.ChangeTimeZone(SelectedTimeZone);
                _setup_result = await MachineSetupManager.Setup(SerialNumber, HostAddress);
                State = MachineSetupStates.Completed;
                LogManager.Log("Machine setup completed.");
                await NavigateTo(MachineSetupView.SetupCompletedView);
            }
            catch (Exception ex)
            {
                LogManager.Log(ex, "Machine setup failed.");
                FailedError = ex.FlattenMessage();
                State = MachineSetupStates.Failed;
                await NavigateTo(MachineSetupView.SetupFailedView);
            }
        }

        #endregion
    }
}