satdump/plugins/sdr_sources/rtltcp_support/rtltcp.cpp
2025-01-30 17:40:56 -05:00

217 lines
5.5 KiB
C++

#include "rtltcp.h"
#include "imgui/imgui_stdlib.h"
#include "common/widgets/stepped_slider.h"
void RTLTCPSource::set_gains()
{
if (!is_started)
return;
client.setAGCMode(lna_agc_enabled);
logger->debug("Set RTL-TCP LNA AGC to %d", (int)lna_agc_enabled);
if (tuner_agc_enabled)
{
client.setGainMode(0);
logger->debug("Set RTL-TCP Tuner AGC to %d", 1);
}
else
{
client.setGainMode(1);
logger->debug("Set RTL-TCP Tuner AGC to %d", 0);
client.setGain(gain * 10);
logger->debug("Set RTL-TCP Gain to %d", gain * 10);
}
}
void RTLTCPSource::set_bias()
{
if (!is_started)
return;
client.setBiasTee(bias);
logger->debug("Set RTL-TCP Bias to %d", (int)bias);
}
void RTLTCPSource::set_ppm()
{
if (!is_started)
return;
int ppm = ppm_widget.get();
client.setPPM(ppm);
logger->debug("Set RTL-TCP PPM Correction to %d", ppm);
}
void RTLTCPSource::set_settings(nlohmann::json settings)
{
d_settings = settings;
// Convert legacy AGC setting to new (was not used for RTL-TCP before, but it was for USB)
if (d_settings.contains("agc"))
{
lna_agc_enabled = tuner_agc_enabled = getValueOrDefault(d_settings["agc"], false);
d_settings.erase("agc");
}
ip_address = getValueOrDefault(d_settings["ip_address"], ip_address);
port = getValueOrDefault(d_settings["port"], port);
gain = getValueOrDefault(d_settings["gain"], gain);
lna_agc_enabled = getValueOrDefault(d_settings["lna_agc"], lna_agc_enabled);
tuner_agc_enabled = getValueOrDefault(d_settings["tuner_agc"], lna_agc_enabled);
bias = getValueOrDefault(d_settings["bias"], bias);
ppm_widget.set(getValueOrDefault(d_settings["ppm_correction"], ppm_widget.get()));
if (is_open && is_started)
{
set_gains();
set_bias();
set_ppm();
}
}
nlohmann::json RTLTCPSource::get_settings()
{
d_settings["ip_address"] = ip_address;
d_settings["port"] = port;
d_settings["gain"] = gain;
d_settings["lna_agc"] = lna_agc_enabled;
d_settings["tuner_agc"] = tuner_agc_enabled;
d_settings["bias"] = bias;
d_settings["ppm_correction"] = ppm_widget.get();
return d_settings;
}
void RTLTCPSource::open()
{
// Nothing to do
is_open = true;
// Set available samplerate
std::vector<double> available_samplerates;
available_samplerates.push_back(250000);
available_samplerates.push_back(1024000);
available_samplerates.push_back(1536000);
available_samplerates.push_back(1792000);
available_samplerates.push_back(1920000);
available_samplerates.push_back(2048000);
available_samplerates.push_back(2160000);
available_samplerates.push_back(2400000);
available_samplerates.push_back(2560000);
available_samplerates.push_back(2880000);
available_samplerates.push_back(3200000);
samplerate_widget.set_list(available_samplerates, true);
}
void RTLTCPSource::start()
{
if (client.connectToRTL((char *)ip_address.c_str(), port) != 1)
throw satdump_exception("Could not connect to RTL-TCP");
DSPSampleSource::start(); // Do NOT reset the stream
uint64_t current_samplerate = samplerate_widget.get_value();
client.setSampleRate(current_samplerate);
is_started = true;
set_frequency(d_frequency);
set_gains();
set_bias();
set_ppm();
thread_should_run = true;
work_thread = std::thread(&RTLTCPSource::mainThread, this);
}
void RTLTCPSource::stop()
{
if (is_started)
{
thread_should_run = false;
logger->info("Waiting for the thread...");
if (is_started)
output_stream->stopWriter();
if (work_thread.joinable())
work_thread.join();
logger->info("Thread stopped");
client.setBiasTee(false);
client.disconnect();
}
is_started = false;
}
void RTLTCPSource::close()
{
is_open = false;
}
void RTLTCPSource::set_frequency(uint64_t frequency)
{
if (is_open && is_started)
{
client.setFrequency(frequency);
logger->debug("Set RTL-TCP frequency to %d", frequency);
}
DSPSampleSource::set_frequency(frequency);
}
void RTLTCPSource::drawControlUI()
{
if (is_started)
style::beginDisabled();
samplerate_widget.render();
if (is_started)
style::endDisabled();
if (is_started)
style::beginDisabled();
ImGui::InputText("Address", &ip_address);
ImGui::InputInt("Port", &port);
if (is_started)
style::endDisabled();
if (ppm_widget.draw())
set_ppm();
bool gain_changed = false;
if (tuner_agc_enabled)
style::beginDisabled();
gain_changed |= widgets::SteppedSliderInt("Tuner Gain", &gain, 0, 49);
if (tuner_agc_enabled)
style::endDisabled();
gain_changed |= ImGui::Checkbox("LNA AGC", &lna_agc_enabled);
gain_changed |= ImGui::Checkbox("Tuner AGC", &tuner_agc_enabled);
if (gain_changed)
set_gains();
if (ImGui::Checkbox("Bias-Tee", &bias))
set_bias();
}
void RTLTCPSource::set_samplerate(uint64_t samplerate)
{
if (!samplerate_widget.set_value(samplerate, 3.2e6))
throw satdump_exception("Unsupported samplerate : " + std::to_string(samplerate) + "!");
}
uint64_t RTLTCPSource::get_samplerate()
{
return samplerate_widget.get_value();
}
std::vector<dsp::SourceDescriptor> RTLTCPSource::getAvailableSources()
{
std::vector<dsp::SourceDescriptor> results;
results.push_back({"rtltcp", "RTL-TCP", "0", false});
return results;
}