CommRaT 2.0.0
C++20 Real-Time Messaging Framework
Loading...
Searching...
No Matches
messages.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstdint>
4#include <type_traits>
5#include <span>
6#include <cstring>
7
8// Real SeRTial includes
9#include <sertial/sertial.hpp>
10#include <sertial/containers/fixed_vector.hpp>
11#include <sertial/containers/fixed_string.hpp>
12
13namespace commrat {
14
15// TIMS message header (required by TIMS protocol)
16struct TimsHeader {
17 uint32_t msg_type;
18 uint32_t msg_size; // Will be set by serialization
19 uint64_t timestamp; // Will be set by send()
20 uint32_t seq_number; // Will be set by send()
21 uint32_t flags;
22};
23
24// Message type ID - use compile-time type hash for automatic unique IDs
25using MessageType = uint32_t;
26
27// Helper to get compile-time hash of a type
28template<typename T>
30 // Use type_info hash at compile time
31 // For C++20, we can use a simple constexpr hash
32 constexpr auto name = std::string_view{__PRETTY_FUNCTION__};
33 uint32_t hash = 2166136261u; // FNV-1a initial value
34 for (char c : name) {
35 hash ^= static_cast<uint32_t>(c);
36 hash *= 16777619u; // FNV prime
37 }
38 return hash;
39}
40
41// ============================================================================
42// Message Type Traits (Automatic Type-to-ID Mapping)
43// ============================================================================
44
45// Default: use compile-time type hash for automatic unique IDs
46template<typename PayloadT>
48 static constexpr MessageType value = type_hash<PayloadT>();
49};
50
51// ============================================================================
52// Templated Message Wrapper (No MsgType parameter needed!)
53// ============================================================================
54
55// Generic message wrapper combining TIMS header with user payload
56// Must be aggregate type for reflection (no constructors!)
57template<typename PayloadT>
60 PayloadT payload;
61
62 // Payload type accessor
63 using payload_type = PayloadT;
64};
65
66// ============================================================================
67// Payload Type Definitions (using SeRTial containers)
68// ============================================================================
69
70// Command payload
72 uint32_t command_id;
73 uint32_t target_id;
74 sertial::fixed_vector<uint8_t, 64> parameters;
75};
76// Note: Use MessageDefinition for new code instead of message_type_for
77
78// Status payload
80 uint32_t status_code;
81 uint32_t subsystem_id;
82 float cpu_load;
84 sertial::fixed_string<64> description;
85};
86
87// Error payload
89 uint32_t error_code;
90 uint32_t source_id;
91 sertial::fixed_string<128> error_text;
92};
93
94// Acknowledgment payload
95struct AckPayload {
97 uint32_t ack_code;
98};
99
100// Sensor data payload (example with dynamic data)
102 uint32_t sensor_id;
104 float pressure;
105 float humidity;
106 sertial::fixed_vector<float, 16> additional_readings;
107};
108
109// Robot state payload (example nested structures)
111 struct Pose {
112 double x, y, z;
113 double roll, pitch, yaw;
115
120
121 uint32_t robot_id;
122 sertial::fixed_string<32> status;
123};
124
125// ============================================================================
126// Convenient Type Aliases
127// ============================================================================
128
135
136// Generic data message for any type
137template<typename T>
139
140// ============================================================================
141// Type Traits
142// ============================================================================
143
144template<typename T>
145struct is_commrat_message : std::false_type {};
146
147template<typename P>
148struct is_commrat_message<TimsMessage<P>> : std::true_type {};
149
150template<typename T>
152
153// Extract payload type
154template<typename T>
156
157template<typename P>
159 using type = P;
160};
161
162template<typename T>
164
165// ============================================================================
166// Serialization Functions (Clean User Interface)
167// ============================================================================
168
169// Primary user-facing serialization interface
170template<typename T>
171auto serialize(T& message) -> typename sertial::Message<T>::Result {
172 static_assert(is_commrat_message_v<T>, "T must be a CommRaT message type");
173
174 // Check if T has message_type (old-style messages)
175 if constexpr (requires { T::message_type; }) {
176 // Automatically set message type from template parameter
177 message.header.msg_type = static_cast<uint32_t>(T::message_type);
178 }
179 // For TimsMessage<PayloadT> without message_type, assume it's already set by Registry
180
181 // Use SeRTial's serialization
182 auto result = sertial::Message<T>::serialize(message);
183
184 // Update header with actual serialized size
185 message.header.msg_size = static_cast<uint32_t>(result.size);
186
187 return result;
188}
189
190// Primary user-facing deserialization interface
191template<typename T>
192auto deserialize(std::span<const std::byte> data) -> sertial::DeserializeResult<T> {
193 static_assert(is_commrat_message_v<T>, "T must be a CommRaT message type");
194
195 // Use SeRTial's deserialization
196 return sertial::Message<T>::deserialize(data);
197}
198
199// Helper for uint8_t* buffers (TIMS compatibility)
200template<typename T>
201auto deserialize(const uint8_t* data, size_t size) -> sertial::DeserializeResult<T> {
202 // Convert uint8_t* to std::byte span for SeRTial
203 auto byte_span = std::span<const std::byte>(reinterpret_cast<const std::byte*>(data), size);
204 return deserialize<T>(byte_span);
205}
206
207// Internal functions for compatibility (used by MessageService)
208template<typename T>
209auto serialize_message(T& message) -> typename sertial::Message<T>::Result {
210 return serialize(message);
211}
212
213template<typename T>
214auto deserialize_message(std::span<const std::byte> data) -> sertial::DeserializeResult<T> {
215 return deserialize<T>(data);
216}
217
218template<typename T>
219auto deserialize_message(const uint8_t* data, size_t size) -> sertial::DeserializeResult<T> {
220 return deserialize<T>(data, size);
221}
222// ============================================================================
223// Compile-Time Utilities
224// ============================================================================
225
226// Get maximum buffer size needed for a message type at compile time
227template<typename T>
228inline constexpr size_t max_message_buffer_size_v = sertial::Message<T>::max_buffer_size;
229
230// Get packed size (without padding) at compile time
231template<typename T>
232inline constexpr size_t packed_message_size_v = sertial::Message<T>::packed_size;
233
234// Check if message has padding
235template<typename T>
236inline constexpr bool message_has_padding_v = sertial::Message<T>::has_padding;
237
238} // namespace commrat
CommRaT - Modern C++ Real-Time Communication Framework.
constexpr size_t packed_message_size_v
Definition messages.hpp:232
uint32_t MessageType
Definition messages.hpp:25
constexpr MessageType type_hash()
Definition messages.hpp:29
auto serialize_message(T &message) -> typename sertial::Message< T >::Result
Definition messages.hpp:209
auto serialize(T &message) -> typename sertial::Message< T >::Result
Definition messages.hpp:171
auto deserialize_message(std::span< const std::byte > data) -> sertial::DeserializeResult< T >
Definition messages.hpp:214
typename message_payload< T >::type message_payload_t
Definition messages.hpp:163
constexpr bool is_commrat_message_v
Definition messages.hpp:151
constexpr size_t max_message_buffer_size_v
Definition messages.hpp:228
constexpr bool message_has_padding_v
Definition messages.hpp:236
auto deserialize(std::span< const std::byte > data) -> sertial::DeserializeResult< T >
Definition messages.hpp:192
uint32_t acked_seq_number
Definition messages.hpp:96
sertial::fixed_vector< uint8_t, 64 > parameters
Definition messages.hpp:74
sertial::fixed_string< 128 > error_text
Definition messages.hpp:91
struct commrat::RobotStatePayload::Velocity velocity
struct commrat::RobotStatePayload::Pose pose
sertial::fixed_string< 32 > status
Definition messages.hpp:122
sertial::fixed_vector< float, 16 > additional_readings
Definition messages.hpp:106
sertial::fixed_string< 64 > description
Definition messages.hpp:84
static constexpr MessageType value
Definition messages.hpp:48