CommRaT 2.0.0
C++20 Real-Time Messaging Framework
Loading...
Searching...
No Matches
mailbox_set.hpp
Go to the documentation of this file.
1#pragma once
2
7#include <optional>
8
9namespace commrat {
10
30template<
31 typename UserRegistry,
32 typename OutputType,
33 typename... CommandTypes
34>
35struct MailboxSet {
36 // CMD mailbox receives user commands and sends outputs
37 using CmdMailbox = std::conditional_t<
38 sizeof...(CommandTypes) == 0,
39 // No user commands: send-only mailbox for outputs
41 // User commands: receive commands, send outputs
43 >;
44
47 // DATA mailbox not needed here - inputs handled separately at module level
48
49 std::optional<CmdMailbox> cmd;
50 std::optional<WorkMailbox> work;
51 std::optional<PublishMailbox> publish;
52
53 uint32_t base_address{0}; // Cached for convenience
54
58 static constexpr uint32_t calculate_base(uint8_t system_id, uint8_t instance_id) {
59 constexpr uint32_t type_id = UserRegistry::template get_message_id<OutputType>();
60 constexpr uint16_t type_id_low = static_cast<uint16_t>(type_id & 0xFFFF);
61 return (static_cast<uint32_t>(type_id_low) << 16) | (system_id << 8) | instance_id;
62 }
63
69 template<std::size_t OutputIndex = 0>
70 void initialize(const ModuleConfig& config) {
71 // For multi-output, use indexed access; for single/no output, use non-indexed
72 uint8_t sys_id, inst_id;
73 if (config.has_multi_output_config()) {
74 sys_id = config.system_id(OutputIndex);
75 inst_id = config.instance_id(OutputIndex);
76 } else {
77 sys_id = config.system_id();
78 inst_id = config.instance_id();
79 }
80 base_address = calculate_base(sys_id, inst_id);
81
82 // CMD mailbox
83 cmd.emplace(MailboxConfig{
84 .mailbox_id = base_address + static_cast<uint8_t>(MailboxType::CMD),
85 .message_slots = config.message_slots,
86 .max_message_size = UserRegistry::max_message_size,
87 .send_priority = static_cast<uint8_t>(config.priority),
88 .realtime = config.realtime,
89 .mailbox_name = config.name + "_cmd_" + typeid(OutputType).name()
90 });
91
92 // WORK mailbox
93 work.emplace(MailboxConfig{
94 .mailbox_id = base_address + static_cast<uint8_t>(MailboxType::WORK),
95 .message_slots = config.message_slots,
96 .max_message_size = SystemRegistry::max_message_size,
97 .send_priority = static_cast<uint8_t>(config.priority),
98 .realtime = config.realtime,
99 .mailbox_name = config.name + "_work_" + typeid(OutputType).name()
100 });
101
102 // PUBLISH mailbox
103 publish.emplace(MailboxConfig{
104 .mailbox_id = base_address + static_cast<uint8_t>(MailboxType::PUBLISH),
105 .message_slots = config.message_slots,
106 .max_message_size = UserRegistry::max_message_size,
107 .send_priority = static_cast<uint8_t>(config.priority),
108 .realtime = config.realtime,
109 .mailbox_name = config.name + "_publish_" + typeid(OutputType).name()
110 });
111 }
112};
113
114} // namespace commrat
static constexpr size_t max_message_size
Mailbox that takes a MessageRegistry and exposes payload-only interface.
Type-restricted mailbox with optimized buffer sizing.
CommRaT - Modern C++ Real-Time Communication Framework.
Complete set of mailboxes for one output type.
std::optional< CmdMailbox > cmd
std::optional< PublishMailbox > publish
std::optional< WorkMailbox > work
std::conditional_t< sizeof...(CommandTypes)==0, TypedMailbox< UserRegistry, SendOnlyTypes< OutputType > >, TypedMailbox< UserRegistry, ReceiveTypes< CommandTypes... >, SendOnlyTypes< OutputType > > > CmdMailbox
void initialize(const ModuleConfig &config)
Initialize all mailboxes in this set.
static constexpr uint32_t calculate_base(uint8_t system_id, uint8_t instance_id)
Calculate base address for this output type.
uint8_t system_id() const
Get system_id - NoOutput or SimpleOutput only.
uint8_t instance_id() const
Get instance_id - NoOutput or SimpleOutput only.
bool has_multi_output_config() const
Tag type to mark send-only types in template parameter.
Type-restricted mailbox with optimized buffer sizing (Phase 7)