Vulcan
Aerospace Engineering Utilities Built on Janus
Loading...
Searching...
No Matches
Frame.hpp
Go to the documentation of this file.
1
8
9#pragma once
10
11#include <Eigen/Core>
12#include <Eigen/Geometry>
13#include <cstdint>
14#include <cstring>
15#include <stdexcept>
16#include <vector>
17
20
21namespace vulcan::io {
22
39class Frame {
40 public:
45 explicit Frame(const TelemetrySchema &schema)
46 : schema_(&schema), time_(0.0),
47 buffer_(schema.frame_size_bytes(), std::byte{0}) {}
48
49 // =========================================================================
50 // Time
51 // =========================================================================
52
54 void set_time(double t) { time_ = t; }
55
57 double time() const { return time_; }
58
59 // =========================================================================
60 // Scalar setters
61 // =========================================================================
62
64 void set(const std::string &signal, double value) {
65 const auto &desc = schema_->signal(signal);
66 if (desc.type != SignalType::Double) {
67 throw vulcan::SignalError("Type mismatch for signal: " + signal);
68 }
69 write_at<double>(desc.offset, value);
70 }
71
73 void set(const std::string &signal, int32_t value) {
74 const auto &desc = schema_->signal(signal);
75 if (desc.type != SignalType::Int32) {
76 throw vulcan::SignalError("Type mismatch for signal: " + signal);
77 }
78 // Store as int32 in 8-byte slot (4 bytes value + 4 bytes padding)
79 write_at<int64_t>(desc.offset, static_cast<int64_t>(value));
80 }
81
83 void set(const std::string &signal, int64_t value) {
84 const auto &desc = schema_->signal(signal);
85 if (desc.type != SignalType::Int64) {
86 throw vulcan::SignalError("Type mismatch for signal: " + signal);
87 }
88 write_at<int64_t>(desc.offset, value);
89 }
90
91 // =========================================================================
92 // Convenience setters: vectors
93 // =========================================================================
94
96 void set(const std::string &signal, const Eigen::Vector3d &v) {
97 set(signal + ".x", v.x());
98 set(signal + ".y", v.y());
99 set(signal + ".z", v.z());
100 }
101
104 void set(const std::string &signal, const Eigen::Vector4d &v) {
105 set(signal + ".w", v.w());
106 set(signal + ".x", v.x());
107 set(signal + ".y", v.y());
108 set(signal + ".z", v.z());
109 }
110
112 void set(const std::string &signal, const Eigen::Quaterniond &q) {
113 set(signal + ".w", q.w());
114 set(signal + ".x", q.x());
115 set(signal + ".y", q.y());
116 set(signal + ".z", q.z());
117 }
118
119 // =========================================================================
120 // Scalar getters
121 // =========================================================================
122
124 double get_double(const std::string &signal) const {
125 const auto &desc = schema_->signal(signal);
126 if (desc.type != SignalType::Double) {
127 throw vulcan::SignalError("Type mismatch for signal: " + signal);
128 }
129 return read_at<double>(desc.offset);
130 }
131
133 int32_t get_int32(const std::string &signal) const {
134 const auto &desc = schema_->signal(signal);
135 if (desc.type != SignalType::Int32) {
136 throw vulcan::SignalError("Type mismatch for signal: " + signal);
137 }
138 return static_cast<int32_t>(read_at<int64_t>(desc.offset));
139 }
140
142 int64_t get_int64(const std::string &signal) const {
143 const auto &desc = schema_->signal(signal);
144 if (desc.type != SignalType::Int64) {
145 throw vulcan::SignalError("Type mismatch for signal: " + signal);
146 }
147 return read_at<int64_t>(desc.offset);
148 }
149
150 // =========================================================================
151 // Convenience getters: vectors
152 // =========================================================================
153
155 Eigen::Vector3d get_vec3(const std::string &signal) const {
156 return Eigen::Vector3d(get_double(signal + ".x"),
157 get_double(signal + ".y"),
158 get_double(signal + ".z"));
159 }
160
162 Eigen::Quaterniond get_quat(const std::string &signal) const {
163 return Eigen::Quaterniond(
164 get_double(signal + ".w"), get_double(signal + ".x"),
165 get_double(signal + ".y"), get_double(signal + ".z"));
166 }
167
169 Eigen::Vector4d get_vec4(const std::string &signal) const {
170 return Eigen::Vector4d(
171 get_double(signal + ".w"), get_double(signal + ".x"),
172 get_double(signal + ".y"), get_double(signal + ".z"));
173 }
174
175 // =========================================================================
176 // Raw access (for serialization)
177 // =========================================================================
178
180 const std::byte *data() const { return buffer_.data(); }
181
183 std::byte *data() { return buffer_.data(); }
184
186 size_t size_bytes() const { return buffer_.size(); }
187
189 const TelemetrySchema &schema() const { return *schema_; }
190
192 void clear() {
193 time_ = 0.0;
194 std::fill(buffer_.begin(), buffer_.end(), std::byte{0});
195 }
196
197 private:
198 const TelemetrySchema *schema_;
199 double time_;
200 std::vector<std::byte> buffer_;
201
202 template <typename T> void write_at(size_t offset, T value) {
203 std::memcpy(buffer_.data() + offset, &value, sizeof(T));
204 }
205
206 template <typename T> T read_at(size_t offset) const {
207 T value;
208 std::memcpy(&value, buffer_.data() + offset, sizeof(T));
209 return value;
210 }
211};
212
213} // namespace vulcan::io
Telemetry signal schema definition for Vulcan I/O.
Exception hierarchy for Vulcan aerospace library.
Signal schema and frame errors.
Definition VulcanError.hpp:35
size_t size_bytes() const
Get buffer size in bytes.
Definition Frame.hpp:186
void set(const std::string &signal, const Eigen::Quaterniond &q)
Set quaternion (expands to signal.w, signal.x, signal.y, signal.z).
Definition Frame.hpp:112
void set(const std::string &signal, int32_t value)
Set int32 signal value.
Definition Frame.hpp:73
void set(const std::string &signal, int64_t value)
Set int64 signal value.
Definition Frame.hpp:83
double get_double(const std::string &signal) const
Get double signal value.
Definition Frame.hpp:124
void set_time(double t)
Set frame timestamp.
Definition Frame.hpp:54
Frame(const TelemetrySchema &schema)
Construct frame with schema.
Definition Frame.hpp:45
Eigen::Quaterniond get_quat(const std::string &signal) const
Get quaternion from signal.w, signal.x, signal.y, signal.z.
Definition Frame.hpp:162
void clear()
Clear all values to zero.
Definition Frame.hpp:192
void set(const std::string &signal, const Eigen::Vector4d &v)
Definition Frame.hpp:104
void set(const std::string &signal, const Eigen::Vector3d &v)
Set 3-component vector (expands to signal.x, signal.y, signal.z).
Definition Frame.hpp:96
std::byte * data()
Get raw buffer pointer (mutable).
Definition Frame.hpp:183
double time() const
Get frame timestamp.
Definition Frame.hpp:57
Eigen::Vector4d get_vec4(const std::string &signal) const
Get 4-component vector from signal.w, signal.x, signal.y, signal.z.
Definition Frame.hpp:169
void set(const std::string &signal, double value)
Set double signal value.
Definition Frame.hpp:64
const TelemetrySchema & schema() const
Get schema reference.
Definition Frame.hpp:189
int64_t get_int64(const std::string &signal) const
Get int64 signal value.
Definition Frame.hpp:142
int32_t get_int32(const std::string &signal) const
Get int32 signal value.
Definition Frame.hpp:133
const std::byte * data() const
Get raw buffer pointer (const).
Definition Frame.hpp:180
Eigen::Vector3d get_vec3(const std::string &signal) const
Get 3-component vector from signal.x, signal.y, signal.z.
Definition Frame.hpp:155
Telemetry schema builder and container.
Definition TelemetrySchema.hpp:41
Definition CSVExport.hpp:20
@ Int32
4 bytes + 4 padding - modes, phases, counters
Definition Signal.hpp:20
@ Double
8 bytes - physical quantities
Definition Signal.hpp:19
@ Int64
8 bytes - timestamps, large counters
Definition Signal.hpp:21