diff --git a/include/trick/RealtimeSync.hh b/include/trick/RealtimeSync.hh index c2140b40a..50ed7f781 100644 --- a/include/trick/RealtimeSync.hh +++ b/include/trick/RealtimeSync.hh @@ -110,6 +110,9 @@ namespace Trick { /** The clock time when the sim ended. Used for total actual time calculation.\n */ long long sim_end_time ; /**< trick_units(--) */ + /** The actual simulation time/wall clock time ratio\n */ + double actual_run_ratio ; /**< trick_units(--) */ + /** @brief This is the constructor of the RealtimeSync class. It starts the RealtimeSync as disabled and sets the maximum overrun parameters to basically infinity. diff --git a/trick_source/java/src/main/java/trick/simcontrol/SimControlApplication.java b/trick_source/java/src/main/java/trick/simcontrol/SimControlApplication.java index 2faad6ed0..545ed9882 100644 --- a/trick_source/java/src/main/java/trick/simcontrol/SimControlApplication.java +++ b/trick_source/java/src/main/java/trick/simcontrol/SimControlApplication.java @@ -788,7 +788,7 @@ private void scheduleGetSimState() { status_vars = "trick.var_add(\"trick_sys.sched.time_tics\") \n" + "trick.var_add(\"trick_sys.sched.mode\") \n" + - "trick.var_add(\"trick_real_time.gtod_clock.rt_clock_ratio\") \n" + + "trick.var_add(\"trick_real_time.rt_sync.actual_run_ratio\") \n" + "trick.var_add(\"trick_real_time.rt_sync.active\") \n"; if ( debug_present != 0 ) { @@ -1673,7 +1673,7 @@ protected Void doInBackground() { ii++ ; } - // "real_time.gtod_clock.rt_clock_ratio" + // "real_time.rt_sync.actual_run_ratio" if (results.length > ii && results[ii] != null && results[ii] != "") { simState.setSimRealtimeRatio(Float.parseFloat(results[ii])); ii++ ; diff --git a/trick_source/sim_services/RealtimeSync/RealtimeSync.cpp b/trick_source/sim_services/RealtimeSync/RealtimeSync.cpp index 2b7e0f209..22bd8cbf2 100644 --- a/trick_source/sim_services/RealtimeSync/RealtimeSync.cpp +++ b/trick_source/sim_services/RealtimeSync/RealtimeSync.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include "trick/RealtimeSync.hh" #include "trick/exec_proto.h" #include "trick/sim_mode.h" @@ -48,6 +49,8 @@ Trick::RealtimeSync::RealtimeSync( Trick::Clock * in_clock , Trick::Timer * in_t sim_end_init_time = 0 ; sim_end_time = 0 ; + actual_run_ratio = 0.0; + the_rts = this ; } @@ -250,6 +253,33 @@ int Trick::RealtimeSync::start_realtime(double in_frame_time , long long ref_tim return(0) ; } +template +class Run_Ratio { + public: + Run_Ratio() : num_samples(0) {} + Run_Ratio& operator()(long long sample, double in_rt_ratio) + { + samples[num_samples++ % N] = sample; + rt_ratio = in_rt_ratio; + return *this; + } + + operator double() const { + if ( num_samples <= 1 ) { + return 0.0 ; + } else if ( num_samples < N ) { + return round(exec_get_software_frame() * (num_samples-1) * exec_get_time_tic_value() * rt_ratio / (double)(samples[num_samples - 1] - samples[0])*100.0)/100.0 ; + } else { + return round(exec_get_software_frame() * (N-1) * exec_get_time_tic_value() * rt_ratio / (double)(samples[(num_samples - 1) % N] - samples[num_samples % N])*100.0)/100.0 ; + } + } + + private: + long long samples[N]; + size_t num_samples; + double rt_ratio; +}; + /** @details -# If real-time is not active: @@ -282,6 +312,7 @@ int Trick::RealtimeSync::rt_monitor(long long sim_time_tics) { long long curr_clock_time ; char buf[512]; + static Run_Ratio<100> run_ratio ; /* calculate the current underrun/overrun */ curr_clock_time = rt_clock->clock_time() ; @@ -301,6 +332,8 @@ int Trick::RealtimeSync::rt_monitor(long long sim_time_tics) { if ( disable_flag ) { disable_flag = false ; } + /* calculate run ratio in non-realtime mode */ + actual_run_ratio = run_ratio(curr_clock_time, 1.0); return(0) ; } if ( enable_flag ) { @@ -367,6 +400,8 @@ int Trick::RealtimeSync::rt_monitor(long long sim_time_tics) { /* If the timer requires to be reset at the end of each frame, reset it here. */ sleep_timer->reset(exec_get_software_frame() / rt_clock->get_rt_clock_ratio()) ; + /* Calculate the run ratio after sleeping */ + actual_run_ratio = run_ratio(curr_clock_time, rt_clock->get_rt_clock_ratio()); } return(0) ; @@ -508,4 +543,4 @@ int Trick::RealtimeSync::shutdown() { bool Trick::RealtimeSync::is_active() { return active; -} \ No newline at end of file +}