#include "autotrack.h" #include "../webserver.h" #include "logger.h" #include "common/utils.h" void AutoTrackApp::setup_webserver() { // If requested, boot up webserver if (d_settings.contains("http_server")) { std::string http_addr = d_settings["http_server"].get(); webserver::handle_callback = [this]() { nlohmann::json p; live_pipeline_mtx.lock(); if (live_pipeline) { live_pipeline->updateModuleStats(); p["live_pipeline"] = live_pipeline->stats; } live_pipeline_mtx.unlock(); p["object_tracker"] = object_tracker.getStatus(); p["frequency"] = source_ptr->get_frequency(); vfos_mtx.lock(); if (vfo_list.size() > 0) { for (auto &vfo : vfo_list) { auto &pos = p["vfos"][vfo.id]; pos["frequency"] = vfo.freq; if (vfo.pipeline_id != -1) { vfo.live_pipeline->updateModuleStats(); pos["live_pipeline"] = vfo.live_pipeline->stats; } if (vfo.file_sink) { pos["recording"]["written_size"] = vfo.file_sink->get_written(); pos["recording"]["written_raw_size"] = vfo.file_sink->get_written_raw(); } } } vfos_mtx.unlock(); if (is_recording) { p["recording"]["written_size"] = file_sink->get_written(); p["recording"]["written_raw_size"] = file_sink->get_written_raw(); } return p.dump(4); }; webserver::add_polarplot_handler = true; webserver::handle_callback_polarplot = [this]() -> std::vector { std::vector vec = object_tracker.getPolarPlotImg().save_jpeg_mem(); return vec; }; if (d_parameters.contains("fft_enable") && d_parameters["fft_enable"]) webserver::handle_callback_fft = [this]() -> std::vector { if (!web_fft_is_enabled) { splitter->set_enabled("fft", true); web_fft_is_enabled = true; logger->trace("Enabling FFT"); } web_last_fft_access = time(nullptr); std::vector vec = fft_plot->drawImg(512, 512).save_jpeg_mem(); return vec; }; webserver::handle_callback_schedule = [this]() -> std::vector { std::vector vec = auto_scheduler.getScheduleImage(512, getTime()).save_jpeg_mem(); return vec; }; webserver::handle_callback_html = [this](std::string uri) -> std::string { if (uri == "/status") { live_pipeline_mtx.lock(); auto status = object_tracker.getStatus(); std::string rot_engaged; std::string rot_tracking; std::string aos_in; std::string los_in; std::string fft; time_t cache_buster = time(nullptr); if (status["rotator_engaged"].get() == true) rot_engaged = "engaged"; else rot_engaged = "not engaged"; if (status["rotator_tracking"].get() == true) rot_tracking = "tracking"; else rot_tracking = "not tracking"; if (status["next_event_is_aos"].get() == true) { aos_in = "(in " + std::to_string((int)(status["next_event_in"].get())) + " seconds)"; los_in = ""; } else { los_in = "(in " + std::to_string((int)(status["next_event_in"].get())) + " seconds)"; aos_in = ""; } if (d_parameters.contains("fft_enable") && d_parameters["fft_enable"]) fft = (std::string) "

FFT

"; std::string schedule = (std::string) "

Schedule

"; std::string page = (std::string) "

Device

Hardware: " + selected_src.name + "

" + "

Started: " + std::string(is_started ? "YES" : "NO") + "

" + "

Sample rate: " + std::to_string(source_ptr->get_samplerate() / 1e6) + " Msps

" + "

Frequency: " + std::to_string(source_ptr->get_frequency() / 1e6) + " MHz

" + "

Object Tracker

" + "
" + "

Next AOS time: " + timestamp_to_string(status["next_aos_time"].get()) + "" + aos_in + "

" + "

Next LOS time: " + timestamp_to_string(status["next_los_time"].get()) + "" + los_in + "

" + "

Current object: " + status["object_name"].get() + "

" + "

Current position:
" + "Azimuth " + svformat("%.2f", (status["sat_current_pos"]["az"].get())) + " °
Elevation " + svformat("%.2f", (status["sat_current_pos"]["el"].get())) + " °
Range " + svformat("%.2f", (status["sat_current_range"].get())) + " km

" + "

Rotator Control

" + "

Status:" + rot_engaged + ", " + rot_tracking + "

" + "

Azimuth: requested " + svformat("%.2f", (status["rot_current_req_pos"]["az"].get())) + " °, actual " + svformat("%.2f", (status["rot_current_pos"]["az"].get())) + " °

" + "

Elevation: requested " + svformat("%.2f", (status["rot_current_req_pos"]["el"].get())) + " °, actual " + svformat("%.2f", (status["rot_current_pos"]["el"].get())) + " °

" + schedule + fft; live_pipeline_mtx.unlock(); return page; } else if (uri == "/") { std::string page = (std::string) "" + "" + "SatDump Status Page" + "" + "" "" + "

Loading...

If you see this, your browser does not support JavaScript. Click here to view the status (you will need to refresh it manually) :)

" + ""; return page; } else { return "Error 404"; } }; logger->info("Start webserver on %s", http_addr.c_str()); webserver::start(http_addr); } } void AutoTrackApp::stop_webserver() { if (d_settings.contains("http_server")) webserver::stop(); } void AutoTrackApp::web_heartbeat() { if (web_fft_is_enabled) { if (time(0) - web_last_fft_access > 10) { splitter->set_enabled("fft", false); web_fft_is_enabled = false; logger->trace("Shutting down FFT"); } } }