aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Navigation/NavigationView.cs
blob: 4e846e96339590eff4849c211e1524793c49a648 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Tango.MachineStudio.Synchronization.Navigation
{
    /// <summary>
    /// Represents the available views to navigate to within the synchronization module.
    /// </summary>
    public enum NavigationView
    {
        MenuView,
        LocalSynchronizationView,
        RemoteSynchronizationView,
        DirectSynchronizationView,
    }
}
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.Common.Web;
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;
        private IPPCApplicationManager _appManager;
        private PPCWebClient _ppcWebClient;

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

        private MachineSetupView _currentView;
        public MachineSetupView CurrentView
        {
            get { return _currentView; }
            set { _currentView = 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(PPCWebClient ppcWebClient, IPPCApplicationManager applicationManager, IMachineSetupManager machineSetupManager, IOperationSystemManager operationSystemManager)
        {
            _ppcWebClient = ppcWebClient;
            _appManager = applicationManager;
            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();
                Settings.Save();
            });

            _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()
        {
            LogManager.Log("Completing machine setup...");
            String updater_exe = Path.Combine(_setup_result.UpdatePackagePath, "Tango.PPC.Updater.exe");
            _appManager.UpdateApplication(updater_exe, PathHelper.GetStartupPath());
        }

        /// <summary>
        /// Navigates to the specified view.
        /// </summary>
        /// <param name="view">The view.</param>
        private Task NavigateTo(MachineSetupView view)
        {
            CurrentView = 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 async void ConnectivityProvider_ConnectionStateChanged(object sender, Common.Connectivity.ConnectionStateEventArgs e)
        {
            if (e.IsConnected)
            {
                ConnectivityProvider.ConnectionStateChanged -= ConnectivityProvider_ConnectionStateChanged;
                await NavigateTo(MachineSetupView.WiFiTestView);
                await Task.Delay(5000);
                EnsureWiFi();
            }
        }

        #endregion

        #region Setup

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

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

            State = MachineSetupStates.Working;

            try
            {
                _ppcWebClient.Environment = DeploymentSlot;
                await _operationSystemManager.ChangeTimeZone(SelectedTimeZone);
                _setup_result = await MachineSetupManager.Setup(SerialNumber);
                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
    }
}