12#include "../Project.hpp"
18simdjson::error_code JSONDeserialiserHelpers::get_metadata(
19 simdjson::ondemand::object& root,
23 simdjson::ondemand::object metadata;
24 auto error = root[
"metadata"].get_object().get(metadata);
28 std::string project_name;
29 if ((error = metadata[
"name"].get(project_name)))
32 project.set_name(project_name);
33 return simdjson::SUCCESS;
36simdjson::error_code JSONDeserialiserHelpers::get_sensors(
37 simdjson::ondemand::object& root,
44 std::vector<std::unique_ptr<Sensor>> sensors;
45 if (
const auto error = root[
"sensors"].get(sensors))
48 for (
auto&& sensor : sensors) {
49 if (!loaded.emplace(sensor->get_name(), sensor->get_id()).second)
50 throw std::runtime_error(
std::format(
"Project contains duplicate sensor {}.", sensor->get_name()));
51 project.add_sensor(std::move(sensor));
54 return simdjson::SUCCESS;
57simdjson::error_code JSONDeserialiserHelpers::get_mappings(
58 simdjson::ondemand::object& root,
60 const std::unordered_map<
63 const std::unordered_map<
68 simdjson::ondemand::array mappings;
69 auto error = root[
"mappings"].get_array().get(mappings);
73 for (
auto mapping : mappings) {
74 simdjson::ondemand::object mapping_obj;
75 if ((error = mapping.get_object().get(mapping_obj)))
78 std::string_view signal_name;
79 std::string_view sensor_name;
81 if ((error = mapping_obj[
"signal"].get(signal_name)))
84 if ((error = mapping_obj[
"sensor"].get(sensor_name)))
87 const auto signal_it = signals.find(signal_name);
88 if (signal_it == signals.end())
89 throw std::runtime_error(
std::format(
"Channel mapping referred to non-existent signal {}.", signal_name));
91 const auto sensor_it = sensors.find(sensor_name);
92 if (sensor_it == sensors.end())
93 throw std::runtime_error(
std::format(
"Channel mapping referred to non-existent sensor {}.", sensor_name));
95 project.add_association(signal_it->second, sensor_it->second);
98 return simdjson::SUCCESS;
101void JSONDeserialiserHelpers::verify_sample_count(
102 std::uint64_t reported_sample_count,
106 if (reported_sample_count !=
signal.get_sample_count())
107 throw std::runtime_error(
109 "Embedded signal {} reported the incorrect number of samples: claimed {}, but received {}.",
111 reported_sample_count,
117simdjson::error_code JSONDeserialiserHelpers::get_uniformly_sampled_signal_source(
118 simdjson::ondemand::object& source,
122 std::uint64_t reported_sample_count;
123 auto error = source[
"sample_count"].get(reported_sample_count);
127 std::size_t sample_rate;
128 if ((error = source[
"sample_rate"].get(sample_rate)))
130 signal_factory.set_sample_rate(sample_rate);
133 if ((error = source[
"time_offset"].get(time_offset)))
135 signal_factory.set_time_offset(time_offset);
137 simdjson::ondemand::array samples;
138 if ((error = source[
"samples"].get_array().get(samples)))
141 for (
auto sample_wrapper : samples) {
143 if ((error = sample_wrapper.get(amplitude)))
145 signal_factory.emplace_sample(amplitude);
148 verify_sample_count(reported_sample_count, signal_factory.observe_signal());
152simdjson::error_code JSONDeserialiserHelpers::get_variably_sampled_signal_source(
153 simdjson::ondemand::object& source,
157 std::uint64_t reported_sample_count;
158 auto error = source[
"sample_count"].get(reported_sample_count);
162 std::size_t sample_rate;
163 if ((error = get_or_default(source,
"sample_rate", sample_rate, std::size_t{0})))
165 signal_factory.set_sample_rate(sample_rate);
168 if ((error = get_or_default(source,
"time_offset", time_offset, 0.0f)))
170 signal_factory.set_time_offset(time_offset);
172 simdjson::ondemand::array samples;
173 if ((error = source[
"samples"].get_array().get(samples)))
176 for (
auto sample_wrapper : samples) {
177 simdjson::ondemand::object sample_obj;
178 if ((error = sample_wrapper.get_object().get(sample_obj)))
180 Signal::Sample sample_data;
181 if ((error = sample_obj[
"time"].get(sample_data.time)))
183 if ((error = sample_obj[
"amplitude"].get(sample_data.amplitude)))
185 signal_factory.emplace_sample(sample_data.time, sample_data.amplitude);
188 verify_sample_count(reported_sample_count, signal_factory.observe_signal());
JSONDeserialiserHelpers specification.
Audio signal class specification.
Provides various convenience functions for constructing Signal objects in exotic ways.
A single channel of discretely sampled audio data.
The main EchoMap outermost namespace for all non-exported symbols.