forked from sdr/sdrangelove
major rewrite and changes... far too many to put into individual commits
This commit is contained in:
parent
69673c7a64
commit
9fd7152f13
|
@ -3,7 +3,9 @@ list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/Modules)
|
||||||
|
|
||||||
project(sdrangelove)
|
project(sdrangelove)
|
||||||
|
|
||||||
set(CMAKE_BUILD_TYPE "Release")
|
#set(CMAKE_BUILD_TYPE "Release")
|
||||||
|
#set(CMAKE_BUILD_TYPE "ReleaseWithDebInfo")
|
||||||
|
set(CMAKE_BUILD_TYPE "Debug")
|
||||||
|
|
||||||
set(QT_USE_QTOPENGL TRUE)
|
set(QT_USE_QTOPENGL TRUE)
|
||||||
set(CMAKE_AUTOMOC ON)
|
set(CMAKE_AUTOMOC ON)
|
||||||
|
@ -24,12 +26,12 @@ find_package(FFTW3F)
|
||||||
add_definitions(${QT_DEFINITIONS})
|
add_definitions(${QT_DEFINITIONS})
|
||||||
|
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES})
|
foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES})
|
||||||
string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG)
|
string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG)
|
||||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/bin_${OUTPUTCONFIG})
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/bin_${OUTPUTCONFIG})
|
||||||
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/bin_${OUTPUTCONFIG})
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/bin_${OUTPUTCONFIG})
|
||||||
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/bin_${OUTPUTCONFIG})
|
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CMAKE_BINARY_DIR}/bin_${OUTPUTCONFIG})
|
||||||
endforeach(OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES)
|
endforeach(OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
@ -61,6 +63,8 @@ set(sdrbase_SOURCES
|
||||||
|
|
||||||
sdrbase/gui/aboutdialog.cpp
|
sdrbase/gui/aboutdialog.cpp
|
||||||
sdrbase/gui/addpresetdialog.cpp
|
sdrbase/gui/addpresetdialog.cpp
|
||||||
|
sdrbase/gui/buttonswitch.cpp
|
||||||
|
sdrbase/gui/channelwindow.cpp
|
||||||
sdrbase/gui/glscope.cpp
|
sdrbase/gui/glscope.cpp
|
||||||
sdrbase/gui/glspectrum.cpp
|
sdrbase/gui/glspectrum.cpp
|
||||||
sdrbase/gui/glspectrumgui.cpp
|
sdrbase/gui/glspectrumgui.cpp
|
||||||
|
@ -68,6 +72,7 @@ set(sdrbase_SOURCES
|
||||||
sdrbase/gui/pluginsdialog.cpp
|
sdrbase/gui/pluginsdialog.cpp
|
||||||
sdrbase/gui/preferencesdialog.cpp
|
sdrbase/gui/preferencesdialog.cpp
|
||||||
sdrbase/gui/presetitem.cpp
|
sdrbase/gui/presetitem.cpp
|
||||||
|
sdrbase/gui/rollupwidget.cpp
|
||||||
sdrbase/gui/scale.cpp
|
sdrbase/gui/scale.cpp
|
||||||
sdrbase/gui/scaleengine.cpp
|
sdrbase/gui/scaleengine.cpp
|
||||||
sdrbase/gui/scopewindow.cpp
|
sdrbase/gui/scopewindow.cpp
|
||||||
|
@ -119,6 +124,8 @@ set(sdrbase_HEADERS
|
||||||
|
|
||||||
include-gpl/gui/aboutdialog.h
|
include-gpl/gui/aboutdialog.h
|
||||||
include-gpl/gui/addpresetdialog.h
|
include-gpl/gui/addpresetdialog.h
|
||||||
|
include-gpl/gui/buttonswitch.h
|
||||||
|
include-gpl/gui/channelwindow.h
|
||||||
include-gpl/gui/glscope.h
|
include-gpl/gui/glscope.h
|
||||||
include-gpl/gui/glspectrum.h
|
include-gpl/gui/glspectrum.h
|
||||||
include-gpl/gui/glspectrumgui.h
|
include-gpl/gui/glspectrumgui.h
|
||||||
|
@ -127,6 +134,7 @@ set(sdrbase_HEADERS
|
||||||
include-gpl/gui/pluginsdialog.h
|
include-gpl/gui/pluginsdialog.h
|
||||||
include-gpl/gui/preferencesdialog.h
|
include-gpl/gui/preferencesdialog.h
|
||||||
include-gpl/gui/presetitem.h
|
include-gpl/gui/presetitem.h
|
||||||
|
include/gui/rollupwidget.h
|
||||||
include-gpl/gui/scale.h
|
include-gpl/gui/scale.h
|
||||||
include-gpl/gui/scaleengine.h
|
include-gpl/gui/scaleengine.h
|
||||||
include-gpl/gui/scopewindow.h
|
include-gpl/gui/scopewindow.h
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
#ifndef INCLUDE_BUTTONSWITCH_H
|
||||||
|
#define INCLUDE_BUTTONSWITCH_H
|
||||||
|
|
||||||
|
#include <QToolButton>
|
||||||
|
|
||||||
|
class ButtonSwitch : public QToolButton {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
ButtonSwitch(QWidget* parent = NULL);
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void onToggled(bool checked);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QPalette m_originalPalette;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // INCLUDE_BUTTONSWITCH_H
|
|
@ -0,0 +1,25 @@
|
||||||
|
#ifndef INCLUDE_CHANNELWINDOW_H
|
||||||
|
#define INCLUDE_CHANNELWINDOW_H
|
||||||
|
|
||||||
|
#include <QScrollArea>
|
||||||
|
|
||||||
|
class QBoxLayout;
|
||||||
|
class QSpacerItem;
|
||||||
|
class RollupWidget;
|
||||||
|
|
||||||
|
class ChannelWindow : public QScrollArea {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
ChannelWindow(QWidget* parent = NULL);
|
||||||
|
|
||||||
|
void addRollupWidget(QWidget* rollupWidget);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
QWidget* m_container;
|
||||||
|
QBoxLayout* m_layout;
|
||||||
|
|
||||||
|
void resizeEvent(QResizeEvent* event);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // INCLUDE_CHANNELWINDOW_H
|
|
@ -37,7 +37,8 @@ public:
|
||||||
ModeIQ,
|
ModeIQ,
|
||||||
ModeMagLinPha,
|
ModeMagLinPha,
|
||||||
ModeMagdBPha,
|
ModeMagdBPha,
|
||||||
ModeDerived12
|
ModeDerived12,
|
||||||
|
ModeCyclostationary
|
||||||
};
|
};
|
||||||
|
|
||||||
GLScope(QWidget* parent = NULL);
|
GLScope(QWidget* parent = NULL);
|
||||||
|
|
|
@ -39,7 +39,7 @@ public:
|
||||||
void setPowerRange(Real powerRange);
|
void setPowerRange(Real powerRange);
|
||||||
void setDisplayWaterfall(bool display);
|
void setDisplayWaterfall(bool display);
|
||||||
void setInvertedWaterfall(bool inv);
|
void setInvertedWaterfall(bool inv);
|
||||||
void setDisplayLiveSpectrum(bool display);
|
void setDisplayMaxHold(bool display);
|
||||||
void setDisplayHistogram(bool display);
|
void setDisplayHistogram(bool display);
|
||||||
|
|
||||||
void addChannelMarker(ChannelMarker* channelMarker);
|
void addChannelMarker(ChannelMarker* channelMarker);
|
||||||
|
@ -84,9 +84,8 @@ private:
|
||||||
|
|
||||||
bool m_invertedWaterfall;
|
bool m_invertedWaterfall;
|
||||||
|
|
||||||
std::vector<Real> m_liveSpectrum;
|
std::vector<Real> m_maxHold;
|
||||||
bool m_displayLiveSpectrum;
|
bool m_displayMaxHold;
|
||||||
bool m_liveSpectrumChanged;
|
|
||||||
|
|
||||||
Real m_waterfallShare;
|
Real m_waterfallShare;
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,7 @@ private:
|
||||||
Real m_powerRange;
|
Real m_powerRange;
|
||||||
bool m_displayWaterfall;
|
bool m_displayWaterfall;
|
||||||
bool m_invertedWaterfall;
|
bool m_invertedWaterfall;
|
||||||
bool m_displayLiveSpectrum;
|
bool m_displayMaxHold;
|
||||||
bool m_displayHistogram;
|
bool m_displayHistogram;
|
||||||
|
|
||||||
void applySettings();
|
void applySettings();
|
||||||
|
@ -53,7 +53,7 @@ private slots:
|
||||||
void on_decay_valueChanged(int value);
|
void on_decay_valueChanged(int value);
|
||||||
void on_waterfall_toggled(bool checked);
|
void on_waterfall_toggled(bool checked);
|
||||||
void on_histogram_toggled(bool checked);
|
void on_histogram_toggled(bool checked);
|
||||||
void on_liveSpectrum_toggled(bool checked);
|
void on_maxHold_toggled(bool checked);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // INCLUDE_GLSPECTRUMGUI_H
|
#endif // INCLUDE_GLSPECTRUMGUI_H
|
||||||
|
|
|
@ -53,7 +53,8 @@ public:
|
||||||
|
|
||||||
MessageQueue* getMessageQueue() { return m_messageQueue; }
|
MessageQueue* getMessageQueue() { return m_messageQueue; }
|
||||||
|
|
||||||
void addDemodCreateAction(QAction* action);
|
void addChannelCreateAction(QAction* action);
|
||||||
|
void addChannelRollup(QWidget* widget);
|
||||||
void addViewAction(QAction* action);
|
void addViewAction(QAction* action);
|
||||||
|
|
||||||
void addChannelMarker(ChannelMarker* channelMarker);
|
void addChannelMarker(ChannelMarker* channelMarker);
|
||||||
|
@ -67,7 +68,7 @@ private:
|
||||||
PItem
|
PItem
|
||||||
};
|
};
|
||||||
|
|
||||||
Ui::MainWindow *ui;
|
Ui::MainWindow* ui;
|
||||||
|
|
||||||
AudioDeviceInfo* m_audioDeviceInfo;
|
AudioDeviceInfo* m_audioDeviceInfo;
|
||||||
|
|
||||||
|
|
|
@ -37,8 +37,10 @@ public:
|
||||||
|
|
||||||
const Plugins& getPlugins() const { return m_plugins; }
|
const Plugins& getPlugins() const { return m_plugins; }
|
||||||
|
|
||||||
void registerDemodulator(const QString& demodName, PluginInterface* plugin, QAction* action);
|
void registerChannel(const QString& channelName, PluginInterface* plugin, QAction* action);
|
||||||
void registerDemodulatorInstance(const QString& demodName, PluginGUI* pluginGUI);
|
void registerChannelInstance(const QString& channelName, PluginGUI* pluginGUI);
|
||||||
|
void addChannelRollup(QWidget* pluginGUI);
|
||||||
|
void removeChannelInstance(PluginGUI* pluginGUI);
|
||||||
|
|
||||||
void registerSampleSource(const QString& sourceName, PluginInterface* plugin);
|
void registerSampleSource(const QString& sourceName, PluginInterface* plugin);
|
||||||
|
|
||||||
|
@ -54,33 +56,30 @@ public:
|
||||||
int selectSampleSource(int index);
|
int selectSampleSource(int index);
|
||||||
int selectSampleSource(const QString& source);
|
int selectSampleSource(const QString& source);
|
||||||
|
|
||||||
private slots:
|
|
||||||
void demodInstanceDestroyed(QObject* object);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct DemodRegistration {
|
struct ChannelRegistration {
|
||||||
QString m_demodName;
|
QString m_channelName;
|
||||||
PluginInterface* m_plugin;
|
PluginInterface* m_plugin;
|
||||||
DemodRegistration(const QString& demodName, PluginInterface* plugin) :
|
ChannelRegistration(const QString& channelName, PluginInterface* plugin) :
|
||||||
m_demodName(demodName),
|
m_channelName(channelName),
|
||||||
m_plugin(plugin)
|
m_plugin(plugin)
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
typedef QList<DemodRegistration> DemodRegistrations;
|
typedef QList<ChannelRegistration> ChannelRegistrations;
|
||||||
|
|
||||||
struct DemodInstanceRegistration {
|
struct ChannelInstanceRegistration {
|
||||||
QString m_demodName;
|
QString m_channelName;
|
||||||
PluginGUI* m_gui;
|
PluginGUI* m_gui;
|
||||||
DemodInstanceRegistration() :
|
ChannelInstanceRegistration() :
|
||||||
m_demodName(),
|
m_channelName(),
|
||||||
m_gui(NULL)
|
m_gui(NULL)
|
||||||
{ }
|
{ }
|
||||||
DemodInstanceRegistration(const QString& demodName, PluginGUI* pluginGUI) :
|
ChannelInstanceRegistration(const QString& channelName, PluginGUI* pluginGUI) :
|
||||||
m_demodName(demodName),
|
m_channelName(channelName),
|
||||||
m_gui(pluginGUI)
|
m_gui(pluginGUI)
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
typedef QList<DemodInstanceRegistration> DemodInstanceRegistrations;
|
typedef QList<ChannelInstanceRegistration> ChannelInstanceRegistrations;
|
||||||
|
|
||||||
struct SampleSourceRegistration {
|
struct SampleSourceRegistration {
|
||||||
QString m_sourceName;
|
QString m_sourceName;
|
||||||
|
@ -112,8 +111,8 @@ private:
|
||||||
DSPEngine* m_dspEngine;
|
DSPEngine* m_dspEngine;
|
||||||
Plugins m_plugins;
|
Plugins m_plugins;
|
||||||
|
|
||||||
DemodRegistrations m_demodRegistrations;
|
ChannelRegistrations m_channelRegistrations;
|
||||||
DemodInstanceRegistrations m_demodInstanceRegistrations;
|
ChannelInstanceRegistrations m_channelInstanceRegistrations;
|
||||||
SampleSourceRegistrations m_sampleSourceRegistrations;
|
SampleSourceRegistrations m_sampleSourceRegistrations;
|
||||||
SampleSourceDevices m_sampleSourceDevices;
|
SampleSourceDevices m_sampleSourceDevices;
|
||||||
|
|
||||||
|
@ -121,7 +120,7 @@ private:
|
||||||
PluginGUI* m_sampleSourceInstance;
|
PluginGUI* m_sampleSourceInstance;
|
||||||
|
|
||||||
void loadPlugins(const QDir& dir);
|
void loadPlugins(const QDir& dir);
|
||||||
void renameDemodInstances();
|
void renameChannelInstances();
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline bool operator<(const PluginManager::Plugin& a, const PluginManager::Plugin& b)
|
static inline bool operator<(const PluginManager::Plugin& a, const PluginManager::Plugin& b)
|
||||||
|
|
|
@ -7,16 +7,16 @@
|
||||||
|
|
||||||
class Preset {
|
class Preset {
|
||||||
public:
|
public:
|
||||||
struct DemodConfig {
|
struct ChannelConfig {
|
||||||
QString m_demod;
|
QString m_channel;
|
||||||
QByteArray m_config;
|
QByteArray m_config;
|
||||||
|
|
||||||
DemodConfig(const QString& demod, const QByteArray& config) :
|
ChannelConfig(const QString& channel, const QByteArray& config) :
|
||||||
m_demod(demod),
|
m_channel(channel),
|
||||||
m_config(config)
|
m_config(config)
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
typedef QList<DemodConfig> DemodConfigs;
|
typedef QList<ChannelConfig> ChannelConfigs;
|
||||||
|
|
||||||
Preset();
|
Preset();
|
||||||
|
|
||||||
|
@ -49,10 +49,10 @@ public:
|
||||||
void setScopeConfig(const QByteArray& data) { m_scopeConfig = data; }
|
void setScopeConfig(const QByteArray& data) { m_scopeConfig = data; }
|
||||||
const QByteArray& getScopeConfig() const { return m_scopeConfig; }
|
const QByteArray& getScopeConfig() const { return m_scopeConfig; }
|
||||||
|
|
||||||
void clearDemods() { m_demodConfigs.clear(); }
|
void clearChannels() { m_channelConfigs.clear(); }
|
||||||
void addDemod(const QString& demod, const QByteArray& config) { m_demodConfigs.append(DemodConfig(demod, config)); }
|
void addChannel(const QString& channel, const QByteArray& config) { m_channelConfigs.append(ChannelConfig(channel, config)); }
|
||||||
int getDemodCount() const { return m_demodConfigs.count(); }
|
int getChannelCount() const { return m_channelConfigs.count(); }
|
||||||
const DemodConfig& getDemodConfig(int index) const { return m_demodConfigs.at(index); }
|
const ChannelConfig& getChannelConfig(int index) const { return m_channelConfigs.at(index); }
|
||||||
|
|
||||||
void setSourceConfig(const QString& source, const QByteArray& generalConfig, const QByteArray& config)
|
void setSourceConfig(const QString& source, const QByteArray& generalConfig, const QByteArray& config)
|
||||||
{
|
{
|
||||||
|
@ -86,8 +86,8 @@ protected:
|
||||||
QByteArray m_sourceGeneralConfig;
|
QByteArray m_sourceGeneralConfig;
|
||||||
QByteArray m_sourceConfig;
|
QByteArray m_sourceConfig;
|
||||||
|
|
||||||
// demodulators and configurations
|
// channels and configurations
|
||||||
DemodConfigs m_demodConfigs;
|
ChannelConfigs m_channelConfigs;
|
||||||
|
|
||||||
// screen and dock layout
|
// screen and dock layout
|
||||||
QByteArray m_layout;
|
QByteArray m_layout;
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
#ifndef INCLUDE_DEMODWIDGET_H
|
||||||
|
#define INCLUDE_DEMODWIDGET_H
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
|
||||||
|
class RollupWidget : public QWidget {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
RollupWidget(QWidget* parent = NULL);
|
||||||
|
|
||||||
|
void addRollup(QWidget* rollup);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
//QWidgetList m_rollups;
|
||||||
|
|
||||||
|
int arrangeRollups();
|
||||||
|
|
||||||
|
void paintEvent(QPaintEvent*);
|
||||||
|
int paintRollup(QWidget* rollup, int pos, QPainter* p, bool last, const QColor& frame);
|
||||||
|
|
||||||
|
void resizeEvent(QResizeEvent* size);
|
||||||
|
void mousePressEvent(QMouseEvent* event);
|
||||||
|
|
||||||
|
bool eventFilter(QObject* object, QEvent* event);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // INCLUDE_DEMODWIDGET_H
|
|
@ -25,10 +25,13 @@ public:
|
||||||
// MainWindow access
|
// MainWindow access
|
||||||
QDockWidget* createMainWindowDock(Qt::DockWidgetArea dockWidgetArea, const QString& title);
|
QDockWidget* createMainWindowDock(Qt::DockWidgetArea dockWidgetArea, const QString& title);
|
||||||
MessageQueue* getMainWindowMessageQueue();
|
MessageQueue* getMainWindowMessageQueue();
|
||||||
|
void setInputGUI(QWidget* inputGUI);
|
||||||
|
|
||||||
// Demodulator stuff
|
// Channel stuff
|
||||||
void registerDemodulator(const QString& demodName, PluginInterface* plugin, QAction* action);
|
void registerChannel(const QString& channelName, PluginInterface* plugin, QAction* action);
|
||||||
void registerDemodulatorInstance(const QString& demodName, PluginGUI* pluginGUI);
|
void registerChannelInstance(const QString& channelName, PluginGUI* pluginGUI);
|
||||||
|
void addChannelRollup(QWidget* pluginGUI);
|
||||||
|
void removeChannelInstance(PluginGUI* pluginGUI);
|
||||||
|
|
||||||
void addChannelMarker(ChannelMarker* channelMarker);
|
void addChannelMarker(ChannelMarker* channelMarker);
|
||||||
void removeChannelMarker(ChannelMarker* channelMarker);
|
void removeChannelMarker(ChannelMarker* channelMarker);
|
||||||
|
|
|
@ -6,14 +6,12 @@
|
||||||
|
|
||||||
class Message;
|
class Message;
|
||||||
|
|
||||||
class SDRANGELOVE_API PluginGUI : public QWidget {
|
class SDRANGELOVE_API PluginGUI {
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PluginGUI(QWidget* parent = NULL);
|
PluginGUI() { };
|
||||||
virtual void destroy() = 0;
|
virtual void destroy() = 0;
|
||||||
|
|
||||||
virtual void setWidgetName(const QString& name);
|
virtual void setName(const QString& name) = 0;
|
||||||
|
|
||||||
virtual void resetToDefaults() = 0;
|
virtual void resetToDefaults() = 0;
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,7 @@ public:
|
||||||
virtual const PluginDescriptor& getPluginDescriptor() const = 0;
|
virtual const PluginDescriptor& getPluginDescriptor() const = 0;
|
||||||
virtual void initPlugin(PluginAPI* pluginAPI) = 0;
|
virtual void initPlugin(PluginAPI* pluginAPI) = 0;
|
||||||
|
|
||||||
virtual PluginGUI* createDemod(const QString& demodName) { return NULL; }
|
virtual PluginGUI* createChannel(const QString& channelName) { return NULL; }
|
||||||
|
|
||||||
virtual SampleSourceDevices enumSampleSources() { return SampleSourceDevices(); }
|
virtual SampleSourceDevices enumSampleSources() { return SampleSourceDevices(); }
|
||||||
virtual PluginGUI* createSampleSource(const QString& sourceName, const QByteArray& address) { return NULL; }
|
virtual PluginGUI* createSampleSource(const QString& sourceName, const QByteArray& address) { return NULL; }
|
||||||
|
|
60
main.cpp
60
main.cpp
|
@ -19,37 +19,73 @@
|
||||||
#include <QTextCodec>
|
#include <QTextCodec>
|
||||||
#include <QProxyStyle>
|
#include <QProxyStyle>
|
||||||
#include <QStyleFactory>
|
#include <QStyleFactory>
|
||||||
|
#include <QFontDatabase>
|
||||||
#include "mainwindow.h"
|
#include "mainwindow.h"
|
||||||
|
|
||||||
static int runQtApplication(int argc, char* argv[])
|
static int runQtApplication(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
QApplication a(argc, argv);
|
QApplication a(argc, argv);
|
||||||
|
/*
|
||||||
/*QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
|
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
|
||||||
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));*/
|
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
|
||||||
|
*/
|
||||||
QCoreApplication::setOrganizationName("osmocom");
|
QCoreApplication::setOrganizationName("osmocom");
|
||||||
QCoreApplication::setApplicationName("SDRangelove");
|
QCoreApplication::setApplicationName("SDRangelove");
|
||||||
|
|
||||||
//QApplication::setStyle(new QProxyStyle());
|
#if 1
|
||||||
#if 0
|
|
||||||
qApp->setStyle(QStyleFactory::create("fusion"));
|
qApp->setStyle(QStyleFactory::create("fusion"));
|
||||||
|
|
||||||
QPalette palette;
|
QPalette palette;
|
||||||
palette.setColor(QPalette::Window, QColor(53,53,53));
|
palette.setColor(QPalette::Window, QColor(53,53,53));
|
||||||
palette.setColor(QPalette::WindowText, Qt::white);
|
palette.setColor(QPalette::WindowText, Qt::white);
|
||||||
palette.setColor(QPalette::Base, QColor(15,15,15));
|
palette.setColor(QPalette::Base, QColor(25,25,25));
|
||||||
palette.setColor(QPalette::AlternateBase, QColor(53,53,53));
|
palette.setColor(QPalette::AlternateBase, QColor(53,53,53));
|
||||||
palette.setColor(QPalette::ToolTipBase, Qt::white);
|
palette.setColor(QPalette::ToolTipBase, Qt::white);
|
||||||
palette.setColor(QPalette::ToolTipText, Qt::white);
|
palette.setColor(QPalette::ToolTipText, Qt::black);
|
||||||
palette.setColor(QPalette::Text, Qt::white);
|
palette.setColor(QPalette::Text, Qt::white);
|
||||||
palette.setColor(QPalette::Button, QColor(53,53,53));
|
palette.setColor(QPalette::Button, QColor(0x40, 0x40, 0x40));
|
||||||
palette.setColor(QPalette::ButtonText, Qt::white);
|
palette.setColor(QPalette::ButtonText, Qt::white);
|
||||||
palette.setColor(QPalette::BrightText, Qt::red);
|
palette.setColor(QPalette::BrightText, Qt::red);
|
||||||
|
|
||||||
palette.setColor(QPalette::Highlight, QColor(142,45,197).lighter());
|
palette.setColor(QPalette::Light, QColor(53,53,53).lighter(125).lighter());
|
||||||
|
palette.setColor(QPalette::Mid, QColor(53,53,53).lighter(125));
|
||||||
|
palette.setColor(QPalette::Dark, QColor(53,53,53).lighter(125).darker());
|
||||||
|
|
||||||
|
palette.setColor(QPalette::Link, QColor(0,0xa0,0xa0));
|
||||||
|
palette.setColor(QPalette::LinkVisited, QColor(0,0xa0,0xa0).lighter());
|
||||||
|
palette.setColor(QPalette::Highlight, QColor(0xff, 0x8c, 0x00));
|
||||||
palette.setColor(QPalette::HighlightedText, Qt::black);
|
palette.setColor(QPalette::HighlightedText, Qt::black);
|
||||||
qApp->setPalette(palette);
|
qApp->setPalette(palette);
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
if(QFontDatabase::addApplicationFont("/tmp/Cuprum.otf") >= 0) {
|
||||||
|
QFont font("CuprumFFU");
|
||||||
|
font.setPointSize(10);
|
||||||
|
qApp->setFont(font);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if 0
|
||||||
|
if(QFontDatabase::addApplicationFont("/tmp/PTN57F.ttf") >= 0) {
|
||||||
|
QFont font("PT Sans Narrow");
|
||||||
|
font.setPointSize(10);
|
||||||
|
qApp->setFont(font);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if 0
|
||||||
|
if(QFontDatabase::addApplicationFont("/tmp/PTS55F.ttf") >= 0) {
|
||||||
|
QFont font("PT Sans");
|
||||||
|
font.setPointSize(10);
|
||||||
|
qApp->setFont(font);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if 0
|
||||||
|
{
|
||||||
|
QFont font("Ubuntu Condensed");
|
||||||
|
font.setPointSize(10);
|
||||||
|
qApp->setFont(font);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
MainWindow w;
|
MainWindow w;
|
||||||
w.show();
|
w.show();
|
||||||
|
@ -59,5 +95,7 @@ static int runQtApplication(int argc, char* argv[])
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
return runQtApplication(argc, argv);
|
int res = runQtApplication(argc, argv);
|
||||||
|
qDebug("regular program exit");
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
project(demod)
|
project(demod)
|
||||||
|
|
||||||
add_subdirectory(nfm)
|
#add_subdirectory(nfm)
|
||||||
add_subdirectory(tetra)
|
add_subdirectory(tcpsrc)
|
||||||
|
#add_subdirectory(tetra)
|
||||||
|
|
|
@ -58,8 +58,6 @@ void NFMDemod::configure(MessageQueue* messageQueue, Real rfBandwidth, Real afBa
|
||||||
|
|
||||||
void NFMDemod::feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool firstOfBurst)
|
void NFMDemod::feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool firstOfBurst)
|
||||||
{
|
{
|
||||||
size_t count = end - begin;
|
|
||||||
|
|
||||||
Complex ci;
|
Complex ci;
|
||||||
bool consumed;
|
bool consumed;
|
||||||
|
|
||||||
|
@ -74,7 +72,7 @@ void NFMDemod::feed(SampleVector::const_iterator begin, SampleVector::const_iter
|
||||||
m_movingAverage.feed(ci.real() * ci.real() + ci.imag() * ci.imag());
|
m_movingAverage.feed(ci.real() * ci.real() + ci.imag() * ci.imag());
|
||||||
|
|
||||||
if(m_movingAverage.average() >= m_squelchLevel)
|
if(m_movingAverage.average() >= m_squelchLevel)
|
||||||
m_squelchState = m_sampleRate / 100;
|
m_squelchState = m_sampleRate / 50;
|
||||||
|
|
||||||
if(m_squelchState > 0) {
|
if(m_squelchState > 0) {
|
||||||
m_squelchState--;
|
m_squelchState--;
|
||||||
|
@ -89,8 +87,11 @@ void NFMDemod::feed(SampleVector::const_iterator begin, SampleVector::const_iter
|
||||||
m_audioBuffer[m_audioBufferFill].r = sample;
|
m_audioBuffer[m_audioBufferFill].r = sample;
|
||||||
++m_audioBufferFill;
|
++m_audioBufferFill;
|
||||||
if(m_audioBufferFill >= m_audioBuffer.size()) {
|
if(m_audioBufferFill >= m_audioBuffer.size()) {
|
||||||
if(m_audioFifo->write((const quint8*)&m_audioBuffer[0], m_audioBufferFill, 0) != m_audioBufferFill)
|
uint res = m_audioFifo->write((const quint8*)&m_audioBuffer[0], m_audioBufferFill, 1);
|
||||||
;//qDebug("lost samples");
|
/*
|
||||||
|
if(res != m_audioBufferFill)
|
||||||
|
qDebug("lost %u samples", m_audioBufferFill - res);
|
||||||
|
*/
|
||||||
m_audioBufferFill = 0;
|
m_audioBufferFill = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -139,7 +139,7 @@ NFMDemodGUI::NFMDemodGUI(PluginAPI* pluginAPI, QDockWidget* dockWidget, QWidget*
|
||||||
ui->glSpectrum->setCenterFrequency(0);
|
ui->glSpectrum->setCenterFrequency(0);
|
||||||
ui->glSpectrum->setSampleRate(44100);
|
ui->glSpectrum->setSampleRate(44100);
|
||||||
ui->glSpectrum->setDisplayWaterfall(true);
|
ui->glSpectrum->setDisplayWaterfall(true);
|
||||||
ui->glSpectrum->setDisplayLiveSpectrum(true);
|
ui->glSpectrum->setDisplayMaxHold(true);
|
||||||
m_spectrumVis->configure(m_threadedSampleSink->getMessageQueue(), 64, 10, FFTWindow::BlackmanHarris);
|
m_spectrumVis->configure(m_threadedSampleSink->getMessageQueue(), 64, 10, FFTWindow::BlackmanHarris);
|
||||||
|
|
||||||
m_channelMarker = new ChannelMarker(this);
|
m_channelMarker = new ChannelMarker(this);
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
project(tcpsrc)
|
||||||
|
|
||||||
|
set(tcpsrc_SOURCES
|
||||||
|
tcpsrc.cpp
|
||||||
|
tcpsrcgui.cpp
|
||||||
|
tcpsrcplugin.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
set(tcpsrc_HEADERS
|
||||||
|
tcpsrc.h
|
||||||
|
tcpsrcgui.h
|
||||||
|
tcpsrcplugin.h
|
||||||
|
)
|
||||||
|
|
||||||
|
set(tcpsrc_FORMS
|
||||||
|
tcpsrcgui.ui
|
||||||
|
)
|
||||||
|
|
||||||
|
include_directories(
|
||||||
|
.
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}
|
||||||
|
${CMAKE_SOURCE_DIR}/include
|
||||||
|
${CMAKE_SOURCE_DIR}/include-gpl
|
||||||
|
${OPENGL_INCLUDE_DIR}
|
||||||
|
)
|
||||||
|
|
||||||
|
#include(${QT_USE_FILE})
|
||||||
|
add_definitions(${QT_DEFINITIONS})
|
||||||
|
add_definitions(-DQT_PLUGIN)
|
||||||
|
add_definitions(-DQT_SHARED)
|
||||||
|
|
||||||
|
#qt5_wrap_cpp(tcpsrc_HEADERS_MOC ${tcpsrc_HEADERS})
|
||||||
|
qt5_wrap_ui(tcpsrc_FORMS_HEADERS ${tcpsrc_FORMS})
|
||||||
|
|
||||||
|
add_library(demodtcpsrc SHARED
|
||||||
|
${tcpsrc_SOURCES}
|
||||||
|
${tcpsrc_HEADERS_MOC}
|
||||||
|
${tcpsrc_FORMS_HEADERS}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(demodtcpsrc
|
||||||
|
${QT_LIBRARIES}
|
||||||
|
${OPENGL_LIBRARIES}
|
||||||
|
sdrbase
|
||||||
|
)
|
||||||
|
|
||||||
|
qt5_use_modules(demodtcpsrc Core Widgets OpenGL Network)
|
|
@ -0,0 +1,82 @@
|
||||||
|
#include "tcpsrc.h"
|
||||||
|
#include "dsp/dspcommands.h"
|
||||||
|
|
||||||
|
MessageRegistrator TCPSrc::MsgConfigureTCPSrc::ID("MsgConfigureTCPSrc");
|
||||||
|
|
||||||
|
TCPSrc::TCPSrc(SampleSink* spectrum)
|
||||||
|
{
|
||||||
|
m_inputSampleRate = 100000;
|
||||||
|
m_sampleFormat = 0;
|
||||||
|
m_outputSampleRate = 50000;
|
||||||
|
m_rfBandwidth = 50000;
|
||||||
|
m_tcpPort = 9999;
|
||||||
|
m_nco.setFreq(0, m_inputSampleRate);
|
||||||
|
m_interpolator.create(16, m_inputSampleRate, m_rfBandwidth / 2.1);
|
||||||
|
m_sampleDistanceRemain = m_inputSampleRate / m_outputSampleRate;
|
||||||
|
m_spectrum = spectrum;
|
||||||
|
}
|
||||||
|
|
||||||
|
TCPSrc::~TCPSrc()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void TCPSrc::configure(MessageQueue* messageQueue, int sampleFormat, Real outputSampleRate, Real rfBandwidth, int tcpPort)
|
||||||
|
{
|
||||||
|
Message* cmd = MsgConfigureTCPSrc::create(sampleFormat, outputSampleRate, rfBandwidth, tcpPort);
|
||||||
|
cmd->submit(messageQueue, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TCPSrc::feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool firstOfBurst)
|
||||||
|
{
|
||||||
|
Complex ci;
|
||||||
|
bool consumed;
|
||||||
|
|
||||||
|
for(SampleVector::const_iterator it = begin; it < end; ++it) {
|
||||||
|
Complex c(it->real() / 32768.0, it->imag() / 32768.0);
|
||||||
|
c *= m_nco.nextIQ();
|
||||||
|
|
||||||
|
consumed = false;
|
||||||
|
if(m_interpolator.interpolate(&m_sampleDistanceRemain, c, &consumed, &ci)) {
|
||||||
|
m_sampleBuffer.push_back(Sample(ci.real() * 32768.0, ci.imag() * 32768.0));
|
||||||
|
m_sampleDistanceRemain += m_inputSampleRate / m_outputSampleRate;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(m_spectrum != NULL)
|
||||||
|
m_spectrum->feed(m_sampleBuffer.begin(), m_sampleBuffer.end(), firstOfBurst);
|
||||||
|
m_sampleBuffer.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TCPSrc::start()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void TCPSrc::stop()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TCPSrc::handleMessage(Message* cmd)
|
||||||
|
{
|
||||||
|
if(cmd->id() == DSPSignalNotification::ID()) {
|
||||||
|
DSPSignalNotification* signal = (DSPSignalNotification*)cmd;
|
||||||
|
qDebug("%d samples/sec, %lld Hz offset", signal->getSampleRate(), signal->getFrequencyOffset());
|
||||||
|
m_inputSampleRate = signal->getSampleRate();
|
||||||
|
m_nco.setFreq(-signal->getFrequencyOffset(), m_inputSampleRate);
|
||||||
|
m_interpolator.create(16, m_inputSampleRate, m_rfBandwidth / 2.1);
|
||||||
|
m_sampleDistanceRemain = m_inputSampleRate / m_outputSampleRate;
|
||||||
|
cmd->completed();
|
||||||
|
return true;
|
||||||
|
} else if(cmd->id() == MsgConfigureTCPSrc::ID()) {
|
||||||
|
MsgConfigureTCPSrc* cfg = (MsgConfigureTCPSrc*)cmd;
|
||||||
|
m_sampleFormat = cfg->getSampleFormat();
|
||||||
|
m_outputSampleRate = cfg->getOutputSampleRate();
|
||||||
|
m_rfBandwidth = cfg->getRFBandwidth();
|
||||||
|
m_tcpPort = cfg->getTCPPort();
|
||||||
|
m_interpolator.create(16, m_inputSampleRate, m_rfBandwidth / 2.1);
|
||||||
|
m_sampleDistanceRemain = m_inputSampleRate / m_outputSampleRate;
|
||||||
|
cmd->completed();
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,66 @@
|
||||||
|
#ifndef INCLUDE_TCPSRC_H
|
||||||
|
#define INCLUDE_TCPSRC_H
|
||||||
|
|
||||||
|
#include "dsp/samplesink.h"
|
||||||
|
#include "dsp/nco.h"
|
||||||
|
#include "dsp/interpolator.h"
|
||||||
|
#include "util/message.h"
|
||||||
|
|
||||||
|
class TCPSrc : public SampleSink {
|
||||||
|
public:
|
||||||
|
TCPSrc(SampleSink* spectrum);
|
||||||
|
~TCPSrc();
|
||||||
|
|
||||||
|
void configure(MessageQueue* messageQueue, int sampleFormat, Real outputSampleRate, Real rfBandwidth, int tcpPort);
|
||||||
|
|
||||||
|
void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool firstOfBurst);
|
||||||
|
void start();
|
||||||
|
void stop();
|
||||||
|
bool handleMessage(Message* cmd);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
class MsgConfigureTCPSrc : public Message {
|
||||||
|
public:
|
||||||
|
static MessageRegistrator ID;
|
||||||
|
|
||||||
|
int getSampleFormat() const { return m_sampleFormat; }
|
||||||
|
Real getOutputSampleRate() const { return m_outputSampleRate; }
|
||||||
|
Real getRFBandwidth() const { return m_rfBandwidth; }
|
||||||
|
int getTCPPort() const { return m_tcpPort; }
|
||||||
|
|
||||||
|
static MsgConfigureTCPSrc* create(int sampleFormat, Real sampleRate, Real rfBandwidth, int tcpPort)
|
||||||
|
{
|
||||||
|
return new MsgConfigureTCPSrc(sampleFormat, sampleRate, rfBandwidth, tcpPort);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
int m_sampleFormat;
|
||||||
|
Real m_outputSampleRate;
|
||||||
|
Real m_rfBandwidth;
|
||||||
|
int m_tcpPort;
|
||||||
|
|
||||||
|
MsgConfigureTCPSrc(int sampleFormat, Real outputSampleRate, Real rfBandwidth, int tcpPort) :
|
||||||
|
Message(ID()),
|
||||||
|
m_sampleFormat(sampleFormat),
|
||||||
|
m_outputSampleRate(outputSampleRate),
|
||||||
|
m_rfBandwidth(rfBandwidth),
|
||||||
|
m_tcpPort(tcpPort)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
int m_inputSampleRate;
|
||||||
|
|
||||||
|
int m_sampleFormat;
|
||||||
|
Real m_outputSampleRate;
|
||||||
|
Real m_rfBandwidth;
|
||||||
|
int m_tcpPort;
|
||||||
|
|
||||||
|
NCO m_nco;
|
||||||
|
Interpolator m_interpolator;
|
||||||
|
Real m_sampleDistanceRemain;
|
||||||
|
|
||||||
|
SampleVector m_sampleBuffer;
|
||||||
|
SampleSink* m_spectrum;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // INCLUDE_TCPSRC_H
|
|
@ -0,0 +1,147 @@
|
||||||
|
#include "tcpsrcgui.h"
|
||||||
|
#include "plugin/pluginapi.h"
|
||||||
|
#include "tcpsrc.h"
|
||||||
|
#include "dsp/channelizer.h"
|
||||||
|
#include "dsp/spectrumvis.h"
|
||||||
|
#include "dsp/threadedsamplesink.h"
|
||||||
|
#include "ui_tcpsrcgui.h"
|
||||||
|
|
||||||
|
TCPSrcGUI* TCPSrcGUI::create(PluginAPI* pluginAPI)
|
||||||
|
{
|
||||||
|
TCPSrcGUI* gui = new TCPSrcGUI(pluginAPI);
|
||||||
|
return gui;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TCPSrcGUI::destroy()
|
||||||
|
{
|
||||||
|
delete this;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TCPSrcGUI::setName(const QString& name)
|
||||||
|
{
|
||||||
|
setObjectName(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TCPSrcGUI::resetToDefaults()
|
||||||
|
{
|
||||||
|
ui->sampleFormat->setCurrentIndex(0);
|
||||||
|
ui->sampleRate->setText("25000");
|
||||||
|
ui->rfBandwidth->setText("20000");
|
||||||
|
ui->tcpPort->setText("9999");
|
||||||
|
applySettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
QByteArray TCPSrcGUI::serialize() const
|
||||||
|
{
|
||||||
|
return QByteArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TCPSrcGUI::deserialize(const QByteArray& data)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TCPSrcGUI::handleMessage(Message* message)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TCPSrcGUI::channelMarkerChanged()
|
||||||
|
{
|
||||||
|
applySettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
TCPSrcGUI::TCPSrcGUI(PluginAPI* pluginAPI, QWidget* parent) :
|
||||||
|
RollupWidget(parent),
|
||||||
|
ui(new Ui::TCPSrcGUI),
|
||||||
|
m_pluginAPI(pluginAPI)
|
||||||
|
{
|
||||||
|
ui->setupUi(this);
|
||||||
|
setAttribute(Qt::WA_DeleteOnClose, true);
|
||||||
|
|
||||||
|
m_spectrumVis = new SpectrumVis(ui->glSpectrum);
|
||||||
|
m_tcpSrc = new TCPSrc(m_spectrumVis);
|
||||||
|
m_channelizer = new Channelizer(m_tcpSrc);
|
||||||
|
m_threadedSampleSink = new ThreadedSampleSink(m_channelizer);
|
||||||
|
m_pluginAPI->addSampleSink(m_threadedSampleSink);
|
||||||
|
|
||||||
|
ui->glSpectrum->setCenterFrequency(0);
|
||||||
|
ui->glSpectrum->setSampleRate(ui->sampleRate->text().toInt());
|
||||||
|
ui->glSpectrum->setDisplayWaterfall(true);
|
||||||
|
ui->glSpectrum->setDisplayMaxHold(true);
|
||||||
|
m_spectrumVis->configure(m_threadedSampleSink->getMessageQueue(), 64, 10, FFTWindow::BlackmanHarris);
|
||||||
|
|
||||||
|
m_channelMarker = new ChannelMarker(this);
|
||||||
|
m_channelMarker->setColor(Qt::red);
|
||||||
|
m_channelMarker->setBandwidth(25000);
|
||||||
|
m_channelMarker->setCenterFrequency(0);
|
||||||
|
m_channelMarker->setVisible(true);
|
||||||
|
connect(m_channelMarker, SIGNAL(changed()), this, SLOT(channelMarkerChanged()));
|
||||||
|
m_pluginAPI->addChannelMarker(m_channelMarker);
|
||||||
|
|
||||||
|
applySettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
TCPSrcGUI::~TCPSrcGUI()
|
||||||
|
{
|
||||||
|
m_pluginAPI->removeChannelInstance(this);
|
||||||
|
delete ui;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TCPSrcGUI::applySettings()
|
||||||
|
{
|
||||||
|
bool ok;
|
||||||
|
|
||||||
|
Real outputSampleRate = ui->sampleRate->text().toDouble(&ok);
|
||||||
|
if((!ok) || (outputSampleRate < 100))
|
||||||
|
outputSampleRate = 25000;
|
||||||
|
Real rfBandwidth = ui->rfBandwidth->text().toDouble(&ok);
|
||||||
|
if((!ok) || (rfBandwidth > outputSampleRate))
|
||||||
|
rfBandwidth = outputSampleRate / 1.05;
|
||||||
|
int tcpPort = ui->tcpPort->text().toInt(&ok);
|
||||||
|
if((!ok) || (tcpPort < 1) || (tcpPort > 65535))
|
||||||
|
tcpPort = 9999;
|
||||||
|
|
||||||
|
ui->sampleRate->setText(QString("%1").arg(outputSampleRate, 0));
|
||||||
|
ui->rfBandwidth->setText(QString("%1").arg(rfBandwidth, 0));
|
||||||
|
ui->tcpPort->setText(QString("%1").arg(tcpPort));
|
||||||
|
m_channelMarker->setBandwidth(rfBandwidth);
|
||||||
|
ui->glSpectrum->setSampleRate(outputSampleRate);
|
||||||
|
|
||||||
|
m_channelizer->configure(m_threadedSampleSink->getMessageQueue(),
|
||||||
|
outputSampleRate,
|
||||||
|
m_channelMarker->getCenterFrequency());
|
||||||
|
|
||||||
|
m_tcpSrc->configure(m_threadedSampleSink->getMessageQueue(),
|
||||||
|
ui->sampleFormat->currentIndex(),
|
||||||
|
outputSampleRate,
|
||||||
|
rfBandwidth,
|
||||||
|
tcpPort);
|
||||||
|
|
||||||
|
ui->applyBtn->setEnabled(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TCPSrcGUI::on_sampleFormat_currentIndexChanged(int index)
|
||||||
|
{
|
||||||
|
ui->applyBtn->setEnabled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TCPSrcGUI::on_sampleRate_textEdited(const QString& arg1)
|
||||||
|
{
|
||||||
|
ui->applyBtn->setEnabled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TCPSrcGUI::on_rfBandwidth_textEdited(const QString& arg1)
|
||||||
|
{
|
||||||
|
ui->applyBtn->setEnabled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TCPSrcGUI::on_tcpPort_textEdited(const QString& arg1)
|
||||||
|
{
|
||||||
|
ui->applyBtn->setEnabled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TCPSrcGUI::on_applyBtn_clicked()
|
||||||
|
{
|
||||||
|
applySettings();
|
||||||
|
}
|
|
@ -0,0 +1,59 @@
|
||||||
|
#ifndef INCLUDE_TCPSRCGUI_H
|
||||||
|
#define INCLUDE_TCPSRCGUI_H
|
||||||
|
|
||||||
|
#include "gui/rollupwidget.h"
|
||||||
|
#include "plugin/plugingui.h"
|
||||||
|
|
||||||
|
class PluginAPI;
|
||||||
|
class ChannelMarker;
|
||||||
|
class ThreadedSampleSink;
|
||||||
|
class Channelizer;
|
||||||
|
class TCPSrc;
|
||||||
|
class SpectrumVis;
|
||||||
|
|
||||||
|
namespace Ui {
|
||||||
|
class TCPSrcGUI;
|
||||||
|
}
|
||||||
|
|
||||||
|
class TCPSrcGUI : public RollupWidget, public PluginGUI {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
static TCPSrcGUI* create(PluginAPI* pluginAPI);
|
||||||
|
void destroy();
|
||||||
|
|
||||||
|
void setName(const QString& name);
|
||||||
|
|
||||||
|
void resetToDefaults();
|
||||||
|
QByteArray serialize() const;
|
||||||
|
bool deserialize(const QByteArray& data);
|
||||||
|
|
||||||
|
bool handleMessage(Message* message);
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void channelMarkerChanged();
|
||||||
|
void on_sampleFormat_currentIndexChanged(int index);
|
||||||
|
void on_sampleRate_textEdited(const QString& arg1);
|
||||||
|
void on_rfBandwidth_textEdited(const QString& arg1);
|
||||||
|
void on_tcpPort_textEdited(const QString& arg1);
|
||||||
|
|
||||||
|
void on_applyBtn_clicked();
|
||||||
|
|
||||||
|
private:
|
||||||
|
Ui::TCPSrcGUI* ui;
|
||||||
|
PluginAPI* m_pluginAPI;
|
||||||
|
ChannelMarker* m_channelMarker;
|
||||||
|
|
||||||
|
// RF path
|
||||||
|
ThreadedSampleSink* m_threadedSampleSink;
|
||||||
|
Channelizer* m_channelizer;
|
||||||
|
TCPSrc* m_tcpSrc;
|
||||||
|
SpectrumVis* m_spectrumVis;
|
||||||
|
|
||||||
|
explicit TCPSrcGUI(PluginAPI* pluginAPI, QWidget* parent = NULL);
|
||||||
|
~TCPSrcGUI();
|
||||||
|
|
||||||
|
void applySettings();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // INCLUDE_TCPSRCGUI_H
|
|
@ -0,0 +1,198 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>TCPSrcGUI</class>
|
||||||
|
<widget class="RollupWidget" name="TCPSrcGUI">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>400</width>
|
||||||
|
<height>443</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>TCP Sample Source</string>
|
||||||
|
</property>
|
||||||
|
<widget class="QWidget" name="widget" native="true">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>10</x>
|
||||||
|
<y>5</y>
|
||||||
|
<width>201</width>
|
||||||
|
<height>142</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Settings</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
|
<property name="margin">
|
||||||
|
<number>2</number>
|
||||||
|
</property>
|
||||||
|
<property name="spacing">
|
||||||
|
<number>3</number>
|
||||||
|
</property>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QLabel" name="label">
|
||||||
|
<property name="text">
|
||||||
|
<string>Sample Format</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="1">
|
||||||
|
<widget class="QLineEdit" name="tcpPort">
|
||||||
|
<property name="text">
|
||||||
|
<string>9999</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
|
<widget class="QLabel" name="label_3">
|
||||||
|
<property name="text">
|
||||||
|
<string>RF Bandwidth</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QLineEdit" name="sampleRate">
|
||||||
|
<property name="text">
|
||||||
|
<string>25000</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="1">
|
||||||
|
<widget class="QLineEdit" name="rfBandwidth">
|
||||||
|
<property name="text">
|
||||||
|
<string>20000</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QLabel" name="label_2">
|
||||||
|
<property name="text">
|
||||||
|
<string>Samplerate</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0">
|
||||||
|
<widget class="QLabel" name="label_4">
|
||||||
|
<property name="text">
|
||||||
|
<string>TCP Port</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QComboBox" name="sampleFormat">
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>S8 I/Q</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>S16LE I/Q</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="1">
|
||||||
|
<widget class="QPushButton" name="applyBtn">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Apply</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QWidget" name="widget_3" native="true">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>15</x>
|
||||||
|
<y>160</y>
|
||||||
|
<width>231</width>
|
||||||
|
<height>156</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Channel Spectrum</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||||
|
<property name="spacing">
|
||||||
|
<number>3</number>
|
||||||
|
</property>
|
||||||
|
<property name="margin">
|
||||||
|
<number>2</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="GLSpectrum" name="glSpectrum" native="true"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QWidget" name="widget_2" native="true">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>15</x>
|
||||||
|
<y>330</y>
|
||||||
|
<width>274</width>
|
||||||
|
<height>101</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Connected Clients</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<property name="spacing">
|
||||||
|
<number>3</number>
|
||||||
|
</property>
|
||||||
|
<property name="margin">
|
||||||
|
<number>2</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QTreeWidget" name="treeWidget">
|
||||||
|
<property name="rootIsDecorated">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="itemsExpandable">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<attribute name="headerVisible">
|
||||||
|
<bool>false</bool>
|
||||||
|
</attribute>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>IP:Port</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
<customwidgets>
|
||||||
|
<customwidget>
|
||||||
|
<class>RollupWidget</class>
|
||||||
|
<extends>QWidget</extends>
|
||||||
|
<header>gui/rollupwidget.h</header>
|
||||||
|
<container>1</container>
|
||||||
|
</customwidget>
|
||||||
|
<customwidget>
|
||||||
|
<class>GLSpectrum</class>
|
||||||
|
<extends>QWidget</extends>
|
||||||
|
<header>gui/glspectrum.h</header>
|
||||||
|
<container>1</container>
|
||||||
|
</customwidget>
|
||||||
|
</customwidgets>
|
||||||
|
<tabstops>
|
||||||
|
<tabstop>sampleFormat</tabstop>
|
||||||
|
<tabstop>sampleRate</tabstop>
|
||||||
|
<tabstop>rfBandwidth</tabstop>
|
||||||
|
<tabstop>tcpPort</tabstop>
|
||||||
|
<tabstop>applyBtn</tabstop>
|
||||||
|
<tabstop>treeWidget</tabstop>
|
||||||
|
</tabstops>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
|
@ -0,0 +1,55 @@
|
||||||
|
#include <QtPlugin>
|
||||||
|
#include <QAction>
|
||||||
|
#include "plugin/pluginapi.h"
|
||||||
|
#include "tcpsrcplugin.h"
|
||||||
|
#include "tcpsrcgui.h"
|
||||||
|
|
||||||
|
const PluginDescriptor TCPSrcPlugin::m_pluginDescriptor = {
|
||||||
|
QString("TCP Channel Source"),
|
||||||
|
QString("---"),
|
||||||
|
QString("(c) maintech GmbH (written by Christian Daniel)"),
|
||||||
|
QString("http://www.maintech.de"),
|
||||||
|
true,
|
||||||
|
QString("http://www.maintech.de")
|
||||||
|
};
|
||||||
|
|
||||||
|
TCPSrcPlugin::TCPSrcPlugin(QObject* parent) :
|
||||||
|
QObject(parent)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
const PluginDescriptor& TCPSrcPlugin::getPluginDescriptor() const
|
||||||
|
{
|
||||||
|
return m_pluginDescriptor;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TCPSrcPlugin::initPlugin(PluginAPI* pluginAPI)
|
||||||
|
{
|
||||||
|
m_pluginAPI = pluginAPI;
|
||||||
|
|
||||||
|
// register TCP Channel Source
|
||||||
|
QAction* action = new QAction(tr("&TCP Source"), this);
|
||||||
|
connect(action, SIGNAL(triggered()), this, SLOT(createInstanceTCPSrc()));
|
||||||
|
m_pluginAPI->registerChannel("de.maintech.sdrangelove.channel.tcpsrc", this, action);
|
||||||
|
}
|
||||||
|
|
||||||
|
PluginGUI* TCPSrcPlugin::createChannel(const QString& channelName)
|
||||||
|
{
|
||||||
|
if(channelName == "de.maintech.sdrangelove.channel.tcpsrc") {
|
||||||
|
TCPSrcGUI* gui = TCPSrcGUI::create(m_pluginAPI);
|
||||||
|
m_pluginAPI->registerChannelInstance("de.maintech.sdrangelove.channel.tcpsrc", gui);
|
||||||
|
m_pluginAPI->addChannelRollup(gui);
|
||||||
|
return gui;
|
||||||
|
} else {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TCPSrcPlugin::createInstanceTCPSrc()
|
||||||
|
{
|
||||||
|
TCPSrcGUI* gui = TCPSrcGUI::create(m_pluginAPI);
|
||||||
|
m_pluginAPI->registerChannelInstance("de.maintech.sdrangelove.channel.tcpsrc", gui);
|
||||||
|
m_pluginAPI->addChannelRollup(gui);
|
||||||
|
//m_pluginAPI->registerChannelInstance("de.maintech.sdrangelove.channel.tcpsrc", TCPSrcGUI::create(m_pluginAPI));
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
#ifndef INCLUDE_TCPSRCPLUGIN_H
|
||||||
|
#define INCLUDE_TCPSRCPLUGIN_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include "plugin/plugininterface.h"
|
||||||
|
|
||||||
|
class TCPSrcPlugin : public QObject, PluginInterface {
|
||||||
|
Q_OBJECT
|
||||||
|
Q_INTERFACES(PluginInterface)
|
||||||
|
Q_PLUGIN_METADATA(IID "de.maintech.sdrangelove.demod.tcpsrc")
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit TCPSrcPlugin(QObject* parent = NULL);
|
||||||
|
|
||||||
|
const PluginDescriptor& getPluginDescriptor() const;
|
||||||
|
void initPlugin(PluginAPI* pluginAPI);
|
||||||
|
|
||||||
|
PluginGUI* createChannel(const QString& channelName);
|
||||||
|
|
||||||
|
private:
|
||||||
|
static const PluginDescriptor m_pluginDescriptor;
|
||||||
|
|
||||||
|
PluginAPI* m_pluginAPI;
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void createInstanceTCPSrc();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // INCLUDE_TCPSRCPLUGIN_H
|
|
@ -79,7 +79,7 @@ TetraDemodGUI::TetraDemodGUI(PluginAPI* pluginAPI, QDockWidget* dockWidget, QWid
|
||||||
ui->glSpectrum->setCenterFrequency(0);
|
ui->glSpectrum->setCenterFrequency(0);
|
||||||
ui->glSpectrum->setSampleRate(36000);
|
ui->glSpectrum->setSampleRate(36000);
|
||||||
ui->glSpectrum->setDisplayWaterfall(true);
|
ui->glSpectrum->setDisplayWaterfall(true);
|
||||||
ui->glSpectrum->setDisplayLiveSpectrum(true);
|
ui->glSpectrum->setDisplayMaxHold(true);
|
||||||
m_spectrumVis->configure(m_threadedSampleSink->getMessageQueue(), 64, 10, FFTWindow::BlackmanHarris);
|
m_spectrumVis->configure(m_threadedSampleSink->getMessageQueue(), 64, 10, FFTWindow::BlackmanHarris);
|
||||||
|
|
||||||
m_channelMarker = new ChannelMarker(this);
|
m_channelMarker = new ChannelMarker(this);
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
#include "plugin/pluginapi.h"
|
#include "plugin/pluginapi.h"
|
||||||
|
|
||||||
OsmoSDRGui::OsmoSDRGui(PluginAPI* pluginAPI, QWidget* parent) :
|
OsmoSDRGui::OsmoSDRGui(PluginAPI* pluginAPI, QWidget* parent) :
|
||||||
PluginGUI(parent),
|
QWidget(parent),
|
||||||
ui(new Ui::OsmoSDRGui),
|
ui(new Ui::OsmoSDRGui),
|
||||||
m_pluginAPI(pluginAPI),
|
m_pluginAPI(pluginAPI),
|
||||||
m_settings(),
|
m_settings(),
|
||||||
|
@ -28,6 +28,11 @@ void OsmoSDRGui::destroy()
|
||||||
delete this;
|
delete this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OsmoSDRGui::setName(const QString& name)
|
||||||
|
{
|
||||||
|
setObjectName(name);
|
||||||
|
}
|
||||||
|
|
||||||
void OsmoSDRGui::resetToDefaults()
|
void OsmoSDRGui::resetToDefaults()
|
||||||
{
|
{
|
||||||
m_generalSettings.resetToDefaults();
|
m_generalSettings.resetToDefaults();
|
||||||
|
|
|
@ -11,7 +11,7 @@ namespace Ui {
|
||||||
class OsmoSDRGui;
|
class OsmoSDRGui;
|
||||||
}
|
}
|
||||||
|
|
||||||
class OsmoSDRGui : public PluginGUI {
|
class OsmoSDRGui : public QWidget, public PluginGUI {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -19,6 +19,8 @@ public:
|
||||||
~OsmoSDRGui();
|
~OsmoSDRGui();
|
||||||
void destroy();
|
void destroy();
|
||||||
|
|
||||||
|
void setName(const QString& name);
|
||||||
|
|
||||||
void resetToDefaults();
|
void resetToDefaults();
|
||||||
QByteArray serializeGeneral() const;
|
QByteArray serializeGeneral() const;
|
||||||
bool deserializeGeneral(const QByteArray&data);
|
bool deserializeGeneral(const QByteArray&data);
|
||||||
|
@ -28,14 +30,6 @@ public:
|
||||||
bool handleMessage(Message* message);
|
bool handleMessage(Message* message);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/*
|
|
||||||
Ui::OsmoSDRGui* ui;
|
|
||||||
|
|
||||||
MessageQueue* m_msgQueue;
|
|
||||||
OsmoSDRInput::Settings m_settings;
|
|
||||||
QTimer m_updateTimer;
|
|
||||||
*/
|
|
||||||
|
|
||||||
Ui::OsmoSDRGui* ui;
|
Ui::OsmoSDRGui* ui;
|
||||||
|
|
||||||
PluginAPI* m_pluginAPI;
|
PluginAPI* m_pluginAPI;
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>253</width>
|
<width>253</width>
|
||||||
<height>224</height>
|
<height>229</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
|
@ -118,10 +118,7 @@
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="tickPosition">
|
<property name="tickPosition">
|
||||||
<enum>QSlider::TicksAbove</enum>
|
<enum>QSlider::TicksBelow</enum>
|
||||||
</property>
|
|
||||||
<property name="tickInterval">
|
|
||||||
<number>1</number>
|
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|
|
@ -48,17 +48,21 @@ PluginInterface::SampleSourceDevices OsmoSDRPlugin::enumSampleSources()
|
||||||
if(osmosdr_get_device_usb_strings(i, vendor, product, serial) != 0)
|
if(osmosdr_get_device_usb_strings(i, vendor, product, serial) != 0)
|
||||||
continue;
|
continue;
|
||||||
QString displayedName(QString("OsmoSDR #%1 (#%2)").arg(i + 1).arg(serial));
|
QString displayedName(QString("OsmoSDR #%1 (#%2)").arg(i + 1).arg(serial));
|
||||||
|
qDebug("found %s", qPrintable(displayedName));
|
||||||
SimpleSerializer s(1);
|
SimpleSerializer s(1);
|
||||||
s.writeS32(1, i);
|
s.writeS32(1, i);
|
||||||
result.append(SampleSourceDevice(displayedName, "org.osmocom.sdr.samplesource.osmo-sdr", s.final()));
|
result.append(SampleSourceDevice(displayedName, "org.osmocom.sdr.samplesource.osmo-sdr", s.final()));
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
PluginGUI* OsmoSDRPlugin::createSampleSource(const QString& sourceName, const QByteArray& address)
|
PluginGUI* OsmoSDRPlugin::createSampleSource(const QString& sourceName, const QByteArray& address)
|
||||||
{
|
{
|
||||||
if(sourceName == "org.osmocom.sdr.samplesource.osmo-sdr") {
|
if(sourceName == "org.osmocom.sdr.samplesource.osmo-sdr") {
|
||||||
return new OsmoSDRGui(m_pluginAPI);
|
OsmoSDRGui* gui = new OsmoSDRGui(m_pluginAPI);
|
||||||
|
m_pluginAPI->setInputGUI(gui);
|
||||||
|
return gui;
|
||||||
} else {
|
} else {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
#include "plugin/pluginapi.h"
|
#include "plugin/pluginapi.h"
|
||||||
|
|
||||||
RTLSDRGui::RTLSDRGui(PluginAPI* pluginAPI, QWidget* parent) :
|
RTLSDRGui::RTLSDRGui(PluginAPI* pluginAPI, QWidget* parent) :
|
||||||
PluginGUI(parent),
|
QWidget(parent),
|
||||||
ui(new Ui::RTLSDRGui),
|
ui(new Ui::RTLSDRGui),
|
||||||
m_pluginAPI(pluginAPI),
|
m_pluginAPI(pluginAPI),
|
||||||
m_settings(),
|
m_settings(),
|
||||||
|
@ -28,6 +28,11 @@ void RTLSDRGui::destroy()
|
||||||
delete this;
|
delete this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RTLSDRGui::setName(const QString& name)
|
||||||
|
{
|
||||||
|
setObjectName(name);
|
||||||
|
}
|
||||||
|
|
||||||
void RTLSDRGui::resetToDefaults()
|
void RTLSDRGui::resetToDefaults()
|
||||||
{
|
{
|
||||||
m_generalSettings.resetToDefaults();
|
m_generalSettings.resetToDefaults();
|
||||||
|
|
|
@ -11,7 +11,7 @@ namespace Ui {
|
||||||
class RTLSDRGui;
|
class RTLSDRGui;
|
||||||
}
|
}
|
||||||
|
|
||||||
class RTLSDRGui : public PluginGUI {
|
class RTLSDRGui : public QWidget, public PluginGUI {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -19,6 +19,8 @@ public:
|
||||||
~RTLSDRGui();
|
~RTLSDRGui();
|
||||||
void destroy();
|
void destroy();
|
||||||
|
|
||||||
|
void setName(const QString& name);
|
||||||
|
|
||||||
void resetToDefaults();
|
void resetToDefaults();
|
||||||
QByteArray serializeGeneral() const;
|
QByteArray serializeGeneral() const;
|
||||||
bool deserializeGeneral(const QByteArray&data);
|
bool deserializeGeneral(const QByteArray&data);
|
||||||
|
|
|
@ -58,7 +58,9 @@ PluginInterface::SampleSourceDevices RTLSDRPlugin::enumSampleSources()
|
||||||
PluginGUI* RTLSDRPlugin::createSampleSource(const QString& sourceName, const QByteArray& address)
|
PluginGUI* RTLSDRPlugin::createSampleSource(const QString& sourceName, const QByteArray& address)
|
||||||
{
|
{
|
||||||
if(sourceName == "org.osmocom.sdr.samplesource.rtl-sdr") {
|
if(sourceName == "org.osmocom.sdr.samplesource.rtl-sdr") {
|
||||||
return new RTLSDRGui(m_pluginAPI);
|
RTLSDRGui* gui = new RTLSDRGui(m_pluginAPI);
|
||||||
|
m_pluginAPI->setInputGUI(gui);
|
||||||
|
return gui;
|
||||||
} else {
|
} else {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,8 +6,8 @@
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>476</width>
|
<width>484</width>
|
||||||
<height>499</height>
|
<height>503</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
|
@ -78,19 +78,15 @@
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_2">
|
<widget class="QLabel" name="label_2">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
<string><p>Copyright (C) 2013 maintech GmbH, Otto-Hahn-Str. 15, 97204 Höchberg, Germany<br>
|
||||||
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
|
Written by Christian Daniel.</p>
|
||||||
p, li { white-space: pre-wrap; }
|
<p>Many thanks to the osmocom developer team - especially horizon, Hoernchen &amp; tnt.</p>
|
||||||
</style></head><body style=" font-family:'Ubuntu'; font-size:8pt; font-weight:400; font-style:normal;">
|
<p>SDRangelove itself is licensed as "GPL2+" with the added exception, that plugins using only header files from the "include"-subdirectory and not from the "include-gpl"-subdirectory do not count as derived works.</p>
|
||||||
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Copyright (C) 2012 maintech GmbH, Otto-Hahn-Str. 15, 97204 Höchberg, Germany<br />Written by Christian Daniel.</p>
|
<p>The following rules apply to the SDRangelove main application and libsdrbase:<br>
|
||||||
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Many thanks to the osmocom developer team - especially horizon, Hoernchen &amp; tnt.</p>
|
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; either version 2 of the License, or (at your option) any later version.
|
||||||
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">SDRangelove itself is licensed as &quot;GPL2+&quot; with the added exception, that plugins using only header files from the &quot;include&quot;-subdirectory and not from the &quot;include-gpl&quot;-subdirectory do not count as derived works.</p>
|
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.
|
||||||
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The following rules apply to the SDRangelove main application and libsdrbase:</p>
|
You should have received a copy of the GNU General Public License along with this program. If not, see <a href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>.</p>
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">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; either version 2 of the License, or (at your option) any later version.</p>
|
<p>For the license of installed plugins, look into the plugin list.</p></string>
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">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.</p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You should have received a copy of the GNU General Public License along with this program. If not, see <a href="http://www.gnu.org/licenses/"><span style=" text-decoration: underline; color:#502878;">http://www.gnu.org/licenses/</span></a></p>
|
|
||||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; text-decoration: underline; color:#502878;"><br /></p>
|
|
||||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">For the license of installed plugins, look into the plugin list.</p></body></html></string>
|
|
||||||
</property>
|
</property>
|
||||||
<property name="wordWrap">
|
<property name="wordWrap">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
#include <QPainter>
|
||||||
|
#include "gui/buttonswitch.h"
|
||||||
|
|
||||||
|
ButtonSwitch::ButtonSwitch(QWidget* parent) :
|
||||||
|
QToolButton(parent)
|
||||||
|
{
|
||||||
|
setCheckable(true);
|
||||||
|
m_originalPalette = palette();
|
||||||
|
connect(this, SIGNAL(toggled(bool)), this, SLOT(onToggled(bool)));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ButtonSwitch::onToggled(bool checked)
|
||||||
|
{
|
||||||
|
if(checked) {
|
||||||
|
QPalette p = m_originalPalette;
|
||||||
|
p.setColor(QPalette::Button, QColor(0x80, 0x46, 0x00));
|
||||||
|
setPalette(p);
|
||||||
|
} else {
|
||||||
|
setPalette(m_originalPalette);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
#include <QBoxLayout>
|
||||||
|
#include <QSpacerItem>
|
||||||
|
#include <QPainter>
|
||||||
|
#include <QResizeEvent>
|
||||||
|
#include "gui/channelwindow.h"
|
||||||
|
#include "gui/rollupwidget.h"
|
||||||
|
|
||||||
|
ChannelWindow::ChannelWindow(QWidget* parent) :
|
||||||
|
QScrollArea(parent)
|
||||||
|
{
|
||||||
|
m_container = new QWidget(this);
|
||||||
|
m_layout = new QBoxLayout(QBoxLayout::TopToBottom, m_container);
|
||||||
|
setWidget(m_container);
|
||||||
|
setWidgetResizable(true);
|
||||||
|
setBackgroundRole(QPalette::Base);
|
||||||
|
m_layout->setMargin(3);
|
||||||
|
m_layout->setSpacing(3);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChannelWindow::addRollupWidget(QWidget* rollupWidget)
|
||||||
|
{
|
||||||
|
rollupWidget->setParent(m_container);
|
||||||
|
m_container->layout()->addWidget(rollupWidget);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChannelWindow::resizeEvent(QResizeEvent* event)
|
||||||
|
{
|
||||||
|
if(event->size().height() > event->size().width()) {
|
||||||
|
m_layout->setDirection(QBoxLayout::TopToBottom);
|
||||||
|
m_layout->setAlignment(Qt::AlignTop);
|
||||||
|
} else {
|
||||||
|
m_layout->setDirection(QBoxLayout::LeftToRight);
|
||||||
|
m_layout->setAlignment(Qt::AlignLeft);
|
||||||
|
}
|
||||||
|
QScrollArea::resizeEvent(event);
|
||||||
|
}
|
|
@ -419,6 +419,22 @@ void GLScope::handleMode()
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case ModeCyclostationary: {
|
||||||
|
if(m_rawTrace.size() > 2) {
|
||||||
|
m_mathTrace.resize(m_rawTrace.size() - 2);
|
||||||
|
std::vector<Complex>::iterator dst = m_mathTrace.begin();
|
||||||
|
for(uint i = 2; i < m_rawTrace.size() ; i++)
|
||||||
|
*dst++ = Complex(abs(m_rawTrace[i] - conj(m_rawTrace[i - 1])), 0);
|
||||||
|
m_displayTrace = &m_mathTrace;
|
||||||
|
m_amp1 = m_amp;
|
||||||
|
m_amp2 = m_amp;
|
||||||
|
m_ofs1 = -1.0 / m_amp1;
|
||||||
|
m_ofs2 = 0.0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,8 +29,7 @@ GLSpectrum::GLSpectrum(QWidget* parent) :
|
||||||
m_sampleRate(500000),
|
m_sampleRate(500000),
|
||||||
m_fftSize(512),
|
m_fftSize(512),
|
||||||
m_invertedWaterfall(false),
|
m_invertedWaterfall(false),
|
||||||
m_displayLiveSpectrum(false),
|
m_displayMaxHold(false),
|
||||||
m_liveSpectrumChanged(false),
|
|
||||||
m_leftMarginTextureAllocated(false),
|
m_leftMarginTextureAllocated(false),
|
||||||
m_frequencyTextureAllocated(false),
|
m_frequencyTextureAllocated(false),
|
||||||
m_waterfallBuffer(NULL),
|
m_waterfallBuffer(NULL),
|
||||||
|
@ -51,7 +50,7 @@ GLSpectrum::GLSpectrum(QWidget* parent) :
|
||||||
|
|
||||||
setMinimumSize(200, 200);
|
setMinimumSize(200, 200);
|
||||||
|
|
||||||
m_waterfallShare = 0.5;
|
m_waterfallShare = 0.66;
|
||||||
|
|
||||||
for(int i = 0; i <= 239; i++) {
|
for(int i = 0; i <= 239; i++) {
|
||||||
QColor c;
|
QColor c;
|
||||||
|
@ -182,9 +181,9 @@ void GLSpectrum::setInvertedWaterfall(bool inv)
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLSpectrum::setDisplayLiveSpectrum(bool display)
|
void GLSpectrum::setDisplayMaxHold(bool display)
|
||||||
{
|
{
|
||||||
m_displayLiveSpectrum = display;
|
m_displayMaxHold = display;
|
||||||
m_changesPending = true;
|
m_changesPending = true;
|
||||||
stopDrag();
|
stopDrag();
|
||||||
update();
|
update();
|
||||||
|
@ -245,11 +244,6 @@ void GLSpectrum::newSpectrum(const std::vector<Real>& spectrum, int fftSize)
|
||||||
|
|
||||||
updateWaterfall(spectrum);
|
updateWaterfall(spectrum);
|
||||||
updateHistogram(spectrum);
|
updateHistogram(spectrum);
|
||||||
|
|
||||||
if(!m_liveSpectrumChanged) {
|
|
||||||
std::copy(spectrum.begin(), spectrum.begin() + m_fftSize, m_liveSpectrum.begin());
|
|
||||||
m_liveSpectrumChanged = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLSpectrum::updateWaterfall(const std::vector<Real>& spectrum)
|
void GLSpectrum::updateWaterfall(const std::vector<Real>& spectrum)
|
||||||
|
@ -440,7 +434,7 @@ void GLSpectrum::paintGL()
|
||||||
}
|
}
|
||||||
|
|
||||||
// paint histogram
|
// paint histogram
|
||||||
if(m_displayHistogram || m_displayLiveSpectrum) {
|
if(m_displayHistogram || m_displayMaxHold) {
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glTranslatef(m_glHistogramRect.x(), m_glHistogramRect.y(), 0);
|
glTranslatef(m_glHistogramRect.x(), m_glHistogramRect.y(), 0);
|
||||||
glScalef(m_glHistogramRect.width(), m_glHistogramRect.height(), 1);
|
glScalef(m_glHistogramRect.width(), m_glHistogramRect.height(), 1);
|
||||||
|
@ -522,7 +516,7 @@ void GLSpectrum::paintGL()
|
||||||
}
|
}
|
||||||
|
|
||||||
// paint left scales (time and power)
|
// paint left scales (time and power)
|
||||||
if(m_displayWaterfall || m_displayLiveSpectrum || m_displayHistogram ) {
|
if(m_displayWaterfall || m_displayMaxHold || m_displayHistogram ) {
|
||||||
glBindTexture(GL_TEXTURE_2D, m_leftMarginTexture);
|
glBindTexture(GL_TEXTURE_2D, m_leftMarginTexture);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
@ -549,7 +543,7 @@ void GLSpectrum::paintGL()
|
||||||
}
|
}
|
||||||
|
|
||||||
// paint frequency scale
|
// paint frequency scale
|
||||||
if(m_displayWaterfall || m_displayLiveSpectrum || m_displayHistogram ) {
|
if(m_displayWaterfall || m_displayMaxHold || m_displayHistogram ) {
|
||||||
glBindTexture(GL_TEXTURE_2D, m_frequencyTexture);
|
glBindTexture(GL_TEXTURE_2D, m_frequencyTexture);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
@ -575,10 +569,48 @@ void GLSpectrum::paintGL()
|
||||||
glEnd();
|
glEnd();
|
||||||
glDisable(GL_TEXTURE_2D);
|
glDisable(GL_TEXTURE_2D);
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
|
|
||||||
|
// paint channels
|
||||||
|
glPushMatrix();
|
||||||
|
glTranslatef(m_glWaterfallRect.x(), m_glFrequencyScaleRect.y(), 0);
|
||||||
|
glScalef(m_glWaterfallRect.width(), m_glFrequencyScaleRect.height(), 1);
|
||||||
|
for(int i = 0; i < m_channelMarkerStates.size(); ++i) {
|
||||||
|
ChannelMarkerState* dv = m_channelMarkerStates[i];
|
||||||
|
if(dv->m_channelMarker->getVisible()) {
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
|
glColor4f(dv->m_channelMarker->getColor().redF(), dv->m_channelMarker->getColor().greenF(), dv->m_channelMarker->getColor().blueF(), 0.3f);
|
||||||
|
glPushMatrix();
|
||||||
|
glTranslatef(dv->m_glRect.x(), dv->m_glRect.y(), 0);
|
||||||
|
glScalef(dv->m_glRect.width(), dv->m_glRect.height(), 1);
|
||||||
|
glBegin(GL_QUADS);
|
||||||
|
glVertex2f(0, 0);
|
||||||
|
glVertex2f(1, 0);
|
||||||
|
glVertex2f(1, 1);
|
||||||
|
glVertex2f(0, 1);
|
||||||
|
glEnd();
|
||||||
|
glDisable(GL_BLEND);
|
||||||
|
glPopMatrix();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
glPopMatrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
// paint live spectrum lines on top of histogram
|
// paint max hold lines on top of histogram
|
||||||
if(m_displayLiveSpectrum) {
|
if(m_displayMaxHold) {
|
||||||
|
if(m_maxHold.size() < m_fftSize)
|
||||||
|
m_maxHold.resize(m_fftSize);
|
||||||
|
for(int i = 0; i < m_fftSize; i++) {
|
||||||
|
int j;
|
||||||
|
quint8* bs = m_histogram + i * 100;
|
||||||
|
for(j = 99; j > 0; j--) {
|
||||||
|
if(bs[j] > 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
j = j - 99;
|
||||||
|
m_maxHold[i] = (j * m_powerRange) / 99.0 + m_referenceLevel;
|
||||||
|
}
|
||||||
|
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glTranslatef(m_glHistogramRect.x(), m_glHistogramRect.y(), 0);
|
glTranslatef(m_glHistogramRect.x(), m_glHistogramRect.y(), 0);
|
||||||
glScalef(m_glHistogramRect.width() / (float)(m_fftSize - 1), -m_glHistogramRect.height() / m_powerRange, 1);
|
glScalef(m_glHistogramRect.width() / (float)(m_fftSize - 1), -m_glHistogramRect.height() / m_powerRange, 1);
|
||||||
|
@ -586,11 +618,11 @@ void GLSpectrum::paintGL()
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
glEnable(GL_LINE_SMOOTH);
|
glEnable(GL_LINE_SMOOTH);
|
||||||
glLineWidth(1.0f);
|
glLineWidth(1.0f);
|
||||||
glColor4f(1, 1, 1, 0.75f);
|
glColor3f(1, 0, 0);
|
||||||
Real bottom = -m_powerRange;
|
Real bottom = -m_powerRange;
|
||||||
glBegin(GL_LINE_STRIP);
|
glBegin(GL_LINE_STRIP);
|
||||||
for(int i = 0; i < m_fftSize; i++) {
|
for(int i = 0; i < m_fftSize; i++) {
|
||||||
Real v = m_liveSpectrum[i] - m_referenceLevel;
|
Real v = m_maxHold[i] - m_referenceLevel;
|
||||||
if(v > 0)
|
if(v > 0)
|
||||||
v = 0;
|
v = 0;
|
||||||
else if(v < bottom)
|
else if(v < bottom)
|
||||||
|
@ -601,7 +633,6 @@ void GLSpectrum::paintGL()
|
||||||
glDisable(GL_LINE_SMOOTH);
|
glDisable(GL_LINE_SMOOTH);
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
}
|
}
|
||||||
m_liveSpectrumChanged = false;
|
|
||||||
|
|
||||||
// paint waterfall grid
|
// paint waterfall grid
|
||||||
if(m_displayWaterfall) {
|
if(m_displayWaterfall) {
|
||||||
|
@ -649,7 +680,7 @@ void GLSpectrum::paintGL()
|
||||||
}
|
}
|
||||||
|
|
||||||
// paint histogram grid
|
// paint histogram grid
|
||||||
if(m_displayHistogram || m_displayLiveSpectrum) {
|
if(m_displayHistogram || m_displayMaxHold) {
|
||||||
glEnable(GL_BLEND);
|
glEnable(GL_BLEND);
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||||
glLineWidth(1.0f);
|
glLineWidth(1.0f);
|
||||||
|
@ -718,8 +749,6 @@ void GLSpectrum::applyChanges()
|
||||||
QFontMetrics fm(font());
|
QFontMetrics fm(font());
|
||||||
int M = fm.width("-");
|
int M = fm.width("-");
|
||||||
|
|
||||||
m_liveSpectrum.resize(m_fftSize);
|
|
||||||
|
|
||||||
int topMargin = fm.ascent() * 1.5;
|
int topMargin = fm.ascent() * 1.5;
|
||||||
int bottomMargin = fm.ascent() * 1.5;
|
int bottomMargin = fm.ascent() * 1.5;
|
||||||
|
|
||||||
|
@ -732,7 +761,7 @@ void GLSpectrum::applyChanges()
|
||||||
int leftMargin;
|
int leftMargin;
|
||||||
int rightMargin = fm.width("000");
|
int rightMargin = fm.width("000");
|
||||||
|
|
||||||
if(m_displayWaterfall && (m_displayHistogram | m_displayLiveSpectrum)) {
|
if(m_displayWaterfall && (m_displayHistogram | m_displayMaxHold)) {
|
||||||
waterfallHeight = height() * m_waterfallShare - 1;
|
waterfallHeight = height() * m_waterfallShare - 1;
|
||||||
if(waterfallHeight < 0)
|
if(waterfallHeight < 0)
|
||||||
waterfallHeight = 0;
|
waterfallHeight = 0;
|
||||||
|
@ -848,7 +877,7 @@ void GLSpectrum::applyChanges()
|
||||||
(float)(leftMargin - 1) / (float)width(),
|
(float)(leftMargin - 1) / (float)width(),
|
||||||
(float)1
|
(float)1
|
||||||
);
|
);
|
||||||
} else if(m_displayHistogram || m_displayLiveSpectrum) {
|
} else if(m_displayHistogram || m_displayMaxHold) {
|
||||||
bottomMargin = frequencyScaleHeight;
|
bottomMargin = frequencyScaleHeight;
|
||||||
frequencyScaleTop = height() - bottomMargin;
|
frequencyScaleTop = height() - bottomMargin;
|
||||||
histogramTop = topMargin - 1;
|
histogramTop = topMargin - 1;
|
||||||
|
@ -902,7 +931,7 @@ void GLSpectrum::applyChanges()
|
||||||
0,
|
0,
|
||||||
(dv->m_channelMarker->getBandwidth() / (float)m_sampleRate),
|
(dv->m_channelMarker->getBandwidth() / (float)m_sampleRate),
|
||||||
1);
|
1);
|
||||||
if(m_displayHistogram || m_displayLiveSpectrum || m_displayWaterfall) {
|
if(m_displayHistogram || m_displayMaxHold || m_displayWaterfall) {
|
||||||
dv->m_rect.setRect(m_frequencyScale.getPosFromValue(m_centerFrequency + dv->m_channelMarker->getCenterFrequency()) + leftMargin - 1,
|
dv->m_rect.setRect(m_frequencyScale.getPosFromValue(m_centerFrequency + dv->m_channelMarker->getCenterFrequency()) + leftMargin - 1,
|
||||||
topMargin,
|
topMargin,
|
||||||
5,
|
5,
|
||||||
|
@ -929,7 +958,7 @@ void GLSpectrum::applyChanges()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(m_displayHistogram || m_displayLiveSpectrum) {
|
if(m_displayHistogram || m_displayMaxHold) {
|
||||||
tickList = &m_powerScale.getTickList();
|
tickList = &m_powerScale.getTickList();
|
||||||
for(int i = 0; i < tickList->count(); i++) {
|
for(int i = 0; i < tickList->count(); i++) {
|
||||||
tick = &(*tickList)[i];
|
tick = &(*tickList)[i];
|
||||||
|
@ -950,13 +979,14 @@ void GLSpectrum::applyChanges()
|
||||||
m_leftMarginTextureAllocated = true;
|
m_leftMarginTextureAllocated = true;
|
||||||
}
|
}
|
||||||
// prepare frequency scale
|
// prepare frequency scale
|
||||||
if(m_displayWaterfall || m_displayHistogram || m_displayLiveSpectrum){
|
if(m_displayWaterfall || m_displayHistogram || m_displayMaxHold){
|
||||||
m_frequencyPixmap = QPixmap(width(), frequencyScaleHeight);
|
m_frequencyPixmap = QPixmap(width(), frequencyScaleHeight);
|
||||||
m_frequencyPixmap.fill(Qt::transparent);
|
m_frequencyPixmap.fill(Qt::transparent);
|
||||||
{
|
{
|
||||||
QPainter painter(&m_frequencyPixmap);
|
QPainter painter(&m_frequencyPixmap);
|
||||||
painter.setPen(Qt::NoPen);
|
painter.setPen(Qt::NoPen);
|
||||||
painter.setBrush(Qt::black);
|
painter.setBrush(Qt::black);
|
||||||
|
painter.setBrush(Qt::transparent);
|
||||||
painter.drawRect(leftMargin, 0, width() - leftMargin, frequencyScaleHeight);
|
painter.drawRect(leftMargin, 0, width() - leftMargin, frequencyScaleHeight);
|
||||||
painter.setPen(QColor(0xf0, 0xf0, 0xff));
|
painter.setPen(QColor(0xf0, 0xf0, 0xff));
|
||||||
const ScaleEngine::TickList* tickList = &m_frequencyScale.getTickList();
|
const ScaleEngine::TickList* tickList = &m_frequencyScale.getTickList();
|
||||||
|
@ -1056,7 +1086,7 @@ void GLSpectrum::applyChanges()
|
||||||
|
|
||||||
void GLSpectrum::mouseMoveEvent(QMouseEvent* event)
|
void GLSpectrum::mouseMoveEvent(QMouseEvent* event)
|
||||||
{
|
{
|
||||||
if(m_displayWaterfall && (m_displayWaterfall || m_displayHistogram || m_displayLiveSpectrum)) {
|
if(m_displayWaterfall && (m_displayWaterfall || m_displayHistogram || m_displayMaxHold)) {
|
||||||
if(m_frequencyScaleRect.contains(event->pos())) {
|
if(m_frequencyScaleRect.contains(event->pos())) {
|
||||||
if(m_cursorState == CSNormal) {
|
if(m_cursorState == CSNormal) {
|
||||||
setCursor(Qt::SizeVerCursor);
|
setCursor(Qt::SizeVerCursor);
|
||||||
|
@ -1090,7 +1120,7 @@ void GLSpectrum::mouseMoveEvent(QMouseEvent* event)
|
||||||
m_channelMarkerStates[m_cursorChannel]->m_channelMarker->setCenterFrequency(freq);
|
m_channelMarkerStates[m_cursorChannel]->m_channelMarker->setCenterFrequency(freq);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(m_displayWaterfall || m_displayHistogram || m_displayLiveSpectrum) {
|
if(m_displayWaterfall || m_displayHistogram || m_displayMaxHold) {
|
||||||
for(int i = 0; i < m_channelMarkerStates.size(); ++i) {
|
for(int i = 0; i < m_channelMarkerStates.size(); ++i) {
|
||||||
if(m_channelMarkerStates[i]->m_rect.contains(event->pos())) {
|
if(m_channelMarkerStates[i]->m_rect.contains(event->pos())) {
|
||||||
if(m_cursorState == CSNormal) {
|
if(m_cursorState == CSNormal) {
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
#include "dsp/fftwindow.h"
|
#include "dsp/fftwindow.h"
|
||||||
#include "dsp/spectrumvis.h"
|
#include "dsp/spectrumvis.h"
|
||||||
#include "gui/glspectrum.h"
|
#include "gui/glspectrum.h"
|
||||||
#include "ui_glspectrumgui.h"
|
|
||||||
#include "util/simpleserializer.h"
|
#include "util/simpleserializer.h"
|
||||||
|
#include "ui_glspectrumgui.h"
|
||||||
|
|
||||||
GLSpectrumGUI::GLSpectrumGUI(QWidget* parent) :
|
GLSpectrumGUI::GLSpectrumGUI(QWidget* parent) :
|
||||||
QWidget(parent),
|
QWidget(parent),
|
||||||
|
@ -18,7 +18,7 @@ GLSpectrumGUI::GLSpectrumGUI(QWidget* parent) :
|
||||||
m_powerRange(100),
|
m_powerRange(100),
|
||||||
m_displayWaterfall(true),
|
m_displayWaterfall(true),
|
||||||
m_invertedWaterfall(false),
|
m_invertedWaterfall(false),
|
||||||
m_displayLiveSpectrum(false),
|
m_displayMaxHold(false),
|
||||||
m_displayHistogram(true)
|
m_displayHistogram(true)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
@ -46,7 +46,7 @@ void GLSpectrumGUI::resetToDefaults()
|
||||||
m_powerRange = 100;
|
m_powerRange = 100;
|
||||||
m_displayWaterfall = true;
|
m_displayWaterfall = true;
|
||||||
m_invertedWaterfall = false;
|
m_invertedWaterfall = false;
|
||||||
m_displayLiveSpectrum = false;
|
m_displayMaxHold = false;
|
||||||
m_displayHistogram = true;
|
m_displayHistogram = true;
|
||||||
applySettings();
|
applySettings();
|
||||||
}
|
}
|
||||||
|
@ -61,7 +61,7 @@ QByteArray GLSpectrumGUI::serialize() const
|
||||||
s.writeReal(5, m_powerRange);
|
s.writeReal(5, m_powerRange);
|
||||||
s.writeBool(6, m_displayWaterfall);
|
s.writeBool(6, m_displayWaterfall);
|
||||||
s.writeBool(7, m_invertedWaterfall);
|
s.writeBool(7, m_invertedWaterfall);
|
||||||
s.writeBool(8, m_displayLiveSpectrum);
|
s.writeBool(8, m_displayMaxHold);
|
||||||
s.writeBool(9, m_displayHistogram);
|
s.writeBool(9, m_displayHistogram);
|
||||||
return s.final();
|
return s.final();
|
||||||
}
|
}
|
||||||
|
@ -83,7 +83,7 @@ bool GLSpectrumGUI::deserialize(const QByteArray& data)
|
||||||
d.readReal(5, &m_powerRange, 100);
|
d.readReal(5, &m_powerRange, 100);
|
||||||
d.readBool(6, &m_displayWaterfall, true);
|
d.readBool(6, &m_displayWaterfall, true);
|
||||||
d.readBool(7, &m_invertedWaterfall, false);
|
d.readBool(7, &m_invertedWaterfall, false);
|
||||||
d.readBool(8, &m_displayLiveSpectrum, false);
|
d.readBool(8, &m_displayMaxHold, false);
|
||||||
d.readBool(9, &m_displayHistogram, true);
|
d.readBool(9, &m_displayHistogram, true);
|
||||||
applySettings();
|
applySettings();
|
||||||
return true;
|
return true;
|
||||||
|
@ -105,8 +105,8 @@ void GLSpectrumGUI::applySettings()
|
||||||
ui->waterfall->setChecked(m_displayWaterfall);
|
ui->waterfall->setChecked(m_displayWaterfall);
|
||||||
m_glSpectrum->setDisplayWaterfall(m_displayWaterfall);
|
m_glSpectrum->setDisplayWaterfall(m_displayWaterfall);
|
||||||
m_glSpectrum->setInvertedWaterfall(m_invertedWaterfall);
|
m_glSpectrum->setInvertedWaterfall(m_invertedWaterfall);
|
||||||
ui->liveSpectrum->setChecked(m_displayLiveSpectrum);
|
ui->maxHold->setChecked(m_displayMaxHold);
|
||||||
m_glSpectrum->setDisplayLiveSpectrum(m_displayLiveSpectrum);
|
m_glSpectrum->setDisplayMaxHold(m_displayMaxHold);
|
||||||
ui->histogram->setChecked(m_displayHistogram);
|
ui->histogram->setChecked(m_displayHistogram);
|
||||||
m_glSpectrum->setDisplayHistogram(m_displayHistogram);
|
m_glSpectrum->setDisplayHistogram(m_displayHistogram);
|
||||||
ui->refLevel->setValue((int)(m_refLevel / 10.0));
|
ui->refLevel->setValue((int)(m_refLevel / 10.0));
|
||||||
|
@ -158,8 +158,8 @@ void GLSpectrumGUI::on_histogram_toggled(bool checked)
|
||||||
m_glSpectrum->setDisplayHistogram(m_displayHistogram);
|
m_glSpectrum->setDisplayHistogram(m_displayHistogram);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GLSpectrumGUI::on_liveSpectrum_toggled(bool checked)
|
void GLSpectrumGUI::on_maxHold_toggled(bool checked)
|
||||||
{
|
{
|
||||||
m_displayLiveSpectrum = checked;
|
m_displayMaxHold = checked;
|
||||||
m_glSpectrum->setDisplayLiveSpectrum(m_displayLiveSpectrum);
|
m_glSpectrum->setDisplayMaxHold(m_displayMaxHold);
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>203</width>
|
<width>203</width>
|
||||||
<height>136</height>
|
<height>137</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
|
@ -48,7 +48,7 @@
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="tickPosition">
|
<property name="tickPosition">
|
||||||
<enum>QSlider::TicksAbove</enum>
|
<enum>QSlider::TicksBelow</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="tickInterval">
|
<property name="tickInterval">
|
||||||
<number>1</number>
|
<number>1</number>
|
||||||
|
@ -85,7 +85,7 @@
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="4">
|
<item row="1" column="4">
|
||||||
<widget class="QToolButton" name="waterfall">
|
<widget class="ButtonSwitch" name="waterfall">
|
||||||
<property name="minimumSize">
|
<property name="minimumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>24</width>
|
<width>24</width>
|
||||||
|
@ -144,7 +144,7 @@
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="tickPosition">
|
<property name="tickPosition">
|
||||||
<enum>QSlider::TicksAbove</enum>
|
<enum>QSlider::TicksBelow</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="tickInterval">
|
<property name="tickInterval">
|
||||||
<number>1</number>
|
<number>1</number>
|
||||||
|
@ -174,7 +174,7 @@
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="2" column="4">
|
<item row="2" column="4">
|
||||||
<widget class="QToolButton" name="histogram">
|
<widget class="ButtonSwitch" name="histogram">
|
||||||
<property name="minimumSize">
|
<property name="minimumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>24</width>
|
<width>24</width>
|
||||||
|
@ -233,7 +233,7 @@
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="tickPosition">
|
<property name="tickPosition">
|
||||||
<enum>QSlider::TicksAbove</enum>
|
<enum>QSlider::TicksBelow</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="tickInterval">
|
<property name="tickInterval">
|
||||||
<number>10</number>
|
<number>10</number>
|
||||||
|
@ -263,7 +263,7 @@
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="4">
|
<item row="3" column="4">
|
||||||
<widget class="QToolButton" name="liveSpectrum">
|
<widget class="ButtonSwitch" name="maxHold">
|
||||||
<property name="minimumSize">
|
<property name="minimumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>24</width>
|
<width>24</width>
|
||||||
|
@ -278,7 +278,7 @@
|
||||||
</property>
|
</property>
|
||||||
<property name="icon">
|
<property name="icon">
|
||||||
<iconset resource="../resources/res.qrc">
|
<iconset resource="../resources/res.qrc">
|
||||||
<normaloff>:/livespectrum.png</normaloff>:/livespectrum.png</iconset>
|
<normaloff>:/maxhold.png</normaloff>:/maxhold.png</iconset>
|
||||||
</property>
|
</property>
|
||||||
<property name="iconSize">
|
<property name="iconSize">
|
||||||
<size>
|
<size>
|
||||||
|
@ -390,7 +390,7 @@
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="tickPosition">
|
<property name="tickPosition">
|
||||||
<enum>QSlider::TicksAbove</enum>
|
<enum>QSlider::TicksBelow</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="tickInterval">
|
<property name="tickInterval">
|
||||||
<number>1</number>
|
<number>1</number>
|
||||||
|
@ -401,6 +401,13 @@
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
|
<customwidgets>
|
||||||
|
<customwidget>
|
||||||
|
<class>ButtonSwitch</class>
|
||||||
|
<extends>QToolButton</extends>
|
||||||
|
<header>gui/buttonswitch.h</header>
|
||||||
|
</customwidget>
|
||||||
|
</customwidgets>
|
||||||
<tabstops>
|
<tabstops>
|
||||||
<tabstop>fftSize</tabstop>
|
<tabstop>fftSize</tabstop>
|
||||||
<tabstop>fftWindow</tabstop>
|
<tabstop>fftWindow</tabstop>
|
||||||
|
@ -409,7 +416,7 @@
|
||||||
<tabstop>decay</tabstop>
|
<tabstop>decay</tabstop>
|
||||||
<tabstop>waterfall</tabstop>
|
<tabstop>waterfall</tabstop>
|
||||||
<tabstop>histogram</tabstop>
|
<tabstop>histogram</tabstop>
|
||||||
<tabstop>liveSpectrum</tabstop>
|
<tabstop>maxHold</tabstop>
|
||||||
</tabstops>
|
</tabstops>
|
||||||
<resources>
|
<resources>
|
||||||
<include location="../resources/res.qrc"/>
|
<include location="../resources/res.qrc"/>
|
||||||
|
|
|
@ -42,6 +42,7 @@ Indicator::Indicator(const QString& text, QWidget* parent) :
|
||||||
setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
|
setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
|
||||||
|
|
||||||
QFont f = font();
|
QFont f = font();
|
||||||
|
f.setBold(true);
|
||||||
f.setPixelSize(8);
|
f.setPixelSize(8);
|
||||||
setFont(f);
|
setFont(f);
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
<item>
|
<item>
|
||||||
<widget class="QTabWidget" name="tabWidget">
|
<widget class="QTabWidget" name="tabWidget">
|
||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
<number>1</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="tab">
|
<widget class="QWidget" name="tab">
|
||||||
<attribute name="title">
|
<attribute name="title">
|
||||||
|
|
|
@ -0,0 +1,231 @@
|
||||||
|
#include <QEvent>
|
||||||
|
#include <QPainter>
|
||||||
|
#include <QMouseEvent>
|
||||||
|
#include "gui/rollupwidget.h"
|
||||||
|
#include "ui_glspectrumgui.h"
|
||||||
|
|
||||||
|
RollupWidget::RollupWidget(QWidget* parent) :
|
||||||
|
QWidget(parent)
|
||||||
|
{
|
||||||
|
setMinimumSize(250, 150);
|
||||||
|
setMaximumSize(400, 200);
|
||||||
|
setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
|
||||||
|
setBackgroundRole(QPalette::Window);
|
||||||
|
|
||||||
|
setAutoFillBackground(false);
|
||||||
|
setAttribute(Qt::WA_OpaquePaintEvent, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void RollupWidget::addRollup(QWidget* rollup)
|
||||||
|
{
|
||||||
|
rollup->setParent(this);
|
||||||
|
installEventFilter(rollup);
|
||||||
|
arrangeRollups();
|
||||||
|
repaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
int RollupWidget::arrangeRollups()
|
||||||
|
{
|
||||||
|
QFontMetrics fm(font());
|
||||||
|
int pos = fm.height() + 4;
|
||||||
|
|
||||||
|
for(int i = 0; i < children().count(); ++i) {
|
||||||
|
pos += fm.height() + 2;
|
||||||
|
QWidget* r = qobject_cast<QWidget*>(children()[i]);
|
||||||
|
if(r != NULL) {
|
||||||
|
if(!r->isHidden()) {
|
||||||
|
r->move(2, pos + 3);
|
||||||
|
int h = 0;
|
||||||
|
if(r->hasHeightForWidth())
|
||||||
|
h = r->heightForWidth(width() - 4);
|
||||||
|
else h = r->sizeHint().height();
|
||||||
|
r->resize(width() - 4, h);
|
||||||
|
pos += r->height() + 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setMinimumHeight(pos);
|
||||||
|
setMaximumHeight(pos);
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RollupWidget::paintEvent(QPaintEvent*)
|
||||||
|
{
|
||||||
|
QPainter p(this);
|
||||||
|
QColor frame = palette().highlight().color();
|
||||||
|
|
||||||
|
// Eigenbau
|
||||||
|
QFontMetrics fm(font());
|
||||||
|
|
||||||
|
p.setRenderHint(QPainter::Antialiasing, true);
|
||||||
|
|
||||||
|
// Ecken
|
||||||
|
p.setPen(Qt::NoPen);
|
||||||
|
p.setBrush(palette().base());
|
||||||
|
p.drawRect(0, 0, 5, 5);
|
||||||
|
p.drawRect(width() - 5, 0, 5, 5);
|
||||||
|
p.drawRect(0, height() - 5, 5, 5);
|
||||||
|
p.drawRect(width() - 5, height() - 5, 5, 5);
|
||||||
|
|
||||||
|
// Rahmen
|
||||||
|
p.setPen(frame);
|
||||||
|
p.setBrush(palette().window());
|
||||||
|
QRectF r(rect());
|
||||||
|
r.adjust(0.5, 0.5, -0.5, -0.5);
|
||||||
|
p.drawRoundedRect(r, 3.0, 3.0, Qt::AbsoluteSize);
|
||||||
|
|
||||||
|
// Titel-Hintergrund
|
||||||
|
p.setPen(Qt::NoPen);
|
||||||
|
p.setBrush(palette().highlight());
|
||||||
|
QPainterPath path;
|
||||||
|
path.moveTo(1.5, fm.height() + 2.5);
|
||||||
|
path.lineTo(width() - 1.5, fm.height() + 2.5);
|
||||||
|
path.lineTo(width() - 1.5, 3.5);
|
||||||
|
path.arcTo(QRectF(width() - 3.5, 0, 2.5, 2.5), 270, -90);
|
||||||
|
path.lineTo(3.5, 1.5);
|
||||||
|
path.arcTo(QRectF(1.5, 2.5, 2.5, 2.5), 90, 90);
|
||||||
|
p.drawPath(path);
|
||||||
|
|
||||||
|
// Titel-Abschlusslinie
|
||||||
|
p.setPen(frame);
|
||||||
|
p.drawLine(QPointF(0.5, 2 + fm.height() + 1.5), QPointF(width() - 1.5, 2 + fm.height() + 1.5));
|
||||||
|
|
||||||
|
// Aktiv-Button links
|
||||||
|
p.setPen(QPen(palette().windowText().color(), 1.0));
|
||||||
|
p.setBrush(palette().light());
|
||||||
|
p.drawRoundedRect(QRectF(3.5, 3.5, fm.ascent(), fm.ascent()), 2.0, 2.0, Qt::AbsoluteSize);
|
||||||
|
|
||||||
|
// Schließen-Button rechts
|
||||||
|
p.setRenderHint(QPainter::Antialiasing, true);
|
||||||
|
p.setPen(QPen(palette().windowText().color(), 1.0));
|
||||||
|
p.setBrush(palette().light());
|
||||||
|
r = QRectF(width() - 3.5 - fm.ascent(), 3.5, fm.ascent(), fm.ascent());
|
||||||
|
p.drawRoundedRect(r, 2.0, 2.0, Qt::AbsoluteSize);
|
||||||
|
p.setPen(QPen(palette().windowText().color(), 1.5));
|
||||||
|
p.drawLine(r.topLeft() + QPointF(1, 1), r.bottomRight() + QPointF(-1, -1));
|
||||||
|
p.drawLine(r.bottomLeft() + QPointF(1, -1), r.topRight() + QPointF(-1, 1));
|
||||||
|
|
||||||
|
// Titel
|
||||||
|
p.setPen(palette().highlightedText().color());
|
||||||
|
p.drawText(QRect(2 + fm.height(), 2, width() - 4 - 2 * fm.height(), fm.height()),
|
||||||
|
fm.elidedText(windowTitle(), Qt::ElideMiddle, width() - 4 - 2 * fm.height(), 0));
|
||||||
|
|
||||||
|
// Rollups
|
||||||
|
int pos = fm.height() + 4;
|
||||||
|
for(int i = 0; i < children().count(); ++i) {
|
||||||
|
QWidget* r = qobject_cast<QWidget*>(children()[i]);
|
||||||
|
if(r != NULL)
|
||||||
|
pos += paintRollup(r, pos, &p, i == children().count() - 1, frame);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int RollupWidget::paintRollup(QWidget* rollup, int pos, QPainter* p, bool last, const QColor& frame)
|
||||||
|
{
|
||||||
|
QFontMetrics fm(font());
|
||||||
|
int height = 1;
|
||||||
|
|
||||||
|
// Titel-Abschlusslinie
|
||||||
|
if(!rollup->isHidden()) {
|
||||||
|
p->setPen(palette().dark().color());
|
||||||
|
p->drawLine(QPointF(1.5, pos + fm.height() + 1.5), QPointF(width() - 1.5, pos + fm.height() + 1.5));
|
||||||
|
p->setPen(palette().light().color());
|
||||||
|
p->drawLine(QPointF(1.5, pos + fm.height() + 2.5), QPointF(width() - 1.5, pos + fm.height() + 2.5));
|
||||||
|
height += 2;
|
||||||
|
} else {
|
||||||
|
if(!last) {
|
||||||
|
p->setPen(frame);
|
||||||
|
p->drawLine(QPointF(1.5, pos + fm.height() + 1.5), QPointF(width() - 1.5, pos + fm.height() + 1.5));
|
||||||
|
height++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Titel
|
||||||
|
p->setPen(palette().windowText().color());
|
||||||
|
p->drawText(QRect(2 + fm.height(), pos, width() - 4 - fm.height(), fm.height()),
|
||||||
|
fm.elidedText(rollup->windowTitle(), Qt::ElideMiddle, width() - 4 - fm.height(), 0));
|
||||||
|
height += fm.height();
|
||||||
|
|
||||||
|
// Ausklapp-Icon
|
||||||
|
p->setPen(palette().windowText().color());
|
||||||
|
p->setBrush(palette().windowText());
|
||||||
|
if(!rollup->isHidden()) {
|
||||||
|
QPolygonF a;
|
||||||
|
a.append(QPointF(3.5, pos + 2));
|
||||||
|
a.append(QPointF(3.5 + fm.ascent(), pos + 2));
|
||||||
|
a.append(QPointF(3.5 + fm.ascent() / 2.0, pos + fm.height() - 2));
|
||||||
|
p->drawPolygon(a);
|
||||||
|
} else {
|
||||||
|
QPolygonF a;
|
||||||
|
a.append(QPointF(3.5, pos + 2));
|
||||||
|
a.append(QPointF(3.5, pos + fm.height() - 2));
|
||||||
|
a.append(QPointF(3.5 + fm.ascent(), pos + fm.height() / 2));
|
||||||
|
p->drawPolygon(a);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Inhalt
|
||||||
|
if(!rollup->isHidden() && (!last)) {
|
||||||
|
// Rollup-Abschlusslinie
|
||||||
|
p->setPen(frame);
|
||||||
|
p->drawLine(QPointF(1.5, pos + fm.height() + rollup->height() + 6.5),
|
||||||
|
QPointF(width() - 1.5, pos + fm.height() + rollup->height() + 6.5));
|
||||||
|
height += rollup->height() + 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
return height;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RollupWidget::resizeEvent(QResizeEvent* size)
|
||||||
|
{
|
||||||
|
arrangeRollups();
|
||||||
|
QWidget::resizeEvent(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void RollupWidget::mousePressEvent(QMouseEvent* event)
|
||||||
|
{
|
||||||
|
QFontMetrics fm(font());
|
||||||
|
|
||||||
|
// menu box left
|
||||||
|
if(QRectF(3.5, 3.5, fm.ascent(), fm.ascent()).contains(event->pos())) {
|
||||||
|
emit customContextMenuRequested(event->pos());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// close button right
|
||||||
|
if(QRectF(width() - 3.5 - fm.ascent(), 3.5, fm.ascent(), fm.ascent()).contains(event->pos())) {
|
||||||
|
close();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if we need to change a rollup widget
|
||||||
|
int pos = fm.height() + 4;
|
||||||
|
for(int i = 0; i < children().count(); ++i) {
|
||||||
|
QWidget* r = qobject_cast<QWidget*>(children()[i]);
|
||||||
|
if(r != NULL) {
|
||||||
|
if((event->y() >= pos) && (event->y() < (pos + fm.height() + 3))) {
|
||||||
|
if(r->isHidden())
|
||||||
|
r->show();
|
||||||
|
else r->hide();
|
||||||
|
arrangeRollups();
|
||||||
|
repaint();
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
pos += fm.height() + 2;
|
||||||
|
if(!r->isHidden())
|
||||||
|
pos += r->height() + 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool RollupWidget::eventFilter(QObject* object, QEvent* event)
|
||||||
|
{
|
||||||
|
if((event->type() == QEvent::Show) || (event->type() == QEvent::Hide)) {
|
||||||
|
if(children().contains(object))
|
||||||
|
arrangeRollups();
|
||||||
|
} else if((event->type() == QEvent::ChildAdded) || (event->type() == QEvent::ChildRemoved)) {
|
||||||
|
if(children().contains(object))
|
||||||
|
arrangeRollups();
|
||||||
|
}
|
||||||
|
|
||||||
|
return QWidget::eventFilter(object, event);
|
||||||
|
}
|
|
@ -135,6 +135,10 @@ void ScopeWindow::on_displayMode_currentIndexChanged(int index)
|
||||||
case 3: // derived1+derived2
|
case 3: // derived1+derived2
|
||||||
ui->scope->setMode(GLScope::ModeDerived12);
|
ui->scope->setMode(GLScope::ModeDerived12);
|
||||||
break;
|
break;
|
||||||
|
case 4: // clostationary
|
||||||
|
ui->scope->setMode(GLScope::ModeCyclostationary);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -82,6 +82,11 @@
|
||||||
<string>Derived 1st + 2nd order</string>
|
<string>Derived 1st + 2nd order</string>
|
||||||
</property>
|
</property>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Cyclostationary</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
|
|
||||||
#include <QInputDialog>
|
#include <QInputDialog>
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
#include <QDir>
|
|
||||||
#include <QLabel>
|
#include <QLabel>
|
||||||
#include "mainwindow.h"
|
#include "mainwindow.h"
|
||||||
#include "ui_mainwindow.h"
|
#include "ui_mainwindow.h"
|
||||||
|
@ -29,6 +28,7 @@
|
||||||
#include "gui/pluginsdialog.h"
|
#include "gui/pluginsdialog.h"
|
||||||
#include "gui/preferencesdialog.h"
|
#include "gui/preferencesdialog.h"
|
||||||
#include "gui/aboutdialog.h"
|
#include "gui/aboutdialog.h"
|
||||||
|
#include "gui/rollupwidget.h"
|
||||||
#include "dsp/dspengine.h"
|
#include "dsp/dspengine.h"
|
||||||
#include "dsp/spectrumvis.h"
|
#include "dsp/spectrumvis.h"
|
||||||
#include "dsp/dspcommands.h"
|
#include "dsp/dspcommands.h"
|
||||||
|
@ -59,20 +59,25 @@ MainWindow::MainWindow(QWidget* parent) :
|
||||||
setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea);
|
setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea);
|
||||||
setCorner(Qt::TopRightCorner, Qt::RightDockWidgetArea);
|
setCorner(Qt::TopRightCorner, Qt::RightDockWidgetArea);
|
||||||
setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea);
|
setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea);
|
||||||
|
|
||||||
// work around broken Qt dock widget ordering
|
// work around broken Qt dock widget ordering
|
||||||
removeDockWidget(ui->inputDock);
|
removeDockWidget(ui->inputDock);
|
||||||
removeDockWidget(ui->processingDock);
|
removeDockWidget(ui->processingDock);
|
||||||
removeDockWidget(ui->presetDock);
|
removeDockWidget(ui->presetDock);
|
||||||
|
removeDockWidget(ui->channelDock);
|
||||||
addDockWidget(Qt::LeftDockWidgetArea, ui->inputDock);
|
addDockWidget(Qt::LeftDockWidgetArea, ui->inputDock);
|
||||||
addDockWidget(Qt::LeftDockWidgetArea, ui->processingDock);
|
addDockWidget(Qt::LeftDockWidgetArea, ui->processingDock);
|
||||||
addDockWidget(Qt::LeftDockWidgetArea, ui->presetDock);
|
addDockWidget(Qt::LeftDockWidgetArea, ui->presetDock);
|
||||||
|
addDockWidget(Qt::RightDockWidgetArea, ui->channelDock);
|
||||||
ui->inputDock->show();
|
ui->inputDock->show();
|
||||||
ui->processingDock->show();
|
ui->processingDock->show();
|
||||||
ui->presetDock->show();
|
ui->presetDock->show();
|
||||||
|
ui->channelDock->show();
|
||||||
|
|
||||||
ui->menu_Window->addAction(ui->inputDock->toggleViewAction());
|
ui->menu_Window->addAction(ui->inputDock->toggleViewAction());
|
||||||
ui->menu_Window->addAction(ui->processingDock->toggleViewAction());
|
ui->menu_Window->addAction(ui->processingDock->toggleViewAction());
|
||||||
ui->menu_Window->addAction(ui->presetDock->toggleViewAction());
|
ui->menu_Window->addAction(ui->presetDock->toggleViewAction());
|
||||||
|
ui->menu_Window->addAction(ui->channelDock->toggleViewAction());
|
||||||
|
|
||||||
connect(m_messageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleMessages()), Qt::QueuedConnection);
|
connect(m_messageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleMessages()), Qt::QueuedConnection);
|
||||||
|
|
||||||
|
@ -131,9 +136,14 @@ MainWindow::~MainWindow()
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::addDemodCreateAction(QAction* action)
|
void MainWindow::addChannelCreateAction(QAction* action)
|
||||||
{
|
{
|
||||||
ui->menu_Demodulation->addAction(action);
|
ui->menu_Channels->addAction(action);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::addChannelRollup(QWidget* widget)
|
||||||
|
{
|
||||||
|
((ChannelWindow*)ui->channelDock->widget())->addRollupWidget(widget);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::addViewAction(QAction* action)
|
void MainWindow::addViewAction(QAction* action)
|
||||||
|
@ -201,7 +211,7 @@ void MainWindow::saveSettings(Preset* preset)
|
||||||
preset->setScopeConfig(m_scopeWindow->serialize());
|
preset->setScopeConfig(m_scopeWindow->serialize());
|
||||||
else preset->setScopeConfig(QByteArray());
|
else preset->setScopeConfig(QByteArray());
|
||||||
|
|
||||||
preset->clearDemods();
|
preset->clearChannels();
|
||||||
m_pluginManager->saveSettings(preset);
|
m_pluginManager->saveSettings(preset);
|
||||||
|
|
||||||
preset->setLayout(saveState());
|
preset->setLayout(saveState());
|
||||||
|
@ -502,7 +512,6 @@ void MainWindow::on_action_Preferences_triggered()
|
||||||
preferencesDialog.exec();
|
preferencesDialog.exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void MainWindow::on_sampleSource_currentIndexChanged(int index)
|
void MainWindow::on_sampleSource_currentIndexChanged(int index)
|
||||||
{
|
{
|
||||||
m_pluginManager->selectSampleSource(ui->sampleSource->currentIndex());
|
m_pluginManager->selectSampleSource(ui->sampleSource->currentIndex());
|
||||||
|
|
|
@ -22,16 +22,7 @@
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="centralWidget">
|
<widget class="QWidget" name="centralWidget">
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||||
<property name="leftMargin">
|
<property name="margin">
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="topMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="rightMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="bottomMargin">
|
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
|
@ -52,7 +43,7 @@
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>1012</width>
|
<width>1012</width>
|
||||||
<height>24</height>
|
<height>23</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QMenu" name="menu_File">
|
<widget class="QMenu" name="menu_File">
|
||||||
|
@ -95,9 +86,9 @@
|
||||||
<addaction name="separator"/>
|
<addaction name="separator"/>
|
||||||
<addaction name="action_About"/>
|
<addaction name="action_About"/>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QMenu" name="menu_Demodulation">
|
<widget class="QMenu" name="menu_Channels">
|
||||||
<property name="title">
|
<property name="title">
|
||||||
<string>&Demodulation</string>
|
<string>&Channels</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QMenu" name="menu_Window">
|
<widget class="QMenu" name="menu_Window">
|
||||||
|
@ -108,7 +99,7 @@
|
||||||
<addaction name="menu_File"/>
|
<addaction name="menu_File"/>
|
||||||
<addaction name="menu_View"/>
|
<addaction name="menu_View"/>
|
||||||
<addaction name="menu_Acquisition"/>
|
<addaction name="menu_Acquisition"/>
|
||||||
<addaction name="menu_Demodulation"/>
|
<addaction name="menu_Channels"/>
|
||||||
<addaction name="menu_Options"/>
|
<addaction name="menu_Options"/>
|
||||||
<addaction name="menu_Window"/>
|
<addaction name="menu_Window"/>
|
||||||
<addaction name="menu_Help"/>
|
<addaction name="menu_Help"/>
|
||||||
|
@ -131,16 +122,7 @@
|
||||||
</attribute>
|
</attribute>
|
||||||
<widget class="QWidget" name="dockWidgetContents">
|
<widget class="QWidget" name="dockWidgetContents">
|
||||||
<layout class="QGridLayout" name="gridLayout_6">
|
<layout class="QGridLayout" name="gridLayout_6">
|
||||||
<property name="leftMargin">
|
<property name="margin">
|
||||||
<number>2</number>
|
|
||||||
</property>
|
|
||||||
<property name="topMargin">
|
|
||||||
<number>2</number>
|
|
||||||
</property>
|
|
||||||
<property name="rightMargin">
|
|
||||||
<number>2</number>
|
|
||||||
</property>
|
|
||||||
<property name="bottomMargin">
|
|
||||||
<number>2</number>
|
<number>2</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="spacing">
|
<property name="spacing">
|
||||||
|
@ -257,16 +239,7 @@
|
||||||
<property name="spacing">
|
<property name="spacing">
|
||||||
<number>3</number>
|
<number>3</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="leftMargin">
|
<property name="margin">
|
||||||
<number>2</number>
|
|
||||||
</property>
|
|
||||||
<property name="topMargin">
|
|
||||||
<number>2</number>
|
|
||||||
</property>
|
|
||||||
<property name="rightMargin">
|
|
||||||
<number>2</number>
|
|
||||||
</property>
|
|
||||||
<property name="bottomMargin">
|
|
||||||
<number>2</number>
|
<number>2</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
|
@ -275,7 +248,7 @@
|
||||||
<number>3</number>
|
<number>3</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QToolButton" name="dcOffset">
|
<widget class="ButtonSwitch" name="dcOffset">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
|
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
|
||||||
<horstretch>0</horstretch>
|
<horstretch>0</horstretch>
|
||||||
|
@ -288,13 +261,10 @@
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>DC Offset Corr</string>
|
<string>DC Offset Corr</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QToolButton" name="iqImbalance">
|
<widget class="ButtonSwitch" name="iqImbalance">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
|
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
|
||||||
<horstretch>0</horstretch>
|
<horstretch>0</horstretch>
|
||||||
|
@ -307,9 +277,6 @@
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>I/Q Imbal. Corr</string>
|
<string>I/Q Imbal. Corr</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
|
@ -338,16 +305,7 @@
|
||||||
<property name="spacing">
|
<property name="spacing">
|
||||||
<number>3</number>
|
<number>3</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="leftMargin">
|
<property name="margin">
|
||||||
<number>2</number>
|
|
||||||
</property>
|
|
||||||
<property name="topMargin">
|
|
||||||
<number>2</number>
|
|
||||||
</property>
|
|
||||||
<property name="rightMargin">
|
|
||||||
<number>2</number>
|
|
||||||
</property>
|
|
||||||
<property name="bottomMargin">
|
|
||||||
<number>2</number>
|
<number>2</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
|
@ -360,6 +318,24 @@
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</widget>
|
</widget>
|
||||||
|
<widget class="QDockWidget" name="channelDock">
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Channels</string>
|
||||||
|
</property>
|
||||||
|
<attribute name="dockWidgetArea">
|
||||||
|
<number>2</number>
|
||||||
|
</attribute>
|
||||||
|
<widget class="ChannelWindow" name="channelWindow">
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_4">
|
||||||
|
<property name="spacing">
|
||||||
|
<number>3</number>
|
||||||
|
</property>
|
||||||
|
<property name="margin">
|
||||||
|
<number>2</number>
|
||||||
|
</property>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
<action name="action_Exit">
|
<action name="action_Exit">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>E&xit</string>
|
<string>E&xit</string>
|
||||||
|
@ -447,6 +423,7 @@
|
||||||
</property>
|
</property>
|
||||||
</action>
|
</action>
|
||||||
<zorder>presetDock</zorder>
|
<zorder>presetDock</zorder>
|
||||||
|
<zorder>channelDock</zorder>
|
||||||
</widget>
|
</widget>
|
||||||
<layoutdefault spacing="6" margin="11"/>
|
<layoutdefault spacing="6" margin="11"/>
|
||||||
<customwidgets>
|
<customwidgets>
|
||||||
|
@ -462,6 +439,17 @@
|
||||||
<header>gui/glspectrumgui.h</header>
|
<header>gui/glspectrumgui.h</header>
|
||||||
<container>1</container>
|
<container>1</container>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
|
<customwidget>
|
||||||
|
<class>ButtonSwitch</class>
|
||||||
|
<extends>QToolButton</extends>
|
||||||
|
<header>gui/buttonswitch.h</header>
|
||||||
|
</customwidget>
|
||||||
|
<customwidget>
|
||||||
|
<class>ChannelWindow</class>
|
||||||
|
<extends>QWidget</extends>
|
||||||
|
<header>gui/channelwindow.h</header>
|
||||||
|
<container>1</container>
|
||||||
|
</customwidget>
|
||||||
</customwidgets>
|
</customwidgets>
|
||||||
<tabstops>
|
<tabstops>
|
||||||
<tabstop>presetTree</tabstop>
|
<tabstop>presetTree</tabstop>
|
||||||
|
|
|
@ -19,14 +19,29 @@ MessageQueue* PluginAPI::getMainWindowMessageQueue()
|
||||||
return m_mainWindow->getMessageQueue();
|
return m_mainWindow->getMessageQueue();
|
||||||
}
|
}
|
||||||
|
|
||||||
void PluginAPI::registerDemodulator(const QString& demodName, PluginInterface* plugin, QAction* action)
|
void PluginAPI::setInputGUI(QWidget* inputGUI)
|
||||||
{
|
{
|
||||||
m_pluginManager->registerDemodulator(demodName, plugin, action);
|
m_mainWindow->setInputGUI(inputGUI);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PluginAPI::registerDemodulatorInstance(const QString& demodName, PluginGUI* pluginGUI)
|
void PluginAPI::registerChannel(const QString& channelName, PluginInterface* plugin, QAction* action)
|
||||||
{
|
{
|
||||||
m_pluginManager->registerDemodulatorInstance(demodName, pluginGUI);
|
m_pluginManager->registerChannel(channelName, plugin, action);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PluginAPI::registerChannelInstance(const QString& channelName, PluginGUI* pluginGUI)
|
||||||
|
{
|
||||||
|
m_pluginManager->registerChannelInstance(channelName, pluginGUI);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PluginAPI::addChannelRollup(QWidget* pluginGUI)
|
||||||
|
{
|
||||||
|
m_pluginManager->addChannelRollup(pluginGUI);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PluginAPI::removeChannelInstance(PluginGUI* pluginGUI)
|
||||||
|
{
|
||||||
|
m_pluginManager->removeChannelInstance(pluginGUI);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PluginAPI::addChannelMarker(ChannelMarker* channelMarker)
|
void PluginAPI::addChannelMarker(ChannelMarker* channelMarker)
|
||||||
|
|
|
@ -1,15 +1,5 @@
|
||||||
#include "plugin/plugingui.h"
|
#include "plugin/plugingui.h"
|
||||||
|
|
||||||
PluginGUI::PluginGUI(QWidget* parent) :
|
|
||||||
QWidget(parent)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void PluginGUI::setWidgetName(const QString& name)
|
|
||||||
{
|
|
||||||
setObjectName(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
QByteArray PluginGUI::serializeGeneral() const
|
QByteArray PluginGUI::serializeGeneral() const
|
||||||
{
|
{
|
||||||
return QByteArray();
|
return QByteArray();
|
||||||
|
|
|
@ -37,17 +37,32 @@ void PluginManager::loadPlugins()
|
||||||
updateSampleSourceDevices();
|
updateSampleSourceDevices();
|
||||||
}
|
}
|
||||||
|
|
||||||
void PluginManager::registerDemodulator(const QString& demodName, PluginInterface* plugin, QAction* action)
|
void PluginManager::registerChannel(const QString& channelName, PluginInterface* plugin, QAction* action)
|
||||||
{
|
{
|
||||||
m_demodRegistrations.append(DemodRegistration(demodName, plugin));
|
m_channelRegistrations.append(ChannelRegistration(channelName, plugin));
|
||||||
m_mainWindow->addDemodCreateAction(action);
|
m_mainWindow->addChannelCreateAction(action);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PluginManager::registerDemodulatorInstance(const QString& demodName, PluginGUI* pluginGUI)
|
void PluginManager::registerChannelInstance(const QString& channelName, PluginGUI* pluginGUI)
|
||||||
{
|
{
|
||||||
connect(pluginGUI, SIGNAL(destroyed(QObject*)), this, SLOT(demodInstanceDestroyed(QObject*)));
|
m_channelInstanceRegistrations.append(ChannelInstanceRegistration(channelName, pluginGUI));
|
||||||
m_demodInstanceRegistrations.append(DemodInstanceRegistration(demodName, pluginGUI));
|
renameChannelInstances();
|
||||||
renameDemodInstances();
|
}
|
||||||
|
|
||||||
|
void PluginManager::addChannelRollup(QWidget* pluginGUI)
|
||||||
|
{
|
||||||
|
m_mainWindow->addChannelRollup(pluginGUI);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PluginManager::removeChannelInstance(PluginGUI* pluginGUI)
|
||||||
|
{
|
||||||
|
for(ChannelInstanceRegistrations::iterator it = m_channelInstanceRegistrations.begin(); it != m_channelInstanceRegistrations.end(); ++it) {
|
||||||
|
if(it->m_gui == pluginGUI) {
|
||||||
|
m_channelInstanceRegistrations.erase(it);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
renameChannelInstances();
|
||||||
}
|
}
|
||||||
|
|
||||||
void PluginManager::registerSampleSource(const QString& sourceName, PluginInterface* plugin)
|
void PluginManager::registerSampleSource(const QString& sourceName, PluginInterface* plugin)
|
||||||
|
@ -59,46 +74,44 @@ void PluginManager::loadSettings(const Preset* preset)
|
||||||
{
|
{
|
||||||
qDebug("-------- [%s | %s] --------", qPrintable(preset->getGroup()), qPrintable(preset->getDescription()));
|
qDebug("-------- [%s | %s] --------", qPrintable(preset->getGroup()), qPrintable(preset->getDescription()));
|
||||||
|
|
||||||
// copy currently open demods and clear list
|
// copy currently open channels and clear list
|
||||||
DemodInstanceRegistrations availableDemods = m_demodInstanceRegistrations;
|
ChannelInstanceRegistrations openChannels = m_channelInstanceRegistrations;
|
||||||
m_demodInstanceRegistrations.clear();
|
m_channelInstanceRegistrations.clear();
|
||||||
|
|
||||||
for(int i = 0; i < preset->getDemodCount(); i++) {
|
for(int i = 0; i < preset->getChannelCount(); i++) {
|
||||||
const Preset::DemodConfig& demodConfig = preset->getDemodConfig(i);
|
const Preset::ChannelConfig& channelConfig = preset->getChannelConfig(i);
|
||||||
DemodInstanceRegistration reg;
|
ChannelInstanceRegistration reg;
|
||||||
// if we have one instance available already, use it
|
// if we have one instance available already, use it
|
||||||
for(int i = 0; i < availableDemods.count(); i++) {
|
for(int i = 0; i < openChannels.count(); i++) {
|
||||||
qDebug("compare [%s] vs [%s]", qPrintable(availableDemods[i].m_demodName), qPrintable(demodConfig.m_demod));
|
qDebug("compare [%s] vs [%s]", qPrintable(openChannels[i].m_channelName), qPrintable(channelConfig.m_channel));
|
||||||
if(availableDemods[i].m_demodName == demodConfig.m_demod) {
|
if(openChannels[i].m_channelName == channelConfig.m_channel) {
|
||||||
qDebug("demod [%s] found", qPrintable(availableDemods[i].m_demodName));
|
qDebug("channel [%s] found", qPrintable(openChannels[i].m_channelName));
|
||||||
reg = availableDemods.takeAt(i);
|
reg = openChannels.takeAt(i);
|
||||||
m_demodInstanceRegistrations.append(reg);
|
m_channelInstanceRegistrations.append(reg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// if we haven't one already, create one
|
// if we haven't one already, create one
|
||||||
if(reg.m_gui == NULL) {
|
if(reg.m_gui == NULL) {
|
||||||
for(int i = 0; i < m_demodRegistrations.count(); i++) {
|
for(int i = 0; i < m_channelRegistrations.count(); i++) {
|
||||||
if(m_demodRegistrations[i].m_demodName == demodConfig.m_demod) {
|
if(m_channelRegistrations[i].m_channelName == channelConfig.m_channel) {
|
||||||
qDebug("creating new demod [%s]", qPrintable(demodConfig.m_demod));
|
qDebug("creating new channel [%s]", qPrintable(channelConfig.m_channel));
|
||||||
reg = DemodInstanceRegistration(demodConfig.m_demod, m_demodRegistrations[i].m_plugin->createDemod(demodConfig.m_demod));
|
reg = ChannelInstanceRegistration(channelConfig.m_channel, m_channelRegistrations[i].m_plugin->createChannel(channelConfig.m_channel));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(reg.m_gui != NULL) {
|
if(reg.m_gui != NULL)
|
||||||
reg.m_gui->deserialize(demodConfig.m_config);
|
reg.m_gui->deserialize(channelConfig.m_config);
|
||||||
reg.m_gui->raise();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// everything, that is still "available" is not needed anymore
|
// everything, that is still "available" is not needed anymore
|
||||||
for(int i = 0; i < availableDemods.count(); i++) {
|
for(int i = 0; i < openChannels.count(); i++) {
|
||||||
qDebug("destroying spare demod [%s]", qPrintable(availableDemods[i].m_demodName));
|
qDebug("destroying spare channel [%s]", qPrintable(openChannels[i].m_channelName));
|
||||||
availableDemods[i].m_gui->destroy();
|
openChannels[i].m_gui->destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
renameDemodInstances();
|
renameChannelInstances();
|
||||||
|
|
||||||
if(m_sampleSourceInstance != NULL) {
|
if(m_sampleSourceInstance != NULL) {
|
||||||
m_sampleSourceInstance->deserializeGeneral(preset->getSourceGeneralConfig());
|
m_sampleSourceInstance->deserializeGeneral(preset->getSourceGeneralConfig());
|
||||||
|
@ -116,17 +129,16 @@ void PluginManager::saveSettings(Preset* preset) const
|
||||||
} else {
|
} else {
|
||||||
preset->setSourceConfig(QString::null, QByteArray(), QByteArray());
|
preset->setSourceConfig(QString::null, QByteArray(), QByteArray());
|
||||||
}
|
}
|
||||||
for(int i = 0; i < m_demodInstanceRegistrations.size(); i++)
|
for(int i = 0; i < m_channelInstanceRegistrations.count(); i++)
|
||||||
preset->addDemod(m_demodInstanceRegistrations[i].m_demodName, m_demodInstanceRegistrations[i].m_gui->serialize());
|
preset->addChannel(m_channelInstanceRegistrations[i].m_channelName, m_channelInstanceRegistrations[i].m_gui->serialize());
|
||||||
}
|
}
|
||||||
|
|
||||||
void PluginManager::freeAll()
|
void PluginManager::freeAll()
|
||||||
{
|
{
|
||||||
m_dspEngine->stopAcquistion();
|
m_dspEngine->stopAcquistion();
|
||||||
|
|
||||||
while(!m_demodInstanceRegistrations.isEmpty()) {
|
while(!m_channelInstanceRegistrations.isEmpty()) {
|
||||||
DemodInstanceRegistration reg(m_demodInstanceRegistrations.takeLast());
|
ChannelInstanceRegistration reg(m_channelInstanceRegistrations.takeLast());
|
||||||
reg.m_gui->disconnect(this);
|
|
||||||
reg.m_gui->destroy();
|
reg.m_gui->destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -147,7 +159,7 @@ bool PluginManager::handleMessage(Message* message)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for(DemodInstanceRegistrations::iterator it = m_demodInstanceRegistrations.begin(); it != m_demodInstanceRegistrations.end(); ++it) {
|
for(ChannelInstanceRegistrations::iterator it = m_channelInstanceRegistrations.begin(); it != m_channelInstanceRegistrations.end(); ++it) {
|
||||||
if((message->destination() == NULL) || (message->destination() == it->m_gui)) {
|
if((message->destination() == NULL) || (message->destination() == it->m_gui)) {
|
||||||
if(it->m_gui->handleMessage(message))
|
if(it->m_gui->handleMessage(message))
|
||||||
return true;
|
return true;
|
||||||
|
@ -204,7 +216,6 @@ int PluginManager::selectSampleSource(int index)
|
||||||
|
|
||||||
m_sampleSource = m_sampleSourceDevices[index].m_sourceName;
|
m_sampleSource = m_sampleSourceDevices[index].m_sourceName;
|
||||||
m_sampleSourceInstance = m_sampleSourceDevices[index].m_plugin->createSampleSource(m_sampleSource, m_sampleSourceDevices[index].m_address);
|
m_sampleSourceInstance = m_sampleSourceDevices[index].m_plugin->createSampleSource(m_sampleSource, m_sampleSourceDevices[index].m_address);
|
||||||
m_mainWindow->setInputGUI(m_sampleSourceInstance);
|
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -239,21 +250,9 @@ int PluginManager::selectSampleSource(const QString& source)
|
||||||
|
|
||||||
m_sampleSource = m_sampleSourceDevices[index].m_sourceName;
|
m_sampleSource = m_sampleSourceDevices[index].m_sourceName;
|
||||||
m_sampleSourceInstance = m_sampleSourceDevices[index].m_plugin->createSampleSource(m_sampleSource, m_sampleSourceDevices[index].m_address);
|
m_sampleSourceInstance = m_sampleSourceDevices[index].m_plugin->createSampleSource(m_sampleSource, m_sampleSourceDevices[index].m_address);
|
||||||
m_mainWindow->setInputGUI(m_sampleSourceInstance);
|
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PluginManager::demodInstanceDestroyed(QObject* object)
|
|
||||||
{
|
|
||||||
for(DemodInstanceRegistrations::iterator it = m_demodInstanceRegistrations.begin(); it != m_demodInstanceRegistrations.end(); ++it) {
|
|
||||||
if(it->m_gui == object) {
|
|
||||||
m_demodInstanceRegistrations.erase(it);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
renameDemodInstances();
|
|
||||||
}
|
|
||||||
|
|
||||||
void PluginManager::loadPlugins(const QDir& dir)
|
void PluginManager::loadPlugins(const QDir& dir)
|
||||||
{
|
{
|
||||||
QDir pluginsDir(dir);
|
QDir pluginsDir(dir);
|
||||||
|
@ -273,9 +272,9 @@ void PluginManager::loadPlugins(const QDir& dir)
|
||||||
loadPlugins(pluginsDir.absoluteFilePath(dirName));
|
loadPlugins(pluginsDir.absoluteFilePath(dirName));
|
||||||
}
|
}
|
||||||
|
|
||||||
void PluginManager::renameDemodInstances()
|
void PluginManager::renameChannelInstances()
|
||||||
{
|
{
|
||||||
for(int i = 0; i < m_demodInstanceRegistrations.count(); i++) {
|
for(int i = 0; i < m_channelInstanceRegistrations.count(); i++) {
|
||||||
m_demodInstanceRegistrations[i].m_gui->setWidgetName(QString("%1:%2").arg(m_demodInstanceRegistrations[i].m_demodName).arg(i));
|
m_channelInstanceRegistrations[i].m_gui->setName(QString("%1:%2").arg(m_channelInstanceRegistrations[i].m_channelName).arg(i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.1 KiB |
Binary file not shown.
Before Width: | Height: | Size: 1.1 KiB |
Binary file not shown.
After Width: | Height: | Size: 594 B |
|
@ -2,7 +2,6 @@
|
||||||
<qresource prefix="/">
|
<qresource prefix="/">
|
||||||
<file>appicon.png</file>
|
<file>appicon.png</file>
|
||||||
<file>histogram.png</file>
|
<file>histogram.png</file>
|
||||||
<file>livespectrum.png</file>
|
|
||||||
<file>waterfall.png</file>
|
<file>waterfall.png</file>
|
||||||
<file>preset-load.png</file>
|
<file>preset-load.png</file>
|
||||||
<file>preset-save.png</file>
|
<file>preset-save.png</file>
|
||||||
|
@ -10,5 +9,6 @@
|
||||||
<file>horizontal.png</file>
|
<file>horizontal.png</file>
|
||||||
<file>vertical.png</file>
|
<file>vertical.png</file>
|
||||||
<file>logo.png</file>
|
<file>logo.png</file>
|
||||||
|
<file>maxhold.png</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
|
@ -18,7 +18,7 @@ void Preset::resetToDefaults()
|
||||||
m_showScope = true;
|
m_showScope = true;
|
||||||
m_layout.clear();
|
m_layout.clear();
|
||||||
m_spectrumConfig.clear();
|
m_spectrumConfig.clear();
|
||||||
m_demodConfigs.clear();
|
m_channelConfigs.clear();
|
||||||
m_source.clear();
|
m_source.clear();
|
||||||
m_sourceConfig.clear();
|
m_sourceConfig.clear();
|
||||||
}
|
}
|
||||||
|
@ -39,10 +39,10 @@ QByteArray Preset::serialize() const
|
||||||
s.writeBlob(11, m_sourceGeneralConfig);
|
s.writeBlob(11, m_sourceGeneralConfig);
|
||||||
s.writeBlob(12, m_sourceConfig);
|
s.writeBlob(12, m_sourceConfig);
|
||||||
|
|
||||||
s.writeS32(100, m_demodConfigs.size());
|
s.writeS32(100, m_channelConfigs.size());
|
||||||
for(int i = 0; i < m_demodConfigs.size(); i++) {
|
for(int i = 0; i < m_channelConfigs.size(); i++) {
|
||||||
s.writeString(101 + i * 2, m_demodConfigs[i].m_demod);
|
s.writeString(101 + i * 2, m_channelConfigs[i].m_channel);
|
||||||
s.writeBlob(102 + i * 2, m_demodConfigs[i].m_config);
|
s.writeBlob(102 + i * 2, m_channelConfigs[i].m_config);
|
||||||
}
|
}
|
||||||
|
|
||||||
return s.final();
|
return s.final();
|
||||||
|
@ -71,14 +71,14 @@ bool Preset::deserialize(const QByteArray& data)
|
||||||
d.readBlob(11, &m_sourceGeneralConfig);
|
d.readBlob(11, &m_sourceGeneralConfig);
|
||||||
d.readBlob(12, &m_sourceConfig);
|
d.readBlob(12, &m_sourceConfig);
|
||||||
|
|
||||||
qint32 demodCount = 0;
|
qint32 channelCount = 0;
|
||||||
d.readS32(100, &demodCount, 0);
|
d.readS32(100, &channelCount, 0);
|
||||||
for(int i = 0; i < demodCount; i++) {
|
for(int i = 0; i < channelCount; i++) {
|
||||||
QString demod;
|
QString channel;
|
||||||
QByteArray config;
|
QByteArray config;
|
||||||
d.readString(101 + i * 2, &demod, "unknown-demod");
|
d.readString(101 + i * 2, &channel, "unknown-channel");
|
||||||
d.readBlob(102 + i * 2, &config);
|
d.readBlob(102 + i * 2, &config);
|
||||||
m_demodConfigs.append(DemodConfig(demod, config));
|
m_channelConfigs.append(ChannelConfig(channel, config));
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue