32 #include <boost/optional.hpp> 48 #include "utility/command.hpp" 62 uint64_t
step()
const override {
return step_; }
80 return static_cast<double>(
step_width().count()) / static_cast<double>(cycle_time_.count());
119 double realtime_factor_{1.0};
128 using TimePoint = std::chrono::steady_clock::time_point;
131 std::string stage{
""};
132 std::string message{
"initializing engine"};
135 size_t initialization_n;
136 size_t initialization_k;
142 double report_granularity_p{0.1};
144 double execution_report_p; 145 TimePoint execution_report_t; 148 void init_begin(size_t n) { 149 message = "initializing"; 150 initialization.begin(); 151 initialization_n = n; 152 initialization_k = 0; 155 void init(const std::string& what) { 157 message = "initializing " + what; 159 double p = static_cast<double>(initialization_k) / static_cast<double>(initialization_n); 160 initialization.update(p); 165 assert(initialization_k == initialization_n); 166 initialization.end(); 168 message = "initialization done"; 171 bool is_init_ended() const { return initialization.is_ended(); } 173 cloe::Duration elapsed() const { 174 if (is_init_ended()) { 175 return initialization.elapsed() + execution.elapsed(); 177 return initialization.elapsed(); 182 stage = "simulation"; 183 message = "executing simulation"; 184 execution_report_p = 0; 185 execution_report_t = std::chrono::steady_clock::now(); 189 void exec_update(double p) { execution.update_safe(p); } 191 void exec_update(cloe::Duration now) { 192 if (execution_eta != cloe::Duration(0)) { 193 double now_d = static_cast<double>(now.count()); 194 double eta_d = static_cast<double>(execution_eta.count()); 195 exec_update(now_d / eta_d); 201 message = "simulation done"; 205 bool is_exec_ended() const { return execution.is_ended(); } 213 // We should not report 100% more than once. 214 if (execution_report_p == 1.0) { 218 // If there is no execution ETA, also don't report.
224 auto now = std::chrono::steady_clock::now();
227 execution_report_p = 1.0;
228 execution_report_t = now;
230 }
else if (execution.
percent() - execution_report_p > report_granularity_p) {
232 execution_report_p = execution.
percent();
233 execution_report_t = now;
235 }
else if (cast_duration(now - execution_report_t) > report_granularity_d) {
237 execution_report_p = execution.
percent();
238 execution_report_t = now;
247 {
"message", p.message},
248 {
"initialization", p.initialization},
251 j[
"execution"] = p.execution;
253 j[
"execution"] =
nullptr;
267 engine_time_ms.
reset();
268 cycle_time_ms.
reset();
269 simulator_time_ms.
reset();
270 controller_time_ms.
reset();
271 padding_time_ms.
reset();
272 controller_retries.
reset();
277 {
"engine_time_ms", s.engine_time_ms}, {
"simulator_time_ms", s.simulator_time_ms},
278 {
"controller_time_ms", s.controller_time_ms}, {
"padding_time_ms", s.padding_time_ms},
279 {
"cycle_time_ms", s.cycle_time_ms}, {
"controller_retries", s.controller_retries},
299 #define EXIT_OUTCOME_SUCCESS EXIT_SUCCESS // normally 0 300 #define EXIT_OUTCOME_UNKNOWN EXIT_FAILURE // normally 1 301 #define EXIT_OUTCOME_NOSTART 4 // 0b.....1.. 302 #define EXIT_OUTCOME_STOPPED 8 // 0b....1... 303 #define EXIT_OUTCOME_FAILURE 9 // 0b....1..1 304 #define EXIT_OUTCOME_ABORTED 16 // 0b...1.... 308 {SimulationOutcome::Aborted,
"aborted"},
309 {SimulationOutcome::NoStart,
"no-start"},
310 {SimulationOutcome::Failure,
"failure"},
311 {SimulationOutcome::Success,
"success"},
312 {SimulationOutcome::Stopped,
"stopped"},
335 std::unique_ptr<Server> server;
336 std::shared_ptr<Coordinator> coordinator;
337 std::shared_ptr<Registrar> registrar;
338 std::unique_ptr<CommandExecuter> commander;
343 bool report_progress{
false};
350 std::map<std::string, std::unique_ptr<cloe::Simulator>> simulators;
351 std::map<std::string, std::shared_ptr<cloe::Vehicle>> vehicles;
352 std::map<std::string, std::unique_ptr<cloe::Controller>> controllers;
353 boost::optional<SimulationOutcome> outcome;
355 bool pause_execution{
false};
358 std::shared_ptr<events::PauseCallback> callback_pause;
359 std::shared_ptr<events::ResumeCallback> callback_resume;
360 std::shared_ptr<events::StartCallback> callback_start;
361 std::shared_ptr<events::StopCallback> callback_stop;
362 std::shared_ptr<events::SuccessCallback> callback_success;
363 std::shared_ptr<events::FailureCallback> callback_failure;
364 std::shared_ptr<events::ResetCallback> callback_reset;
365 std::shared_ptr<events::TimeCallback> callback_time;
368 std::string version()
const;
370 std::shared_ptr<cloe::Registrar> simulation_registrar();
372 std::vector<std::string> model_ids()
const;
373 std::vector<std::string> simulator_ids()
const;
374 std::vector<std::string> controller_ids()
const;
375 std::vector<std::string> vehicle_ids()
const;
376 std::vector<std::string> plugin_ids()
const;
378 bool foreach_model(std::function<
bool(
cloe::Model&,
const char* type)> f);
379 bool foreach_model(std::function<
bool(
const cloe::Model&,
const char* type)> f)
const;
381 bool foreach_simulator(std::function<
bool(
const cloe::Simulator&)> f)
const;
383 bool foreach_controller(std::function<
bool(
const cloe::Controller&)> f)
const;
385 bool foreach_vehicle(std::function<
bool(
const cloe::Vehicle&)> f)
const;
void set_realtime_factor(double s)
Definition: simulation_context.hpp:100
Definition: simulator.hpp:141
Definition: simulation_context.hpp:333
double percent() const
Definition: progress.hpp:106
void reset()
Definition: statistics.hpp:121
bool is_ended() const
Definition: progress.hpp:68
friend void to_json(Json &j, const Sync &s)
Definition: sync.hpp:97
double achievable_realtime_factor() const override
Definition: simulation_context.hpp:79
cloe::Duration eta() const override
Definition: simulation_context.hpp:65
std::chrono::nanoseconds Duration
Definition: duration.hpp:45
uint64_t step() const override
Definition: simulation_context.hpp:62
Definition: simulation_context.hpp:258
Definition: stack.hpp:888
#define DEFINE_NIL_EVENT(xName, xname, xdescription)
Definition: nil_event.hpp:59
Definition: progress.hpp:35
#define ENUM_SERIALIZATION(xType, xMap)
Definition: enum.hpp:52
SimulationOutcome
Definition: simulation_context.hpp:287
Definition: simulation_context.hpp:57
void increment_step()
Definition: simulation_context.hpp:91
double realtime_factor() const override
Definition: simulation_context.hpp:73
Definition: vehicle.hpp:108
Definition: model.hpp:214
Definition: statistics.hpp:112
Definition: coordinator.cpp:39
cloe::Duration step_width() const override
Definition: simulation_context.hpp:63
cloe::Duration time() const override
Definition: simulation_context.hpp:64
Definition: simulation_context.hpp:127
Definition: controller.hpp:128