using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Threading; using Tango.BL; using Tango.BL.Builders; using Tango.BL.Entities; using Tango.Core.DI; using Tango.Integration.ExternalBridge; using Tango.Integration.Operation; using Tango.PPC.Common; using Tango.PPC.Common.Application; using Tango.PPC.Common.Authentication; using Tango.PPC.Common.ExternalBridge; using Tango.PPC.Common.Modules; using Tango.PPC.Common.Navigation; using Tango.PPC.Common.Notifications; using Tango.PPC.Common.WatchDog; using Tango.PPC.UI.Dialogs; using Tango.SharedUI; using System.Data.Entity; namespace Tango.PPC.UI.ViewModels { /// /// Represents the PPC main view model. /// /// public class MainViewVM : PPCViewModel { private DispatcherTimer _date_timer; private bool _isPowerUpDialogShown; private bool _isThreadLoadingShown; private DateTime _currentDateTime; /// /// Gets or sets the current date time. /// public DateTime CurrentDateTime { get { return _currentDateTime; } set { _currentDateTime = value; RaisePropertyChangedAuto(); } } public MainViewVM() { _date_timer = new DispatcherTimer(); _date_timer.Interval = TimeSpan.FromSeconds(1); _date_timer.Tick += _date_timer_Tick; _date_timer.Start(); } /// /// Called when the application has been started. /// public override void OnApplicationStarted() { } public override void OnApplicationReady() { base.OnApplicationReady(); MachineProvider.MachineOperator.CartridgeValidationRequestReceived += MachineOperator_CartridgeValidationRequestReceived; MachineProvider.MachineOperator.PowerUpStarted += MachineOperator_PowerUpStarted; MachineProvider.MachineOperator.ThreadLoadingStatusChanged += MachineOperator_ThreadLoadingStatusChanged; MachineProvider.MachineOperator.ThreadLoadingConfirmationRequired += MachineOperator_ThreadLoadingConfirmationRequired; } #region Event Handlers /// /// Handles the Tick event of the _date_timer. /// /// The source of the event. /// The instance containing the event data. private void _date_timer_Tick(object sender, EventArgs e) { CurrentDateTime = DateTime.Now; } private void MachineOperator_CartridgeValidationRequestReceived(object sender, CartridgeValidationEventArgs e) { InvokeUI(async () => { var vm = await NotificationProvider.ShowDialog(new CartridgeValidationViewVM() { IDSPacks = MachineProvider.Machine.Configuration.NoneEmptyIdsPacks.ToList(), }); if (vm.DialogResult) { e.Approve(vm.SelectedIDSPack.PackIndex); } else { e.Decline(); } }); } private async void MachineOperator_PowerUpStarted(object sender, EventArgs e) { if (_isPowerUpDialogShown) { LogManager.Log("Power up detected but power up dialog is already shown. Skipping..."); return; } LogManager.Log("Power up detected, showing power up screen..."); if (!Settings.DisplayPowerUpScreen) { LogManager.Log("Power up screen disabled. skipping..."); return; } PowerUpViewVM vm; try { LogManager.Log("Loading site rmls..."); List rmls = new List(); using (ObservablesContext db = ObservablesContext.CreateDefault()) { rmls = await new RmlsCollectionBuilder(db).SetAll().ForHeadType(MachineProvider.Machine.MachineHeadType).ForSite(MachineProvider.Machine.SiteGuid).BuildListAsync(); } var selectedRml = rmls.SingleOrDefault(x => x.Guid == Settings.LoadedRmlGuid); vm = new PowerUpViewVM(); vm.Rmls = rmls; vm.SelectedRml = selectedRml != null ? selectedRml : rmls.FirstOrDefault(); vm.IsSelectedRml = selectedRml != null; } catch (Exception ex) { LogManager.Log(ex, "Error initializing power up screen."); return; } InvokeUI(async () => { _isPowerUpDialogShown = true; await NotificationProvider.ShowDialog(vm); _isPowerUpDialogShown = false; await Task.Factory.StartNew(() => { LogManager.Log("Power up screen closed."); try { using (ObservablesContext db = ObservablesContext.CreateDefault()) { List processTables = new List(); if (vm.IsSelectedRml) { LogManager.Log($"Selected rml '{vm.SelectedRml.Name}'..."); processTables = new RmlBuilder(db).Set(vm.SelectedRml.Guid).WithActiveParametersGroup().Build().GetActiveProcessGroup().ProcessParametersTables.ToList(); } else { LogManager.Log("Selected minimal temperature..."); var rmlsToAvg = new RmlsCollectionBuilder(db).SetAll().ForHeadType(MachineProvider.Machine.MachineHeadType).ForSite(MachineProvider.Machine.SiteGuid).WithActiveParametersGroup().Build(); processTables = rmlsToAvg.Select(x => x.GetActiveProcessGroup()).SelectMany(x => x.ProcessParametersTables).ToList(); } var processToLoad = processTables.OrderBy(x => x.GetAverageTemperature()).First(); LogManager.Log($"Selected process parameters:\nRML: {processToLoad.ProcessParametersTablesGroup.Rml.Name}\nGroup: {processToLoad.ProcessParametersTablesGroup.Name}\nProcess Table: {processToLoad.Name}"); LogManager.Log("Uploading process parameters..."); var r = MachineProvider.MachineOperator.UploadProcessParameters(processToLoad).Result; Settings.LoadedRmlGuid = vm.IsSelectedRml ? vm.SelectedRml.Guid : null; Settings.Save(); } } catch (Exception ex) { LogManager.Log(ex, "Error occurred while trying to get and upload the proper process parameters after power screen closed."); } }); }); } private void MachineOperator_ThreadLoadingStatusChanged(object sender, PMR.ThreadLoading.StartThreadLoadingResponse e) { if (e.State == PMR.ThreadLoading.ThreadLoadingState.Preparing) { DisplayThreadLoading(); } } private void MachineOperator_ThreadLoadingConfirmationRequired(object sender, ThreadLoadingConfirmationRequiredEventArgs e) { DisplayThreadLoading(e); } private async void DisplayThreadLoading(ThreadLoadingConfirmationRequiredEventArgs confirmationArgs = null) { if (_isThreadLoadingShown) return; _isThreadLoadingShown = true; LogManager.Log("Thread loading preparation/finalization detected, showing thread loading screen..."); if (!Settings.DisplayAutomaticThreadLoadingScreen) { _isThreadLoadingShown = false; LogManager.Log("Thread loading screen disabled. skipping..."); return; } ThreadLoadingViewVM vm; try { LogManager.Log("Loading site rmls..."); List rmls = new List(); using (ObservablesContext db = ObservablesContext.CreateDefault()) { rmls = await new RmlsCollectionBuilder(db).SetAll().ForHeadType(MachineProvider.Machine.MachineHeadType).ForSite(MachineProvider.Machine.SiteGuid).WithActiveParametersGroup().BuildListAsync(); } var selectedRml = rmls.SingleOrDefault(x => x.Guid == Settings.LoadedRmlGuid); if (confirmationArgs == null) { vm = new ThreadLoadingViewVM(MachineProvider); } else { vm = new ThreadLoadingViewVM(MachineProvider, confirmationArgs); } vm.Rmls = rmls; vm.SelectedRml = selectedRml != null ? selectedRml : rmls.FirstOrDefault(); } catch (Exception ex) { _isThreadLoadingShown = false; LogManager.Log(ex, "Error initializing thread loading screen."); return; } InvokeUI(async () => { await NotificationProvider.ShowDialog(vm); _isThreadLoadingShown = false; LogManager.Log("Thread loading screen closed."); if (!vm.DialogResult) { LogManager.Log("Thread loading screen aborted by user. No operation was performed."); return; } try { if (vm.Result.IsCompleted) { await NotificationProvider.ShowSuccess("Thread loading completed successfully."); } else { await NotificationProvider.ShowError($"Thread loading failed due to the following reason:\n{vm.Result.FailedException.FlattenException()}"); } if (vm.SelectedRml != null) { Settings.LoadedRmlGuid = vm.SelectedRml.Guid; Settings.Save(); } } catch (Exception ex) { LogManager.Log(ex, "Error occurred after thread loading screen closed."); } }); } #endregion } }