From 7883453f6abcd7a13a37c254fc5ebeec2e201385 Mon Sep 17 00:00:00 2001 From: Marcus Rockwell Date: Wed, 29 May 2024 12:51:35 -0500 Subject: [PATCH] fixed web server freeze issue --- .../include/VariableServerSession.hh | 3 +++ .../CivetServer/src/VariableServerSession.cpp | 24 +++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/trick_source/web/CivetServer/include/VariableServerSession.hh b/trick_source/web/CivetServer/include/VariableServerSession.hh index 56408413..7ccfdeb6 100644 --- a/trick_source/web/CivetServer/include/VariableServerSession.hh +++ b/trick_source/web/CivetServer/include/VariableServerSession.hh @@ -13,6 +13,7 @@ PURPOSE: (Represent the state of a variable server websocket connection.) #endif #include "trick/WebSocketSession.hh" +#include "trick/Executive.hh" #include "VariableServerVariable.hh" class VariableServerSession : public WebSocketSession { @@ -38,6 +39,7 @@ class VariableServerSession : public WebSocketSession { int sendSieMessage(void); int sendUnitsMessage(const char* vname); REF2* make_error_ref(const char* in_name); + void updateNextTime(long long simTimeTics); double stageTime; bool dataStaged; @@ -45,6 +47,7 @@ class VariableServerSession : public WebSocketSession { bool cyclicSendEnabled; long long nextTime; long long intervalTimeTics; + SIM_MODE mode; }; WebSocketSession* makeVariableServerSession( struct mg_connection *nc ); diff --git a/trick_source/web/CivetServer/src/VariableServerSession.cpp b/trick_source/web/CivetServer/src/VariableServerSession.cpp index f56a8f22..26cf43ee 100644 --- a/trick_source/web/CivetServer/src/VariableServerSession.cpp +++ b/trick_source/web/CivetServer/src/VariableServerSession.cpp @@ -18,12 +18,15 @@ LIBRARY DEPENDENCIES: #include "trick/exec_proto.h" #include "VariableServerSession.hh" #include "simpleJSON.hh" +#include "trick/message_proto.h" +#include "trick/message_type.h" // CONSTRUCTOR VariableServerSession::VariableServerSession( struct mg_connection *nc ) : WebSocketSession(nc) { intervalTimeTics = exec_get_time_tic_value(); // Default time interval is one second. nextTime = 0; cyclicSendEnabled = false; + mode = Initialization; } // DESTRUCTOR @@ -31,6 +34,10 @@ VariableServerSession::~VariableServerSession() { clear(); } +void VariableServerSession::updateNextTime(long long simTimeTics) { + nextTime = (simTimeTics - (simTimeTics % intervalTimeTics) + intervalTimeTics); +} + /* Base class virtual function: marshallData When HTTP_Server::time_homogeneous is set, WebSocketSession::marshallData() is called from the main sim thread in a "top_of_frame" job, to ensure that all of @@ -41,11 +48,23 @@ VariableServerSession::~VariableServerSession() { (The specified period between messages). */ void VariableServerSession::marshallData() { - long long simulation_time_tics = exec_get_time_tics() + exec_get_freeze_time_tics(); + long long simulation_time_tics = exec_get_time_tics(); + SIM_MODE new_mode = the_exec->get_mode(); + + if(new_mode == Freeze) { + simulation_time_tics += exec_get_freeze_time_tics(); + } + + if(new_mode != mode) { + mode = new_mode; + updateNextTime(simulation_time_tics); + } + if ( cyclicSendEnabled && ( simulation_time_tics >= nextTime )) { stageValues(); - nextTime = (simulation_time_tics - (simulation_time_tics % intervalTimeTics) + intervalTimeTics); + updateNextTime(simulation_time_tics); } + } /* Base class virtual function: sendMessage @@ -108,6 +127,7 @@ int VariableServerSession::handleMessage(const std::string& client_msg) { unpause(); } else if (cmd == "var_send") { // var_send responses are not guarenteed to be time-consistent. + message_publish(MSG_INFO, "Data is Staged via Messaging\n"); stageValues(); sendMessage(); } else if (cmd == "var_clear") {