diff --git a/plugins/channelrx/demodais/aisdemodgui.cpp b/plugins/channelrx/demodais/aisdemodgui.cpp index 6eb13b8c2..99f9ab291 100644 --- a/plugins/channelrx/demodais/aisdemodgui.cpp +++ b/plugins/channelrx/demodais/aisdemodgui.cpp @@ -916,6 +916,8 @@ void AISDemodGUI::displaySettings() ui->showSlotMap->setChecked(m_settings.m_showSlotMap); ui->slotMapWidget->setVisible(m_settings.m_showSlotMap); + ui->useFileTime->setChecked(m_settings.m_useFileTime); + // Order and size columns QHeaderView *header = ui->messages->horizontalHeader(); for (int i = 0; i < AISDEMOD_MESSAGE_COLUMNS; i++) @@ -1088,6 +1090,12 @@ void AISDemodGUI::on_logOpen_clicked() } } +void AISDemodGUI::on_useFileTime_toggled(bool checked) +{ + m_settings.m_useFileTime = checked; + applySettings(); +} + void AISDemodGUI::makeUIConnections() { QObject::connect(ui->deltaFrequency, &ValueDialZ::changed, this, &AISDemodGUI::on_deltaFrequency_changed); @@ -1105,6 +1113,7 @@ void AISDemodGUI::makeUIConnections() QObject::connect(ui->logFilename, &QToolButton::clicked, this, &AISDemodGUI::on_logFilename_clicked); QObject::connect(ui->logOpen, &QToolButton::clicked, this, &AISDemodGUI::on_logOpen_clicked); QObject::connect(ui->showSlotMap, &ButtonSwitch::clicked, this, &AISDemodGUI::on_showSlotMap_clicked); + QObject::connect(ui->useFileTime, &ButtonSwitch::toggled, this, &AISDemodGUI::on_useFileTime_toggled); } void AISDemodGUI::updateAbsoluteCenterFrequency() diff --git a/plugins/channelrx/demodais/aisdemodgui.h b/plugins/channelrx/demodais/aisdemodgui.h index aeacf6233..738d904cc 100644 --- a/plugins/channelrx/demodais/aisdemodgui.h +++ b/plugins/channelrx/demodais/aisdemodgui.h @@ -159,6 +159,7 @@ private slots: void on_logFilename_clicked(); void on_logOpen_clicked(); void on_showSlotMap_clicked(bool checked=false); + void on_useFileTime_toggled(bool checked=false); void filterRow(int row); void filter(); void messages_sectionMoved(int logicalIndex, int oldVisualIndex, int newVisualIndex); diff --git a/plugins/channelrx/demodais/aisdemodgui.ui b/plugins/channelrx/demodais/aisdemodgui.ui index 0453b5d38..33f560373 100644 --- a/plugins/channelrx/demodais/aisdemodgui.ui +++ b/plugins/channelrx/demodais/aisdemodgui.ui @@ -557,6 +557,27 @@ + + + + + 24 + 16777215 + + + + Check to use date and time from input file. Uncheck to use date and time from clock. + + + + + + + :/clockcurrent.png + :/clockfile.png:/clockcurrent.png + + + @@ -958,18 +979,18 @@ QToolButton
gui/buttonswitch.h
- - RollupContents - QWidget -
gui/rollupcontents.h
- 1 -
ValueDialZ QWidget
gui/valuedialz.h
1
+ + RollupContents + QWidget +
gui/rollupcontents.h
+ 1 +
LevelMeterSignalDB QWidget diff --git a/plugins/channelrx/demodais/aisdemodsettings.cpp b/plugins/channelrx/demodais/aisdemodsettings.cpp index 5cf7531bc..62faffd3b 100644 --- a/plugins/channelrx/demodais/aisdemodsettings.cpp +++ b/plugins/channelrx/demodais/aisdemodsettings.cpp @@ -48,6 +48,7 @@ void AISDemodSettings::resetToDefaults() m_logFilename = "ais_log.csv"; m_logEnabled = false; m_showSlotMap = false; + m_useFileTime = false; m_rgbColor = QColor(102, 0, 0).rgb(); m_title = "AIS Demodulator"; m_streamIndex = 0; @@ -105,6 +106,7 @@ QByteArray AISDemodSettings::serialize() const s.writeBlob(27, m_geometryBytes); s.writeBool(28, m_hidden); s.writeBool(29, m_showSlotMap); + s.writeBool(30, m_useFileTime); for (int i = 0; i < AISDEMOD_MESSAGE_COLUMNS; i++) s.writeS32(100 + i, m_messageColumnIndexes[i]); @@ -191,6 +193,7 @@ bool AISDemodSettings::deserialize(const QByteArray& data) d.readBlob(27, &m_geometryBytes); d.readBool(28, &m_hidden, false); d.readBool(29, &m_showSlotMap, false); + d.readBool(30, &m_useFileTime, false); for (int i = 0; i < AISDEMOD_MESSAGE_COLUMNS; i++) { d.readS32(100 + i, &m_messageColumnIndexes[i], i); diff --git a/plugins/channelrx/demodais/aisdemodsettings.h b/plugins/channelrx/demodais/aisdemodsettings.h index cb1833a26..43e17dc22 100644 --- a/plugins/channelrx/demodais/aisdemodsettings.h +++ b/plugins/channelrx/demodais/aisdemodsettings.h @@ -50,6 +50,7 @@ struct AISDemodSettings QString m_logFilename; bool m_logEnabled; bool m_showSlotMap; + bool m_useFileTime; quint32 m_rgbColor; QString m_title; diff --git a/plugins/channelrx/demodais/aisdemodsink.cpp b/plugins/channelrx/demodais/aisdemodsink.cpp index b40581720..ddd3560cf 100644 --- a/plugins/channelrx/demodais/aisdemodsink.cpp +++ b/plugins/channelrx/demodais/aisdemodsink.cpp @@ -23,6 +23,8 @@ #include "dsp/dspengine.h" #include "dsp/datafifo.h" #include "dsp/scopevis.h" +#include "device/deviceapi.h" +#include "channel/channelwebapiutils.h" #include "util/db.h" #include "util/stepfunctions.h" #include "maincore.h" @@ -264,6 +266,21 @@ void AISDemodSink::processOneSample(Complex &ci) // This is unlikely to be accurate in absolute terms, given we don't know latency from SDR or buffering within SDRangel // But can be used to get an idea of congestion QDateTime currentTime = QDateTime::currentDateTime(); + if (m_settings.m_useFileTime) + { + QString hardwareId = m_aisDemod->getDeviceAPI()->getHardwareId(); + + if ((hardwareId == "FileInput") || (hardwareId == "SigMFFileInput")) + { + QString dateTimeStr; + int deviceIdx = m_aisDemod->getDeviceSetIndex(); + + if (ChannelWebAPIUtils::getDeviceReportValue(deviceIdx, "absoluteTime", dateTimeStr)) { + currentTime = QDateTime::fromString(dateTimeStr, Qt::ISODateWithMs); + } + } + } + int txTimeMs = (totalBitCount + 8 + 24 + 8) * (1000.0 / m_settings.m_baud); // Add ramp up, preamble and start-flag QDateTime startDateTime = currentTime.addMSecs(-txTimeMs); int ms = startDateTime.time().second() * 1000 + startDateTime.time().msec(); diff --git a/plugins/channelrx/demodais/readme.md b/plugins/channelrx/demodais/readme.md index 621e14811..470f54d21 100644 --- a/plugins/channelrx/demodais/readme.md +++ b/plugins/channelrx/demodais/readme.md @@ -56,7 +56,7 @@ Pressing this button clears all messages from the table.

9: UDP

-When checked, received messages are forwarded to the specified UDP address (12) and port (13). +When checked, received messages are forwarded to the specified UDP address (10) and port (11).

10: UDP address

@@ -70,17 +70,22 @@ UDP port number to forward received messages to. The format the messages are forwarded via UDP in. This can be either binary (which is useful for SDRangel's PERTester feature) or NMEA (which is useful for 3rd party applications such as OpenCPN). -

13: Start/stop Logging Messages to .csv File

+

13: Use Date and Time from File

+ +When checked, if the source device is a File Input device, the date and time used for +packet reception time is taken from the file playback time. Otherwise, the current system clock time is used. + +

14: Start/stop Logging Messages to .csv File

When checked, writes all received AIS messages to a .csv file. -

14: .csv Log Filename

+

15: .csv Log Filename

Click to specify the name of the .csv file which received AIS messages are logged to. -

15: Read Data from .csv File

+

16: Read Data from .csv File

-Click to specify a previously written AIS .csv log file, which is read and used to update the table. +Click to specify a previously written .csv log file, which is read and used to update the table.

Slot Map

diff --git a/plugins/channelrx/demoddsc/dscdemodgui.cpp b/plugins/channelrx/demoddsc/dscdemodgui.cpp index ee2794ec2..90bf9cfc0 100644 --- a/plugins/channelrx/demoddsc/dscdemodgui.cpp +++ b/plugins/channelrx/demoddsc/dscdemodgui.cpp @@ -1009,6 +1009,7 @@ void DSCDemodGUI::displaySettings() ui->logFilename->setToolTip(QString(".csv log filename: %1").arg(m_settings.m_logFilename)); ui->logEnable->setChecked(m_settings.m_logEnabled); + ui->useFileTime->setChecked(m_settings.m_useFileTime); ui->feed->setChecked(m_settings.m_feed); // Order and size columns @@ -1169,6 +1170,12 @@ void DSCDemodGUI::on_logOpen_clicked() } } +void DSCDemodGUI::on_useFileTime_toggled(bool checked) +{ + m_settings.m_useFileTime = checked; + applySettings(); +} + void DSCDemodGUI::makeUIConnections() { QObject::connect(ui->deltaFrequency, &ValueDialZ::changed, this, &DSCDemodGUI::on_deltaFrequency_changed); @@ -1183,6 +1190,7 @@ void DSCDemodGUI::makeUIConnections() QObject::connect(ui->logFilename, &QToolButton::clicked, this, &DSCDemodGUI::on_logFilename_clicked); QObject::connect(ui->logOpen, &QToolButton::clicked, this, &DSCDemodGUI::on_logOpen_clicked); QObject::connect(ui->feed, &ButtonSwitch::clicked, this, &DSCDemodGUI::on_feed_clicked); + QObject::connect(ui->useFileTime, &ButtonSwitch::toggled, this, &DSCDemodGUI::on_useFileTime_toggled); } void DSCDemodGUI::updateAbsoluteCenterFrequency() diff --git a/plugins/channelrx/demoddsc/dscdemodgui.h b/plugins/channelrx/demoddsc/dscdemodgui.h index 8503fc557..9ebed006c 100644 --- a/plugins/channelrx/demoddsc/dscdemodgui.h +++ b/plugins/channelrx/demoddsc/dscdemodgui.h @@ -151,6 +151,7 @@ private slots: void on_logEnable_clicked(bool checked=false); void on_logFilename_clicked(); void on_logOpen_clicked(); + void on_useFileTime_toggled(bool checked=false); void on_feed_clicked(bool checked=false); void on_feed_rightClicked(const QPoint &point); void filterRow(int row); diff --git a/plugins/channelrx/demoddsc/dscdemodgui.ui b/plugins/channelrx/demoddsc/dscdemodgui.ui index bfcb99ad8..717a27d3f 100644 --- a/plugins/channelrx/demoddsc/dscdemodgui.ui +++ b/plugins/channelrx/demoddsc/dscdemodgui.ui @@ -545,6 +545,27 @@
+ + + + + 24 + 16777215 + + + + Check to use date and time from input file. Uncheck to use date and time from clock. + + + + + + + :/clockcurrent.png + :/clockfile.png:/clockcurrent.png + + + @@ -934,18 +955,18 @@ QToolButton
gui/buttonswitch.h
- - RollupContents - QWidget -
gui/rollupcontents.h
- 1 -
ValueDialZ QWidget
gui/valuedialz.h
1
+ + RollupContents + QWidget +
gui/rollupcontents.h
+ 1 +
LevelMeterSignalDB QWidget diff --git a/plugins/channelrx/demoddsc/dscdemodsettings.cpp b/plugins/channelrx/demoddsc/dscdemodsettings.cpp index e68ee1b84..f641a7d02 100644 --- a/plugins/channelrx/demoddsc/dscdemodsettings.cpp +++ b/plugins/channelrx/demoddsc/dscdemodsettings.cpp @@ -46,6 +46,7 @@ void DSCDemodSettings::resetToDefaults() m_logFilename = "dsc_log.csv"; m_logEnabled = false; m_feed = true; + m_useFileTime = false; m_rgbColor = QColor(181, 230, 29).rgb(); m_title = "DSC Demodulator"; @@ -85,6 +86,7 @@ QByteArray DSCDemodSettings::serialize() const s.writeString(12, m_logFilename); s.writeBool(13, m_logEnabled); s.writeBool(14, m_feed); + s.writeBool(15, m_useFileTime); s.writeU32(20, m_rgbColor); s.writeString(21, m_title); @@ -155,6 +157,7 @@ bool DSCDemodSettings::deserialize(const QByteArray& data) d.readString(12, &m_logFilename, "dsc_log.csv"); d.readBool(13, &m_logEnabled, false); d.readBool(14, &m_feed, true); + d.readBool(15, &m_useFileTime, false); d.readU32(20, &m_rgbColor, QColor(181, 230, 29).rgb()); d.readString(21, &m_title, "DSC Demodulator"); diff --git a/plugins/channelrx/demoddsc/dscdemodsettings.h b/plugins/channelrx/demoddsc/dscdemodsettings.h index b3230bef9..ebbe7d30c 100644 --- a/plugins/channelrx/demoddsc/dscdemodsettings.h +++ b/plugins/channelrx/demoddsc/dscdemodsettings.h @@ -52,6 +52,8 @@ struct DSCDemodSettings QString m_logFilename; bool m_logEnabled; + + bool m_useFileTime; Serializable *m_scopeGUI; Serializable *m_rollupState; int m_workspaceIndex; diff --git a/plugins/channelrx/demoddsc/dscdemodsink.cpp b/plugins/channelrx/demoddsc/dscdemodsink.cpp index 303eff9ff..7b5019f24 100644 --- a/plugins/channelrx/demoddsc/dscdemodsink.cpp +++ b/plugins/channelrx/demoddsc/dscdemodsink.cpp @@ -21,8 +21,10 @@ #include "dsp/dspengine.h" #include "dsp/scopevis.h" +#include "device/deviceapi.h" #include "util/db.h" #include "util/popcount.h" +#include "channel/channelwebapiutils.h" #include "maincore.h" #include "dscdemod.h" @@ -240,8 +242,25 @@ void DSCDemodSink::receiveBit(bool bit) { if (m_dscDecoder.decodeBits(m_bits & 0x3ff)) { + QDateTime dateTime = QDateTime::currentDateTime(); + + if (m_settings.m_useFileTime) + { + QString hardwareId = m_dscDemod->getDeviceAPI()->getHardwareId(); + + if ((hardwareId == "FileInput") || (hardwareId == "SigMFFileInput")) + { + QString dateTimeStr; + int deviceIdx = m_dscDemod->getDeviceSetIndex(); + + if (ChannelWebAPIUtils::getDeviceReportValue(deviceIdx, "absoluteTime", dateTimeStr)) { + dateTime = QDateTime::fromString(dateTimeStr, Qt::ISODateWithMs); + } + } + } + QByteArray bytes = m_dscDecoder.getMessage(); - DSCMessage message(bytes, QDateTime::currentDateTime()); + DSCMessage message(bytes, dateTime); //qDebug() << "RX Bytes: " << bytes.toHex(); //qDebug() << "DSC Message: " << message.toString(); diff --git a/plugins/channelrx/demoddsc/readme.md b/plugins/channelrx/demoddsc/readme.md index e7b1b16f3..d1549c7ea 100644 --- a/plugins/channelrx/demoddsc/readme.md +++ b/plugins/channelrx/demoddsc/readme.md @@ -60,19 +60,24 @@ The messages are submitted with Preferences > My Position... > Station name used Right click to open http://yaddnet.org/ in your browser, showing recent messages received from this ID. -

11: Start/stop Logging Messages to .csv File

+

11: Use Date and Time from File

-When checked, writes all received messages to a .csv file, specified by (12). +When checked, if the source device is a File Input device, the date and time used for +packet reception time is taken from the file playback time. Otherwise, the current system clock time is used. -

12: .csv Log Filename

+

12: Start/stop Logging Messages to .csv File

+ +When checked, writes all received messages to a .csv file, specified by (13). + +

13: .csv Log Filename

Click to specify the name of the .csv file which received messasges are logged to. -

13: Read Data from .csv File

+

14: Read Data from .csv File

Click to specify a previously written .csv log file, which is read and used to update the table. -

14: Received Messages Table

+

15: Received Messages Table

![DSC Demodulator plugin GUI](../../../doc/img/DSCDemod_plugin_messages.png) diff --git a/plugins/channelrx/demodendoftrain/endoftraindemodgui.cpp b/plugins/channelrx/demodendoftrain/endoftraindemodgui.cpp index 0567b742b..68ec859e5 100644 --- a/plugins/channelrx/demodendoftrain/endoftraindemodgui.cpp +++ b/plugins/channelrx/demodendoftrain/endoftraindemodgui.cpp @@ -511,6 +511,8 @@ EndOfTrainDemodGUI::EndOfTrainDemodGUI(PluginAPI* pluginAPI, DeviceUISet *device connect(&m_channelMarker, SIGNAL(highlightedByCursor()), this, SLOT(channelMarkerHighlightedByCursor())); connect(getInputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages())); + ui->scopeContainer->setVisible(false); + // Resize the table using dummy data resizeTable(); // Allow user to reorder columns @@ -601,6 +603,8 @@ void EndOfTrainDemodGUI::displaySettings() ui->logFilename->setToolTip(QString(".csv log filename: %1").arg(m_settings.m_logFilename)); ui->logEnable->setChecked(m_settings.m_logEnabled); + ui->useFileTime->setChecked(m_settings.m_useFileTime); + // Order and size columns QHeaderView *header = ui->packets->horizontalHeader(); for (int i = 0; i < ENDOFTRAINDEMOD_COLUMNS; i++) @@ -739,6 +743,12 @@ void EndOfTrainDemodGUI::on_logOpen_clicked() } } +void EndOfTrainDemodGUI::on_useFileTime_toggled(bool checked) +{ + m_settings.m_useFileTime = checked; + applySetting("useFileTime"); +} + void EndOfTrainDemodGUI::makeUIConnections() { QObject::connect(ui->deltaFrequency, &ValueDialZ::changed, this, &EndOfTrainDemodGUI::on_deltaFrequency_changed); @@ -752,6 +762,7 @@ void EndOfTrainDemodGUI::makeUIConnections() QObject::connect(ui->logEnable, &ButtonSwitch::clicked, this, &EndOfTrainDemodGUI::on_logEnable_clicked); QObject::connect(ui->logFilename, &QToolButton::clicked, this, &EndOfTrainDemodGUI::on_logFilename_clicked); QObject::connect(ui->logOpen, &QToolButton::clicked, this, &EndOfTrainDemodGUI::on_logOpen_clicked); + QObject::connect(ui->useFileTime, &ButtonSwitch::toggled, this, &EndOfTrainDemodGUI::on_useFileTime_toggled); } void EndOfTrainDemodGUI::updateAbsoluteCenterFrequency() diff --git a/plugins/channelrx/demodendoftrain/endoftraindemodgui.h b/plugins/channelrx/demodendoftrain/endoftraindemodgui.h index 30f3827e9..be5a1a2f6 100644 --- a/plugins/channelrx/demodendoftrain/endoftraindemodgui.h +++ b/plugins/channelrx/demodendoftrain/endoftraindemodgui.h @@ -137,6 +137,7 @@ private slots: void on_logEnable_clicked(bool checked=false); void on_logFilename_clicked(); void on_logOpen_clicked(); + void on_useFileTime_toggled(bool checked=false); void filterRow(int row); void filter(); void endoftrains_sectionMoved(int logicalIndex, int oldVisualIndex, int newVisualIndex); diff --git a/plugins/channelrx/demodendoftrain/endoftraindemodgui.ui b/plugins/channelrx/demodendoftrain/endoftraindemodgui.ui index e70556983..7630fb32b 100644 --- a/plugins/channelrx/demodendoftrain/endoftraindemodgui.ui +++ b/plugins/channelrx/demodendoftrain/endoftraindemodgui.ui @@ -498,6 +498,27 @@
+ + + + + 24 + 16777215 + + + + Check to use date and time from input file. Uncheck to use date and time from clock. + + + + + + + :/clockcurrent.png + :/clockfile.png:/clockcurrent.png + + + diff --git a/plugins/channelrx/demodendoftrain/endoftraindemodsettings.cpp b/plugins/channelrx/demodendoftrain/endoftraindemodsettings.cpp index f03af32b3..8010207d0 100644 --- a/plugins/channelrx/demodendoftrain/endoftraindemodsettings.cpp +++ b/plugins/channelrx/demodendoftrain/endoftraindemodsettings.cpp @@ -47,8 +47,9 @@ void EndOfTrainDemodSettings::resetToDefaults() m_udpPort = 9999; m_logFilename = "endoftrain_log.csv"; m_logEnabled = false; + m_useFileTime = false; - m_rgbColor = QColor(0, 105, 2).rgb(); + m_rgbColor = QColor(170, 85, 0).rgb(); m_title = "End-of-Train Demodulator"; m_streamIndex = 0; m_useReverseAPI = false; @@ -79,6 +80,7 @@ QByteArray EndOfTrainDemodSettings::serialize() const s.writeU32(7, m_udpPort); s.writeString(8, m_logFilename); s.writeBool(9, m_logEnabled); + s.writeBool(10, m_useFileTime); s.writeU32(20, m_rgbColor); s.writeString(21, m_title); @@ -134,8 +136,9 @@ bool EndOfTrainDemodSettings::deserialize(const QByteArray& data) } d.readString(8, &m_logFilename, "endoftrain_log.csv"); d.readBool(9, &m_logEnabled, false); + d.readBool(10, &m_useFileTime, false); - d.readU32(20, &m_rgbColor, QColor(0, 105, 2).rgb()); + d.readU32(20, &m_rgbColor, QColor(170, 85, 0).rgb()); d.readString(21, &m_title, "End-of-Train Demodulator"); if (m_channelMarker) { @@ -206,9 +209,12 @@ void EndOfTrainDemodSettings::applySettings(const QStringList& settingsKeys, con if (settingsKeys.contains("logFilename")) { m_logFilename = settings.m_logFilename; } - if (settingsKeys.contains("logEnabledpPort")) { + if (settingsKeys.contains("logEnabled")) { m_logEnabled = settings.m_logEnabled; } + if (settingsKeys.contains("useFileTime")) { + m_useFileTime = settings.m_useFileTime; + } if (settingsKeys.contains("rgbColor")) { m_rgbColor = settings.m_rgbColor; } @@ -275,9 +281,12 @@ QString EndOfTrainDemodSettings::getDebugString(const QStringList& settingsKeys, if (settingsKeys.contains("logFilename")) { ostr << " m_logFilename: " << m_logFilename.toStdString(); } - if (settingsKeys.contains("logEnabledpPort")) { + if (settingsKeys.contains("logEnabledp")) { ostr << " m_logEnabled: " << m_logEnabled; } + if (settingsKeys.contains("useFileTime")) { + ostr << " m_useFileTime: " << m_useFileTime; + } if (settingsKeys.contains("rgbColor") || force) { ostr << " m_rgbColor: " << m_rgbColor; } diff --git a/plugins/channelrx/demodendoftrain/endoftraindemodsettings.h b/plugins/channelrx/demodendoftrain/endoftraindemodsettings.h index a2d1545fd..c198f68f5 100644 --- a/plugins/channelrx/demodendoftrain/endoftraindemodsettings.h +++ b/plugins/channelrx/demodendoftrain/endoftraindemodsettings.h @@ -42,6 +42,7 @@ struct EndOfTrainDemodSettings uint16_t m_udpPort; QString m_logFilename; bool m_logEnabled; + bool m_useFileTime; quint32 m_rgbColor; QString m_title; diff --git a/plugins/channelrx/demodendoftrain/endoftraindemodsink.cpp b/plugins/channelrx/demodendoftrain/endoftraindemodsink.cpp index 2c73c8f08..83775f7df 100644 --- a/plugins/channelrx/demodendoftrain/endoftraindemodsink.cpp +++ b/plugins/channelrx/demodendoftrain/endoftraindemodsink.cpp @@ -20,7 +20,9 @@ #include "dsp/dspengine.h" #include "dsp/datafifo.h" +#include "device/deviceapi.h" #include "util/db.h" +#include "channel/channelwebapiutils.h" #include "maincore.h" #include "endoftraindemod.h" @@ -214,7 +216,23 @@ void EndOfTrainDemodSink::processOneSample(Complex &ci) //qDebug() << "RX: " << rxPacket.toHex(); if (getMessageQueueToChannel()) { - MainCore::MsgPacket *msg = MainCore::MsgPacket::create(m_endoftrainDemod, rxPacket, QDateTime::currentDateTime()); + QDateTime dateTime = QDateTime::currentDateTime(); + if (m_settings.m_useFileTime) + { + QString hardwareId = m_endoftrainDemod->getDeviceAPI()->getHardwareId(); + + if ((hardwareId == "FileInput") || (hardwareId == "SigMFFileInput")) + { + QString dateTimeStr; + int deviceIdx = m_endoftrainDemod->getDeviceSetIndex(); + + if (ChannelWebAPIUtils::getDeviceReportValue(deviceIdx, "absoluteTime", dateTimeStr)) { + dateTime = QDateTime::fromString(dateTimeStr, Qt::ISODateWithMs); + } + } + } + + MainCore::MsgPacket *msg = MainCore::MsgPacket::create(m_endoftrainDemod, rxPacket, dateTime); getMessageQueueToChannel()->push(msg); } // Reset state to start receiving next packet diff --git a/plugins/channelrx/demodendoftrain/readme.md b/plugins/channelrx/demodendoftrain/readme.md index 4c955feee..d952fa279 100644 --- a/plugins/channelrx/demodendoftrain/readme.md +++ b/plugins/channelrx/demodendoftrain/readme.md @@ -58,19 +58,24 @@ IP address of the host to forward received packets to via UDP. UDP port number to forward received packets to. -

10: Start/stop Logging Packets to .csv File

+

10: Use Date and Time from File

-When checked, writes all received packets to a .csv file. The filename is specified by (11). +When checked, if the source device is a File Input device, the date and time used for +packet reception time is taken from the file playback time. Otherwise, the current system clock time is used. -

11: .csv Log Filename

+

11: Start/stop Logging Packets to .csv File

+ +When checked, writes all received packets to a .csv file. The filename is specified by (12). + +

12: .csv Log Filename

Click to specify the name of the .csv file which received packets are logged to. -

12: Read Data from .csv File

+

13: Read Data from .csv File

Click to specify a previously written .csv log file, which is read and used to update the table. -

13: Clear table

+

14: Clear table

Pressing this button clears all packets from the table. @@ -98,3 +103,5 @@ The received packets table displays the contents of the packets that have been r

Attribution

Based on code and reverse engineering by Eric Reuter + +Clock icons created by Pixel perfect from Flaticon https:://www.flaticon.com diff --git a/plugins/channelrx/demodpacket/packetdemodgui.cpp b/plugins/channelrx/demodpacket/packetdemodgui.cpp index 3580fdde5..b013e9410 100644 --- a/plugins/channelrx/demodpacket/packetdemodgui.cpp +++ b/plugins/channelrx/demodpacket/packetdemodgui.cpp @@ -16,10 +16,6 @@ // along with this program. If not, see . // /////////////////////////////////////////////////////////////////////////////////// -#include -#include -#include -#include #include #include #include @@ -38,7 +34,6 @@ #include "util/simpleserializer.h" #include "util/csv.h" #include "util/db.h" -#include "util/morse.h" #include "util/units.h" #include "gui/basicchannelsettingsdialog.h" #include "gui/devicestreamselectiondialog.h" @@ -51,20 +46,14 @@ #include "packetdemod.h" #include "packetdemodsink.h" -#define PACKET_COL_FROM 0 -#define PACKET_COL_TO 1 -#define PACKET_COL_VIA 2 -#define PACKET_COL_TYPE 3 -#define PACKET_COL_PID 4 -#define PACKET_COL_DATA_ASCII 5 -#define PACKET_COL_DATA_HEX 6 - void PacketDemodGUI::resizeTable() { // Fill table with a row of dummy data that will size the columns nicely // Trailing spaces are for sort arrow int row = ui->packets->rowCount(); ui->packets->setRowCount(row + 1); + ui->packets->setItem(row, PACKET_COL_DATE, new QTableWidgetItem("Frid Apr 15 2016-")); + ui->packets->setItem(row, PACKET_COL_TIME, new QTableWidgetItem("10:17:00")); ui->packets->setItem(row, PACKET_COL_FROM, new QTableWidgetItem("123456-15-")); ui->packets->setItem(row, PACKET_COL_TO, new QTableWidgetItem("123456-15-")); ui->packets->setItem(row, PACKET_COL_VIA, new QTableWidgetItem("123456-15-")); @@ -158,7 +147,7 @@ bool PacketDemodGUI::deserialize(const QByteArray& data) } // Add row to table -void PacketDemodGUI::packetReceived(QByteArray packet) +void PacketDemodGUI::packetReceived(const QByteArray& packet, QDateTime dateTime) { AX25Packet ax25; @@ -172,6 +161,8 @@ void PacketDemodGUI::packetReceived(QByteArray packet) int row = ui->packets->rowCount(); ui->packets->setRowCount(row + 1); + QTableWidgetItem *dateItem = new QTableWidgetItem(); + QTableWidgetItem *timeItem = new QTableWidgetItem(); QTableWidgetItem *fromItem = new QTableWidgetItem(); QTableWidgetItem *toItem = new QTableWidgetItem(); QTableWidgetItem *viaItem = new QTableWidgetItem(); @@ -179,6 +170,8 @@ void PacketDemodGUI::packetReceived(QByteArray packet) QTableWidgetItem *pidItem = new QTableWidgetItem(); QTableWidgetItem *dataASCIIItem = new QTableWidgetItem(); QTableWidgetItem *dataHexItem = new QTableWidgetItem(); + ui->packets->setItem(row, PACKET_COL_DATE, dateItem); + ui->packets->setItem(row, PACKET_COL_TIME, timeItem); ui->packets->setItem(row, PACKET_COL_FROM, fromItem); ui->packets->setItem(row, PACKET_COL_TO, toItem); ui->packets->setItem(row, PACKET_COL_VIA, viaItem); @@ -186,6 +179,8 @@ void PacketDemodGUI::packetReceived(QByteArray packet) ui->packets->setItem(row, PACKET_COL_PID, pidItem); ui->packets->setItem(row, PACKET_COL_DATA_ASCII, dataASCIIItem); ui->packets->setItem(row, PACKET_COL_DATA_HEX, dataHexItem); + dateItem->setText(dateTime.date().toString()); + timeItem->setText(dateTime.time().toString()); fromItem->setText(ax25.m_from); toItem->setText(ax25.m_to); viaItem->setText(ax25.m_via); @@ -229,7 +224,7 @@ bool PacketDemodGUI::handleMessage(const Message& message) else if (MainCore::MsgPacket::match(message)) { MainCore::MsgPacket& report = (MainCore::MsgPacket&) message; - packetReceived(report.getPacket()); + packetReceived(report.getPacket(), report.getDateTime()); return true; } @@ -554,6 +549,8 @@ void PacketDemodGUI::displaySettings() ui->logFilename->setToolTip(QString(".csv log filename: %1").arg(m_settings.m_logFilename)); ui->logEnable->setChecked(m_settings.m_logEnabled); + ui->useFileTime->setChecked(m_settings.m_useFileTime); + // Order and size columns QHeaderView *header = ui->packets->horizontalHeader(); for (int i = 0; i < PACKETDEMOD_COLUMNS; i++) @@ -666,7 +663,7 @@ void PacketDemodGUI::on_logOpen_clicked() QTime time = QTime::fromString(cols[timeCol]); QDateTime dateTime(date, time); QByteArray bytes = QByteArray::fromHex(cols[dataCol].toLatin1()); - packetReceived(bytes); + packetReceived(bytes, dateTime); if (count % 1000 == 0) { QApplication::processEvents(); @@ -692,6 +689,12 @@ void PacketDemodGUI::on_logOpen_clicked() } } +void PacketDemodGUI::on_useFileTime_toggled(bool checked) +{ + m_settings.m_useFileTime = checked; + applySettings(); +} + void PacketDemodGUI::makeUIConnections() { QObject::connect(ui->deltaFrequency, &ValueDialZ::changed, this, &PacketDemodGUI::on_deltaFrequency_changed); @@ -708,6 +711,7 @@ void PacketDemodGUI::makeUIConnections() QObject::connect(ui->logEnable, &ButtonSwitch::clicked, this, &PacketDemodGUI::on_logEnable_clicked); QObject::connect(ui->logFilename, &QToolButton::clicked, this, &PacketDemodGUI::on_logFilename_clicked); QObject::connect(ui->logOpen, &QToolButton::clicked, this, &PacketDemodGUI::on_logOpen_clicked); + QObject::connect(ui->useFileTime, &ButtonSwitch::toggled, this, &PacketDemodGUI::on_useFileTime_toggled); } void PacketDemodGUI::updateAbsoluteCenterFrequency() diff --git a/plugins/channelrx/demodpacket/packetdemodgui.h b/plugins/channelrx/demodpacket/packetdemodgui.h index e8254b5b2..b89fd5229 100644 --- a/plugins/channelrx/demodpacket/packetdemodgui.h +++ b/plugins/channelrx/demodpacket/packetdemodgui.h @@ -97,7 +97,7 @@ private: void blockApplySettings(bool block); void applySettings(bool force = false); void displaySettings(); - void packetReceived(QByteArray packet); + void packetReceived(const QByteArray& packet, QDateTime dateTime); bool handleMessage(const Message& message); void makeUIConnections(); void updateAbsoluteCenterFrequency(); @@ -108,6 +108,18 @@ private: void resizeTable(); QAction *createCheckableItem(QString& text, int idx, bool checked); + enum PacketCol { + PACKET_COL_DATE, + PACKET_COL_TIME, + PACKET_COL_FROM, + PACKET_COL_TO, + PACKET_COL_VIA, + PACKET_COL_TYPE, + PACKET_COL_PID, + PACKET_COL_DATA_ASCII, + PACKET_COL_DATA_HEX + }; + private slots: void on_deltaFrequency_changed(qint64 value); void on_mode_currentIndexChanged(int value); @@ -123,6 +135,7 @@ private slots: void on_logEnable_clicked(bool checked=false); void on_logFilename_clicked(); void on_logOpen_clicked(); + void on_useFileTime_toggled(bool checked=false); void filterRow(int row); void filter(); void packets_sectionMoved(int logicalIndex, int oldVisualIndex, int newVisualIndex); diff --git a/plugins/channelrx/demodpacket/packetdemodgui.ui b/plugins/channelrx/demodpacket/packetdemodgui.ui index 2fbce3533..f81552e44 100644 --- a/plugins/channelrx/demodpacket/packetdemodgui.ui +++ b/plugins/channelrx/demodpacket/packetdemodgui.ui @@ -385,6 +385,13 @@
+ + + + UDP + + + @@ -394,7 +401,7 @@ Qt::RightToLeft - UDP + @@ -536,6 +543,27 @@ + + + + + 24 + 16777215 + + + + Check to use date and time from input file. Uncheck to use date and time from clock. + + + + + + + :/clockcurrent.png + :/clockfile.png:/clockcurrent.png + + + @@ -650,6 +678,22 @@ QAbstractItemView::NoEditTriggers + + + Date + + + Date packet was received + + + + + Time + + + Time packet was received + + From @@ -713,10 +757,9 @@ - RollupContents - QWidget -
gui/rollupcontents.h
- 1 + ButtonSwitch + QToolButton +
gui/buttonswitch.h
ValueDialZ @@ -724,17 +767,18 @@
gui/valuedialz.h
1
+ + RollupContents + QWidget +
gui/rollupcontents.h
+ 1 +
LevelMeterSignalDB QWidget
gui/levelmeter.h
1
- - ButtonSwitch - QToolButton -
gui/buttonswitch.h
-
packets diff --git a/plugins/channelrx/demodpacket/packetdemodsettings.cpp b/plugins/channelrx/demodpacket/packetdemodsettings.cpp index e168e9576..d3a9c5172 100644 --- a/plugins/channelrx/demodpacket/packetdemodsettings.cpp +++ b/plugins/channelrx/demodpacket/packetdemodsettings.cpp @@ -46,6 +46,7 @@ void PacketDemodSettings::resetToDefaults() m_udpPort = 9999; m_logFilename = "packet_log.csv"; m_logEnabled = false; + m_useFileTime = false; m_rgbColor = QColor(0, 105, 2).rgb(); m_title = "Packet Demodulator"; @@ -103,6 +104,8 @@ QByteArray PacketDemodSettings::serialize() const s.writeBlob(29, m_geometryBytes); s.writeBool(30, m_hidden); + s.writeBool(31, m_useFileTime); + for (int i = 0; i < PACKETDEMOD_COLUMNS; i++) { s.writeS32(100 + i, m_columnIndexes[i]); } @@ -185,6 +188,8 @@ bool PacketDemodSettings::deserialize(const QByteArray& data) d.readBlob(29, &m_geometryBytes); d.readBool(30, &m_hidden, false); + d.readBool(31, &m_useFileTime, false); + for (int i = 0; i < PACKETDEMOD_COLUMNS; i++) { d.readS32(100 + i, &m_columnIndexes[i], i); } diff --git a/plugins/channelrx/demodpacket/packetdemodsettings.h b/plugins/channelrx/demodpacket/packetdemodsettings.h index e986cad49..f9514f512 100644 --- a/plugins/channelrx/demodpacket/packetdemodsettings.h +++ b/plugins/channelrx/demodpacket/packetdemodsettings.h @@ -27,7 +27,7 @@ class Serializable; // Number of columns in the table -#define PACKETDEMOD_COLUMNS 7 +#define PACKETDEMOD_COLUMNS 9 struct PacketDemodSettings { @@ -45,6 +45,7 @@ struct PacketDemodSettings bool m_udpEnabled; QString m_udpAddress; uint16_t m_udpPort; + bool m_useFileTime; quint32 m_rgbColor; QString m_title; diff --git a/plugins/channelrx/demodpacket/packetdemodsink.cpp b/plugins/channelrx/demodpacket/packetdemodsink.cpp index 21d1d1d6d..ae3b1079b 100644 --- a/plugins/channelrx/demodpacket/packetdemodsink.cpp +++ b/plugins/channelrx/demodpacket/packetdemodsink.cpp @@ -22,8 +22,10 @@ #include "dsp/dspengine.h" #include "dsp/datafifo.h" +#include "device/deviceapi.h" #include "util/db.h" #include "util/stepfunctions.h" +#include "channel/channelwebapiutils.h" #include "maincore.h" #include "packetdemod.h" @@ -191,7 +193,23 @@ void PacketDemodSink::processOneSample(Complex &ci) qDebug() << "RX: " << rxPacket.toHex(); if (getMessageQueueToChannel()) { - MainCore::MsgPacket *msg = MainCore::MsgPacket::create(m_packetDemod, rxPacket, QDateTime::currentDateTime()); // FIXME pointer + QDateTime dateTime = QDateTime::currentDateTime(); + if (m_settings.m_useFileTime) + { + QString hardwareId = m_packetDemod->getDeviceAPI()->getHardwareId(); + + if ((hardwareId == "FileInput") || (hardwareId == "SigMFFileInput")) + { + QString dateTimeStr; + int deviceIdx = m_packetDemod->getDeviceSetIndex(); + + if (ChannelWebAPIUtils::getDeviceReportValue(deviceIdx, "absoluteTime", dateTimeStr)) { + dateTime = QDateTime::fromString(dateTimeStr, Qt::ISODateWithMs); + } + } + } + + MainCore::MsgPacket *msg = MainCore::MsgPacket::create(m_packetDemod, rxPacket, dateTime); getMessageQueueToChannel()->push(msg); } } diff --git a/plugins/channelrx/demodpacket/readme.md b/plugins/channelrx/demodpacket/readme.md index e82a41c2f..0747558cb 100644 --- a/plugins/channelrx/demodpacket/readme.md +++ b/plugins/channelrx/demodpacket/readme.md @@ -1,4 +1,4 @@ -

Packet radio demodulator plugin

+

Packet Radio Demodulator Plugin

Introduction

@@ -60,19 +60,24 @@ When checked, received packets are forwarded to the specified UDP address (12) a IP address of the host to forward received packets to via UDP. -

11: UDP port

+

13: UDP port

UDP port number to forward received packets to. -

12: Start/stop Logging Packets to .csv File

+

14: Use Date and Time from File

+ +When checked, if the source device is a File Input device, the date and time used for +packet reception time is taken from the file playback time. Otherwise, the current system clock time is used. + +

15: Start/stop Logging Packets to .csv File

When checked, writes all received packets to a .csv file. -

13: .csv Log Filename

+

16: .csv Log Filename

Click to specify the name of the .csv file which received packets are logged to. -

14: Read Data from .csv File

+

17: Read Data from .csv File

Click to specify a previously written .csv log file, which is read and used to update the table. @@ -80,6 +85,8 @@ Click to specify a previously written .csv log file, which is read and used to u The received packets table displays the contents of the packets that have been received. Only packets with valid CRCs are displayed. +* Date - The date the packet was received. +* Time - The time the packet was received. * From - The source address / callsign of the sender of the packet. * To - The destination address. * Via - List of addresses of repeaters the packet has passed through or directed via. diff --git a/plugins/channelrx/demodradiosonde/radiosondedemod.h b/plugins/channelrx/demodradiosonde/radiosondedemod.h index 5fce1de41..e8843d719 100644 --- a/plugins/channelrx/demodradiosonde/radiosondedemod.h +++ b/plugins/channelrx/demodradiosonde/radiosondedemod.h @@ -82,9 +82,9 @@ public: int getErrorsCorrected() const { return m_errorsCorrected; } int getThreshold() const { return m_threshold; } - static MsgMessage* create(QByteArray message, int errorsCorrected, int threshold) + static MsgMessage* create(const QByteArray& message, QDateTime dateTime, int errorsCorrected, int threshold) { - return new MsgMessage(message, QDateTime::currentDateTime(), errorsCorrected, threshold); + return new MsgMessage(message, dateTime, errorsCorrected, threshold); } private: @@ -93,7 +93,7 @@ public: int m_errorsCorrected; int m_threshold; - MsgMessage(QByteArray message, QDateTime dateTime, int errorsCorrected, int threshold) : + MsgMessage(const QByteArray& message, QDateTime dateTime, int errorsCorrected, int threshold) : Message(), m_message(message), m_dateTime(dateTime), diff --git a/plugins/channelrx/demodradiosonde/radiosondedemodgui.cpp b/plugins/channelrx/demodradiosonde/radiosondedemodgui.cpp index 7ebcf6b7a..e23ec98c4 100644 --- a/plugins/channelrx/demodradiosonde/radiosondedemodgui.cpp +++ b/plugins/channelrx/demodradiosonde/radiosondedemodgui.cpp @@ -771,6 +771,8 @@ void RadiosondeDemodGUI::displaySettings() ui->logFilename->setToolTip(QString(".csv log filename: %1").arg(m_settings.m_logFilename)); ui->logEnable->setChecked(m_settings.m_logEnabled); + ui->useFileTime->setChecked(m_settings.m_useFileTime); + // Order and size columns QHeaderView *header = ui->frames->horizontalHeader(); for (int i = 0; i < RADIOSONDEDEMOD_FRAME_COLUMNS; i++) @@ -924,6 +926,12 @@ void RadiosondeDemodGUI::on_logOpen_clicked() } } +void RadiosondeDemodGUI::on_useFileTime_toggled(bool checked) +{ + m_settings.m_useFileTime = checked; + applySettings(); +} + void RadiosondeDemodGUI::makeUIConnections() { QObject::connect(ui->deltaFrequency, &ValueDialZ::changed, this, &RadiosondeDemodGUI::on_deltaFrequency_changed); @@ -939,6 +947,7 @@ void RadiosondeDemodGUI::makeUIConnections() QObject::connect(ui->logEnable, &ButtonSwitch::clicked, this, &RadiosondeDemodGUI::on_logEnable_clicked); QObject::connect(ui->logFilename, &QToolButton::clicked, this, &RadiosondeDemodGUI::on_logFilename_clicked); QObject::connect(ui->logOpen, &QToolButton::clicked, this, &RadiosondeDemodGUI::on_logOpen_clicked); + QObject::connect(ui->useFileTime, &ButtonSwitch::toggled, this, &RadiosondeDemodGUI::on_useFileTime_toggled); } void RadiosondeDemodGUI::updateAbsoluteCenterFrequency() diff --git a/plugins/channelrx/demodradiosonde/radiosondedemodgui.h b/plugins/channelrx/demodradiosonde/radiosondedemodgui.h index 1b09a6859..f1c952ca4 100644 --- a/plugins/channelrx/demodradiosonde/radiosondedemodgui.h +++ b/plugins/channelrx/demodradiosonde/radiosondedemodgui.h @@ -154,6 +154,7 @@ private slots: void on_logEnable_clicked(bool checked=false); void on_logFilename_clicked(); void on_logOpen_clicked(); + void on_useFileTime_toggled(bool checked=false); void filterRow(int row); void filter(); void frames_sectionMoved(int logicalIndex, int oldVisualIndex, int newVisualIndex); diff --git a/plugins/channelrx/demodradiosonde/radiosondedemodgui.ui b/plugins/channelrx/demodradiosonde/radiosondedemodgui.ui index 9d9f046ea..9d6b8192b 100644 --- a/plugins/channelrx/demodradiosonde/radiosondedemodgui.ui +++ b/plugins/channelrx/demodradiosonde/radiosondedemodgui.ui @@ -524,6 +524,27 @@
+ + + + + 24 + 16777215 + + + + Check to use date and time from input file. Uncheck to use date and time from clock. + + + + + + + :/clockcurrent.png + :/clockfile.png:/clockcurrent.png + + + @@ -1076,29 +1097,29 @@ + + ButtonSwitch + QToolButton +
gui/buttonswitch.h
+
+ + ValueDialZ + QWidget +
gui/valuedialz.h
+ 1 +
RollupContents QWidget
gui/rollupcontents.h
1
- - ButtonSwitch - QToolButton -
gui/buttonswitch.h
-
LevelMeterSignalDB QWidget
gui/levelmeter.h
1
- - ValueDialZ - QWidget -
gui/valuedialz.h
- 1 -
GLScope QWidget diff --git a/plugins/channelrx/demodradiosonde/radiosondedemodsettings.cpp b/plugins/channelrx/demodradiosonde/radiosondedemodsettings.cpp index 265a7572e..01063807d 100644 --- a/plugins/channelrx/demodradiosonde/radiosondedemodsettings.cpp +++ b/plugins/channelrx/demodradiosonde/radiosondedemodsettings.cpp @@ -48,6 +48,7 @@ void RadiosondeDemodSettings::resetToDefaults() m_scopeCh2 = 6; m_logFilename = "radiosonde_log.csv"; m_logEnabled = false; + m_useFileTime = false; m_rgbColor = QColor(102, 0, 102).rgb(); m_title = "Radiosonde Demodulator"; m_streamIndex = 0; @@ -106,6 +107,8 @@ QByteArray RadiosondeDemodSettings::serialize() const s.writeBlob(27, m_geometryBytes); s.writeBool(28, m_hidden); + s.writeBool(29, m_useFileTime); + for (int i = 0; i < RADIOSONDEDEMOD_FRAME_COLUMNS; i++) s.writeS32(100 + i, m_frameColumnIndexes[i]); for (int i = 0; i < RADIOSONDEDEMOD_FRAME_COLUMNS; i++) @@ -192,6 +195,8 @@ bool RadiosondeDemodSettings::deserialize(const QByteArray& data) d.readBlob(27, &m_geometryBytes); d.readBool(28, &m_hidden, false); + d.readBool(29, &m_useFileTime, false); + for (int i = 0; i < RADIOSONDEDEMOD_FRAME_COLUMNS; i++) { d.readS32(100 + i, &m_frameColumnIndexes[i], i); } diff --git a/plugins/channelrx/demodradiosonde/radiosondedemodsettings.h b/plugins/channelrx/demodradiosonde/radiosondedemodsettings.h index 0f727699f..519c95793 100644 --- a/plugins/channelrx/demodradiosonde/radiosondedemodsettings.h +++ b/plugins/channelrx/demodradiosonde/radiosondedemodsettings.h @@ -47,6 +47,7 @@ struct RadiosondeDemodSettings QString m_logFilename; bool m_logEnabled; + bool m_useFileTime; quint32 m_rgbColor; QString m_title; diff --git a/plugins/channelrx/demodradiosonde/radiosondedemodsink.cpp b/plugins/channelrx/demodradiosonde/radiosondedemodsink.cpp index cbedb7da4..f020361dc 100644 --- a/plugins/channelrx/demodradiosonde/radiosondedemodsink.cpp +++ b/plugins/channelrx/demodradiosonde/radiosondedemodsink.cpp @@ -23,8 +23,10 @@ #include "dsp/dspengine.h" #include "dsp/datafifo.h" #include "dsp/scopevis.h" +#include "device/deviceapi.h" #include "util/db.h" #include "util/stepfunctions.h" +#include "channel/channelwebapiutils.h" #include "util/reedsolomon.h" #include "maincore.h" @@ -415,8 +417,23 @@ bool RadiosondeDemodSink::processFrame(int length, float corr, int sampleIdx) { if (getMessageQueueToChannel()) { + QDateTime dateTime = QDateTime::currentDateTime(); + if (m_settings.m_useFileTime) + { + QString hardwareId = m_radiosondeDemod->getDeviceAPI()->getHardwareId(); + + if ((hardwareId == "FileInput") || (hardwareId == "SigMFFileInput")) + { + QString dateTimeStr; + int deviceIdx = m_radiosondeDemod->getDeviceSetIndex(); + + if (ChannelWebAPIUtils::getDeviceReportValue(deviceIdx, "absoluteTime", dateTimeStr)) { + dateTime = QDateTime::fromString(dateTimeStr, Qt::ISODateWithMs); + } + } + } QByteArray rxPacket((char *)m_bytes, length); - RadiosondeDemod::MsgMessage *msg = RadiosondeDemod::MsgMessage::create(rxPacket, errorsCorrected, corr); + RadiosondeDemod::MsgMessage *msg = RadiosondeDemod::MsgMessage::create(rxPacket, dateTime, errorsCorrected, corr); getMessageQueueToChannel()->push(msg); } diff --git a/plugins/channelrx/demodradiosonde/readme.md b/plugins/channelrx/demodradiosonde/readme.md index 7ddc72ca0..3516a145f 100644 --- a/plugins/channelrx/demodradiosonde/readme.md +++ b/plugins/channelrx/demodradiosonde/readme.md @@ -1,4 +1,4 @@ -

Radiosonde demodulator plugin

+

Radiosonde Demodulator Plugin

Introduction

@@ -56,19 +56,24 @@ UDP port number to forward received frames to. Entering a regular expression in the Find field displays only frames where the radiosonde serial number matches the given regular expression. -

11: Start/stop Logging Frames to .csv File

+

11: Use Date and Time from File

+ +When checked, if the source device is a File Input device, the date and time used for +frame reception time is taken from the file playback time. Otherwise, the current system clock time is used. + +

12: Start/stop Logging Frames to .csv File

When checked, writes all received frames to a .csv file. -

14: .csv Log Filename

+

13: .csv Log Filename

Click to specify the name of the .csv file which received frames are logged to. -

15: Read Data from .csv File

+

14: Read Data from .csv File

Click to specify a previously written radiosonde .csv log file, which is read and used to update the table. -

11: Clear Data from table

+

15: Clear Data from table

Pressing this button clears all data from the table. diff --git a/sdrgui/resources/clockcurrent.png b/sdrgui/resources/clockcurrent.png new file mode 100644 index 000000000..10723c7cb Binary files /dev/null and b/sdrgui/resources/clockcurrent.png differ diff --git a/sdrgui/resources/clockfile.png b/sdrgui/resources/clockfile.png new file mode 100644 index 000000000..072b3fb55 Binary files /dev/null and b/sdrgui/resources/clockfile.png differ diff --git a/sdrgui/resources/res.qrc b/sdrgui/resources/res.qrc index b33ebb335..031ced019 100644 --- a/sdrgui/resources/res.qrc +++ b/sdrgui/resources/res.qrc @@ -154,6 +154,8 @@ stackvertical.png stackcolumns.png tab.png + clockfile.png + clockcurrent.png LiberationMono-Regular.ttf LiberationSans-Regular.ttf diff --git a/swagger/sdrangel/api/swagger/include/AISDemod.yaml b/swagger/sdrangel/api/swagger/include/AISDemod.yaml index 512c5f86d..53ff01e16 100644 --- a/swagger/sdrangel/api/swagger/include/AISDemod.yaml +++ b/swagger/sdrangel/api/swagger/include/AISDemod.yaml @@ -32,6 +32,8 @@ AISDemodSettings: type: string logEnabled: type: integer + useFileTime: + type: integer rgbColor: type: integer title: diff --git a/swagger/sdrangel/api/swagger/include/DSCDemod.yaml b/swagger/sdrangel/api/swagger/include/DSCDemod.yaml index ec7724654..51aee23bf 100644 --- a/swagger/sdrangel/api/swagger/include/DSCDemod.yaml +++ b/swagger/sdrangel/api/swagger/include/DSCDemod.yaml @@ -23,6 +23,8 @@ DSCDemodSettings: type: string logEnabled: type: integer + useFileTime: + type: integer rgbColor: type: integer title: diff --git a/swagger/sdrangel/api/swagger/include/EndOfTrainDemod.yaml b/swagger/sdrangel/api/swagger/include/EndOfTrainDemod.yaml index bc5075e09..7171a1311 100644 --- a/swagger/sdrangel/api/swagger/include/EndOfTrainDemod.yaml +++ b/swagger/sdrangel/api/swagger/include/EndOfTrainDemod.yaml @@ -23,6 +23,8 @@ EndOfTrainDemodSettings: type: string logEnabled: type: integer + useFileTime: + type: integer rgbColor: type: integer title: diff --git a/swagger/sdrangel/api/swagger/include/PacketDemod.yaml b/swagger/sdrangel/api/swagger/include/PacketDemod.yaml index 12f3291b0..cb4397807 100644 --- a/swagger/sdrangel/api/swagger/include/PacketDemod.yaml +++ b/swagger/sdrangel/api/swagger/include/PacketDemod.yaml @@ -28,6 +28,8 @@ PacketDemodSettings: type: string logEnabled: type: integer + useFileTime: + type: integer rgbColor: type: integer title: diff --git a/swagger/sdrangel/api/swagger/include/RadiosondeDemod.yaml b/swagger/sdrangel/api/swagger/include/RadiosondeDemod.yaml index f5853f2c6..89069e3fa 100644 --- a/swagger/sdrangel/api/swagger/include/RadiosondeDemod.yaml +++ b/swagger/sdrangel/api/swagger/include/RadiosondeDemod.yaml @@ -29,6 +29,8 @@ RadiosondeDemodSettings: type: string logEnabled: type: integer + useFileTime: + type: integer rgbColor: type: integer title: