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;
using Tango.PPC.Common.Notifications.NotificationItems;
using Tango.Core.Commands;
using System.Timers;
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 MessageNotificationItem _headTypeNotification;
private Timer _screenSaverTimer;
private DateTime _currentDateTime;
///
/// Gets or sets the current date time.
///
public DateTime CurrentDateTime
{
get { return _currentDateTime; }
set { _currentDateTime = value; RaisePropertyChangedAuto(); }
}
private bool _isScreenSaverOn;
public bool IsScreenSaverOn
{
get { return _isScreenSaverOn; }
set { _isScreenSaverOn = value; RaisePropertyChangedAuto(); }
}
public RelayCommand ScreenSaverExitCommand { get; set; }
public MainViewVM()
{
_date_timer = new DispatcherTimer();
_date_timer.Interval = TimeSpan.FromSeconds(1);
_date_timer.Tick += _date_timer_Tick;
_date_timer.Start();
_headTypeNotification = new MessageNotificationItem();
_headTypeNotification.CanClose = false;
_headTypeNotification.MessageType = MessageNotificationItem.MessageNotificationItemTypes.Error;
_headTypeNotification.Priority = NotificationItem.NotificationPriority.Critical;
_headTypeNotification.Message = "Machine head type mismatch.";
ScreenSaverExitCommand = new RelayCommand(ResetScreenSaverTimer);
_screenSaverTimer = new Timer(TimeSpan.FromMinutes(Settings.ScreenSaverStartDuration).TotalMilliseconds);
}
///
/// 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;
MachineProvider.MachineConnected += MachineProvider_MachineConnected;
MachineProvider.MachineOperator.WasteReplacementRequired += MachineOperator_WasteReplacementRequired;
_screenSaverTimer.Elapsed += _screenSaverTimer_Elapsed;
_screenSaverTimer.Start();
}
#region Waste Replacement
private void MachineOperator_WasteReplacementRequired(object sender, EventArgs e)
{
InvokeUI(async () =>
{
var vm = await NotificationProvider.ShowDialog();
if (MachineProvider.IsConnected)
{
await MachineProvider.MachineOperator.CompleteWasteReplacement(vm.DialogResult);
}
});
}
#endregion
#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()).OrderBy(x => x.FinalName).ToList();
}
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
#region Head Type Check
private void MachineProvider_MachineConnected(object sender, EventArgs e)
{
ResetScreenSaverTimer();
NotificationProvider.PopNotification(_headTypeNotification);
if (MachineProvider.MachineOperator.DeviceInformation != null && !MachineProvider.Machine.IsDemo)
{
if (MachineProvider.Machine.HeadType != (int)MachineProvider.MachineOperator.DeviceInformation.HeadType)
{
_headTypeNotification.ExpandedMessage = $"Machine configuration reports head type '{MachineProvider.Machine.MachineHeadType}' while firmware device reports '{MachineProvider.MachineOperator.DeviceInformation.HeadType}'.";
NotificationProvider.PushNotification(_headTypeNotification);
}
}
}
#endregion
#region Screen Saver
public void ResetScreenSaverTimer()
{
_screenSaverTimer.Stop();
_screenSaverTimer.Start();
IsScreenSaverOn = false;
}
private void _screenSaverTimer_Elapsed(object sender, ElapsedEventArgs e)
{
_screenSaverTimer.Interval = TimeSpan.FromMinutes(Settings.ScreenSaverStartDuration).TotalMilliseconds;
if (Settings.EnableScreenSaver && !MachineProvider.IsConnected)
{
IsScreenSaverOn = true;
}
}
#endregion
}
}