mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-11-15 12:51:49 -05:00
Add UDP ports for packet forwarding in Packet mod and demod.
This commit is contained in:
parent
300c428f8c
commit
e15470494a
@ -167,6 +167,14 @@ bool PacketDemod::handleMessage(const Message& cmd)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Forward via UDP
|
||||||
|
if (m_settings.m_udpEnabled)
|
||||||
|
{
|
||||||
|
qDebug() << "Forwarding to " << m_settings.m_udpAddress << ":" << m_settings.m_udpPort;
|
||||||
|
m_udpSocket.writeDatagram(report.getPacket().data(), report.getPacket().size(),
|
||||||
|
QHostAddress(m_settings.m_udpAddress), m_settings.m_udpPort);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -197,7 +205,15 @@ void PacketDemod::applySettings(const PacketDemodSettings& settings, bool force)
|
|||||||
if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force) {
|
if ((settings.m_fmDeviation != m_settings.m_fmDeviation) || force) {
|
||||||
reverseAPIKeys.append("fmDeviation");
|
reverseAPIKeys.append("fmDeviation");
|
||||||
}
|
}
|
||||||
|
if ((settings.m_udpEnabled != m_settings.m_udpEnabled) || force) {
|
||||||
|
reverseAPIKeys.append("udpEnabled");
|
||||||
|
}
|
||||||
|
if ((settings.m_udpAddress != m_settings.m_udpAddress) || force) {
|
||||||
|
reverseAPIKeys.append("udpAddress");
|
||||||
|
}
|
||||||
|
if ((settings.m_udpPort != m_settings.m_udpPort) || force) {
|
||||||
|
reverseAPIKeys.append("udpPort");
|
||||||
|
}
|
||||||
if (m_settings.m_streamIndex != settings.m_streamIndex)
|
if (m_settings.m_streamIndex != settings.m_streamIndex)
|
||||||
{
|
{
|
||||||
if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only
|
if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only
|
||||||
@ -299,6 +315,15 @@ void PacketDemod::webapiUpdateChannelSettings(
|
|||||||
if (channelSettingsKeys.contains("rfBandwidth")) {
|
if (channelSettingsKeys.contains("rfBandwidth")) {
|
||||||
settings.m_rfBandwidth = response.getPacketDemodSettings()->getRfBandwidth();
|
settings.m_rfBandwidth = response.getPacketDemodSettings()->getRfBandwidth();
|
||||||
}
|
}
|
||||||
|
if (channelSettingsKeys.contains("udpEnabled")) {
|
||||||
|
settings.m_udpEnabled = response.getPacketDemodSettings()->getUdpEnabled();
|
||||||
|
}
|
||||||
|
if (channelSettingsKeys.contains("udpAddress")) {
|
||||||
|
settings.m_udpAddress = *response.getPacketDemodSettings()->getUdpAddress();
|
||||||
|
}
|
||||||
|
if (channelSettingsKeys.contains("udpPort")) {
|
||||||
|
settings.m_udpPort = response.getPacketDemodSettings()->getUdpPort();
|
||||||
|
}
|
||||||
if (channelSettingsKeys.contains("rgbColor")) {
|
if (channelSettingsKeys.contains("rgbColor")) {
|
||||||
settings.m_rgbColor = response.getPacketDemodSettings()->getRgbColor();
|
settings.m_rgbColor = response.getPacketDemodSettings()->getRgbColor();
|
||||||
}
|
}
|
||||||
@ -330,8 +355,11 @@ void PacketDemod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& r
|
|||||||
response.getPacketDemodSettings()->setFmDeviation(settings.m_fmDeviation);
|
response.getPacketDemodSettings()->setFmDeviation(settings.m_fmDeviation);
|
||||||
response.getPacketDemodSettings()->setInputFrequencyOffset(settings.m_inputFrequencyOffset);
|
response.getPacketDemodSettings()->setInputFrequencyOffset(settings.m_inputFrequencyOffset);
|
||||||
response.getPacketDemodSettings()->setRfBandwidth(settings.m_rfBandwidth);
|
response.getPacketDemodSettings()->setRfBandwidth(settings.m_rfBandwidth);
|
||||||
response.getPacketDemodSettings()->setRgbColor(settings.m_rgbColor);
|
response.getPacketDemodSettings()->setUdpEnabled(settings.m_udpEnabled);
|
||||||
|
response.getPacketDemodSettings()->setUdpAddress(new QString(settings.m_udpAddress));
|
||||||
|
response.getPacketDemodSettings()->setUdpPort(settings.m_udpPort);
|
||||||
|
|
||||||
|
response.getPacketDemodSettings()->setRgbColor(settings.m_rgbColor);
|
||||||
if (response.getPacketDemodSettings()->getTitle()) {
|
if (response.getPacketDemodSettings()->getTitle()) {
|
||||||
*response.getPacketDemodSettings()->getTitle() = settings.m_title;
|
*response.getPacketDemodSettings()->getTitle() = settings.m_title;
|
||||||
} else {
|
} else {
|
||||||
@ -402,6 +430,15 @@ void PacketDemod::webapiFormatChannelSettings(
|
|||||||
if (channelSettingsKeys.contains("rfBandwidth") || force) {
|
if (channelSettingsKeys.contains("rfBandwidth") || force) {
|
||||||
swgPacketDemodSettings->setRfBandwidth(settings.m_rfBandwidth);
|
swgPacketDemodSettings->setRfBandwidth(settings.m_rfBandwidth);
|
||||||
}
|
}
|
||||||
|
if (channelSettingsKeys.contains("udpEnabled") || force) {
|
||||||
|
swgPacketDemodSettings->setUdpEnabled(settings.m_udpEnabled);
|
||||||
|
}
|
||||||
|
if (channelSettingsKeys.contains("udpAddress") || force) {
|
||||||
|
swgPacketDemodSettings->setUdpAddress(new QString(settings.m_udpAddress));
|
||||||
|
}
|
||||||
|
if (channelSettingsKeys.contains("udpPort") || force) {
|
||||||
|
swgPacketDemodSettings->setUdpPort(settings.m_udpPort);
|
||||||
|
}
|
||||||
if (channelSettingsKeys.contains("rgbColor") || force) {
|
if (channelSettingsKeys.contains("rgbColor") || force) {
|
||||||
swgPacketDemodSettings->setRgbColor(settings.m_rgbColor);
|
swgPacketDemodSettings->setRgbColor(settings.m_rgbColor);
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <QNetworkRequest>
|
#include <QNetworkRequest>
|
||||||
|
#include <QUdpSocket>
|
||||||
#include <QThread>
|
#include <QThread>
|
||||||
|
|
||||||
#include "dsp/basebandsamplesink.h"
|
#include "dsp/basebandsamplesink.h"
|
||||||
@ -131,6 +132,7 @@ private:
|
|||||||
PacketDemodSettings m_settings;
|
PacketDemodSettings m_settings;
|
||||||
int m_basebandSampleRate; //!< stored from device message used when starting baseband sink
|
int m_basebandSampleRate; //!< stored from device message used when starting baseband sink
|
||||||
qint64 m_centerFrequency;
|
qint64 m_centerFrequency;
|
||||||
|
QUdpSocket m_udpSocket;
|
||||||
|
|
||||||
QNetworkAccessManager *m_networkManager;
|
QNetworkAccessManager *m_networkManager;
|
||||||
QNetworkRequest m_networkRequest;
|
QNetworkRequest m_networkRequest;
|
||||||
|
@ -306,6 +306,24 @@ void PacketDemodGUI::on_clearTable_clicked()
|
|||||||
ui->packets->setRowCount(0);
|
ui->packets->setRowCount(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PacketDemodGUI::on_udpEnabled_clicked(bool checked)
|
||||||
|
{
|
||||||
|
m_settings.m_udpEnabled = checked;
|
||||||
|
applySettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PacketDemodGUI::on_udpAddress_editingFinished()
|
||||||
|
{
|
||||||
|
m_settings.m_udpAddress = ui->udpAddress->text();
|
||||||
|
applySettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PacketDemodGUI::on_udpPort_editingFinished()
|
||||||
|
{
|
||||||
|
m_settings.m_udpPort = ui->udpPort->text().toInt();
|
||||||
|
applySettings();
|
||||||
|
}
|
||||||
|
|
||||||
void PacketDemodGUI::filterRow(int row)
|
void PacketDemodGUI::filterRow(int row)
|
||||||
{
|
{
|
||||||
bool hidden = false;
|
bool hidden = false;
|
||||||
@ -503,6 +521,10 @@ void PacketDemodGUI::displaySettings()
|
|||||||
ui->filterTo->setText(m_settings.m_filterTo);
|
ui->filterTo->setText(m_settings.m_filterTo);
|
||||||
ui->filterPID->setChecked(m_settings.m_filterPID == "f0");
|
ui->filterPID->setChecked(m_settings.m_filterPID == "f0");
|
||||||
|
|
||||||
|
ui->udpEnabled->setChecked(m_settings.m_udpEnabled);
|
||||||
|
ui->udpAddress->setText(m_settings.m_udpAddress);
|
||||||
|
ui->udpPort->setText(QString::number(m_settings.m_udpPort));
|
||||||
|
|
||||||
// Order and size columns
|
// Order and size columns
|
||||||
QHeaderView *header = ui->packets->horizontalHeader();
|
QHeaderView *header = ui->packets->horizontalHeader();
|
||||||
for (int i = 0; i < PACKETDEMOD_COLUMNS; i++)
|
for (int i = 0; i < PACKETDEMOD_COLUMNS; i++)
|
||||||
|
@ -104,6 +104,9 @@ private slots:
|
|||||||
void on_filterTo_editingFinished();
|
void on_filterTo_editingFinished();
|
||||||
void on_filterPID_stateChanged(int state);
|
void on_filterPID_stateChanged(int state);
|
||||||
void on_clearTable_clicked();
|
void on_clearTable_clicked();
|
||||||
|
void on_udpEnabled_clicked(bool checked);
|
||||||
|
void on_udpAddress_editingFinished();
|
||||||
|
void on_udpPort_editingFinished();
|
||||||
void filterRow(int row);
|
void filterRow(int row);
|
||||||
void filter();
|
void filter();
|
||||||
void packets_sectionMoved(int logicalIndex, int oldVisualIndex, int newVisualIndex);
|
void packets_sectionMoved(int logicalIndex, int oldVisualIndex, int newVisualIndex);
|
||||||
|
@ -43,7 +43,7 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>390</width>
|
<width>390</width>
|
||||||
<height>101</height>
|
<height>131</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="minimumSize">
|
<property name="minimumSize">
|
||||||
@ -174,7 +174,7 @@
|
|||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="buttonLayout">
|
<layout class="QHBoxLayout" name="powerLayout">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="channelPowerMeterUnits">
|
<widget class="QLabel" name="channelPowerMeterUnits">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@ -210,7 +210,14 @@
|
|||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
<widget class="Line" name="line_5">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="phySettingsLayout">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QComboBox" name="mode">
|
<widget class="QComboBox" name="mode">
|
||||||
<property name="minimumSize">
|
<property name="minimumSize">
|
||||||
@ -373,7 +380,111 @@
|
|||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
<widget class="Line" name="line_6">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="udpLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="udpEnabled">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Send packets via UDP</string>
|
||||||
|
</property>
|
||||||
|
<property name="layoutDirection">
|
||||||
|
<enum>Qt::RightToLeft</enum>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>UDP</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="udpAddress">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>120</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="focusPolicy">
|
||||||
|
<enum>Qt::ClickFocus</enum>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Destination UDP address</string>
|
||||||
|
</property>
|
||||||
|
<property name="inputMask">
|
||||||
|
<string>000.000.000.000</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>127.0.0.1</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="udpSeparator">
|
||||||
|
<property name="text">
|
||||||
|
<string>:</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="udpPort">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>50</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>50</width>
|
||||||
|
<height>16777215</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="focusPolicy">
|
||||||
|
<enum>Qt::ClickFocus</enum>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Destination UDP port</string>
|
||||||
|
</property>
|
||||||
|
<property name="inputMask">
|
||||||
|
<string>00000</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>9998</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer_4">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="Line" name="line_3">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="filterLayout">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="filterFromLabel">
|
<widget class="QLabel" name="filterFromLabel">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@ -450,7 +561,7 @@
|
|||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>110</y>
|
<y>140</y>
|
||||||
<width>391</width>
|
<width>391</width>
|
||||||
<height>261</height>
|
<height>261</height>
|
||||||
</rect>
|
</rect>
|
||||||
@ -556,18 +667,18 @@
|
|||||||
<header>gui/rollupwidget.h</header>
|
<header>gui/rollupwidget.h</header>
|
||||||
<container>1</container>
|
<container>1</container>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
<customwidget>
|
|
||||||
<class>LevelMeterSignalDB</class>
|
|
||||||
<extends>QWidget</extends>
|
|
||||||
<header>gui/levelmeter.h</header>
|
|
||||||
<container>1</container>
|
|
||||||
</customwidget>
|
|
||||||
<customwidget>
|
<customwidget>
|
||||||
<class>ValueDialZ</class>
|
<class>ValueDialZ</class>
|
||||||
<extends>QWidget</extends>
|
<extends>QWidget</extends>
|
||||||
<header>gui/valuedialz.h</header>
|
<header>gui/valuedialz.h</header>
|
||||||
<container>1</container>
|
<container>1</container>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
|
<customwidget>
|
||||||
|
<class>LevelMeterSignalDB</class>
|
||||||
|
<extends>QWidget</extends>
|
||||||
|
<header>gui/levelmeter.h</header>
|
||||||
|
<container>1</container>
|
||||||
|
</customwidget>
|
||||||
</customwidgets>
|
</customwidgets>
|
||||||
<tabstops>
|
<tabstops>
|
||||||
<tabstop>packets</tabstop>
|
<tabstop>packets</tabstop>
|
||||||
|
@ -38,6 +38,9 @@ void PacketDemodSettings::resetToDefaults()
|
|||||||
m_filterFrom = "";
|
m_filterFrom = "";
|
||||||
m_filterTo = "";
|
m_filterTo = "";
|
||||||
m_filterPID = "";
|
m_filterPID = "";
|
||||||
|
m_udpEnabled = false;
|
||||||
|
m_udpAddress = "127.0.0.1";
|
||||||
|
m_udpPort = 9999;
|
||||||
|
|
||||||
m_rgbColor = QColor(0, 105, 2).rgb();
|
m_rgbColor = QColor(0, 105, 2).rgb();
|
||||||
m_title = "Packet Demodulator";
|
m_title = "Packet Demodulator";
|
||||||
@ -78,6 +81,9 @@ QByteArray PacketDemodSettings::serialize() const
|
|||||||
|
|
||||||
s.writeFloat(20, m_rfBandwidth);
|
s.writeFloat(20, m_rfBandwidth);
|
||||||
s.writeFloat(21, m_fmDeviation);
|
s.writeFloat(21, m_fmDeviation);
|
||||||
|
s.writeBool(22, m_udpEnabled);
|
||||||
|
s.writeString(23, m_udpAddress);
|
||||||
|
s.writeU32(24, m_udpPort);
|
||||||
|
|
||||||
for (int i = 0; i < PACKETDEMOD_COLUMNS; i++)
|
for (int i = 0; i < PACKETDEMOD_COLUMNS; i++)
|
||||||
s.writeS32(100 + i, m_columnIndexes[i]);
|
s.writeS32(100 + i, m_columnIndexes[i]);
|
||||||
@ -134,6 +140,15 @@ bool PacketDemodSettings::deserialize(const QByteArray& data)
|
|||||||
d.readFloat(20, &m_rfBandwidth, 12500.0f);
|
d.readFloat(20, &m_rfBandwidth, 12500.0f);
|
||||||
d.readFloat(21, &m_fmDeviation, 2500.0f);
|
d.readFloat(21, &m_fmDeviation, 2500.0f);
|
||||||
|
|
||||||
|
d.readBool(22, &m_udpEnabled);
|
||||||
|
d.readString(23, &m_udpAddress);
|
||||||
|
d.readU32(24, &utmp);
|
||||||
|
if ((utmp > 1023) && (utmp < 65535)) {
|
||||||
|
m_udpPort = utmp;
|
||||||
|
} else {
|
||||||
|
m_udpPort = 9999;
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 0; i < PACKETDEMOD_COLUMNS; i++)
|
for (int i = 0; i < PACKETDEMOD_COLUMNS; i++)
|
||||||
d.readS32(100 + i, &m_columnIndexes[i], i);
|
d.readS32(100 + i, &m_columnIndexes[i], i);
|
||||||
for (int i = 0; i < PACKETDEMOD_COLUMNS; i++)
|
for (int i = 0; i < PACKETDEMOD_COLUMNS; i++)
|
||||||
|
@ -36,6 +36,9 @@ struct PacketDemodSettings
|
|||||||
QString m_filterFrom;
|
QString m_filterFrom;
|
||||||
QString m_filterTo;
|
QString m_filterTo;
|
||||||
QString m_filterPID;
|
QString m_filterPID;
|
||||||
|
bool m_udpEnabled;
|
||||||
|
QString m_udpAddress;
|
||||||
|
uint16_t m_udpPort;
|
||||||
|
|
||||||
quint32 m_rgbColor;
|
quint32 m_rgbColor;
|
||||||
QString m_title;
|
QString m_title;
|
||||||
|
@ -50,6 +50,18 @@ Checking this option displays only packets where the PID (Protocol ID) field is
|
|||||||
|
|
||||||
Pressing this button clears all packets from the table.
|
Pressing this button clears all packets from the table.
|
||||||
|
|
||||||
|
<h3>11: UDP</h3>
|
||||||
|
|
||||||
|
When checked, received packets are forwarded to the specified UDP address (12) and port (13).
|
||||||
|
|
||||||
|
<h3>12: UDP address</h3>
|
||||||
|
|
||||||
|
IP address of the host to forward received packets to via UDP.
|
||||||
|
|
||||||
|
<h3>11: UDP port</h3>
|
||||||
|
|
||||||
|
UDP port number to forward received packets to.
|
||||||
|
|
||||||
<h3>Received Packets Table</h3>
|
<h3>Received Packets Table</h3>
|
||||||
|
|
||||||
The received packets table displays the contexts of the packets that have been received. Only packets with valid CRCs are displayed.
|
The received packets table displays the contexts of the packets that have been received. Only packets with valid CRCs are displayed.
|
||||||
|
@ -20,8 +20,10 @@
|
|||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QMutexLocker>
|
#include <QMutexLocker>
|
||||||
#include <QNetworkAccessManager>
|
#include <QNetworkAccessManager>
|
||||||
|
#include <QNetworkDatagram>
|
||||||
#include <QNetworkReply>
|
#include <QNetworkReply>
|
||||||
#include <QBuffer>
|
#include <QBuffer>
|
||||||
|
#include <QUdpSocket>
|
||||||
#include <QThread>
|
#include <QThread>
|
||||||
|
|
||||||
#include "SWGChannelSettings.h"
|
#include "SWGChannelSettings.h"
|
||||||
@ -48,6 +50,7 @@
|
|||||||
|
|
||||||
MESSAGE_CLASS_DEFINITION(PacketMod::MsgConfigurePacketMod, Message)
|
MESSAGE_CLASS_DEFINITION(PacketMod::MsgConfigurePacketMod, Message)
|
||||||
MESSAGE_CLASS_DEFINITION(PacketMod::MsgTXPacketMod, Message)
|
MESSAGE_CLASS_DEFINITION(PacketMod::MsgTXPacketMod, Message)
|
||||||
|
MESSAGE_CLASS_DEFINITION(PacketMod::MsgTXPacketBytes, Message)
|
||||||
|
|
||||||
const char* const PacketMod::m_channelIdURI = "sdrangel.channeltx.modpacket";
|
const char* const PacketMod::m_channelIdURI = "sdrangel.channeltx.modpacket";
|
||||||
const char* const PacketMod::m_channelId = "PacketMod";
|
const char* const PacketMod::m_channelId = "PacketMod";
|
||||||
@ -57,7 +60,8 @@ PacketMod::PacketMod(DeviceAPI *deviceAPI) :
|
|||||||
m_deviceAPI(deviceAPI),
|
m_deviceAPI(deviceAPI),
|
||||||
m_spectrumVis(SDR_TX_SCALEF),
|
m_spectrumVis(SDR_TX_SCALEF),
|
||||||
m_settingsMutex(QMutex::Recursive),
|
m_settingsMutex(QMutex::Recursive),
|
||||||
m_sampleRate(48000)
|
m_sampleRate(48000),
|
||||||
|
m_udpSocket(nullptr)
|
||||||
{
|
{
|
||||||
setObjectName(m_channelId);
|
setObjectName(m_channelId);
|
||||||
|
|
||||||
@ -78,6 +82,7 @@ PacketMod::PacketMod(DeviceAPI *deviceAPI) :
|
|||||||
|
|
||||||
PacketMod::~PacketMod()
|
PacketMod::~PacketMod()
|
||||||
{
|
{
|
||||||
|
closeUDP();
|
||||||
disconnect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
disconnect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
|
||||||
delete m_networkManager;
|
delete m_networkManager;
|
||||||
m_deviceAPI->removeChannelSourceAPI(this);
|
m_deviceAPI->removeChannelSourceAPI(this);
|
||||||
@ -225,102 +230,125 @@ void PacketMod::applySettings(const PacketModSettings& settings, bool force)
|
|||||||
reverseAPIKeys.append("spaceFrequency");
|
reverseAPIKeys.append("spaceFrequency");
|
||||||
}
|
}
|
||||||
|
|
||||||
if((settings.m_ax25PreFlags != m_settings.m_ax25PreFlags) || force) {
|
if ((settings.m_ax25PreFlags != m_settings.m_ax25PreFlags) || force) {
|
||||||
reverseAPIKeys.append("ax25PreFlags");
|
reverseAPIKeys.append("ax25PreFlags");
|
||||||
}
|
}
|
||||||
|
|
||||||
if((settings.m_ax25PostFlags != m_settings.m_ax25PostFlags) || force) {
|
if ((settings.m_ax25PostFlags != m_settings.m_ax25PostFlags) || force) {
|
||||||
reverseAPIKeys.append("ax25PostFlags");
|
reverseAPIKeys.append("ax25PostFlags");
|
||||||
}
|
}
|
||||||
|
|
||||||
if((settings.m_ax25Control != m_settings.m_ax25Control) || force) {
|
if ((settings.m_ax25Control != m_settings.m_ax25Control) || force) {
|
||||||
reverseAPIKeys.append("ax25Control");
|
reverseAPIKeys.append("ax25Control");
|
||||||
}
|
}
|
||||||
|
|
||||||
if((settings.m_ax25PID != m_settings.m_ax25PID) || force) {
|
if ((settings.m_ax25PID != m_settings.m_ax25PID) || force) {
|
||||||
reverseAPIKeys.append("ax25PID");
|
reverseAPIKeys.append("ax25PID");
|
||||||
}
|
}
|
||||||
|
|
||||||
if((settings.m_preEmphasis != m_settings.m_preEmphasis) || force) {
|
if ((settings.m_preEmphasis != m_settings.m_preEmphasis) || force) {
|
||||||
reverseAPIKeys.append("preEmphasis");
|
reverseAPIKeys.append("preEmphasis");
|
||||||
}
|
}
|
||||||
|
|
||||||
if((settings.m_preEmphasisTau != m_settings.m_preEmphasisTau) || force) {
|
if ((settings.m_preEmphasisTau != m_settings.m_preEmphasisTau) || force) {
|
||||||
reverseAPIKeys.append("preEmphasisTau");
|
reverseAPIKeys.append("preEmphasisTau");
|
||||||
}
|
}
|
||||||
|
|
||||||
if((settings.m_preEmphasisHighFreq != m_settings.m_preEmphasisHighFreq) || force) {
|
if ((settings.m_preEmphasisHighFreq != m_settings.m_preEmphasisHighFreq) || force) {
|
||||||
reverseAPIKeys.append("preEmphasisHighFreq");
|
reverseAPIKeys.append("preEmphasisHighFreq");
|
||||||
}
|
}
|
||||||
|
|
||||||
if((settings.m_lpfTaps != m_settings.m_lpfTaps) || force) {
|
if ((settings.m_lpfTaps != m_settings.m_lpfTaps) || force) {
|
||||||
reverseAPIKeys.append("lpfTaps");
|
reverseAPIKeys.append("lpfTaps");
|
||||||
}
|
}
|
||||||
|
|
||||||
if((settings.m_bbNoise != m_settings.m_bbNoise) || force) {
|
if ((settings.m_bbNoise != m_settings.m_bbNoise) || force) {
|
||||||
reverseAPIKeys.append("bbNoise");
|
reverseAPIKeys.append("bbNoise");
|
||||||
}
|
}
|
||||||
|
|
||||||
if((settings.m_rfNoise != m_settings.m_rfNoise) || force) {
|
if ((settings.m_rfNoise != m_settings.m_rfNoise) || force) {
|
||||||
reverseAPIKeys.append("rfNoise");
|
reverseAPIKeys.append("rfNoise");
|
||||||
}
|
}
|
||||||
|
|
||||||
if((settings.m_writeToFile != m_settings.m_writeToFile) || force) {
|
if ((settings.m_writeToFile != m_settings.m_writeToFile) || force) {
|
||||||
reverseAPIKeys.append("writeToFile");
|
reverseAPIKeys.append("writeToFile");
|
||||||
}
|
}
|
||||||
|
|
||||||
if((settings.m_spectrumRate != m_settings.m_spectrumRate) || force) {
|
if ((settings.m_spectrumRate != m_settings.m_spectrumRate) || force) {
|
||||||
reverseAPIKeys.append("spectrumRate");
|
reverseAPIKeys.append("spectrumRate");
|
||||||
}
|
}
|
||||||
|
|
||||||
if((settings.m_callsign != m_settings.m_callsign) || force) {
|
if ((settings.m_callsign != m_settings.m_callsign) || force) {
|
||||||
reverseAPIKeys.append("callsign");
|
reverseAPIKeys.append("callsign");
|
||||||
}
|
}
|
||||||
|
|
||||||
if((settings.m_to != m_settings.m_to) || force) {
|
if ((settings.m_to != m_settings.m_to) || force) {
|
||||||
reverseAPIKeys.append("to");
|
reverseAPIKeys.append("to");
|
||||||
}
|
}
|
||||||
|
|
||||||
if((settings.m_via != m_settings.m_via) || force) {
|
if ((settings.m_via != m_settings.m_via) || force) {
|
||||||
reverseAPIKeys.append("via");
|
reverseAPIKeys.append("via");
|
||||||
}
|
}
|
||||||
|
|
||||||
if((settings.m_data != m_settings.m_data) || force) {
|
if ((settings.m_data != m_settings.m_data) || force) {
|
||||||
reverseAPIKeys.append("data");
|
reverseAPIKeys.append("data");
|
||||||
}
|
}
|
||||||
|
|
||||||
if((settings.m_bpf != m_settings.m_bpf) || force) {
|
if ((settings.m_bpf != m_settings.m_bpf) || force) {
|
||||||
reverseAPIKeys.append("bpf");
|
reverseAPIKeys.append("bpf");
|
||||||
}
|
}
|
||||||
|
|
||||||
if((settings.m_bpfLowCutoff != m_settings.m_bpfLowCutoff) || force) {
|
if ((settings.m_bpfLowCutoff != m_settings.m_bpfLowCutoff) || force) {
|
||||||
reverseAPIKeys.append("bpfLowCutoff");
|
reverseAPIKeys.append("bpfLowCutoff");
|
||||||
}
|
}
|
||||||
|
|
||||||
if((settings.m_bpfHighCutoff != m_settings.m_bpfHighCutoff) || force) {
|
if ((settings.m_bpfHighCutoff != m_settings.m_bpfHighCutoff) || force) {
|
||||||
reverseAPIKeys.append("bpfHighCutoff");
|
reverseAPIKeys.append("bpfHighCutoff");
|
||||||
}
|
}
|
||||||
|
|
||||||
if((settings.m_bpfTaps != m_settings.m_bpfTaps) || force) {
|
if ((settings.m_bpfTaps != m_settings.m_bpfTaps) || force) {
|
||||||
reverseAPIKeys.append("bpfTaps");
|
reverseAPIKeys.append("bpfTaps");
|
||||||
}
|
}
|
||||||
|
|
||||||
if((settings.m_scramble != m_settings.m_scramble) || force) {
|
if ((settings.m_scramble != m_settings.m_scramble) || force) {
|
||||||
reverseAPIKeys.append("scramble");
|
reverseAPIKeys.append("scramble");
|
||||||
}
|
}
|
||||||
|
|
||||||
if((settings.m_polynomial != m_settings.m_polynomial) || force) {
|
if ((settings.m_polynomial != m_settings.m_polynomial) || force) {
|
||||||
reverseAPIKeys.append("polynomial");
|
reverseAPIKeys.append("polynomial");
|
||||||
}
|
}
|
||||||
|
|
||||||
if((settings.m_beta != m_settings.m_beta) || force) {
|
if ((settings.m_beta != m_settings.m_beta) || force) {
|
||||||
reverseAPIKeys.append("beta");
|
reverseAPIKeys.append("beta");
|
||||||
}
|
}
|
||||||
|
|
||||||
if((settings.m_symbolSpan != m_settings.m_symbolSpan) || force) {
|
if ((settings.m_symbolSpan != m_settings.m_symbolSpan) || force) {
|
||||||
reverseAPIKeys.append("symbolSpan");
|
reverseAPIKeys.append("symbolSpan");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((settings.m_udpEnabled != m_settings.m_udpEnabled) || force) {
|
||||||
|
reverseAPIKeys.append("udpEnabled");
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((settings.m_udpAddress != m_settings.m_udpAddress) || force) {
|
||||||
|
reverseAPIKeys.append("udpAddress");
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((settings.m_udpPort != m_settings.m_udpPort) || force) {
|
||||||
|
reverseAPIKeys.append("udpPort");
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( (settings.m_udpEnabled != m_settings.m_udpEnabled)
|
||||||
|
|| (settings.m_udpAddress != m_settings.m_udpAddress)
|
||||||
|
|| (settings.m_udpPort != m_settings.m_udpPort)
|
||||||
|
|| force)
|
||||||
|
{
|
||||||
|
if (settings.m_udpEnabled)
|
||||||
|
openUDP(settings);
|
||||||
|
else
|
||||||
|
closeUDP();
|
||||||
|
}
|
||||||
|
|
||||||
if (m_settings.m_streamIndex != settings.m_streamIndex)
|
if (m_settings.m_streamIndex != settings.m_streamIndex)
|
||||||
{
|
{
|
||||||
if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only
|
if (m_deviceAPI->getSampleMIMO()) // change of stream is possible for MIMO devices only
|
||||||
@ -559,6 +587,15 @@ void PacketMod::webapiUpdateChannelSettings(
|
|||||||
if (channelSettingsKeys.contains("reverseAPIChannelIndex")) {
|
if (channelSettingsKeys.contains("reverseAPIChannelIndex")) {
|
||||||
settings.m_reverseAPIChannelIndex = response.getPacketModSettings()->getReverseApiChannelIndex();
|
settings.m_reverseAPIChannelIndex = response.getPacketModSettings()->getReverseApiChannelIndex();
|
||||||
}
|
}
|
||||||
|
if (channelSettingsKeys.contains("udpEnabled")) {
|
||||||
|
settings.m_udpEnabled = response.getPacketDemodSettings()->getUdpEnabled();
|
||||||
|
}
|
||||||
|
if (channelSettingsKeys.contains("udpAddress")) {
|
||||||
|
settings.m_udpAddress = *response.getPacketDemodSettings()->getUdpAddress();
|
||||||
|
}
|
||||||
|
if (channelSettingsKeys.contains("udpPort")) {
|
||||||
|
settings.m_udpPort = response.getPacketDemodSettings()->getUdpPort();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int PacketMod::webapiReportGet(
|
int PacketMod::webapiReportGet(
|
||||||
@ -681,6 +718,9 @@ void PacketMod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& res
|
|||||||
response.getPacketModSettings()->setPulseShaping(settings.m_pulseShaping ? 1 : 0);
|
response.getPacketModSettings()->setPulseShaping(settings.m_pulseShaping ? 1 : 0);
|
||||||
response.getPacketModSettings()->setBeta(settings.m_beta);
|
response.getPacketModSettings()->setBeta(settings.m_beta);
|
||||||
response.getPacketModSettings()->setSymbolSpan(settings.m_symbolSpan);
|
response.getPacketModSettings()->setSymbolSpan(settings.m_symbolSpan);
|
||||||
|
response.getPacketModSettings()->setUdpEnabled(settings.m_udpEnabled);
|
||||||
|
response.getPacketModSettings()->setUdpAddress(new QString(settings.m_udpAddress));
|
||||||
|
response.getPacketModSettings()->setUdpPort(settings.m_udpPort);
|
||||||
|
|
||||||
response.getPacketModSettings()->setRgbColor(settings.m_rgbColor);
|
response.getPacketModSettings()->setRgbColor(settings.m_rgbColor);
|
||||||
|
|
||||||
@ -895,6 +935,15 @@ void PacketMod::webapiFormatChannelSettings(
|
|||||||
if (channelSettingsKeys.contains("streamIndex") || force) {
|
if (channelSettingsKeys.contains("streamIndex") || force) {
|
||||||
swgPacketModSettings->setStreamIndex(settings.m_streamIndex);
|
swgPacketModSettings->setStreamIndex(settings.m_streamIndex);
|
||||||
}
|
}
|
||||||
|
if (channelSettingsKeys.contains("udpEnabled") || force) {
|
||||||
|
swgPacketModSettings->setUdpEnabled(settings.m_udpEnabled);
|
||||||
|
}
|
||||||
|
if (channelSettingsKeys.contains("udpAddress") || force) {
|
||||||
|
swgPacketModSettings->setUdpAddress(new QString(settings.m_udpAddress));
|
||||||
|
}
|
||||||
|
if (channelSettingsKeys.contains("udpPort") || force) {
|
||||||
|
swgPacketModSettings->setUdpPort(settings.m_udpPort);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PacketMod::networkManagerFinished(QNetworkReply *reply)
|
void PacketMod::networkManagerFinished(QNetworkReply *reply)
|
||||||
@ -932,3 +981,34 @@ uint32_t PacketMod::getNumberOfDeviceStreams() const
|
|||||||
{
|
{
|
||||||
return m_deviceAPI->getNbSinkStreams();
|
return m_deviceAPI->getNbSinkStreams();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PacketMod::openUDP(const PacketModSettings& settings)
|
||||||
|
{
|
||||||
|
closeUDP();
|
||||||
|
m_udpSocket = new QUdpSocket();
|
||||||
|
if (!m_udpSocket->bind(QHostAddress(settings.m_udpAddress), settings.m_udpPort))
|
||||||
|
qCritical() << "PacketMod::openUDP: Failed to bind to port " << settings.m_udpAddress << ":" << settings.m_udpPort << ". Error: " << m_udpSocket->error();
|
||||||
|
else
|
||||||
|
qDebug() << "PacketMod::openUDP: Listening for packets on " << settings.m_udpAddress << ":" << settings.m_udpPort;
|
||||||
|
connect(m_udpSocket, &QUdpSocket::readyRead, this, &PacketMod::udpRx);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PacketMod::closeUDP()
|
||||||
|
{
|
||||||
|
if (m_udpSocket != nullptr)
|
||||||
|
{
|
||||||
|
disconnect(m_udpSocket, &QUdpSocket::readyRead, this, &PacketMod::udpRx);
|
||||||
|
delete m_udpSocket;
|
||||||
|
m_udpSocket = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PacketMod::udpRx()
|
||||||
|
{
|
||||||
|
while (m_udpSocket->hasPendingDatagrams())
|
||||||
|
{
|
||||||
|
QNetworkDatagram datagram = m_udpSocket->receiveDatagram();
|
||||||
|
MsgTXPacketBytes *msg = MsgTXPacketBytes::create(datagram.data());
|
||||||
|
m_basebandSource->getInputMessageQueue()->push(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -36,6 +36,7 @@
|
|||||||
class QNetworkAccessManager;
|
class QNetworkAccessManager;
|
||||||
class QNetworkReply;
|
class QNetworkReply;
|
||||||
class QThread;
|
class QThread;
|
||||||
|
class QUdpSocket;
|
||||||
class DeviceAPI;
|
class DeviceAPI;
|
||||||
class PacketModBaseband;
|
class PacketModBaseband;
|
||||||
|
|
||||||
@ -91,6 +92,25 @@ public:
|
|||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class MsgTXPacketBytes : public Message {
|
||||||
|
MESSAGE_CLASS_DECLARATION
|
||||||
|
|
||||||
|
public:
|
||||||
|
static MsgTXPacketBytes* create(QByteArray data)
|
||||||
|
{
|
||||||
|
return new MsgTXPacketBytes(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
QByteArray m_data;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
MsgTXPacketBytes(QByteArray data) :
|
||||||
|
Message(),
|
||||||
|
m_data(data)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
//=================================================================
|
//=================================================================
|
||||||
|
|
||||||
PacketMod(DeviceAPI *deviceAPI);
|
PacketMod(DeviceAPI *deviceAPI);
|
||||||
@ -174,6 +194,7 @@ private:
|
|||||||
|
|
||||||
QNetworkAccessManager *m_networkManager;
|
QNetworkAccessManager *m_networkManager;
|
||||||
QNetworkRequest m_networkRequest;
|
QNetworkRequest m_networkRequest;
|
||||||
|
QUdpSocket *m_udpSocket;
|
||||||
|
|
||||||
void applySettings(const PacketModSettings& settings, bool force = false);
|
void applySettings(const PacketModSettings& settings, bool force = false);
|
||||||
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
|
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
|
||||||
@ -190,9 +211,12 @@ private:
|
|||||||
const PacketModSettings& settings,
|
const PacketModSettings& settings,
|
||||||
bool force
|
bool force
|
||||||
);
|
);
|
||||||
|
void openUDP(const PacketModSettings& settings);
|
||||||
|
void closeUDP();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void networkManagerFinished(QNetworkReply *reply);
|
void networkManagerFinished(QNetworkReply *reply);
|
||||||
|
void udpRx();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -157,6 +157,13 @@ bool PacketModBaseband::handleMessage(const Message& cmd)
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
else if (PacketMod::MsgTXPacketBytes::match(cmd))
|
||||||
|
{
|
||||||
|
PacketMod::MsgTXPacketBytes& tx = (PacketMod::MsgTXPacketBytes&) cmd;
|
||||||
|
m_source.addTXPacket(tx.m_data);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
else if (DSPSignalNotification::match(cmd))
|
else if (DSPSignalNotification::match(cmd))
|
||||||
{
|
{
|
||||||
QMutexLocker mutexLocker(&m_mutex);
|
QMutexLocker mutexLocker(&m_mutex);
|
||||||
|
@ -338,6 +338,24 @@ void PacketModGUI::txSettingsSelect()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PacketModGUI::on_udpEnabled_clicked(bool checked)
|
||||||
|
{
|
||||||
|
m_settings.m_udpEnabled = checked;
|
||||||
|
applySettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PacketModGUI::on_udpAddress_editingFinished()
|
||||||
|
{
|
||||||
|
m_settings.m_udpAddress = ui->udpAddress->text();
|
||||||
|
applySettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PacketModGUI::on_udpPort_editingFinished()
|
||||||
|
{
|
||||||
|
m_settings.m_udpPort = ui->udpPort->text().toInt();
|
||||||
|
applySettings();
|
||||||
|
}
|
||||||
|
|
||||||
void PacketModGUI::onWidgetRolled(QWidget* widget, bool rollDown)
|
void PacketModGUI::onWidgetRolled(QWidget* widget, bool rollDown)
|
||||||
{
|
{
|
||||||
(void) widget;
|
(void) widget;
|
||||||
@ -532,6 +550,10 @@ void PacketModGUI::displaySettings()
|
|||||||
ui->gainText->setText(QString("%1").arg((double)m_settings.m_gain, 0, 'f', 1));
|
ui->gainText->setText(QString("%1").arg((double)m_settings.m_gain, 0, 'f', 1));
|
||||||
ui->gain->setValue(m_settings.m_gain);
|
ui->gain->setValue(m_settings.m_gain);
|
||||||
|
|
||||||
|
ui->udpEnabled->setChecked(m_settings.m_udpEnabled);
|
||||||
|
ui->udpAddress->setText(m_settings.m_udpAddress);
|
||||||
|
ui->udpPort->setText(QString::number(m_settings.m_udpPort));
|
||||||
|
|
||||||
ui->channelMute->setChecked(m_settings.m_channelMute);
|
ui->channelMute->setChecked(m_settings.m_channelMute);
|
||||||
ui->repeat->setChecked(m_settings.m_repeat);
|
ui->repeat->setChecked(m_settings.m_repeat);
|
||||||
|
|
||||||
|
@ -101,6 +101,9 @@ private slots:
|
|||||||
void bpfSelect();
|
void bpfSelect();
|
||||||
void repeatSelect();
|
void repeatSelect();
|
||||||
void txSettingsSelect();
|
void txSettingsSelect();
|
||||||
|
void on_udpEnabled_clicked(bool checked);
|
||||||
|
void on_udpAddress_editingFinished();
|
||||||
|
void on_udpPort_editingFinished();
|
||||||
|
|
||||||
void onWidgetRolled(QWidget* widget, bool rollDown);
|
void onWidgetRolled(QWidget* widget, bool rollDown);
|
||||||
void onMenuDialogCalled(const QPoint& p);
|
void onMenuDialogCalled(const QPoint& p);
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>350</width>
|
<width>350</width>
|
||||||
<height>610</height>
|
<height>702</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
@ -43,7 +43,7 @@
|
|||||||
<x>2</x>
|
<x>2</x>
|
||||||
<y>2</y>
|
<y>2</y>
|
||||||
<width>341</width>
|
<width>341</width>
|
||||||
<height>181</height>
|
<height>211</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="minimumSize">
|
<property name="minimumSize">
|
||||||
@ -435,6 +435,103 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="udpLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="udpEnabled">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Forward packets received via UDP</string>
|
||||||
|
</property>
|
||||||
|
<property name="layoutDirection">
|
||||||
|
<enum>Qt::RightToLeft</enum>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>UDP</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="udpAddress">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>120</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="focusPolicy">
|
||||||
|
<enum>Qt::ClickFocus</enum>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>UDP address to listen for packets to forward on</string>
|
||||||
|
</property>
|
||||||
|
<property name="inputMask">
|
||||||
|
<string>000.000.000.000</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>127.0.0.1</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="udpSeparator">
|
||||||
|
<property name="text">
|
||||||
|
<string>:</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="udpPort">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>50</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>50</width>
|
||||||
|
<height>16777215</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="focusPolicy">
|
||||||
|
<enum>Qt::ClickFocus</enum>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>UDP port to listen for packets to forward on</string>
|
||||||
|
</property>
|
||||||
|
<property name="inputMask">
|
||||||
|
<string>00000</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>9997</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer_4">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="Line" name="line_6">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="callsignLayout">
|
<layout class="QHBoxLayout" name="callsignLayout">
|
||||||
<item>
|
<item>
|
||||||
@ -686,7 +783,7 @@ APRS examples:
|
|||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>190</y>
|
<y>220</y>
|
||||||
<width>351</width>
|
<width>351</width>
|
||||||
<height>141</height>
|
<height>141</height>
|
||||||
</rect>
|
</rect>
|
||||||
@ -723,7 +820,7 @@ APRS examples:
|
|||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>340</y>
|
<y>370</y>
|
||||||
<width>351</width>
|
<width>351</width>
|
||||||
<height>284</height>
|
<height>284</height>
|
||||||
</rect>
|
</rect>
|
||||||
@ -789,9 +886,9 @@ APRS examples:
|
|||||||
<container>1</container>
|
<container>1</container>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
<customwidget>
|
<customwidget>
|
||||||
<class>LevelMeterVU</class>
|
<class>ValueDialZ</class>
|
||||||
<extends>QWidget</extends>
|
<extends>QWidget</extends>
|
||||||
<header>gui/levelmeter.h</header>
|
<header>gui/valuedialz.h</header>
|
||||||
<container>1</container>
|
<container>1</container>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
<customwidget>
|
<customwidget>
|
||||||
@ -800,9 +897,9 @@ APRS examples:
|
|||||||
<header>gui/buttonswitch.h</header>
|
<header>gui/buttonswitch.h</header>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
<customwidget>
|
<customwidget>
|
||||||
<class>ValueDialZ</class>
|
<class>LevelMeterVU</class>
|
||||||
<extends>QWidget</extends>
|
<extends>QWidget</extends>
|
||||||
<header>gui/valuedialz.h</header>
|
<header>gui/levelmeter.h</header>
|
||||||
<container>1</container>
|
<container>1</container>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
</customwidgets>
|
</customwidgets>
|
||||||
|
@ -63,7 +63,7 @@ void PacketModSettings::resetToDefaults()
|
|||||||
m_to = "APRS";
|
m_to = "APRS";
|
||||||
m_via = "WIDE2-2";
|
m_via = "WIDE2-2";
|
||||||
m_data = ">Using SDRangel";
|
m_data = ">Using SDRangel";
|
||||||
m_rgbColor = QColor(255, 0, 0).rgb();
|
m_rgbColor = QColor(0, 105, 2).rgb();
|
||||||
m_title = "Packet Modulator";
|
m_title = "Packet Modulator";
|
||||||
m_streamIndex = 0;
|
m_streamIndex = 0;
|
||||||
m_useReverseAPI = false;
|
m_useReverseAPI = false;
|
||||||
@ -80,6 +80,9 @@ void PacketModSettings::resetToDefaults()
|
|||||||
m_pulseShaping = true;
|
m_pulseShaping = true;
|
||||||
m_beta = 0.5f;
|
m_beta = 0.5f;
|
||||||
m_symbolSpan = 6;
|
m_symbolSpan = 6;
|
||||||
|
m_udpEnabled = false;
|
||||||
|
m_udpAddress = "127.0.0.1";
|
||||||
|
m_udpPort = 9998;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PacketModSettings::setMode(QString mode)
|
bool PacketModSettings::setMode(QString mode)
|
||||||
@ -181,6 +184,9 @@ QByteArray PacketModSettings::serialize() const
|
|||||||
s.writeS32(48, m_symbolSpan);
|
s.writeS32(48, m_symbolSpan);
|
||||||
s.writeS32(49, m_spectrumRate);
|
s.writeS32(49, m_spectrumRate);
|
||||||
s.writeS32(50, m_modulation);
|
s.writeS32(50, m_modulation);
|
||||||
|
s.writeBool(51, m_udpEnabled);
|
||||||
|
s.writeString(52, m_udpAddress);
|
||||||
|
s.writeU32(53, m_udpPort);
|
||||||
|
|
||||||
return s.final();
|
return s.final();
|
||||||
}
|
}
|
||||||
@ -267,6 +273,14 @@ bool PacketModSettings::deserialize(const QByteArray& data)
|
|||||||
d.readS32(48, &m_symbolSpan, 6);
|
d.readS32(48, &m_symbolSpan, 6);
|
||||||
d.readS32(49, &m_spectrumRate, m_baud == 1200 ? 8000 : 24000);
|
d.readS32(49, &m_spectrumRate, m_baud == 1200 ? 8000 : 24000);
|
||||||
d.readS32(50, (qint32 *)&m_modulation, m_baud == 1200 ? PacketModSettings::AFSK : PacketModSettings::FSK);
|
d.readS32(50, (qint32 *)&m_modulation, m_baud == 1200 ? PacketModSettings::AFSK : PacketModSettings::FSK);
|
||||||
|
d.readBool(51, &m_udpEnabled);
|
||||||
|
d.readString(52, &m_udpAddress, "127.0.0.1");
|
||||||
|
d.readU32(53, &utmp);
|
||||||
|
if ((utmp > 1023) && (utmp < 65535)) {
|
||||||
|
m_udpPort = utmp;
|
||||||
|
} else {
|
||||||
|
m_udpPort = 9998;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -79,6 +79,9 @@ struct PacketModSettings
|
|||||||
uint16_t m_reverseAPIPort;
|
uint16_t m_reverseAPIPort;
|
||||||
uint16_t m_reverseAPIDeviceIndex;
|
uint16_t m_reverseAPIDeviceIndex;
|
||||||
uint16_t m_reverseAPIChannelIndex;
|
uint16_t m_reverseAPIChannelIndex;
|
||||||
|
bool m_udpEnabled;
|
||||||
|
QString m_udpAddress;
|
||||||
|
uint16_t m_udpPort;
|
||||||
|
|
||||||
PacketModSettings();
|
PacketModSettings();
|
||||||
void resetToDefaults();
|
void resetToDefaults();
|
||||||
|
@ -601,6 +601,45 @@ void PacketModSource::addTXPacket(QString callsign, QString to, QString via, QSt
|
|||||||
|
|
||||||
packet_length = p-&packet[0];
|
packet_length = p-&packet[0];
|
||||||
|
|
||||||
|
encodePacket(packet, packet_length, crc_start, packet_end);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PacketModSource::addTXPacket(QByteArray data)
|
||||||
|
{
|
||||||
|
uint8_t packet[AX25_MAX_BYTES];
|
||||||
|
uint8_t *crc_start;
|
||||||
|
uint8_t *packet_end;
|
||||||
|
uint8_t *p;
|
||||||
|
crc16x25 crc;
|
||||||
|
uint16_t crcValue;
|
||||||
|
int packet_length;
|
||||||
|
|
||||||
|
// Create AX.25 packet
|
||||||
|
p = packet;
|
||||||
|
// Flag
|
||||||
|
for (int i = 0; i < std::min(m_settings.m_ax25PreFlags, AX25_MAX_FLAGS); i++)
|
||||||
|
*p++ = AX25_FLAG;
|
||||||
|
crc_start = p;
|
||||||
|
// Copy packet payload
|
||||||
|
for (int i = 0; i < data.size(); i++)
|
||||||
|
*p++ = data[i];
|
||||||
|
// CRC (do not include flags)
|
||||||
|
crc.calculate(crc_start, p-crc_start);
|
||||||
|
crcValue = crc.get();
|
||||||
|
*p++ = crcValue & 0xff;
|
||||||
|
*p++ = (crcValue >> 8);
|
||||||
|
packet_end = p;
|
||||||
|
// Flag
|
||||||
|
for (int i = 0; i < std::min(m_settings.m_ax25PostFlags, AX25_MAX_FLAGS); i++)
|
||||||
|
*p++ = AX25_FLAG;
|
||||||
|
|
||||||
|
packet_length = p-&packet[0];
|
||||||
|
|
||||||
|
encodePacket(packet, packet_length, crc_start, packet_end);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PacketModSource::encodePacket(uint8_t *packet, int packet_length, uint8_t *crc_start, uint8_t *packet_end)
|
||||||
|
{
|
||||||
// HDLC bit stuffing
|
// HDLC bit stuffing
|
||||||
m_byteIdx = 0;
|
m_byteIdx = 0;
|
||||||
m_bitIdx = 0;
|
m_bitIdx = 0;
|
||||||
|
@ -68,6 +68,8 @@ public:
|
|||||||
void applySettings(const PacketModSettings& settings, bool force = false);
|
void applySettings(const PacketModSettings& settings, bool force = false);
|
||||||
void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false);
|
void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false);
|
||||||
void addTXPacket(QString callsign, QString to, QString via, QString data);
|
void addTXPacket(QString callsign, QString to, QString via, QString data);
|
||||||
|
void addTXPacket(QByteArray data);
|
||||||
|
void encodePacket(uint8_t *packet, int packet_length, uint8_t *crc_start, uint8_t *packet_end);
|
||||||
void setChannel(ChannelAPI *channel) { m_channel = channel; }
|
void setChannel(ChannelAPI *channel) { m_channel = channel; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -78,6 +78,18 @@ The packet of data to send. To send an APRS status message, use the format <tt>>
|
|||||||
|
|
||||||
Transmits a packet containing the current values in callsign, to, via and data fields.
|
Transmits a packet containing the current values in callsign, to, via and data fields.
|
||||||
|
|
||||||
|
<h3>18: UDP</h3>
|
||||||
|
|
||||||
|
When checked, a UDP port is opened to receive packets from other features or applications that will be transmitted. These packets do not need to contain the CRC, as it is appended automatically.
|
||||||
|
|
||||||
|
<h3>19: UDP address</h3>
|
||||||
|
|
||||||
|
IP address of the interface open the UDP port on, to receive packets to be transmitted.
|
||||||
|
|
||||||
|
<h3>20: UDP port</h3>
|
||||||
|
|
||||||
|
UDP port number to receive packets to be transmitted on.
|
||||||
|
|
||||||
<h2>API</h2>
|
<h2>API</h2>
|
||||||
|
|
||||||
Full details of the API can be found in the Swagger documentation. Here is a quick example of how to transmit a packet from the command line:
|
Full details of the API can be found in the Swagger documentation. Here is a quick example of how to transmit a packet from the command line:
|
||||||
|
@ -15,6 +15,15 @@ PacketDemodSettings:
|
|||||||
fmDeviation:
|
fmDeviation:
|
||||||
type: number
|
type: number
|
||||||
format: float
|
format: float
|
||||||
|
udpEnabled:
|
||||||
|
description: "Whether to forward received packets to specified UDP port"
|
||||||
|
type: integer
|
||||||
|
udpAddress:
|
||||||
|
description: "UDP address to forward received packets to"
|
||||||
|
type: string
|
||||||
|
udpPort:
|
||||||
|
description: "UDP port to forward received packets to"
|
||||||
|
type: integer
|
||||||
rgbColor:
|
rgbColor:
|
||||||
type: integer
|
type: integer
|
||||||
title:
|
title:
|
||||||
|
@ -119,6 +119,15 @@ PacketModSettings:
|
|||||||
format: float
|
format: float
|
||||||
symbolSpan:
|
symbolSpan:
|
||||||
type: integer
|
type: integer
|
||||||
|
udpEnabled:
|
||||||
|
description: "Whether to receive packets to transmit on specified UDP port"
|
||||||
|
type: integer
|
||||||
|
udpAddress:
|
||||||
|
description: "UDP address to receive packets to transmit via"
|
||||||
|
type: string
|
||||||
|
udpPort:
|
||||||
|
description: "UDP port to receive packets to transmit via"
|
||||||
|
type: integer
|
||||||
rgbColor:
|
rgbColor:
|
||||||
type: integer
|
type: integer
|
||||||
title:
|
title:
|
||||||
|
@ -36,6 +36,12 @@ SWGPacketDemodSettings::SWGPacketDemodSettings() {
|
|||||||
m_rf_bandwidth_isSet = false;
|
m_rf_bandwidth_isSet = false;
|
||||||
fm_deviation = 0.0f;
|
fm_deviation = 0.0f;
|
||||||
m_fm_deviation_isSet = false;
|
m_fm_deviation_isSet = false;
|
||||||
|
udp_enabled = 0;
|
||||||
|
m_udp_enabled_isSet = false;
|
||||||
|
udp_address = nullptr;
|
||||||
|
m_udp_address_isSet = false;
|
||||||
|
udp_port = 0;
|
||||||
|
m_udp_port_isSet = false;
|
||||||
rgb_color = 0;
|
rgb_color = 0;
|
||||||
m_rgb_color_isSet = false;
|
m_rgb_color_isSet = false;
|
||||||
title = nullptr;
|
title = nullptr;
|
||||||
@ -68,6 +74,12 @@ SWGPacketDemodSettings::init() {
|
|||||||
m_rf_bandwidth_isSet = false;
|
m_rf_bandwidth_isSet = false;
|
||||||
fm_deviation = 0.0f;
|
fm_deviation = 0.0f;
|
||||||
m_fm_deviation_isSet = false;
|
m_fm_deviation_isSet = false;
|
||||||
|
udp_enabled = 0;
|
||||||
|
m_udp_enabled_isSet = false;
|
||||||
|
udp_address = new QString("");
|
||||||
|
m_udp_address_isSet = false;
|
||||||
|
udp_port = 0;
|
||||||
|
m_udp_port_isSet = false;
|
||||||
rgb_color = 0;
|
rgb_color = 0;
|
||||||
m_rgb_color_isSet = false;
|
m_rgb_color_isSet = false;
|
||||||
title = new QString("");
|
title = new QString("");
|
||||||
@ -95,6 +107,11 @@ SWGPacketDemodSettings::cleanup() {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if(udp_address != nullptr) {
|
||||||
|
delete udp_address;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if(title != nullptr) {
|
if(title != nullptr) {
|
||||||
delete title;
|
delete title;
|
||||||
}
|
}
|
||||||
@ -127,6 +144,12 @@ SWGPacketDemodSettings::fromJsonObject(QJsonObject &pJson) {
|
|||||||
|
|
||||||
::SWGSDRangel::setValue(&fm_deviation, pJson["fmDeviation"], "float", "");
|
::SWGSDRangel::setValue(&fm_deviation, pJson["fmDeviation"], "float", "");
|
||||||
|
|
||||||
|
::SWGSDRangel::setValue(&udp_enabled, pJson["udpEnabled"], "qint32", "");
|
||||||
|
|
||||||
|
::SWGSDRangel::setValue(&udp_address, pJson["udpAddress"], "QString", "QString");
|
||||||
|
|
||||||
|
::SWGSDRangel::setValue(&udp_port, pJson["udpPort"], "qint32", "");
|
||||||
|
|
||||||
::SWGSDRangel::setValue(&rgb_color, pJson["rgbColor"], "qint32", "");
|
::SWGSDRangel::setValue(&rgb_color, pJson["rgbColor"], "qint32", "");
|
||||||
|
|
||||||
::SWGSDRangel::setValue(&title, pJson["title"], "QString", "QString");
|
::SWGSDRangel::setValue(&title, pJson["title"], "QString", "QString");
|
||||||
@ -171,6 +194,15 @@ SWGPacketDemodSettings::asJsonObject() {
|
|||||||
if(m_fm_deviation_isSet){
|
if(m_fm_deviation_isSet){
|
||||||
obj->insert("fmDeviation", QJsonValue(fm_deviation));
|
obj->insert("fmDeviation", QJsonValue(fm_deviation));
|
||||||
}
|
}
|
||||||
|
if(m_udp_enabled_isSet){
|
||||||
|
obj->insert("udpEnabled", QJsonValue(udp_enabled));
|
||||||
|
}
|
||||||
|
if(udp_address != nullptr && *udp_address != QString("")){
|
||||||
|
toJsonValue(QString("udpAddress"), udp_address, obj, QString("QString"));
|
||||||
|
}
|
||||||
|
if(m_udp_port_isSet){
|
||||||
|
obj->insert("udpPort", QJsonValue(udp_port));
|
||||||
|
}
|
||||||
if(m_rgb_color_isSet){
|
if(m_rgb_color_isSet){
|
||||||
obj->insert("rgbColor", QJsonValue(rgb_color));
|
obj->insert("rgbColor", QJsonValue(rgb_color));
|
||||||
}
|
}
|
||||||
@ -239,6 +271,36 @@ SWGPacketDemodSettings::setFmDeviation(float fm_deviation) {
|
|||||||
this->m_fm_deviation_isSet = true;
|
this->m_fm_deviation_isSet = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qint32
|
||||||
|
SWGPacketDemodSettings::getUdpEnabled() {
|
||||||
|
return udp_enabled;
|
||||||
|
}
|
||||||
|
void
|
||||||
|
SWGPacketDemodSettings::setUdpEnabled(qint32 udp_enabled) {
|
||||||
|
this->udp_enabled = udp_enabled;
|
||||||
|
this->m_udp_enabled_isSet = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString*
|
||||||
|
SWGPacketDemodSettings::getUdpAddress() {
|
||||||
|
return udp_address;
|
||||||
|
}
|
||||||
|
void
|
||||||
|
SWGPacketDemodSettings::setUdpAddress(QString* udp_address) {
|
||||||
|
this->udp_address = udp_address;
|
||||||
|
this->m_udp_address_isSet = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
qint32
|
||||||
|
SWGPacketDemodSettings::getUdpPort() {
|
||||||
|
return udp_port;
|
||||||
|
}
|
||||||
|
void
|
||||||
|
SWGPacketDemodSettings::setUdpPort(qint32 udp_port) {
|
||||||
|
this->udp_port = udp_port;
|
||||||
|
this->m_udp_port_isSet = true;
|
||||||
|
}
|
||||||
|
|
||||||
qint32
|
qint32
|
||||||
SWGPacketDemodSettings::getRgbColor() {
|
SWGPacketDemodSettings::getRgbColor() {
|
||||||
return rgb_color;
|
return rgb_color;
|
||||||
@ -336,6 +398,15 @@ SWGPacketDemodSettings::isSet(){
|
|||||||
if(m_fm_deviation_isSet){
|
if(m_fm_deviation_isSet){
|
||||||
isObjectUpdated = true; break;
|
isObjectUpdated = true; break;
|
||||||
}
|
}
|
||||||
|
if(m_udp_enabled_isSet){
|
||||||
|
isObjectUpdated = true; break;
|
||||||
|
}
|
||||||
|
if(udp_address && *udp_address != QString("")){
|
||||||
|
isObjectUpdated = true; break;
|
||||||
|
}
|
||||||
|
if(m_udp_port_isSet){
|
||||||
|
isObjectUpdated = true; break;
|
||||||
|
}
|
||||||
if(m_rgb_color_isSet){
|
if(m_rgb_color_isSet){
|
||||||
isObjectUpdated = true; break;
|
isObjectUpdated = true; break;
|
||||||
}
|
}
|
||||||
|
@ -54,6 +54,15 @@ public:
|
|||||||
float getFmDeviation();
|
float getFmDeviation();
|
||||||
void setFmDeviation(float fm_deviation);
|
void setFmDeviation(float fm_deviation);
|
||||||
|
|
||||||
|
qint32 getUdpEnabled();
|
||||||
|
void setUdpEnabled(qint32 udp_enabled);
|
||||||
|
|
||||||
|
QString* getUdpAddress();
|
||||||
|
void setUdpAddress(QString* udp_address);
|
||||||
|
|
||||||
|
qint32 getUdpPort();
|
||||||
|
void setUdpPort(qint32 udp_port);
|
||||||
|
|
||||||
qint32 getRgbColor();
|
qint32 getRgbColor();
|
||||||
void setRgbColor(qint32 rgb_color);
|
void setRgbColor(qint32 rgb_color);
|
||||||
|
|
||||||
@ -94,6 +103,15 @@ private:
|
|||||||
float fm_deviation;
|
float fm_deviation;
|
||||||
bool m_fm_deviation_isSet;
|
bool m_fm_deviation_isSet;
|
||||||
|
|
||||||
|
qint32 udp_enabled;
|
||||||
|
bool m_udp_enabled_isSet;
|
||||||
|
|
||||||
|
QString* udp_address;
|
||||||
|
bool m_udp_address_isSet;
|
||||||
|
|
||||||
|
qint32 udp_port;
|
||||||
|
bool m_udp_port_isSet;
|
||||||
|
|
||||||
qint32 rgb_color;
|
qint32 rgb_color;
|
||||||
bool m_rgb_color_isSet;
|
bool m_rgb_color_isSet;
|
||||||
|
|
||||||
|
@ -108,6 +108,12 @@ SWGPacketModSettings::SWGPacketModSettings() {
|
|||||||
m_beta_isSet = false;
|
m_beta_isSet = false;
|
||||||
symbol_span = 0;
|
symbol_span = 0;
|
||||||
m_symbol_span_isSet = false;
|
m_symbol_span_isSet = false;
|
||||||
|
udp_enabled = 0;
|
||||||
|
m_udp_enabled_isSet = false;
|
||||||
|
udp_address = nullptr;
|
||||||
|
m_udp_address_isSet = false;
|
||||||
|
udp_port = 0;
|
||||||
|
m_udp_port_isSet = false;
|
||||||
rgb_color = 0;
|
rgb_color = 0;
|
||||||
m_rgb_color_isSet = false;
|
m_rgb_color_isSet = false;
|
||||||
title = nullptr;
|
title = nullptr;
|
||||||
@ -212,6 +218,12 @@ SWGPacketModSettings::init() {
|
|||||||
m_beta_isSet = false;
|
m_beta_isSet = false;
|
||||||
symbol_span = 0;
|
symbol_span = 0;
|
||||||
m_symbol_span_isSet = false;
|
m_symbol_span_isSet = false;
|
||||||
|
udp_enabled = 0;
|
||||||
|
m_udp_enabled_isSet = false;
|
||||||
|
udp_address = new QString("");
|
||||||
|
m_udp_address_isSet = false;
|
||||||
|
udp_port = 0;
|
||||||
|
m_udp_port_isSet = false;
|
||||||
rgb_color = 0;
|
rgb_color = 0;
|
||||||
m_rgb_color_isSet = false;
|
m_rgb_color_isSet = false;
|
||||||
title = new QString("");
|
title = new QString("");
|
||||||
@ -283,6 +295,11 @@ SWGPacketModSettings::cleanup() {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if(udp_address != nullptr) {
|
||||||
|
delete udp_address;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if(title != nullptr) {
|
if(title != nullptr) {
|
||||||
delete title;
|
delete title;
|
||||||
}
|
}
|
||||||
@ -387,6 +404,12 @@ SWGPacketModSettings::fromJsonObject(QJsonObject &pJson) {
|
|||||||
|
|
||||||
::SWGSDRangel::setValue(&symbol_span, pJson["symbolSpan"], "qint32", "");
|
::SWGSDRangel::setValue(&symbol_span, pJson["symbolSpan"], "qint32", "");
|
||||||
|
|
||||||
|
::SWGSDRangel::setValue(&udp_enabled, pJson["udpEnabled"], "qint32", "");
|
||||||
|
|
||||||
|
::SWGSDRangel::setValue(&udp_address, pJson["udpAddress"], "QString", "QString");
|
||||||
|
|
||||||
|
::SWGSDRangel::setValue(&udp_port, pJson["udpPort"], "qint32", "");
|
||||||
|
|
||||||
::SWGSDRangel::setValue(&rgb_color, pJson["rgbColor"], "qint32", "");
|
::SWGSDRangel::setValue(&rgb_color, pJson["rgbColor"], "qint32", "");
|
||||||
|
|
||||||
::SWGSDRangel::setValue(&title, pJson["title"], "QString", "QString");
|
::SWGSDRangel::setValue(&title, pJson["title"], "QString", "QString");
|
||||||
@ -539,6 +562,15 @@ SWGPacketModSettings::asJsonObject() {
|
|||||||
if(m_symbol_span_isSet){
|
if(m_symbol_span_isSet){
|
||||||
obj->insert("symbolSpan", QJsonValue(symbol_span));
|
obj->insert("symbolSpan", QJsonValue(symbol_span));
|
||||||
}
|
}
|
||||||
|
if(m_udp_enabled_isSet){
|
||||||
|
obj->insert("udpEnabled", QJsonValue(udp_enabled));
|
||||||
|
}
|
||||||
|
if(udp_address != nullptr && *udp_address != QString("")){
|
||||||
|
toJsonValue(QString("udpAddress"), udp_address, obj, QString("QString"));
|
||||||
|
}
|
||||||
|
if(m_udp_port_isSet){
|
||||||
|
obj->insert("udpPort", QJsonValue(udp_port));
|
||||||
|
}
|
||||||
if(m_rgb_color_isSet){
|
if(m_rgb_color_isSet){
|
||||||
obj->insert("rgbColor", QJsonValue(rgb_color));
|
obj->insert("rgbColor", QJsonValue(rgb_color));
|
||||||
}
|
}
|
||||||
@ -967,6 +999,36 @@ SWGPacketModSettings::setSymbolSpan(qint32 symbol_span) {
|
|||||||
this->m_symbol_span_isSet = true;
|
this->m_symbol_span_isSet = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qint32
|
||||||
|
SWGPacketModSettings::getUdpEnabled() {
|
||||||
|
return udp_enabled;
|
||||||
|
}
|
||||||
|
void
|
||||||
|
SWGPacketModSettings::setUdpEnabled(qint32 udp_enabled) {
|
||||||
|
this->udp_enabled = udp_enabled;
|
||||||
|
this->m_udp_enabled_isSet = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString*
|
||||||
|
SWGPacketModSettings::getUdpAddress() {
|
||||||
|
return udp_address;
|
||||||
|
}
|
||||||
|
void
|
||||||
|
SWGPacketModSettings::setUdpAddress(QString* udp_address) {
|
||||||
|
this->udp_address = udp_address;
|
||||||
|
this->m_udp_address_isSet = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
qint32
|
||||||
|
SWGPacketModSettings::getUdpPort() {
|
||||||
|
return udp_port;
|
||||||
|
}
|
||||||
|
void
|
||||||
|
SWGPacketModSettings::setUdpPort(qint32 udp_port) {
|
||||||
|
this->udp_port = udp_port;
|
||||||
|
this->m_udp_port_isSet = true;
|
||||||
|
}
|
||||||
|
|
||||||
qint32
|
qint32
|
||||||
SWGPacketModSettings::getRgbColor() {
|
SWGPacketModSettings::getRgbColor() {
|
||||||
return rgb_color;
|
return rgb_color;
|
||||||
@ -1172,6 +1234,15 @@ SWGPacketModSettings::isSet(){
|
|||||||
if(m_symbol_span_isSet){
|
if(m_symbol_span_isSet){
|
||||||
isObjectUpdated = true; break;
|
isObjectUpdated = true; break;
|
||||||
}
|
}
|
||||||
|
if(m_udp_enabled_isSet){
|
||||||
|
isObjectUpdated = true; break;
|
||||||
|
}
|
||||||
|
if(udp_address && *udp_address != QString("")){
|
||||||
|
isObjectUpdated = true; break;
|
||||||
|
}
|
||||||
|
if(m_udp_port_isSet){
|
||||||
|
isObjectUpdated = true; break;
|
||||||
|
}
|
||||||
if(m_rgb_color_isSet){
|
if(m_rgb_color_isSet){
|
||||||
isObjectUpdated = true; break;
|
isObjectUpdated = true; break;
|
||||||
}
|
}
|
||||||
|
@ -162,6 +162,15 @@ public:
|
|||||||
qint32 getSymbolSpan();
|
qint32 getSymbolSpan();
|
||||||
void setSymbolSpan(qint32 symbol_span);
|
void setSymbolSpan(qint32 symbol_span);
|
||||||
|
|
||||||
|
qint32 getUdpEnabled();
|
||||||
|
void setUdpEnabled(qint32 udp_enabled);
|
||||||
|
|
||||||
|
QString* getUdpAddress();
|
||||||
|
void setUdpAddress(QString* udp_address);
|
||||||
|
|
||||||
|
qint32 getUdpPort();
|
||||||
|
void setUdpPort(qint32 udp_port);
|
||||||
|
|
||||||
qint32 getRgbColor();
|
qint32 getRgbColor();
|
||||||
void setRgbColor(qint32 rgb_color);
|
void setRgbColor(qint32 rgb_color);
|
||||||
|
|
||||||
@ -310,6 +319,15 @@ private:
|
|||||||
qint32 symbol_span;
|
qint32 symbol_span;
|
||||||
bool m_symbol_span_isSet;
|
bool m_symbol_span_isSet;
|
||||||
|
|
||||||
|
qint32 udp_enabled;
|
||||||
|
bool m_udp_enabled_isSet;
|
||||||
|
|
||||||
|
QString* udp_address;
|
||||||
|
bool m_udp_address_isSet;
|
||||||
|
|
||||||
|
qint32 udp_port;
|
||||||
|
bool m_udp_port_isSet;
|
||||||
|
|
||||||
qint32 rgb_color;
|
qint32 rgb_color;
|
||||||
bool m_rgb_color_isSet;
|
bool m_rgb_color_isSet;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user