54 std::cout <<
"[" << mod.config_.name <<
"] periodic_loop started, period="
55 << mod.config_.period.count() <<
"ms\n";
57 uint32_t iteration = 0;
58 while (mod.running_) {
60 std::cout <<
"[" << mod.config_.name <<
"] periodic_loop iteration " << iteration <<
"\n";
64 uint64_t generation_timestamp =
Time::now();
66 if constexpr (ModuleType::has_multi_output) {
68 typename ModuleType::OutputTypesTuple outputs{};
72 typename ModuleType::OutputTypesTuple,
73 typename ModuleType::InputData
75 std::apply([&mod](
auto&... args) {
76 static_cast<MultiOutBase&
>(mod).process(args...);
79 mod.publish_multi_outputs_with_timestamp(outputs, generation_timestamp);
82 typename ModuleType::OutputData output{};
85 auto tims_msg = mod.create_tims_message(std::move(output), generation_timestamp);
86 mod.publish_tims_message(tims_msg);
89 std::this_thread::sleep_for(mod.config_.period);
93 std::cout <<
"[" << mod.config_.name <<
"] periodic_loop ended after " << iteration <<
" iterations\n";
107 while (mod.running_) {
109 uint64_t generation_timestamp =
Time::now();
111 if constexpr (ModuleType::has_multi_output) {
113 typename ModuleType::OutputTypesTuple outputs{};
116 typename ModuleType::OutputTypesTuple,
117 typename ModuleType::InputData
119 std::apply([&mod](
auto&... args) {
120 static_cast<MultiOutBase&
>(mod).process(args...);
122 mod.publish_multi_outputs_with_timestamp(outputs, generation_timestamp);
126 typename ModuleType::OutputData output{};
128 auto tims_msg = mod.create_tims_message(std::move(output), generation_timestamp);
129 mod.publish_tims_message(tims_msg);
144 std::cout <<
"[" << mod.config_.name <<
"] continuous_loop started, waiting for data...\n";
146 while (mod.running_) {
148 auto result = mod.data_mailbox_->template receive<typename ModuleType::InputData>();
153 mod.update_input_metadata(0, result.value(),
true);
155 typename ModuleType::OutputData output{};
156 mod.process_dispatch(result->payload, output);
158 auto tims_msg = mod.create_tims_message(std::move(output), result->header.timestamp);
159 mod.publish_tims_message(tims_msg);
163 std::cout <<
"[" << mod.config_.name <<
"] continuous_loop ended\n";
177 static_assert(ModuleType::has_multi_input,
"multi_input_loop only for multi-input modules");
179 std::cout <<
"[" << mod.config_.name <<
"] multi_input_loop started ("
180 << ModuleType::InputCount <<
" inputs)\n";
183 constexpr size_t primary_idx = ModuleType::get_primary_input_index();
184 std::cout <<
"[" << mod.config_.name <<
"] Primary input index: " << primary_idx <<
"\n";
186 uint32_t loop_iteration = 0;
187 while (mod.running_) {
189 if (loop_iteration < 3) {
190 std::cout <<
"[" << mod.config_.name <<
"] Waiting for primary input... (iteration "
191 << loop_iteration <<
")\n";
194 auto primary_result = mod.template receive_primary_input<primary_idx>();
196 if (!primary_result.has_value()) {
197 if (loop_iteration < 3) {
198 std::cout <<
"[" << mod.config_.name <<
"] No primary data received\n";
204 if (loop_iteration < 3) {
205 std::cout <<
"[" << mod.config_.name <<
"] Primary input received!\n";
209 mod.update_input_metadata(0, primary_result.value(),
true);
212 auto all_inputs = mod.template gather_all_inputs<primary_idx>(primary_result.value());
215 if (loop_iteration < 3) {
216 std::cout <<
"[" << mod.config_.name <<
"] Failed to sync inputs\n";
222 if (loop_iteration < 3) {
223 std::cout <<
"[" << mod.config_.name <<
"] All inputs synced, calling process()\n";
227 uint64_t primary_timestamp = primary_result->header.timestamp;
230 if constexpr (ModuleType::has_multi_output) {
231 typename ModuleType::OutputTypesTuple outputs{};
232 mod.call_multi_input_multi_output_process(*all_inputs, outputs);
233 mod.publish_multi_outputs_with_timestamp(outputs, primary_timestamp);
235 typename ModuleType::OutputData output{};
236 mod.call_multi_input_process(*all_inputs, output);
237 auto tims_msg = mod.create_tims_message(std::move(output), primary_timestamp);
238 mod.publish_tims_message(tims_msg);
244 std::cout <<
"[" << mod.config_.name <<
"] multi_input_loop ended\n";