43 typename UserRegistry,
45 typename PublishMailboxT = TypedMailbox<UserRegistry>,
46 typename ModuleType =
void
72 .timestamp = timestamp_ns,
76 .payload = std::forward<T>(payload)
87 template<
typename T = OutputData>
88 requires (!std::is_void_v<T>)
90 if constexpr (!std::is_void_v<ModuleType>) {
92 auto& cmd_mbx =
module_ptr_->template get_cmd_mailbox_public<0>();
94 auto subscribers =
module_ptr_->get_output_subscribers(0);
96 for (
const auto& sub : subscribers) {
98 uint32_t dest_mailbox = sub.base_addr | sub.input_index;
99 auto result = cmd_mbx.send(data, dest_mailbox);
101 std::cerr <<
"[" <<
module_name_ <<
"] Send failed to subscriber base=0x" << std::hex << sub.base_addr
102 <<
" mbx_idx=" << std::dec << static_cast<int>(sub.input_index)
103 <<
" dest=0x" << std::hex << dest_mailbox << std::dec
104 <<
" error=" <<
static_cast<int>(result.get_error()) <<
"\n";
117 if constexpr (!std::is_void_v<ModuleType>) {
119 auto& cmd_mbx =
module_ptr_->template get_cmd_mailbox_public<0>();
121 auto subscribers =
module_ptr_->get_output_subscribers(0);
123 for (
const auto& sub : subscribers) {
124 uint32_t dest_mailbox = sub.base_addr | sub.input_index;
128 std::cerr <<
"[" <<
module_name_ <<
"] Send failed to subscriber base=0x" << std::hex << sub.base_addr
129 <<
" mbx_idx=" << std::dec << static_cast<int>(sub.input_index)
130 <<
" dest=0x" << std::hex << dest_mailbox << std::dec
131 <<
" error=" <<
static_cast<int>(result.get_error()) <<
"\n";
144 template<std::
size_t Index,
typename OutputType>
147 constexpr uint32_t output_msg_id = UserRegistry::template get_message_id<OutputType>();
148 constexpr uint16_t output_type_id_low =
static_cast<uint16_t
>(output_msg_id & 0xFFFF);
151 if (output_type_id_low == subscriber_type_id_low) {
153 if constexpr (!std::is_void_v<ModuleType>) {
154 auto& publish_mbx =
module_ptr_->template get_publish_mailbox_public<Index>();
155 auto result = publish_mbx.send(output, dest_mailbox);
157 std::cout <<
"[" <<
module_name_ <<
"] Send failed for output[" << Index <<
"]\n";
167 template<
typename... Ts, std::size_t... Is>
170 (publish_output_at_index<Is>(std::get<Is>(outputs)), ...);
177 template<std::
size_t Index,
typename OutputType>
179 if constexpr (!std::is_void_v<ModuleType>) {
181 auto subscribers =
module_ptr_->get_output_subscribers(Index);
184 auto& cmd_mbx =
module_ptr_->template get_cmd_mailbox_public<Index>();
185 for (
const auto& sub : subscribers) {
186 uint32_t dest_mailbox = sub.base_addr | sub.input_index;
187 auto result = cmd_mbx.send(output, dest_mailbox);
189 std::cout <<
"[" <<
module_name_ <<
"] Send failed for output[" << Index
190 <<
"] to subscriber base=0x" << std::hex << sub.base_addr
191 <<
" mbx_idx=" << std::dec << static_cast<int>(sub.input_index)
192 <<
" dest=0x" << std::hex << dest_mailbox << std::dec <<
"\n";
202 template<
typename... Ts>
214 template<
typename... Ts>
Publishing logic for producer modules.
void set_module_name(const std::string &name)
void publish_multi_outputs(std::tuple< Ts... > &outputs)
Publish multiple outputs (tuple) to subscribers Each subscriber receives only outputs matching their ...
void send_output_at_index(uint16_t subscriber_type_id_low, OutputType &output, uint32_t dest_mailbox)
Send output at given index if type matches subscriber's expected type Phase 7.4: Uses Module's get_pu...
void publish_to_subscribers(T &data)
Single-output publishing (only enabled when OutputData is not void) Publishes data to all subscribers...
static TimsMessage< T > create_tims_message(T &&payload, uint64_t timestamp_ns)
Create TimsMessage with explicit timestamp Phase 6.10: Single source of truth for timestamps (header....
void publish_multi_outputs_impl(std::tuple< Ts... > &outputs, std::index_sequence< Is... >)
Multi-output publishing implementation Phase 7: Each output publishes to its own subscriber list.
void set_module_ptr(ModuleType *ptr)
void publish_tims_message(TimsMessage< T > &tims_msg)
Publish TimsMessage<T> for single output Phase 6.10: Uses explicit timestamp from header Phase 7: Use...
void publish_output_at_index(OutputType &output)
Publish specific output to its subscribers (Phase 7) Uses CMD mailbox (one per output) and new addres...
void publish_multi_outputs_with_timestamp(std::tuple< Ts... > &outputs, uint64_t timestamp_ns)
Publish multi-outputs with explicit timestamp Phase 6.10: Wraps each output in TimsMessage with times...
CommRaT - Modern C++ Real-Time Communication Framework.