1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2026-06-03 06:24:48 -04:00

Remote TCP updates:

Add support for public list of SDRangel servers that can be displayed on Map.
Add FLAC and zlib IQ compression.
Add IQ squelch for compression.
Add remote device/antenna position and direction reporting.
Add text messaging.
This commit is contained in:
srcejon
2024-09-22 10:44:30 +01:00
parent 7d1beb9eff
commit 8bf1a2f803
41 changed files with 7181 additions and 800 deletions
@@ -40,16 +40,27 @@
MESSAGE_CLASS_DEFINITION(RemoteTCPInput::MsgConfigureRemoteTCPInput, Message)
MESSAGE_CLASS_DEFINITION(RemoteTCPInput::MsgStartStop, Message)
MESSAGE_CLASS_DEFINITION(RemoteTCPInput::MsgReportTCPBuffer, Message)
MESSAGE_CLASS_DEFINITION(RemoteTCPInput::MsgSaveReplay, Message)
MESSAGE_CLASS_DEFINITION(RemoteTCPInput::MsgSendMessage, Message)
MESSAGE_CLASS_DEFINITION(RemoteTCPInput::MsgReportPosition, Message)
MESSAGE_CLASS_DEFINITION(RemoteTCPInput::MsgReportDirection, Message)
RemoteTCPInput::RemoteTCPInput(DeviceAPI *deviceAPI) :
m_deviceAPI(deviceAPI),
m_settings(),
m_remoteInputTCPPHandler(nullptr),
m_deviceDescription("RemoteTCPInput")
m_deviceDescription("RemoteTCPInput"),
m_running(false),
m_latitude(std::numeric_limits<float>::quiet_NaN()),
m_longitude(std::numeric_limits<float>::quiet_NaN()),
m_altitude(std::numeric_limits<float>::quiet_NaN()),
m_isotropic(false),
m_azimuth(std::numeric_limits<float>::quiet_NaN()),
m_elevation(std::numeric_limits<float>::quiet_NaN())
{
m_sampleFifo.setLabel(m_deviceDescription);
m_sampleFifo.setSize(48000 * 8);
m_remoteInputTCPPHandler = new RemoteTCPInputTCPHandler(&m_sampleFifo, m_deviceAPI);
m_remoteInputTCPPHandler = new RemoteTCPInputTCPHandler(&m_sampleFifo, m_deviceAPI, &m_replayBuffer);
m_remoteInputTCPPHandler->moveToThread(&m_thread);
m_remoteInputTCPPHandler->setMessageQueueToInput(&m_inputMessageQueue);
@@ -66,6 +77,7 @@ RemoteTCPInput::RemoteTCPInput(DeviceAPI *deviceAPI) :
RemoteTCPInput::~RemoteTCPInput()
{
qDebug() << "RemoteTCPInput::~RemoteTCPInput";
QObject::disconnect(
m_networkManager,
&QNetworkAccessManager::finished,
@@ -84,25 +96,45 @@ void RemoteTCPInput::destroy()
void RemoteTCPInput::init()
{
qDebug() << "*************** RemoteTCPInput::init";
applySettings(m_settings, QList<QString>(), true);
}
bool RemoteTCPInput::start()
{
qDebug() << "RemoteTCPInput::start";
if (m_running) {
qDebug() << "RemoteTCPInput::stop - Already running";
return true;
}
m_remoteInputTCPPHandler->reset();
m_remoteInputTCPPHandler->start();
qDebug() << "************ RemoteTCPInput::start" << m_settings.m_dataAddress;
m_remoteInputTCPPHandler->getInputMessageQueue()->push(RemoteTCPInputTCPHandler::MsgConfigureTcpHandler::create(m_settings, QList<QString>(), true));
m_thread.start();
m_running = true;
return true;
}
void RemoteTCPInput::stop()
{
qDebug() << "RemoteTCPInput::stop";
if (!m_running) {
// For wasm, important not to call m_remoteInputTCPPHandler->stop() twice
// as mutex can deadlock when this object is being deleted
qDebug() << "RemoteTCPInput::stop - Not running";
return;
}
m_remoteInputTCPPHandler->stop();
qDebug() << "RemoteTCPInput::stop1";
m_thread.quit();
qDebug() << "RemoteTCPInput::stop2";
#ifndef __EMSCRIPTEN__
qDebug() << "RemoteTCPInput::stop3";
m_thread.wait();
#endif
m_running = false;
qDebug() << "RemoteTCPInput::stopped";
}
QByteArray RemoteTCPInput::serialize() const
@@ -120,6 +152,8 @@ bool RemoteTCPInput::deserialize(const QByteArray& data)
success = false;
}
qDebug() << "************** RemoteTCPInput::deserialize" << m_settings.m_dataAddress;
MsgConfigureRemoteTCPInput* message = MsgConfigureRemoteTCPInput::create(m_settings, QList<QString>(), true);
m_inputMessageQueue.push(message);
@@ -196,6 +230,7 @@ bool RemoteTCPInput::handleMessage(const Message& message)
{
qDebug() << "RemoteTCPInput::handleMessage:" << message.getIdentifier();
MsgConfigureRemoteTCPInput& conf = (MsgConfigureRemoteTCPInput&) message;
qDebug() << "*********** RemoteTCPInput::handleMessage MsgConfigureRemoteTCPInput" << m_settings.m_dataAddress;
applySettings(conf.getSettings(), conf.getSettingsKeys(), conf.getForce());
return true;
}
@@ -210,6 +245,42 @@ bool RemoteTCPInput::handleMessage(const Message& message)
}
return true;
}
else if (MsgSaveReplay::match(message))
{
MsgSaveReplay& cmd = (MsgSaveReplay&) message;
m_replayBuffer.save(cmd.getFilename(), m_settings.m_devSampleRate, getCenterFrequency());
return true;
}
else if (MsgSendMessage::match(message))
{
MsgSendMessage& msg = (MsgSendMessage&) message;
m_remoteInputTCPPHandler->getInputMessageQueue()->push(MsgSendMessage::create(msg.getCallsign(), msg.getText(), msg.getBroadcast()));
return true;
}
else if (MsgReportPosition::match(message))
{
MsgReportPosition& report = (MsgReportPosition&) message;
m_latitude = report.getLatitude();
m_longitude = report.getLongitude();
m_altitude = report.getAltitude();
emit positionChanged(m_latitude, m_longitude, m_altitude);
return true;
}
else if (MsgReportDirection::match(message))
{
MsgReportDirection& report = (MsgReportDirection&) message;
m_isotropic = report.getIsotropic();
m_azimuth = report.getAzimuth();
m_elevation = report.getElevation();
emit directionChanged(m_isotropic, m_azimuth, m_elevation);
return true;
}
else
{
return false;
@@ -242,6 +313,12 @@ void RemoteTCPInput::applySettings(const RemoteTCPInputSettings& settings, const
forwardChange = true;
}
if ((settingsKeys.contains("channelSampleRate") || force)
&& (settings.m_devSampleRate != m_settings.m_devSampleRate))
{
m_replayBuffer.clear();
}
mutexLocker.unlock();
if (settings.m_useReverseAPI)
@@ -265,6 +342,18 @@ void RemoteTCPInput::applySettings(const RemoteTCPInputSettings& settings, const
m_settings.applySettings(settingsKeys, settings);
}
if (settingsKeys.contains("replayLength") || settingsKeys.contains("devSampleRate") || force) {
m_replayBuffer.setSize(m_settings.m_replayLength, m_settings.m_devSampleRate);
}
if (settingsKeys.contains("replayOffset") || settingsKeys.contains("devSampleRate") || force) {
m_replayBuffer.setReadOffset(((unsigned)(m_settings.m_replayOffset * m_settings.m_devSampleRate)) * 2);
}
if (settingsKeys.contains("replayLoop") || force) {
m_replayBuffer.setLoop(m_settings.m_replayLoop);
}
m_remoteInputTCPPHandler->getInputMessageQueue()->push(RemoteTCPInputTCPHandler::MsgConfigureTcpHandler::create(m_settings, settingsKeys, force));
}
@@ -459,6 +548,9 @@ int RemoteTCPInput::webapiReportGet(
void RemoteTCPInput::webapiFormatDeviceReport(SWGSDRangel::SWGDeviceReport& response)
{
response.getRemoteTcpInputReport()->setSampleRate(m_settings.m_channelSampleRate);
response.getRemoteTcpInputReport()->setLatitude(m_latitude);
response.getRemoteTcpInputReport()->setLongitude(m_longitude);
response.getRemoteTcpInputReport()->setAltitude(m_altitude);
}
void RemoteTCPInput::webapiReverseSendSettings(const QList<QString>& deviceSettingsKeys, const RemoteTCPInputSettings& settings, bool force)