Skip to content

Commit

Permalink
Merge branch 'SatDump:master' into master
Browse files Browse the repository at this point in the history
  • Loading branch information
OK9UWU authored Jan 17, 2024
2 parents 88c1073 + 4052308 commit 24b2b20
Show file tree
Hide file tree
Showing 7 changed files with 115 additions and 42 deletions.
94 changes: 71 additions & 23 deletions src-cli/autotrack/autotrack.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,6 @@ int main_autotrack(int argc, char *argv[])
// Attempt to start the source and splitter
try
{
source_ptr->start();
splitter = std::make_unique<dsp::SplitterBlock>(source_ptr->output_stream);
splitter->set_main_enabled(false);
splitter->add_output("record");
Expand All @@ -154,12 +153,8 @@ int main_autotrack(int argc, char *argv[])
logger->critical("FFT GOOD!");
}

splitter->start();

if (parameters.contains("fft_enable"))
{
fft->start();
}
}
catch (std::exception &e)
{
Expand Down Expand Up @@ -262,12 +257,14 @@ int main_autotrack(int argc, char *argv[])
// object_tracker.setObject(object_tracker.TRACKING_SATELLITE, 25338);

// Init scheduler
auto_scheduler.eng_callback = [&](satdump::SatellitePass, satdump::TrackedObject obj)
bool source_started = false;

auto_scheduler.eng_callback = [&](satdump::AutoTrackCfg, satdump::SatellitePass, satdump::TrackedObject obj)
{
// logger->critical(obj.norad);
object_tracker.setObject(object_tracker.TRACKING_SATELLITE, obj.norad);
};
auto_scheduler.aos_callback = [&](satdump::SatellitePass pass, satdump::TrackedObject obj)
auto_scheduler.aos_callback = [&](satdump::AutoTrackCfg, satdump::SatellitePass, satdump::TrackedObject obj)
{
object_tracker.setObject(object_tracker.TRACKING_SATELLITE, obj.norad);

Expand All @@ -278,6 +275,22 @@ int main_autotrack(int argc, char *argv[])

if (obj.live || obj.record)
{
if (!source_started)
{
try
{
logger->info("Starting source...");
source_ptr->start();
splitter->input_stream = source_ptr->output_stream;
splitter->start();
source_started = true;
}
catch (std::runtime_error &e)
{
logger->error("%s", e.what());
}
}

source_ptr->set_frequency(obj.frequency);
}

Expand All @@ -293,12 +306,19 @@ int main_autotrack(int argc, char *argv[])
logger->error("Recording Not Implemented Yet!"); // start_recording();
}
};
auto_scheduler.los_callback = [&](satdump::SatellitePass pass, satdump::TrackedObject obj)
auto_scheduler.los_callback = [&](satdump::AutoTrackCfg autotrack_cfg, satdump::SatellitePass, satdump::TrackedObject obj)
{
if (obj.record)
logger->error("Recording Not Implemented Yet!"); // stop_recording();
if (obj.live)
stop_processing();
if (source_started && autotrack_cfg.stop_sdr_when_idle)
{
logger->info("Stopping source...");
splitter->stop_tmp();
source_ptr->stop();
source_started = false;
}
};

auto_scheduler.setQTH(qth_lon, qth_lat, qth_alt);
Expand All @@ -314,6 +334,26 @@ int main_autotrack(int argc, char *argv[])
object_tracker.setRotatorConfig(rotator_algo_cfg);
auto_scheduler.setMinElevation(autotrack_min_elevation);

auto_scheduler.autotrack_cfg = getValueOrDefault<satdump::AutoTrackCfg>(settings["tracking"]["autotrack_cfg"], satdump::AutoTrackCfg());
logger->info("Stop SDR when Idle: %d", auto_scheduler.autotrack_cfg.stop_sdr_when_idle);

// If needed, start the SDR
try
{
if (!auto_scheduler.autotrack_cfg.stop_sdr_when_idle)
{
source_ptr->start();
splitter->input_stream = source_ptr->output_stream;
splitter->start();
source_started = true;
}
}
catch (std::exception &e)
{
logger->error("Fatal error running device : " + std::string(e.what()));
return 1;
}

// Rotator
std::shared_ptr<rotator::RotatorHandler> rotator_handler;

