aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Logging/Properties/AssemblyInfo.cs
blob: d36d85f22b6d1b7746c77a7f8ca76d6294682c9f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Windows;

[assembly: AssemblyTitle("Tango - Machine Studio Logging Module")]
[assembly: AssemblyVersion("2.0.18.1737")]

[assembly: ComVisible(false)]

[assembly:ThemeInfo(
    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
                             //(used if a resource is not found in the page,
                             // or application resource dictionaries)
    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
                                      //(used if a resource is not found in the page,
                                      // app, or any theme specific resource dictionaries)
)]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media;
using System.Windows.Threading;
using Tango.Core;
using Tango.Core.Commands;
using Tango.Core.DI;
using Tango.Integration.Operation;
using Tango.PMR.IFS;
using Tango.PPC.Common;
using Tango.PPC.Common.Connection;
using Tango.PPC.Common.Modules;
using Tango.PPC.Common.Navigation;
using Tango.PPC.UI.Views;
using Tango.PPC.UI.ViewsContracts;
using Tango.SharedUI;

namespace Tango.PPC.UI.ViewModels
{
    /// <summary>
    /// Represents the layout view containing the main menu and all modules.
    /// </summary>
    /// <seealso cref="Tango.PPC.Common.PPCViewModel{Tango.PPC.UI.ViewsContracts.ILayoutView}" />
    public class LayoutViewVM : PPCViewModel<ILayoutView>
    {
        private JobHandler _jobHandler;
        private bool _resettingDevice;

        /// <summary>
        /// Gets or sets the module loader.
        /// </summary>
        [TangoInject]
        public IPPCModuleLoader ModuleLoader { get; set; }

        #region Classes

        public class CartridgeModel : ExtendedObject
        {
            private IMachineProvider _machineProvider;

            public CartridgeStatus Status { get; set; }

            public bool InProgress
            {
                get { return Status.State == CartridgeState.Filling || Status.State == CartridgeState.Emptying; }
            }

            public String Message
            {
                get { return Status.Cartridge.Slot == PMR.Diagnostics.CartridgeSlot.Ink ? "Ink filling is in progress..." : "Waste emptying is in progress..."; }
            }

