diff options
Diffstat (limited to 'Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryJobStatusSource.cs')
| -rw-r--r-- | Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryJobStatusSource.cs | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryJobStatusSource.cs b/Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryJobStatusSource.cs new file mode 100644 index 000000000..93a5cc54e --- /dev/null +++ b/Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryJobStatusSource.cs @@ -0,0 +1,133 @@ +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<TelemetryAvailableEventArgs> 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(); + } + } +} |
