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.Mappers; using Tango.Telemetry.Telemetries; namespace Tango.Telemetry.Sources { public class TelemetryLogsStreamingSource : TelemetryConfigurableSource, ITelemetryStreamingSource { private KeyValuePair _lastFirmwareMessage; public IMachineOperator MachineOperator { get; } public bool IsStarted { get; private set; } public string Name { get; } = "Logs"; public bool RequiresTelemetryDuplicationTracking { get; } public event EventHandler TelemetryAvailable; public TelemetryLogsStreamingSource() { _lastFirmwareMessage = new KeyValuePair(DateTime.MinValue, String.Empty); } public TelemetryLogsStreamingSource(IMachineOperator machineOperator) : this() { MachineOperator = machineOperator; } public virtual 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.UtcNow, log.Message); TelemetryLog tLog = LogMapper.MapLog(log); 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; if (log.ClassName != null && log.ClassName.StartsWith("Telemetry")) return; TelemetryLog tLog = LogMapper.MapLog(log); 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(); } } }