aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio
diff options
context:
space:
mode:
Diffstat (limited to 'Software/Visual_Studio')
-rw-r--r--Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryJobStatusSource.cs133
-rw-r--r--Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryLogsStreamingSourceConfig.cs4
-rw-r--r--Software/Visual_Studio/Tango.Telemetry/Tango.Telemetry.csproj2
-rw-r--r--Software/Visual_Studio/Tango.Telemetry/Telemetries/TelemetryJobRun.cs2
-rw-r--r--Software/Visual_Studio/Tango.Telemetry/Telemetries/TelemetryJobStatus.cs50
-rw-r--r--Software/Visual_Studio/Tango.Telemetry/TelemetryAvailableEventArgs.cs2
-rw-r--r--Software/Visual_Studio/Tango.Telemetry/TelemetryPublishPackage.cs1
-rw-r--r--Software/Visual_Studio/Tango.Telemetry/TelemetryPublisher.cs29
-rw-r--r--Software/Visual_Studio/Utilities/Tango.Telemetry.Tester.IOT.CLI/Program.cs105
9 files changed, 305 insertions, 23 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();
+ }
+ }
+}
diff --git a/Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryLogsStreamingSourceConfig.cs b/Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryLogsStreamingSourceConfig.cs
index 1de30976a..440843003 100644
--- a/Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryLogsStreamingSourceConfig.cs
+++ b/Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryLogsStreamingSourceConfig.cs
@@ -10,11 +10,11 @@ namespace Tango.Telemetry.Sources
{
public class TelemetryLogsStreamingSourceConfig : SettingsBase
{
- public List<LogCategory> Categories { get; set; }
+ public HashSet<LogCategory> Categories { get; set; }
public TelemetryLogsStreamingSourceConfig()
{
- Categories = new List<LogCategory>() { LogCategory.Error, LogCategory.Critical, LogCategory.Warning };
+ Categories = new HashSet<LogCategory>() { LogCategory.Error, LogCategory.Critical, LogCategory.Warning };
}
}
}
diff --git a/Software/Visual_Studio/Tango.Telemetry/Tango.Telemetry.csproj b/Software/Visual_Studio/Tango.Telemetry/Tango.Telemetry.csproj
index e53d2e99e..80c49ccfa 100644
--- a/Software/Visual_Studio/Tango.Telemetry/Tango.Telemetry.csproj
+++ b/Software/Visual_Studio/Tango.Telemetry/Tango.Telemetry.csproj
@@ -272,12 +272,14 @@
<Compile Include="Sources\TelemetryJobRunsHistorySourceConfig.cs" />
<Compile Include="PendingTelemetry.cs" />
<Compile Include="Sources\TelemetryJobRunsStreamingSource.cs" />
+ <Compile Include="Sources\TelemetryJobStatusSource.cs" />
<Compile Include="Sources\TelemetryLogsStreamingSource.cs" />
<Compile Include="Sources\TelemetryLogsStreamingSourceConfig.cs" />
<Compile Include="Sources\TelemetryMachineStatusStreamingSource.cs" />
<Compile Include="Sources\TelemetryMachineUpdatesStreamingSource.cs" />
<Compile Include="Sources\TelemetryMachineUpdatesHistorySource.cs" />
<Compile Include="Telemetries\TelemetryEvent.cs" />
+ <Compile Include="Telemetries\TelemetryJobStatus.cs" />
<Compile Include="Telemetries\TelemetryLog.cs" />
<Compile Include="Telemetries\TelemetryMachineStatus.cs" />
<Compile Include="Telemetries\TelemetryMachineUpdate.cs" />
diff --git a/Software/Visual_Studio/Tango.Telemetry/Telemetries/TelemetryJobRun.cs b/Software/Visual_Studio/Tango.Telemetry/Telemetries/TelemetryJobRun.cs
index 883da2b8a..c5f4da8ea 100644
--- a/Software/Visual_Studio/Tango.Telemetry/Telemetries/TelemetryJobRun.cs
+++ b/Software/Visual_Studio/Tango.Telemetry/Telemetries/TelemetryJobRun.cs
@@ -135,7 +135,7 @@ namespace Tango.Telemetry.Telemetries
//ProcessParamaters.DyeingSpeed = The speed in which the machine is dyeing the thread in centimeters per second.
public ProcessParameters ProcessParameters { get; set; }
- public TelemetryJobRun()
+ public TelemetryJobRun() : base()
{
Segments = new List<TelemetryJobRunSegment>();
}
diff --git a/Software/Visual_Studio/Tango.Telemetry/Telemetries/TelemetryJobStatus.cs b/Software/Visual_Studio/Tango.Telemetry/Telemetries/TelemetryJobStatus.cs
new file mode 100644
index 000000000..0dde56db9
--- /dev/null
+++ b/Software/Visual_Studio/Tango.Telemetry/Telemetries/TelemetryJobStatus.cs
@@ -0,0 +1,50 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Tango.Telemetry.Telemetries
+{
+ [TelemetryName("JobStatus",1)]
+ public class TelemetryJobStatus : TelemetryBase
+ {
+ public enum JobStatus
+ {
+ Preparing,
+ InProgress,
+ Completed,
+ Aborted,
+ Failed
+ }
+
+ public DateTime StartTime { get; set; }
+
+ public String JobName { get; set; }
+
+ public JobStatus Status { get; set; }
+
+ public TimeSpan TotalTime { get; set; }
+
+ public TimeSpan RemainingTime { get; set; }
+
+ public double Progress { get; set; }
+
+ public double TotalProgress { get; set; }
+
+ public int CurrentUnit { get; set; }
+
+ public int RemainingUnits { get; set; }
+
+ public double CurrentUnitProgress { get; set; }
+
+ public double CurrentUnitTotalProgress { get; set; }
+
+ public String Message { get; set; }
+
+ public TelemetryJobStatus() : base()
+ {
+ ID = String.Empty;
+ }
+ }
+}
diff --git a/Software/Visual_Studio/Tango.Telemetry/TelemetryAvailableEventArgs.cs b/Software/Visual_Studio/Tango.Telemetry/TelemetryAvailableEventArgs.cs
index c55ea2fab..79442ae59 100644
--- a/Software/Visual_Studio/Tango.Telemetry/TelemetryAvailableEventArgs.cs
+++ b/Software/Visual_Studio/Tango.Telemetry/TelemetryAvailableEventArgs.cs
@@ -9,5 +9,7 @@ namespace Tango.Telemetry
public class TelemetryAvailableEventArgs : EventArgs
{
public ITelemetry TelemetryObject { get; set; }
+
+ public bool DisableDeliveryRetries { get; set; }
}
}
diff --git a/Software/Visual_Studio/Tango.Telemetry/TelemetryPublishPackage.cs b/Software/Visual_Studio/Tango.Telemetry/TelemetryPublishPackage.cs
index 2e7a43361..0c2229cb0 100644
--- a/Software/Visual_Studio/Tango.Telemetry/TelemetryPublishPackage.cs
+++ b/Software/Visual_Studio/Tango.Telemetry/TelemetryPublishPackage.cs
@@ -23,6 +23,7 @@ namespace Tango.Telemetry
public String Site { get; set; }
public String TelemetryName { get; internal set; }
public int TelemetryVersion { get; internal set; }
+ public bool DisableDeliveryRetries { get; set; }
public TelemetryPublishPackage()
{
diff --git a/Software/Visual_Studio/Tango.Telemetry/TelemetryPublisher.cs b/Software/Visual_Studio/Tango.Telemetry/TelemetryPublisher.cs
index 4f13eda9d..45da1a1ca 100644
--- a/Software/Visual_Studio/Tango.Telemetry/TelemetryPublisher.cs
+++ b/Software/Visual_Studio/Tango.Telemetry/TelemetryPublisher.cs
@@ -195,7 +195,7 @@ namespace Tango.Telemetry
if (source != null)
{
LogManager.Log($"Telemetry stream received {source.Name} -> {e.TelemetryObject.ToTelemetryName()}.", LogCategory.Debug);
- PushTelemetryPackage(source, e.TelemetryObject, TelemetrySourceTypes.Streaming);
+ PushTelemetryPackage(source, e.TelemetryObject, TelemetrySourceTypes.Streaming, e.DisableDeliveryRetries);
}
}
@@ -519,7 +519,7 @@ namespace Tango.Telemetry
/// <summary>
/// Enqueues telemetry into the system based on a source and type.
/// </summary>
- private TelemetryPublishPackage PushTelemetryPackage(ITelemetrySource source, ITelemetry telemetry, TelemetrySourceTypes sourceType)
+ private TelemetryPublishPackage PushTelemetryPackage(ITelemetrySource source, ITelemetry telemetry, TelemetrySourceTypes sourceType, bool disableDeliveryRetries = false)
{
PendingTelemetry pendingTelemetry = new PendingTelemetry();
pendingTelemetry.Created = DateTime.UtcNow;
@@ -527,7 +527,7 @@ namespace Tango.Telemetry
pendingTelemetry.SourceType = sourceType;
pendingTelemetry.TelemetryObject = telemetry;
- var package = new TelemetryPublishPackage() { Source = source, PendingTelemetry = pendingTelemetry, SourceType = sourceType };
+ var package = new TelemetryPublishPackage() { Source = source, PendingTelemetry = pendingTelemetry, SourceType = sourceType, DisableDeliveryRetries = disableDeliveryRetries };
PushTelemetryPackage(package);
@@ -716,7 +716,7 @@ namespace Tango.Telemetry
destinationResult.Status = TelemetryPublishResult.DestinationStatus.Passed;
destinationResult.ElapsedTime = destinationWatch.Elapsed;
- LogManager.Log($"Successfully published to '{destination.Name}' in {destinationResult.ElapsedTime.TotalMilliseconds} ms.");
+ LogManager.Log($"Successfully published to '{destination.Name}' in {destinationResult.ElapsedTime.TotalMilliseconds} ms.", LogCategory.Debug);
}
else
{
@@ -773,16 +773,19 @@ namespace Tango.Telemetry
// Save retry state back into the package
package.PendingTelemetry.PendingDestinations = pendingDestinations;
- // Remove from storage if all destinations succeeded; otherwise persist state
- if (package.PendingTelemetry.PendingDestinations.Count == 0)
+ if (!package.DisableDeliveryRetries)
{
- LogManager.Log("Deleting successfully published telemetry from storage.", LogCategory.Debug);
- StorageManager.DeletePendingTelemetry(package.PendingTelemetry);
- }
- else
- {
- LogManager.Log("Saving telemetry package for future retry or tracking.", LogCategory.Debug);
- StorageManager.UpsertPendingTelemetry(package.PendingTelemetry);
+ // Remove from storage if all destinations succeeded; otherwise persist state
+ if (package.PendingTelemetry.PendingDestinations.Count == 0)
+ {
+ LogManager.Log("Deleting successfully published telemetry from storage.", LogCategory.Debug);
+ StorageManager.DeletePendingTelemetry(package.PendingTelemetry);
+ }
+ else
+ {
+ LogManager.Log("Saving telemetry package for future retry or tracking.", LogCategory.Debug);
+ StorageManager.UpsertPendingTelemetry(package.PendingTelemetry);
+ }
}
// Finalize result and notify completion
diff --git a/Software/Visual_Studio/Utilities/Tango.Telemetry.Tester.IOT.CLI/Program.cs b/Software/Visual_Studio/Utilities/Tango.Telemetry.Tester.IOT.CLI/Program.cs
index 1b02b9066..945fe5f1f 100644
--- a/Software/Visual_Studio/Utilities/Tango.Telemetry.Tester.IOT.CLI/Program.cs
+++ b/Software/Visual_Studio/Utilities/Tango.Telemetry.Tester.IOT.CLI/Program.cs
@@ -14,6 +14,7 @@ using System.Data.Entity;
using Tango.BL.Entities;
using Tango.Insights;
using System.Threading;
+using Tango.PMR.MachineStatus;
namespace Tango.Telemetry.Tester.IOT.CLI
{
@@ -29,7 +30,7 @@ namespace Tango.Telemetry.Tester.IOT.CLI
TelemetryPublisher publisher = new TelemetryPublisher(new TelemetryPublisherConfiguration()
{
Environment = "PROD",
- SerialNumber = "dev-machine",
+ SerialNumber = "ROY_X1",
Organization = "Twine",
MachineType = MachineTypes.TS1800,
HistorySourcesRequestInterval = TimeSpan.FromSeconds(1),
@@ -42,8 +43,16 @@ namespace Tango.Telemetry.Tester.IOT.CLI
//publisher.RegisterSource(new JobRunsTestSource());
//publisher.RegisterSource(new DiagnosticsTestSource());
publisher.RegisterSource(new EventsTestSource());
- //publisher.RegisterDestination(new TelemetryAzureHubDestination("HostName=iot-twine-dev-weu.azure-devices.net;DeviceId=telemetry-dev-01;SharedAccessKey=cZhCMhiVL+TF7p13fpX+lFmyxoy8ZqCkbxUwumWw18Q="));
- publisher.RegisterDestination(new TelemetryMqttDestination("Telemetry MQTT"));
+ publisher.RegisterSource(new MachineStatusTestSource());
+
+ var logsSource = new TelemetryLogsStreamingSource();
+ logsSource.Config.Categories.Add(LogCategory.Info);
+
+ publisher.RegisterSource(logsSource);
+ publisher.RegisterSource(new TelemetryLogsStreamingSource());
+ publisher.RegisterSource(new JobStatusTestSource());
+ publisher.RegisterDestination(new TelemetryAzureHubDestination("HostName=iot-twine-dev-weu.azure-devices.net;DeviceId=telemetry-dev-01;SharedAccessKey=cZhCMhiVL+TF7p13fpX+lFmyxoy8ZqCkbxUwumWw18Q="));
+ //publisher.RegisterDestination(new TelemetryMqttDestination("Telemetry MQTT"));
publisher.PublishResultAvailable += Publisher_PublishResultAvailable;
publisher.PublishingPackage += Publisher_PublishingPackage;
@@ -250,11 +259,9 @@ namespace Tango.Telemetry.Tester.IOT.CLI
{
Task.Factory.StartNew(() =>
{
- Thread.Sleep(2000);
-
using (ObservablesContext db = ObservablesContext.CreateDefault())
{
- foreach (var evType in db.EventTypes.Take(20).ToList())
+ foreach (var evType in db.EventTypes.Take(10).ToList())
{
TelemetryEvent ev = new TelemetryEvent();
ev.Description = $"Description of {evType.Description}";
@@ -263,7 +270,7 @@ namespace Tango.Telemetry.Tester.IOT.CLI
ev.Time = DateTime.UtcNow;
ev.Time = DateTime.SpecifyKind(ev.Time, DateTimeKind.Unspecified);
TelemetryAvailable?.Invoke(this, new TelemetryAvailableEventArgs() { TelemetryObject = ev });
- Thread.Sleep(5000);
+ Thread.Sleep(2000);
}
}
});
@@ -274,4 +281,88 @@ namespace Tango.Telemetry.Tester.IOT.CLI
}
}
+
+ public class MachineStatusTestSource : ITelemetryStreamingSource
+ {
+ public bool IsStarted { get; }
+ public string Name { get; } = "Machine Status Streaming";
+ public bool RequiresTelemetryDuplicationTracking { get; }
+
+ public event EventHandler<TelemetryAvailableEventArgs> TelemetryAvailable;
+
+ public void Dispose()
+ {
+
+ }
+
+ public void Start()
+ {
+ Task.Factory.StartNew(() =>
+ {
+ for (int i = 10; i < 20; i++)
+ {
+ TelemetryAvailable?.Invoke(this, new TelemetryAvailableEventArgs()
+ {
+ TelemetryObject = new TelemetryMachineStatus() { Status = new MachineStatus() { OverallTemperature = i } },
+ });
+
+ Thread.Sleep(1000);
+ }
+ });
+ }
+
+ public void Stop()
+ {
+
+ }
+ }
+
+ public class JobStatusTestSource : ITelemetryStreamingSource
+ {
+ public bool IsStarted { get; }
+ public string Name { get; } = "Machine Status Streaming";
+ public bool RequiresTelemetryDuplicationTracking { get; }
+
+ public event EventHandler<TelemetryAvailableEventArgs> TelemetryAvailable;
+
+ public void Dispose()
+ {
+
+ }
+
+ public void Start()
+ {
+ String groupID = Guid.NewGuid().ToString();
+
+ Task.Factory.StartNew(() =>
+ {
+ for (int i = 0; i < 22; i++)
+ {
+ TelemetryAvailable?.Invoke(this, new TelemetryAvailableEventArgs()
+ {
+ DisableDeliveryRetries = true,
+ TelemetryObject = new TelemetryJobStatus()
+ {
+ JobName = "Test Job",
+ ID = groupID,
+ Status = i == 0 ? TelemetryJobStatus.JobStatus.InProgress : TelemetryJobStatus.JobStatus.Completed,
+ TotalProgress = 21,
+ Progress = i,
+ RemainingTime = TimeSpan.FromSeconds(22 - i),
+ Message = $"Job status message {i}..."
+ },
+ });
+
+ LogManager.Default.Log($"Job Progress Updated {i}/22...");
+
+ Thread.Sleep(1000);
+ }
+ });
+ }
+
+ public void Stop()
+ {
+
+ }
+ }
}