1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2025-09-04 14:17:50 -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) project(sdrdaemonsink)
set(sdrdaemonsink_SOURCES set(sdrdaemonsink_SOURCES
# sdrdaemonsinkgui.cpp sdrdaemonsinkgui.cpp
# sdrdaemonsinkoutput.cpp sdrdaemonsinkoutput.cpp
# sdrdaemonsinkplugin.cpp # sdrdaemonsinkplugin.cpp
sdrdaemonsinksettings.cpp sdrdaemonsinksettings.cpp
sdrdaemonsinkthread.cpp sdrdaemonsinkthread.cpp
@ -10,8 +10,8 @@ set(sdrdaemonsink_SOURCES
) )
set(sdrdaemonsink_HEADERS set(sdrdaemonsink_HEADERS
# sdrdaemonsinkgui.h sdrdaemonsinkgui.h
# sdrdaemonsinkoutput.h sdrdaemonsinkoutput.h
# sdrdaemonsinkplugin.h # sdrdaemonsinkplugin.h
sdrdaemonsinksettings.h sdrdaemonsinksettings.h
sdrdaemonsinkthread.h sdrdaemonsinkthread.h

View File

@ -22,7 +22,7 @@
#include <QFileDialog> #include <QFileDialog>
#include <QMessageBox> #include <QMessageBox>
#include "ui_filesinkgui.h" #include "ui_sdrdaemonsinkgui.h"
#include "plugin/pluginapi.h" #include "plugin/pluginapi.h"
#include "gui/colormapper.h" #include "gui/colormapper.h"
#include "gui/glspectrum.h" #include "gui/glspectrum.h"
@ -34,16 +34,13 @@
#include "device/devicesinkapi.h" #include "device/devicesinkapi.h"
#include "sdrdaemonsinkgui.h" #include "sdrdaemonsinkgui.h"
FileSinkGui::FileSinkGui(DeviceSinkAPI *deviceAPI, QWidget* parent) : SDRdaemonSinkGui::SDRdaemonSinkGui(DeviceSinkAPI *deviceAPI, QWidget* parent) :
QWidget(parent), QWidget(parent),
ui(new Ui::FileSinkGui), ui(new Ui::SDRdaemonSinkGui),
m_deviceAPI(deviceAPI), m_deviceAPI(deviceAPI),
m_settings(), m_settings(),
m_deviceSampleSink(0), m_deviceSampleSink(0),
m_sampleRate(0), m_sampleRate(0),
m_generation(false),
m_fileName("./test.sdriq"),
m_startingTimeStamp(0),
m_samplesCount(0), m_samplesCount(0),
m_tickCount(0), m_tickCount(0),
m_lastEngineState((DSPDeviceSinkEngine::State)-1) m_lastEngineState((DSPDeviceSinkEngine::State)-1)
@ -56,8 +53,6 @@ FileSinkGui::FileSinkGui(DeviceSinkAPI *deviceAPI, QWidget* parent) :
ui->sampleRate->setColorMapper(ColorMapper(ColorMapper::GrayGreenYellow)); ui->sampleRate->setColorMapper(ColorMapper(ColorMapper::GrayGreenYellow));
ui->sampleRate->setValueRange(7, 32000U, 9000000U); ui->sampleRate->setValueRange(7, 32000U, 9000000U);
ui->fileNameText->setText(m_fileName);
connect(&(m_deviceAPI->getMainWindow()->getMasterTimer()), SIGNAL(timeout()), this, SLOT(tick())); connect(&(m_deviceAPI->getMainWindow()->getMasterTimer()), SIGNAL(timeout()), this, SLOT(tick()));
connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware())); connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware()));
connect(&m_statusTimer, SIGNAL(timeout()), this, SLOT(updateStatus())); 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); connect(m_deviceAPI->getDeviceOutputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleDSPMessages()), Qt::QueuedConnection);
} }
FileSinkGui::~FileSinkGui() SDRdaemonSinkGui::~SDRdaemonSinkGui()
{ {
delete ui; delete ui;
} }
void FileSinkGui::destroy() void SDRdaemonSinkGui::destroy()
{ {
delete this; delete this;
} }
void FileSinkGui::setName(const QString& name) void SDRdaemonSinkGui::setName(const QString& name)
{ {
setObjectName(name); setObjectName(name);
} }
QString FileSinkGui::getName() const QString SDRdaemonSinkGui::getName() const
{ {
return objectName(); return objectName();
} }
void FileSinkGui::resetToDefaults() void SDRdaemonSinkGui::resetToDefaults()
{ {
m_settings.resetToDefaults(); m_settings.resetToDefaults();
displaySettings(); displaySettings();
sendSettings(); sendSettings();
} }
qint64 FileSinkGui::getCenterFrequency() const qint64 SDRdaemonSinkGui::getCenterFrequency() const
{ {
return m_settings.m_centerFrequency; return m_settings.m_centerFrequency;
} }
void FileSinkGui::setCenterFrequency(qint64 centerFrequency) void SDRdaemonSinkGui::setCenterFrequency(qint64 centerFrequency)
{ {
m_settings.m_centerFrequency = centerFrequency; m_settings.m_centerFrequency = centerFrequency;
displaySettings(); displaySettings();
sendSettings(); sendSettings();
} }
QByteArray FileSinkGui::serialize() const QByteArray SDRdaemonSinkGui::serialize() const
{ {
return m_settings.serialize(); return m_settings.serialize();
} }
bool FileSinkGui::deserialize(const QByteArray& data) bool SDRdaemonSinkGui::deserialize(const QByteArray& data)
{ {
if(m_settings.deserialize(data)) { if(m_settings.deserialize(data)) {
displaySettings(); 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)) if (SDRdaemonSinkOutput::MsgReportSDRdaemonSinkStreamTiming::match(message))
{
m_generation = ((SDRdaemonSinkOutput::MsgReportSDRdaemonSinkGeneration&)message).getAcquisition();
updateWithGeneration();
return true;
}
else if (SDRdaemonSinkOutput::MsgReportSDRdaemonSinkStreamTiming::match(message))
{ {
m_samplesCount = ((SDRdaemonSinkOutput::MsgReportSDRdaemonSinkStreamTiming&)message).getSamplesCount(); m_samplesCount = ((SDRdaemonSinkOutput::MsgReportSDRdaemonSinkStreamTiming&)message).getSamplesCount();
updateWithStreamTime(); updateWithStreamTime();
@ -148,7 +137,7 @@ bool FileSinkGui::handleMessage(const Message& message)
} }
} }
void FileSinkGui::handleDSPMessages() void SDRdaemonSinkGui::handleDSPMessages()
{ {
Message* message; Message* message;
@ -169,7 +158,7 @@ void FileSinkGui::handleDSPMessages()
} }
} }
void FileSinkGui::handleSinkMessages() void SDRdaemonSinkGui::handleSinkMessages()
{ {
Message* message; Message* message;
@ -184,27 +173,27 @@ void FileSinkGui::handleSinkMessages()
} }
} }
void FileSinkGui::updateSampleRateAndFrequency() void SDRdaemonSinkGui::updateSampleRateAndFrequency()
{ {
m_deviceAPI->getSpectrum()->setSampleRate(m_sampleRate); m_deviceAPI->getSpectrum()->setSampleRate(m_sampleRate);
m_deviceAPI->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency); m_deviceAPI->getSpectrum()->setCenterFrequency(m_deviceCenterFrequency);
ui->deviceRateText->setText(tr("%1k").arg((float)(m_sampleRate*(1<<m_settings.m_log2Interp)) / 1000)); 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->centerFrequency->setValue(m_settings.m_centerFrequency / 1000);
ui->sampleRate->setValue(m_settings.m_sampleRate); ui->sampleRate->setValue(m_settings.m_sampleRate);
} }
void FileSinkGui::sendSettings() void SDRdaemonSinkGui::sendSettings()
{ {
if(!m_updateTimer.isActive()) if(!m_updateTimer.isActive())
m_updateTimer.start(100); m_updateTimer.start(100);
} }
void FileSinkGui::updateHardware() void SDRdaemonSinkGui::updateHardware()
{ {
qDebug() << "FileSinkGui::updateHardware"; qDebug() << "FileSinkGui::updateHardware";
SDRdaemonSinkOutput::MsgConfigureSDRdaemonSink* message = SDRdaemonSinkOutput::MsgConfigureSDRdaemonSink::create(m_settings); SDRdaemonSinkOutput::MsgConfigureSDRdaemonSink* message = SDRdaemonSinkOutput::MsgConfigureSDRdaemonSink::create(m_settings);
@ -212,7 +201,7 @@ void FileSinkGui::updateHardware()
m_updateTimer.stop(); m_updateTimer.stop();
} }
void FileSinkGui::updateStatus() void SDRdaemonSinkGui::updateStatus()
{ {
int state = m_deviceAPI->state(); 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; m_settings.m_centerFrequency = value * 1000;
sendSettings(); sendSettings();
} }
void FileSinkGui::on_sampleRate_changed(quint64 value) void SDRdaemonSinkGui::on_sampleRate_changed(quint64 value)
{ {
m_settings.m_sampleRate = value; m_settings.m_sampleRate = value;
sendSettings(); sendSettings();
} }
void FileSinkGui::on_interp_currentIndexChanged(int index) void SDRdaemonSinkGui::on_interp_currentIndexChanged(int index)
{ {
if (index < 0) { if (index < 0) {
return; return;
@ -264,7 +253,7 @@ void FileSinkGui::on_interp_currentIndexChanged(int index)
sendSettings(); sendSettings();
} }
void FileSinkGui::on_startStop_toggled(bool checked) void SDRdaemonSinkGui::on_startStop_toggled(bool checked)
{ {
if (checked) if (checked)
{ {
@ -285,32 +274,7 @@ void FileSinkGui::on_startStop_toggled(bool checked)
} }
} }
void FileSinkGui::on_showFileDialog_clicked(bool checked) void SDRdaemonSinkGui::updateWithStreamTime()
{
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()
{ {
int t_sec = 0; int t_sec = 0;
int t_msec = 0; int t_msec = 0;
@ -324,10 +288,10 @@ void FileSinkGui::updateWithStreamTime()
t = t.addSecs(t_sec); t = t.addSecs(t_sec);
t = t.addMSecs(t_msec); t = t.addMSecs(t_msec);
QString s_timems = t.toString("hh:mm:ss.zzz"); 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) 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 // // 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 // // 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/>. // // along with this program. If not, see <http://www.gnu.org/licenses/>. //
/////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////
#ifndef INCLUDE_FILESINKGUI_H #ifndef INCLUDE_SDRDAEMONSINKGUI_H
#define INCLUDE_FILESINKGUI_H #define INCLUDE_SDRDAEMONSINKGUI_H
#include <QTimer> #include <QTimer>
#include "plugin/plugingui.h" #include "plugin/plugingui.h"
#include "../sdrdaemonoutput/filesinksettings.h" #include "sdrdaemonsinksettings.h"
#include "sdrdaemonsinkoutput.h" #include "sdrdaemonsinkoutput.h"
@ -28,15 +28,15 @@ class DeviceSinkAPI;
class DeviceSampleSink; class DeviceSampleSink;
namespace Ui { namespace Ui {
class FileSinkGui; class SDRdaemonSinkGui;
} }
class FileSinkGui : public QWidget, public PluginGUI { class SDRdaemonSinkGui : public QWidget, public PluginGUI {
Q_OBJECT Q_OBJECT
public: public:
explicit FileSinkGui(DeviceSinkAPI *deviceAPI, QWidget* parent = NULL); explicit SDRdaemonSinkGui(DeviceSinkAPI *deviceAPI, QWidget* parent = NULL);
virtual ~FileSinkGui(); virtual ~SDRdaemonSinkGui();
void destroy(); void destroy();
void setName(const QString& name); void setName(const QString& name);
@ -50,18 +50,15 @@ public:
virtual bool handleMessage(const Message& message); virtual bool handleMessage(const Message& message);
private: private:
Ui::FileSinkGui* ui; Ui::SDRdaemonSinkGui* ui;
DeviceSinkAPI* m_deviceAPI; DeviceSinkAPI* m_deviceAPI;
FileSinkSettings m_settings; SDRdaemonSinkSettings m_settings;
QString m_fileName;
QTimer m_updateTimer; QTimer m_updateTimer;
QTimer m_statusTimer; QTimer m_statusTimer;
DeviceSampleSink* m_deviceSampleSink; DeviceSampleSink* m_deviceSampleSink;
int m_sampleRate; int m_sampleRate;
quint64 m_deviceCenterFrequency; //!< Center frequency in device quint64 m_deviceCenterFrequency; //!< Center frequency in device
bool m_generation;
std::time_t m_startingTimeStamp;
int m_samplesCount; int m_samplesCount;
std::size_t m_tickCount; std::size_t m_tickCount;
int m_lastEngineState; int m_lastEngineState;
@ -69,8 +66,6 @@ private:
void displaySettings(); void displaySettings();
void displayTime(); void displayTime();
void sendSettings(); void sendSettings();
void configureFileName();
void updateWithGeneration();
void updateWithStreamTime(); void updateWithStreamTime();
void updateSampleRateAndFrequency(); void updateSampleRateAndFrequency();
@ -80,8 +75,9 @@ private slots:
void on_centerFrequency_changed(quint64 value); void on_centerFrequency_changed(quint64 value);
void on_sampleRate_changed(quint64 value); void on_sampleRate_changed(quint64 value);
void on_startStop_toggled(bool checked); void on_startStop_toggled(bool checked);
void on_showFileDialog_clicked(bool checked);
void on_interp_currentIndexChanged(int index); void on_interp_currentIndexChanged(int index);
void on_txDelay_valueChanged(int value);
void on_nbFECBlocks_valueChanged(int value);
void updateHardware(); void updateHardware();
void updateStatus(); void updateStatus();
void tick(); void tick();

View File

@ -270,6 +270,49 @@
</item> </item>
</widget> </widget>
</item> </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> <item>
<spacer name="horizontalSpacer"> <spacer name="horizontalSpacer">
<property name="orientation"> <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 // // 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 // // 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::MsgConfigureSDRdaemonSink, Message)
MESSAGE_CLASS_DEFINITION(SDRdaemonSinkOutput::MsgConfigureSDRdaemonSinkWork, Message) MESSAGE_CLASS_DEFINITION(SDRdaemonSinkOutput::MsgConfigureSDRdaemonSinkWork, Message)
MESSAGE_CLASS_DEFINITION(SDRdaemonSinkOutput::MsgConfigureSDRdaemonSinkStreamTiming, Message) MESSAGE_CLASS_DEFINITION(SDRdaemonSinkOutput::MsgConfigureSDRdaemonSinkStreamTiming, Message)
MESSAGE_CLASS_DEFINITION(SDRdaemonSinkOutput::MsgReportSDRdaemonSinkGeneration, Message)
MESSAGE_CLASS_DEFINITION(SDRdaemonSinkOutput::MsgReportSDRdaemonSinkStreamTiming, Message) MESSAGE_CLASS_DEFINITION(SDRdaemonSinkOutput::MsgReportSDRdaemonSinkStreamTiming, Message)
SDRdaemonSinkOutput::SDRdaemonSinkOutput(DeviceSinkAPI *deviceAPI, const QTimer& masterTimer) : SDRdaemonSinkOutput::SDRdaemonSinkOutput(DeviceSinkAPI *deviceAPI, const QTimer& masterTimer) :
@ -70,9 +69,6 @@ bool SDRdaemonSinkOutput::start()
//applySettings(m_generalSettings, m_settings, true); //applySettings(m_generalSettings, m_settings, true);
qDebug("SDRdaemonSinkOutput::start: started"); qDebug("SDRdaemonSinkOutput::start: started");
MsgReportSDRdaemonSinkGeneration *report = MsgReportSDRdaemonSinkGeneration::create(true); // generation on
getOutputMessageQueueToGUI()->push(report);
return true; return true;
} }
@ -87,9 +83,6 @@ void SDRdaemonSinkOutput::stop()
delete m_sdrDaemonSinkThread; delete m_sdrDaemonSinkThread;
m_sdrDaemonSinkThread = 0; m_sdrDaemonSinkThread = 0;
} }
MsgReportSDRdaemonSinkGeneration *report = MsgReportSDRdaemonSinkGeneration::create(false); // generation off
getOutputMessageQueueToGUI()->push(report);
} }
const QString& SDRdaemonSinkOutput::getDeviceDescription() const 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 { class MsgReportSDRdaemonSinkStreamTiming : public Message {
MESSAGE_CLASS_DECLARATION MESSAGE_CLASS_DECLARATION

View File

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

View File

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