Skip to content

Commit 2409ce7

Browse files
committed
Simplified json.
1 parent 6e6acba commit 2409ce7

20 files changed

+210
-270
lines changed

sources/config.cpp

Lines changed: 28 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <radio/sdr_device_reader.h>
66
#include <utils/utils.h>
77

8+
#include <fstream>
89
#include <regex>
910

1011
constexpr auto LABEL = "config";
@@ -25,67 +26,13 @@ spdlog::level::level_enum parseLogLevel(const std::string& level) {
2526
return spdlog::level::level_enum::off;
2627
}
2728

28-
template <typename T>
29-
T readKey(const nlohmann::json& json, const std::vector<std::string>& keys) {
30-
std::string key;
31-
try {
32-
nlohmann::json value = json;
33-
for (const auto& _key : keys) {
34-
value = value.at(_key);
35-
key += _key + ".";
36-
}
37-
key.pop_back();
38-
Logger::info(LABEL, "read json variable, key: {}, value: {}", colored(GREEN, "{}", key), colored(GREEN, "{}", value.get<T>()));
39-
return value.get<T>();
40-
} catch (const std::exception& exception) {
41-
throw std::runtime_error(fmt::format("key not found in json config: {}", key));
42-
}
43-
}
44-
45-
std::vector<FrequencyRange> readIgnoredRanges(const nlohmann::json& json) {
46-
constexpr auto KEY = "ignored_frequencies";
47-
try {
48-
std::vector<FrequencyRange> ranges;
49-
for (const auto& item : json.at(KEY)) {
50-
const auto frequency = item.at("frequency").get<Frequency>();
51-
const auto bandwidth = item.at("bandwidth").get<Frequency>();
52-
ranges.emplace_back(frequency - bandwidth / 2, frequency + bandwidth / 2);
53-
}
54-
return ranges;
55-
} catch (const std::exception& exception) {
56-
throw std::runtime_error(fmt::format("key not found or invalid value in json: {}", KEY));
57-
}
58-
}
59-
60-
Config::Config(const nlohmann::json& json, const ArgConfig& argConfig)
61-
: m_json(json),
62-
m_argConfig(argConfig),
63-
m_id(!argConfig.id.empty() ? argConfig.id : randomHex(8)),
64-
m_devices(SdrDeviceReader::readDevices(json)),
65-
m_isColorLogEnabled(readKey<bool>(json, {"output", "color_log_enabled"})),
66-
m_consoleLogLevel(parseLogLevel(readKey<std::string>(json, {"output", "console_log_level"}))),
67-
m_fileLogLevel(parseLogLevel(readKey<std::string>(json, {"output", "file_log_level"}))),
68-
m_ignoredRanges(readIgnoredRanges(json)),
69-
m_recordingBandwidth(readKey<Frequency>(json, {"recording", "min_sample_rate"})),
70-
m_recordingMinTime(std::chrono::milliseconds(readKey<int>(json, {"recording", "min_time_ms"}))),
71-
m_recordingTimeout(std::chrono::milliseconds(readKey<int>(json, {"recording", "max_noise_time_ms"}))),
72-
m_recordingTuningStep(readKey<Frequency>(json, {"recording", "step"})),
73-
m_workers(readKey<int>(json, {"workers"})),
74-
m_apiKey(readKey<std::string>(json, {"api_key"})),
75-
m_latitude(readKey<std::string>(json, {"position", "latitude"})),
76-
m_longitude(readKey<std::string>(json, {"position", "longitude"})),
77-
m_altitude(readKey<int>(json, {"position", "altitude"})) {}
29+
Config::Config(const nlohmann::json& json, const ArgConfig& argConfig) : m_id(!argConfig.id.empty() ? argConfig.id : randomHex(8)), m_json(json), m_argConfig(argConfig), m_fileConfig(json) {}
7830

