16#include <unordered_map>
59 const std::string &unit =
"") {
74 const std::string &semantic =
"") {
106 const std::string &unit =
"") {
134 const std::vector<SignalDescriptor> &
signals()
const {
return signals_; }
138 std::vector<SignalDescriptor> result;
139 for (
const auto &s : signals_) {
149 std::vector<SignalDescriptor> result;
150 for (
const auto &s : signals_) {
160 auto it = index_.find(name);
161 if (it == index_.end()) {
164 return signals_[it->second];
169 return index_.find(name) != index_.end();
176 size_t index(
const std::string &name)
const {
177 auto it = index_.find(name);
178 if (it == index_.end()) {
190 for (
const auto &s : signals_) {
192 size += s.size_bytes();
201 for (
const auto &s : signals_) {
203 size += s.size_bytes();
214 std::vector<std::string> names;
215 names.reserve(signals_.size());
216 for (
const auto &s : signals_) {
217 names.push_back(s.name);
229 if (signals_.empty()) {
241 std::string json =
"{\n \"signals\": [\n";
242 for (
size_t i = 0; i < signals_.size(); ++i) {
243 const auto &s = signals_[i];
245 json +=
" \"name\": \"" + s.name +
"\",\n";
246 json +=
" \"type\": \"" + type_to_string(s.type) +
"\",\n";
247 json +=
" \"lifecycle\": \"" +
248 lifecycle_to_string(s.lifecycle) +
"\",\n";
249 json +=
" \"offset\": " + std::to_string(s.offset);
250 if (!s.unit.empty()) {
251 json +=
",\n \"unit\": \"" + s.unit +
"\"";
253 if (!s.semantic.empty()) {
254 json +=
",\n \"semantic\": \"" + s.semantic +
"\"";
257 if (i + 1 < signals_.size()) {
264 " \"frame_size_bytes\": " + std::to_string(next_offset_) +
"\n";
273 std::vector<SignalDescriptor> signals_;
274 std::unordered_map<std::string, size_t> index_;
275 size_t next_offset_ = 0;
278 if (index_.find(desc.
name) != index_.end()) {
281 desc.
offset = next_offset_;
283 index_[desc.
name] = signals_.size();
284 signals_.push_back(std::move(desc));
287 static std::string type_to_string(
SignalType type) {
Core signal types for telemetry and streaming.
Exception hierarchy for Vulcan aerospace library.
Signal schema and frame errors.
Definition VulcanError.hpp:35
Telemetry schema builder and container.
Definition TelemetrySchema.hpp:41
size_t offset(const std::string &name) const
Get offset for signal.
Definition TelemetrySchema.hpp:173
std::vector< std::string > signal_names() const
Get all signal names.
Definition TelemetrySchema.hpp:213
bool has_signal(const std::string &name) const
Check if signal exists.
Definition TelemetrySchema.hpp:168
static TelemetrySchema from_json(const std::string &json)
Deserialize from JSON string (basic parser).
TelemetrySchema()=default
TelemetrySchema & add_int32(const std::string &name, SignalLifecycle lifecycle=SignalLifecycle::Dynamic, const std::string &semantic="")
Add an int32 signal.
Definition TelemetrySchema.hpp:72
size_t dynamic_frame_size_bytes() const
Dynamic signals frame size in bytes (for streaming).
Definition TelemetrySchema.hpp:188
TelemetrySchema & add_int64(const std::string &name, SignalLifecycle lifecycle=SignalLifecycle::Dynamic)
Add an int64 signal.
Definition TelemetrySchema.hpp:86
size_t signal_count() const
Number of signals.
Definition TelemetrySchema.hpp:210
std::vector< SignalDescriptor > static_signals() const
Get only static signals.
Definition TelemetrySchema.hpp:148
size_t index(const std::string &name) const
Get index for signal.
Definition TelemetrySchema.hpp:176
const std::vector< SignalDescriptor > & signals() const
Get all signals.
Definition TelemetrySchema.hpp:134
size_t static_frame_size_bytes() const
Static signals frame size in bytes.
Definition TelemetrySchema.hpp:199
TelemetrySchema & add_double(const std::string &name, SignalLifecycle lifecycle=SignalLifecycle::Dynamic, const std::string &unit="")
Add a double signal.
Definition TelemetrySchema.hpp:57
void validate() const
Validate schema (throws on errors).
Definition TelemetrySchema.hpp:227
std::string to_json() const
Serialize to JSON string.
Definition TelemetrySchema.hpp:240
TelemetrySchema & add_vec3(const std::string &name, SignalLifecycle lifecycle=SignalLifecycle::Dynamic, const std::string &unit="")
Add a 3-component vector (expands to name.x, name.y, name.z).
Definition TelemetrySchema.hpp:104
const SignalDescriptor & signal(const std::string &name) const
Get signal by name.
Definition TelemetrySchema.hpp:159
TelemetrySchema & add_quat(const std::string &name, SignalLifecycle lifecycle=SignalLifecycle::Dynamic)
Add a quaternion (expands to name.w, name.x, name.y, name.z).
Definition TelemetrySchema.hpp:120
std::vector< SignalDescriptor > dynamic_signals() const
Get only dynamic signals.
Definition TelemetrySchema.hpp:137
size_t frame_size_bytes() const
Total frame size in bytes (all signals).
Definition TelemetrySchema.hpp:185
Definition CSVExport.hpp:20
SignalType
Signal data type (all scalar, 8-byte aligned slots).
Definition Signal.hpp:18
@ 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
SignalLifecycle
Signal lifecycle for telemetry optimization.
Definition Signal.hpp:25
@ Static
Constant after init, sent in schema handshake only.
Definition Signal.hpp:26
@ Dynamic
Updated each step, included in streaming telemetry.
Definition Signal.hpp:27
Individual signal descriptor.
Definition Signal.hpp:31
std::string name
Signal name (e.g., "position.x").
Definition Signal.hpp:32
size_t offset
Byte offset in frame buffer.
Definition Signal.hpp:37