CommRaT 2.0.0
C++20 Real-Time Messaging Framework
Loading...
Searching...
No Matches
address_helpers.hpp
Go to the documentation of this file.
1#pragma once
2
6#include <cstdint>
7#include <algorithm>
8
9namespace commrat {
10
11// ============================================================================
12// Address Encoding Constants (RACK-style, byte-aligned)
13// ============================================================================
14
15// Address field shifts (high to low hierarchy)
16constexpr uint8_t TYPE_ID_SHIFT = 24;
17constexpr uint8_t SYSTEM_ID_SHIFT = 16;
18constexpr uint8_t INSTANCE_ID_SHIFT = 8;
19constexpr uint8_t MAILBOX_INDEX_SHIFT = 0;
20
21// Address field masks
22constexpr uint32_t TYPE_ID_MASK = 0xFF000000;
23constexpr uint32_t SYSTEM_ID_MASK = 0x00FF0000;
24constexpr uint32_t INSTANCE_ID_MASK = 0x0000FF00;
25constexpr uint32_t MAILBOX_INDEX_MASK = 0x000000FF;
26
27// Mailbox index constants (RACK-style)
28constexpr uint8_t CMD_MBX_BASE = 0; // CMD mailboxes start at index 0
29
30// ============================================================================
31// Address Encoding/Decoding Functions
32// ============================================================================
33
39constexpr uint32_t encode_address(uint8_t type_id, uint8_t system_id,
40 uint8_t instance_id, uint8_t mailbox_index) {
41 return (static_cast<uint32_t>(type_id) << TYPE_ID_SHIFT) |
42 (static_cast<uint32_t>(system_id) << SYSTEM_ID_SHIFT) |
43 (static_cast<uint32_t>(instance_id) << INSTANCE_ID_SHIFT) |
44 (static_cast<uint32_t>(mailbox_index) << MAILBOX_INDEX_SHIFT);
45}
46
50constexpr uint32_t get_base_address(uint8_t type_id, uint8_t system_id, uint8_t instance_id) {
51 return encode_address(type_id, system_id, instance_id, 0);
52}
53
57constexpr uint8_t extract_mailbox_index(uint32_t addr) {
58 return static_cast<uint8_t>((addr & MAILBOX_INDEX_MASK) >> MAILBOX_INDEX_SHIFT);
59}
60
64constexpr uint8_t extract_type_id(uint32_t addr) {
65 return static_cast<uint8_t>((addr & TYPE_ID_MASK) >> TYPE_ID_SHIFT);
66}
67
71constexpr uint8_t extract_system_id(uint32_t addr) {
72 return static_cast<uint8_t>((addr & SYSTEM_ID_MASK) >> SYSTEM_ID_SHIFT);
73}
74
78constexpr uint8_t extract_instance_id(uint32_t addr) {
79 return static_cast<uint8_t>((addr & INSTANCE_ID_MASK) >> INSTANCE_ID_SHIFT);
80}
81
85constexpr uint8_t get_data_mbx_base(uint8_t num_outputs) {
86 return CMD_MBX_BASE + num_outputs;
87}
88
93inline constexpr uint8_t extract_message_type_from_address(uint32_t base_addr) {
94 return extract_type_id(base_addr);
95}
96
97// ============================================================================
98// Template-based Address Calculation
99// ============================================================================
100
106template<typename OutputData, typename OutputTypesTuple, typename UserRegistry>
107static constexpr uint32_t calculate_base_address(uint8_t system_id, uint8_t instance_id) {
108 // Get message ID for output data type from registry
109 // For multi-output, use first output type from the tuple
110 using BaseType = std::conditional_t<
111 std::is_void_v<OutputData>,
112 std::tuple_element_t<0, OutputTypesTuple>,
113 OutputData
114 >;
115 constexpr uint32_t data_type_id = UserRegistry::template get_message_id<BaseType>();
116 // Use lower 8 bits of message ID for type_id field
117 constexpr uint8_t type_id = static_cast<uint8_t>(data_type_id & 0xFF);
118 return get_base_address(type_id, system_id, instance_id);
119}
120
124template<typename OutputData, typename OutputTypesTuple, typename UserRegistry>
125static constexpr uint32_t get_mailbox_address(uint8_t system_id, uint8_t instance_id, uint8_t mailbox_index) {
126 uint32_t base = calculate_base_address<OutputData, OutputTypesTuple, UserRegistry>(system_id, instance_id);
127 return base | mailbox_index;
128}
129
130// ============================================================================
131// Compile-Time Mailbox Sizing
132// ============================================================================
133
138template<typename... CommandTypes>
139static constexpr size_t calculate_cmd_mailbox_size() {
140 return std::max({
146 });
147}
148
152template<typename InputType>
153static constexpr size_t get_data_mailbox_size() {
154 return sizeof(TimsMessage<InputType>);
155}
156
157// ============================================================================
158// Mailbox Configuration Helpers
159// ============================================================================
160
166 return MailboxConfig{
167 .mailbox_id = 0, // Set by caller
168 .message_slots = config.message_slots,
169 .max_message_size = SystemRegistry::max_message_size,
170 .send_priority = static_cast<uint8_t>(config.priority),
171 .realtime = config.realtime,
172 .mailbox_name = config.name + "_work"
173 };
174}
175
176} // namespace commrat
static constexpr size_t max_message_size
CommRaT - Modern C++ Real-Time Communication Framework.
constexpr uint8_t extract_mailbox_index(uint32_t addr)
Extract mailbox index from full address.
constexpr uint32_t MAILBOX_INDEX_MASK
constexpr uint8_t MAILBOX_INDEX_SHIFT
constexpr uint32_t get_base_address(uint8_t type_id, uint8_t system_id, uint8_t instance_id)
Get base address (type/system/instance only, mailbox_index=0)
constexpr uint32_t encode_address(uint8_t type_id, uint8_t system_id, uint8_t instance_id, uint8_t mailbox_index)
Encode full mailbox address Format: [type_id:8][system_id:8][instance_id:8][mailbox_index:8] Example:...
constexpr uint32_t TYPE_ID_MASK
constexpr uint32_t INSTANCE_ID_MASK
constexpr uint8_t extract_type_id(uint32_t addr)
Extract type ID from address.
constexpr uint32_t SYSTEM_ID_MASK
static constexpr size_t get_data_mailbox_size()
Calculate DATA mailbox size for specific input type.
constexpr uint8_t CMD_MBX_BASE
static constexpr size_t calculate_cmd_mailbox_size()
Calculate CMD mailbox size at compile time Size = max(SystemRegistry messages, Module's Commands<....
constexpr uint8_t extract_system_id(uint32_t addr)
Extract system ID from address.
constexpr uint8_t TYPE_ID_SHIFT
constexpr uint8_t INSTANCE_ID_SHIFT
static constexpr uint32_t calculate_base_address(uint8_t system_id, uint8_t instance_id)
Calculate base mailbox address from output type, system_id, and instance_id New format: [type_id:8][s...
static MailboxConfig createWorkMailboxConfig(const ModuleConfig &config)
Create work mailbox config (for SystemRegistry messages)
static constexpr uint32_t get_mailbox_address(uint8_t system_id, uint8_t instance_id, uint8_t mailbox_index)
Get specific mailbox address with index.
constexpr uint8_t SYSTEM_ID_SHIFT
constexpr uint8_t extract_message_type_from_address(uint32_t base_addr)
Extract message type ID from subscriber base address (for backward compatibility) Now just extracts t...
constexpr uint8_t get_data_mbx_base(uint8_t num_outputs)
Get DATA mailbox base index (after all CMD mailboxes)
constexpr uint8_t extract_instance_id(uint32_t addr)
Extract instance ID from address.