7931
Config Config::loadFromFile(const std::string& path, const ArgConfig& argConfig) {
80-
constexpr auto BUFFER_SIZE = 1024 * 1024;
81-
FILE* file = fopen(path.c_str(), "r");
82-
83-
if (file) {
84-
char buffer[BUFFER_SIZE];
85-
const auto size = fread(buffer, 1, BUFFER_SIZE, file);
86-
fclose(file);
32+
std::ifstream stream(path);
33+
if (stream) {
8734
try {
88-
auto json = nlohmann::json::parse(std::string{buffer, size});
35+
auto json = nlohmann::json::parse(stream);
8936
ConfigMigrator::update(json);
9037
SdrDeviceReader::scanSoapyDevices(json);
9138
ConfigMigrator::sort(json);
@@ -99,15 +46,11 @@ Config Config::loadFromFile(const std::string& path, const ArgConfig& argConfig)
9946
}
10047

10148
void Config::saveToFile(const std::string& path, const nlohmann::json& json) {
102-
FILE* file = fopen(path.c_str(), "w");
103-
if (file) {
49+
std::ofstream stream(path);
50+
if (stream) {
10451
auto tmp = json;
10552
SdrDeviceReader::clearDevices(tmp);
106-
const auto data = tmp.dump(4, ' ');
107-
if (fwrite(data.c_str(), 1, data.size(), file) != data.size()) {
108-
Logger::warn(LABEL, "save new config failed");
109-
}
110-
fclose(file);
53+
stream << std::setw(4) << tmp << std::endl;
11154
} else {
11255
Logger::warn(LABEL, "save new config failed");
11356
}
@@ -132,28 +75,34 @@ nlohmann::json Config::json() const { return m_json; }
13275
std::string Config::mqtt() const { return fmt::format("{}@{}", m_argConfig.mqttUser, m_argConfig.mqttUrl); };
13376

13477
std::string Config::getId() const { return m_id; }
135-
std::vector<Device> Config::devices() const { return m_devices; }
78+
std::vector<Device> Config::devices() const { return m_fileConfig.devices; }
13679

137-
bool Config::isColorLogEnabled() const { return m_isColorLogEnabled; }
138-
spdlog::level::level_enum Config::consoleLogLevel() const { return m_consoleLogLevel; }
139-
spdlog::level::level_enum Config::fileLogLevel() const { return m_fileLogLevel; }
80+
bool Config::isColorLogEnabled() const { return m_fileConfig.output.color_log_enabled; }
81+
spdlog::level::level_enum Config::consoleLogLevel() const { return parseLogLevel(m_fileConfig.output.console_log_level); }
82+
spdlog::level::level_enum Config::fileLogLevel() const { return parseLogLevel(m_fileConfig.output.file_log_level); }
14083

141-
std::vector<FrequencyRange> Config::ignoredRanges() const { return m_ignoredRanges; }
84+
std::vector<FrequencyRange> Config::ignoredRanges() const {
85+
std::vector<FrequencyRange> ranges;
86+
for (const auto& range : m_fileConfig.ignored_frequencies) {
87+
ranges.emplace_back(range.frequency - range.bandwidth / 2, range.frequency + range.bandwidth / 2);
88+
}
89+
return ranges;
90+
}
14291
int Config::recordersCount() const {
14392
const auto max_workers = static_cast<int>(std::thread::hardware_concurrency() / 2);
144-
const auto workers = std::max(0, std::min(m_workers, max_workers));
93+
const auto workers = std::max(0, std::min(m_fileConfig.workers, max_workers));
14594
return workers == 0 ? max_workers : workers;
14695
}
147-
Frequency Config::recordingBandwidth() const { return m_recordingBandwidth; }
148-
std::chrono::milliseconds Config::recordingMinTime() const { return m_recordingMinTime; }
149-
std::chrono::milliseconds Config::recordingTimeout() const { return m_recordingTimeout; }
150-
Frequency Config::recordingTuningStep() const { return m_recordingTuningStep; }
96+
Frequency Config::recordingBandwidth() const { return m_fileConfig.recording.min_sample_rate; }
97+
std::chrono::milliseconds Config::recordingMinTime() const { return m_fileConfig.recording.min_time_ms; }
98+
std::chrono::milliseconds Config::recordingTimeout() const { return m_fileConfig.recording.max_noise_time_ms; }
99+
Frequency Config::recordingTuningStep() const { return m_fileConfig.recording.step; }
151100

152101
std::string Config::mqttUrl() const { return m_argConfig.mqttUrl; }
153102
std::string Config::mqttUsername() const { return m_argConfig.mqttUser; }
154103
std::string Config::mqttPassword() const { return m_argConfig.mqttPassword; }
155104

156-
std::string Config::apiKey() const { return m_apiKey; }
157-
std::string Config::latitude() const { return m_latitude; }
158-
std::string Config::longitude() const { return m_longitude; }
159-
int Config::altitude() const { return m_altitude; }
105+
std::string Config::apiKey() const { return m_fileConfig.api_key; }
106+
std::string Config::latitude() const { return m_fileConfig.position.latitude; }
107+
std::string Config::longitude() const { return m_fileConfig.position.longitude; }
108+
int Config::altitude() const { return m_fileConfig.position.altitude; }

sources/config.h

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#pragma once
22

3+
#include <file_config.h>
34
#include <logger.h>
45
#include <radio/help_structures.h>
56

@@ -79,25 +80,8 @@ class Config {
7980
private:
8081
Config(const nlohmann::json& json, const ArgConfig& argConfig);
8182

83+
const std::string m_id;
8284
const nlohmann::json m_json;
8385
const ArgConfig& m_argConfig;
84-
85-
const std::string m_id;
86-
const std::vector<Device> m_devices;
87-
88-
const bool m_isColorLogEnabled;
89-
const spdlog::level::level_enum m_consoleLogLevel;
90-
const spdlog::level::level_enum m_fileLogLevel;
91-
92-
const std::vector<FrequencyRange> m_ignoredRanges;
93-
const Frequency m_recordingBandwidth;
94-
const std::chrono::milliseconds m_recordingMinTime;
95-
const std::chrono::milliseconds m_recordingTimeout;
96-
const Frequency m_recordingTuningStep;
97-
const int m_workers;
98-
99-
const std::string m_apiKey;
100-
const std::string m_latitude;
101-
const std::string m_longitude;
102-
const int m_altitude;
86+
const FileConfig m_fileConfig;
10387
};

sources/file_config.h

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#pragma once
2+
3+
#include <radio/help_structures.h>
4+
#include <utils/serializers.h>
5+
6+
#include <nlohmann/json.hpp>
7+
#include <vector>
8+
9+
struct IgnoredFrequency {
10+
Frequency frequency;
11+
Frequency bandwidth;
12+
};
13+
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(IgnoredFrequency, frequency, bandwidth)
14+
15+
struct OutputConfig {
16+
bool color_log_enabled;
17+
std::string console_log_level;
18+
std::string file_log_level;
19+
};
20+
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(OutputConfig, color_log_enabled, console_log_level, file_log_level)
21+
22+
struct PositionConfig {
23+
std::string latitude;
24+
std::string longitude;
25+
int altitude;
26+
};
27+
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(PositionConfig, latitude, longitude, altitude)
28+
29+
struct RecordingConfig {
30+
Frequency min_sample_rate;
31+
std::chrono::milliseconds min_time_ms;
32+
std::chrono::milliseconds max_noise_time_ms;
33+
Frequency step;
34+
};
35+
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(RecordingConfig, min_sample_rate, min_time_ms, max_noise_time_ms, step)
36+
37+
struct FileConfig {
38+
std::string api_key;
39+
std::vector<Device> devices;
40+
std::vector<IgnoredFrequency> ignored_frequencies;
41+
OutputConfig output;
42+
PositionConfig position;
43+
RecordingConfig recording;
44+
int workers;
45+
};
46+
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(FileConfig, api_key, devices, ignored_frequencies, output, position, recording, workers)

sources/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ int main(int argc, char** argv) {
6161
std::vector<std::unique_ptr<Scanner>> scanners;
6262
for (const auto& device : config.devices()) {
6363
try {
64-
if (!device.m_enabled) {
64+
if (!device.enabled) {
6565
Logger::info(LABEL, "device disabled, skipping: {}", colored(GREEN, "{}", device.getName()));
6666
} else {
6767
scanners.push_back(std::make_unique<Scanner>(config, device, mqtt, remoteController, config.recordersCount()));

sources/network/query.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
#pragma once
2+
3+
#include <radio/help_structures.h>
4+
#include <utils/serializers.h>
5+
6+
struct SatellitesQuery {
7+
std::string latitude;
8+
std::string longitude;
9+
int altitude;
10+
std::string api_key;
11+
std::vector<Satellite> satellites;
12+
};
13+
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(SatellitesQuery, latitude, longitude, altitude, api_key, satellites)
14+
15+
struct ScheduledTransmission {
16+
std::string name;
17+
std::chrono::seconds begin;
18+
std::chrono::seconds end;
19+
Frequency frequency;
20+
Frequency bandwidth;
21+
std::string modulation;
22+
};
23+
NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(ScheduledTransmission, name, begin, end, frequency, bandwidth, modulation)

sources/radio/blocks/sdr_source.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ constexpr auto LABEL = "source";
1010

1111
SdrSource::SdrSource(const Device& device)
1212
: gr::sync_block("SdrSource", gr::io_signature::make(0, 0, 0), gr::io_signature::make(1, 1, sizeof(gr_complex))), m_configDevice(device), m_device(nullptr), m_stream(nullptr) {
13-
m_device = SoapySDR::Device::make(fmt::format("driver={},serial={}", device.m_driver, device.m_serial));
13+
m_device = SoapySDR::Device::make(fmt::format("driver={},serial={}", device.driver, device.serial));
1414
m_device->setGainMode(SOAPY_SDR_RX, 0, false);
15-
for (const auto& [key, value] : device.m_gains) {
16-
Logger::info(LABEL, "set gain, key: {}, value: {}", colored(GREEN, "{}", key), colored(GREEN, "{}", value));
17-
m_device->setGain(SOAPY_SDR_RX, 0, key.c_str(), value);
15+
for (const auto& gain : device.gains) {
16+
Logger::info(LABEL, "set gain, name: {}, value: {}", colored(GREEN, "{}", gain.name), colored(GREEN, "{}", gain.value));
17+
m_device->setGain(SOAPY_SDR_RX, 0, gain.name.c_str(), gain.value);
1818
}
19-
Logger::info(LABEL, "sample rate: {}", formatFrequency(device.m_sampleRate));
20-
m_device->setSampleRate(SOAPY_SDR_RX, 0, device.m_sampleRate);
19+
Logger::info(LABEL, "sample rate: {}", formatFrequency(device.sample_rate));
20+
m_device->setSampleRate(SOAPY_SDR_RX, 0, device.sample_rate);
2121
}
2222

2323
SdrSource::~SdrSource() {
@@ -67,8 +67,8 @@ bool SdrSource::stop() {
6767

6868
void SdrSource::resetBuffers() {
6969
std::lock_guard<std::mutex> lock(m_mutex);
70-
if (m_configDevice.m_driver == "rtlsdr") {
71-
m_device->setSampleRate(SOAPY_SDR_RX, 0, m_configDevice.m_sampleRate);
70+
if (m_configDevice.driver == "rtlsdr") {
71+
m_device->setSampleRate(SOAPY_SDR_RX, 0, m_configDevice.sample_rate);
7272
} else {
7373
m_device->deactivateStream(m_stream);
7474
m_device->closeStream(m_stream);

sources/radio/blocks/transmission.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ void Transmission::clearSignals(const float*, const float*, const std::chrono::m
8888
void Transmission::addSignals(const float* avgPower, const float* rawPower, const std::chrono::milliseconds now) {
8989
std::vector<Index> indexes;
9090
for (int i = 0; i < m_itemSize; ++i) {
91-
if (m_device.m_startLevel <= avgPower[i] && m_isIndexInRange(i) && !isIndexIgnored(i)) {
91+
if (m_device.start_recording_level <= avgPower[i] && m_isIndexInRange(i) && !isIndexIgnored(i)) {
9292
indexes.push_back(i);
9393
}
9494
}
@@ -136,7 +136,7 @@ Transmission::Index Transmission::getBestIndex(Index index) const {
136136
for (size_t i = min; i < max; ++i) {
137137
const auto& row = m_averager.data().at(i);
138138
const auto bestIndex = getMaxIndex(row.data(), row.size(), index, m_groupSize);
139-
if (m_device.m_startLevel <= row[bestIndex]) {
139+
if (m_device.start_recording_level <= row[bestIndex]) {
140140
const int timestamp = max - i - 1;
141141
Logger::debug(
142142
LABEL,
@@ -156,7 +156,7 @@ Transmission::Index Transmission::getBestIndex(Index index) const {
156156
bool Transmission::isIndexIgnored(const Index& index) const {
157157
const auto frequency = m_indexToFrequency(index);
158158
for (const auto& range : m_config.ignoredRanges()) {
159-
if (range.first <= frequency && frequency <= range.second) {
159+
if (range.contains(frequency)) {
160160
return true;
161161
}
162162
}

sources/radio/help_structures.cpp

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,3 @@
11
#include "help_structures.h"
22

33
Recording::Recording(const Frequency& shift, const bool& flush) : m_shift(shift), m_flush(flush) {}
4-
5-
Satellite::Satellite(const int& id, const std::string& name, const Frequency& frequency, const Frequency& bandwidth, const std::string& modulation)
6-
: m_id(id), m_name(name), m_frequency(frequency), m_bandwidth(bandwidth), m_modulation(modulation) {}
7-
8-
nlohmann::json Satellite::toJson() const {
9-
nlohmann::json json;
10-
json["id"] = m_id;
11-
json["name"] = m_name;
12-
json["frequency"] = m_frequency;
13-
json["bandwidth"] = m_bandwidth;
14-
json["modulation"] = m_modulation;
15-
return json;
16-
}

0 commit comments

Comments
 (0)