diff --git a/MainViewModel.cs b/MainViewModel.cs index 42f60f7..e218094 100644 --- a/MainViewModel.cs +++ b/MainViewModel.cs @@ -66,6 +66,11 @@ namespace CtrEditor private const double MAX_SIM_INTERVAL = 100; // Máximo intervalo simulación (ms) private const double SIM_BUFFER_TIME = 2; // Buffer de 2ms extra respecto al tiempo real + // Variables para promedio móvil de SimulationSpeed + private Queue simSpeedSamples = new Queue(); + private double totalSimSpeedTime = 0; + private const double SIM_SPEED_WINDOW_MS = 500; // Ventana de 500ms para promedio + private float TiempoDesdeStartSimulacion; private bool Debug_SimulacionCreado = false; @@ -1199,6 +1204,9 @@ namespace CtrEditor var timeBetweenCalls = stopwatch_Sim.Elapsed.TotalMilliseconds - stopwatch_SimModel_last; stopwatch_SimModel_last = stopwatch_Sim.Elapsed.TotalMilliseconds; + // ✅ NUEVO: Actualizar velocidad de simulación con promedio móvil de 500ms + UpdateSimulationSpeedAverage(timeBetweenCalls); + // Acumular tiempo para el promedio (usando tiempo real del timer) accumulatedSimTime += timeBetweenCalls; simSampleCount++; @@ -1492,6 +1500,29 @@ namespace CtrEditor } } + /// + /// Actualiza el promedio móvil de velocidad de simulación en una ventana de 500ms + /// + private void UpdateSimulationSpeedAverage(double timeBetweenCalls) + { + // Agregar la nueva muestra + simSpeedSamples.Enqueue(timeBetweenCalls); + totalSimSpeedTime += timeBetweenCalls; + + // Remover muestras antiguas que estén fuera de la ventana de 500ms + while (simSpeedSamples.Count > 0 && totalSimSpeedTime > SIM_SPEED_WINDOW_MS) + { + var oldestSample = simSpeedSamples.Dequeue(); + totalSimSpeedTime -= oldestSample; + } + + // Calcular y actualizar el promedio + if (simSpeedSamples.Count > 0) + { + SimulationSpeed = totalSimSpeedTime / simSpeedSamples.Count; + } + } + /// /// Resetea todos los contadores adaptativos de timing para empezar con mediciones limpias /// @@ -1501,6 +1532,11 @@ namespace CtrEditor lastSimExecutionTime = 0; maxSimExecutionTime = 0; simTimingAdaptationCounter = 0; + SimulationSpeed = 0.0; // Reset del display de velocidad de simulación + + // Reset promedio móvil de SimulationSpeed + simSpeedSamples.Clear(); + totalSimSpeedTime = 0; // Reset contadores de PLC lastPlcExecutionTime = 0;