Expand Down Expand Up @@ -374,11 +414,11 @@ int main_autotrack(int argc, char *argv[])
fft_is_enabled = true;
logger->trace("Enabling FFT");
}
last_fft_access = time(0);
last_fft_access = time(nullptr);
std::vector<uint8_t> vec = fft_plot->drawImg(512, 512).save_jpeg_mem();
return vec;
};
webserver::handle_callback_html = [&selected_src, &parameters, &live_pipeline, &object_tracker, &source_ptr, &live_pipeline_mtx](std::string uri) -> std::string
webserver::handle_callback_html = [&selected_src, &parameters, &live_pipeline, &object_tracker, &source_ptr, &live_pipeline_mtx, &source_started](std::string uri) -> std::string
{
if (uri == "/status")
{
Expand All @@ -390,7 +430,7 @@ int main_autotrack(int argc, char *argv[])
std::string los_in;
std::string fft;

int random = rand();
time_t cache_buster = time(nullptr);

if (status["rotator_engaged"].get<bool>() == true)
rot_engaged = "<span class=\"fakeinput true\">engaged</span>";
Expand All @@ -417,22 +457,22 @@ int main_autotrack(int argc, char *argv[])
aos_in = "";
}

if(parameters.contains("fft_enable"))
fft = (std::string) "<h2>FFT</h2><img src=\"fft.jpeg?r=" + std::to_string(random) + "\" class=\"resp-img\" height=\"600\" width=\"600\" />";



if (parameters.contains("fft_enable"))
fft = (std::string) "<h2>FFT</h2><img src=\"fft.jpeg?r=" + std::to_string(cache_buster) + "\" class=\"resp-img\" height=\"600\" width=\"600\" />";

std::string page = (std::string) "<h2>Device</h2><p>Hardware: <span class=\"fakeinput\">" +
selected_src.name + "</span></p>" +
"<p>Started: <span class=\"fakeinput\">" +
std::string(source_started ? "YES" : "NO") +
"</span></p>" +
"<p>Sample rate: <span class=\"fakeinput\">" +
std::to_string(source_ptr->get_samplerate() / 1e6) +
"</span> Msps</p>" +
"<p>Frequency: <span class=\"fakeinput\">" +
std::to_string(source_ptr->get_frequency() / 1e6) +
"</span> MHz</p>" +
"<h2>Object Tracker</h2>" +
"<div class=\"image-div\"><img src=\"polarplot.jpeg?r=" + std::to_string(random) + "\" width=256 height=256/></div>" +
"<div class=\"image-div\"><img src=\"polarplot.jpeg?r=" + std::to_string(cache_buster) + "\" width=256 height=256/></div>" +
"<p>Next AOS time: <span class=\"fakeinput\">" +
timestamp_to_string(status["next_aos_time"].get<double>()) +
"</span>" +
Expand Down Expand Up @@ -549,15 +589,23 @@ int main_autotrack(int argc, char *argv[])
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}

stop_processing();

// Stop cleanly
source_ptr->stop();
if (settings.contains("http_server"))
webserver::stop();

stop_processing();
splitter->input_stream = std::make_shared<dsp::stream<complex_t>>();
splitter->stop();
source_ptr->close();
if (parameters.contains("fft_enable"))
fft->stop();

if (parameters.contains("http_server"))
webserver::stop();
if (source_started)
{
source_ptr->stop();
source_started = false;
}

source_ptr->close();

general_thread_pool.stop();
for (int i = 0; i < general_thread_pool.size(); i++)
Expand Down
8 changes: 4 additions & 4 deletions src-core/common/tracking/scheduler/scheduler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ namespace satdump
for (auto &v : enabled_satellites)
if (v.norad == upcoming_satellite_passes_sel[0].norad)
obj = v;
aos_callback(upcoming_satellite_passes_sel[0], obj);
aos_callback(autotrack_cfg, upcoming_satellite_passes_sel[0], obj);
autotrack_pass_has_started = true;
}
}
Expand All @@ -67,7 +67,7 @@ namespace satdump
for (auto &v : enabled_satellites)
if (v.norad == upcoming_satellite_passes_sel[0].norad)
obj = v;
los_callback(upcoming_satellite_passes_sel[0], obj);
los_callback(autotrack_cfg, upcoming_satellite_passes_sel[0], obj);
}
autotrack_pass_has_started = false;
updateAutotrackPasses(curr_time);
Expand All @@ -77,7 +77,7 @@ namespace satdump
for (auto &v : enabled_satellites)
if (v.norad == upcoming_satellite_passes_sel[0].norad)
obj = v;
eng_callback(upcoming_satellite_passes_sel[0], obj);
eng_callback(autotrack_cfg, upcoming_satellite_passes_sel[0], obj);
}
}

