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; using System.ComponentModel; using RealTimeGraphX.WPF; using RealTimeGraphX.DataPoints; using Tango.PPC.UI.Graphs; namespace Tango.PPC.UI.ViewModels { public class MachineStatusViewVM : PPCViewModel { public enum StatisticTab { [Description("Production Data")] Productiondata = 0, [Description("Temperature")] Temperature = 1, [Description("Pressure")] Pressure = 2, [Description("Motor")] Motor = 3 } #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(); InvalidateRelayCommands(); } } 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(); } } private JerricanLevelModel _midTankLubLevel; public JerricanLevelModel MidTankLubLevel { get { return _midTankLubLevel; } set { _midTankLubLevel = 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(); } } public MachineOverviewErrorStates MachineErrorStates { get; set; } private bool _isExpandedNotificatios; public bool IsExpandedNotifications { get { return _isExpandedNotificatios; } set { _isExpandedNotificatios = value; RaisePropertyChangedAuto();} } private int _selectedStatisticTabIndex; /// /// Gets or sets the index of the selected category. /// public int SelectedStatisticTabIndex { get { return _selectedStatisticTabIndex; } set { if (_selectedStatisticTabIndex != value) { _selectedStatisticTabIndex = value; RaisePropertyChangedAuto(); switch (_selectedStatisticTabIndex) { case 0: { SelectedStatisticTab = StatisticTab.Productiondata; break; } case 1: { SelectedStatisticTab = StatisticTab.Temperature; break; } case 2: { SelectedStatisticTab = StatisticTab.Pressure; break; } case 3: { SelectedStatisticTab = StatisticTab.Motor; break; } } } } } private StatisticTab _selectedStatisticTab; /// /// Gets or sets the selected category. /// /// public StatisticTab SelectedStatisticTab { get { return _selectedStatisticTab; } set { if (_selectedStatisticTab != value) { _selectedStatisticTab = value; RaisePropertyChangedAuto(); } _selectedStatisticTabIndex = _selectedStatisticTab.ToInt32(); RaisePropertyChanged(nameof(SelectedStatisticTabIndex)); } } public WpfGraphController JobController { get; set; } #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, () => IsEnableGoToJob()); 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(); MachineErrorStates = new MachineOverviewErrorStates(); IsExpandedNotifications = false; SelectedStatisticTabIndex = 0; JobController = CreateController(CreateSeries("Total", GraphHelper.GraphColor.Green)); } public override void OnApplicationReady() { base.OnApplicationReady(); EventLogger.EventReceived += EventLogger_EventReceived; MidTankLevels = MachineProvider.Machine.Configuration.NoneEmptyIdsPacks.Where(x => x.MidTankType.HasLevelMeasure ).OrderBy(x => x.PackIndex).Select(x => new JerricanLevelModel() { Max = x.MidTankType.LiterCapacity, IDSPack = x, }).OrderBy(y => y.IDSPack.LiquidType.Type).ToList(); var LubLevel = MachineProvider.Machine.Configuration.NoneEmptyIdsPacks.Where(x => x.MidTankType.Type == MidTankTypes.LubricantMidTank).FirstOrDefault(); MidTankLubLevel = new JerricanLevelModel(); if(LubLevel != null) { MidTankLubLevel.Max = LubLevel.MidTankType.LiterCapacity; MidTankLubLevel.IDSPack = LubLevel; }; MachineProvider.MachineOperator.MachineStatusChanged += MachineOperator_MachineStatusChanged; } #region Events private void EventLogger_EventReceived(object sender, MachinesEvent ev) { InvokeUI(() => { if (ev.Category == EventTypeCategories.Error || ev.Category == EventTypeCategories.Critical) { IsExpandedNotifications = true; } }); } private void MachineOperator_MachineStatusChanged(object sender, MachineStatus status) { UpdateMidTankLevels(status); UpdateMachineStatusErrors(status); } private void UpdateMidTankLevels(MachineStatus status) { if (!IsJobStatusViewEnable) { foreach (var item in status.IDSPacksLevels) { JerricanLevelModel model = null; if (item.Index == 8)//lub { model = MidTankLubLevel; } else { 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 UpdateMachineStatusErrors(MachineStatus status) { var windersInError = status.WindersInError.ToList();// to test MachineErrorStates.UpdateWinders(windersInError); var dansersInError = status.DancersInError.ToList(); MachineErrorStates.UpdateDancers(dansersInError); var btsrsInErrors = status.BtsrsInError.ToList(); MachineErrorStates.UpdateBTSRs(btsrsInErrors); } 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 currentSegmentIndex = Math.Max(_runningJobStatus.CurrentSegment.SegmentIndex - (Job.Segments.Count * RunningJobStatus.CurrentUnit), 0); var segment = Job.Segments.FirstOrDefault(x => x.SegmentIndex == currentSegmentIndex); // 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 = RunningJobStatus.CurrentSegment.FirstBrushStop; } } private void JobHandler_CanCancelChanged(object sender, EventArgs e) { InvokeUI(() => { IsEnabledStopButton = _handler.CanCancel; StopCommand.RaiseCanExecuteChanged(); AbortCommand.RaiseCanExecuteChanged(); }); } #endregion #region Methods private bool IsEnableGoToJob() { return Job != null && _handler != null; } 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; } } private WpfGraphController CreateController(params WpfGraphDataSeries[] seriesCollection) { var controller = new WpfGraphController(); foreach (var series in seriesCollection) { controller.DataSeriesCollection.Add(series); } controller.Range.AutoY = true; controller.Range.MaximumY = 100; controller.Range.MinimumY = 0; controller.Range.MaximumX = new DateTime(0).AddMinutes(30); controller.RefreshRate = TimeSpan.FromMilliseconds(300000);//5 min return controller; } private WpfGraphDataSeries CreateSeries(String name, GraphHelper.GraphColor fill) { WpfGraphDataSeries series = new WpfGraphDataSeries(); series.Name = name; series.Fill = GraphHelper.GetGraphBrush(fill); series.StrokeThickness = 1; series.Stroke = GraphHelper.GetGraphStrokeColor(); return series; } #endregion } }