using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Tango.BL.Entities; using Tango.BL.Enumerations; using Tango.Core.Commands; using Tango.Core.DI; using Tango.Integration.Operation; using Tango.PMR.Diagnostics; using Tango.PMR.MachineStatus; using Tango.PPC.Common; using Tango.PPC.Common.Diagnostics; using Tango.PPC.Jobs; using Tango.PPC.Jobs.NavigationObjects; using Tango.PPC.Jobs.Views; using Tango.PPC.UI.Models; using System.Timers; using System.Windows.Threading; using System.Diagnostics; using Tango.PMR.Printing; namespace Tango.PPC.UI.ViewModels { public class MachineStatusViewVM : PPCViewModel { #region Properties [TangoInject] public IDiagnosticsFrameProvider DefaultDiagnosticsFrameProvider { get; set; } private JobHandler _handler; private Job _job; /// /// Gets or sets the job. /// public Job Job { get { return _job; } set { _job = value; if (_job == null) IsDyeingProcess = false; RaisePropertyChangedAuto(); } } private RunningJobStatus _runningJobStatus; /// /// Gets or sets the running job status. /// public RunningJobStatus RunningJobStatus { get { return _runningJobStatus; } set { _runningJobStatus = value; RaisePropertyChangedAuto(); } } private bool _isJobStatusViewEnable; public bool IsJobStatusViewEnable { get { return _isJobStatusViewEnable; } set { _isJobStatusViewEnable = value; RaisePropertyChangedAuto(); } } private bool _isEnabledStopButton; /// /// Gets or sets a value indicating whether this instance is enabled stop button. /// public bool IsEnabledStopButton { get { return _isEnabledStopButton; } set { _isEnabledStopButton = value; RaisePropertyChangedAuto(); } } private bool _isSpoolView; /// /// Gets or sets a value indicating whether this instance is spool view. /// public bool IsSpoolView { get { return _isSpoolView; } set { _isSpoolView = value; RaisePropertyChangedAuto(); } } private bool _isWeightView; /// /// Gets or sets a value indicating whether this instance is length. Show indicator values in length or weight. /// public bool IsWeghtView { get { return _isWeightView; } set { _isWeightView = value; RaisePropertyChangedAuto(); } } private bool _isDyeingProcess; public bool IsDyeingProcess { get { return _isDyeingProcess; } set { if (_isDyeingProcess != value) { _isDyeingProcess = value; RaisePropertyChangedAuto(); } } } private BrushStop _currentBrushStop; public BrushStop CurrentBrushStop { get { return _currentBrushStop; } set { // if (_currentBrushStop != value) { _currentBrushStop = value; OnUpdateCurrentBrush(); RaisePropertyChangedAuto(); } } } public JobBrushStop JobBrushStop { get; set; } public double CyanOutput { get { return GetVolumeLiquidType(LiquidTypes.Cyan); } } public double MagentaOutput { get { return GetVolumeLiquidType(LiquidTypes.Magenta); } } public double YellowOutput { get { return GetVolumeLiquidType(LiquidTypes.Yellow); } } public double BlackOutput { get { return GetVolumeLiquidType(LiquidTypes.Black); } } public double LightCyanOutput { get { return GetVolumeLiquidType(LiquidTypes.LightCyan); } } public double LightMagentaOutput { get { return GetVolumeLiquidType(LiquidTypes.LightMagenta); } } public double LightYellowOutput { get { return GetVolumeLiquidType(LiquidTypes.LightYellow); } } //public double TransparentInkOutput //{ // get { return GetVolumeLiquidType(LiquidTypes.TransparentInk); } //} //public double LubricantOutput //{ // get { return GetVolumeLiquidType(LiquidTypes.Lubricant); } //} private List _midTankLevels; public List MidTankLevels { get { return _midTankLevels; } set { _midTankLevels = value; RaisePropertyChangedAuto(); } } public MachineOverviewModel OverviewModel { get; set; } private bool _isDisplayJobOutline; /// /// Gets or sets a value indicating whether to display the job outline. /// public bool IsDisplayJobOutline { get { return _isDisplayJobOutline; } set { _isDisplayJobOutline = value; RaisePropertyChangedAuto(); } } private JobTicket _jobOutlineTicket; /// /// Gets or sets the job outline ticket. /// public JobTicket JobOutlineTicket { get { return _jobOutlineTicket; } set { _jobOutlineTicket = value; RaisePropertyChangedAuto(); } } #endregion #region Commands public RelayCommand StopCommand { get; set; } public RelayCommand AbortCommand { get; set; } public RelayCommand GoToJobCommand { get; set; } /// /// Gets or sets the job status view command. /// public RelayCommand JobStatusViewCommand { get; set; } /// /// Gets or sets the overview view command. /// public RelayCommand OverviewViewCommand { get; set; } public RelayCommand ClearAllNotificationsCommand { get; set; } public RelayCommand DisplayJobOutlineCommand { get; set; } public RelayCommand HideJobOutlineCommand { get; set; } #endregion public MachineStatusViewVM() { StopCommand = new RelayCommand(StopJob, () => CanStopped()); AbortCommand = new RelayCommand(AbortJob, () => CanStopped()); GoToJobCommand = new RelayCommand(GoToJob); JobStatusViewCommand = new RelayCommand(JobStatusView); OverviewViewCommand = new RelayCommand(OverviewView); ClearAllNotificationsCommand = new RelayCommand(ClearAllNotifications); DisplayJobOutlineCommand = new RelayCommand(DisplayJobOutline); HideJobOutlineCommand = new RelayCommand(HideJobOutline); IsJobStatusViewEnable = true; IsEnabledStopButton = false; IsSpoolView = false; IsWeghtView = false; OverviewModel = new MachineOverviewModel(); } public override void OnApplicationReady() { base.OnApplicationReady(); MidTankLevels = MachineProvider.Machine.Configuration.NoneEmptyIdsPacks.Where(x => x.MidTankType.HasLevelMeasure || x.MidTankType.Type == MidTankTypes.LubricantMidTank).OrderBy(x => x.PackIndex).Select(x => new JerricanLevelModel() { Max = x.MidTankType.LiterCapacity, IDSPack = x, }).OrderBy(y => y.IDSPack.LiquidType.PreferredIndex).ToList(); MachineProvider.MachineOperator.MachineStatusChanged += MachineOperator_MachineStatusChanged; } #region Events private void MachineOperator_MachineStatusChanged(object sender, MachineStatus status) { UpdateMidTankLevels(status); } private void UpdateMidTankLevels(MachineStatus status) { if (!IsJobStatusViewEnable) { foreach (var item in status.IDSPacksLevels) { var model = MidTankLevels.SingleOrDefault(x => x.IDSPack.PackIndex == item.Index); if (model != null) { model.Level = item.MidTankLevel; model.JerricanPresent = item.JerricanPresent; model.FillingTimeoutError = item.FillingTimeoutError; model.MidTankEmpty = item.MidTankEmpty; model.MidTankRefillPumpActive = item.MidTankRefillPumpActive; model.RemainingTimeoutError = TimeSpan.FromSeconds(item.TimerRemainingSeconds); } //TEST //if (model != null) //{ // var Li = model.IDSPack.LiquidType.Type; // var Mid = model.IDSPack.MidTankType.Type; // model.Level = 0.0; //model.JerricanPresent = false; //model.FillingTimeoutError = false; //model.MidTankEmpty = true; //model.MidTankRefillPumpActive = false; //model.RemainingTimeoutError = TimeSpan.FromSeconds(300); //if (item.Index == 1) //{ // model.Level = 1.0; //} //if (item.Index == 2) //{ // model.Level = 2.0; //} //if (item.Index == 3) //{ // model.Level = 3.0; //} //if (item.Index == 4)//TI //{ // model.Level = 7.0; //} //if (item.Index == 5)//LC //{ // model.Level = 7.0; //} //if (item.Index == 6)//LM //{ // model.Level = 3.5; //} //if (item.Index == 7)//LY //{ // model.Level = 2.5; //} // if (item.Index == 8)//Lub // { // model.Level = 1.5; // } // if (item.Index ==9) // { // model.Level = 4.99; // } //} ////////////////////////////// } } } private void MachineOperator_InkFillingStatusChanged(object sender, InkFillingStatusChangedEventArgs e) { //foreach (var cartridge in e.Status.CartridgesStatuses.Where(x => x.Cartridge.Slot != CartridgeSlot.Ink)) //{ // var wasteState = WasteStates.SingleOrDefault(x => x.Slot == cartridge.Cartridge.Slot); // if (wasteState != null) // { // wasteState.State = cartridge.State; // } //} } #endregion #region printing public override void OnApplicationStarted() { MachineProvider.MachineOperator.PrintingStarted += MachineOperator_PrintingStarted; MachineProvider.MachineOperator.PrintingEnded += MachineOperator_PrintingEnded; DefaultDiagnosticsFrameProvider.FrameReceived += DefaultDiagnosticsFrameProvider_FrameReceived; } private void DefaultDiagnosticsFrameProvider_FrameReceived(object sender, PMR.Diagnostics.StartDiagnosticsResponse e) { OverviewModel.Update(e, this.Job != null ? Job.Rml : null, null); } private void MachineOperator_PrintingStarted(object sender, PrintingEventArgs e) { _handler = e.JobHandler; Job = e.Job; e.JobHandler.StatusChanged += JobHandler_StatusChanged; //e.JobHandler.SpoolChangeRequired += JobHandler_SpoolChangeRequired; e.JobHandler.Stopped += JobHandler_Stopped; e.JobHandler.CanCancelChanged += JobHandler_CanCancelChanged; InvokeUI(() => { IsEnabledStopButton = true; StopCommand.RaiseCanExecuteChanged(); AbortCommand.RaiseCanExecuteChanged(); }); } private void JobHandler_Stopped(object sender, EventArgs e) { if (_handler != null) { _handler.StatusChanged -= JobHandler_StatusChanged; //_handler.SpoolChangeRequired -= JobHandler_SpoolChangeRequired; _handler.Stopped -= JobHandler_Stopped; _handler.StatusChanged -= JobHandler_StatusChanged; _handler.CanCancelChanged -= JobHandler_CanCancelChanged; } } private void MachineOperator_PrintingEnded(object sender, PrintingEventArgs e) { LogManager.Log("Printing ended"); InvokeUI(() => { IsEnabledStopButton = false; StopCommand.RaiseCanExecuteChanged(); AbortCommand.RaiseCanExecuteChanged(); }); } private void JobHandler_StatusChanged(object sender, RunningJobStatus e) { RunningJobStatus = e; IsDyeingProcess = (RunningJobStatus != null && RunningJobStatus.CurrentSegment != null); if (RunningJobStatus != null && RunningJobStatus.CurrentSegment != null) { var segment = Job.Segments.FirstOrDefault(x => x.SegmentIndex == _runningJobStatus.CurrentSegment.SegmentIndex); if (segment != null) { if (_handler.JobTicket.Segments.Count > 0) { JobBrushStop = _handler.JobTicket.Segments[Job.OrderedSegments.IndexOf(segment)].BrushStops.First(); } CurrentBrushStop = segment.FirstBrushStop; } } } private void JobHandler_CanCancelChanged(object sender, EventArgs e) { InvokeUI(() => { IsEnabledStopButton = _handler.CanCancel; StopCommand.RaiseCanExecuteChanged(); AbortCommand.RaiseCanExecuteChanged(); }); } #endregion #region Methods private void GoToJob() { NavigationManager.NavigateWithObject(new JobNavigationObject() { Job = _handler.Job }); NavigationManager.ClearHistoryExcept(); } /// /// Toggles the application technician mode. /// public void ToggleTechnicianMode() { if (!ApplicationManager.IsInTechnicianMode) { ApplicationManager.EnterTechnicianMode(); } else { ApplicationManager.ExitTechnicianMode(); } } protected void JobStatusView() { IsJobStatusViewEnable = true; } protected void OverviewView() { IsJobStatusViewEnable = false; } private double GetVolumeLiquidType(LiquidTypes liquidType) { if (JobBrushStop != null && JobBrushStop.Dispensers != null && JobBrushStop.Dispensers.Count > 0) { var lt = JobBrushStop.Dispensers.FirstOrDefault(x => x.DispenserLiquidType == (DispenserLiquidType)liquidType); if (lt != null) { return Math.Round(lt.Volume, 2); } } return 0; } private bool CanStopped() { return IsEnabledStopButton; } private void StopJob() { _handler?.Cancel(); } private void AbortJob() { _handler?.Cancel(); Job = null; } protected void ClearAllNotifications() { NotificationProvider.NotificationItems.Where(x => x.CanClose).ToList().ForEach(y => NotificationProvider.PopNotification(y)); } protected void OnUpdateCurrentBrush() { RaisePropertyChanged(nameof(CyanOutput)); RaisePropertyChanged(nameof(LightCyanOutput)); RaisePropertyChanged(nameof(MagentaOutput)); RaisePropertyChanged(nameof(LightMagentaOutput)); RaisePropertyChanged(nameof(YellowOutput)); RaisePropertyChanged(nameof(LightYellowOutput)); RaisePropertyChanged(nameof(BlackOutput)); } private void HideJobOutline() { IsDisplayJobOutline = false; } private void DisplayJobOutline() { if(_handler != null && _handler.JobTicket != null) { JobOutlineTicket = _handler.JobTicket; IsDisplayJobOutline = true; } } #endregion } }