Rework radar system
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
#pragma once
|
||||
|
||||
#include <atomic>
|
||||
#include <csignal>
|
||||
#include <cstdint>
|
||||
#include <iostream>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
|
||||
#include "run_config.hpp"
|
||||
|
||||
namespace radar::runtime {
|
||||
|
||||
inline std::atomic<bool> stop_requested{false};
|
||||
|
||||
inline auto initialize(int argc, char** argv) -> config::RunConfig {
|
||||
const auto stop = [](int) { stop_requested.store(true, std::memory_order_relaxed); };
|
||||
std::signal(SIGINT, stop);
|
||||
std::signal(SIGTERM, stop);
|
||||
std::signal(SIGPIPE, SIG_IGN);
|
||||
std::string path = "run_config.json";
|
||||
for (int index = 1; index + 1 < argc; ++index) {
|
||||
if (std::string(argv[index]) == "--config") { path = argv[++index]; }
|
||||
}
|
||||
return config::load_run_config(path);
|
||||
}
|
||||
|
||||
class FatalPipelineError : public std::runtime_error {
|
||||
public:
|
||||
using std::runtime_error::runtime_error;
|
||||
};
|
||||
|
||||
// Drop isolated malformed collections; make persistent failures conspicuous.
|
||||
class CollectionErrors {
|
||||
public:
|
||||
void progress() { consecutive_ = 0; }
|
||||
void report(const char* worker, const std::exception& error) {
|
||||
++total_;
|
||||
if (++consecutive_ % 500 == 0) {
|
||||
std::cerr << worker << ": " << consecutive_
|
||||
<< " consecutive failures — likely a permanent configuration error: "
|
||||
<< error.what() << '\n';
|
||||
} else if (total_ % 100 == 1) {
|
||||
std::cerr << worker << ": dropped collection after error (count="
|
||||
<< total_ << "): " << error.what() << '\n';
|
||||
}
|
||||
}
|
||||
private:
|
||||
std::uint64_t total_ = 0;
|
||||
std::uint64_t consecutive_ = 0;
|
||||
};
|
||||
|
||||
} // namespace radar::runtime
|
||||
@@ -14,40 +14,15 @@ enum class DriverMode {
|
||||
Native,
|
||||
};
|
||||
|
||||
enum class SwitchDriverKind {
|
||||
H7992,
|
||||
HMC349A,
|
||||
};
|
||||
|
||||
struct RadarSweepSettings {
|
||||
// Frequency sweep bounds and acquisition settings.
|
||||
float start_hz = 1'000'000.0F;
|
||||
float stop_hz = 6'000'000'000.0F;
|
||||
std::uint32_t points = 501;
|
||||
float if_bandwidth_hz = 1'000.0F;
|
||||
float power_dbm = -10.0F;
|
||||
};
|
||||
|
||||
struct RadarConfig {
|
||||
// Radar device identity and runtime mode.
|
||||
std::string model = "librevna";
|
||||
std::string serial{};
|
||||
DriverMode driver_mode = DriverMode::Mock;
|
||||
RadarSweepSettings sweep{};
|
||||
};
|
||||
|
||||
struct SwitchConfig {
|
||||
// One RF switch attached to a specific radar port.
|
||||
std::string name{};
|
||||
DriverMode driver_mode = DriverMode::Mock;
|
||||
SwitchDriverKind driver_kind = SwitchDriverKind::H7992;
|
||||
std::uint32_t radar_port = 0;
|
||||
std::uint32_t positions = 4;
|
||||
std::uint32_t default_position = 0;
|
||||
std::string gpio_chip = "/dev/gpiochip0";
|
||||
std::int32_t pin_a = 17;
|
||||
std::int32_t pin_b = 27;
|
||||
bool invert_logic = false;
|
||||
};
|
||||
|
||||
struct RingEndpointConfig {
|
||||
@@ -59,22 +34,18 @@ struct RingEndpointConfig {
|
||||
|
||||
struct RingsConfig {
|
||||
RingEndpointConfig raw{.name = "/radar_raw"};
|
||||
RingEndpointConfig raw_tap{.name = "/radar_raw_tap"};
|
||||
RingEndpointConfig preprocessed{.name = "/radar_preprocessed"};
|
||||
RingEndpointConfig preprocessed_tap{.name = "/radar_preprocessed_tap"};
|
||||
RingEndpointConfig results{.name = "/radar_results"};
|
||||
};
|
||||
|
||||
struct RuntimeConfig {
|
||||
// Runtime pacing and behavior flags for C++ workers.
|
||||
std::uint32_t settling_ms = 0;
|
||||
// Runtime pacing and live processing configuration.
|
||||
std::uint32_t idle_sleep_ms = 2;
|
||||
bool continuous = true;
|
||||
std::string processing_live_config_path = "python_app/runtime/processing_live.json";
|
||||
};
|
||||
|
||||
struct PreprocessAssetConfig {
|
||||
std::string set_name{};
|
||||
std::string bundle_path{};
|
||||
};
|
||||
|
||||
@@ -84,17 +55,6 @@ struct S21PreprocessConfig {
|
||||
PreprocessAssetConfig object_calibration{};
|
||||
};
|
||||
|
||||
struct S11CalibrationPreprocessConfig {
|
||||
PreprocessAssetConfig open{};
|
||||
PreprocessAssetConfig short_standard{};
|
||||
PreprocessAssetConfig load{};
|
||||
};
|
||||
|
||||
struct S11PreprocessConfig {
|
||||
S11CalibrationPreprocessConfig calibration{};
|
||||
PreprocessAssetConfig reference{};
|
||||
};
|
||||
|
||||
struct PreprocessNotchBandConfig {
|
||||
float low_hz = 0.0F;
|
||||
float high_hz = 0.0F;
|
||||
@@ -110,7 +70,6 @@ struct PreprocessNotchConfig {
|
||||
struct PreprocessConfig {
|
||||
// Channel-specific preprocessing assets selected by Python GUI layer.
|
||||
S21PreprocessConfig s21{};
|
||||
S11PreprocessConfig s11{};
|
||||
PreprocessNotchConfig notch{};
|
||||
};
|
||||
|
||||
@@ -140,7 +99,7 @@ struct GprConfig {
|
||||
|
||||
struct RunConfig {
|
||||
// Single configuration object shared by all C++ processes.
|
||||
RadarConfig radar{};
|
||||
std::string radar_model = "librevna";
|
||||
SwitchConfig input_switch{};
|
||||
SwitchConfig output_switch{};
|
||||
RingsConfig rings{};
|
||||
|
||||
Reference in New Issue
Block a user