1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-04-11 05:59:32 -04:00

SDRdaemonSink: added the output class and GUI with the build

This commit is contained in:
f4exb 2017-05-21 13:32:56 +02:00
parent 20d1ff5dda
commit c762359649
8 changed files with 90 additions and 114 deletions

View File

@ -1,8 +1,8 @@
project(sdrdaemonsink)
set(sdrdaemonsink_SOURCES
# sdrdaemonsinkgui.cpp
# sdrdaemonsinkoutput.cpp
sdrdaemonsinkgui.cpp
sdrdaemonsinkoutput.cpp
# sdrdaemonsinkplugin.cpp
sdrdaemonsinksettings.cpp
sdrdaemonsinkthread.cpp
@ -10,8 +10,8 @@ set(sdrdaemonsink_SOURCES
)
set(sdrdaemonsink_HEADERS
# sdrdaemonsinkgui.h
# sdrdaemonsinkoutput.h
sdrdaemonsinkgui.h
sdrdaemonsinkoutput.h
# sdrdaemonsinkplugin.h
sdrdaemonsinksettings.h
sdrdaemonsinkthread.h

View File

@ -22,7 +22,7 @@
#include <QFileDialog>
#include <QMessageBox>
#include "ui_filesinkgui.h"
#include "ui_sdrdaemonsinkgui.h"
#include "plugin/pluginapi.h"
#include "gui/colormapper.h"
#include "gui/glspectrum.h"
@ -34,16 +34,13 @@
#include "device/devicesinkapi.h"
#include "sdrdaemonsinkgui.h"
FileSinkGui::FileSinkGui(DeviceSinkAPI *deviceAPI, QWidget* parent) :
SDRdaemonSinkGui::SDRdaemonSinkGui(DeviceSinkAPI *deviceAPI, QWidget* parent) :
QWidget(parent),
ui(new Ui::FileSinkGui),
ui(new Ui::SDRdaemonSinkGui),
m_deviceAPI(deviceAPI),
m_settings(),
m_deviceSampleSink(0),
m_sampleRate(0),
m_generation(false),
m_fileName("./test.sdriq"),
m_startingTimeStamp(0),
m_samplesCount(0),
m_tickCount(0),
m_lastEngineState((DSPDeviceSinkEngine::State)-1)
@ -56,8 +53,6 @@ FileSinkGui::FileSinkGui(DeviceSinkAPI *deviceAPI, QWidget* parent) :
ui->sampleRate->setColorMapper(ColorMapper(ColorMapper::GrayGreenYellow));
ui->sampleRate->setValueRange(7, 32000U, 9000000U);
ui->fileNameText->setText(m_fileName);
connect(&(m_deviceAPI->getMainWindow()->getMasterTimer()), SIGNAL(timeout()), this, SLOT(tick()));
connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware()));
connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus()));
@ -72,51 +67,51 @@ FileSinkGui::FileSinkGui(DeviceSinkAPI *deviceAPI, QWidget* parent) :
connect(m_deviceAPI->getDeviceOutputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleDSPMessages()), Qt::QueuedConnection);
}
FileSinkGui::~FileSinkGui()
SDRdaemonSinkGui::~SDRdaemonSinkGui()
{
delete ui;
}
void FileSinkGui::destroy()
void SDRdaemonSinkGui::destroy()
{
delete this;
}
void FileSinkGui::setName(const QString& name)
void SDRdaemonSinkGui::setName(const QString& name)
{
setObjectName(name);
}
QString FileSinkGui::getName() const
QString SDRdaemonSinkGui::getName() const
{
return objectName();
}
void FileSinkGui::resetToDefaults()
void SDRdaemonSinkGui::resetToDefaults()
{
m_settings.resetToDefaults();
displaySettings();
sendSettings();
}
qint64 FileSinkGui::getCenterFrequency() const
qint64 SDRdaemonSinkGui::getCenterFrequency() const
{
return m_settings.m_centerFrequency;
}
void FileSinkGui::setCenterFrequency(qint64 centerFrequency)
void SDRdaemonSinkGui::setCenterFrequency(qint64 centerFrequency)
{
m_settings.m_centerFrequency = centerFrequency;
displaySettings();
sendSettings();
}
QByteArray FileSinkGui::serialize() const
QByteArray SDRdaemonSinkGui::serialize() const
{
return m_settings.serialize();
}
bool FileSinkGui::deserialize(const QByteArray& data)
bool SDRdaemonSinkGui::deserialize(const QByteArray& data)
{
if(m_settings.deserialize(data)) {
displaySettings();
@ -128,15 +123,9 @@ bool FileSinkGui::deserialize(const QByteArray& data)
}
}
bool FileSinkGui::handleMessage(const Message& message)
bool SDRdaemonSinkGui::handleMessage(const Message& message)
{
if (SDRdaemonSinkOutput::MsgReportSDRdaemonSinkGeneration::match(message))
{
m_generation = ((SDRdaemonSinkOutput::MsgReportSDRdaemonSinkGeneration&)message).getAcquisition();
updateWithGeneration();
return true;
}
else if (SDRdaemonSinkOutput::MsgReportSDRdaemonSinkStreamTiming::match(message))
if (SDRdaemonSinkOutput::MsgReportSDRdaemonSinkStreamTiming::match(message))
{
m_samplesCount = ((SDRdaemonSinkOutput::MsgReportSDRdaemonSinkStreamTiming&)message).getSamplesCount();
updateWithStreamTime();
@ -148,7 +137,7 @@ bool FileSinkGui::handleMessage(const Message& message)
}
}
void FileSinkGui::handleDSPMessages()
void SDRdaemonSinkGui::handleDSPMessages()
{
Message* message;
@ -169,7 +158,7 @@ void FileSinkGui::handleDSPMessages()
}
}
void FileSinkGui::handleSinkMessages()
void SDRdaemonSinkGui::handleSinkMessages()
{
Message* message;
@ -184,27 +173,27 @@ void FileSinkGui::handleSinkMessages()
}
}
void FileSinkGui::updateSampleRateAndFrequency()
void SDRdaemonSinkGui::updateSampleRateAndFrequency()
{
m_deviceAPI->getSpectrum()->setSampleRate(m_sampleRate);
m_deviceAPI->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency);
ui->deviceRateText->setText(tr("%1k").arg((float)(m_sampleRate*(1<<m_settings.m_log2Interp)) / 1000));
}
void FileSinkGui::displaySettings()
void SDRdaemonSinkGui::displaySettings()
{
ui->centerFrequency->setValue(m_settings.m_centerFrequency / 1000);
ui->sampleRate->setValue(m_settings.m_sampleRate);
}
void FileSinkGui::sendSettings()
void SDRdaemonSinkGui::sendSettings()
{
if(!m_updateTimer.isActive())
m_updateTimer.start(100);
}
void FileSinkGui::updateHardware()
void SDRdaemonSinkGui::updateHardware()
{
qDebug() << "FileSinkGui::updateHardware";
SDRdaemonSinkOutput::MsgConfigureSDRdaemonSink* message = SDRdaemonSinkOutput::MsgConfigureSDRdaemonSink::create(m_settings);
@ -212,7 +201,7 @@ void FileSinkGui::updateHardware()
m_updateTimer.stop();
}
void FileSinkGui::updateStatus()
void SDRdaemonSinkGui::updateStatus()
{
int state = m_deviceAPI->state();
@ -241,19 +230,19 @@ void FileSinkGui::updateStatus()
}
}
void FileSinkGui::on_centerFrequency_changed(quint64 value)
void SDRdaemonSinkGui::on_centerFrequency_changed(quint64 value)
{
m_settings.m_centerFrequency = value * 1000;
sendSettings();
}
void FileSinkGui::on_sampleRate_changed(quint64 value)
void SDRdaemonSinkGui::on_sampleRate_changed(quint64 value)
{
m_settings.m_sampleRate = value;
sendSettings();
}
void FileSinkGui::on_interp_currentIndexChanged(int index)
void SDRdaemonSinkGui::on_interp_currentIndexChanged(int index)
{
if (index < 0) {
return;
@ -264,7 +253,7 @@ void FileSinkGui::on_interp_currentIndexChanged(int index)
sendSettings();
}
void FileSinkGui::on_startStop_toggled(bool checked)
void SDRdaemonSinkGui::on_startStop_toggled(bool checked)
{
if (checked)
{
@ -285,32 +274,7 @@ void FileSinkGui::on_startStop_toggled(bool checked)
}
}
void FileSinkGui::on_showFileDialog_clicked(bool checked)
{
QString fileName = QFileDialog::getSaveFileName(this,
tr("Save I/Q record file"), ".", tr("SDR I/Q Files (*.sdriq)"));
if (fileName != "")
{
m_fileName = fileName;
ui->fileNameText->setText(m_fileName);
configureFileName();
}
}
void FileSinkGui::configureFileName()
{
qDebug() << "FileSinkGui::configureFileName: " << m_fileName.toStdString().c_str();
SDRdaemonSinkOutput::MsgConfigureSDRdaemonSinkName* message = SDRdaemonSinkOutput::MsgConfigureSDRdaemonSinkName::create(m_fileName);
m_deviceSampleSink->getInputMessageQueue()->push(message);
}
void FileSinkGui::updateWithGeneration()
{
ui->showFileDialog->setEnabled(!m_generation);
}
void FileSinkGui::updateWithStreamTime()
void SDRdaemonSinkGui::updateWithStreamTime()
{
int t_sec = 0;
int t_msec = 0;
@ -324,10 +288,10 @@ void FileSinkGui::updateWithStreamTime()
t = t.addSecs(t_sec);
t = t.addMSecs(t_msec);
QString s_timems = t.toString("hh:mm:ss.zzz");
ui->relTimeText->setText(s_timems);
//ui->relTimeText->setText(s_timems); TODO with absolute time
}
void FileSinkGui::tick()
void SDRdaemonSinkGui::tick()
{
if ((++m_tickCount & 0xf) == 0)
{

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2016 Edouard Griffiths, F4EXB //
// Copyright (C) 2017 Edouard Griffiths, F4EXB //
// //
// 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 //
@ -14,13 +14,13 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDE_FILESINKGUI_H
#define INCLUDE_FILESINKGUI_H
#ifndef INCLUDE_SDRDAEMONSINKGUI_H
#define INCLUDE_SDRDAEMONSINKGUI_H
#include <QTimer>
#include "plugin/plugingui.h"
#include "../sdrdaemonoutput/filesinksettings.h"
#include "sdrdaemonsinksettings.h"
#include "sdrdaemonsinkoutput.h"
@ -28,15 +28,15 @@ class DeviceSinkAPI;
class DeviceSampleSink;
namespace Ui {
class FileSinkGui;
class SDRdaemonSinkGui;
}
class FileSinkGui : public QWidget, public PluginGUI {
class SDRdaemonSinkGui : public QWidget, public PluginGUI {
Q_OBJECT
public:
explicit FileSinkGui(DeviceSinkAPI *deviceAPI, QWidget* parent = NULL);
virtual ~FileSinkGui();
explicit SDRdaemonSinkGui(DeviceSinkAPI *deviceAPI, QWidget* parent = NULL);
virtual ~SDRdaemonSinkGui();
void destroy();
void setName(const QString& name);
@ -50,18 +50,15 @@ public:
virtual bool handleMessage(const Message& message);
private:
Ui::FileSinkGui* ui;
Ui::SDRdaemonSinkGui* ui;
DeviceSinkAPI* m_deviceAPI;
FileSinkSettings m_settings;
QString m_fileName;
SDRdaemonSinkSettings m_settings;
QTimer m_updateTimer;
QTimer m_statusTimer;
DeviceSampleSink* m_deviceSampleSink;
int m_sampleRate;
quint64 m_deviceCenterFrequency; //!< Center frequency in device
bool m_generation;
std::time_t m_startingTimeStamp;
int m_samplesCount;
std::size_t m_tickCount;
int m_lastEngineState;
@ -69,8 +66,6 @@ private:
void displaySettings();
void displayTime();
void sendSettings();
void configureFileName();
void updateWithGeneration();
void updateWithStreamTime();
void updateSampleRateAndFrequency();
@ -80,8 +75,9 @@ private slots:
void on_centerFrequency_changed(quint64 value);
void on_sampleRate_changed(quint64 value);
void on_startStop_toggled(bool checked);
void on_showFileDialog_clicked(bool checked);
void on_interp_currentIndexChanged(int index);
void on_txDelay_valueChanged(int value);
void on_nbFECBlocks_valueChanged(int value);
void updateHardware();
void updateStatus();
void tick();

View File

@ -270,6 +270,49 @@
</item>
</widget>
</item>
<item>
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="txDelayLabel">
<property name="text">
<string>Dt</string>
</property>
</widget>
</item>
<item>
<widget class="QDial" name="txDelay">
<property name="maximumSize">
<size>
<width>24</width>
<height>24</height>
</size>
</property>
<property name="toolTip">
<string>Delay in microseconds between consecutive UDP packets</string>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>200</number>
</property>
<property name="pageStep">
<number>1</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="txDelayText">
<property name="text">
<string>0000</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2016 Edouard Griffiths, F4EXB //
// Copyright (C) 2017 Edouard Griffiths, F4EXB //
// //
// 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 //
@ -32,7 +32,6 @@
MESSAGE_CLASS_DEFINITION(SDRdaemonSinkOutput::MsgConfigureSDRdaemonSink, Message)
MESSAGE_CLASS_DEFINITION(SDRdaemonSinkOutput::MsgConfigureSDRdaemonSinkWork, Message)
MESSAGE_CLASS_DEFINITION(SDRdaemonSinkOutput::MsgConfigureSDRdaemonSinkStreamTiming, Message)
MESSAGE_CLASS_DEFINITION(SDRdaemonSinkOutput::MsgReportSDRdaemonSinkGeneration, Message)
MESSAGE_CLASS_DEFINITION(SDRdaemonSinkOutput::MsgReportSDRdaemonSinkStreamTiming, Message)
SDRdaemonSinkOutput::SDRdaemonSinkOutput(DeviceSinkAPI *deviceAPI, const QTimer& masterTimer) :
@ -70,9 +69,6 @@ bool SDRdaemonSinkOutput::start()
//applySettings(m_generalSettings, m_settings, true);
qDebug("SDRdaemonSinkOutput::start: started");
MsgReportSDRdaemonSinkGeneration *report = MsgReportSDRdaemonSinkGeneration::create(true); // generation on
getOutputMessageQueueToGUI()->push(report);
return true;
}
@ -87,9 +83,6 @@ void SDRdaemonSinkOutput::stop()
delete m_sdrDaemonSinkThread;
m_sdrDaemonSinkThread = 0;
}
MsgReportSDRdaemonSinkGeneration *report = MsgReportSDRdaemonSinkGeneration::create(false); // generation off
getOutputMessageQueueToGUI()->push(report);
}
const QString& SDRdaemonSinkOutput::getDeviceDescription() const

View File

@ -89,26 +89,6 @@ public:
{ }
};
class MsgReportSDRdaemonSinkGeneration : public Message {
MESSAGE_CLASS_DECLARATION
public:
bool getAcquisition() const { return m_acquisition; }
static MsgReportSDRdaemonSinkGeneration* create(bool acquisition)
{
return new MsgReportSDRdaemonSinkGeneration(acquisition);
}
protected:
bool m_acquisition;
MsgReportSDRdaemonSinkGeneration(bool acquisition) :
Message(),
m_acquisition(acquisition)
{ }
};
class MsgReportSDRdaemonSinkStreamTiming : public Message {
MESSAGE_CLASS_DECLARATION

View File

@ -23,7 +23,7 @@
#include "dsp/samplesourcefifo.h"
#include "sdrdaemonsinkthread.h"
SDRdaemonSinkThread::SDRdaemonSinkThread(std::ofstream *samplesStream, SampleSourceFifo* sampleFifo, QObject* parent) :
SDRdaemonSinkThread::SDRdaemonSinkThread(SampleSourceFifo* sampleFifo, QObject* parent) :
QThread(parent),
m_running(false),
m_samplesChunkSize(0),

View File

@ -40,7 +40,7 @@ class SDRdaemonSinkThread : public QThread {
Q_OBJECT
public:
SDRdaemonSinkThread(std::ofstream *samplesStream, SampleSourceFifo* sampleFifo, QObject* parent = 0);
SDRdaemonSinkThread(SampleSourceFifo* sampleFifo, QObject* parent = 0);
~SDRdaemonSinkThread();
void startWork();