5#include "JSONSerialiser.hpp"
7#include "../Project.hpp"
8#include "../Sensor.hpp"
14template <
typename builder_type>
17 builder_type& builder,
18 const echomap::Project& project
21 static constexpr unsigned int schema_version = 1;
22 bool first_element =
true;
24 builder.start_object();
25 builder.append_key_value(
"schema_version", schema_version);
26 builder.append_comma();
29 builder.escape_and_append_with_quotes(
"metadata");
30 builder.append_colon();
31 builder.start_object();
32 builder.append_key_value(
"name", project.get_name());
34 builder.append_comma();
37 builder.escape_and_append_with_quotes(
"signals");
38 builder.append_colon();
39 builder.start_array();
42 builder.append_comma();
44 builder.append(signal);
45 first_element =
false;
49 builder.append_comma();
52 builder.escape_and_append_with_quotes(
"sensors");
53 builder.append_colon();
54 builder.start_array();
57 builder.append_comma();
59 builder.append(sensor);
60 first_element =
false;
64 builder.append_comma();
67 builder.escape_and_append_with_quotes(
"mappings");
68 builder.append_colon();
69 builder.start_array();
72 builder.append_comma();
74 builder.start_object();
75 builder.append_key_value(
"sensor", sensor.get_name());
76 builder.append_comma();
77 builder.append_key_value(
"signal",
signal.get_name());
80 first_element =
false;
87template <
typename builder_type>
90 builder_type& builder,
91 const echomap::Sensor& sensor
94 builder.start_object();
97 builder.append_key_value(
"name", sensor.get_name());
98 builder.append_comma();
101 builder.escape_and_append_with_quotes(
"position");
102 builder.append_colon();
103 builder.start_object();
104 builder.append_key_value(
"x", sensor.position.
x);
105 builder.append_comma();
106 builder.append_key_value(
"y", sensor.position.
y);
107 builder.append_comma();
108 builder.append_key_value(
"z", sensor.position.
z);
109 builder.end_object();
110 builder.append_comma();
113 builder.escape_and_append_with_quotes(
"colour");
114 builder.append_colon();
115 builder.start_object();
116 builder.append_key_value(
"r", sensor.colour.
r);
117 builder.append_comma();
118 builder.append_key_value(
"g", sensor.colour.
g);
119 builder.append_comma();
120 builder.append_key_value(
"b", sensor.colour.
b);
121 builder.append_comma();
122 builder.append_key_value(
"a", sensor.colour.
a);
123 builder.end_object();
125 builder.end_object();
128template <
typename builder_type>
131 builder_type& builder,
132 const echomap::Signal& signal
135 builder.start_object();
138 builder.append_key_value(
"name",
signal.get_name());
139 builder.append_comma();
142 builder.escape_and_append_with_quotes(
"source");
143 builder.append_colon();
144 builder.start_object();
147 if (
signal.observe_source().has_value() && !
signal.observe_source()->dirty) {
148 const auto& source = *
signal.observe_source();
149 builder.append_key_value(
"kind",
"filesystem");
150 builder.append_comma();
152 builder.append_comma();
153 builder.append_key_value(
"channel", source.channel);
158 builder.append_key_value(
"kind",
signal.is_uniformly_sampled() ?
"embeddedUniform" :
"embeddedVariable");
159 builder.append_comma();
162 signal.get_sample_count() != 0) {
163 builder.append_key_value(
"time_offset",
signal.get_time_offset());
164 builder.append_comma();
165 builder.append_key_value(
"sample_rate",
signal.get_sample_rate());
166 builder.append_comma();
169 builder.append_key_value(
"sample_count",
signal.get_sample_count());
170 builder.append_comma();
172 builder.escape_and_append_with_quotes(
"samples");
173 builder.append_colon();
174 builder.start_array();
176 bool first_element =
true;
178 if (
signal.is_uniformly_sampled())
179 for (
const auto sample : signal) {
181 builder.append_comma();
183 builder.append(sample);
184 first_element =
false;
187 for (
const auto [time, amplitude] :
signal.timed_samples()) {
189 builder.append_comma();
191 builder.start_object();
192 builder.append_key_value(
"time", time);
193 builder.append_comma();
194 builder.append_key_value(
"amplitude", amplitude);
195 builder.end_object();
197 first_element =
false;
203 builder.end_object();
204 builder.end_object();
212std::string_view JSONSerialiser::serialise_project(
221std::string JSONSerialiser::pretty_print(
222 const std::string_view data
226 simdjson::fractured_json_options options{};
228 return simdjson::fractured_json_string(data, options);
Audio signal class specification.
auto observe_signals() const noexcept
Provides a transformed view for stored Signal objects in the Project.
auto observe_associations() const
Provides a transformed view for defined channel mappings.
auto observe_sensors() const noexcept
Provides a transformed view for stored Sensor objects in the Project.
The main EchoMap outermost namespace for all non-exported symbols.
float b
The blue component in the range [0, 1].
float a
The alpha extent in the range [0, 1].
float g
The green component in the range [0, 1].
float r
The red component in the range [0, 1].
float y
The Y co-ordinate.
float x
The X co-ordinate.
float z
The Z co-ordinate.
float TimeT
Type for sample times.