diff options
Diffstat (limited to 'Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryLogsStreamingSource.cs')
| -rw-r--r-- | Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryLogsStreamingSource.cs | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryLogsStreamingSource.cs b/Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryLogsStreamingSource.cs new file mode 100644 index 000000000..8001caac8 --- /dev/null +++ b/Software/Visual_Studio/Tango.Telemetry/Sources/TelemetryLogsStreamingSource.cs @@ -0,0 +1,99 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tango.Integration.Operation; +using Tango.Logging; +using Tango.Telemetry.Telemetries; + +namespace Tango.Telemetry.Sources +{ + public class TelemetryLogsStreamingSource : TelemetryConfigurableSource<TelemetryLogsStreamingSourceConfig>, ITelemetryStreamingSource + { + private KeyValuePair<DateTime, String> _lastFirmwareMessage; + + public IMachineOperator MachineOperator { get; } + + public bool IsStarted { get; private set; } + + public string Name { get; } = "Logs"; + + public bool RequiresTelemetryDuplicationTracking { get; } + + public event EventHandler<TelemetryAvailableEventArgs> TelemetryAvailable; + + public TelemetryLogsStreamingSource() + { + _lastFirmwareMessage = new KeyValuePair<DateTime, string>(DateTime.MinValue, String.Empty); + } + + public TelemetryLogsStreamingSource(IMachineOperator machineOperator) + { + MachineOperator = machineOperator; + } + + public void Start() + { + if (!IsStarted) + { + IsStarted = true; + LogManager.NewLog += LogManager_NewLog; + if (MachineOperator != null) MachineOperator.DebugLogAvailable += MachineOperator_DebugLogAvailable; + } + } + + private void MachineOperator_DebugLogAvailable(object sender, PMR.Debugging.StartDebugLogResponse log) + { + if (IsStarted) + { + if (Config.Categories.Contains((LogCategory)log.Category)) return; + + if (log.Message == _lastFirmwareMessage.Value && DateTime.UtcNow < _lastFirmwareMessage.Key.AddSeconds(1)) return; + + _lastFirmwareMessage = new KeyValuePair<DateTime, string>(DateTime.UtcNow, log.Message); + + TelemetryLog tLog = new TelemetryLog(); + tLog.Time = DateTime.UtcNow; + tLog.Category = log.Category.ToString(); + tLog.Class = log.FileName; + tLog.Method = $"[{log.ModuleId}] [{log.Filter}] [{log.Parameter}]"; + tLog.Line = log.LineNumber; + tLog.Message = log.Message; + TelemetryAvailable?.Invoke(this, new TelemetryAvailableEventArgs() { TelemetryObject = tLog }); + } + } + + private void LogManager_NewLog(object sender, Logging.LogItemBase log) + { + if (IsStarted) + { + if (Config.Categories.Contains(log.Category)) return; + + TelemetryLog tLog = new TelemetryLog(); + tLog.Time = log.TimeStamp.ToUniversalTime(); + tLog.Category = log.Category.ToString(); + tLog.Class = log.ClassName; + tLog.Method = log.CallerMethodName; + tLog.Line = log.CallerLineNumber; + tLog.Message = log.Message; + TelemetryAvailable?.Invoke(this, new TelemetryAvailableEventArgs() { TelemetryObject = tLog }); + } + } + + public void Stop() + { + if (IsStarted) + { + IsStarted = false; + LogManager.NewLog -= LogManager_NewLog; + if (MachineOperator != null) MachineOperator.DebugLogAvailable -= MachineOperator_DebugLogAvailable; + } + } + + public void Dispose() + { + Stop(); + } + } +} |