            public Brush Brush
            {
                get
                {
                    if (Status.Cartridge.Slot == PMR.Diagnostics.CartridgeSlot.Ink)
                    {
                        try
                        {
                            int index = Status.Cartridge.Index;

                            var idsPack = _machineProvider.Machine.Configuration.NoneEmptyIdsPacks.FirstOrDefault(x => x.PackIndex == index);

                            if (idsPack != null)
                            {
                                switch (idsPack.LiquidType.Type)
                                {
                                    case BL.Enumerations.LiquidTypes.Cyan:
                                        return Application.Current.Resources["TangoCyanInkBrush"] as Brush;
                                    case BL.Enumerations.LiquidTypes.Magenta:
                                        return Application.Current.Resources["TangoMagentaInkBrush"] as Brush;
                                    case BL.Enumerations.LiquidTypes.Yellow:
                                        return Application.Current.Resources["TangoYellowInkBrush"] as Brush;
                                    case BL.Enumerations.LiquidTypes.Black:
                                        return Application.Current.Resources["TangoBlackInkBrush"] as Brush;
                                    case BL.Enumerations.LiquidTypes.Lubricant:
                                        return Application.Current.Resources["TangoLubricantBrush"] as Brush;
                                    case BL.Enumerations.LiquidTypes.Cleaner:
                                        return Application.Current.Resources["TangoCleanerBrush"] as Brush;
                                    case BL.Enumerations.LiquidTypes.TransparentInk:
                                        return Application.Current.Resources["TangoTransparentInkBrush"] as Brush;
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            LogManager.Log(ex, "Error generating ink filling brush.");
                        }

                        return Application.Current.Resources["TangoPrimaryAccentBrush"] as Brush;
                    }
                    else
                    {
                        return Application.Current.Resources["TangoWasteBrush"] as Brush;
                    }
                }
            }

            public CartridgeModel(IMachineProvider machineProvider)
            {
                _machineProvider = machineProvider;
                Status = new CartridgeStatus();
            }

            public void Invalidate()
            {
                RaisePropertyChanged(nameof(InProgress));
                RaisePropertyChanged(nameof(Status));
            }
        }

        #endregion

        #region Properties

        private bool _isMenuOpened;
        /// <summary>
        /// Gets or sets a value indicating whether the side menu is opened.
        /// </summary>
        public bool IsMenuOpened
        {
            get { return _isMenuOpened; }
            set
            {
                _isMenuOpened = value; RaisePropertyChangedAuto();

                if (!_isMenuOpened)
                {
                    IsPowerOpened = false;
                }
            }
        }

        private bool _isNotificationsOpened;
        /// <summary>
        /// Gets or sets a value indicating whether to display all notifications.
        /// </summary>
        public bool IsNotificationsOpened
        {
            get { return _isNotificationsOpened; }
            set
            {
                _isNotificationsOpened = value; RaisePropertyChangedAuto();
            }
        }

        private bool _isPowerOpened;
        /// <summary>
        /// Gets or sets a value indicating whether the power area is opened.
        /// </summary>
        public bool IsPowerOpened
        {
            get { return _isPowerOpened; }
            set { _isPowerOpened = value; RaisePropertyChangedAuto(); }
        }

        private bool _isInkFillingOrWasteEmptying;
        /// <summary>
        /// Gets or sets a value indicating whether ink filling or waste emptying is active.
        /// </summary>
        public bool IsInkFillingOrWasteEmptying
        {
            get { return _isInkFillingOrWasteEmptying; }
            set { _isInkFillingOrWasteEmptying = value; RaisePropertyChangedAuto(); }
        }

        private List<CartridgeModel> _cartridges;
        public List<CartridgeModel> Cartridges
        {
            get { return _cartridges; }
            set { _cartridges = value; RaisePropertyChangedAuto(); }
        }

        #endregion

        #region Commands

        /// <summary>
        /// Gets or sets the module navigation command.
        /// </summary>
        public RelayCommand<String> ModuleNavigationCommand { get; set; }

        /// <summary>
        /// Gets or sets the menu or back command.
        /// </summary>
        public RelayCommand MenuOrBackCommand { get; set; }

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

        /// <summary>
        /// Gets or sets the notifications area pressed command.
        /// </summary>
        public RelayCommand NotificationsAreaPressedCommand { get; set; }

        /// <summary>
        /// Gets or sets the stop printing command.
        /// </summary>
        public RelayCommand StopPrintingCommand { get; set; }

        /// <summary>
        /// Gets or sets the sign-out command.
        /// </summary>
        public RelayCommand SignOutCommand { get; set; }

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

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

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

        /// <summary>
        /// Gets or sets the power off command.
        /// </summary>
        public RelayCommand PowerOffCommand { get; set; }

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

        /// <summary>
        /// Gets or sets the stand by command.
        /// </summary>
        public RelayCommand StandByCommand { get; set; }

        #endregion

        #region Constructors

        /// <summary>
        /// Initializes a new instance of the <see cref="LayoutViewVM"/> class.
        /// </summary>
        public LayoutViewVM()
        {
            ModuleNavigationCommand = new RelayCommand<string>(NavigateToModule);
            HomeCommand = new RelayCommand(NavigateHome);
            MenuOrBackCommand = new RelayCommand(OpenMenuOrNavigateBack);
            NotificationsAreaPressedCommand = new RelayCommand(OpenFirstNotificationOrDisplayAll);

            StopPrintingCommand = new RelayCommand(StopPrinting);
            SignOutCommand = new RelayCommand(SignOut);
            UpdateCommand = new RelayCommand(UpdateMachine);

            PowerCommand = new RelayCommand(() => IsPowerOpened = true);
            RestartApplicationCommand = new RelayCommand(RestartApplication);
            PowerOffCommand = new RelayCommand(PowerOffMachine, () => MachineProvider.MachineOperator.Status != MachineStatuses.Disconnected);
            ResetCommand = new RelayCommand(ResetMachine, () => MachineProvider.MachineOperator.Status != MachineStatuses.Disconnected);
            StandByCommand = new RelayCommand(StandBy, () => MachineProvider.MachineOperator.CanPrint);
        }

        #endregion

        #region Private Methods

        /// <summary>
        /// Stops the printing.
        /// </summary>
        private void StopPrinting()
        {
            LogManager.Log("Stop printing layout command pressed!");

            if (_jobHandler != null)
            {
                _jobHandler.Cancel();
            }
        }

        /// <summary>
        /// Opens the menu or navigate back.
        /// </summary>
        private void OpenMenuOrNavigateBack()
        {
            if (NavigationManager.CanNavigateBack)
            {
                LogManager.Log("Back command pressed.");
                NavigationManager.NavigateBack();
            }
            else
            {
                LogManager.Log("Menu command pressed.");
                IsMenuOpened = true;
            }
        }

        /// <summary>
        /// Handles the module navigation command.
        /// </summary>
        /// <param name="moduleName">Name of the module.</param>
        private void NavigateToModule(string moduleName)
        {
            LogManager.Log("Navigate to module command pressed.");
            IsMenuOpened = false;
            NavigationManager.NavigateTo(moduleName);
        }

        /// <summary>
        /// Handles the home command.
        /// </summary>
        private void NavigateHome()
        {
            LogManager.Log("Navigate home command pressed.");
            IsMenuOpened = false;
            NavigationManager.NavigateTo(NavigationView.HomeModule);
        }

        /// <summary>
        /// Represents an event that is raised when the sign-out operation is complete.
        /// </summary>
        private void SignOut()
        {
            LogManager.Log("SignOut command pressed.");
            AuthenticationProvider.LogOut();
            IsMenuOpened = false;
        }

        /// <summary>
        /// Opens the first notification or display all.
        /// </summary>
        private void OpenFirstNotificationOrDisplayAll()
        {
            if (NotificationProvider.NotificationItems.Count == 1)
            {
                //Open first
            }
            else
            {
                IsNotificationsOpened = true;
            }
        }

        /// <summary>
        /// Restarts the application.
        /// </summary>
        private async void RestartApplication()
        {
            if (await NotificationProvider.ShowQuestion("Are you sure you want to restart the application?"))
            {
                ApplicationManager.Restart();
            }
        }

        /// <summary>
        /// Powers off the machine.
        /// </summary>
        private async void PowerOffMachine()
        {
            IsMenuOpened = false;

            if (await NotificationProvider.ShowQuestion("Are you sure you wish to turn off the machine?"))
            {
                try
                {
                    await MachineProvider.MachineOperator.PowerDown();
                }
                catch (Exception ex)
                {
                    LogManager.Log(ex, "Error triggering power down.");
                    await NotificationProvider.ShowError(ex.FlattenMessage());
                }
            }
        }

        /// <summary>
        /// Resets the machine.
        /// </summary>
        private async void ResetMachine()
        {
            IsMenuOpened = false;

            if (!await NotificationProvider.ShowQuestion("Are you sure you want to reset the machine?")) return;

            try
            {
                _resettingDevice = true;
                ResetCommand.RaiseCanExecuteChanged();
                await MachineProvider.MachineOperator.Reset();
                await NotificationProvider.ShowInfo("Machine was successfully restarted.");
            }
            catch (Exception ex)
            {
                await NotificationProvider.ShowError(ex.FlattenMessage());
            }
            finally
            {
                _resettingDevice = false;
                ResetCommand.RaiseCanExecuteChanged();
            }
        }

        private async void StandBy()
        {
            IsMenuOpened = false;

            try
            {
                LogManager.Log("Executing stand-by command.");
                await MachineProvider.MachineOperator.StandBy();
            }
            catch (Exception ex)
            {
                LogManager.Log(ex, "Error switching to stand-by mode.");
                await NotificationProvider.ShowError($"Error switching to stand-by mode.\n{ex.FlattenMessage()}");
            }
        }

        private void UpdateMachine()
        {
            if (MachineProvider.MachineOperator.IsPrinting)
            {
                NotificationProvider.ShowInfo("Cannot perform a machine update while the machine is dyeing.");
                return;
            }
            
            NavigationManager.NavigateTo(NavigationView.MachineUpdateView);
            TangoIOC.Default.GetInstance<MachineUpdateViewVM>().CheckForUpdates();
            IsMenuOpened = false;
        }

        #endregion

        #region Override Methods

        /// <summary>
        /// Called when the application has been started.
        /// </summary>
        public override void OnApplicationStarted()
        {
            base.OnApplicationStarted();
            MachineProvider.MachineOperator.PrintingStarted += MachineOperator_PrintingStarted;
            MachineProvider.MachineOperator.InkFillingStatusChanged += MachineOperator_InkFillingStatusChanged;
        }

        private void MachineOperator_InkFillingStatusChanged(object sender, InkFillingStatusChangedEventArgs e)
        {
            if (Cartridges == null)
            {
                Cartridges = MachineProvider.MachineOperator.InkFillingStatus.CartridgesStatuses.Select(x => new CartridgeModel(MachineProvider) { Status = x }).ToList();
            }
            else
            {
                foreach (var cartridgeStatus in e.Status.CartridgesStatuses)
                {
                    var model = Cartridges.SingleOrDefault(x => x.Status == cartridgeStatus);

                    if (model != null)
                    {
                        model.Status = cartridgeStatus;
                    }
                }
            }

            foreach (var cartridgeModel in Cartridges)
            {
                cartridgeModel.Invalidate();
            }

            IsInkFillingOrWasteEmptying = Cartridges.Any(x => x.Status.State == CartridgeState.Filling || x.Status.State == CartridgeState.Emptying);
        }

        /// <summary>
        /// Called when the instance of IPPCView is available.
        /// </summary>
        public override void OnViewAttached()
        {

        }

        public override void OnApplicationReady()
        {
            base.OnApplicationReady();
            MachineProvider.MachineOperator.StatusChanged += MachineOperator_StatusChanged;
        }

        private void MachineOperator_StatusChanged(object sender, MachineStatuses e)
        {
            InvokeUI(() =>
            {
                PowerOffCommand.RaiseCanExecuteChanged();
                ResetCommand.RaiseCanExecuteChanged();
                StandByCommand.RaiseCanExecuteChanged();
            });
        }

        #endregion

        #region Public Methods

        /// <summary>
        /// Toggles the application technician mode.
        /// </summary>
        public void ToggleTechnicianMode()
        {
            if (!ApplicationManager.IsInTechnicianMode)
            {
                ApplicationManager.EnterTechnicianMode();
            }
            else
            {
                ApplicationManager.ExitTechnicianMode();
            }
        }

        #endregion

        #region Event Handlers

        /// <summary>
        /// Handles the PrintingStarted event of the MachineOperator.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="PrintingEventArgs"/> instance containing the event data.</param>
        private void MachineOperator_PrintingStarted(object sender, PrintingEventArgs e)
        {
            _jobHandler = e.JobHandler;
        }

        #endregion
    }
}