50 return a.priority < b.priority;
54 for (
auto &group :
config_.groups) {
56 group.members.begin(), group.members.end(),
61 config_.ComputeFrameDivisors(sim_rate_hz);
75 int32_t current_phase = -1)
const {
76 std::vector<std::string> active_groups;
77 for (
const auto &group :
config_.groups) {
79 auto it =
config_.group_frame_divisors.find(group.name);
80 if (it !=
config_.group_frame_divisors.end()) {
81 int divisor = it->second;
82 if (frame_count % divisor != 0) {
88 if (current_phase >= 0 && !group.IsActiveInPhase(current_phase)) {
92 active_groups.push_back(group.name);
104 std::vector<std::string> members;
105 for (
const auto &group :
config_.groups) {
106 if (group.name == group_name) {
107 for (
const auto &member : group.members) {
108 members.push_back(member.component);
122 [[nodiscard]]
double GetGroupDt(
const std::string &group_name)
const {
124 auto it =
config_.group_frame_divisors.find(group_name);
125 if (it !=
config_.group_frame_divisors.end()) {
126 return global_dt * it->second;
138 auto it =
config_.group_frame_divisors.find(group_name);
139 if (it !=
config_.group_frame_divisors.end()) {
149 [[nodiscard]]
const std::vector<SchedulerGroupConfig> &
GetGroups()
const {
158 if (logger !=
nullptr) {
163 std::ostringstream oss;
164 oss <<
"Scheduler execution order (sim rate: " <<
sim_rate_hz_ <<
" Hz):\n";
166 for (
const auto &group :
config_.groups) {
167 auto it =
config_.group_frame_divisors.find(group.name);
168 int divisor = (it !=
config_.group_frame_divisors.end()) ? it->second : 1;
169 double group_dt = 1.0 / group.rate_hz;
171 oss <<
" Group '" << group.name <<
"' (priority " << group.priority <<
", "
172 << group.rate_hz <<
" Hz, divisor " << divisor <<
", dt=" << std::fixed
173 << std::setprecision(6) << group_dt <<
"s):\n";
175 for (
const auto &member : group.members) {
176 oss <<
" - " << member.component <<
" (priority " << member.priority
180 std::cout << oss.str();
Flight Recorder style logging service.
Simulator and subsystem configuration structs.
Mission Logger - Flight Recorder style logging.
Definition MissionLogger.hpp:53
Group-based execution scheduler.
Definition Scheduler.hpp:35
double sim_rate_hz_
Definition Scheduler.hpp:185
int GetFrameDivisor(const std::string &group_name) const
Get frame divisor for a group.
Definition Scheduler.hpp:137
const std::vector< SchedulerGroupConfig > & GetGroups() const
Get the sorted groups (by priority).
Definition Scheduler.hpp:149
void LogExecutionOrder(MissionLogger *logger=nullptr) const
Log execution order to logger or stdout.
Definition Scheduler.hpp:157
std::vector< std::string > GetGroupsForFrame(int frame_count, int32_t current_phase=-1) const
Get groups that should execute on this frame.
Definition Scheduler.hpp:74
void Configure(const SchedulerConfig &config, double sim_rate_hz)
Configure scheduler from config.
Definition Scheduler.hpp:43
double GetGroupDt(const std::string &group_name) const
Get dt for a specific group.
Definition Scheduler.hpp:122
double GetSimulationRate() const
Get simulation rate in Hz.
Definition Scheduler.hpp:146
SchedulerConfig config_
Definition Scheduler.hpp:184
std::vector< std::string > GetMembersForGroup(const std::string &group_name) const
Get members for a group in execution order.
Definition Scheduler.hpp:103
const SchedulerConfig & GetConfig() const
Get the config.
Definition Scheduler.hpp:154
Definition AggregationTypes.hpp:13
A component member within a scheduler group.
Definition SimulatorConfig.hpp:299
Scheduler configuration with rate groups.
Definition SimulatorConfig.hpp:346
A scheduler group with its own rate and priority.
Definition SimulatorConfig.hpp:310