Expand Down Expand Up @@ -161,7 +161,7 @@ namespace satdump
for (auto &v : enabled_satellites)
if (v.norad == upcoming_satellite_passes_sel[0].norad)
obj = v;
eng_callback(upcoming_satellite_passes_sel[0], obj);
eng_callback(autotrack_cfg, upcoming_satellite_passes_sel[0], obj);
autotrack_pass_has_started = false;
}
else
Expand Down
23 changes: 20 additions & 3 deletions src-core/common/tracking/scheduler/scheduler.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,21 @@

namespace satdump
{
struct AutoTrackCfg
{
bool stop_sdr_when_idle = false;
};

inline void to_json(nlohmann::ordered_json &j, const AutoTrackCfg &v)
{
j["stop_sdr_when_idle"] = v.stop_sdr_when_idle;
}

inline void from_json(const nlohmann::ordered_json &j, AutoTrackCfg &v)
{
v.stop_sdr_when_idle = j["stop_sdr_when_idle"];
}

struct TrackedObject
{
int norad = -1;
Expand Down Expand Up @@ -63,9 +78,11 @@ namespace satdump
std::string availablesatssearch, selectedsatssearch;

public: // Handlers
std::function<void(SatellitePass, TrackedObject)> eng_callback = [](SatellitePass, TrackedObject) {};
std::function<void(SatellitePass, TrackedObject)> aos_callback = [](SatellitePass, TrackedObject) {};
std::function<void(SatellitePass, TrackedObject)> los_callback = [](SatellitePass, TrackedObject) {};
std::function<void(AutoTrackCfg, SatellitePass, TrackedObject)> eng_callback = [](AutoTrackCfg, SatellitePass, TrackedObject) {};
std::function<void(AutoTrackCfg, SatellitePass, TrackedObject)> aos_callback = [](AutoTrackCfg, SatellitePass, TrackedObject) {};
std::function<void(AutoTrackCfg, SatellitePass, TrackedObject)> los_callback = [](AutoTrackCfg, SatellitePass, TrackedObject) {};

AutoTrackCfg autotrack_cfg;

private:
int tracking_sats_menu_selected_1 = 0, tracking_sats_menu_selected_2 = 0;
Expand Down
5 changes: 3 additions & 2 deletions src-core/common/tracking/scheduler/scheduler_ui.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ namespace satdump
ImGui::Spacing();
ImGui::SetNextItemWidth(150 * ui_scale);
ImGui::InputFloat("Minimum Elevation", &autotrack_min_elevation);
ImGui::Checkbox("Stop SDR When IDLE", &autotrack_cfg.stop_sdr_when_idle);
if (ImGui::Button("Update Passes"))
{
updateAutotrackPasses(curr_time);
Expand Down Expand Up @@ -223,7 +224,7 @@ namespace satdump
ImGui::SetNextItemWidth(100 * ui_scale);
ImGui::TextColored(color, "%s", general_tle_registry.get_from_norad(cpass.norad)->name.c_str());
ImGui::TableSetColumnIndex(1);
widgets::FrequencyInput(((std::string)"Hz##objcfgfreq1" + std::to_string(cpass.norad)).c_str(), &cpass.frequency, 0.75f);
widgets::FrequencyInput(((std::string) "Hz##objcfgfreq1" + std::to_string(cpass.norad)).c_str(), &cpass.frequency, 0.75f);
ImGui::TableSetColumnIndex(2);
ImGui::SetNextItemWidth(100 * ui_scale);
ImGui::Checkbox(((std::string) "Record##objcfgfreq2" + std::to_string(cpass.norad)).c_str(), &cpass.record);
Expand Down Expand Up @@ -267,7 +268,7 @@ namespace satdump
#endif

upcoming_satellite_passes_mtx.unlock();
if(set_engaged)
if (set_engaged)
setEngaged(autotrack_engaged, curr_time);
}
}
9 changes: 6 additions & 3 deletions src-interface/recorder/recorder_proc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,10 +66,11 @@ namespace satdump
void RecorderApplication::start()
{
set_frequency(frequency_hz);

try
{
current_samplerate = source_ptr->get_samplerate();
if(current_samplerate == 0)
if (current_samplerate == 0)
throw std::runtime_error("Samplerate not set!");

source_ptr->start();
Expand Down Expand Up @@ -347,7 +348,7 @@ namespace satdump
{
tracking_widget = new TrackingWidget();

tracking_widget->aos_callback = [this](SatellitePass, TrackedObject obj)
tracking_widget->aos_callback = [this](AutoTrackCfg, SatellitePass, TrackedObject obj)
{
if (obj.live)
stop_processing();
Expand Down Expand Up @@ -383,12 +384,14 @@ namespace satdump
}
};

tracking_widget->los_callback = [this](SatellitePass, TrackedObject obj)
tracking_widget->los_callback = [this](AutoTrackCfg autotrack_cfg, SatellitePass, TrackedObject obj)
{
if (obj.record)
stop_recording();
if (obj.live)
stop_processing();
if (autotrack_cfg.stop_sdr_when_idle)
stop();
};
}
}
Expand Down
10 changes: 5 additions & 5 deletions src-interface/recorder/tracking/tracking_widget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,19 +43,19 @@ namespace satdump
object_tracker.setObject(object_tracker.TRACKING_SATELLITE, 25338);

// Init scheduler
auto_scheduler.eng_callback = [this](SatellitePass, TrackedObject obj)
auto_scheduler.eng_callback = [this](AutoTrackCfg autotrack_cfg, SatellitePass, TrackedObject obj)
{
object_tracker.setObject(object_tracker.TRACKING_SATELLITE, obj.norad);
saveConfig();
};
auto_scheduler.aos_callback = [this](SatellitePass pass, TrackedObject obj)
auto_scheduler.aos_callback = [this](AutoTrackCfg autotrack_cfg, SatellitePass pass, TrackedObject obj)
{
this->aos_callback(pass, obj);
this->aos_callback(autotrack_cfg, pass, obj);
object_tracker.setObject(object_tracker.TRACKING_SATELLITE, obj.norad);
};
auto_scheduler.los_callback = [this](SatellitePass pass, TrackedObject obj)
auto_scheduler.los_callback = [this](AutoTrackCfg autotrack_cfg, SatellitePass pass, TrackedObject obj)
{
this->los_callback(pass, obj);
this->los_callback(autotrack_cfg, pass, obj);
};

auto_scheduler.setQTH(qth_lon, qth_lat, qth_alt);
Expand Down
8 changes: 6 additions & 2 deletions src-interface/recorder/tracking/tracking_widget.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ namespace satdump
double qth_alt = 0;

public: // Handlers
std::function<void(SatellitePass, TrackedObject)> aos_callback = [](SatellitePass, TrackedObject) {};
std::function<void(SatellitePass, TrackedObject)> los_callback = [](SatellitePass, TrackedObject) {};
std::function<void(AutoTrackCfg, SatellitePass, TrackedObject)> aos_callback = [](AutoTrackCfg, SatellitePass, TrackedObject) {};
std::function<void(AutoTrackCfg, SatellitePass, TrackedObject)> los_callback = [](AutoTrackCfg, SatellitePass, TrackedObject) {};

private:
ObjectTracker object_tracker = ObjectTracker(true);
Expand All @@ -44,6 +44,8 @@ namespace satdump
if (rotator_handler)
config::main_cfg["user"]["recorder_tracking"]["rotator_config"][rotator_handler->get_id()] = rotator_handler->get_settings();

config::main_cfg["user"]["recorder_tracking"]["autotrack_cfg"] = auto_scheduler.autotrack_cfg;

config::saveUserConfig();
}

Expand All @@ -60,6 +62,8 @@ namespace satdump
auto_scheduler.setTracked(enabled_satellites);
object_tracker.setRotatorConfig(rotator_algo_cfg);
auto_scheduler.setMinElevation(autotrack_min_elevation);

auto_scheduler.autotrack_cfg = getValueOrDefault<AutoTrackCfg>(config::main_cfg["user"]["recorder_tracking"]["autotrack_cfg"], AutoTrackCfg());
}
}

Expand Down

0 comments on commit 24b2b20

Please sign in to comment.