17 std::chrono::milliseconds
period{100};
132 if (
auto* no = rfl::get_if<NoOutputConfig>(&
outputs.variant())) {
133 return no->system_id;
134 }
else if (
auto* simple = rfl::get_if<SimpleOutputConfig>(&
outputs.variant())) {
135 return simple->system_id;
137 throw std::logic_error(
"system_id() without index not valid for MultiOutputConfig - use system_id(index)");
143 if (
auto* no = rfl::get_if<NoOutputConfig>(&
outputs.variant())) {
144 return no->instance_id;
145 }
else if (
auto* simple = rfl::get_if<SimpleOutputConfig>(&
outputs.variant())) {
146 return simple->instance_id;
148 throw std::logic_error(
"instance_id() without index not valid for MultiOutputConfig - use instance_id(index)");
154 auto* multi = rfl::get_if<MultiOutputConfig>(&
outputs.variant());
156 throw std::logic_error(
"system_id(index) only valid for MultiOutputConfig");
158 if (index >= multi->addresses.size()) {
159 throw std::out_of_range(
"Output index out of range");
161 return multi->addresses[index].system_id;
166 auto* multi = rfl::get_if<MultiOutputConfig>(&
outputs.variant());
168 throw std::logic_error(
"instance_id(index) only valid for MultiOutputConfig");
170 if (index >= multi->addresses.size()) {
171 throw std::out_of_range(
"Output index out of range");
173 return multi->addresses[index].instance_id;
182 auto* single = rfl::get_if<SingleInputConfig>(&
inputs.variant());
184 throw std::logic_error(
"source_system_id() only valid for SingleInputConfig");
186 return single->source_system_id;
191 auto* single = rfl::get_if<SingleInputConfig>(&
inputs.variant());
193 throw std::logic_error(
"source_instance_id() only valid for SingleInputConfig");
195 return single->source_instance_id;
199 [[nodiscard]]
const std::vector<MultiInputConfig::InputSource>&
input_sources()
const {
200 auto* multi = rfl::get_if<MultiInputConfig>(&
inputs.variant());
202 throw std::logic_error(
"input_sources() only valid for MultiInputConfig");
204 return multi->sources;
209 auto* multi = rfl::get_if<MultiInputConfig>(&
inputs.variant());
211 throw std::logic_error(
"input_sources() only valid for MultiInputConfig");
213 return multi->sources;
218 auto* multi = rfl::get_if<MultiInputConfig>(&
inputs.variant());
220 throw std::logic_error(
"sync_tolerance() only valid for MultiInputConfig");
222 return multi->sync_tolerance;
227 auto* multi = rfl::get_if<MultiInputConfig>(&
inputs.variant());
229 throw std::logic_error(
"history_buffer_size() only valid for MultiInputConfig");
231 return multi->history_buffer_size;
236 auto* multi = rfl::get_if<MultiInputConfig>(&
inputs.variant());
238 throw std::logic_error(
"input_system_id(index) only valid for MultiInputConfig");
240 if (index >= multi->sources.size()) {
241 throw std::out_of_range(
"Input index out of range");
243 return multi->sources[index].system_id;
248 auto* multi = rfl::get_if<MultiInputConfig>(&
inputs.variant());
250 throw std::logic_error(
"input_instance_id(index) only valid for MultiInputConfig");
252 if (index >= multi->sources.size()) {
253 throw std::out_of_range(
"Input index out of range");
255 return multi->sources[index].instance_id;
262 [[nodiscard]]
bool has_no_output()
const {
return rfl::get_if<NoOutputConfig>(&
outputs.variant()) !=
nullptr; }
266 [[nodiscard]]
bool has_no_input()
const {
return rfl::get_if<NoInputConfig>(&
inputs.variant()) !=
nullptr; }
CommRaT - Modern C++ Real-Time Communication Framework.
constexpr uint32_t DEFAULT_CMD_SLOTS
rfl::TaggedUnion<"input_type", NoInputConfig, SingleInputConfig, MultiInputConfig > InputConfig
constexpr uint32_t DEFAULT_DATA_SLOTS
rfl::TaggedUnion<"output_type", NoOutputConfig, SimpleOutputConfig, MultiOutputConfig > OutputConfig
uint8_t input_system_id(size_t index) const
Get source system_id at index (MultiInput only)
std::chrono::milliseconds sync_tolerance() const
Get sync_tolerance (MultiInput only)
rfl::DefaultVal< uint32_t > data_message_slots
bool has_no_output() const
rfl::DefaultVal< uint32_t > cmd_message_slots
bool has_single_input() const
uint8_t system_id() const
Get system_id - NoOutput or SimpleOutput only.
uint8_t instance_id() const
Get instance_id - NoOutput or SimpleOutput only.
const std::vector< MultiInputConfig::InputSource > & input_sources() const
Get input sources (MultiInput only)
uint8_t source_system_id() const
Get source_system_id (SingleInput only)
uint8_t system_id(size_t index) const
Get system_id for specific output index (MultiOutput only)
uint8_t instance_id(size_t index) const
Get instance_id for specific output index (MultiOutput only)
uint8_t source_instance_id() const
Get source_instance_id (SingleInput only)
bool has_multi_input_config() const
size_t history_buffer_size() const
Get history_buffer_size (MultiInput only)
bool has_no_input() const
std::chrono::milliseconds period
uint8_t input_instance_id(size_t index) const
Get source instance_id at index (MultiInput only)
bool has_multi_output_config() const
bool has_simple_output() const
std::vector< MultiInputConfig::InputSource > & input_sources()
Get mutable input sources (MultiInput only) - for populating input_index.
Multi-output - Each output gets its own addressing Use when multiple outputs have same type (would co...
std::vector< OutputAddress > addresses
No output - Module only consumes inputs (logger, monitor, controller) Still needs addressing for CMD/...
Simple output - All outputs share same system_id/instance_id Use when output types are distinct (no c...