Vulcan
Aerospace Engineering Utilities Built on Janus
Loading...
Searching...
No Matches
FrameSerializer.hpp
Go to the documentation of this file.
1
9
10#pragma once
11
12#include <cstddef>
13#include <cstring>
14#include <span>
15#include <vector>
16
18#include <vulcan/io/Frame.hpp>
20
21namespace vulcan::io {
22
55 public:
61 : schema_(schema),
62 dynamic_buffer_(8 + schema.dynamic_frame_size_bytes()),
63 static_buffer_(schema.static_frame_size_bytes()) {
64 // Build offset maps for dynamic and static signals
65 size_t dynamic_offset = 8; // After time
66 size_t static_offset = 0;
67
68 for (const auto &sig : schema.signals()) {
69 if (sig.lifecycle == SignalLifecycle::Dynamic) {
70 dynamic_offsets_.push_back({sig.offset, dynamic_offset});
71 dynamic_offset += 8;
72 } else {
73 static_offsets_.push_back({sig.offset, static_offset});
74 static_offset += 8;
75 }
76 }
77 }
78
88 std::span<const std::byte> serialize(const Frame &frame) {
89 // Write time
90 double time = frame.time();
91 std::memcpy(dynamic_buffer_.data(), &time, sizeof(double));
92
93 // Write dynamic signals
94 for (const auto &[src_offset, dst_offset] : dynamic_offsets_) {
95 std::memcpy(dynamic_buffer_.data() + dst_offset,
96 frame.data() + src_offset, 8);
97 }
98
99 return std::span<const std::byte>(dynamic_buffer_);
100 }
101
108 std::span<const std::byte> serialize_statics(const Frame &frame) {
109 for (const auto &[src_offset, dst_offset] : static_offsets_) {
110 std::memcpy(static_buffer_.data() + dst_offset,
111 frame.data() + src_offset, 8);
112 }
113 return std::span<const std::byte>(static_buffer_);
114 }
115
122 void deserialize(std::span<const std::byte> data, Frame &frame) {
123 if (data.size() < 8) {
124 throw vulcan::SignalError("Invalid frame data: too small");
125 }
126
127 // Read time
128 double time;
129 std::memcpy(&time, data.data(), sizeof(double));
130 frame.set_time(time);
131
132 // Read dynamic signals
133 for (const auto &[src_offset, dst_offset] : dynamic_offsets_) {
134 if (dst_offset + 8 > data.size()) {
136 "Invalid frame data: incomplete signal data");
137 }
138 std::memcpy(frame.data() + src_offset, data.data() + dst_offset, 8);
139 }
140 }
141
148 void deserialize_statics(std::span<const std::byte> data, Frame &frame) {
149 for (const auto &[src_offset, dst_offset] : static_offsets_) {
150 if (dst_offset + 8 > data.size()) {
152 "Invalid static data: incomplete signal data");
153 }
154 std::memcpy(frame.data() + src_offset, data.data() + dst_offset, 8);
155 }
156 }
157
159 size_t dynamic_size_bytes() const { return dynamic_buffer_.size(); }
160
162 size_t static_size_bytes() const { return static_buffer_.size(); }
163
165 const TelemetrySchema &schema() const { return schema_; }
166
167 private:
168 TelemetrySchema schema_;
169 std::vector<std::byte> dynamic_buffer_;
170 std::vector<std::byte> static_buffer_;
171
172 // Maps: (frame buffer offset, serialized buffer offset)
173 std::vector<std::pair<size_t, size_t>> dynamic_offsets_;
174 std::vector<std::pair<size_t, size_t>> static_offsets_;
175};
176
177} // namespace vulcan::io
Telemetry frame data container for Vulcan I/O.
Telemetry signal schema definition for Vulcan I/O.
Exception hierarchy for Vulcan aerospace library.
Signal schema and frame errors.
Definition VulcanError.hpp:35
void deserialize_statics(std::span< const std::byte > data, Frame &frame)
Deserialize static signals.
Definition FrameSerializer.hpp:148
size_t static_size_bytes() const
Get static frame size in bytes.
Definition FrameSerializer.hpp:162
std::span< const std::byte > serialize_statics(const Frame &frame)
Serialize static signals only (for schema handshake).
Definition FrameSerializer.hpp:108
std::span< const std::byte > serialize(const Frame &frame)
Serialize frame (time + dynamic signals) to binary.
Definition FrameSerializer.hpp:88
const TelemetrySchema & schema() const
Get schema reference.
Definition FrameSerializer.hpp:165
void deserialize(std::span< const std::byte > data, Frame &frame)
Deserialize binary to frame (time + dynamic signals).
Definition FrameSerializer.hpp:122
FrameSerializer(const TelemetrySchema &schema)
Construct serializer for a schema.
Definition FrameSerializer.hpp:60
size_t dynamic_size_bytes() const
Get dynamic frame size in bytes (time + dynamic signals).
Definition FrameSerializer.hpp:159
Single timestep of telemetry data.
Definition Frame.hpp:39
void set_time(double t)
Set frame timestamp.
Definition Frame.hpp:54
double time() const
Get frame timestamp.
Definition Frame.hpp:57
const std::byte * data() const
Get raw buffer pointer (const).
Definition Frame.hpp:180
Telemetry schema builder and container.
Definition TelemetrySchema.hpp:41
Definition CSVExport.hpp:20
Definition Epoch.hpp:12