2023-07-17 23:11:13 +02:00
|
|
|
#include "tracking_widget.h"
|
|
|
|
|
#include "imgui/imgui.h"
|
2023-09-06 22:28:55 -04:00
|
|
|
#include "logger.h"
|
2023-07-17 23:11:13 +02:00
|
|
|
#include "core/config.h"
|
2023-07-18 12:27:58 +02:00
|
|
|
#include "main_ui.h"
|
2023-12-10 13:03:59 +01:00
|
|
|
#include "core/style.h"
|
|
|
|
|
#include "common/imgui_utils.h"
|
2023-12-02 19:51:09 +01:00
|
|
|
#include "common/tracking/rotator/rotcl_handler.h"
|
2023-07-20 19:31:46 +02:00
|
|
|
|
2023-07-17 23:11:13 +02:00
|
|
|
namespace satdump
|
|
|
|
|
{
|
|
|
|
|
TrackingWidget::TrackingWidget()
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
qth_lon = config::main_cfg["satdump_general"]["qth_lon"]["value"].get<double>();
|
|
|
|
|
qth_lat = config::main_cfg["satdump_general"]["qth_lat"]["value"].get<double>();
|
|
|
|
|
qth_alt = config::main_cfg["satdump_general"]["qth_alt"]["value"].get<double>();
|
|
|
|
|
}
|
|
|
|
|
catch (std::exception &e)
|
|
|
|
|
{
|
|
|
|
|
logger->error("Could not get QTH lon/lat! %s", e.what());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
logger->trace("Using QTH %f %f Alt %f", qth_lon, qth_lat, qth_alt);
|
|
|
|
|
|
2023-12-02 19:51:09 +01:00
|
|
|
rotator_handler = std::make_shared<rotator::RotctlHandler>();
|
|
|
|
|
|
|
|
|
|
if (rotator_handler)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
rotator_handler->set_settings(config::main_cfg["user"]["recorder_tracking"]["rotator_config"][rotator_handler->get_id()]);
|
|
|
|
|
}
|
2024-01-17 14:23:48 +01:00
|
|
|
catch (std::exception &e)
|
2023-12-02 19:51:09 +01:00
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-07-23 00:50:32 +02:00
|
|
|
|
2023-12-10 19:53:50 +01:00
|
|
|
// Init Obj Tracker
|
2023-12-10 13:03:59 +01:00
|
|
|
object_tracker.setQTH(qth_lon, qth_lat, qth_alt);
|
|
|
|
|
object_tracker.setRotator(rotator_handler);
|
|
|
|
|
object_tracker.setObject(object_tracker.TRACKING_SATELLITE, 25338);
|
2023-11-08 15:09:07 +01:00
|
|
|
|
2023-12-10 19:53:50 +01:00
|
|
|
// Init scheduler
|
2024-01-22 23:03:51 +01:00
|
|
|
auto_scheduler.eng_callback = [this](AutoTrackCfg, SatellitePass, TrackedObject obj)
|
2023-12-10 19:53:50 +01:00
|
|
|
{
|
|
|
|
|
object_tracker.setObject(object_tracker.TRACKING_SATELLITE, obj.norad);
|
|
|
|
|
saveConfig();
|
|
|
|
|
};
|
2024-01-17 14:55:30 +01:00
|
|
|
auto_scheduler.aos_callback = [this](AutoTrackCfg autotrack_cfg, SatellitePass pass, TrackedObject obj)
|
2023-12-10 19:53:50 +01:00
|
|
|
{
|
2024-01-17 14:55:30 +01:00
|
|
|
this->aos_callback(autotrack_cfg, pass, obj);
|
2023-12-10 19:53:50 +01:00
|
|
|
object_tracker.setObject(object_tracker.TRACKING_SATELLITE, obj.norad);
|
|
|
|
|
};
|
2024-01-17 14:55:30 +01:00
|
|
|
auto_scheduler.los_callback = [this](AutoTrackCfg autotrack_cfg, SatellitePass pass, TrackedObject obj)
|
2023-12-10 19:53:50 +01:00
|
|
|
{
|
2024-01-17 14:55:30 +01:00
|
|
|
this->los_callback(autotrack_cfg, pass, obj);
|
2023-12-10 19:53:50 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
auto_scheduler.setQTH(qth_lon, qth_lat, qth_alt);
|
|
|
|
|
|
|
|
|
|
// Restore config
|
|
|
|
|
loadConfig();
|
|
|
|
|
|
|
|
|
|
// Start scheduler
|
|
|
|
|
auto_scheduler.start();
|
|
|
|
|
|
2023-11-08 15:09:07 +01:00
|
|
|
// Attempt to apply provided CLI settings
|
2023-11-09 12:04:09 +01:00
|
|
|
if (satdump::config::main_cfg.contains("cli"))
|
2023-11-08 15:09:07 +01:00
|
|
|
{
|
2023-11-09 12:04:09 +01:00
|
|
|
auto &cli_settings = satdump::config::main_cfg["cli"];
|
2023-11-08 15:09:07 +01:00
|
|
|
|
2023-11-09 12:04:09 +01:00
|
|
|
if (cli_settings.contains("engage_autotrack") && cli_settings["engage_autotrack"].get<bool>())
|
2023-11-08 15:09:07 +01:00
|
|
|
{
|
2023-12-10 19:53:50 +01:00
|
|
|
auto_scheduler.setEngaged(true, getTime());
|
2023-11-08 15:09:07 +01:00
|
|
|
}
|
|
|
|
|
}
|
2023-07-17 23:11:13 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TrackingWidget::~TrackingWidget()
|
|
|
|
|
{
|
2023-12-10 19:53:50 +01:00
|
|
|
saveConfig();
|
2023-07-17 23:11:13 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TrackingWidget::render()
|
|
|
|
|
{
|
2024-01-19 15:54:21 -05:00
|
|
|
object_tracker.renderPolarPlot();
|
2023-07-18 16:59:32 +02:00
|
|
|
|
2023-08-02 23:32:14 +02:00
|
|
|
ImGui::Separator();
|
2023-12-10 13:03:59 +01:00
|
|
|
|
|
|
|
|
object_tracker.renderSelectionMenu();
|
|
|
|
|
|
2023-07-17 23:11:13 +02:00
|
|
|
ImGui::Spacing();
|
2023-12-10 13:03:59 +01:00
|
|
|
|
2023-08-05 17:12:01 +02:00
|
|
|
if (ImGui::CollapsingHeader("Object Information"))
|
2023-12-10 13:03:59 +01:00
|
|
|
object_tracker.renderObjectStatus();
|
|
|
|
|
|
2023-08-05 17:12:01 +02:00
|
|
|
if (ImGui::CollapsingHeader("Rotator Configuration"))
|
2023-12-10 13:03:59 +01:00
|
|
|
{
|
|
|
|
|
object_tracker.renderRotatorStatus();
|
|
|
|
|
ImGui::SameLine();
|
|
|
|
|
|
|
|
|
|
if (rotator_handler->is_connected())
|
|
|
|
|
style::beginDisabled();
|
|
|
|
|
if (ImGui::Combo("Type##rotatortype", &selected_rotator_handler, "Rotctl\0"))
|
|
|
|
|
{
|
|
|
|
|
if (selected_rotator_handler == 0)
|
|
|
|
|
{
|
|
|
|
|
rotator_handler = std::make_shared<rotator::RotctlHandler>();
|
|
|
|
|
object_tracker.setRotator(rotator_handler);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
rotator_handler->set_settings(config::main_cfg["user"]["recorder_tracking"]["rotator_config"][rotator_handler->get_id()]);
|
|
|
|
|
}
|
2024-01-17 14:23:48 +01:00
|
|
|
catch (std::exception &e)
|
2023-12-10 13:03:59 +01:00
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (rotator_handler->is_connected())
|
|
|
|
|
style::endDisabled();
|
|
|
|
|
|
|
|
|
|
rotator_handler->render();
|
|
|
|
|
}
|
|
|
|
|
|
2023-07-20 16:36:16 +02:00
|
|
|
ImGui::Spacing();
|
2023-08-02 23:32:14 +02:00
|
|
|
ImGui::Separator();
|
2023-07-20 15:55:38 +02:00
|
|
|
ImGui::Spacing();
|
2023-12-10 13:03:59 +01:00
|
|
|
|
2023-08-02 23:32:14 +02:00
|
|
|
if (ImGui::Button("Schedule and Config"))
|
2023-08-05 17:12:01 +02:00
|
|
|
config_window_was_asked = show_window_config = true;
|
2023-07-20 15:55:38 +02:00
|
|
|
|
2023-12-10 13:03:59 +01:00
|
|
|
renderConfig();
|
2023-07-17 23:11:13 +02:00
|
|
|
}
|
|
|
|
|
|
2023-12-10 13:03:59 +01:00
|
|
|
void TrackingWidget::renderConfig()
|
2023-07-17 23:11:13 +02:00
|
|
|
{
|
2023-12-10 13:03:59 +01:00
|
|
|
if (show_window_config)
|
|
|
|
|
{
|
|
|
|
|
ImGui::Begin("Tracking Configuration", &show_window_config);
|
|
|
|
|
ImGui::SetWindowSize(ImVec2(800, 550), ImGuiCond_FirstUseEver);
|
|
|
|
|
|
|
|
|
|
if (ImGui::BeginTabBar("##trackingtabbar"))
|
|
|
|
|
{
|
|
|
|
|
if (ImGui::BeginTabItem("Scheduling"))
|
|
|
|
|
{
|
2023-12-10 19:53:50 +01:00
|
|
|
ImGui::BeginChild("##trackingbarschedule", ImVec2(0, 0), false, ImGuiWindowFlags_NoResize);
|
2024-01-19 15:54:21 -05:00
|
|
|
auto_scheduler.renderAutotrackConfig(getTime());
|
2023-12-10 19:53:50 +01:00
|
|
|
ImGui::EndChild();
|
2023-12-10 13:03:59 +01:00
|
|
|
ImGui::EndTabItem();
|
|
|
|
|
}
|
|
|
|
|
if (ImGui::BeginTabItem("Rotator Config"))
|
|
|
|
|
{
|
2023-12-10 19:53:50 +01:00
|
|
|
object_tracker.renderRotatorConfig();
|
2023-12-10 13:03:59 +01:00
|
|
|
ImGui::EndTabItem();
|
|
|
|
|
}
|
|
|
|
|
ImGui::EndTabBar();
|
|
|
|
|
}
|
2023-07-17 23:11:13 +02:00
|
|
|
|
2023-12-10 13:03:59 +01:00
|
|
|
if (config_window_was_asked)
|
|
|
|
|
ImGuiUtils_BringCurrentWindowToFront();
|
|
|
|
|
config_window_was_asked = false;
|
|
|
|
|
|
|
|
|
|
ImGui::End();
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-07-17 23:11:13 +02:00
|
|
|
}
|