using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Tango.BL.Entities; using Tango.Integration.Operation; using Tango.Telemetry.Telemetries; namespace Tango.Telemetry.Sources { public class TelemetryJobStatusSource : ITelemetryStreamingSource { private IMachineOperator _machineOperator; private Job _job; private TelemetryJobStatus _lastStatus; private String _groupID; private DateTime _startTime; public bool IsStarted { get; private set; } public string Name { get; } = "Job Status Streaming"; public bool RequiresTelemetryDuplicationTracking { get; } public event EventHandler TelemetryAvailable; public TelemetryJobStatusSource(IMachineOperator machineOperator) { _machineOperator = machineOperator; } public void Start() { if (!IsStarted) { IsStarted = true; _machineOperator.PrintingStarted += MachineOperator_PrintingStarted; } } public void Stop() { if (IsStarted) { IsStarted = false; _machineOperator.PrintingStarted -= MachineOperator_PrintingStarted; } } private void MachineOperator_PrintingStarted(object sender, PrintingEventArgs e) { if (e.JobHandler != null) { _groupID = Guid.NewGuid().ToString(); _job = e.Job; _startTime = DateTime.UtcNow; e.JobHandler.StatusChanged += JobHandler_StatusChanged; e.JobHandler.Failed += JobHandler_Failed; } } private void JobHandler_StatusChanged(object sender, RunningJobStatus status) { if (IsStarted) { TelemetryJobStatus tStatus = new TelemetryJobStatus(); tStatus.JobName = _job?.Name; if (status.ProgressMinusSettingUp > 0) { tStatus.Status = TelemetryJobStatus.JobStatus.InProgress; } if (status.IsCompleted) { tStatus.Status = TelemetryJobStatus.JobStatus.Completed; } if (status.IsFailed) { tStatus.Status = TelemetryJobStatus.JobStatus.Failed; } if (status.IsCanceled) { tStatus.Status = TelemetryJobStatus.JobStatus.Aborted; } tStatus.ID = _groupID; tStatus.TotalTime = status.TotalTime; tStatus.RemainingTime = status.RemainingTime; tStatus.Progress = status.ProgressMinusSettingUp; tStatus.TotalProgress = status.TotalProgressMinusSettingUp; tStatus.CurrentUnit = status.CurrentUnit; tStatus.RemainingUnits = status.RemainingUnits; tStatus.CurrentUnitProgress = status.CurrentUnitProgress; tStatus.CurrentUnitTotalProgress = status.CurrentUnitTotalProgress; tStatus.Message = status.Message; _lastStatus = tStatus; TelemetryAvailable?.Invoke(this, new TelemetryAvailableEventArgs() { TelemetryObject = tStatus, DisableDeliveryRetries = true }); } } private void JobHandler_Failed(object sender, Exception e) { if (_lastStatus != null) { _lastStatus.Message = e.FlattenMessage(); TelemetryAvailable?.Invoke(this, new TelemetryAvailableEventArgs() { TelemetryObject = _lastStatus, DisableDeliveryRetries = true }); } } public void Dispose() { Stop(); } } }