| 
									
										
										
										
											2018-08-31 23:29:53 +02:00
										 |  |  | ///////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  | // Copyright (C) 2018-2019 Edouard Griffiths, F4EXB                              //
 | 
					
						
							| 
									
										
										
										
											2018-08-31 23:29:53 +02:00
										 |  |  | //                                                                               //
 | 
					
						
							|  |  |  | // This program is free software; you can redistribute it and/or modify          //
 | 
					
						
							|  |  |  | // it under the terms of the GNU General Public License as published by          //
 | 
					
						
							|  |  |  | // the Free Software Foundation as version 3 of the License, or                  //
 | 
					
						
							| 
									
										
										
										
											2019-04-11 06:39:30 +02:00
										 |  |  | // (at your option) any later version.                                           //
 | 
					
						
							| 
									
										
										
										
											2018-08-31 23:29:53 +02:00
										 |  |  | //                                                                               //
 | 
					
						
							|  |  |  | // This program is distributed in the hope that it will be useful,               //
 | 
					
						
							|  |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of                //
 | 
					
						
							|  |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the                  //
 | 
					
						
							|  |  |  | // GNU General Public License V3 for more details.                               //
 | 
					
						
							|  |  |  | //                                                                               //
 | 
					
						
							|  |  |  | // You should have received a copy of the GNU General Public License             //
 | 
					
						
							|  |  |  | // along with this program. If not, see <http://www.gnu.org/licenses/>.          //
 | 
					
						
							|  |  |  | ///////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  | #include "remotesourcegui.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-08 22:11:53 +02:00
										 |  |  | #include "device/deviceapi.h"
 | 
					
						
							| 
									
										
										
										
											2018-08-31 23:29:53 +02:00
										 |  |  | #include "device/deviceuiset.h"
 | 
					
						
							| 
									
										
										
										
											2018-09-01 00:18:35 +02:00
										 |  |  | #include "gui/basicchannelsettingsdialog.h"
 | 
					
						
							|  |  |  | #include "mainwindow.h"
 | 
					
						
							| 
									
										
										
										
											2018-08-31 23:29:53 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  | #include "remotesource.h"
 | 
					
						
							|  |  |  | #include "ui_remotesourcegui.h"
 | 
					
						
							| 
									
										
										
										
											2018-08-31 23:29:53 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  | RemoteSourceGUI* RemoteSourceGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSource *channelTx) | 
					
						
							| 
									
										
										
										
											2018-08-31 23:29:53 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  |     RemoteSourceGUI* gui = new RemoteSourceGUI(pluginAPI, deviceUISet, channelTx); | 
					
						
							| 
									
										
										
										
											2018-08-31 23:29:53 +02:00
										 |  |  |     return gui; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  | void RemoteSourceGUI::destroy() | 
					
						
							| 
									
										
										
										
											2018-08-31 23:29:53 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     delete this; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  | void RemoteSourceGUI::setName(const QString& name) | 
					
						
							| 
									
										
										
										
											2018-08-31 23:29:53 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     setObjectName(name); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  | QString RemoteSourceGUI::getName() const | 
					
						
							| 
									
										
										
										
											2018-08-31 23:29:53 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     return objectName(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  | qint64 RemoteSourceGUI::getCenterFrequency() const { | 
					
						
							| 
									
										
										
										
											2018-08-31 23:29:53 +02:00
										 |  |  |     return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  | void RemoteSourceGUI::setCenterFrequency(qint64 centerFrequency) | 
					
						
							| 
									
										
										
										
											2018-08-31 23:29:53 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-11-13 00:45:03 +01:00
										 |  |  |     (void) centerFrequency; | 
					
						
							| 
									
										
										
										
											2018-08-31 23:29:53 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  | void RemoteSourceGUI::resetToDefaults() | 
					
						
							| 
									
										
										
										
											2018-08-31 23:29:53 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     m_settings.resetToDefaults(); | 
					
						
							|  |  |  |     displaySettings(); | 
					
						
							|  |  |  |     applySettings(true); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  | QByteArray RemoteSourceGUI::serialize() const | 
					
						
							| 
									
										
										
										
											2018-08-31 23:29:53 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     return m_settings.serialize(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  | bool RemoteSourceGUI::deserialize(const QByteArray& data) | 
					
						
							| 
									
										
										
										
											2018-08-31 23:29:53 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     if(m_settings.deserialize(data)) { | 
					
						
							|  |  |  |         displaySettings(); | 
					
						
							|  |  |  |         applySettings(true); | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |         resetToDefaults(); | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  | bool RemoteSourceGUI::handleMessage(const Message& message) | 
					
						
							| 
									
										
										
										
											2018-08-31 23:29:53 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  |     if (RemoteSource::MsgSampleRateNotification::match(message)) | 
					
						
							| 
									
										
										
										
											2018-09-01 00:18:35 +02:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  |         RemoteSource::MsgSampleRateNotification& notif = (RemoteSource::MsgSampleRateNotification&) message; | 
					
						
							| 
									
										
										
										
											2018-09-01 00:18:35 +02:00
										 |  |  |         m_channelMarker.setBandwidth(notif.getSampleRate()); | 
					
						
							| 
									
										
										
										
											2018-09-01 09:53:16 +02:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  |     else if (RemoteSource::MsgConfigureRemoteSource::match(message)) | 
					
						
							| 
									
										
										
										
											2018-09-01 09:53:16 +02:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  |         const RemoteSource::MsgConfigureRemoteSource& cfg = (RemoteSource::MsgConfigureRemoteSource&) message; | 
					
						
							| 
									
										
										
										
											2018-09-01 09:53:16 +02:00
										 |  |  |         m_settings = cfg.getSettings(); | 
					
						
							|  |  |  |         blockApplySettings(true); | 
					
						
							|  |  |  |         displaySettings(); | 
					
						
							|  |  |  |         blockApplySettings(false); | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  |     else if (RemoteSource::MsgReportStreamData::match(message)) | 
					
						
							| 
									
										
										
										
											2018-09-02 19:12:03 +02:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  |         const RemoteSource::MsgReportStreamData& report = (RemoteSource::MsgReportStreamData&) message; | 
					
						
							| 
									
										
										
										
											2018-09-02 19:12:03 +02:00
										 |  |  |         ui->sampleRate->setText(QString("%1").arg(report.get_sampleRate())); | 
					
						
							|  |  |  |         QString nominalNbBlocksText = QString("%1/%2") | 
					
						
							|  |  |  |                 .arg(report.get_nbOriginalBlocks() + report.get_nbFECBlocks()) | 
					
						
							|  |  |  |                 .arg(report.get_nbFECBlocks()); | 
					
						
							|  |  |  |         ui->nominalNbBlocksText->setText(nominalNbBlocksText); | 
					
						
							|  |  |  |         QString queueLengthText = QString("%1/%2").arg(report.get_queueLength()).arg(report.get_queueSize()); | 
					
						
							|  |  |  |         ui->queueLengthText->setText(queueLengthText); | 
					
						
							|  |  |  |         int queueLengthPercent = (report.get_queueLength()*100)/report.get_queueSize(); | 
					
						
							|  |  |  |         ui->queueLengthGauge->setValue(queueLengthPercent); | 
					
						
							|  |  |  |         int unrecoverableCount = report.get_nbUncorrectableErrors(); | 
					
						
							|  |  |  |         int recoverableCount = report.get_nbCorrectableErrors(); | 
					
						
							|  |  |  |         uint64_t timestampUs = report.get_tv_sec()*1000000ULL + report.get_tv_usec(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!m_resetCounts) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             int recoverableCountDelta = recoverableCount - m_lastCountRecovered; | 
					
						
							|  |  |  |             int unrecoverableCountDelta = unrecoverableCount - m_lastCountUnrecoverable; | 
					
						
							|  |  |  |             displayEventStatus(recoverableCountDelta, unrecoverableCountDelta); | 
					
						
							|  |  |  |             m_countRecovered += recoverableCountDelta; | 
					
						
							|  |  |  |             m_countUnrecoverable += unrecoverableCountDelta; | 
					
						
							|  |  |  |             displayEventCounts(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         uint32_t sampleCountDelta, sampleCount; | 
					
						
							|  |  |  |         sampleCount = report.get_readSamplesCount(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (sampleCount < m_lastSampleCount) { | 
					
						
							|  |  |  |             sampleCountDelta = (0xFFFFFFFFU - sampleCount) + m_lastSampleCount + 1; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             sampleCountDelta = sampleCount - m_lastSampleCount; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (sampleCountDelta == 0) { | 
					
						
							|  |  |  |             ui->allFramesDecoded->setStyleSheet("QToolButton { background-color : blue; }"); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         double remoteStreamRate = sampleCountDelta*1e6 / (double) (timestampUs - m_lastTimestampUs); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (remoteStreamRate != 0) { | 
					
						
							|  |  |  |             ui->streamRateText->setText(QString("%1").arg(remoteStreamRate, 0, 'f', 0)); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         m_resetCounts = false; | 
					
						
							|  |  |  |         m_lastCountRecovered = recoverableCount; | 
					
						
							|  |  |  |         m_lastCountUnrecoverable = unrecoverableCount; | 
					
						
							|  |  |  |         m_lastSampleCount = sampleCount; | 
					
						
							|  |  |  |         m_lastTimestampUs = timestampUs; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-09-01 09:53:16 +02:00
										 |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return false; | 
					
						
							| 
									
										
										
										
											2018-09-01 00:18:35 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-08-31 23:29:53 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  | RemoteSourceGUI::RemoteSourceGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSource *channelTx, QWidget* parent) : | 
					
						
							| 
									
										
										
										
											2018-08-31 23:29:53 +02:00
										 |  |  |         RollupWidget(parent), | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  |         ui(new Ui::RemoteSourceGUI), | 
					
						
							| 
									
										
										
										
											2018-08-31 23:29:53 +02:00
										 |  |  |         m_pluginAPI(pluginAPI), | 
					
						
							| 
									
										
										
										
											2018-09-02 19:12:03 +02:00
										 |  |  |         m_deviceUISet(deviceUISet), | 
					
						
							|  |  |  |         m_countUnrecoverable(0), | 
					
						
							|  |  |  |         m_countRecovered(0), | 
					
						
							|  |  |  |         m_lastCountUnrecoverable(0), | 
					
						
							|  |  |  |         m_lastCountRecovered(0), | 
					
						
							|  |  |  |         m_lastSampleCount(0), | 
					
						
							|  |  |  |         m_lastTimestampUs(0), | 
					
						
							|  |  |  |         m_resetCounts(true), | 
					
						
							|  |  |  |         m_tickCount(0) | 
					
						
							| 
									
										
										
										
											2018-08-31 23:29:53 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-11-13 00:45:03 +01:00
										 |  |  |     (void) channelTx; | 
					
						
							| 
									
										
										
										
											2018-08-31 23:29:53 +02:00
										 |  |  |     ui->setupUi(this); | 
					
						
							|  |  |  |     setAttribute(Qt::WA_DeleteOnClose, true); | 
					
						
							|  |  |  |     connect(this, SIGNAL(widgetRolled(QWidget*,bool)), this, SLOT(onWidgetRolled(QWidget*,bool))); | 
					
						
							| 
									
										
										
										
											2018-09-11 08:41:37 +02:00
										 |  |  |     connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(onMenuDialogCalled(const QPoint &))); | 
					
						
							| 
									
										
										
										
											2018-09-01 00:18:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  |     m_remoteSrc = (RemoteSource*) channelTx; | 
					
						
							|  |  |  |     m_remoteSrc->setMessageQueueToGUI(getInputMessageQueue()); | 
					
						
							| 
									
										
										
										
											2018-09-01 00:18:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-08 22:11:53 +02:00
										 |  |  |     connect(&(m_deviceUISet->m_deviceAPI->getMasterTimer()), SIGNAL(timeout()), this, SLOT(tick())); | 
					
						
							| 
									
										
										
										
											2018-09-11 08:41:37 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-01 00:18:35 +02:00
										 |  |  |     m_channelMarker.blockSignals(true); | 
					
						
							|  |  |  |     m_channelMarker.setColor(m_settings.m_rgbColor); | 
					
						
							|  |  |  |     m_channelMarker.setCenterFrequency(0); | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  |     m_channelMarker.setTitle("Remote source"); | 
					
						
							| 
									
										
										
										
											2019-05-30 18:38:10 +02:00
										 |  |  |     m_channelMarker.setSourceOrSinkStream(false); | 
					
						
							| 
									
										
										
										
											2018-09-01 00:18:35 +02:00
										 |  |  |     m_channelMarker.blockSignals(false); | 
					
						
							|  |  |  |     m_channelMarker.setVisible(true); // activate signal on the last setting only
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     m_settings.setChannelMarker(&m_channelMarker); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  |     m_deviceUISet->registerTxChannelInstance(RemoteSource::m_channelIdURI, this); | 
					
						
							| 
									
										
										
										
											2018-09-01 00:18:35 +02:00
										 |  |  |     m_deviceUISet->addChannelMarker(&m_channelMarker); | 
					
						
							|  |  |  |     m_deviceUISet->addRollupWidget(this); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 08:41:37 +02:00
										 |  |  |     connect(&m_channelMarker, SIGNAL(changedByCursor()), this, SLOT(channelMarkerChangedByCursor())); | 
					
						
							| 
									
										
										
										
											2018-09-01 00:18:35 +02:00
										 |  |  |     connect(getInputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleSourceMessages())); | 
					
						
							| 
									
										
										
										
											2018-09-02 19:12:03 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     m_time.start(); | 
					
						
							| 
									
										
										
										
											2018-09-01 00:18:35 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     displaySettings(); | 
					
						
							|  |  |  |     applySettings(true); | 
					
						
							| 
									
										
										
										
											2018-08-31 23:29:53 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  | RemoteSourceGUI::~RemoteSourceGUI() | 
					
						
							| 
									
										
										
										
											2018-08-31 23:29:53 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     m_deviceUISet->removeTxChannelInstance(this); | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  |     delete m_remoteSrc; | 
					
						
							| 
									
										
										
										
											2018-08-31 23:29:53 +02:00
										 |  |  |     delete ui; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  | void RemoteSourceGUI::blockApplySettings(bool block) | 
					
						
							| 
									
										
										
										
											2018-08-31 23:29:53 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     m_doApplySettings = !block; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  | void RemoteSourceGUI::applySettings(bool force) | 
					
						
							| 
									
										
										
										
											2018-08-31 23:29:53 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-09-01 04:37:23 +02:00
										 |  |  |     if (m_doApplySettings) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         setTitleColor(m_channelMarker.getColor()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  |         RemoteSource::MsgConfigureRemoteSource* message = RemoteSource::MsgConfigureRemoteSource::create(m_settings, force); | 
					
						
							|  |  |  |         m_remoteSrc->getInputMessageQueue()->push(message); | 
					
						
							| 
									
										
										
										
											2018-09-01 04:37:23 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-08-31 23:29:53 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  | void RemoteSourceGUI::displaySettings() | 
					
						
							| 
									
										
										
										
											2018-08-31 23:29:53 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-09-01 00:18:35 +02:00
										 |  |  |     m_channelMarker.blockSignals(true); | 
					
						
							|  |  |  |     m_channelMarker.setCenterFrequency(0); | 
					
						
							|  |  |  |     m_channelMarker.setTitle(m_settings.m_title); | 
					
						
							|  |  |  |     m_channelMarker.setBandwidth(5000); // TODO
 | 
					
						
							|  |  |  |     m_channelMarker.blockSignals(false); | 
					
						
							|  |  |  |     m_channelMarker.setColor(m_settings.m_rgbColor); // activate signal on the last setting only
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     setTitleColor(m_settings.m_rgbColor); | 
					
						
							|  |  |  |     setWindowTitle(m_channelMarker.getTitle()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     blockApplySettings(true); | 
					
						
							|  |  |  |     ui->dataAddress->setText(m_settings.m_dataAddress); | 
					
						
							|  |  |  |     ui->dataPort->setText(tr("%1").arg(m_settings.m_dataPort)); | 
					
						
							|  |  |  |     blockApplySettings(false); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  | void RemoteSourceGUI::leaveEvent(QEvent*) | 
					
						
							| 
									
										
										
										
											2018-09-01 00:18:35 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     m_channelMarker.setHighlighted(false); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  | void RemoteSourceGUI::enterEvent(QEvent*) | 
					
						
							| 
									
										
										
										
											2018-09-01 00:18:35 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     m_channelMarker.setHighlighted(true); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  | void RemoteSourceGUI::handleSourceMessages() | 
					
						
							| 
									
										
										
										
											2018-09-01 00:18:35 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     Message* message; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while ((message = getInputMessageQueue()->pop()) != 0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (handleMessage(*message)) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             delete message; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  | void RemoteSourceGUI::onWidgetRolled(QWidget* widget, bool rollDown) | 
					
						
							| 
									
										
										
										
											2018-09-01 00:18:35 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-11-13 00:45:03 +01:00
										 |  |  |     (void) widget; | 
					
						
							|  |  |  |     (void) rollDown; | 
					
						
							| 
									
										
										
										
											2018-09-01 00:18:35 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  | void RemoteSourceGUI::onMenuDialogCalled(const QPoint &p) | 
					
						
							| 
									
										
										
										
											2018-09-01 00:18:35 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-05-09 21:07:05 +02:00
										 |  |  |     if (m_contextMenuType == ContextMenuChannelSettings) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         BasicChannelSettingsDialog dialog(&m_channelMarker, this); | 
					
						
							|  |  |  |         dialog.setUseReverseAPI(m_settings.m_useReverseAPI); | 
					
						
							|  |  |  |         dialog.setReverseAPIAddress(m_settings.m_reverseAPIAddress); | 
					
						
							|  |  |  |         dialog.setReverseAPIPort(m_settings.m_reverseAPIPort); | 
					
						
							|  |  |  |         dialog.setReverseAPIDeviceIndex(m_settings.m_reverseAPIDeviceIndex); | 
					
						
							|  |  |  |         dialog.setReverseAPIChannelIndex(m_settings.m_reverseAPIChannelIndex); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         dialog.move(p); | 
					
						
							|  |  |  |         dialog.exec(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         m_settings.m_rgbColor = m_channelMarker.getColor().rgb(); | 
					
						
							|  |  |  |         m_settings.m_title = m_channelMarker.getTitle(); | 
					
						
							|  |  |  |         m_settings.m_useReverseAPI = dialog.useReverseAPI(); | 
					
						
							|  |  |  |         m_settings.m_reverseAPIAddress = dialog.getReverseAPIAddress(); | 
					
						
							|  |  |  |         m_settings.m_reverseAPIPort = dialog.getReverseAPIPort(); | 
					
						
							|  |  |  |         m_settings.m_reverseAPIDeviceIndex = dialog.getReverseAPIDeviceIndex(); | 
					
						
							|  |  |  |         m_settings.m_reverseAPIChannelIndex = dialog.getReverseAPIChannelIndex(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         setWindowTitle(m_settings.m_title); | 
					
						
							|  |  |  |         setTitleColor(m_settings.m_rgbColor); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         applySettings(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-09-01 00:18:35 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-09 21:07:05 +02:00
										 |  |  |     resetContextMenuType(); | 
					
						
							| 
									
										
										
										
											2018-08-31 23:29:53 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2018-09-01 04:37:23 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  | void RemoteSourceGUI::on_dataAddress_returnPressed() | 
					
						
							| 
									
										
										
										
											2018-09-01 04:37:23 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     m_settings.m_dataAddress = ui->dataAddress->text(); | 
					
						
							|  |  |  |     applySettings(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  | void RemoteSourceGUI::on_dataPort_returnPressed() | 
					
						
							| 
									
										
										
										
											2018-09-01 04:37:23 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     bool dataOk; | 
					
						
							|  |  |  |     int dataPort = ui->dataPort->text().toInt(&dataOk); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if((!dataOk) || (dataPort < 1024) || (dataPort > 65535)) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         m_settings.m_dataPort = dataPort; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     applySettings(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  | void RemoteSourceGUI::on_dataApplyButton_clicked(bool checked) | 
					
						
							| 
									
										
										
										
											2018-09-01 04:37:23 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-11-13 00:45:03 +01:00
										 |  |  |     (void) checked; | 
					
						
							| 
									
										
										
										
											2018-09-01 04:37:23 +02:00
										 |  |  |     m_settings.m_dataAddress = ui->dataAddress->text(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     bool dataOk; | 
					
						
							|  |  |  |     int udpDataPort = ui->dataPort->text().toInt(&dataOk); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if((dataOk) && (udpDataPort >= 1024) && (udpDataPort < 65535)) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         m_settings.m_dataPort = udpDataPort; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     applySettings(); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2018-09-02 19:12:03 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  | void RemoteSourceGUI::on_eventCountsReset_clicked(bool checked) | 
					
						
							| 
									
										
										
										
											2018-09-02 19:12:03 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-11-13 00:45:03 +01:00
										 |  |  |     (void) checked; | 
					
						
							| 
									
										
										
										
											2018-09-02 19:12:03 +02:00
										 |  |  |     m_countUnrecoverable = 0; | 
					
						
							|  |  |  |     m_countRecovered = 0; | 
					
						
							|  |  |  |     m_time.start(); | 
					
						
							|  |  |  |     displayEventCounts(); | 
					
						
							|  |  |  |     displayEventTimer(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  | void RemoteSourceGUI::displayEventCounts() | 
					
						
							| 
									
										
										
										
											2018-09-02 19:12:03 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     QString nstr = QString("%1").arg(m_countUnrecoverable, 3, 10, QChar('0')); | 
					
						
							|  |  |  |     ui->eventUnrecText->setText(nstr); | 
					
						
							|  |  |  |     nstr = QString("%1").arg(m_countRecovered, 3, 10, QChar('0')); | 
					
						
							|  |  |  |     ui->eventRecText->setText(nstr); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  | void RemoteSourceGUI::displayEventStatus(int recoverableCount, int unrecoverableCount) | 
					
						
							| 
									
										
										
										
											2018-09-02 19:12:03 +02:00
										 |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (unrecoverableCount == 0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (recoverableCount == 0) { | 
					
						
							|  |  |  |             ui->allFramesDecoded->setStyleSheet("QToolButton { background-color : green; }"); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             ui->allFramesDecoded->setStyleSheet("QToolButton { background:rgb(79,79,79); }"); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         ui->allFramesDecoded->setStyleSheet("QToolButton { background-color : red; }"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  | void RemoteSourceGUI::displayEventTimer() | 
					
						
							| 
									
										
										
										
											2018-09-02 19:12:03 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     int elapsedTimeMillis = m_time.elapsed(); | 
					
						
							|  |  |  |     QTime recordLength(0, 0, 0, 0); | 
					
						
							|  |  |  |     recordLength = recordLength.addSecs(elapsedTimeMillis/1000); | 
					
						
							|  |  |  |     QString s_time = recordLength.toString("HH:mm:ss"); | 
					
						
							|  |  |  |     ui->eventCountsTimeText->setText(s_time); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  | void RemoteSourceGUI::tick() | 
					
						
							| 
									
										
										
										
											2018-09-02 19:12:03 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     if (++m_tickCount == 20) // once per second
 | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  |         RemoteSource::MsgQueryStreamData *msg = RemoteSource::MsgQueryStreamData::create(); | 
					
						
							|  |  |  |         m_remoteSrc->getInputMessageQueue()->push(msg); | 
					
						
							| 
									
										
										
										
											2018-09-02 19:12:03 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         displayEventTimer(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         m_tickCount = 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2018-09-11 08:41:37 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-23 00:44:13 +01:00
										 |  |  | void RemoteSourceGUI::channelMarkerChangedByCursor() | 
					
						
							| 
									
										
										
										
											2018-09-11 08:41:37 +02:00
										 |  |  | { | 
					
						
							|  |  |  | } |