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; using Tango.PPC.UI.AppBarItems; 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 PowerUpAppBarItem _powerUpAppBar; private bool _started; 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.FirmwareStarted += MachineOperator_FirmwareStarted; MachineProvider.MachineOperator.ThreadLoadingStatusChanged += MachineOperator_ThreadLoadingStatusChanged; MachineProvider.MachineOperator.ThreadLoadingConfirmationRequired += MachineOperator_ThreadLoadingConfirmationRequired; MachineProvider.MachineOperator.PowerUpStarted += MachineOperator_PowerUpStarted; MachineProvider.MachineOperator.PowerUpProgress += MachineOperator_PowerUpProgress; MachineProvider.MachineOperator.PowerUpEnded += MachineOperator_PowerUpEnded; } #region Power Up private void MachineOperator_PowerUpEnded(object sender, EventArgs e) { _started = false; _powerUpAppBar?.Close(); _powerUpAppBar = null; } private void MachineOperator_PowerUpProgress(object sender, PMR.Power.StartPowerUpResponse status) { if (_powerUpAppBar != null) { _powerUpAppBar.Status = status; } } private void MachineOperator_PowerUpStarted(object sender, PMR.Power.StartPowerUpResponse e) { _started = true; InvokeUI(() => { if (_powerUpAppBar != null) { _powerUpAppBar.Close(); } if (_started) { _powerUpAppBar = NotificationProvider.PushAppBarItem(); _powerUpAppBar.Priority = AppBarPriority.Low; } }); } #endregion #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_FirmwareStarted(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); } #endregion } }