mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-11-21 23:55:13 -05:00
Sonar fixes
This commit is contained in:
parent
3a7de65ee5
commit
36349e2837
@ -59,6 +59,7 @@ void WDSPRxBaseband::reset()
|
||||
{
|
||||
QMutexLocker mutexLocker(&m_mutex);
|
||||
m_sink.applyAudioSampleRate(DSPEngine::instance()->getAudioDeviceManager()->getOutputSampleRate());
|
||||
mutexLocker.unlock();
|
||||
m_sampleFifo.reset();
|
||||
m_channelSampleRate = 0;
|
||||
}
|
||||
|
@ -49,7 +49,7 @@
|
||||
|
||||
WDSPRxGUI* WDSPRxGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel)
|
||||
{
|
||||
WDSPRxGUI* gui = new WDSPRxGUI(pluginAPI, deviceUISet, rxChannel);
|
||||
auto* gui = new WDSPRxGUI(pluginAPI, deviceUISet, rxChannel);
|
||||
return gui;
|
||||
}
|
||||
|
||||
@ -98,7 +98,7 @@ bool WDSPRxGUI::handleMessage(const Message& message)
|
||||
if (WDSPRx::MsgConfigureWDSPRx::match(message))
|
||||
{
|
||||
qDebug("WDSPRxGUI::handleMessage: WDSPRx::MsgConfigureWDSPRx");
|
||||
const WDSPRx::MsgConfigureWDSPRx& cfg = (WDSPRx::MsgConfigureWDSPRx&) message;
|
||||
auto& cfg = (const WDSPRx::MsgConfigureWDSPRx&) message;
|
||||
m_settings = cfg.getSettings();
|
||||
blockApplySettings(true);
|
||||
ui->spectrumGUI->updateSettings();
|
||||
@ -118,7 +118,7 @@ bool WDSPRxGUI::handleMessage(const Message& message)
|
||||
}
|
||||
else if (DSPSignalNotification::match(message))
|
||||
{
|
||||
const DSPSignalNotification& notif = (const DSPSignalNotification&) message;
|
||||
auto& notif = (const DSPSignalNotification&) message;
|
||||
m_deviceCenterFrequency = notif.getCenterFrequency();
|
||||
m_basebandSampleRate = notif.getSampleRate();
|
||||
qDebug("WDSPRxGUI::handleMessage: DSPSignalNotification: centerFrequency: %lld sampleRate: %d",
|
||||
@ -138,7 +138,7 @@ void WDSPRxGUI::handleInputMessages()
|
||||
{
|
||||
Message* message;
|
||||
|
||||
while ((message = getInputMessageQueue()->pop()) != 0)
|
||||
while ((message = getInputMessageQueue()->pop()) != nullptr)
|
||||
{
|
||||
if (handleMessage(*message))
|
||||
{
|
||||
@ -183,7 +183,7 @@ void WDSPRxGUI::on_dsb_toggled(bool dsb)
|
||||
|
||||
void WDSPRxGUI::on_deltaFrequency_changed(qint64 value)
|
||||
{
|
||||
m_channelMarker.setCenterFrequency(value);
|
||||
m_channelMarker.setCenterFrequency((int) value);
|
||||
m_settings.m_inputFrequencyOffset = m_channelMarker.getCenterFrequency();
|
||||
updateAbsoluteCenterFrequency();
|
||||
applySettings();
|
||||
@ -205,7 +205,7 @@ void WDSPRxGUI::on_lowCut_valueChanged(int value)
|
||||
void WDSPRxGUI::on_volume_valueChanged(int value)
|
||||
{
|
||||
ui->volumeText->setText(QString("%1").arg(value));
|
||||
m_settings.m_volume = CalcDb::powerFromdB(value);
|
||||
m_settings.m_volume = (Real) CalcDb::powerFromdB(value);
|
||||
applySettings();
|
||||
}
|
||||
|
||||
@ -279,7 +279,7 @@ void WDSPRxGUI::on_rit_toggled(bool checked)
|
||||
{
|
||||
m_settings.m_rit = checked;
|
||||
m_settings.m_profiles[m_settings.m_profileIndex].m_rit = m_settings.m_rit;
|
||||
m_channelMarker.setShift(checked ? m_settings.m_ritFrequency: 0);
|
||||
m_channelMarker.setShift(checked ? (int) m_settings.m_ritFrequency: 0);
|
||||
applySettings();
|
||||
}
|
||||
|
||||
@ -406,7 +406,7 @@ void WDSPRxGUI::on_profileIndex_valueChanged(int value)
|
||||
|
||||
void WDSPRxGUI::on_demod_currentIndexChanged(int index)
|
||||
{
|
||||
WDSPRxProfile::WDSPRxDemod demod = (WDSPRxProfile::WDSPRxDemod) index;
|
||||
auto demod = (WDSPRxProfile::WDSPRxDemod) index;
|
||||
|
||||
if ((m_settings.m_demod != WDSPRxProfile::DemodSSB) && (demod == WDSPRxProfile::DemodSSB)) {
|
||||
m_settings.m_dsb = false;
|
||||
@ -480,7 +480,7 @@ void WDSPRxGUI::onMenuDialogCalled(const QPoint &p)
|
||||
resetContextMenuType();
|
||||
}
|
||||
|
||||
void WDSPRxGUI::onWidgetRolled(QWidget* widget, bool rollDown)
|
||||
void WDSPRxGUI::onWidgetRolled(const QWidget* widget, bool rollDown)
|
||||
{
|
||||
(void) widget;
|
||||
(void) rollDown;
|
||||
@ -524,7 +524,7 @@ WDSPRxGUI::WDSPRxGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSam
|
||||
m_wdspRx = (WDSPRx*) rxChannel;
|
||||
m_spectrumVis = m_wdspRx->getSpectrumVis();
|
||||
m_spectrumVis->setGLSpectrum(ui->glSpectrum);
|
||||
m_wdspRx->setMessageQueueToGUI(getInputMessageQueue());
|
||||
m_wdspRx->setMessageQueueToGUI(WDSPRxGUI::getInputMessageQueue());
|
||||
|
||||
m_audioMuteRightClickEnabler = new CRightClickEnabler(ui->audioMute);
|
||||
connect(m_audioMuteRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(audioSelect(const QPoint &)));
|
||||
@ -588,7 +588,7 @@ WDSPRxGUI::WDSPRxGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSam
|
||||
m_deviceUISet->addChannelMarker(&m_channelMarker);
|
||||
connect(&m_channelMarker, SIGNAL(changedByCursor()), this, SLOT(channelMarkerChangedByCursor()));
|
||||
connect(&m_channelMarker, SIGNAL(highlightedByCursor()), this, SLOT(channelMarkerHighlightedByCursor()));
|
||||
connect(getInputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()));
|
||||
connect(WDSPRxGUI::getInputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()));
|
||||
|
||||
|
||||
m_iconDSBUSB.addPixmap(QPixmap("://dsb.png"), QIcon::Normal, QIcon::On);
|
||||
@ -654,7 +654,7 @@ uint32_t WDSPRxGUI::getValidAudioSampleRate() const
|
||||
return sr;
|
||||
}
|
||||
|
||||
unsigned int WDSPRxGUI::spanLog2Max()
|
||||
unsigned int WDSPRxGUI::spanLog2Max() const
|
||||
{
|
||||
unsigned int spanLog2 = 0;
|
||||
for (; getValidAudioSampleRate() / (1<<spanLog2) >= 1000; spanLog2++);
|
||||
@ -668,7 +668,6 @@ void WDSPRxGUI::applyBandwidths(unsigned int spanLog2, bool force)
|
||||
unsigned int limit = s2max < 1 ? 0 : s2max - 1;
|
||||
ui->spanLog2->setMaximum(limit);
|
||||
bool dsb = ui->dsb->isChecked();
|
||||
//int spanLog2 = ui->spanLog2->value();
|
||||
m_spectrumRate = getValidAudioSampleRate() / (1<<spanLog2);
|
||||
int bw = ui->BW->value();
|
||||
int lw = ui->lowCut->value();
|
||||
@ -764,8 +763,8 @@ void WDSPRxGUI::applyBandwidths(unsigned int spanLog2, bool force)
|
||||
m_settings.m_dsb = dsb;
|
||||
m_settings.m_profiles[m_settings.m_profileIndex].m_dsb = dsb;
|
||||
m_settings.m_profiles[m_settings.m_profileIndex].m_spanLog2 = spanLog2;
|
||||
m_settings.m_profiles[m_settings.m_profileIndex].m_highCutoff = bw * 100;
|
||||
m_settings.m_profiles[m_settings.m_profileIndex].m_lowCutoff = lw * 100;
|
||||
m_settings.m_profiles[m_settings.m_profileIndex].m_highCutoff = (Real) (bw * 100);
|
||||
m_settings.m_profiles[m_settings.m_profileIndex].m_lowCutoff = (Real) (lw * 100);
|
||||
|
||||
applySettings(force);
|
||||
|
||||
@ -785,11 +784,11 @@ void WDSPRxGUI::displaySettings()
|
||||
{
|
||||
m_channelMarker.blockSignals(true);
|
||||
m_channelMarker.setCenterFrequency(m_settings.m_inputFrequencyOffset);
|
||||
m_channelMarker.setBandwidth(m_settings.m_profiles[m_settings.m_profileIndex].m_highCutoff * 2);
|
||||
m_channelMarker.setBandwidth((int) (m_settings.m_profiles[m_settings.m_profileIndex].m_highCutoff * 2));
|
||||
m_channelMarker.setTitle(m_settings.m_title);
|
||||
m_channelMarker.setLowCutoff(m_settings.m_profiles[m_settings.m_profileIndex].m_lowCutoff);
|
||||
m_channelMarker.setLowCutoff((int) m_settings.m_profiles[m_settings.m_profileIndex].m_lowCutoff);
|
||||
int shift = m_settings.m_profiles[m_settings.m_profileIndex].m_rit ?
|
||||
m_settings.m_profiles[m_settings.m_profileIndex].m_ritFrequency :
|
||||
(int) m_settings.m_profiles[m_settings.m_profileIndex].m_ritFrequency :
|
||||
0;
|
||||
m_channelMarker.setShift(shift);
|
||||
|
||||
@ -880,7 +879,7 @@ void WDSPRxGUI::displaySettings()
|
||||
ui->dsb->setChecked(m_settings.m_dsb);
|
||||
ui->spanLog2->setValue(1 + ui->spanLog2->maximum() - m_settings.m_profiles[m_settings.m_profileIndex].m_spanLog2);
|
||||
|
||||
ui->BW->setValue(m_settings.m_profiles[m_settings.m_profileIndex].m_highCutoff / 100.0);
|
||||
ui->BW->setValue((int) (m_settings.m_profiles[m_settings.m_profileIndex].m_highCutoff / 100.0));
|
||||
s = QString::number(m_settings.m_profiles[m_settings.m_profileIndex].m_highCutoff/1000.0, 'f', 1);
|
||||
|
||||
if (m_settings.m_dsb) {
|
||||
@ -899,10 +898,10 @@ void WDSPRxGUI::displaySettings()
|
||||
|
||||
// The only one of the four signals triggering applyBandwidths will trigger it once only with all other values
|
||||
// set correctly and therefore validate the settings and apply them to dependent widgets
|
||||
ui->lowCut->setValue(m_settings.m_profiles[m_settings.m_profileIndex].m_lowCutoff / 100.0);
|
||||
ui->lowCut->setValue((int) (m_settings.m_profiles[m_settings.m_profileIndex].m_lowCutoff / 100.0));
|
||||
ui->lowCutText->setText(tr("%1k").arg(m_settings.m_profiles[m_settings.m_profileIndex].m_lowCutoff / 1000.0));
|
||||
|
||||
int volume = CalcDb::dbPower(m_settings.m_volume);
|
||||
auto volume = (int) CalcDb::dbPower(m_settings.m_volume);
|
||||
ui->volume->setValue(volume);
|
||||
ui->volumeText->setText(QString("%1").arg(volume));
|
||||
|
||||
@ -1199,15 +1198,11 @@ void WDSPRxGUI::amSetup(int iValueChanged)
|
||||
|
||||
auto valueChanged = (WDSPRxAMDialog::ValueChanged) iValueChanged;
|
||||
|
||||
switch (valueChanged)
|
||||
if (valueChanged == WDSPRxAMDialog::ChangedFadeLevel)
|
||||
{
|
||||
case WDSPRxAMDialog::ChangedFadeLevel:
|
||||
m_settings.m_amFadeLevel = m_amDialog->getFadeLevel();
|
||||
m_settings.m_profiles[m_settings.m_profileIndex].m_amFadeLevel = m_settings.m_amFadeLevel;
|
||||
applySettings();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1369,21 +1364,18 @@ void WDSPRxGUI::panSetup(int iValueChanged)
|
||||
|
||||
auto valueChanged = (WDSPRxPanDialog::ValueChanged) iValueChanged;
|
||||
|
||||
switch (valueChanged)
|
||||
if (valueChanged == WDSPRxPanDialog::ChangedPan)
|
||||
{
|
||||
case WDSPRxPanDialog::ChangedPan:
|
||||
m_settings.m_audioPan = m_panDialog->getPan();
|
||||
m_settings.m_profiles[m_settings.m_profileIndex].m_audioPan = m_settings.m_audioPan;
|
||||
applySettings();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void WDSPRxGUI::tick()
|
||||
{
|
||||
double powDbAvg, powDbPeak;
|
||||
double powDbAvg;
|
||||
double powDbPeak;
|
||||
int nbMagsqSamples;
|
||||
m_wdspRx->getMagSqLevels(powDbAvg, powDbPeak, nbMagsqSamples); // powers directly in dB
|
||||
|
||||
@ -1416,7 +1408,7 @@ void WDSPRxGUI::tick()
|
||||
m_tickCount++;
|
||||
}
|
||||
|
||||
void WDSPRxGUI::makeUIConnections()
|
||||
void WDSPRxGUI::makeUIConnections() const
|
||||
{
|
||||
QObject::connect(ui->deltaFrequency, &ValueDialZ::changed, this, &WDSPRxGUI::on_deltaFrequency_changed);
|
||||
QObject::connect(ui->audioBinaural, &QToolButton::toggled, this, &WDSPRxGUI::on_audioBinaural_toggled);
|
||||
|
@ -58,21 +58,21 @@ public:
|
||||
static WDSPRxGUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSink *rxChannel);
|
||||
virtual void destroy();
|
||||
|
||||
void resetToDefaults();
|
||||
QByteArray serialize() const;
|
||||
bool deserialize(const QByteArray& data);
|
||||
virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; }
|
||||
virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; };
|
||||
virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; };
|
||||
virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; };
|
||||
virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; };
|
||||
virtual QString getTitle() const { return m_settings.m_title; };
|
||||
virtual QColor getTitleColor() const { return m_settings.m_rgbColor; };
|
||||
virtual void zetHidden(bool hidden) { m_settings.m_hidden = hidden; }
|
||||
virtual bool getHidden() const { return m_settings.m_hidden; }
|
||||
virtual ChannelMarker& getChannelMarker() { return m_channelMarker; }
|
||||
virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
|
||||
virtual void setStreamIndex(int streamIndex) { m_settings.m_streamIndex = streamIndex; }
|
||||
void resetToDefaults() final;
|
||||
QByteArray serialize() const final;
|
||||
bool deserialize(const QByteArray& data) final;
|
||||
MessageQueue *getInputMessageQueue() final { return &m_inputMessageQueue; }
|
||||
void setWorkspaceIndex(int index) final { m_settings.m_workspaceIndex = index; };
|
||||
int getWorkspaceIndex() const final { return m_settings.m_workspaceIndex; };
|
||||
void setGeometryBytes(const QByteArray& blob) final { m_settings.m_geometryBytes = blob; };
|
||||
QByteArray getGeometryBytes() const final { return m_settings.m_geometryBytes; };
|
||||
QString getTitle() const final { return m_settings.m_title; };
|
||||
QColor getTitleColor() const final { return m_settings.m_rgbColor; };
|
||||
void zetHidden(bool hidden) final { m_settings.m_hidden = hidden; }
|
||||
bool getHidden() const final { return m_settings.m_hidden; }
|
||||
ChannelMarker& getChannelMarker() final { return m_channelMarker; }
|
||||
int getStreamIndex() const final { return m_settings.m_streamIndex; }
|
||||
void setStreamIndex(int streamIndex) final { m_settings.m_streamIndex = streamIndex; }
|
||||
|
||||
public slots:
|
||||
void channelMarkerChangedByCursor();
|
||||
@ -122,21 +122,21 @@ private:
|
||||
QIcon m_iconDSBUSB;
|
||||
QIcon m_iconDSBLSB;
|
||||
|
||||
explicit WDSPRxGUI(PluginAPI* pluginAPI, DeviceUISet* deviceUISet, BasebandSampleSink *rxChannel, QWidget* parent = 0);
|
||||
virtual ~WDSPRxGUI();
|
||||
explicit WDSPRxGUI(PluginAPI* pluginAPI, DeviceUISet* deviceUISet, BasebandSampleSink *rxChannel, QWidget* parent = nullptr);
|
||||
~WDSPRxGUI() final;
|
||||
|
||||
bool blockApplySettings(bool block);
|
||||
void applySettings(bool force = false);
|
||||
void applyBandwidths(unsigned int spanLog2, bool force = false);
|
||||
unsigned int spanLog2Max();
|
||||
unsigned int spanLog2Max() const;
|
||||
void displaySettings();
|
||||
bool handleMessage(const Message& message);
|
||||
void makeUIConnections();
|
||||
void makeUIConnections() const;
|
||||
void updateAbsoluteCenterFrequency();
|
||||
uint32_t getValidAudioSampleRate() const;
|
||||
|
||||
void leaveEvent(QEvent*);
|
||||
void enterEvent(EnterEventType*);
|
||||
void leaveEvent(QEvent*) final;
|
||||
void enterEvent(EnterEventType*) final;
|
||||
|
||||
private slots:
|
||||
void on_deltaFrequency_changed(qint64 value);
|
||||
@ -164,7 +164,7 @@ private slots:
|
||||
void on_rit_toggled(bool checked);
|
||||
void on_ritFrequency_valueChanged(int value);
|
||||
void on_dbOrS_toggled(bool checked);
|
||||
void onWidgetRolled(QWidget* widget, bool rollDown);
|
||||
void onWidgetRolled(const QWidget* widget, bool rollDown);
|
||||
void onMenuDialogCalled(const QPoint& p);
|
||||
void handleInputMessages();
|
||||
void audioSelect(const QPoint& p);
|
||||
|
@ -55,12 +55,7 @@ const char* const AMMod::m_channelId ="AMMod";
|
||||
|
||||
AMMod::AMMod(DeviceAPI *deviceAPI) :
|
||||
ChannelAPI(m_channelIdURI, ChannelAPI::StreamSingleSource),
|
||||
m_deviceAPI(deviceAPI),
|
||||
m_running(false),
|
||||
m_fileSize(0),
|
||||
m_recordLength(0),
|
||||
m_sampleRate(48000),
|
||||
m_levelMeter(nullptr)
|
||||
m_deviceAPI(deviceAPI)
|
||||
{
|
||||
setObjectName(m_channelId);
|
||||
applySettings(m_settings, true);
|
||||
@ -89,7 +84,7 @@ AMMod::~AMMod()
|
||||
m_deviceAPI->removeChannelSourceAPI(this);
|
||||
m_deviceAPI->removeChannelSource(this);
|
||||
|
||||
stop();
|
||||
AMMod::stop();
|
||||
}
|
||||
|
||||
void AMMod::setDeviceAPI(DeviceAPI *deviceAPI)
|
||||
@ -185,7 +180,7 @@ bool AMMod::handleMessage(const Message& cmd)
|
||||
{
|
||||
if (MsgConfigureAMMod::match(cmd))
|
||||
{
|
||||
MsgConfigureAMMod& cfg = (MsgConfigureAMMod&) cmd;
|
||||
auto& cfg = (const MsgConfigureAMMod&) cmd;
|
||||
qDebug() << "AMMod::handleMessage: MsgConfigureAMMod";
|
||||
|
||||
applySettings(cfg.getSettings(), cfg.getForce());
|
||||
@ -194,7 +189,7 @@ bool AMMod::handleMessage(const Message& cmd)
|
||||
}
|
||||
else if (MsgConfigureFileSourceName::match(cmd))
|
||||
{
|
||||
MsgConfigureFileSourceName& conf = (MsgConfigureFileSourceName&) cmd;
|
||||
auto& conf = (const MsgConfigureFileSourceName&) cmd;
|
||||
m_fileName = conf.getFileName();
|
||||
qDebug() << "AMMod::handleMessage: MsgConfigureFileSourceName";
|
||||
openFileStream();
|
||||
@ -202,7 +197,7 @@ bool AMMod::handleMessage(const Message& cmd)
|
||||
}
|
||||
else if (MsgConfigureFileSourceSeek::match(cmd))
|
||||
{
|
||||
MsgConfigureFileSourceSeek& conf = (MsgConfigureFileSourceSeek&) cmd;
|
||||
auto& conf = (const MsgConfigureFileSourceSeek&) cmd;
|
||||
int seekPercentage = conf.getPercentage();
|
||||
qDebug() << "AMMod::handleMessage: MsgConfigureFileSourceSeek";
|
||||
seekFileStream(seekPercentage);
|
||||
@ -211,13 +206,13 @@ bool AMMod::handleMessage(const Message& cmd)
|
||||
}
|
||||
else if (MsgConfigureFileSourceStreamTiming::match(cmd))
|
||||
{
|
||||
std::size_t samplesCount;
|
||||
std::size_t samplesCount;
|
||||
|
||||
if (m_ifstream.eof()) {
|
||||
samplesCount = m_fileSize / sizeof(Real);
|
||||
} else {
|
||||
samplesCount = m_ifstream.tellg() / sizeof(Real);
|
||||
}
|
||||
if (m_ifstream.eof()) {
|
||||
samplesCount = m_fileSize / sizeof(Real);
|
||||
} else {
|
||||
samplesCount = m_ifstream.tellg() / sizeof(Real);
|
||||
}
|
||||
|
||||
MsgReportFileSourceStreamTiming *report;
|
||||
report = MsgReportFileSourceStreamTiming::create(samplesCount);
|
||||
@ -227,7 +222,7 @@ bool AMMod::handleMessage(const Message& cmd)
|
||||
}
|
||||
else if (CWKeyer::MsgConfigureCWKeyer::match(cmd))
|
||||
{
|
||||
const CWKeyer::MsgConfigureCWKeyer& cfg = (CWKeyer::MsgConfigureCWKeyer&) cmd;
|
||||
auto& cfg = (const CWKeyer::MsgConfigureCWKeyer&) cmd;
|
||||
qDebug() << "AMMod::handleMessage: MsgConfigureCWKeyer";
|
||||
|
||||
if (m_settings.m_useReverseAPI) {
|
||||
@ -240,7 +235,7 @@ bool AMMod::handleMessage(const Message& cmd)
|
||||
{
|
||||
qDebug() << "AMMod::handleMessage: DSPSignalNotification";
|
||||
// Forward to the source
|
||||
DSPSignalNotification& notif = (DSPSignalNotification&) cmd;
|
||||
auto& notif = (const DSPSignalNotification&) cmd;
|
||||
|
||||
if (m_running) {
|
||||
m_basebandSource->getInputMessageQueue()->push(new DSPSignalNotification(notif));
|
||||
@ -276,7 +271,7 @@ void AMMod::openFileStream()
|
||||
m_ifstream.seekg(0,std::ios_base::beg);
|
||||
|
||||
m_sampleRate = 48000; // fixed rate
|
||||
m_recordLength = m_fileSize / (sizeof(Real) * m_sampleRate);
|
||||
m_recordLength = (quint32) (m_fileSize / (sizeof(Real) * m_sampleRate));
|
||||
|
||||
qDebug() << "AMMod::openFileStream: " << m_fileName.toStdString().c_str()
|
||||
<< " fileSize: " << m_fileSize << "bytes"
|
||||
@ -394,7 +389,7 @@ void AMMod::applySettings(const AMModSettings& settings, bool force)
|
||||
QList<ObjectPipe*> pipes;
|
||||
MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes);
|
||||
|
||||
if (pipes.size() > 0) {
|
||||
if (!pipes.empty()) {
|
||||
sendChannelSettings(pipes, reverseAPIKeys, settings, force);
|
||||
}
|
||||
|
||||
@ -423,12 +418,12 @@ bool AMMod::deserialize(const QByteArray& data)
|
||||
}
|
||||
}
|
||||
|
||||
void AMMod::sendSampleRateToDemodAnalyzer()
|
||||
void AMMod::sendSampleRateToDemodAnalyzer() const
|
||||
{
|
||||
QList<ObjectPipe*> pipes;
|
||||
MainCore::instance()->getMessagePipes().getMessagePipes(this, "reportdemod", pipes);
|
||||
|
||||
if (pipes.size() > 0)
|
||||
if (!pipes.empty())
|
||||
{
|
||||
for (const auto& pipe : pipes)
|
||||
{
|
||||
@ -555,13 +550,13 @@ void AMMod::webapiUpdateChannelSettings(
|
||||
settings.m_reverseAPIAddress = *response.getAmModSettings()->getReverseApiAddress();
|
||||
}
|
||||
if (channelSettingsKeys.contains("reverseAPIPort")) {
|
||||
settings.m_reverseAPIPort = response.getAmModSettings()->getReverseApiPort();
|
||||
settings.m_reverseAPIPort = (uint16_t) response.getAmModSettings()->getReverseApiPort();
|
||||
}
|
||||
if (channelSettingsKeys.contains("reverseAPIDeviceIndex")) {
|
||||
settings.m_reverseAPIDeviceIndex = response.getAmModSettings()->getReverseApiDeviceIndex();
|
||||
settings.m_reverseAPIDeviceIndex = (uint16_t) response.getAmModSettings()->getReverseApiDeviceIndex();
|
||||
}
|
||||
if (channelSettingsKeys.contains("reverseAPIChannelIndex")) {
|
||||
settings.m_reverseAPIChannelIndex = response.getAmModSettings()->getReverseApiChannelIndex();
|
||||
settings.m_reverseAPIChannelIndex = (uint16_t) response.getAmModSettings()->getReverseApiChannelIndex();
|
||||
}
|
||||
if (settings.m_channelMarker && channelSettingsKeys.contains("channelMarker")) {
|
||||
settings.m_channelMarker->updateFrom(channelSettingsKeys, response.getAmModSettings()->getChannelMarker());
|
||||
@ -631,7 +626,7 @@ void AMMod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& respons
|
||||
}
|
||||
else
|
||||
{
|
||||
SWGSDRangel::SWGChannelMarker *swgChannelMarker = new SWGSDRangel::SWGChannelMarker();
|
||||
auto *swgChannelMarker = new SWGSDRangel::SWGChannelMarker();
|
||||
settings.m_channelMarker->formatTo(swgChannelMarker);
|
||||
response.getAmModSettings()->setChannelMarker(swgChannelMarker);
|
||||
}
|
||||
@ -645,16 +640,16 @@ void AMMod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& respons
|
||||
}
|
||||
else
|
||||
{
|
||||
SWGSDRangel::SWGRollupState *swgRollupState = new SWGSDRangel::SWGRollupState();
|
||||
auto *swgRollupState = new SWGSDRangel::SWGRollupState();
|
||||
settings.m_rollupState->formatTo(swgRollupState);
|
||||
response.getAmModSettings()->setRollupState(swgRollupState);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void AMMod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response)
|
||||
void AMMod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response) const
|
||||
{
|
||||
response.getAmModReport()->setChannelPowerDb(CalcDb::dbPower(getMagSq()));
|
||||
response.getAmModReport()->setChannelPowerDb((float) CalcDb::dbPower(getMagSq()));
|
||||
|
||||
if (m_running)
|
||||
{
|
||||
@ -663,9 +658,9 @@ void AMMod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response)
|
||||
}
|
||||
}
|
||||
|
||||
void AMMod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const AMModSettings& settings, bool force)
|
||||
void AMMod::webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const AMModSettings& settings, bool force)
|
||||
{
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
|
||||
auto *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
|
||||
webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force);
|
||||
|
||||
QString channelSettingsURL = QString("http://%1:%2/sdrangel/deviceset/%3/channel/%4/settings")
|
||||
@ -676,8 +671,8 @@ void AMMod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const
|
||||
m_networkRequest.setUrl(QUrl(channelSettingsURL));
|
||||
m_networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
|
||||
|
||||
QBuffer *buffer = new QBuffer();
|
||||
buffer->open((QBuffer::ReadWrite));
|
||||
auto *buffer = new QBuffer();
|
||||
buffer->open(QBuffer::ReadWrite);
|
||||
buffer->write(swgChannelSettings->asJson().toUtf8());
|
||||
buffer->seek(0);
|
||||
|
||||
@ -690,7 +685,7 @@ void AMMod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const
|
||||
|
||||
void AMMod::webapiReverseSendCWSettings(const CWKeyerSettings& cwKeyerSettings)
|
||||
{
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
|
||||
auto *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
|
||||
swgChannelSettings->setDirection(1); // single source (Tx)
|
||||
swgChannelSettings->setChannelType(new QString("AMMod"));
|
||||
swgChannelSettings->setAmModSettings(new SWGSDRangel::SWGAMModSettings());
|
||||
@ -698,7 +693,7 @@ void AMMod::webapiReverseSendCWSettings(const CWKeyerSettings& cwKeyerSettings)
|
||||
|
||||
swgAMModSettings->setCwKeyer(new SWGSDRangel::SWGCWKeyerSettings());
|
||||
SWGSDRangel::SWGCWKeyerSettings *apiCwKeyerSettings = swgAMModSettings->getCwKeyer();
|
||||
getCWKeyer()->webapiFormatChannelSettings(apiCwKeyerSettings, cwKeyerSettings);
|
||||
CWKeyer::webapiFormatChannelSettings(apiCwKeyerSettings, cwKeyerSettings);
|
||||
|
||||
QString channelSettingsURL = QString("http://%1:%2/sdrangel/deviceset/%3/channel/%4/settings")
|
||||
.arg(m_settings.m_reverseAPIAddress)
|
||||
@ -708,8 +703,8 @@ void AMMod::webapiReverseSendCWSettings(const CWKeyerSettings& cwKeyerSettings)
|
||||
m_networkRequest.setUrl(QUrl(channelSettingsURL));
|
||||
m_networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
|
||||
|
||||
QBuffer *buffer = new QBuffer();
|
||||
buffer->open((QBuffer::ReadWrite));
|
||||
auto *buffer = new QBuffer();
|
||||
buffer->open(QBuffer::ReadWrite);
|
||||
buffer->write(swgChannelSettings->asJson().toUtf8());
|
||||
buffer->seek(0);
|
||||
|
||||
@ -722,7 +717,7 @@ void AMMod::webapiReverseSendCWSettings(const CWKeyerSettings& cwKeyerSettings)
|
||||
|
||||
void AMMod::sendChannelSettings(
|
||||
const QList<ObjectPipe*>& pipes,
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
const AMModSettings& settings,
|
||||
bool force)
|
||||
{
|
||||
@ -732,7 +727,7 @@ void AMMod::sendChannelSettings(
|
||||
|
||||
if (messageQueue)
|
||||
{
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
|
||||
auto *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
|
||||
webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force);
|
||||
MainCore::MsgChannelSettings *msg = MainCore::MsgChannelSettings::create(
|
||||
this,
|
||||
@ -746,7 +741,7 @@ void AMMod::sendChannelSettings(
|
||||
}
|
||||
|
||||
void AMMod::webapiFormatChannelSettings(
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
|
||||
const AMModSettings& settings,
|
||||
bool force
|
||||
@ -803,25 +798,25 @@ void AMMod::webapiFormatChannelSettings(
|
||||
const CWKeyerSettings& cwKeyerSettings = getCWKeyer()->getSettings();
|
||||
swgAMModSettings->setCwKeyer(new SWGSDRangel::SWGCWKeyerSettings());
|
||||
SWGSDRangel::SWGCWKeyerSettings *apiCwKeyerSettings = swgAMModSettings->getCwKeyer();
|
||||
getCWKeyer()->webapiFormatChannelSettings(apiCwKeyerSettings, cwKeyerSettings);
|
||||
CWKeyer::webapiFormatChannelSettings(apiCwKeyerSettings, cwKeyerSettings);
|
||||
}
|
||||
|
||||
if (settings.m_channelMarker && (channelSettingsKeys.contains("channelMarker") || force))
|
||||
{
|
||||
SWGSDRangel::SWGChannelMarker *swgChannelMarker = new SWGSDRangel::SWGChannelMarker();
|
||||
auto *swgChannelMarker = new SWGSDRangel::SWGChannelMarker();
|
||||
settings.m_channelMarker->formatTo(swgChannelMarker);
|
||||
swgAMModSettings->setChannelMarker(swgChannelMarker);
|
||||
}
|
||||
|
||||
if (settings.m_rollupState && (channelSettingsKeys.contains("rollupState") || force))
|
||||
{
|
||||
SWGSDRangel::SWGRollupState *swgRollupState = new SWGSDRangel::SWGRollupState();
|
||||
auto *swgRollupState = new SWGSDRangel::SWGRollupState();
|
||||
settings.m_rollupState->formatTo(swgRollupState);
|
||||
swgAMModSettings->setRollupState(swgRollupState);
|
||||
}
|
||||
}
|
||||
|
||||
void AMMod::networkManagerFinished(QNetworkReply *reply)
|
||||
void AMMod::networkManagerFinished(QNetworkReply *reply) const
|
||||
{
|
||||
QNetworkReply::NetworkError replyError = reply->error();
|
||||
|
||||
|
@ -251,7 +251,7 @@ private:
|
||||
|
||||
DeviceAPI* m_deviceAPI;
|
||||
QThread *m_thread;
|
||||
bool m_running;
|
||||
bool m_running = false;
|
||||
AMModBaseband* m_basebandSource;
|
||||
AMModSettings m_settings;
|
||||
|
||||
@ -260,38 +260,38 @@ private:
|
||||
|
||||
std::ifstream m_ifstream;
|
||||
QString m_fileName;
|
||||
quint64 m_fileSize; //!< raw file size (bytes)
|
||||
quint32 m_recordLength; //!< record length in seconds computed from file size
|
||||
int m_sampleRate;
|
||||
quint64 m_fileSize = 0; //!< raw file size (bytes)
|
||||
quint32 m_recordLength = 0; //!< record length in seconds computed from file size
|
||||
int m_sampleRate = 48000;
|
||||
|
||||
QNetworkAccessManager *m_networkManager;
|
||||
QNetworkRequest m_networkRequest;
|
||||
CWKeyer m_cwKeyer;
|
||||
QObject *m_levelMeter;
|
||||
QObject *m_levelMeter = nullptr;
|
||||
|
||||
virtual bool handleMessage(const Message& cmd);
|
||||
void applySettings(const AMModSettings& settings, bool force = false);
|
||||
void sendSampleRateToDemodAnalyzer();
|
||||
void sendSampleRateToDemodAnalyzer() const;
|
||||
void openFileStream();
|
||||
void seekFileStream(int seekPercentage);
|
||||
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
|
||||
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const AMModSettings& settings, bool force);
|
||||
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response) const;
|
||||
void webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const AMModSettings& settings, bool force);
|
||||
void webapiReverseSendCWSettings(const CWKeyerSettings& settings);
|
||||
void sendChannelSettings(
|
||||
const QList<ObjectPipe*>& pipes,
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
const AMModSettings& settings,
|
||||
bool force
|
||||
);
|
||||
void webapiFormatChannelSettings(
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
|
||||
const AMModSettings& settings,
|
||||
bool force
|
||||
);
|
||||
|
||||
private slots:
|
||||
void networkManagerFinished(QNetworkReply *reply);
|
||||
void networkManagerFinished(QNetworkReply *reply) const;
|
||||
};
|
||||
|
||||
|
||||
|
@ -45,7 +45,7 @@
|
||||
|
||||
AMModGUI* AMModGUI::create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSource *channelTx)
|
||||
{
|
||||
AMModGUI* gui = new AMModGUI(pluginAPI, deviceUISet, channelTx);
|
||||
auto* gui = new AMModGUI(pluginAPI, deviceUISet, channelTx);
|
||||
return gui;
|
||||
}
|
||||
|
||||
@ -82,21 +82,23 @@ bool AMModGUI::handleMessage(const Message& message)
|
||||
{
|
||||
if (AMMod::MsgReportFileSourceStreamData::match(message))
|
||||
{
|
||||
m_recordSampleRate = ((AMMod::MsgReportFileSourceStreamData&)message).getSampleRate();
|
||||
m_recordLength = ((AMMod::MsgReportFileSourceStreamData&)message).getRecordLength();
|
||||
auto& cmd = (const AMMod::MsgReportFileSourceStreamData&) message;
|
||||
m_recordSampleRate = cmd.getSampleRate();
|
||||
m_recordLength = cmd.getRecordLength();
|
||||
m_samplesCount = 0;
|
||||
updateWithStreamData();
|
||||
return true;
|
||||
}
|
||||
else if (AMMod::MsgReportFileSourceStreamTiming::match(message))
|
||||
{
|
||||
m_samplesCount = ((AMMod::MsgReportFileSourceStreamTiming&)message).getSamplesCount();
|
||||
auto& cmd = (const AMMod::MsgReportFileSourceStreamTiming&) message;
|
||||
m_samplesCount = (int) cmd.getSamplesCount();
|
||||
updateWithStreamTime();
|
||||
return true;
|
||||
}
|
||||
else if (AMMod::MsgConfigureAMMod::match(message))
|
||||
{
|
||||
const AMMod::MsgConfigureAMMod& cfg = (AMMod::MsgConfigureAMMod&) message;
|
||||
auto& cfg = (const AMMod::MsgConfigureAMMod&) message;
|
||||
m_settings = cfg.getSettings();
|
||||
blockApplySettings(true);
|
||||
m_channelMarker.updateSettings(static_cast<const ChannelMarker*>(m_settings.m_channelMarker));
|
||||
@ -106,14 +108,14 @@ bool AMModGUI::handleMessage(const Message& message)
|
||||
}
|
||||
else if (CWKeyer::MsgConfigureCWKeyer::match(message))
|
||||
{
|
||||
const CWKeyer::MsgConfigureCWKeyer& cfg = (CWKeyer::MsgConfigureCWKeyer&) message;
|
||||
auto& cfg = (const CWKeyer::MsgConfigureCWKeyer&) message;
|
||||
ui->cwKeyerGUI->setSettings(cfg.getSettings());
|
||||
ui->cwKeyerGUI->displaySettings();
|
||||
return true;
|
||||
}
|
||||
else if (DSPSignalNotification::match(message))
|
||||
{
|
||||
const DSPSignalNotification& notif = (const DSPSignalNotification&) message;
|
||||
auto& notif = (const DSPSignalNotification&) message;
|
||||
m_deviceCenterFrequency = notif.getCenterFrequency();
|
||||
m_basebandSampleRate = notif.getSampleRate();
|
||||
ui->deltaFrequency->setValueRange(false, 7, -m_basebandSampleRate/2, m_basebandSampleRate/2);
|
||||
@ -138,7 +140,7 @@ void AMModGUI::handleSourceMessages()
|
||||
{
|
||||
Message* message;
|
||||
|
||||
while ((message = getInputMessageQueue()->pop()) != 0)
|
||||
while ((message = getInputMessageQueue()->pop()) != nullptr)
|
||||
{
|
||||
if (handleMessage(*message))
|
||||
{
|
||||
@ -149,7 +151,7 @@ void AMModGUI::handleSourceMessages()
|
||||
|
||||
void AMModGUI::on_deltaFrequency_changed(qint64 value)
|
||||
{
|
||||
m_channelMarker.setCenterFrequency(value);
|
||||
m_channelMarker.setCenterFrequency((int) value);
|
||||
m_settings.m_inputFrequencyOffset = value;
|
||||
updateAbsoluteCenterFrequency();
|
||||
applySettings();
|
||||
@ -158,7 +160,7 @@ void AMModGUI::on_deltaFrequency_changed(qint64 value)
|
||||
void AMModGUI::on_rfBW_valueChanged(int value)
|
||||
{
|
||||
ui->rfBWText->setText(QString("%1 kHz").arg(value / 10.0, 0, 'f', 1));
|
||||
m_settings.m_rfBandwidth = value * 100.0;
|
||||
m_settings.m_rfBandwidth = (float) value * 100.0f;
|
||||
m_channelMarker.setBandwidth(value * 100);
|
||||
applySettings();
|
||||
}
|
||||
@ -166,21 +168,21 @@ void AMModGUI::on_rfBW_valueChanged(int value)
|
||||
void AMModGUI::on_modPercent_valueChanged(int value)
|
||||
{
|
||||
ui->modPercentText->setText(QString("%1").arg(value));
|
||||
m_settings.m_modFactor = value / 100.0;
|
||||
m_settings.m_modFactor = (float) value / 100.0f;
|
||||
applySettings();
|
||||
}
|
||||
|
||||
void AMModGUI::on_volume_valueChanged(int value)
|
||||
{
|
||||
ui->volumeText->setText(QString("%1").arg(value / 10.0, 0, 'f', 1));
|
||||
m_settings.m_volumeFactor = value / 10.0;
|
||||
m_settings.m_volumeFactor = (float) value / 10.0f;
|
||||
applySettings();
|
||||
}
|
||||
|
||||
void AMModGUI::on_toneFrequency_valueChanged(int value)
|
||||
{
|
||||
ui->toneFrequencyText->setText(QString("%1k").arg(value / 100.0, 0, 'f', 2));
|
||||
m_settings.m_toneFrequency = value * 10.0;
|
||||
m_settings.m_toneFrequency = (float) value * 10.0f;
|
||||
applySettings();
|
||||
}
|
||||
|
||||
@ -244,7 +246,7 @@ void AMModGUI::on_feedbackEnable_toggled(bool checked)
|
||||
void AMModGUI::on_feedbackVolume_valueChanged(int value)
|
||||
{
|
||||
ui->feedbackVolumeText->setText(QString("%1").arg(value / 100.0, 0, 'f', 2));
|
||||
m_settings.m_feedbackVolumeFactor = value / 100.0;
|
||||
m_settings.m_feedbackVolumeFactor = (float) value / 100.0f;
|
||||
applySettings();
|
||||
}
|
||||
|
||||
@ -265,7 +267,7 @@ void AMModGUI::on_showFileDialog_clicked(bool checked)
|
||||
{
|
||||
(void) checked;
|
||||
QString fileName = QFileDialog::getOpenFileName(this,
|
||||
tr("Open raw audio file"), ".", tr("Raw audio Files (*.raw)"), 0, QFileDialog::DontUseNativeDialog);
|
||||
tr("Open raw audio file"), ".", tr("Raw audio Files (*.raw)"), nullptr, QFileDialog::DontUseNativeDialog);
|
||||
|
||||
if (fileName != "")
|
||||
{
|
||||
@ -283,7 +285,7 @@ void AMModGUI::configureFileName()
|
||||
m_amMod->getInputMessageQueue()->push(message);
|
||||
}
|
||||
|
||||
void AMModGUI::onWidgetRolled(QWidget* widget, bool rollDown)
|
||||
void AMModGUI::onWidgetRolled(const QWidget* widget, bool rollDown)
|
||||
{
|
||||
(void) widget;
|
||||
(void) rollDown;
|
||||
@ -367,15 +369,15 @@ AMModGUI::AMModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampl
|
||||
connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(onMenuDialogCalled(const QPoint &)));
|
||||
|
||||
m_amMod = (AMMod*) channelTx;
|
||||
m_amMod->setMessageQueueToGUI(getInputMessageQueue());
|
||||
m_amMod->setMessageQueueToGUI(AMModGUI::getInputMessageQueue());
|
||||
|
||||
connect(&MainCore::instance()->getMasterTimer(), SIGNAL(timeout()), this, SLOT(tick()));
|
||||
|
||||
CRightClickEnabler *audioMuteRightClickEnabler = new CRightClickEnabler(ui->mic);
|
||||
connect(audioMuteRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(audioSelect(const QPoint &)));
|
||||
m_audioMuteRightClickEnabler = new CRightClickEnabler(ui->mic);
|
||||
connect(m_audioMuteRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(audioSelect(const QPoint &)));
|
||||
|
||||
CRightClickEnabler *feedbackRightClickEnabler = new CRightClickEnabler(ui->feedbackEnable);
|
||||
connect(feedbackRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(audioFeedbackSelect(const QPoint &)));
|
||||
m_feedbackRightClickEnabler = new CRightClickEnabler(ui->feedbackEnable);
|
||||
connect(m_feedbackRightClickEnabler, SIGNAL(rightClick(const QPoint &)), this, SLOT(audioFeedbackSelect(const QPoint &)));
|
||||
|
||||
ui->deltaFrequencyLabel->setText(QString("%1f").arg(QChar(0x94, 0x03)));
|
||||
ui->deltaFrequency->setColorMapper(ColorMapper(ColorMapper::GrayGold));
|
||||
@ -406,7 +408,7 @@ AMModGUI::AMModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampl
|
||||
|
||||
ui->cwKeyerGUI->setCWKeyer(m_amMod->getCWKeyer());
|
||||
|
||||
connect(getInputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleSourceMessages()));
|
||||
connect(AMModGUI::getInputMessageQueue(), SIGNAL(messageEnqueued()), this, SLOT(handleSourceMessages()));
|
||||
m_amMod->setLevelMeter(ui->volumeMeter);
|
||||
|
||||
displaySettings();
|
||||
@ -419,6 +421,8 @@ AMModGUI::AMModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampl
|
||||
AMModGUI::~AMModGUI()
|
||||
{
|
||||
delete ui;
|
||||
delete m_audioMuteRightClickEnabler;
|
||||
delete m_feedbackRightClickEnabler;
|
||||
}
|
||||
|
||||
void AMModGUI::blockApplySettings(bool block)
|
||||
@ -439,9 +443,9 @@ void AMModGUI::applySettings(bool force)
|
||||
void AMModGUI::displaySettings()
|
||||
{
|
||||
m_channelMarker.blockSignals(true);
|
||||
m_channelMarker.setCenterFrequency(m_settings.m_inputFrequencyOffset);
|
||||
m_channelMarker.setCenterFrequency((int) m_settings.m_inputFrequencyOffset);
|
||||
m_channelMarker.setTitle(m_settings.m_title);
|
||||
m_channelMarker.setBandwidth(m_settings.m_rfBandwidth);
|
||||
m_channelMarker.setBandwidth((int) m_settings.m_rfBandwidth);
|
||||
m_channelMarker.blockSignals(false);
|
||||
m_channelMarker.setColor(m_settings.m_rgbColor); // activate signal on the last setting only
|
||||
|
||||
@ -453,17 +457,17 @@ void AMModGUI::displaySettings()
|
||||
|
||||
ui->deltaFrequency->setValue(m_channelMarker.getCenterFrequency());
|
||||
|
||||
ui->rfBW->setValue(roundf(m_settings.m_rfBandwidth / 100.0));
|
||||
ui->rfBW->setValue((int) roundf(m_settings.m_rfBandwidth / 100.f));
|
||||
ui->rfBWText->setText(QString("%1 kHz").arg(m_settings.m_rfBandwidth / 1000.0, 0, 'f', 1));
|
||||
|
||||
int modPercent = roundf(m_settings.m_modFactor * 100.0);
|
||||
auto modPercent = (int) roundf(m_settings.m_modFactor * 100.0f);
|
||||
ui->modPercent->setValue(modPercent);
|
||||
ui->modPercentText->setText(QString("%1").arg(modPercent));
|
||||
|
||||
ui->toneFrequency->setValue(roundf(m_settings.m_toneFrequency / 10.0));
|
||||
ui->toneFrequency->setValue((int) roundf(m_settings.m_toneFrequency / 10.0f));
|
||||
ui->toneFrequencyText->setText(QString("%1k").arg(m_settings.m_toneFrequency / 1000.0, 0, 'f', 2));
|
||||
|
||||
ui->volume->setValue(roundf(m_settings.m_volumeFactor * 10.0));
|
||||
ui->volume->setValue((int) roundf(m_settings.m_volumeFactor * 10.0f));
|
||||
ui->volumeText->setText(QString("%1").arg(m_settings.m_volumeFactor, 0, 'f', 1));
|
||||
|
||||
ui->channelMute->setChecked(m_settings.m_channelMute);
|
||||
@ -480,7 +484,7 @@ void AMModGUI::displaySettings()
|
||||
ui->morseKeyer->setChecked(m_settings.m_modAFInput == AMModSettings::AMModInputAF::AMModInputCWTone);
|
||||
|
||||
ui->feedbackEnable->setChecked(m_settings.m_feedbackAudioEnable);
|
||||
ui->feedbackVolume->setValue(roundf(m_settings.m_feedbackVolumeFactor * 100.0));
|
||||
ui->feedbackVolume->setValue((int) roundf(m_settings.m_feedbackVolumeFactor * 100.0f));
|
||||
ui->feedbackVolumeText->setText(QString("%1").arg(m_settings.m_feedbackVolumeFactor, 0, 'f', 2));
|
||||
|
||||
updateIndexLabel();
|
||||
@ -605,7 +609,7 @@ void AMModGUI::updateWithStreamTime()
|
||||
}
|
||||
}
|
||||
|
||||
void AMModGUI::makeUIConnections()
|
||||
void AMModGUI::makeUIConnections() const
|
||||
{
|
||||
QObject::connect(ui->deltaFrequency, &ValueDialZ::changed, this, &AMModGUI::on_deltaFrequency_changed);
|
||||
QObject::connect(ui->rfBW, &QSlider::valueChanged, this, &AMModGUI::on_rfBW_valueChanged);
|
||||
|
@ -33,6 +33,7 @@ class DeviceUISet;
|
||||
|
||||
class AMMod;
|
||||
class BasebandSampleSource;
|
||||
class CRightClickEnabler;
|
||||
|
||||
namespace Ui {
|
||||
class AMModGUI;
|
||||
@ -45,21 +46,21 @@ public:
|
||||
static AMModGUI* create(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSource *channelTx);
|
||||
virtual void destroy();
|
||||
|
||||
void resetToDefaults();
|
||||
QByteArray serialize() const;
|
||||
bool deserialize(const QByteArray& data);
|
||||
virtual MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; }
|
||||
virtual void setWorkspaceIndex(int index) { m_settings.m_workspaceIndex = index; };
|
||||
virtual int getWorkspaceIndex() const { return m_settings.m_workspaceIndex; };
|
||||
virtual void setGeometryBytes(const QByteArray& blob) { m_settings.m_geometryBytes = blob; };
|
||||
virtual QByteArray getGeometryBytes() const { return m_settings.m_geometryBytes; };
|
||||
virtual QString getTitle() const { return m_settings.m_title; };
|
||||
virtual QColor getTitleColor() const { return m_settings.m_rgbColor; };
|
||||
virtual void zetHidden(bool hidden) { m_settings.m_hidden = hidden; }
|
||||
virtual bool getHidden() const { return m_settings.m_hidden; }
|
||||
virtual ChannelMarker& getChannelMarker() { return m_channelMarker; }
|
||||
virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
|
||||
virtual void setStreamIndex(int streamIndex) { m_settings.m_streamIndex = streamIndex; }
|
||||
void resetToDefaults() final;
|
||||
QByteArray serialize() const final;
|
||||
bool deserialize(const QByteArray& data) final;
|
||||
MessageQueue *getInputMessageQueue() final { return &m_inputMessageQueue; }
|
||||
void setWorkspaceIndex(int index) final { m_settings.m_workspaceIndex = index; };
|
||||
int getWorkspaceIndex() const final { return m_settings.m_workspaceIndex; };
|
||||
void setGeometryBytes(const QByteArray& blob) final { m_settings.m_geometryBytes = blob; };
|
||||
QByteArray getGeometryBytes() const final { return m_settings.m_geometryBytes; };
|
||||
QString getTitle() const final { return m_settings.m_title; };
|
||||
QColor getTitleColor() const final { return m_settings.m_rgbColor; };
|
||||
void zetHidden(bool hidden) final { m_settings.m_hidden = hidden; }
|
||||
bool getHidden() const final { return m_settings.m_hidden; }
|
||||
ChannelMarker& getChannelMarker() final { return m_channelMarker; }
|
||||
int getStreamIndex() const final { return m_settings.m_streamIndex; }
|
||||
void setStreamIndex(int streamIndex) final { m_settings.m_streamIndex = streamIndex; }
|
||||
|
||||
public slots:
|
||||
void channelMarkerChangedByCursor();
|
||||
@ -75,6 +76,9 @@ private:
|
||||
int m_basebandSampleRate;
|
||||
bool m_doApplySettings;
|
||||
|
||||
CRightClickEnabler *m_audioMuteRightClickEnabler;
|
||||
CRightClickEnabler *m_feedbackRightClickEnabler;
|
||||
|
||||
AMMod* m_amMod;
|
||||
MovingAverageUtil<double, double, 20> m_channelPowerDbAvg;
|
||||
|
||||
@ -88,8 +92,8 @@ private:
|
||||
bool m_enableNavTime;
|
||||
MessageQueue m_inputMessageQueue;
|
||||
|
||||
explicit AMModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSource *channelTx, QWidget* parent = 0);
|
||||
virtual ~AMModGUI();
|
||||
explicit AMModGUI(PluginAPI* pluginAPI, DeviceUISet *deviceUISet, BasebandSampleSource *channelTx, QWidget* parent = nullptr);
|
||||
~AMModGUI() final;
|
||||
|
||||
void blockApplySettings(bool block);
|
||||
void applySettings(bool force = false);
|
||||
@ -97,11 +101,11 @@ private:
|
||||
void updateWithStreamData();
|
||||
void updateWithStreamTime();
|
||||
bool handleMessage(const Message& message);
|
||||
void makeUIConnections();
|
||||
void makeUIConnections() const;
|
||||
void updateAbsoluteCenterFrequency();
|
||||
|
||||
void leaveEvent(QEvent*);
|
||||
void enterEvent(EnterEventType*);
|
||||
void leaveEvent(QEvent*) final;
|
||||
void enterEvent(EnterEventType*) final;
|
||||
|
||||
private slots:
|
||||
void handleSourceMessages();
|
||||
@ -124,7 +128,7 @@ private slots:
|
||||
void on_feedbackEnable_toggled(bool checked);
|
||||
void on_feedbackVolume_valueChanged(int value);
|
||||
|
||||
void onWidgetRolled(QWidget* widget, bool rollDown);
|
||||
void onWidgetRolled(const QWidget* widget, bool rollDown);
|
||||
void onMenuDialogCalled(const QPoint& p);
|
||||
|
||||
void configureFileName();
|
||||
|
@ -41,7 +41,7 @@ const PluginDescriptor AMModPlugin::m_pluginDescriptor = {
|
||||
|
||||
AMModPlugin::AMModPlugin(QObject* parent) :
|
||||
QObject(parent),
|
||||
m_pluginAPI(0)
|
||||
m_pluginAPI(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
@ -62,7 +62,7 @@ void AMModPlugin::createTxChannel(DeviceAPI *deviceAPI, BasebandSampleSource **b
|
||||
{
|
||||
if (bs || cs)
|
||||
{
|
||||
AMMod *instance = new AMMod(deviceAPI);
|
||||
auto *instance = new AMMod(deviceAPI);
|
||||
|
||||
if (bs) {
|
||||
*bs = instance;
|
||||
|
@ -27,20 +27,20 @@
|
||||
class DeviceUISet;
|
||||
class BasebandSampleSource;
|
||||
|
||||
class AMModPlugin : public QObject, PluginInterface {
|
||||
class AMModPlugin : public QObject, public PluginInterface {
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(PluginInterface)
|
||||
Q_PLUGIN_METADATA(IID "sdrangel.channeltx.ammod")
|
||||
|
||||
public:
|
||||
explicit AMModPlugin(QObject* parent = 0);
|
||||
explicit AMModPlugin(QObject* parent = nullptr);
|
||||
|
||||
const PluginDescriptor& getPluginDescriptor() const;
|
||||
void initPlugin(PluginAPI* pluginAPI);
|
||||
const PluginDescriptor& getPluginDescriptor() const final;
|
||||
void initPlugin(PluginAPI* pluginAPI) final;
|
||||
|
||||
virtual void createTxChannel(DeviceAPI *deviceAPI, BasebandSampleSource **bs, ChannelAPI **cs) const;
|
||||
virtual ChannelGUI* createTxChannelGUI(DeviceUISet *deviceUISet, BasebandSampleSource *txChannel) const;
|
||||
virtual ChannelWebAPIAdapter* createChannelWebAPIAdapter() const;
|
||||
void createTxChannel(DeviceAPI *deviceAPI, BasebandSampleSource **bs, ChannelAPI **cs) const final;
|
||||
ChannelGUI* createTxChannelGUI(DeviceUISet *deviceUISet, BasebandSampleSource *txChannel) const final;
|
||||
ChannelWebAPIAdapter* createChannelWebAPIAdapter() const final;
|
||||
|
||||
private:
|
||||
static const PluginDescriptor m_pluginDescriptor;
|
||||
|
@ -28,16 +28,8 @@
|
||||
const int AMModSource::m_levelNbSamples = 480; // every 10ms
|
||||
|
||||
AMModSource::AMModSource() :
|
||||
m_channelSampleRate(48000),
|
||||
m_channelFrequencyOffset(0),
|
||||
m_audioSampleRate(48000),
|
||||
m_audioFifo(12000),
|
||||
m_feedbackAudioFifo(48000),
|
||||
m_levelCalcCount(0),
|
||||
m_peakLevel(0.0f),
|
||||
m_levelSum(0.0f),
|
||||
m_ifstream(nullptr),
|
||||
m_cwKeyer(nullptr)
|
||||
m_feedbackAudioFifo(48000)
|
||||
{
|
||||
m_audioFifo.setLabel("AMModSource.m_audioFifo");
|
||||
m_feedbackAudioFifo.setLabel("AMModSource.m_feedbackAudioFifo");
|
||||
@ -57,9 +49,7 @@ AMModSource::AMModSource() :
|
||||
applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true);
|
||||
}
|
||||
|
||||
AMModSource::~AMModSource()
|
||||
{
|
||||
}
|
||||
AMModSource::~AMModSource() = default;
|
||||
|
||||
void AMModSource::pull(SampleVector::iterator begin, unsigned int nbSamples)
|
||||
{
|
||||
@ -111,7 +101,7 @@ void AMModSource::pullOne(Sample& sample)
|
||||
sample.m_real = (FixReal) ci.real();
|
||||
sample.m_imag = (FixReal) ci.imag();
|
||||
|
||||
m_demodBuffer[m_demodBufferFill] = ci.real() + ci.imag();
|
||||
m_demodBuffer[m_demodBufferFill] = (qint16) (ci.real() + ci.imag());
|
||||
++m_demodBufferFill;
|
||||
|
||||
if (m_demodBufferFill >= m_demodBuffer.size())
|
||||
@ -119,13 +109,11 @@ void AMModSource::pullOne(Sample& sample)
|
||||
QList<ObjectPipe*> dataPipes;
|
||||
MainCore::instance()->getDataPipes().getDataPipes(m_channel, "demod", dataPipes);
|
||||
|
||||
if (dataPipes.size() > 0)
|
||||
if (!dataPipes.empty())
|
||||
{
|
||||
QList<ObjectPipe*>::iterator it = dataPipes.begin();
|
||||
|
||||
for (; it != dataPipes.end(); ++it)
|
||||
for (auto& dataPipe : dataPipes)
|
||||
{
|
||||
DataFifo *fifo = qobject_cast<DataFifo*>((*it)->m_element);
|
||||
DataFifo *fifo = qobject_cast<DataFifo*>(dataPipe->m_element);
|
||||
|
||||
if (fifo) {
|
||||
fifo->write((quint8*) &m_demodBuffer[0], m_demodBuffer.size() * sizeof(qint16), DataFifo::DataTypeI16);
|
||||
@ -139,7 +127,7 @@ void AMModSource::pullOne(Sample& sample)
|
||||
|
||||
void AMModSource::prefetch(unsigned int nbSamples)
|
||||
{
|
||||
unsigned int nbSamplesAudio = nbSamples * ((Real) m_audioSampleRate / (Real) m_channelSampleRate);
|
||||
auto nbSamplesAudio = (nbSamples * (unsigned int) ((Real) m_audioSampleRate / (Real) m_channelSampleRate));
|
||||
pullAudio(nbSamplesAudio);
|
||||
}
|
||||
|
||||
@ -163,7 +151,7 @@ void AMModSource::pullAudio(unsigned int nbSamples)
|
||||
|
||||
void AMModSource::modulateSample()
|
||||
{
|
||||
Real t;
|
||||
Real t = 0.0f;
|
||||
|
||||
pullAF(t);
|
||||
|
||||
@ -186,17 +174,12 @@ void AMModSource::pullAF(Real& sample)
|
||||
sample = m_toneNco.next();
|
||||
break;
|
||||
case AMModSettings::AMModInputFile:
|
||||
// sox f4exb_call.wav --encoding float --endian little f4exb_call.raw
|
||||
// ffplay -f f32le -ar 48k -ac 1 f4exb_call.raw
|
||||
if (m_ifstream && m_ifstream->is_open())
|
||||
{
|
||||
if (m_ifstream->eof())
|
||||
if ((m_ifstream->eof()) && (m_settings.m_playLoop))
|
||||
{
|
||||
if (m_settings.m_playLoop)
|
||||
{
|
||||
m_ifstream->clear();
|
||||
m_ifstream->seekg(0, std::ios::beg);
|
||||
}
|
||||
m_ifstream->clear();
|
||||
m_ifstream->seekg(0, std::ios::beg);
|
||||
}
|
||||
|
||||
if (m_ifstream->eof())
|
||||
@ -242,7 +225,6 @@ void AMModSource::pullAF(Real& sample)
|
||||
}
|
||||
}
|
||||
break;
|
||||
case AMModSettings::AMModInputNone:
|
||||
default:
|
||||
sample = 0.0f;
|
||||
break;
|
||||
@ -272,10 +254,10 @@ void AMModSource::pushFeedback(Real sample)
|
||||
}
|
||||
}
|
||||
|
||||
void AMModSource::processOneSample(Complex& ci)
|
||||
void AMModSource::processOneSample(const Complex& ci)
|
||||
{
|
||||
m_feedbackAudioBuffer[m_feedbackAudioBufferFill].l = ci.real();
|
||||
m_feedbackAudioBuffer[m_feedbackAudioBufferFill].r = ci.imag();
|
||||
m_feedbackAudioBuffer[m_feedbackAudioBufferFill].l = (qint16) ci.real();
|
||||
m_feedbackAudioBuffer[m_feedbackAudioBufferFill].r = (qint16) ci.imag();
|
||||
++m_feedbackAudioBufferFill;
|
||||
|
||||
if (m_feedbackAudioBufferFill >= m_feedbackAudioBuffer.size())
|
||||
@ -293,7 +275,7 @@ void AMModSource::processOneSample(Complex& ci)
|
||||
}
|
||||
}
|
||||
|
||||
void AMModSource::calculateLevel(Real& sample)
|
||||
void AMModSource::calculateLevel(const Real& sample)
|
||||
{
|
||||
if (m_levelCalcCount < m_levelNbSamples)
|
||||
{
|
||||
@ -325,7 +307,7 @@ void AMModSource::applyAudioSampleRate(int sampleRate)
|
||||
m_interpolatorConsumed = false;
|
||||
m_interpolatorDistance = (Real) sampleRate / (Real) m_channelSampleRate;
|
||||
m_interpolator.create(48, sampleRate, m_settings.m_rfBandwidth / 2.2, 3.0);
|
||||
m_toneNco.setFreq(m_settings.m_toneFrequency, sampleRate);
|
||||
m_toneNco.setFreq(m_settings.m_toneFrequency, (float) sampleRate);
|
||||
|
||||
if (m_cwKeyer)
|
||||
{
|
||||
@ -336,7 +318,7 @@ void AMModSource::applyAudioSampleRate(int sampleRate)
|
||||
QList<ObjectPipe*> pipes;
|
||||
MainCore::instance()->getMessagePipes().getMessagePipes(m_channel, "reportdemod", pipes);
|
||||
|
||||
if (pipes.size() > 0)
|
||||
if (!pipes.empty())
|
||||
{
|
||||
for (const auto& pipe : pipes)
|
||||
{
|
||||
@ -362,7 +344,7 @@ void AMModSource::applyFeedbackAudioSampleRate(int sampleRate)
|
||||
|
||||
m_feedbackInterpolatorDistanceRemain = 0;
|
||||
m_feedbackInterpolatorDistance = (Real) sampleRate / (Real) m_audioSampleRate;
|
||||
Real cutoff = std::min(sampleRate, m_audioSampleRate) / 2.2f;
|
||||
Real cutoff = ((float) std::min(sampleRate, m_audioSampleRate)) / 2.2f;
|
||||
m_feedbackInterpolator.create(48, sampleRate, cutoff, 3.0);
|
||||
m_feedbackAudioSampleRate = sampleRate;
|
||||
}
|
||||
@ -375,9 +357,8 @@ void AMModSource::applySettings(const AMModSettings& settings, bool force)
|
||||
applyAudioSampleRate(m_audioSampleRate);
|
||||
}
|
||||
|
||||
if ((settings.m_toneFrequency != m_settings.m_toneFrequency) || force)
|
||||
{
|
||||
m_toneNco.setFreq(settings.m_toneFrequency, m_audioSampleRate);
|
||||
if ((settings.m_toneFrequency != m_settings.m_toneFrequency) || force) {
|
||||
m_toneNco.setFreq(settings.m_toneFrequency, (float) m_audioSampleRate);
|
||||
}
|
||||
|
||||
if ((settings.m_modAFInput != m_settings.m_modAFInput) || force)
|
||||
@ -401,7 +382,7 @@ void AMModSource::applyChannelSettings(int channelSampleRate, int channelFrequen
|
||||
if ((channelFrequencyOffset != m_channelFrequencyOffset)
|
||||
|| (channelSampleRate != m_channelSampleRate) || force)
|
||||
{
|
||||
m_carrierNco.setFreq(channelFrequencyOffset, channelSampleRate);
|
||||
m_carrierNco.setFreq((float) channelFrequencyOffset, (float) channelSampleRate);
|
||||
}
|
||||
|
||||
if ((channelSampleRate != m_channelSampleRate) || force)
|
||||
@ -418,7 +399,6 @@ void AMModSource::applyChannelSettings(int channelSampleRate, int channelFrequen
|
||||
|
||||
void AMModSource::handleAudio()
|
||||
{
|
||||
QMutexLocker mlock(&m_mutex);
|
||||
unsigned int nbRead;
|
||||
|
||||
while ((nbRead = m_audioFifo.read(reinterpret_cast<quint8*>(&m_audioReadBuffer[m_audioReadBufferFill]), 4096)) != 0)
|
||||
|
@ -43,11 +43,11 @@ class AMModSource : public QObject, public ChannelSampleSource
|
||||
Q_OBJECT
|
||||
public:
|
||||
AMModSource();
|
||||
virtual ~AMModSource();
|
||||
~AMModSource() final;
|
||||
|
||||
virtual void pull(SampleVector::iterator begin, unsigned int nbSamples);
|
||||
virtual void pullOne(Sample& sample);
|
||||
virtual void prefetch(unsigned int nbSamples);
|
||||
void pull(SampleVector::iterator begin, unsigned int nbSamples) final;
|
||||
void pullOne(Sample& sample) final;
|
||||
void prefetch(unsigned int nbSamples) final;
|
||||
|
||||
void setInputFileStream(std::ifstream *ifstream) { m_ifstream = ifstream; }
|
||||
AudioFifo *getAudioFifo() { return &m_audioFifo; }
|
||||
@ -70,8 +70,8 @@ public:
|
||||
void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false);
|
||||
|
||||
private:
|
||||
int m_channelSampleRate;
|
||||
int m_channelFrequencyOffset;
|
||||
int m_channelSampleRate = 48000;
|
||||
int m_channelFrequencyOffset = 0;
|
||||
AMModSettings m_settings;
|
||||
ChannelAPI *m_channel;
|
||||
|
||||
@ -91,7 +91,7 @@ private:
|
||||
double m_magsq;
|
||||
MovingAverageUtil<double, double, 16> m_movingAverage;
|
||||
|
||||
int m_audioSampleRate;
|
||||
int m_audioSampleRate = 48000;
|
||||
AudioVector m_audioBuffer;
|
||||
unsigned int m_audioBufferFill;
|
||||
AudioVector m_audioReadBuffer;
|
||||
@ -106,24 +106,24 @@ private:
|
||||
int m_demodBufferFill;
|
||||
bool m_demodBufferEnabled;
|
||||
|
||||
quint32 m_levelCalcCount;
|
||||
quint32 m_levelCalcCount = 0;
|
||||
qreal m_rmsLevel;
|
||||
qreal m_peakLevelOut;
|
||||
Real m_peakLevel;
|
||||
Real m_levelSum;
|
||||
Real m_peakLevel = 0.0f;
|
||||
Real m_levelSum = 0.0f;
|
||||
|
||||
std::ifstream *m_ifstream;
|
||||
CWKeyer *m_cwKeyer;
|
||||
std::ifstream *m_ifstream = nullptr;
|
||||
CWKeyer *m_cwKeyer = nullptr;
|
||||
|
||||
QRecursiveMutex m_mutex;
|
||||
|
||||
static const int m_levelNbSamples;
|
||||
|
||||
void processOneSample(Complex& ci);
|
||||
void processOneSample(const Complex& ci);
|
||||
void pullAF(Real& sample);
|
||||
void pullAudio(unsigned int nbSamples);
|
||||
void pushFeedback(Real sample);
|
||||
void calculateLevel(Real& sample);
|
||||
void calculateLevel(const Real& sample);
|
||||
void modulateSample();
|
||||
|
||||
private slots:
|
||||
|
@ -56,12 +56,7 @@ const char* const NFMMod::m_channelId = "NFMMod";
|
||||
|
||||
NFMMod::NFMMod(DeviceAPI *deviceAPI) :
|
||||
ChannelAPI(m_channelIdURI, ChannelAPI::StreamSingleSource),
|
||||
m_deviceAPI(deviceAPI),
|
||||
m_running(false),
|
||||
m_fileSize(0),
|
||||
m_recordLength(0),
|
||||
m_sampleRate(48000),
|
||||
m_levelMeter(nullptr)
|
||||
m_deviceAPI(deviceAPI)
|
||||
{
|
||||
setObjectName(m_channelId);
|
||||
|
||||
@ -91,7 +86,7 @@ NFMMod::~NFMMod()
|
||||
m_deviceAPI->removeChannelSourceAPI(this);
|
||||
m_deviceAPI->removeChannelSource(this);
|
||||
|
||||
stop();
|
||||
NFMMod::stop();
|
||||
}
|
||||
|
||||
void NFMMod::setDeviceAPI(DeviceAPI *deviceAPI)
|
||||
@ -182,7 +177,7 @@ bool NFMMod::handleMessage(const Message& cmd)
|
||||
{
|
||||
if (MsgConfigureNFMMod::match(cmd))
|
||||
{
|
||||
MsgConfigureNFMMod& cfg = (MsgConfigureNFMMod&) cmd;
|
||||
auto& cfg = (const MsgConfigureNFMMod&) cmd;
|
||||
qDebug() << "NFMMod::handleMessage: MsgConfigureNFMMod";
|
||||
|
||||
applySettings(cfg.getSettings(), cfg.getForce());
|
||||
@ -191,7 +186,7 @@ bool NFMMod::handleMessage(const Message& cmd)
|
||||
}
|
||||
else if (MsgConfigureFileSourceName::match(cmd))
|
||||
{
|
||||
MsgConfigureFileSourceName& conf = (MsgConfigureFileSourceName&) cmd;
|
||||
auto& conf = (const MsgConfigureFileSourceName&) cmd;
|
||||
m_fileName = conf.getFileName();
|
||||
openFileStream();
|
||||
qDebug() << "NFMMod::handleMessage: MsgConfigureFileSourceName:"
|
||||
@ -200,7 +195,7 @@ bool NFMMod::handleMessage(const Message& cmd)
|
||||
}
|
||||
else if (MsgConfigureFileSourceSeek::match(cmd))
|
||||
{
|
||||
MsgConfigureFileSourceSeek& conf = (MsgConfigureFileSourceSeek&) cmd;
|
||||
auto& conf = (const MsgConfigureFileSourceSeek&) cmd;
|
||||
int seekPercentage = conf.getPercentage();
|
||||
seekFileStream(seekPercentage);
|
||||
qDebug() << "NFMMod::handleMessage: MsgConfigureFileSourceSeek:"
|
||||
@ -226,7 +221,7 @@ bool NFMMod::handleMessage(const Message& cmd)
|
||||
}
|
||||
else if (MsgConfigureFileSourceName::match(cmd))
|
||||
{
|
||||
MsgConfigureFileSourceName& conf = (MsgConfigureFileSourceName&) cmd;
|
||||
auto& conf = (const MsgConfigureFileSourceName&) cmd;
|
||||
m_fileName = conf.getFileName();
|
||||
openFileStream();
|
||||
qDebug() << "NFMMod::handleMessage: MsgConfigureFileSourceName:"
|
||||
@ -235,7 +230,7 @@ bool NFMMod::handleMessage(const Message& cmd)
|
||||
}
|
||||
else if (MsgConfigureFileSourceSeek::match(cmd))
|
||||
{
|
||||
MsgConfigureFileSourceSeek& conf = (MsgConfigureFileSourceSeek&) cmd;
|
||||
auto& conf = (const MsgConfigureFileSourceSeek&) cmd;
|
||||
int seekPercentage = conf.getPercentage();
|
||||
seekFileStream(seekPercentage);
|
||||
qDebug() << "NFMMod::handleMessage: MsgConfigureFileSourceSeek:"
|
||||
@ -261,7 +256,7 @@ bool NFMMod::handleMessage(const Message& cmd)
|
||||
}
|
||||
else if (CWKeyer::MsgConfigureCWKeyer::match(cmd))
|
||||
{
|
||||
const CWKeyer::MsgConfigureCWKeyer& cfg = (CWKeyer::MsgConfigureCWKeyer&) cmd;
|
||||
auto& cfg = (const CWKeyer::MsgConfigureCWKeyer&) cmd;
|
||||
|
||||
if (m_settings.m_useReverseAPI) {
|
||||
webapiReverseSendCWSettings(cfg.getSettings());
|
||||
@ -274,8 +269,8 @@ bool NFMMod::handleMessage(const Message& cmd)
|
||||
// Forward to the source
|
||||
if (m_running)
|
||||
{
|
||||
DSPSignalNotification& notif = (DSPSignalNotification&) cmd;
|
||||
DSPSignalNotification* rep = new DSPSignalNotification(notif); // make a copy
|
||||
auto& notif = (const DSPSignalNotification&) cmd;
|
||||
auto* rep = new DSPSignalNotification(notif); // make a copy
|
||||
qDebug() << "NFMMod::handleMessage: DSPSignalNotification";
|
||||
m_basebandSource->getInputMessageQueue()->push(rep);
|
||||
// Forward to GUI if any
|
||||
@ -310,7 +305,7 @@ void NFMMod::openFileStream()
|
||||
m_ifstream.seekg(0,std::ios_base::beg);
|
||||
|
||||
m_sampleRate = 48000; // fixed rate
|
||||
m_recordLength = m_fileSize / (sizeof(Real) * m_sampleRate);
|
||||
m_recordLength = (quint32) (m_fileSize / (sizeof(Real) * m_sampleRate));
|
||||
|
||||
qDebug() << "NFMMod::openFileStream: " << m_fileName.toStdString().c_str()
|
||||
<< " fileSize: " << m_fileSize << "bytes"
|
||||
@ -444,7 +439,7 @@ void NFMMod::applySettings(const NFMModSettings& settings, bool force)
|
||||
QList<ObjectPipe*> pipes;
|
||||
MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes);
|
||||
|
||||
if (pipes.size() > 0) {
|
||||
if (!pipes.empty()) {
|
||||
sendChannelSettings(pipes, reverseAPIKeys, settings, force);
|
||||
}
|
||||
|
||||
@ -472,12 +467,12 @@ bool NFMMod::deserialize(const QByteArray& data)
|
||||
return success;
|
||||
}
|
||||
|
||||
void NFMMod::sendSampleRateToDemodAnalyzer()
|
||||
void NFMMod::sendSampleRateToDemodAnalyzer() const
|
||||
{
|
||||
QList<ObjectPipe*> pipes;
|
||||
MainCore::instance()->getMessagePipes().getMessagePipes(this, "reportdemod", pipes);
|
||||
|
||||
if (pipes.size() > 0)
|
||||
if (!pipes.empty())
|
||||
{
|
||||
for (const auto& pipe : pipes)
|
||||
{
|
||||
@ -625,13 +620,13 @@ void NFMMod::webapiUpdateChannelSettings(
|
||||
settings.m_reverseAPIAddress = *response.getNfmModSettings()->getReverseApiAddress();
|
||||
}
|
||||
if (channelSettingsKeys.contains("reverseAPIPort")) {
|
||||
settings.m_reverseAPIPort = response.getNfmModSettings()->getReverseApiPort();
|
||||
settings.m_reverseAPIPort = (uint16_t) response.getNfmModSettings()->getReverseApiPort();
|
||||
}
|
||||
if (channelSettingsKeys.contains("reverseAPIDeviceIndex")) {
|
||||
settings.m_reverseAPIDeviceIndex = response.getNfmModSettings()->getReverseApiDeviceIndex();
|
||||
settings.m_reverseAPIDeviceIndex = (uint16_t) response.getNfmModSettings()->getReverseApiDeviceIndex();
|
||||
}
|
||||
if (channelSettingsKeys.contains("reverseAPIChannelIndex")) {
|
||||
settings.m_reverseAPIChannelIndex = response.getNfmModSettings()->getReverseApiChannelIndex();
|
||||
settings.m_reverseAPIChannelIndex = (uint16_t) response.getNfmModSettings()->getReverseApiChannelIndex();
|
||||
}
|
||||
if (settings.m_channelMarker && channelSettingsKeys.contains("channelMarker")) {
|
||||
settings.m_channelMarker->updateFrom(channelSettingsKeys, response.getNfmModSettings()->getChannelMarker());
|
||||
@ -709,7 +704,7 @@ void NFMMod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& respon
|
||||
}
|
||||
else
|
||||
{
|
||||
SWGSDRangel::SWGChannelMarker *swgChannelMarker = new SWGSDRangel::SWGChannelMarker();
|
||||
auto *swgChannelMarker = new SWGSDRangel::SWGChannelMarker();
|
||||
settings.m_channelMarker->formatTo(swgChannelMarker);
|
||||
response.getNfmModSettings()->setChannelMarker(swgChannelMarker);
|
||||
}
|
||||
@ -723,16 +718,16 @@ void NFMMod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& respon
|
||||
}
|
||||
else
|
||||
{
|
||||
SWGSDRangel::SWGRollupState *swgRollupState = new SWGSDRangel::SWGRollupState();
|
||||
auto *swgRollupState = new SWGSDRangel::SWGRollupState();
|
||||
settings.m_rollupState->formatTo(swgRollupState);
|
||||
response.getNfmModSettings()->setRollupState(swgRollupState);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void NFMMod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response)
|
||||
void NFMMod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response) const
|
||||
{
|
||||
response.getNfmModReport()->setChannelPowerDb(CalcDb::dbPower(getMagSq()));
|
||||
response.getNfmModReport()->setChannelPowerDb((float) CalcDb::dbPower(getMagSq()));
|
||||
|
||||
if (m_running)
|
||||
{
|
||||
@ -741,9 +736,9 @@ void NFMMod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response)
|
||||
}
|
||||
}
|
||||
|
||||
void NFMMod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const NFMModSettings& settings, bool force)
|
||||
void NFMMod::webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const NFMModSettings& settings, bool force)
|
||||
{
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
|
||||
auto *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
|
||||
webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force);
|
||||
|
||||
QString channelSettingsURL = QString("http://%1:%2/sdrangel/deviceset/%3/channel/%4/settings")
|
||||
@ -754,8 +749,8 @@ void NFMMod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, cons
|
||||
m_networkRequest.setUrl(QUrl(channelSettingsURL));
|
||||
m_networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
|
||||
|
||||
QBuffer *buffer = new QBuffer();
|
||||
buffer->open((QBuffer::ReadWrite));
|
||||
auto *buffer = new QBuffer();
|
||||
buffer->open(QBuffer::ReadWrite);
|
||||
buffer->write(swgChannelSettings->asJson().toUtf8());
|
||||
buffer->seek(0);
|
||||
|
||||
@ -768,7 +763,7 @@ void NFMMod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, cons
|
||||
|
||||
void NFMMod::webapiReverseSendCWSettings(const CWKeyerSettings& cwKeyerSettings)
|
||||
{
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
|
||||
auto *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
|
||||
swgChannelSettings->setDirection(1); // single source (Tx)
|
||||
swgChannelSettings->setChannelType(new QString("NFMMod"));
|
||||
swgChannelSettings->setNfmModSettings(new SWGSDRangel::SWGNFMModSettings());
|
||||
@ -776,7 +771,7 @@ void NFMMod::webapiReverseSendCWSettings(const CWKeyerSettings& cwKeyerSettings)
|
||||
|
||||
swgNFModSettings->setCwKeyer(new SWGSDRangel::SWGCWKeyerSettings());
|
||||
SWGSDRangel::SWGCWKeyerSettings *apiCwKeyerSettings = swgNFModSettings->getCwKeyer();
|
||||
getCWKeyer()->webapiFormatChannelSettings(apiCwKeyerSettings, cwKeyerSettings);
|
||||
CWKeyer::webapiFormatChannelSettings(apiCwKeyerSettings, cwKeyerSettings);
|
||||
|
||||
QString channelSettingsURL = QString("http://%1:%2/sdrangel/deviceset/%3/channel/%4/settings")
|
||||
.arg(m_settings.m_reverseAPIAddress)
|
||||
@ -786,8 +781,8 @@ void NFMMod::webapiReverseSendCWSettings(const CWKeyerSettings& cwKeyerSettings)
|
||||
m_networkRequest.setUrl(QUrl(channelSettingsURL));
|
||||
m_networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
|
||||
|
||||
QBuffer *buffer = new QBuffer();
|
||||
buffer->open((QBuffer::ReadWrite));
|
||||
auto *buffer = new QBuffer();
|
||||
buffer->open(QBuffer::ReadWrite);
|
||||
buffer->write(swgChannelSettings->asJson().toUtf8());
|
||||
buffer->seek(0);
|
||||
|
||||
@ -800,7 +795,7 @@ void NFMMod::webapiReverseSendCWSettings(const CWKeyerSettings& cwKeyerSettings)
|
||||
|
||||
void NFMMod::sendChannelSettings(
|
||||
const QList<ObjectPipe*>& pipes,
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
const NFMModSettings& settings,
|
||||
bool force)
|
||||
{
|
||||
@ -810,7 +805,7 @@ void NFMMod::sendChannelSettings(
|
||||
|
||||
if (messageQueue)
|
||||
{
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
|
||||
auto *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
|
||||
webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force);
|
||||
MainCore::MsgChannelSettings *msg = MainCore::MsgChannelSettings::create(
|
||||
this,
|
||||
@ -824,7 +819,7 @@ void NFMMod::sendChannelSettings(
|
||||
}
|
||||
|
||||
void NFMMod::webapiFormatChannelSettings(
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
|
||||
const NFMModSettings& settings,
|
||||
bool force
|
||||
@ -902,14 +897,14 @@ void NFMMod::webapiFormatChannelSettings(
|
||||
|
||||
if (settings.m_channelMarker && (channelSettingsKeys.contains("channelMarker") || force))
|
||||
{
|
||||
SWGSDRangel::SWGChannelMarker *swgChannelMarker = new SWGSDRangel::SWGChannelMarker();
|
||||
auto *swgChannelMarker = new SWGSDRangel::SWGChannelMarker();
|
||||
settings.m_channelMarker->formatTo(swgChannelMarker);
|
||||
swgNFMModSettings->setChannelMarker(swgChannelMarker);
|
||||
}
|
||||
|
||||
if (settings.m_rollupState && (channelSettingsKeys.contains("rollupState") || force))
|
||||
{
|
||||
SWGSDRangel::SWGRollupState *swgRollupState = new SWGSDRangel::SWGRollupState();
|
||||
auto *swgRollupState = new SWGSDRangel::SWGRollupState();
|
||||
settings.m_rollupState->formatTo(swgRollupState);
|
||||
swgNFMModSettings->setRollupState(swgRollupState);
|
||||
}
|
||||
@ -919,11 +914,11 @@ void NFMMod::webapiFormatChannelSettings(
|
||||
const CWKeyerSettings& cwKeyerSettings = getCWKeyer()->getSettings();
|
||||
swgNFMModSettings->setCwKeyer(new SWGSDRangel::SWGCWKeyerSettings());
|
||||
SWGSDRangel::SWGCWKeyerSettings *apiCwKeyerSettings = swgNFMModSettings->getCwKeyer();
|
||||
getCWKeyer()->webapiFormatChannelSettings(apiCwKeyerSettings, cwKeyerSettings);
|
||||
CWKeyer::webapiFormatChannelSettings(apiCwKeyerSettings, cwKeyerSettings);
|
||||
}
|
||||
}
|
||||
|
||||
void NFMMod::networkManagerFinished(QNetworkReply *reply)
|
||||
void NFMMod::networkManagerFinished(QNetworkReply *reply) const
|
||||
{
|
||||
QNetworkReply::NetworkError replyError = reply->error();
|
||||
|
||||
|
@ -82,7 +82,7 @@ public:
|
||||
private:
|
||||
QString m_fileName;
|
||||
|
||||
MsgConfigureFileSourceName(const QString& fileName) :
|
||||
explicit MsgConfigureFileSourceName(const QString& fileName) :
|
||||
Message(),
|
||||
m_fileName(fileName)
|
||||
{ }
|
||||
@ -100,10 +100,10 @@ public:
|
||||
return new MsgConfigureFileSourceSeek(seekPercentage);
|
||||
}
|
||||
|
||||
protected:
|
||||
private:
|
||||
int m_seekPercentage; //!< percentage of seek position from the beginning 0..100
|
||||
|
||||
MsgConfigureFileSourceSeek(int seekPercentage) :
|
||||
explicit MsgConfigureFileSourceSeek(int seekPercentage) :
|
||||
Message(),
|
||||
m_seekPercentage(seekPercentage)
|
||||
{ }
|
||||
@ -138,10 +138,10 @@ public:
|
||||
return new MsgReportFileSourceStreamTiming(samplesCount);
|
||||
}
|
||||
|
||||
protected:
|
||||
private:
|
||||
std::size_t m_samplesCount;
|
||||
|
||||
MsgReportFileSourceStreamTiming(std::size_t samplesCount) :
|
||||
explicit MsgReportFileSourceStreamTiming(std::size_t samplesCount) :
|
||||
Message(),
|
||||
m_samplesCount(samplesCount)
|
||||
{ }
|
||||
@ -160,7 +160,7 @@ public:
|
||||
return new MsgReportFileSourceStreamData(sampleRate, recordLength);
|
||||
}
|
||||
|
||||
protected:
|
||||
private:
|
||||
int m_sampleRate;
|
||||
quint32 m_recordLength;
|
||||
|
||||
@ -174,55 +174,55 @@ public:
|
||||
|
||||
//=================================================================
|
||||
|
||||
NFMMod(DeviceAPI *deviceAPI);
|
||||
virtual ~NFMMod();
|
||||
virtual void destroy() { delete this; }
|
||||
virtual void setDeviceAPI(DeviceAPI *deviceAPI);
|
||||
virtual DeviceAPI *getDeviceAPI() { return m_deviceAPI; }
|
||||
explicit NFMMod(DeviceAPI *deviceAPI);
|
||||
~NFMMod() final;
|
||||
void destroy() final { delete this; }
|
||||
void setDeviceAPI(DeviceAPI *deviceAPI) final;
|
||||
DeviceAPI *getDeviceAPI() final { return m_deviceAPI; }
|
||||
|
||||
virtual void start();
|
||||
virtual void stop();
|
||||
virtual void pull(SampleVector::iterator& begin, unsigned int nbSamples);
|
||||
virtual void pushMessage(Message *msg) { m_inputMessageQueue.push(msg); }
|
||||
virtual QString getSourceName() { return objectName(); }
|
||||
void start() final;
|
||||
void stop() final;
|
||||
void pull(SampleVector::iterator& begin, unsigned int nbSamples) final;
|
||||
void pushMessage(Message *msg) final { m_inputMessageQueue.push(msg); }
|
||||
QString getSourceName() final { return objectName(); }
|
||||
|
||||
virtual void getIdentifier(QString& id) { id = objectName(); }
|
||||
virtual QString getIdentifier() const { return objectName(); }
|
||||
virtual void getTitle(QString& title) { title = m_settings.m_title; }
|
||||
virtual qint64 getCenterFrequency() const { return m_settings.m_inputFrequencyOffset; }
|
||||
virtual void setCenterFrequency(qint64 frequency);
|
||||
void getIdentifier(QString& id) final { id = objectName(); }
|
||||
QString getIdentifier() const final { return objectName(); }
|
||||
void getTitle(QString& title) final { title = m_settings.m_title; }
|
||||
qint64 getCenterFrequency() const final { return m_settings.m_inputFrequencyOffset; }
|
||||
void setCenterFrequency(qint64 frequency) final;
|
||||
|
||||
virtual QByteArray serialize() const;
|
||||
virtual bool deserialize(const QByteArray& data);
|
||||
QByteArray serialize() const final;
|
||||
bool deserialize(const QByteArray& data) final;
|
||||
|
||||
virtual int getNbSinkStreams() const { return 1; }
|
||||
virtual int getNbSourceStreams() const { return 0; }
|
||||
virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
|
||||
int getNbSinkStreams() const final { return 1; }
|
||||
int getNbSourceStreams() const final { return 0; }
|
||||
int getStreamIndex() const final { return m_settings.m_streamIndex; }
|
||||
|
||||
virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
|
||||
qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const final
|
||||
{
|
||||
(void) streamIndex;
|
||||
(void) sinkElseSource;
|
||||
return m_settings.m_inputFrequencyOffset;
|
||||
}
|
||||
|
||||
virtual int webapiSettingsGet(
|
||||
int webapiSettingsGet(
|
||||
SWGSDRangel::SWGChannelSettings& response,
|
||||
QString& errorMessage);
|
||||
QString& errorMessage) final;
|
||||
|
||||
virtual int webapiWorkspaceGet(
|
||||
int webapiWorkspaceGet(
|
||||
SWGSDRangel::SWGWorkspaceInfo& response,
|
||||
QString& errorMessage);
|
||||
QString& errorMessage) final;
|
||||
|
||||
virtual int webapiSettingsPutPatch(
|
||||
int webapiSettingsPutPatch(
|
||||
bool force,
|
||||
const QStringList& channelSettingsKeys,
|
||||
SWGSDRangel::SWGChannelSettings& response,
|
||||
QString& errorMessage);
|
||||
QString& errorMessage) final;
|
||||
|
||||
virtual int webapiReportGet(
|
||||
int webapiReportGet(
|
||||
SWGSDRangel::SWGChannelReport& response,
|
||||
QString& errorMessage);
|
||||
QString& errorMessage) final;
|
||||
|
||||
static void webapiFormatChannelSettings(
|
||||
SWGSDRangel::SWGChannelSettings& response,
|
||||
@ -251,7 +251,7 @@ private:
|
||||
|
||||
DeviceAPI* m_deviceAPI;
|
||||
QThread *m_thread;
|
||||
bool m_running;
|
||||
bool m_running = false;
|
||||
NFMModBaseband* m_basebandSource;
|
||||
NFMModSettings m_settings;
|
||||
|
||||
@ -260,39 +260,39 @@ private:
|
||||
|
||||
std::ifstream m_ifstream;
|
||||
QString m_fileName;
|
||||
quint64 m_fileSize; //!< raw file size (bytes)
|
||||
quint32 m_recordLength; //!< record length in seconds computed from file size
|
||||
int m_sampleRate;
|
||||
quint64 m_fileSize = 0; //!< raw file size (bytes)
|
||||
quint32 m_recordLength = 0; //!< record length in seconds computed from file size
|
||||
int m_sampleRate = 48000;
|
||||
|
||||
QNetworkAccessManager *m_networkManager;
|
||||
QNetworkRequest m_networkRequest;
|
||||
|
||||
CWKeyer m_cwKeyer;
|
||||
QObject *m_levelMeter;
|
||||
QObject *m_levelMeter = nullptr;
|
||||
|
||||
virtual bool handleMessage(const Message& cmd);
|
||||
bool handleMessage(const Message& cmd) final;
|
||||
void applySettings(const NFMModSettings& settings, bool force = false);
|
||||
void sendSampleRateToDemodAnalyzer();
|
||||
void sendSampleRateToDemodAnalyzer() const;
|
||||
void openFileStream();
|
||||
void seekFileStream(int seekPercentage);
|
||||
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
|
||||
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const NFMModSettings& settings, bool force);
|
||||
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response) const;
|
||||
void webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const NFMModSettings& settings, bool force);
|
||||
void webapiReverseSendCWSettings(const CWKeyerSettings& settings);
|
||||
void sendChannelSettings(
|
||||
const QList<ObjectPipe*>& pipes,
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
const NFMModSettings& settings,
|
||||
bool force
|
||||
);
|
||||
void webapiFormatChannelSettings(
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
|
||||
const NFMModSettings& settings,
|
||||
bool force
|
||||
);
|
||||
|
||||
private slots:
|
||||
void networkManagerFinished(QNetworkReply *reply);
|
||||
void networkManagerFinished(QNetworkReply *reply) const;
|
||||
};
|
||||
|
||||
|
||||
|
@ -27,21 +27,12 @@
|
||||
#include "nfmmodsource.h"
|
||||
|
||||
const int NFMModSource::m_levelNbSamples = 480; // every 10ms
|
||||
const float NFMModSource::m_preemphasis = 120.0e-6; // 120us
|
||||
const float NFMModSource::m_preemphasis = 120.0e-6f; // 120us
|
||||
|
||||
NFMModSource::NFMModSource() :
|
||||
m_channelSampleRate(48000),
|
||||
m_channelFrequencyOffset(0),
|
||||
m_modPhasor(0.0f),
|
||||
m_preemphasisFilter(m_preemphasis*48000),
|
||||
m_audioSampleRate(48000),
|
||||
m_audioFifo(12000),
|
||||
m_feedbackAudioFifo(48000),
|
||||
m_levelCalcCount(0),
|
||||
m_peakLevel(0.0f),
|
||||
m_levelSum(0.0f),
|
||||
m_ifstream(nullptr),
|
||||
m_cwKeyer(nullptr)
|
||||
m_feedbackAudioFifo(48000)
|
||||
{
|
||||
m_audioFifo.setLabel("NFMModSource.m_audioFifo");
|
||||
m_feedbackAudioFifo.setLabel("NFMModSource.m_feedbackAudioFifo");
|
||||
@ -64,7 +55,7 @@ NFMModSource::NFMModSource() :
|
||||
-20, // threshold (dB)
|
||||
20, // knee (dB)
|
||||
15, // ratio (dB)
|
||||
0.003, // attack (s)
|
||||
0.003f,// attack (s)
|
||||
0.25 // release (s)
|
||||
);
|
||||
|
||||
@ -72,9 +63,7 @@ NFMModSource::NFMModSource() :
|
||||
applyChannelSettings(m_channelSampleRate, m_channelFrequencyOffset, true);
|
||||
}
|
||||
|
||||
NFMModSource::~NFMModSource()
|
||||
{
|
||||
}
|
||||
NFMModSource::~NFMModSource() = default;
|
||||
|
||||
void NFMModSource::pull(SampleVector::iterator begin, unsigned int nbSamples)
|
||||
{
|
||||
@ -130,7 +119,7 @@ void NFMModSource::pullOne(Sample& sample)
|
||||
|
||||
void NFMModSource::prefetch(unsigned int nbSamples)
|
||||
{
|
||||
unsigned int nbSamplesAudio = nbSamples * ((Real) m_audioSampleRate / (Real) m_channelSampleRate);
|
||||
unsigned int nbSamplesAudio = (nbSamples * (unsigned int) ((Real) m_audioSampleRate / (Real) m_channelSampleRate));
|
||||
pullAudio(nbSamplesAudio);
|
||||
}
|
||||
|
||||
@ -154,7 +143,9 @@ void NFMModSource::pullAudio(unsigned int nbSamplesAudio)
|
||||
|
||||
void NFMModSource::modulateSample()
|
||||
{
|
||||
Real t0, t1, t;
|
||||
Real t0 = 0.0f;
|
||||
Real t1 = 0.0f;
|
||||
Real t = 0.0f;
|
||||
|
||||
pullAF(t0);
|
||||
|
||||
@ -173,24 +164,24 @@ void NFMModSource::modulateSample()
|
||||
if (m_settings.m_ctcssOn) {
|
||||
t1 = 0.85f * m_bandpass.filter(t) + 0.15f * 0.625f * m_ctcssNco.next();
|
||||
} else if (m_settings.m_dcsOn) {
|
||||
t1 = 0.9f * m_bandpass.filter(t) + 0.1f * 0.625f * m_dcsMod.next();
|
||||
t1 = 0.9f * m_bandpass.filter(t) + 0.1f * 0.625f * (float) m_dcsMod.next();
|
||||
} else if (m_settings.m_bpfOn) {
|
||||
t1 = m_bandpass.filter(t);
|
||||
} else {
|
||||
t1 = m_lowpass.filter(t);
|
||||
}
|
||||
|
||||
m_modPhasor += (M_PI * m_settings.m_fmDeviation / (float) m_audioSampleRate) * t1;
|
||||
m_modPhasor += (float) ((M_PI * m_settings.m_fmDeviation / (float) m_audioSampleRate) * t1);
|
||||
|
||||
// limit phasor range to ]-pi,pi]
|
||||
if (m_modPhasor > M_PI) {
|
||||
m_modPhasor -= (2.0f * M_PI);
|
||||
m_modPhasor -= (float) (2.0 * M_PI);
|
||||
}
|
||||
|
||||
m_modSample.real(cos(m_modPhasor) * 0.891235351562f * SDR_TX_SCALEF); // -1 dB
|
||||
m_modSample.imag(sin(m_modPhasor) * 0.891235351562f * SDR_TX_SCALEF);
|
||||
m_modSample.real((float) (cos(m_modPhasor) * 0.891235351562f * SDR_TX_SCALEF)); // -1 dB
|
||||
m_modSample.imag((float) (sin(m_modPhasor) * 0.891235351562f * SDR_TX_SCALEF));
|
||||
|
||||
m_demodBuffer[m_demodBufferFill] = t1 * std::numeric_limits<int16_t>::max();
|
||||
m_demodBuffer[m_demodBufferFill] = (qint16) (t1 * std::numeric_limits<int16_t>::max());
|
||||
++m_demodBufferFill;
|
||||
|
||||
if (m_demodBufferFill >= m_demodBuffer.size())
|
||||
@ -198,13 +189,11 @@ void NFMModSource::modulateSample()
|
||||
QList<ObjectPipe*> dataPipes;
|
||||
MainCore::instance()->getDataPipes().getDataPipes(m_channel, "demod", dataPipes);
|
||||
|
||||
if (dataPipes.size() > 0)
|
||||
if (!dataPipes.empty())
|
||||
{
|
||||
QList<ObjectPipe*>::iterator it = dataPipes.begin();
|
||||
|
||||
for (; it != dataPipes.end(); ++it)
|
||||
for (auto& dataPipe : dataPipes)
|
||||
{
|
||||
DataFifo *fifo = qobject_cast<DataFifo*>((*it)->m_element);
|
||||
DataFifo *fifo = qobject_cast<DataFifo*>(dataPipe->m_element);
|
||||
|
||||
if (fifo) {
|
||||
fifo->write((quint8*) &m_demodBuffer[0], m_demodBuffer.size() * sizeof(qint16), DataFifo::DataTypeI16);
|
||||
@ -224,17 +213,12 @@ void NFMModSource::pullAF(Real& sample)
|
||||
sample = m_toneNco.next();
|
||||
break;
|
||||
case NFMModSettings::NFMModInputFile:
|
||||
// sox f4exb_call.wav --encoding float --endian little f4exb_call.raw
|
||||
// ffplay -f f32le -ar 48k -ac 1 f4exb_call.raw
|
||||
if (m_ifstream && m_ifstream->is_open())
|
||||
{
|
||||
if (m_ifstream->eof())
|
||||
if (m_ifstream->eof() && m_settings.m_playLoop)
|
||||
{
|
||||
if (m_settings.m_playLoop)
|
||||
{
|
||||
m_ifstream->clear();
|
||||
m_ifstream->seekg(0, std::ios::beg);
|
||||
}
|
||||
m_ifstream->clear();
|
||||
m_ifstream->seekg(0, std::ios::beg);
|
||||
}
|
||||
|
||||
if (m_ifstream->eof())
|
||||
@ -269,8 +253,8 @@ void NFMModSource::pullAF(Real& sample)
|
||||
}
|
||||
else
|
||||
{
|
||||
unsigned int size = m_audioBuffer.size();
|
||||
qDebug("NFMModSource::pullAF: starve audio samples: size: %u", size);
|
||||
std::size_t size = m_audioBuffer.size();
|
||||
qDebug("NFMModSource::pullAF: starve audio samples: size: %lu", size);
|
||||
sample = ((m_audioBuffer[size-1].l + m_audioBuffer[size-1].r) / 65536.0f) * m_settings.m_volumeFactor;
|
||||
}
|
||||
|
||||
@ -300,7 +284,6 @@ void NFMModSource::pullAF(Real& sample)
|
||||
}
|
||||
}
|
||||
break;
|
||||
case NFMModSettings::NFMModInputNone:
|
||||
default:
|
||||
sample = 0.0f;
|
||||
break;
|
||||
@ -330,10 +313,10 @@ void NFMModSource::pushFeedback(Real sample)
|
||||
}
|
||||
}
|
||||
|
||||
void NFMModSource::processOneSample(Complex& ci)
|
||||
void NFMModSource::processOneSample(const Complex& ci)
|
||||
{
|
||||
m_feedbackAudioBuffer[m_feedbackAudioBufferFill].l = ci.real();
|
||||
m_feedbackAudioBuffer[m_feedbackAudioBufferFill].r = ci.imag();
|
||||
m_feedbackAudioBuffer[m_feedbackAudioBufferFill].l = (qint16) ci.real();
|
||||
m_feedbackAudioBuffer[m_feedbackAudioBufferFill].r = (qint16) ci.imag();
|
||||
++m_feedbackAudioBufferFill;
|
||||
|
||||
if (m_feedbackAudioBufferFill >= m_feedbackAudioBuffer.size())
|
||||
@ -351,7 +334,7 @@ void NFMModSource::processOneSample(Complex& ci)
|
||||
}
|
||||
}
|
||||
|
||||
void NFMModSource::calculateLevel(Real& sample)
|
||||
void NFMModSource::calculateLevel(const Real& sample)
|
||||
{
|
||||
if (m_levelCalcCount < m_levelNbSamples)
|
||||
{
|
||||
@ -385,8 +368,8 @@ void NFMModSource::applyAudioSampleRate(int sampleRate)
|
||||
m_interpolator.create(48, sampleRate, m_settings.m_rfBandwidth / 2.2, 3.0);
|
||||
m_lowpass.create(301, sampleRate, m_settings.m_afBandwidth);
|
||||
m_bandpass.create(301, sampleRate, 300.0, m_settings.m_afBandwidth);
|
||||
m_toneNco.setFreq(m_settings.m_toneFrequency, sampleRate);
|
||||
m_ctcssNco.setFreq(NFMModSettings::getCTCSSFreq(m_settings.m_ctcssIndex), sampleRate);
|
||||
m_toneNco.setFreq(m_settings.m_toneFrequency, (float) sampleRate);
|
||||
m_ctcssNco.setFreq(NFMModSettings::getCTCSSFreq(m_settings.m_ctcssIndex), (float) sampleRate);
|
||||
m_dcsMod.setSampleRate(sampleRate);
|
||||
|
||||
if (m_cwKeyer)
|
||||
@ -395,8 +378,8 @@ void NFMModSource::applyAudioSampleRate(int sampleRate)
|
||||
m_cwKeyer->reset();
|
||||
}
|
||||
|
||||
m_preemphasisFilter.configure(m_preemphasis*sampleRate);
|
||||
m_audioCompressor.m_rate = sampleRate;
|
||||
m_preemphasisFilter.configure(m_preemphasis * (float) sampleRate);
|
||||
m_audioCompressor.m_rate = (float) sampleRate;
|
||||
m_audioCompressor.initState();
|
||||
m_audioSampleRate = sampleRate;
|
||||
applyFeedbackAudioSampleRate(m_feedbackAudioSampleRate);
|
||||
@ -404,7 +387,7 @@ void NFMModSource::applyAudioSampleRate(int sampleRate)
|
||||
QList<ObjectPipe*> pipes;
|
||||
MainCore::instance()->getMessagePipes().getMessagePipes(m_channel, "reportdemod", pipes);
|
||||
|
||||
if (pipes.size() > 0)
|
||||
if (!pipes.empty())
|
||||
{
|
||||
for (const auto& pipe : pipes)
|
||||
{
|
||||
@ -428,7 +411,7 @@ void NFMModSource::applyFeedbackAudioSampleRate(int sampleRate)
|
||||
m_feedbackInterpolatorDistanceRemain = 0;
|
||||
m_feedbackInterpolatorConsumed = false;
|
||||
m_feedbackInterpolatorDistance = (Real) sampleRate / (Real) m_audioSampleRate;
|
||||
Real cutoff = std::min(sampleRate, m_audioSampleRate) / 2.2f;
|
||||
Real cutoff = (float) std::min(sampleRate, m_audioSampleRate) / 2.2f;
|
||||
m_feedbackInterpolator.create(48, sampleRate, cutoff, 3.0);
|
||||
m_feedbackAudioSampleRate = sampleRate;
|
||||
}
|
||||
@ -444,11 +427,11 @@ void NFMModSource::applySettings(const NFMModSettings& settings, bool force)
|
||||
}
|
||||
|
||||
if ((settings.m_toneFrequency != m_settings.m_toneFrequency) || force) {
|
||||
m_toneNco.setFreq(settings.m_toneFrequency, m_audioSampleRate);
|
||||
m_toneNco.setFreq(settings.m_toneFrequency, (float) m_audioSampleRate);
|
||||
}
|
||||
|
||||
if ((settings.m_ctcssIndex != m_settings.m_ctcssIndex) || force) {
|
||||
m_ctcssNco.setFreq(NFMModSettings::getCTCSSFreq(settings.m_ctcssIndex), m_audioSampleRate);
|
||||
m_ctcssNco.setFreq(NFMModSettings::getCTCSSFreq(settings.m_ctcssIndex), (float) m_audioSampleRate);
|
||||
}
|
||||
|
||||
if ((settings.m_dcsCode != m_settings.m_dcsCode) || force) {
|
||||
@ -480,7 +463,7 @@ void NFMModSource::applyChannelSettings(int channelSampleRate, int channelFreque
|
||||
if ((channelFrequencyOffset != m_channelFrequencyOffset)
|
||||
|| (channelSampleRate != m_channelSampleRate) || force)
|
||||
{
|
||||
m_carrierNco.setFreq(channelFrequencyOffset, channelSampleRate);
|
||||
m_carrierNco.setFreq((float) channelFrequencyOffset, (float) channelSampleRate);
|
||||
}
|
||||
|
||||
if ((channelSampleRate != m_channelSampleRate) || force)
|
||||
@ -497,7 +480,6 @@ void NFMModSource::applyChannelSettings(int channelSampleRate, int channelFreque
|
||||
|
||||
void NFMModSource::handleAudio()
|
||||
{
|
||||
QMutexLocker mlock(&m_mutex);
|
||||
unsigned int nbRead;
|
||||
|
||||
while ((nbRead = m_audioFifo.read(reinterpret_cast<quint8*>(&m_audioReadBuffer[m_audioReadBufferFill]), 4096)) != 0)
|
||||
|
@ -47,11 +47,11 @@ class NFMModSource : public QObject, public ChannelSampleSource
|
||||
Q_OBJECT
|
||||
public:
|
||||
NFMModSource();
|
||||
virtual ~NFMModSource();
|
||||
~NFMModSource() final;
|
||||
|
||||
virtual void pull(SampleVector::iterator begin, unsigned int nbSamples);
|
||||
virtual void pullOne(Sample& sample);
|
||||
virtual void prefetch(unsigned int nbSamples);
|
||||
void pull(SampleVector::iterator begin, unsigned int nbSamples) final;
|
||||
void pullOne(Sample& sample) final;
|
||||
void prefetch(unsigned int nbSamples) final;
|
||||
|
||||
void setInputFileStream(std::ifstream *ifstream) { m_ifstream = ifstream; }
|
||||
AudioFifo *getAudioFifo() { return &m_audioFifo; }
|
||||
@ -74,8 +74,8 @@ public:
|
||||
void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false);
|
||||
|
||||
private:
|
||||
int m_channelSampleRate;
|
||||
int m_channelFrequencyOffset;
|
||||
int m_channelSampleRate = 48000;
|
||||
int m_channelFrequencyOffset = 0;
|
||||
NFMModSettings m_settings;
|
||||
ChannelAPI *m_channel;
|
||||
|
||||
@ -83,7 +83,7 @@ private:
|
||||
NCOF m_toneNco;
|
||||
NCOF m_ctcssNco;
|
||||
NFMModDCS m_dcsMod;
|
||||
float m_modPhasor; //!< baseband modulator phasor
|
||||
float m_modPhasor = 0.0f; //!< baseband modulator phasor
|
||||
Complex m_modSample;
|
||||
|
||||
Interpolator m_interpolator;
|
||||
@ -106,7 +106,7 @@ private:
|
||||
double m_magsq;
|
||||
MovingAverageUtil<double, double, 16> m_movingAverage;
|
||||
|
||||
int m_audioSampleRate;
|
||||
int m_audioSampleRate = 48000;
|
||||
AudioVector m_audioBuffer;
|
||||
unsigned int m_audioBufferFill;
|
||||
AudioVector m_audioReadBuffer;
|
||||
@ -118,14 +118,14 @@ private:
|
||||
uint m_feedbackAudioBufferFill;
|
||||
AudioFifo m_feedbackAudioFifo;
|
||||
|
||||
quint32 m_levelCalcCount;
|
||||
quint32 m_levelCalcCount = 0;
|
||||
qreal m_rmsLevel;
|
||||
qreal m_peakLevelOut;
|
||||
Real m_peakLevel;
|
||||
Real m_levelSum;
|
||||
Real m_peakLevel = 0.0f;
|
||||
Real m_levelSum = 0.0f;
|
||||
|
||||
std::ifstream *m_ifstream;
|
||||
CWKeyer *m_cwKeyer;
|
||||
std::ifstream *m_ifstream = nullptr;
|
||||
CWKeyer *m_cwKeyer = nullptr;
|
||||
|
||||
AudioCompressorSnd m_audioCompressor;
|
||||
|
||||
@ -134,11 +134,11 @@ private:
|
||||
static const int m_levelNbSamples;
|
||||
static const float m_preemphasis;
|
||||
|
||||
void processOneSample(Complex& ci);
|
||||
void processOneSample(const Complex& ci);
|
||||
void pullAF(Real& sample);
|
||||
void pullAudio(unsigned int nbSamples);
|
||||
void pushFeedback(Real sample);
|
||||
void calculateLevel(Real& sample);
|
||||
void calculateLevel(const Real& sample);
|
||||
void modulateSample();
|
||||
|
||||
private slots:
|
||||
|
@ -57,11 +57,7 @@ const char* const SSBMod::m_channelId = "SSBMod";
|
||||
SSBMod::SSBMod(DeviceAPI *deviceAPI) :
|
||||
ChannelAPI(m_channelIdURI, ChannelAPI::StreamSingleSource),
|
||||
m_deviceAPI(deviceAPI),
|
||||
m_running(false),
|
||||
m_spectrumVis(SDR_TX_SCALEF),
|
||||
m_fileSize(0),
|
||||
m_recordLength(0),
|
||||
m_sampleRate(48000)
|
||||
m_spectrumVis(SDR_TX_SCALEF)
|
||||
{
|
||||
setObjectName(m_channelId);
|
||||
applySettings(m_settings, true);
|
||||
@ -90,7 +86,7 @@ SSBMod::~SSBMod()
|
||||
m_deviceAPI->removeChannelSourceAPI(this);
|
||||
m_deviceAPI->removeChannelSource(this);
|
||||
|
||||
stop();
|
||||
SSBMod::stop();
|
||||
}
|
||||
|
||||
void SSBMod::setDeviceAPI(DeviceAPI *deviceAPI)
|
||||
@ -182,7 +178,7 @@ bool SSBMod::handleMessage(const Message& cmd)
|
||||
{
|
||||
if (MsgConfigureSSBMod::match(cmd))
|
||||
{
|
||||
MsgConfigureSSBMod& cfg = (MsgConfigureSSBMod&) cmd;
|
||||
auto& cfg = (const MsgConfigureSSBMod&) cmd;
|
||||
qDebug() << "SSBMod::handleMessage: MsgConfigureSSBMod";
|
||||
|
||||
applySettings(cfg.getSettings(), cfg.getForce());
|
||||
@ -191,14 +187,14 @@ bool SSBMod::handleMessage(const Message& cmd)
|
||||
}
|
||||
else if (MsgConfigureFileSourceName::match(cmd))
|
||||
{
|
||||
MsgConfigureFileSourceName& conf = (MsgConfigureFileSourceName&) cmd;
|
||||
auto& conf = (const MsgConfigureFileSourceName&) cmd;
|
||||
m_fileName = conf.getFileName();
|
||||
openFileStream();
|
||||
return true;
|
||||
}
|
||||
else if (MsgConfigureFileSourceSeek::match(cmd))
|
||||
{
|
||||
MsgConfigureFileSourceSeek& conf = (MsgConfigureFileSourceSeek&) cmd;
|
||||
auto& conf = (const MsgConfigureFileSourceSeek&) cmd;
|
||||
int seekPercentage = conf.getPercentage();
|
||||
seekFileStream(seekPercentage);
|
||||
|
||||
@ -206,18 +202,17 @@ bool SSBMod::handleMessage(const Message& cmd)
|
||||
}
|
||||
else if (MsgConfigureFileSourceStreamTiming::match(cmd))
|
||||
{
|
||||
std::size_t samplesCount;
|
||||
std::size_t samplesCount;
|
||||
|
||||
if (m_ifstream.eof()) {
|
||||
samplesCount = m_fileSize / sizeof(Real);
|
||||
} else {
|
||||
samplesCount = m_ifstream.tellg() / sizeof(Real);
|
||||
}
|
||||
if (m_ifstream.eof()) {
|
||||
samplesCount = m_fileSize / sizeof(Real);
|
||||
} else {
|
||||
samplesCount = m_ifstream.tellg() / sizeof(Real);
|
||||
}
|
||||
|
||||
if (getMessageQueueToGUI())
|
||||
{
|
||||
MsgReportFileSourceStreamTiming *report;
|
||||
report = MsgReportFileSourceStreamTiming::create(samplesCount);
|
||||
auto *report = MsgReportFileSourceStreamTiming::create(samplesCount);
|
||||
getMessageQueueToGUI()->push(report);
|
||||
}
|
||||
|
||||
@ -225,7 +220,7 @@ bool SSBMod::handleMessage(const Message& cmd)
|
||||
}
|
||||
else if (CWKeyer::MsgConfigureCWKeyer::match(cmd))
|
||||
{
|
||||
const CWKeyer::MsgConfigureCWKeyer& cfg = (CWKeyer::MsgConfigureCWKeyer&) cmd;
|
||||
auto& cfg = (const CWKeyer::MsgConfigureCWKeyer&) cmd;
|
||||
|
||||
if (m_settings.m_useReverseAPI) {
|
||||
webapiReverseSendCWSettings(cfg.getSettings());
|
||||
@ -235,11 +230,11 @@ bool SSBMod::handleMessage(const Message& cmd)
|
||||
}
|
||||
else if (DSPSignalNotification::match(cmd))
|
||||
{
|
||||
DSPSignalNotification& notif = (DSPSignalNotification&) cmd;
|
||||
auto& notif = (const DSPSignalNotification&) cmd;
|
||||
// Forward to the source
|
||||
if (m_running)
|
||||
{
|
||||
DSPSignalNotification* rep = new DSPSignalNotification(notif); // make a copy
|
||||
auto* rep = new DSPSignalNotification(notif); // make a copy
|
||||
qDebug() << "SSBMod::handleMessage: DSPSignalNotification";
|
||||
m_basebandSource->getInputMessageQueue()->push(rep);
|
||||
}
|
||||
@ -274,7 +269,7 @@ void SSBMod::openFileStream()
|
||||
m_ifstream.seekg(0,std::ios_base::beg);
|
||||
|
||||
m_sampleRate = 48000; // fixed rate
|
||||
m_recordLength = m_fileSize / (sizeof(Real) * m_sampleRate);
|
||||
m_recordLength = (quint32) (m_fileSize / (sizeof(Real) * m_sampleRate));
|
||||
|
||||
qDebug() << "SSBMod::openFileStream: " << m_fileName.toStdString().c_str()
|
||||
<< " fileSize: " << m_fileSize << "bytes"
|
||||
@ -416,7 +411,7 @@ void SSBMod::applySettings(const SSBModSettings& settings, bool force)
|
||||
QList<ObjectPipe*> pipes;
|
||||
MainCore::instance()->getMessagePipes().getMessagePipes(this, "settings", pipes);
|
||||
|
||||
if (pipes.size() > 0) {
|
||||
if (!pipes.empty()) {
|
||||
sendChannelSettings(pipes, reverseAPIKeys, settings, force);
|
||||
}
|
||||
|
||||
@ -448,12 +443,12 @@ bool SSBMod::deserialize(const QByteArray& data)
|
||||
}
|
||||
}
|
||||
|
||||
void SSBMod::sendSampleRateToDemodAnalyzer()
|
||||
void SSBMod::sendSampleRateToDemodAnalyzer() const
|
||||
{
|
||||
QList<ObjectPipe*> pipes;
|
||||
MainCore::instance()->getMessagePipes().getMessagePipes(this, "reportdemod", pipes);
|
||||
|
||||
if (pipes.size() > 0)
|
||||
if (!pipes.empty())
|
||||
{
|
||||
for (const auto& pipe : pipes)
|
||||
{
|
||||
@ -604,13 +599,13 @@ void SSBMod::webapiUpdateChannelSettings(
|
||||
settings.m_reverseAPIAddress = *response.getSsbModSettings()->getReverseApiAddress();
|
||||
}
|
||||
if (channelSettingsKeys.contains("reverseAPIPort")) {
|
||||
settings.m_reverseAPIPort = response.getSsbModSettings()->getReverseApiPort();
|
||||
settings.m_reverseAPIPort = (uint16_t) response.getSsbModSettings()->getReverseApiPort();
|
||||
}
|
||||
if (channelSettingsKeys.contains("reverseAPIDeviceIndex")) {
|
||||
settings.m_reverseAPIDeviceIndex = response.getSsbModSettings()->getReverseApiDeviceIndex();
|
||||
settings.m_reverseAPIDeviceIndex = (uint16_t) response.getSsbModSettings()->getReverseApiDeviceIndex();
|
||||
}
|
||||
if (channelSettingsKeys.contains("reverseAPIChannelIndex")) {
|
||||
settings.m_reverseAPIChannelIndex = response.getSsbModSettings()->getReverseApiChannelIndex();
|
||||
settings.m_reverseAPIChannelIndex = (uint16_t) response.getSsbModSettings()->getReverseApiChannelIndex();
|
||||
}
|
||||
if (settings.m_spectrumGUI && channelSettingsKeys.contains("spectrumConfig")) {
|
||||
settings.m_spectrumGUI->updateFrom(channelSettingsKeys, response.getSsbModSettings()->getSpectrumConfig());
|
||||
@ -691,7 +686,7 @@ void SSBMod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& respon
|
||||
}
|
||||
else
|
||||
{
|
||||
SWGSDRangel::SWGGLSpectrum *swgGLSpectrum = new SWGSDRangel::SWGGLSpectrum();
|
||||
auto *swgGLSpectrum = new SWGSDRangel::SWGGLSpectrum();
|
||||
settings.m_spectrumGUI->formatTo(swgGLSpectrum);
|
||||
response.getSsbModSettings()->setSpectrumConfig(swgGLSpectrum);
|
||||
}
|
||||
@ -705,7 +700,7 @@ void SSBMod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& respon
|
||||
}
|
||||
else
|
||||
{
|
||||
SWGSDRangel::SWGChannelMarker *swgChannelMarker = new SWGSDRangel::SWGChannelMarker();
|
||||
auto *swgChannelMarker = new SWGSDRangel::SWGChannelMarker();
|
||||
settings.m_channelMarker->formatTo(swgChannelMarker);
|
||||
response.getSsbModSettings()->setChannelMarker(swgChannelMarker);
|
||||
}
|
||||
@ -719,16 +714,16 @@ void SSBMod::webapiFormatChannelSettings(SWGSDRangel::SWGChannelSettings& respon
|
||||
}
|
||||
else
|
||||
{
|
||||
SWGSDRangel::SWGRollupState *swgRollupState = new SWGSDRangel::SWGRollupState();
|
||||
auto *swgRollupState = new SWGSDRangel::SWGRollupState();
|
||||
settings.m_rollupState->formatTo(swgRollupState);
|
||||
response.getSsbModSettings()->setRollupState(swgRollupState);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SSBMod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response)
|
||||
void SSBMod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response) const
|
||||
{
|
||||
response.getSsbModReport()->setChannelPowerDb(CalcDb::dbPower(getMagSq()));
|
||||
response.getSsbModReport()->setChannelPowerDb((float) CalcDb::dbPower(getMagSq()));
|
||||
|
||||
if (m_running)
|
||||
{
|
||||
@ -737,9 +732,9 @@ void SSBMod::webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response)
|
||||
}
|
||||
}
|
||||
|
||||
void SSBMod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const SSBModSettings& settings, bool force)
|
||||
void SSBMod::webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const SSBModSettings& settings, bool force)
|
||||
{
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
|
||||
auto *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
|
||||
webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force);
|
||||
|
||||
QString channelSettingsURL = QString("http://%1:%2/sdrangel/deviceset/%3/channel/%4/settings")
|
||||
@ -750,8 +745,8 @@ void SSBMod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, cons
|
||||
m_networkRequest.setUrl(QUrl(channelSettingsURL));
|
||||
m_networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
|
||||
|
||||
QBuffer *buffer = new QBuffer();
|
||||
buffer->open((QBuffer::ReadWrite));
|
||||
auto *buffer = new QBuffer();
|
||||
buffer->open(QBuffer::ReadWrite);
|
||||
buffer->write(swgChannelSettings->asJson().toUtf8());
|
||||
buffer->seek(0);
|
||||
|
||||
@ -764,7 +759,7 @@ void SSBMod::webapiReverseSendSettings(QList<QString>& channelSettingsKeys, cons
|
||||
|
||||
void SSBMod::webapiReverseSendCWSettings(const CWKeyerSettings& cwKeyerSettings)
|
||||
{
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
|
||||
auto *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
|
||||
swgChannelSettings->setDirection(1); // single source (Tx)
|
||||
swgChannelSettings->setChannelType(new QString("SSBMod"));
|
||||
swgChannelSettings->setSsbModSettings(new SWGSDRangel::SWGSSBModSettings());
|
||||
@ -772,7 +767,7 @@ void SSBMod::webapiReverseSendCWSettings(const CWKeyerSettings& cwKeyerSettings)
|
||||
|
||||
swgSSBModSettings->setCwKeyer(new SWGSDRangel::SWGCWKeyerSettings());
|
||||
SWGSDRangel::SWGCWKeyerSettings *apiCwKeyerSettings = swgSSBModSettings->getCwKeyer();
|
||||
m_cwKeyer.webapiFormatChannelSettings(apiCwKeyerSettings, cwKeyerSettings);
|
||||
CWKeyer::webapiFormatChannelSettings(apiCwKeyerSettings, cwKeyerSettings);
|
||||
|
||||
QString channelSettingsURL = QString("http://%1:%2/sdrangel/deviceset/%3/channel/%4/settings")
|
||||
.arg(m_settings.m_reverseAPIAddress)
|
||||
@ -782,8 +777,8 @@ void SSBMod::webapiReverseSendCWSettings(const CWKeyerSettings& cwKeyerSettings)
|
||||
m_networkRequest.setUrl(QUrl(channelSettingsURL));
|
||||
m_networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
|
||||
|
||||
QBuffer *buffer = new QBuffer();
|
||||
buffer->open((QBuffer::ReadWrite));
|
||||
auto *buffer = new QBuffer();
|
||||
buffer->open(QBuffer::ReadWrite);
|
||||
buffer->write(swgChannelSettings->asJson().toUtf8());
|
||||
buffer->seek(0);
|
||||
|
||||
@ -796,9 +791,9 @@ void SSBMod::webapiReverseSendCWSettings(const CWKeyerSettings& cwKeyerSettings)
|
||||
|
||||
void SSBMod::sendChannelSettings(
|
||||
const QList<ObjectPipe*>& pipes,
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
const SSBModSettings& settings,
|
||||
bool force)
|
||||
bool force) const
|
||||
{
|
||||
for (const auto& pipe : pipes)
|
||||
{
|
||||
@ -806,7 +801,7 @@ void SSBMod::sendChannelSettings(
|
||||
|
||||
if (messageQueue)
|
||||
{
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
|
||||
auto *swgChannelSettings = new SWGSDRangel::SWGChannelSettings();
|
||||
webapiFormatChannelSettings(channelSettingsKeys, swgChannelSettings, settings, force);
|
||||
MainCore::MsgChannelSettings *msg = MainCore::MsgChannelSettings::create(
|
||||
this,
|
||||
@ -820,11 +815,11 @@ void SSBMod::sendChannelSettings(
|
||||
}
|
||||
|
||||
void SSBMod::webapiFormatChannelSettings(
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
|
||||
const SSBModSettings& settings,
|
||||
bool force
|
||||
)
|
||||
) const
|
||||
{
|
||||
swgChannelSettings->setDirection(1); // single source (Tx)
|
||||
swgChannelSettings->setOriginatorChannelIndex(getIndexInDeviceSet());
|
||||
@ -898,21 +893,21 @@ void SSBMod::webapiFormatChannelSettings(
|
||||
|
||||
if (settings.m_spectrumGUI && (channelSettingsKeys.contains("spectrunConfig") || force))
|
||||
{
|
||||
SWGSDRangel::SWGGLSpectrum *swgGLSpectrum = new SWGSDRangel::SWGGLSpectrum();
|
||||
auto *swgGLSpectrum = new SWGSDRangel::SWGGLSpectrum();
|
||||
settings.m_spectrumGUI->formatTo(swgGLSpectrum);
|
||||
swgSSBModSettings->setSpectrumConfig(swgGLSpectrum);
|
||||
}
|
||||
|
||||
if (settings.m_channelMarker && (channelSettingsKeys.contains("channelMarker") || force))
|
||||
{
|
||||
SWGSDRangel::SWGChannelMarker *swgChannelMarker = new SWGSDRangel::SWGChannelMarker();
|
||||
auto *swgChannelMarker = new SWGSDRangel::SWGChannelMarker();
|
||||
settings.m_channelMarker->formatTo(swgChannelMarker);
|
||||
swgSSBModSettings->setChannelMarker(swgChannelMarker);
|
||||
}
|
||||
|
||||
if (settings.m_rollupState && (channelSettingsKeys.contains("rollupState") || force))
|
||||
{
|
||||
SWGSDRangel::SWGRollupState *swgRollupState = new SWGSDRangel::SWGRollupState();
|
||||
auto *swgRollupState = new SWGSDRangel::SWGRollupState();
|
||||
settings.m_rollupState->formatTo(swgRollupState);
|
||||
swgSSBModSettings->setRollupState(swgRollupState);
|
||||
}
|
||||
@ -922,11 +917,11 @@ void SSBMod::webapiFormatChannelSettings(
|
||||
const CWKeyerSettings& cwKeyerSettings = m_cwKeyer.getSettings();
|
||||
swgSSBModSettings->setCwKeyer(new SWGSDRangel::SWGCWKeyerSettings());
|
||||
SWGSDRangel::SWGCWKeyerSettings *apiCwKeyerSettings = swgSSBModSettings->getCwKeyer();
|
||||
m_cwKeyer.webapiFormatChannelSettings(apiCwKeyerSettings, cwKeyerSettings);
|
||||
CWKeyer::webapiFormatChannelSettings(apiCwKeyerSettings, cwKeyerSettings);
|
||||
}
|
||||
}
|
||||
|
||||
void SSBMod::networkManagerFinished(QNetworkReply *reply)
|
||||
void SSBMod::networkManagerFinished(QNetworkReply *reply) const
|
||||
{
|
||||
QNetworkReply::NetworkError replyError = reply->error();
|
||||
|
||||
|
@ -83,7 +83,7 @@ public:
|
||||
private:
|
||||
QString m_fileName;
|
||||
|
||||
MsgConfigureFileSourceName(const QString& fileName) :
|
||||
explicit MsgConfigureFileSourceName(const QString& fileName) :
|
||||
Message(),
|
||||
m_fileName(fileName)
|
||||
{ }
|
||||
@ -101,10 +101,10 @@ public:
|
||||
return new MsgConfigureFileSourceSeek(seekPercentage);
|
||||
}
|
||||
|
||||
protected:
|
||||
private:
|
||||
int m_seekPercentage; //!< percentage of seek position from the beginning 0..100
|
||||
|
||||
MsgConfigureFileSourceSeek(int seekPercentage) :
|
||||
explicit MsgConfigureFileSourceSeek(int seekPercentage) :
|
||||
Message(),
|
||||
m_seekPercentage(seekPercentage)
|
||||
{ }
|
||||
@ -139,10 +139,10 @@ public:
|
||||
return new MsgReportFileSourceStreamTiming(samplesCount);
|
||||
}
|
||||
|
||||
protected:
|
||||
private:
|
||||
std::size_t m_samplesCount;
|
||||
|
||||
MsgReportFileSourceStreamTiming(std::size_t samplesCount) :
|
||||
explicit MsgReportFileSourceStreamTiming(std::size_t samplesCount) :
|
||||
Message(),
|
||||
m_samplesCount(samplesCount)
|
||||
{ }
|
||||
@ -161,7 +161,7 @@ public:
|
||||
return new MsgReportFileSourceStreamData(sampleRate, recordLength);
|
||||
}
|
||||
|
||||
protected:
|
||||
private:
|
||||
int m_sampleRate;
|
||||
quint32 m_recordLength;
|
||||
|
||||
@ -175,55 +175,55 @@ public:
|
||||
|
||||
//=================================================================
|
||||
|
||||
SSBMod(DeviceAPI *deviceAPI);
|
||||
virtual ~SSBMod();
|
||||
virtual void destroy() { delete this; }
|
||||
virtual void setDeviceAPI(DeviceAPI *deviceAPI);
|
||||
virtual DeviceAPI *getDeviceAPI() { return m_deviceAPI; }
|
||||
explicit SSBMod(DeviceAPI *deviceAPI);
|
||||
~SSBMod() final;
|
||||
void destroy() final { delete this; }
|
||||
void setDeviceAPI(DeviceAPI *deviceAPI) final;
|
||||
DeviceAPI *getDeviceAPI() final { return m_deviceAPI; }
|
||||
|
||||
virtual void start();
|
||||
virtual void stop();
|
||||
virtual void pull(SampleVector::iterator& begin, unsigned int nbSamples);
|
||||
virtual void pushMessage(Message *msg) { m_inputMessageQueue.push(msg); }
|
||||
virtual QString getSourceName() { return objectName(); }
|
||||
void start() final;
|
||||
void stop() final;
|
||||
void pull(SampleVector::iterator& begin, unsigned int nbSamples) final;
|
||||
void pushMessage(Message *msg) final { m_inputMessageQueue.push(msg); }
|
||||
QString getSourceName() final { return objectName(); }
|
||||
|
||||
virtual void getIdentifier(QString& id) { id = objectName(); }
|
||||
virtual QString getIdentifier() const { return objectName(); }
|
||||
virtual void getTitle(QString& title) { title = m_settings.m_title; }
|
||||
virtual qint64 getCenterFrequency() const { return m_settings.m_inputFrequencyOffset; }
|
||||
virtual void setCenterFrequency(qint64 frequency);
|
||||
void getIdentifier(QString& id) final { id = objectName(); }
|
||||
QString getIdentifier() const final { return objectName(); }
|
||||
void getTitle(QString& title) final { title = m_settings.m_title; }
|
||||
qint64 getCenterFrequency() const final { return m_settings.m_inputFrequencyOffset; }
|
||||
void setCenterFrequency(qint64 frequency) final;
|
||||
|
||||
virtual QByteArray serialize() const;
|
||||
virtual bool deserialize(const QByteArray& data);
|
||||
QByteArray serialize() const final;
|
||||
bool deserialize(const QByteArray& data) final;
|
||||
|
||||
virtual int getNbSinkStreams() const { return 1; }
|
||||
virtual int getNbSourceStreams() const { return 0; }
|
||||
virtual int getStreamIndex() const { return m_settings.m_streamIndex; }
|
||||
int getNbSinkStreams() const final { return 1; }
|
||||
int getNbSourceStreams() const final { return 0; }
|
||||
int getStreamIndex() const final { return m_settings.m_streamIndex; }
|
||||
|
||||
virtual qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const
|
||||
qint64 getStreamCenterFrequency(int streamIndex, bool sinkElseSource) const final
|
||||
{
|
||||
(void) streamIndex;
|
||||
(void) sinkElseSource;
|
||||
return m_settings.m_inputFrequencyOffset;
|
||||
}
|
||||
|
||||
virtual int webapiSettingsGet(
|
||||
int webapiSettingsGet(
|
||||
SWGSDRangel::SWGChannelSettings& response,
|
||||
QString& errorMessage);
|
||||
QString& errorMessage) final;
|
||||
|
||||
virtual int webapiWorkspaceGet(
|
||||
int webapiWorkspaceGet(
|
||||
SWGSDRangel::SWGWorkspaceInfo& response,
|
||||
QString& errorMessage);
|
||||
QString& errorMessage) final;
|
||||
|
||||
virtual int webapiSettingsPutPatch(
|
||||
int webapiSettingsPutPatch(
|
||||
bool force,
|
||||
const QStringList& channelSettingsKeys,
|
||||
SWGSDRangel::SWGChannelSettings& response,
|
||||
QString& errorMessage);
|
||||
QString& errorMessage) final;
|
||||
|
||||
virtual int webapiReportGet(
|
||||
int webapiReportGet(
|
||||
SWGSDRangel::SWGChannelReport& response,
|
||||
QString& errorMessage);
|
||||
QString& errorMessage) final;
|
||||
|
||||
static void webapiFormatChannelSettings(
|
||||
SWGSDRangel::SWGChannelSettings& response,
|
||||
@ -253,7 +253,7 @@ private:
|
||||
|
||||
DeviceAPI* m_deviceAPI;
|
||||
QThread *m_thread;
|
||||
bool m_running;
|
||||
bool m_running = false;
|
||||
SSBModBaseband* m_basebandSource;
|
||||
SSBModSettings m_settings;
|
||||
SpectrumVis m_spectrumVis;
|
||||
@ -263,38 +263,38 @@ private:
|
||||
|
||||
std::ifstream m_ifstream;
|
||||
QString m_fileName;
|
||||
quint64 m_fileSize; //!< raw file size (bytes)
|
||||
quint32 m_recordLength; //!< record length in seconds computed from file size
|
||||
int m_sampleRate;
|
||||
quint64 m_fileSize = 0; //!< raw file size (bytes)
|
||||
quint32 m_recordLength = 0; //!< record length in seconds computed from file size
|
||||
int m_sampleRate = 48000;
|
||||
|
||||
QNetworkAccessManager *m_networkManager;
|
||||
QNetworkRequest m_networkRequest;
|
||||
CWKeyer m_cwKeyer;
|
||||
QObject *m_levelMeter;
|
||||
|
||||
virtual bool handleMessage(const Message& cmd);
|
||||
bool handleMessage(const Message& cmd) final;
|
||||
void applySettings(const SSBModSettings& settings, bool force = false);
|
||||
void sendSampleRateToDemodAnalyzer();
|
||||
void sendSampleRateToDemodAnalyzer() const;
|
||||
void openFileStream();
|
||||
void seekFileStream(int seekPercentage);
|
||||
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response);
|
||||
void webapiReverseSendSettings(QList<QString>& channelSettingsKeys, const SSBModSettings& settings, bool force);
|
||||
void webapiFormatChannelReport(SWGSDRangel::SWGChannelReport& response) const;
|
||||
void webapiReverseSendSettings(const QList<QString>& channelSettingsKeys, const SSBModSettings& settings, bool force);
|
||||
void webapiReverseSendCWSettings(const CWKeyerSettings& settings);
|
||||
void sendChannelSettings(
|
||||
const QList<ObjectPipe*>& pipes,
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
const SSBModSettings& settings,
|
||||
bool force
|
||||
);
|
||||
) const;
|
||||
void webapiFormatChannelSettings(
|
||||
QList<QString>& channelSettingsKeys,
|
||||
const QList<QString>& channelSettingsKeys,
|
||||
SWGSDRangel::SWGChannelSettings *swgChannelSettings,
|
||||
const SSBModSettings& settings,
|
||||
bool force
|
||||
);
|
||||
) const;
|
||||
|
||||
private slots:
|
||||
void networkManagerFinished(QNetworkReply *reply);
|
||||
void networkManagerFinished(QNetworkReply *reply) const;
|
||||
};
|
||||
|
||||
|
||||
|
@ -30,22 +30,13 @@ const int SSBModSource::m_ssbFftLen = 1024;
|
||||
const int SSBModSource::m_levelNbSamples = 480; // every 10ms
|
||||
|
||||
SSBModSource::SSBModSource() :
|
||||
m_channelSampleRate(48000),
|
||||
m_channelFrequencyOffset(0),
|
||||
m_spectrumSink(nullptr),
|
||||
m_audioSampleRate(48000),
|
||||
m_audioFifo(12000),
|
||||
m_feedbackAudioFifo(12000),
|
||||
m_levelCalcCount(0),
|
||||
m_peakLevel(0.0f),
|
||||
m_levelSum(0.0f),
|
||||
m_ifstream(nullptr),
|
||||
m_cwKeyer(nullptr)
|
||||
m_feedbackAudioFifo(12000)
|
||||
{
|
||||
m_audioFifo.setLabel("SSBModSource.m_audioFifo");
|
||||
m_feedbackAudioFifo.setLabel("SSBModSource.m_feedbackAudioFifo");
|
||||
m_SSBFilter = new fftfilt(m_settings.m_lowCutoff / m_audioSampleRate, m_settings.m_bandwidth / m_audioSampleRate, m_ssbFftLen);
|
||||
m_DSBFilter = new fftfilt((2.0f * m_settings.m_bandwidth) / m_audioSampleRate, 2 * m_ssbFftLen);
|
||||
m_SSBFilter = new fftfilt(m_settings.m_lowCutoff / (float) m_audioSampleRate, m_settings.m_bandwidth / (float) m_audioSampleRate, m_ssbFftLen);
|
||||
m_DSBFilter = new fftfilt((2.0f * m_settings.m_bandwidth) / (float) m_audioSampleRate, 2 * m_ssbFftLen);
|
||||
m_SSBFilterBuffer = new Complex[m_ssbFftLen>>1]; // filter returns data exactly half of its size
|
||||
m_DSBFilterBuffer = new Complex[m_ssbFftLen];
|
||||
std::fill(m_SSBFilterBuffer, m_SSBFilterBuffer+(m_ssbFftLen>>1), Complex{0,0});
|
||||
@ -68,15 +59,15 @@ SSBModSource::SSBModSource() :
|
||||
m_sumCount = 0;
|
||||
|
||||
m_magsq = 0.0;
|
||||
m_toneNco.setFreq(1000.0, m_audioSampleRate);
|
||||
m_toneNco.setFreq(1000.0, (float) m_audioSampleRate);
|
||||
|
||||
m_audioCompressor.initSimple(
|
||||
m_audioSampleRate,
|
||||
m_settings.m_cmpPreGainDB, // pregain (dB)
|
||||
m_settings.m_cmpThresholdDB, // threshold (dB)
|
||||
(float) m_settings.m_cmpPreGainDB, // pregain (dB)
|
||||
(float) m_settings.m_cmpThresholdDB, // threshold (dB)
|
||||
20, // knee (dB)
|
||||
12, // ratio (dB)
|
||||
0.003, // attack (s)
|
||||
0.003f,// attack (s)
|
||||
0.25 // release (s)
|
||||
);
|
||||
|
||||
@ -140,7 +131,7 @@ void SSBModSource::pullOne(Sample& sample)
|
||||
|
||||
void SSBModSource::prefetch(unsigned int nbSamples)
|
||||
{
|
||||
unsigned int nbSamplesAudio = nbSamples * ((Real) m_audioSampleRate / (Real) m_channelSampleRate);
|
||||
unsigned int nbSamplesAudio = (nbSamples * (unsigned int) ((Real) m_audioSampleRate / (Real) m_channelSampleRate));
|
||||
pullAudio(nbSamplesAudio);
|
||||
}
|
||||
|
||||
@ -174,13 +165,16 @@ void SSBModSource::modulateSample()
|
||||
|
||||
if (m_settings.m_audioBinaural)
|
||||
{
|
||||
m_demodBuffer[m_demodBufferFill++] = m_modSample.real() * std::numeric_limits<int16_t>::max();
|
||||
m_demodBuffer[m_demodBufferFill++] = m_modSample.imag() * std::numeric_limits<int16_t>::max();
|
||||
m_demodBuffer[m_demodBufferFill] = (qint16) (m_modSample.real() * std::numeric_limits<int16_t>::max());
|
||||
m_demodBufferFill++;
|
||||
m_demodBuffer[m_demodBufferFill] = (qint16) (m_modSample.imag() * std::numeric_limits<int16_t>::max());
|
||||
m_demodBufferFill++;
|
||||
}
|
||||
else
|
||||
{
|
||||
// take projection on real axis
|
||||
m_demodBuffer[m_demodBufferFill++] = m_modSample.real() * std::numeric_limits<int16_t>::max();
|
||||
m_demodBuffer[m_demodBufferFill] = (qint16) (m_modSample.real() * std::numeric_limits<int16_t>::max());
|
||||
m_demodBufferFill++;
|
||||
}
|
||||
|
||||
if (m_demodBufferFill >= m_demodBuffer.size())
|
||||
@ -188,13 +182,11 @@ void SSBModSource::modulateSample()
|
||||
QList<ObjectPipe*> dataPipes;
|
||||
MainCore::instance()->getDataPipes().getDataPipes(m_channel, "demod", dataPipes);
|
||||
|
||||
if (dataPipes.size() > 0)
|
||||
if (!dataPipes.empty())
|
||||
{
|
||||
QList<ObjectPipe*>::iterator it = dataPipes.begin();
|
||||
|
||||
for (; it != dataPipes.end(); ++it)
|
||||
for (auto& dataPipe : dataPipes)
|
||||
{
|
||||
DataFifo *fifo = qobject_cast<DataFifo*>((*it)->m_element);
|
||||
DataFifo *fifo = qobject_cast<DataFifo*>(dataPipe->m_element);
|
||||
|
||||
if (fifo)
|
||||
{
|
||||
@ -225,42 +217,33 @@ void SSBModSource::pullAF(Complex& sample)
|
||||
int n_out = 0;
|
||||
|
||||
int decim = 1<<(m_settings.m_spanLog2 - 1);
|
||||
unsigned char decim_mask = decim - 1; // counter LSB bit mask for decimation by 2^(m_scaleLog2 - 1)
|
||||
auto decim_mask = (unsigned char) ((decim - 1) & 0xFF); // counter LSB bit mask for decimation by 2^(m_scaleLog2 - 1)
|
||||
|
||||
switch (m_settings.m_modAFInput)
|
||||
{
|
||||
case SSBModSettings::SSBModInputTone:
|
||||
if (m_settings.m_dsb)
|
||||
{
|
||||
Real t = m_toneNco.next()/1.25;
|
||||
sample.real(t);
|
||||
sample.imag(t);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (m_settings.m_usb) {
|
||||
sample = m_toneNco.nextIQ();
|
||||
} else {
|
||||
sample = m_toneNco.nextQI();
|
||||
}
|
||||
}
|
||||
if (m_settings.m_dsb)
|
||||
{
|
||||
Real t = m_toneNco.next()/1.25f;
|
||||
sample.real(t);
|
||||
sample.imag(t);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (m_settings.m_usb) {
|
||||
sample = m_toneNco.nextIQ();
|
||||
} else {
|
||||
sample = m_toneNco.nextQI();
|
||||
}
|
||||
}
|
||||
break;
|
||||
case SSBModSettings::SSBModInputFile:
|
||||
// Monaural (mono):
|
||||
// sox f4exb_call.wav --encoding float --endian little f4exb_call.raw
|
||||
// ffplay -f f32le -ar 48k -ac 1 f4exb_call.raw
|
||||
// Binaural (stereo):
|
||||
// sox f4exb_call.wav --encoding float --endian little f4exb_call.raw
|
||||
// ffplay -f f32le -ar 48k -ac 2 f4exb_call.raw
|
||||
if (m_ifstream && m_ifstream->is_open())
|
||||
{
|
||||
if (m_ifstream->eof())
|
||||
if (m_ifstream->eof() && m_settings.m_playLoop)
|
||||
{
|
||||
if (m_settings.m_playLoop)
|
||||
{
|
||||
m_ifstream->clear();
|
||||
m_ifstream->seekg(0, std::ios::beg);
|
||||
}
|
||||
m_ifstream->clear();
|
||||
m_ifstream->seekg(0, std::ios::beg);
|
||||
}
|
||||
|
||||
if (m_ifstream->eof())
|
||||
@ -270,38 +253,38 @@ void SSBModSource::pullAF(Complex& sample)
|
||||
}
|
||||
else
|
||||
{
|
||||
if (m_settings.m_audioBinaural)
|
||||
{
|
||||
Complex c;
|
||||
m_ifstream->read(reinterpret_cast<char*>(&c), sizeof(Complex));
|
||||
if (m_settings.m_audioBinaural)
|
||||
{
|
||||
Complex c;
|
||||
m_ifstream->read(reinterpret_cast<char*>(&c), sizeof(Complex));
|
||||
|
||||
if (m_settings.m_audioFlipChannels)
|
||||
{
|
||||
if (m_settings.m_audioFlipChannels)
|
||||
{
|
||||
ci.real(c.imag() * m_settings.m_volumeFactor);
|
||||
ci.imag(c.real() * m_settings.m_volumeFactor);
|
||||
}
|
||||
else
|
||||
{
|
||||
ci = c * m_settings.m_volumeFactor;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
ci = c * m_settings.m_volumeFactor;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Real real;
|
||||
m_ifstream->read(reinterpret_cast<char*>(&real), sizeof(Real));
|
||||
m_ifstream->read(reinterpret_cast<char*>(&real), sizeof(Real));
|
||||
|
||||
if (m_settings.m_agc)
|
||||
{
|
||||
if (m_settings.m_agc)
|
||||
{
|
||||
ci.real(clamp<float>(m_audioCompressor.compress(real), -1.0f, 1.0f));
|
||||
ci.imag(0.0f);
|
||||
ci *= m_settings.m_volumeFactor;
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
ci.real(real * m_settings.m_volumeFactor);
|
||||
ci.imag(0.0f);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -312,24 +295,24 @@ void SSBModSource::pullAF(Complex& sample)
|
||||
break;
|
||||
case SSBModSettings::SSBModInputAudio:
|
||||
if (m_settings.m_audioBinaural)
|
||||
{
|
||||
if (m_settings.m_audioFlipChannels)
|
||||
{
|
||||
{
|
||||
if (m_settings.m_audioFlipChannels)
|
||||
{
|
||||
ci.real((m_audioBuffer[m_audioBufferFill].r / SDR_TX_SCALEF) * m_settings.m_volumeFactor);
|
||||
ci.imag((m_audioBuffer[m_audioBufferFill].l / SDR_TX_SCALEF) * m_settings.m_volumeFactor);
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
ci.real((m_audioBuffer[m_audioBufferFill].l / SDR_TX_SCALEF) * m_settings.m_volumeFactor);
|
||||
ci.imag((m_audioBuffer[m_audioBufferFill].r / SDR_TX_SCALEF) * m_settings.m_volumeFactor);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (m_settings.m_agc)
|
||||
{
|
||||
float sample = (m_audioBuffer[m_audioBufferFill].l + m_audioBuffer[m_audioBufferFill].r) / 65536.0f;
|
||||
ci.real(clamp<float>(m_audioCompressor.compress(sample), -1.0f, 1.0f));
|
||||
float xsample = (m_audioBuffer[m_audioBufferFill].l + m_audioBuffer[m_audioBufferFill].r) / 65536.0f;
|
||||
ci.real(clamp<float>(m_audioCompressor.compress(xsample), -1.0f, 1.0f));
|
||||
ci.imag(0.0f);
|
||||
ci *= m_settings.m_volumeFactor;
|
||||
}
|
||||
@ -347,7 +330,7 @@ void SSBModSource::pullAF(Complex& sample)
|
||||
else
|
||||
{
|
||||
qDebug("SSBModSource::pullAF: starve audio samples: size: %lu", m_audioBuffer.size());
|
||||
m_audioBufferFill = m_audioBuffer.size() - 1;
|
||||
m_audioBufferFill = (unsigned int) (m_audioBuffer.size() - 1);
|
||||
}
|
||||
|
||||
break;
|
||||
@ -356,56 +339,55 @@ void SSBModSource::pullAF(Complex& sample)
|
||||
break;
|
||||
}
|
||||
|
||||
Real fadeFactor;
|
||||
Real fadeFactor;
|
||||
|
||||
if (m_cwKeyer->getSample())
|
||||
{
|
||||
m_cwKeyer->getCWSmoother().getFadeSample(true, fadeFactor);
|
||||
|
||||
if (m_settings.m_dsb)
|
||||
{
|
||||
Real t = m_toneNco.next() * fadeFactor;
|
||||
sample.real(t);
|
||||
sample.imag(t);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (m_settings.m_usb) {
|
||||
sample = m_toneNco.nextIQ() * fadeFactor;
|
||||
} else {
|
||||
sample = m_toneNco.nextQI() * fadeFactor;
|
||||
}
|
||||
}
|
||||
if (m_settings.m_dsb)
|
||||
{
|
||||
Real t = m_toneNco.next() * fadeFactor;
|
||||
sample.real(t);
|
||||
sample.imag(t);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (m_settings.m_usb) {
|
||||
sample = m_toneNco.nextIQ() * fadeFactor;
|
||||
} else {
|
||||
sample = m_toneNco.nextQI() * fadeFactor;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (m_cwKeyer->getCWSmoother().getFadeSample(false, fadeFactor))
|
||||
{
|
||||
if (m_settings.m_dsb)
|
||||
{
|
||||
Real t = (m_toneNco.next() * fadeFactor)/1.25;
|
||||
sample.real(t);
|
||||
sample.imag(t);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (m_settings.m_usb) {
|
||||
sample = m_toneNco.nextIQ() * fadeFactor;
|
||||
} else {
|
||||
sample = m_toneNco.nextQI() * fadeFactor;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (m_cwKeyer->getCWSmoother().getFadeSample(false, fadeFactor))
|
||||
{
|
||||
if (m_settings.m_dsb)
|
||||
{
|
||||
Real t = (m_toneNco.next() * fadeFactor)/1.25f;
|
||||
sample.real(t);
|
||||
sample.imag(t);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (m_settings.m_usb) {
|
||||
sample = m_toneNco.nextIQ() * fadeFactor;
|
||||
} else {
|
||||
sample = m_toneNco.nextQI() * fadeFactor;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
sample.real(0.0f);
|
||||
sample.imag(0.0f);
|
||||
m_toneNco.setPhase(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
case SSBModSettings::SSBModInputNone:
|
||||
default:
|
||||
sample.real(0.0f);
|
||||
sample.imag(0.0f);
|
||||
@ -415,35 +397,35 @@ void SSBModSource::pullAF(Complex& sample)
|
||||
if ((m_settings.m_modAFInput == SSBModSettings::SSBModInputFile)
|
||||
|| (m_settings.m_modAFInput == SSBModSettings::SSBModInputAudio)) // real audio
|
||||
{
|
||||
if (m_settings.m_dsb)
|
||||
{
|
||||
n_out = m_DSBFilter->runDSB(ci, &filtered);
|
||||
if (m_settings.m_dsb)
|
||||
{
|
||||
n_out = m_DSBFilter->runDSB(ci, &filtered);
|
||||
|
||||
if (n_out > 0)
|
||||
{
|
||||
memcpy((void *) m_DSBFilterBuffer, (const void *) filtered, n_out*sizeof(Complex));
|
||||
m_DSBFilterBufferIndex = 0;
|
||||
}
|
||||
if (n_out > 0)
|
||||
{
|
||||
memcpy((void *) m_DSBFilterBuffer, (const void *) filtered, n_out*sizeof(Complex));
|
||||
m_DSBFilterBufferIndex = 0;
|
||||
}
|
||||
|
||||
sample = m_DSBFilterBuffer[m_DSBFilterBufferIndex];
|
||||
m_DSBFilterBufferIndex++;
|
||||
}
|
||||
else
|
||||
{
|
||||
n_out = m_SSBFilter->runSSB(ci, &filtered, m_settings.m_usb);
|
||||
sample = m_DSBFilterBuffer[m_DSBFilterBufferIndex];
|
||||
m_DSBFilterBufferIndex++;
|
||||
}
|
||||
else
|
||||
{
|
||||
n_out = m_SSBFilter->runSSB(ci, &filtered, m_settings.m_usb);
|
||||
|
||||
if (n_out > 0)
|
||||
{
|
||||
memcpy((void *) m_SSBFilterBuffer, (const void *) filtered, n_out*sizeof(Complex));
|
||||
m_SSBFilterBufferIndex = 0;
|
||||
}
|
||||
if (n_out > 0)
|
||||
{
|
||||
memcpy((void *) m_SSBFilterBuffer, (const void *) filtered, n_out*sizeof(Complex));
|
||||
m_SSBFilterBufferIndex = 0;
|
||||
}
|
||||
|
||||
sample = m_SSBFilterBuffer[m_SSBFilterBufferIndex];
|
||||
m_SSBFilterBufferIndex++;
|
||||
}
|
||||
sample = m_SSBFilterBuffer[m_SSBFilterBufferIndex];
|
||||
m_SSBFilterBufferIndex++;
|
||||
}
|
||||
|
||||
if (n_out > 0)
|
||||
{
|
||||
if (n_out > 0)
|
||||
{
|
||||
for (int i = 0; i < n_out; i++)
|
||||
{
|
||||
// Downsample by 2^(m_scaleLog2 - 1) for SSB band spectrum display
|
||||
@ -453,23 +435,23 @@ void SSBModSource::pullAF(Complex& sample)
|
||||
|
||||
if (!(m_undersampleCount++ & decim_mask))
|
||||
{
|
||||
Real avgr = (m_sum.real() / decim) * 0.891235351562f * SDR_TX_SCALEF; //scaling at -1 dB to account for possible filter overshoot
|
||||
Real avgi = (m_sum.imag() / decim) * 0.891235351562f * SDR_TX_SCALEF;
|
||||
Real avgr = (m_sum.real() / (float) decim) * 0.891235351562f * SDR_TX_SCALEF; //scaling at -1 dB to account for possible filter overshoot
|
||||
Real avgi = (m_sum.imag() / (float) decim) * 0.891235351562f * SDR_TX_SCALEF;
|
||||
|
||||
if (!m_settings.m_dsb & !m_settings.m_usb)
|
||||
if (!m_settings.m_dsb && !m_settings.m_usb)
|
||||
{ // invert spectrum for LSB
|
||||
m_sampleBuffer.push_back(Sample(avgi, avgr));
|
||||
m_sampleBuffer.push_back(Sample((FixReal) avgi, (FixReal) avgr));
|
||||
}
|
||||
else
|
||||
{
|
||||
m_sampleBuffer.push_back(Sample(avgr, avgi));
|
||||
m_sampleBuffer.push_back(Sample((FixReal) avgr, (FixReal)avgi));
|
||||
}
|
||||
|
||||
m_sum.real(0.0);
|
||||
m_sum.imag(0.0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} // Real audio
|
||||
else if ((m_settings.m_modAFInput == SSBModSettings::SSBModInputTone)
|
||||
|| (m_settings.m_modAFInput == SSBModSettings::SSBModInputCWTone)) // tone
|
||||
@ -478,16 +460,16 @@ void SSBModSource::pullAF(Complex& sample)
|
||||
|
||||
if (!(m_undersampleCount++ & decim_mask))
|
||||
{
|
||||
Real avgr = (m_sum.real() / decim) * 0.891235351562f * SDR_TX_SCALEF; //scaling at -1 dB to account for possible filter overshoot
|
||||
Real avgi = (m_sum.imag() / decim) * 0.891235351562f * SDR_TX_SCALEF;
|
||||
Real avgr = (m_sum.real() / (float) decim) * 0.891235351562f * SDR_TX_SCALEF; //scaling at -1 dB to account for possible filter overshoot
|
||||
Real avgi = (m_sum.imag() / (float) decim) * 0.891235351562f * SDR_TX_SCALEF;
|
||||
|
||||
if (!m_settings.m_dsb & !m_settings.m_usb)
|
||||
if (!m_settings.m_dsb && !m_settings.m_usb)
|
||||
{ // invert spectrum for LSB
|
||||
m_sampleBuffer.push_back(Sample(avgi, avgr));
|
||||
m_sampleBuffer.push_back(Sample((FixReal) avgi, (FixReal) avgr));
|
||||
}
|
||||
else
|
||||
{
|
||||
m_sampleBuffer.push_back(Sample(avgr, avgi));
|
||||
m_sampleBuffer.push_back(Sample((FixReal) avgr, (FixReal) avgi));
|
||||
}
|
||||
|
||||
m_sum.real(0.0);
|
||||
@ -538,18 +520,18 @@ void SSBModSource::pushFeedback(Complex c)
|
||||
}
|
||||
}
|
||||
|
||||
void SSBModSource::processOneSample(Complex& ci)
|
||||
void SSBModSource::processOneSample(const Complex& ci)
|
||||
{
|
||||
if (m_settings.m_modAFInput == SSBModSettings::SSBModInputCWTone) // minimize latency for CW
|
||||
{
|
||||
m_feedbackAudioBuffer[0].l = ci.real();
|
||||
m_feedbackAudioBuffer[0].r = ci.imag();
|
||||
m_feedbackAudioBuffer[0].l = (qint16) ci.real();
|
||||
m_feedbackAudioBuffer[0].r = (qint16) ci.imag();
|
||||
m_feedbackAudioFifo.writeOne((const quint8*) &m_feedbackAudioBuffer[0]);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_feedbackAudioBuffer[m_feedbackAudioBufferFill].l = ci.real();
|
||||
m_feedbackAudioBuffer[m_feedbackAudioBufferFill].r = ci.imag();
|
||||
m_feedbackAudioBuffer[m_feedbackAudioBufferFill].l = (qint16) ci.real();
|
||||
m_feedbackAudioBuffer[m_feedbackAudioBufferFill].r = (qint16) ci.imag();
|
||||
++m_feedbackAudioBufferFill;
|
||||
|
||||
if (m_feedbackAudioBufferFill >= m_feedbackAudioBuffer.size())
|
||||
@ -568,9 +550,9 @@ void SSBModSource::processOneSample(Complex& ci)
|
||||
}
|
||||
}
|
||||
|
||||
void SSBModSource::calculateLevel(Complex& sample)
|
||||
void SSBModSource::calculateLevel(const Complex& sample)
|
||||
{
|
||||
Real t = sample.real(); // TODO: possibly adjust depending on sample type
|
||||
Real t = sample.real();
|
||||
|
||||
if (m_levelCalcCount < m_levelNbSamples)
|
||||
{
|
||||
@ -617,14 +599,14 @@ void SSBModSource::applyAudioSampleRate(int sampleRate)
|
||||
lowCutoff = band - 100.0f;
|
||||
}
|
||||
|
||||
m_SSBFilter->create_filter(lowCutoff / sampleRate, band / sampleRate);
|
||||
m_DSBFilter->create_dsb_filter((2.0f * band) / sampleRate);
|
||||
m_SSBFilter->create_filter(lowCutoff / (float) sampleRate, band / (float) sampleRate);
|
||||
m_DSBFilter->create_dsb_filter((2.0f * band) / (float) sampleRate);
|
||||
|
||||
m_settings.m_bandwidth = band;
|
||||
m_settings.m_lowCutoff = lowCutoff;
|
||||
m_settings.m_usb = usb;
|
||||
|
||||
m_toneNco.setFreq(m_settings.m_toneFrequency, sampleRate);
|
||||
m_toneNco.setFreq(m_settings.m_toneFrequency, (float) sampleRate);
|
||||
|
||||
if (m_cwKeyer)
|
||||
{
|
||||
@ -632,7 +614,7 @@ void SSBModSource::applyAudioSampleRate(int sampleRate)
|
||||
m_cwKeyer->reset();
|
||||
}
|
||||
|
||||
m_audioCompressor.m_rate = sampleRate;
|
||||
m_audioCompressor.m_rate = (float) sampleRate;
|
||||
m_audioCompressor.initState();
|
||||
m_audioSampleRate = sampleRate;
|
||||
|
||||
@ -641,7 +623,7 @@ void SSBModSource::applyAudioSampleRate(int sampleRate)
|
||||
QList<ObjectPipe*> pipes;
|
||||
MainCore::instance()->getMessagePipes().getMessagePipes(m_channel, "reportdemod", pipes);
|
||||
|
||||
if (pipes.size() > 0)
|
||||
if (!pipes.empty())
|
||||
{
|
||||
for (const auto& pipe : pipes)
|
||||
{
|
||||
@ -665,7 +647,7 @@ void SSBModSource::applyFeedbackAudioSampleRate(int sampleRate)
|
||||
m_feedbackInterpolatorDistanceRemain = 0;
|
||||
m_feedbackInterpolatorConsumed = false;
|
||||
m_feedbackInterpolatorDistance = (Real) sampleRate / (Real) m_audioSampleRate;
|
||||
Real cutoff = std::min(sampleRate, m_audioSampleRate) / 2.2f;
|
||||
Real cutoff = (float) (std::min(sampleRate, m_audioSampleRate)) / 2.2f;
|
||||
m_feedbackInterpolator.create(48, sampleRate, cutoff, 3.0);
|
||||
m_feedbackAudioSampleRate = sampleRate;
|
||||
}
|
||||
@ -693,12 +675,12 @@ void SSBModSource::applySettings(const SSBModSettings& settings, bool force)
|
||||
m_interpolatorConsumed = false;
|
||||
m_interpolatorDistance = (Real) m_audioSampleRate / (Real) m_channelSampleRate;
|
||||
m_interpolator.create(48, m_audioSampleRate, band, 3.0);
|
||||
m_SSBFilter->create_filter(lowCutoff / m_audioSampleRate, band / m_audioSampleRate);
|
||||
m_DSBFilter->create_dsb_filter((2.0f * band) / m_audioSampleRate);
|
||||
m_SSBFilter->create_filter(lowCutoff / (float) m_audioSampleRate, band / (float) m_audioSampleRate);
|
||||
m_DSBFilter->create_dsb_filter((2.0f * band) / (float) m_audioSampleRate);
|
||||
}
|
||||
|
||||
if ((settings.m_toneFrequency != m_settings.m_toneFrequency) || force) {
|
||||
m_toneNco.setFreq(settings.m_toneFrequency, m_audioSampleRate);
|
||||
m_toneNco.setFreq(settings.m_toneFrequency, (float) m_audioSampleRate);
|
||||
}
|
||||
|
||||
if ((settings.m_dsb != m_settings.m_dsb) || force)
|
||||
@ -729,11 +711,11 @@ void SSBModSource::applySettings(const SSBModSettings& settings, bool force)
|
||||
{
|
||||
m_audioCompressor.initSimple(
|
||||
m_audioSampleRate,
|
||||
settings.m_cmpPreGainDB, // pregain (dB)
|
||||
settings.m_cmpThresholdDB, // threshold (dB)
|
||||
(float) settings.m_cmpPreGainDB, // pregain (dB)
|
||||
(float) settings.m_cmpThresholdDB, // threshold (dB)
|
||||
20, // knee (dB)
|
||||
12, // ratio (dB)
|
||||
0.003, // attack (s)
|
||||
0.003f,// attack (s)
|
||||
0.25 // release (s)
|
||||
);
|
||||
}
|
||||
@ -751,8 +733,8 @@ void SSBModSource::applyChannelSettings(int channelSampleRate, int channelFreque
|
||||
<< " channelFrequencyOffset: " << channelFrequencyOffset;
|
||||
|
||||
if ((channelFrequencyOffset != m_channelFrequencyOffset)
|
||||
|| (channelSampleRate != m_channelSampleRate) || force) {
|
||||
m_carrierNco.setFreq(channelFrequencyOffset, channelSampleRate);
|
||||
|| (channelSampleRate != m_channelSampleRate) || force) {
|
||||
m_carrierNco.setFreq((float) channelFrequencyOffset, (float) channelSampleRate);
|
||||
}
|
||||
|
||||
if ((channelSampleRate != m_channelSampleRate) || force)
|
||||
@ -769,7 +751,6 @@ void SSBModSource::applyChannelSettings(int channelSampleRate, int channelFreque
|
||||
|
||||
void SSBModSource::handleAudio()
|
||||
{
|
||||
QMutexLocker mlock(&m_mutex);
|
||||
unsigned int nbRead;
|
||||
|
||||
while ((nbRead = m_audioFifo.read(reinterpret_cast<quint8*>(&m_audioReadBuffer[m_audioReadBufferFill]), 4096)) != 0)
|
||||
|
@ -46,11 +46,11 @@ class SSBModSource : public QObject, public ChannelSampleSource
|
||||
Q_OBJECT
|
||||
public:
|
||||
SSBModSource();
|
||||
virtual ~SSBModSource();
|
||||
~SSBModSource() final;
|
||||
|
||||
virtual void pull(SampleVector::iterator begin, unsigned int nbSamples);
|
||||
virtual void pullOne(Sample& sample);
|
||||
virtual void prefetch(unsigned int nbSamples);
|
||||
void pull(SampleVector::iterator begin, unsigned int nbSamples) final;
|
||||
void pullOne(Sample& sample) final;
|
||||
void prefetch(unsigned int nbSamples) final;
|
||||
|
||||
void setInputFileStream(std::ifstream *ifstream) { m_ifstream = ifstream; }
|
||||
AudioFifo *getAudioFifo() { return &m_audioFifo; }
|
||||
@ -70,12 +70,12 @@ public:
|
||||
numSamples = m_levelNbSamples;
|
||||
}
|
||||
void applySettings(const SSBModSettings& settings, bool force = false);
|
||||
void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = 0);
|
||||
void applyChannelSettings(int channelSampleRate, int channelFrequencyOffset, bool force = false);
|
||||
void setSpectrumSink(SpectrumVis *sampleSink) { m_spectrumSink = sampleSink; }
|
||||
|
||||
private:
|
||||
int m_channelSampleRate;
|
||||
int m_channelFrequencyOffset;
|
||||
int m_channelSampleRate = 48000;
|
||||
int m_channelFrequencyOffset = 0;
|
||||
SSBModSettings m_settings;
|
||||
ChannelAPI *m_channel;
|
||||
|
||||
@ -104,7 +104,7 @@ private:
|
||||
int m_DSBFilterBufferIndex;
|
||||
static const int m_ssbFftLen;
|
||||
|
||||
SpectrumVis* m_spectrumSink;
|
||||
SpectrumVis* m_spectrumSink = nullptr;
|
||||
SampleVector m_sampleBuffer;
|
||||
|
||||
fftfilt::cmplx m_sum;
|
||||
@ -114,7 +114,7 @@ private:
|
||||
double m_magsq;
|
||||
MovingAverageUtil<double, double, 16> m_movingAverage;
|
||||
|
||||
int m_audioSampleRate;
|
||||
int m_audioSampleRate = 48000;
|
||||
AudioVector m_audioBuffer;
|
||||
unsigned int m_audioBufferFill;
|
||||
AudioVector m_audioReadBuffer;
|
||||
@ -126,14 +126,14 @@ private:
|
||||
uint m_feedbackAudioBufferFill;
|
||||
AudioFifo m_feedbackAudioFifo;
|
||||
|
||||
quint32 m_levelCalcCount;
|
||||
quint32 m_levelCalcCount = 0;
|
||||
qreal m_rmsLevel;
|
||||
qreal m_peakLevelOut;
|
||||
Real m_peakLevel;
|
||||
Real m_levelSum;
|
||||
Real m_peakLevel = 0.0f;
|
||||
Real m_levelSum = 0.0f;
|
||||
|
||||
std::ifstream *m_ifstream;
|
||||
CWKeyer *m_cwKeyer;
|
||||
std::ifstream *m_ifstream = nullptr;
|
||||
CWKeyer *m_cwKeyer = nullptr;
|
||||
|
||||
AudioCompressorSnd m_audioCompressor;
|
||||
int m_agcStepLength;
|
||||
@ -142,11 +142,11 @@ private:
|
||||
|
||||
static const int m_levelNbSamples;
|
||||
|
||||
void processOneSample(Complex& ci);
|
||||
void processOneSample(const Complex& ci);
|
||||
void pullAF(Complex& sample);
|
||||
void pullAudio(unsigned int nbSamples);
|
||||
void pushFeedback(Complex sample);
|
||||
void calculateLevel(Complex& sample);
|
||||
void calculateLevel(const Complex& sample);
|
||||
void modulateSample();
|
||||
|
||||
private slots:
|
||||
|
@ -68,11 +68,11 @@ Bladerf1Output::~Bladerf1Output()
|
||||
delete m_networkManager;
|
||||
|
||||
if (m_running) {
|
||||
stop();
|
||||
Bladerf1Output::stop();
|
||||
}
|
||||
|
||||
closeDevice();
|
||||
m_deviceAPI->setBuddySharedPtr(0);
|
||||
m_deviceAPI->setBuddySharedPtr(nullptr);
|
||||
}
|
||||
|
||||
void Bladerf1Output::destroy()
|
||||
@ -82,7 +82,7 @@ void Bladerf1Output::destroy()
|
||||
|
||||
bool Bladerf1Output::openDevice()
|
||||
{
|
||||
if (m_dev != 0) {
|
||||
if (m_dev != nullptr) {
|
||||
closeDevice();
|
||||
}
|
||||
|
||||
@ -90,24 +90,24 @@ bool Bladerf1Output::openDevice()
|
||||
|
||||
m_sampleSourceFifo.resize(SampleSourceFifo::getSizePolicy(m_settings.m_devSampleRate));
|
||||
|
||||
if (m_deviceAPI->getSourceBuddies().size() > 0)
|
||||
if (!m_deviceAPI->getSourceBuddies().empty())
|
||||
{
|
||||
DeviceAPI *sourceBuddy = m_deviceAPI->getSourceBuddies()[0];
|
||||
DeviceBladeRF1Params *buddySharedParams = (DeviceBladeRF1Params *) sourceBuddy->getBuddySharedPtr();
|
||||
const DeviceAPI *sourceBuddy = m_deviceAPI->getSourceBuddies()[0];
|
||||
const DeviceBladeRF1Params *buddySharedParams = (DeviceBladeRF1Params *) sourceBuddy->getBuddySharedPtr();
|
||||
|
||||
if (buddySharedParams == 0)
|
||||
if (buddySharedParams == nullptr)
|
||||
{
|
||||
qCritical("BladerfOutput::start: could not get shared parameters from buddy");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (buddySharedParams->m_dev == 0) // device is not opened by buddy
|
||||
if (buddySharedParams->m_dev == nullptr) // device is not opened by buddy
|
||||
{
|
||||
qCritical("BladerfOutput::start: could not get BladeRF handle from buddy");
|
||||
return false;
|
||||
}
|
||||
|
||||
m_sharedParams = *(buddySharedParams); // copy parameters from buddy
|
||||
m_sharedParams = *buddySharedParams; // copy parameters from buddy
|
||||
m_dev = m_sharedParams.m_dev; // get BladeRF handle
|
||||
}
|
||||
else
|
||||
@ -121,7 +121,6 @@ bool Bladerf1Output::openDevice()
|
||||
m_sharedParams.m_dev = m_dev;
|
||||
}
|
||||
|
||||
// TODO: adjust USB transfer data according to sample rate
|
||||
if ((res = bladerf_sync_config(m_dev, BLADERF_TX_X1, BLADERF_FORMAT_SC16_Q11, 64, 8192, 32, 10000)) < 0)
|
||||
{
|
||||
qCritical("BladerfOutput::start: bladerf_sync_config with return code %d", res);
|
||||
@ -183,14 +182,14 @@ void Bladerf1Output::closeDevice()
|
||||
{
|
||||
qDebug("BladerfOutput::closeDevice: closing device since Rx side is not open");
|
||||
|
||||
if (m_dev != 0) // close BladeRF
|
||||
if (m_dev != nullptr) // close BladeRF
|
||||
{
|
||||
bladerf_close(m_dev);
|
||||
}
|
||||
}
|
||||
|
||||
m_sharedParams.m_dev = nullptr;
|
||||
m_dev = 0;
|
||||
m_dev = nullptr;
|
||||
}
|
||||
|
||||
void Bladerf1Output::stop()
|
||||
@ -273,7 +272,7 @@ bool Bladerf1Output::handleMessage(const Message& message)
|
||||
{
|
||||
if (MsgConfigureBladerf1::match(message))
|
||||
{
|
||||
MsgConfigureBladerf1& conf = (MsgConfigureBladerf1&) message;
|
||||
auto& conf = (const MsgConfigureBladerf1&) message;
|
||||
qDebug() << "BladerfOutput::handleMessage: MsgConfigureBladerf";
|
||||
|
||||
if (!applySettings(conf.getSettings(), conf.getSettingsKeys(), conf.getForce())) {
|
||||
@ -284,7 +283,7 @@ bool Bladerf1Output::handleMessage(const Message& message)
|
||||
}
|
||||
else if (MsgStartStop::match(message))
|
||||
{
|
||||
MsgStartStop& cmd = (MsgStartStop&) message;
|
||||
auto& cmd = (const MsgStartStop&) message;
|
||||
qDebug() << "BladerfOutput::handleMessage: MsgStartStop: " << (cmd.getStartStop() ? "start" : "stop");
|
||||
|
||||
if (cmd.getStartStop())
|
||||
@ -316,7 +315,7 @@ bool Bladerf1Output::applySettings(const BladeRF1OutputSettings& settings, const
|
||||
bool forwardChange = false;
|
||||
bool suspendOwnThread = false;
|
||||
bool threadWasRunning = false;
|
||||
// QMutexLocker mutexLocker(&m_mutex);
|
||||
QMutexLocker mutexLocker(&m_mutex);
|
||||
|
||||
if (settingsKeys.contains("devSampleRate") ||
|
||||
settingsKeys.contains("log2Interp") || force)
|
||||
@ -324,16 +323,10 @@ bool Bladerf1Output::applySettings(const BladeRF1OutputSettings& settings, const
|
||||
suspendOwnThread = true;
|
||||
}
|
||||
|
||||
if (suspendOwnThread)
|
||||
if (suspendOwnThread && m_bladerfThread && m_bladerfThread->isRunning())
|
||||
{
|
||||
if (m_bladerfThread)
|
||||
{
|
||||
if (m_bladerfThread->isRunning())
|
||||
{
|
||||
m_bladerfThread->stopWork();
|
||||
threadWasRunning = true;
|
||||
}
|
||||
}
|
||||
m_bladerfThread->stopWork();
|
||||
threadWasRunning = true;
|
||||
}
|
||||
|
||||
if (settingsKeys.contains("devSampleRate") ||
|
||||
@ -354,7 +347,7 @@ bool Bladerf1Output::applySettings(const BladeRF1OutputSettings& settings, const
|
||||
{
|
||||
forwardChange = true;
|
||||
|
||||
if (m_dev != 0)
|
||||
if (m_dev != nullptr)
|
||||
{
|
||||
unsigned int actualSamplerate;
|
||||
|
||||
@ -370,129 +363,108 @@ bool Bladerf1Output::applySettings(const BladeRF1OutputSettings& settings, const
|
||||
{
|
||||
forwardChange = true;
|
||||
|
||||
if (m_bladerfThread != 0)
|
||||
if (m_bladerfThread != nullptr)
|
||||
{
|
||||
m_bladerfThread->setLog2Interpolation(settings.m_log2Interp);
|
||||
qDebug() << "BladerfOutput::applySettings: set interpolation to " << (1<<settings.m_log2Interp);
|
||||
}
|
||||
}
|
||||
|
||||
if (settingsKeys.contains("vga1") || force)
|
||||
if ((m_dev != nullptr) && (settingsKeys.contains("vga1") || force))
|
||||
{
|
||||
if (m_dev != 0)
|
||||
{
|
||||
if (bladerf_set_txvga1(m_dev, settings.m_vga1) != 0) {
|
||||
qDebug("BladerfOutput::applySettings: bladerf_set_txvga1() failed");
|
||||
} else {
|
||||
qDebug() << "BladerfOutput::applySettings: VGA1 gain set to " << settings.m_vga1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (settingsKeys.contains("vga2") || force)
|
||||
{
|
||||
if(m_dev != 0)
|
||||
{
|
||||
if (bladerf_set_txvga2(m_dev, settings.m_vga2) != 0) {
|
||||
qDebug("BladerfOutput::applySettings:bladerf_set_rxvga2() failed");
|
||||
} else {
|
||||
qDebug() << "BladerfOutput::applySettings: VGA2 gain set to " << settings.m_vga2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (settingsKeys.contains("xb200") || force)
|
||||
{
|
||||
if (m_dev != 0)
|
||||
{
|
||||
bool changeSettings;
|
||||
|
||||
if (m_deviceAPI->getSourceBuddies().size() > 0)
|
||||
{
|
||||
DeviceAPI *buddy = m_deviceAPI->getSourceBuddies()[0];
|
||||
|
||||
if (buddy->getDeviceSourceEngine()->state() == DSPDeviceSourceEngine::StRunning) { // Tx side running
|
||||
changeSettings = false;
|
||||
} else {
|
||||
changeSettings = true;
|
||||
}
|
||||
}
|
||||
else // No Rx open
|
||||
{
|
||||
changeSettings = true;
|
||||
}
|
||||
|
||||
if (changeSettings)
|
||||
{
|
||||
if (settings.m_xb200)
|
||||
{
|
||||
if (bladerf_expansion_attach(m_dev, BLADERF_XB_200) != 0) {
|
||||
qDebug("BladerfOutput::applySettings: bladerf_expansion_attach(xb200) failed");
|
||||
} else {
|
||||
qDebug() << "BladerfOutput::applySettings: Attach XB200";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (bladerf_expansion_attach(m_dev, BLADERF_XB_NONE) != 0) {
|
||||
qDebug("BladerfOutput::applySettings: bladerf_expansion_attach(none) failed");
|
||||
} else {
|
||||
qDebug() << "BladerfOutput::applySettings: Detach XB200";
|
||||
}
|
||||
}
|
||||
|
||||
m_sharedParams.m_xb200Attached = settings.m_xb200;
|
||||
}
|
||||
if (bladerf_set_txvga1(m_dev, settings.m_vga1) != 0) {
|
||||
qDebug("BladerfOutput::applySettings: bladerf_set_txvga1() failed");
|
||||
} else {
|
||||
qDebug() << "BladerfOutput::applySettings: VGA1 gain set to " << settings.m_vga1;
|
||||
}
|
||||
}
|
||||
|
||||
if (settingsKeys.contains("xb200Path") || force)
|
||||
if ((m_dev != nullptr) && (settingsKeys.contains("vga2") || force))
|
||||
{
|
||||
if (m_dev != 0)
|
||||
{
|
||||
if (bladerf_xb200_set_path(m_dev, BLADERF_MODULE_TX, settings.m_xb200Path) != 0) {
|
||||
qDebug("BladerfOutput::applySettings: bladerf_xb200_set_path(BLADERF_MODULE_TX) failed");
|
||||
} else {
|
||||
qDebug() << "BladerfOutput::applySettings: set xb200 path to " << settings.m_xb200Path;
|
||||
}
|
||||
}
|
||||
if (bladerf_set_txvga2(m_dev, settings.m_vga2) != 0) {
|
||||
qDebug("BladerfOutput::applySettings:bladerf_set_rxvga2() failed");
|
||||
} else {
|
||||
qDebug() << "BladerfOutput::applySettings: VGA2 gain set to " << settings.m_vga2;
|
||||
}
|
||||
}
|
||||
|
||||
if (settingsKeys.contains("xb200Filter") || force)
|
||||
if ((m_dev != nullptr) && (settingsKeys.contains("xb200") || force))
|
||||
{
|
||||
if (m_dev != 0)
|
||||
{
|
||||
if (bladerf_xb200_set_filterbank(m_dev, BLADERF_MODULE_TX, settings.m_xb200Filter) != 0) {
|
||||
qDebug("BladerfOutput::applySettings: bladerf_xb200_set_filterbank(BLADERF_MODULE_TX) failed");
|
||||
} else {
|
||||
qDebug() << "BladerfOutput::applySettings: set xb200 filter to " << settings.m_xb200Filter;
|
||||
}
|
||||
}
|
||||
bool changeSettings;
|
||||
|
||||
if (!m_deviceAPI->getSourceBuddies().empty())
|
||||
{
|
||||
DeviceAPI *buddy = m_deviceAPI->getSourceBuddies()[0];
|
||||
|
||||
if (buddy->getDeviceSourceEngine()->state() == DSPDeviceSourceEngine::State::StRunning) { // Tx side running
|
||||
changeSettings = false;
|
||||
} else {
|
||||
changeSettings = true;
|
||||
}
|
||||
}
|
||||
else // No Rx open
|
||||
{
|
||||
changeSettings = true;
|
||||
}
|
||||
|
||||
if (changeSettings)
|
||||
{
|
||||
if (settings.m_xb200)
|
||||
{
|
||||
if (bladerf_expansion_attach(m_dev, BLADERF_XB_200) != 0) {
|
||||
qDebug("BladerfOutput::applySettings: bladerf_expansion_attach(xb200) failed");
|
||||
} else {
|
||||
qDebug() << "BladerfOutput::applySettings: Attach XB200";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (bladerf_expansion_attach(m_dev, BLADERF_XB_NONE) != 0) {
|
||||
qDebug("BladerfOutput::applySettings: bladerf_expansion_attach(none) failed");
|
||||
} else {
|
||||
qDebug() << "BladerfOutput::applySettings: Detach XB200";
|
||||
}
|
||||
}
|
||||
|
||||
m_sharedParams.m_xb200Attached = settings.m_xb200;
|
||||
}
|
||||
}
|
||||
|
||||
if (settingsKeys.contains("bandwidth") || force)
|
||||
if ((m_dev != nullptr) && (settingsKeys.contains("xb200Path") || force))
|
||||
{
|
||||
if (m_dev != 0)
|
||||
{
|
||||
unsigned int actualBandwidth;
|
||||
if (bladerf_xb200_set_path(m_dev, BLADERF_MODULE_TX, settings.m_xb200Path) != 0) {
|
||||
qDebug("BladerfOutput::applySettings: bladerf_xb200_set_path(BLADERF_MODULE_TX) failed");
|
||||
} else {
|
||||
qDebug() << "BladerfOutput::applySettings: set xb200 path to " << settings.m_xb200Path;
|
||||
}
|
||||
}
|
||||
|
||||
if (bladerf_set_bandwidth(m_dev, BLADERF_MODULE_TX, settings.m_bandwidth, &actualBandwidth) < 0) {
|
||||
qCritical("BladerfOutput::applySettings: could not set bandwidth: %d", settings.m_bandwidth);
|
||||
} else {
|
||||
qDebug() << "BladerfOutput::applySettings: bladerf_set_bandwidth(BLADERF_MODULE_TX) actual bandwidth is " << actualBandwidth;
|
||||
}
|
||||
}
|
||||
if ((m_dev != nullptr) && (settingsKeys.contains("xb200Filter") || force))
|
||||
{
|
||||
if (bladerf_xb200_set_filterbank(m_dev, BLADERF_MODULE_TX, settings.m_xb200Filter) != 0) {
|
||||
qDebug("BladerfOutput::applySettings: bladerf_xb200_set_filterbank(BLADERF_MODULE_TX) failed");
|
||||
} else {
|
||||
qDebug() << "BladerfOutput::applySettings: set xb200 filter to " << settings.m_xb200Filter;
|
||||
}
|
||||
}
|
||||
|
||||
if ((m_dev != nullptr) && (settingsKeys.contains("bandwidth") || force))
|
||||
{
|
||||
unsigned int actualBandwidth;
|
||||
|
||||
if (bladerf_set_bandwidth(m_dev, BLADERF_MODULE_TX, settings.m_bandwidth, &actualBandwidth) < 0) {
|
||||
qCritical("BladerfOutput::applySettings: could not set bandwidth: %d", settings.m_bandwidth);
|
||||
} else {
|
||||
qDebug() << "BladerfOutput::applySettings: bladerf_set_bandwidth(BLADERF_MODULE_TX) actual bandwidth is " << actualBandwidth;
|
||||
}
|
||||
}
|
||||
|
||||
if (settingsKeys.contains("centerFrequency"))
|
||||
{
|
||||
forwardChange = true;
|
||||
|
||||
if (m_dev != 0)
|
||||
{
|
||||
if (bladerf_set_frequency( m_dev, BLADERF_MODULE_TX, settings.m_centerFrequency ) != 0) {
|
||||
qDebug("BladerfOutput::applySettings: bladerf_set_frequency(%lld) failed", settings.m_centerFrequency);
|
||||
}
|
||||
if ((m_dev != nullptr) && (bladerf_set_frequency( m_dev, BLADERF_MODULE_TX, settings.m_centerFrequency ) != 0)) {
|
||||
qDebug("BladerfOutput::applySettings: bladerf_set_frequency(%lld) failed", settings.m_centerFrequency);
|
||||
}
|
||||
}
|
||||
|
||||
@ -519,7 +491,7 @@ bool Bladerf1Output::applySettings(const BladeRF1OutputSettings& settings, const
|
||||
if (forwardChange)
|
||||
{
|
||||
int sampleRate = m_settings.m_devSampleRate/(1<<m_settings.m_log2Interp);
|
||||
DSPSignalNotification *notif = new DSPSignalNotification(sampleRate, m_settings.m_centerFrequency);
|
||||
auto *notif = new DSPSignalNotification(sampleRate, m_settings.m_centerFrequency);
|
||||
m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif);
|
||||
}
|
||||
|
||||
@ -608,7 +580,7 @@ void Bladerf1Output::webapiUpdateDeviceSettings(
|
||||
settings.m_log2Interp = response.getBladeRf1OutputSettings()->getLog2Interp();
|
||||
}
|
||||
if (deviceSettingsKeys.contains("xb200")) {
|
||||
settings.m_xb200 = response.getBladeRf1OutputSettings()->getXb200() == 0 ? 0 : 1;
|
||||
settings.m_xb200 = response.getBladeRf1OutputSettings()->getXb200() == 0 ? false : true;
|
||||
}
|
||||
if (deviceSettingsKeys.contains("xb200Path")) {
|
||||
settings.m_xb200Path = static_cast<bladerf_xb200_path>(response.getBladeRf1OutputSettings()->getXb200Path());
|
||||
@ -623,10 +595,10 @@ void Bladerf1Output::webapiUpdateDeviceSettings(
|
||||
settings.m_reverseAPIAddress = *response.getBladeRf1OutputSettings()->getReverseApiAddress();
|
||||
}
|
||||
if (deviceSettingsKeys.contains("reverseAPIPort")) {
|
||||
settings.m_reverseAPIPort = response.getBladeRf1OutputSettings()->getReverseApiPort();
|
||||
settings.m_reverseAPIPort = (uint16_t) response.getBladeRf1OutputSettings()->getReverseApiPort();
|
||||
}
|
||||
if (deviceSettingsKeys.contains("reverseAPIDeviceIndex")) {
|
||||
settings.m_reverseAPIDeviceIndex = response.getBladeRf1OutputSettings()->getReverseApiDeviceIndex();
|
||||
settings.m_reverseAPIDeviceIndex = (uint16_t) response.getBladeRf1OutputSettings()->getReverseApiDeviceIndex();
|
||||
}
|
||||
}
|
||||
|
||||
@ -660,7 +632,7 @@ int Bladerf1Output::webapiRun(
|
||||
|
||||
void Bladerf1Output::webapiReverseSendSettings(const QList<QString>& deviceSettingsKeys, const BladeRF1OutputSettings& settings, bool force)
|
||||
{
|
||||
SWGSDRangel::SWGDeviceSettings *swgDeviceSettings = new SWGSDRangel::SWGDeviceSettings();
|
||||
auto *swgDeviceSettings = new SWGSDRangel::SWGDeviceSettings();
|
||||
swgDeviceSettings->setDirection(1); // single Tx
|
||||
swgDeviceSettings->setOriginatorIndex(m_deviceAPI->getDeviceSetIndex());
|
||||
swgDeviceSettings->setDeviceHwType(new QString("BladeRF1"));
|
||||
@ -704,8 +676,8 @@ void Bladerf1Output::webapiReverseSendSettings(const QList<QString>& deviceSetti
|
||||
m_networkRequest.setUrl(QUrl(deviceSettingsURL));
|
||||
m_networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
|
||||
|
||||
QBuffer *buffer = new QBuffer();
|
||||
buffer->open((QBuffer::ReadWrite));
|
||||
auto *buffer = new QBuffer();
|
||||
buffer->open(QBuffer::ReadWrite);
|
||||
buffer->write(swgDeviceSettings->asJson().toUtf8());
|
||||
buffer->seek(0);
|
||||
|
||||
@ -718,7 +690,7 @@ void Bladerf1Output::webapiReverseSendSettings(const QList<QString>& deviceSetti
|
||||
|
||||
void Bladerf1Output::webapiReverseSendStartStop(bool start)
|
||||
{
|
||||
SWGSDRangel::SWGDeviceSettings *swgDeviceSettings = new SWGSDRangel::SWGDeviceSettings();
|
||||
auto *swgDeviceSettings = new SWGSDRangel::SWGDeviceSettings();
|
||||
swgDeviceSettings->setDirection(1); // single Tx
|
||||
swgDeviceSettings->setOriginatorIndex(m_deviceAPI->getDeviceSetIndex());
|
||||
swgDeviceSettings->setDeviceHwType(new QString("BladeRF1"));
|
||||
@ -730,8 +702,8 @@ void Bladerf1Output::webapiReverseSendStartStop(bool start)
|
||||
m_networkRequest.setUrl(QUrl(deviceSettingsURL));
|
||||
m_networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
|
||||
|
||||
QBuffer *buffer = new QBuffer();
|
||||
buffer->open((QBuffer::ReadWrite));
|
||||
auto *buffer = new QBuffer();
|
||||
buffer->open(QBuffer::ReadWrite);
|
||||
buffer->write(swgDeviceSettings->asJson().toUtf8());
|
||||
buffer->seek(0);
|
||||
QNetworkReply *reply;
|
||||
@ -746,7 +718,7 @@ void Bladerf1Output::webapiReverseSendStartStop(bool start)
|
||||
delete swgDeviceSettings;
|
||||
}
|
||||
|
||||
void Bladerf1Output::networkManagerFinished(QNetworkReply *reply)
|
||||
void Bladerf1Output::networkManagerFinished(QNetworkReply *reply) const
|
||||
{
|
||||
QNetworkReply::NetworkError replyError = reply->error();
|
||||
|
||||
|
@ -74,10 +74,10 @@ public:
|
||||
return new MsgStartStop(startStop);
|
||||
}
|
||||
|
||||
protected:
|
||||
private:
|
||||
bool m_startStop;
|
||||
|
||||
MsgStartStop(bool startStop) :
|
||||
explicit MsgStartStop(bool startStop) :
|
||||
Message(),
|
||||
m_startStop(startStop)
|
||||
{ }
|
||||
@ -100,57 +100,57 @@ public:
|
||||
{ }
|
||||
};
|
||||
|
||||
Bladerf1Output(DeviceAPI *deviceAPI);
|
||||
virtual ~Bladerf1Output();
|
||||
virtual void destroy();
|
||||
explicit Bladerf1Output(DeviceAPI *deviceAPI);
|
||||
~Bladerf1Output() final;
|
||||
void destroy() final;
|
||||
|
||||
virtual void init();
|
||||
virtual bool start();
|
||||
virtual void stop();
|
||||
void init() final;
|
||||
bool start() final;
|
||||
void stop() final;
|
||||
|
||||
virtual QByteArray serialize() const;
|
||||
virtual bool deserialize(const QByteArray& data);
|
||||
QByteArray serialize() const final;
|
||||
bool deserialize(const QByteArray& data) final;
|
||||
|
||||
virtual void setMessageQueueToGUI(MessageQueue *queue) { m_guiMessageQueue = queue; }
|
||||
virtual const QString& getDeviceDescription() const;
|
||||
virtual int getSampleRate() const;
|
||||
virtual void setSampleRate(int sampleRate) { (void) sampleRate; }
|
||||
virtual quint64 getCenterFrequency() const;
|
||||
virtual void setCenterFrequency(qint64 centerFrequency);
|
||||
void setMessageQueueToGUI(MessageQueue *queue) final { m_guiMessageQueue = queue; }
|
||||
const QString& getDeviceDescription() const final;
|
||||
int getSampleRate() const final;
|
||||
void setSampleRate(int sampleRate) final { (void) sampleRate; }
|
||||
quint64 getCenterFrequency() const final;
|
||||
void setCenterFrequency(qint64 centerFrequency) final;
|
||||
|
||||
virtual bool handleMessage(const Message& message);
|
||||
bool handleMessage(const Message& message) final;
|
||||
|
||||
virtual int webapiSettingsGet(
|
||||
SWGSDRangel::SWGDeviceSettings& response,
|
||||
QString& errorMessage);
|
||||
int webapiSettingsGet(
|
||||
SWGSDRangel::SWGDeviceSettings& response,
|
||||
QString& errorMessage) final;
|
||||
|
||||
virtual int webapiSettingsPutPatch(
|
||||
bool force,
|
||||
const QStringList& deviceSettingsKeys,
|
||||
SWGSDRangel::SWGDeviceSettings& response, // query + response
|
||||
QString& errorMessage);
|
||||
int webapiSettingsPutPatch(
|
||||
bool force,
|
||||
const QStringList& deviceSettingsKeys,
|
||||
SWGSDRangel::SWGDeviceSettings& response, // query + response
|
||||
QString& errorMessage) final;
|
||||
|
||||
virtual int webapiRunGet(
|
||||
SWGSDRangel::SWGDeviceState& response,
|
||||
QString& errorMessage);
|
||||
int webapiRunGet(
|
||||
SWGSDRangel::SWGDeviceState& response,
|
||||
QString& errorMessage) final;
|
||||
|
||||
virtual int webapiRun(
|
||||
bool run,
|
||||
SWGSDRangel::SWGDeviceState& response,
|
||||
QString& errorMessage);
|
||||
int webapiRun(
|
||||
bool run,
|
||||
SWGSDRangel::SWGDeviceState& response,
|
||||
QString& errorMessage) final;
|
||||
|
||||
static void webapiFormatDeviceSettings(
|
||||
SWGSDRangel::SWGDeviceSettings& response,
|
||||
const BladeRF1OutputSettings& settings);
|
||||
SWGSDRangel::SWGDeviceSettings& response,
|
||||
const BladeRF1OutputSettings& settings);
|
||||
|
||||
static void webapiUpdateDeviceSettings(
|
||||
BladeRF1OutputSettings& settings,
|
||||
const QStringList& deviceSettingsKeys,
|
||||
SWGSDRangel::SWGDeviceSettings& response);
|
||||
BladeRF1OutputSettings& settings,
|
||||
const QStringList& deviceSettingsKeys,
|
||||
SWGSDRangel::SWGDeviceSettings& response);
|
||||
|
||||
private:
|
||||
DeviceAPI *m_deviceAPI;
|
||||
QMutex m_mutex;
|
||||
QRecursiveMutex m_mutex;
|
||||
BladeRF1OutputSettings m_settings;
|
||||
struct bladerf* m_dev;
|
||||
Bladerf1OutputThread* m_bladerfThread;
|
||||
@ -167,7 +167,7 @@ private:
|
||||
void webapiReverseSendStartStop(bool start);
|
||||
|
||||
private slots:
|
||||
void networkManagerFinished(QNetworkReply *reply);
|
||||
void networkManagerFinished(QNetworkReply *reply) const;
|
||||
};
|
||||
|
||||
#endif // INCLUDE_BLADERFOUTPUT_H
|
||||
|
@ -44,11 +44,8 @@ MESSAGE_CLASS_DEFINITION(FileOutput::MsgReportFileOutputStreamTiming, Message)
|
||||
|
||||
FileOutput::FileOutput(DeviceAPI *deviceAPI) :
|
||||
m_deviceAPI(deviceAPI),
|
||||
m_running(false),
|
||||
m_settings(),
|
||||
m_fileOutputWorker(nullptr),
|
||||
m_deviceDescription("FileOutput"),
|
||||
m_startingTimeStamp(0),
|
||||
m_masterTimer(deviceAPI->getMasterTimer())
|
||||
{
|
||||
m_deviceAPI->setNbSinkStreams(1);
|
||||
@ -58,7 +55,7 @@ FileOutput::FileOutput(DeviceAPI *deviceAPI) :
|
||||
FileOutput::~FileOutput()
|
||||
{
|
||||
delete m_networkManager;
|
||||
stop();
|
||||
FileOutput::stop();
|
||||
}
|
||||
|
||||
void FileOutput::destroy()
|
||||
@ -75,7 +72,7 @@ void FileOutput::openFileStream()
|
||||
m_ofstream.open(m_settings.m_fileName.toStdString().c_str(), std::ios::binary);
|
||||
|
||||
FileRecord::Header header;
|
||||
int actualSampleRate = m_settings.m_sampleRate * (1<<m_settings.m_log2Interp);
|
||||
auto actualSampleRate = (int) (m_settings.m_sampleRate * (1<<m_settings.m_log2Interp));
|
||||
header.sampleRate = actualSampleRate;
|
||||
header.centerFrequency = m_settings.m_centerFrequency;
|
||||
m_startingTimeStamp = QDateTime::currentMSecsSinceEpoch();
|
||||
@ -106,14 +103,13 @@ bool FileOutput::start()
|
||||
|
||||
m_fileOutputWorker = new FileOutputWorker(&m_ofstream, &m_sampleSourceFifo);
|
||||
m_fileOutputWorker->moveToThread(&m_fileOutputWorkerThread);
|
||||
m_fileOutputWorker->setSamplerate(m_settings.m_sampleRate);
|
||||
m_fileOutputWorker->setSamplerate((int) m_settings.m_sampleRate);
|
||||
m_fileOutputWorker->setLog2Interpolation(m_settings.m_log2Interp);
|
||||
m_fileOutputWorker->connectTimer(m_masterTimer);
|
||||
startWorker();
|
||||
m_running = true;
|
||||
|
||||
mutexLocker.unlock();
|
||||
//applySettings(m_generalSettings, m_settings, true);
|
||||
qDebug("FileOutput::start: started");
|
||||
|
||||
if (getMessageQueueToGUI())
|
||||
@ -201,7 +197,7 @@ const QString& FileOutput::getDeviceDescription() const
|
||||
|
||||
int FileOutput::getSampleRate() const
|
||||
{
|
||||
return m_settings.m_sampleRate;
|
||||
return (int) m_settings.m_sampleRate;
|
||||
}
|
||||
|
||||
quint64 FileOutput::getCenterFrequency() const
|
||||
@ -233,14 +229,14 @@ bool FileOutput::handleMessage(const Message& message)
|
||||
{
|
||||
if (MsgConfigureFileOutputName::match(message))
|
||||
{
|
||||
MsgConfigureFileOutputName& conf = (MsgConfigureFileOutputName&) message;
|
||||
auto& conf = (const MsgConfigureFileOutputName&) message;
|
||||
m_settings.m_fileName = conf.getFileName();
|
||||
openFileStream();
|
||||
return true;
|
||||
}
|
||||
else if (MsgStartStop::match(message))
|
||||
{
|
||||
MsgStartStop& cmd = (MsgStartStop&) message;
|
||||
auto& cmd = (const MsgStartStop&) message;
|
||||
qDebug() << "FileOutput::handleMessage: MsgStartStop: " << (cmd.getStartStop() ? "start" : "stop");
|
||||
|
||||
if (cmd.getStartStop())
|
||||
@ -262,17 +258,17 @@ bool FileOutput::handleMessage(const Message& message)
|
||||
}
|
||||
else if (MsgConfigureFileOutput::match(message))
|
||||
{
|
||||
qDebug() << "FileOutput::handleMessage: MsgConfigureFileOutput";
|
||||
MsgConfigureFileOutput& conf = (MsgConfigureFileOutput&) message;
|
||||
qDebug() << "FileOutput::handleMessage: MsgConfigureFileOutput";
|
||||
auto& conf = (const MsgConfigureFileOutput&) message;
|
||||
applySettings(conf.getSettings(), conf.getSettingsKeys(), conf.getForce());
|
||||
return true;
|
||||
}
|
||||
else if (MsgConfigureFileOutputWork::match(message))
|
||||
{
|
||||
MsgConfigureFileOutputWork& conf = (MsgConfigureFileOutputWork&) message;
|
||||
auto& conf = (const MsgConfigureFileOutputWork&) message;
|
||||
bool working = conf.isWorking();
|
||||
|
||||
if (m_fileOutputWorker != 0)
|
||||
if (m_fileOutputWorker != nullptr)
|
||||
{
|
||||
if (working) {
|
||||
startWorker();
|
||||
@ -285,11 +281,9 @@ bool FileOutput::handleMessage(const Message& message)
|
||||
}
|
||||
else if (MsgConfigureFileOutputStreamTiming::match(message))
|
||||
{
|
||||
MsgReportFileOutputStreamTiming *report;
|
||||
|
||||
if (m_fileOutputWorker != 0 && getMessageQueueToGUI())
|
||||
if (m_fileOutputWorker != nullptr && getMessageQueueToGUI())
|
||||
{
|
||||
report = MsgReportFileOutputStreamTiming::create(m_fileOutputWorker->getSamplesCount());
|
||||
auto *report = MsgReportFileOutputStreamTiming::create(m_fileOutputWorker->getSamplesCount());
|
||||
getMessageQueueToGUI()->push(report);
|
||||
}
|
||||
|
||||
@ -314,8 +308,8 @@ void FileOutput::applySettings(const FileOutputSettings& settings, const QList<Q
|
||||
|
||||
if (force || settingsKeys.contains("sampleRate"))
|
||||
{
|
||||
if (m_fileOutputWorker != 0) {
|
||||
m_fileOutputWorker->setSamplerate(settings.m_sampleRate);
|
||||
if (m_fileOutputWorker != nullptr) {
|
||||
m_fileOutputWorker->setSamplerate((int) settings.m_sampleRate);
|
||||
}
|
||||
|
||||
forwardChange = true;
|
||||
@ -323,7 +317,7 @@ void FileOutput::applySettings(const FileOutputSettings& settings, const QList<Q
|
||||
|
||||
if (force || settingsKeys.contains("log2Interp"))
|
||||
{
|
||||
if (m_fileOutputWorker != 0) {
|
||||
if (m_fileOutputWorker != nullptr) {
|
||||
m_fileOutputWorker->setLog2Interpolation(settings.m_log2Interp);
|
||||
}
|
||||
|
||||
@ -351,7 +345,7 @@ void FileOutput::applySettings(const FileOutputSettings& settings, const QList<Q
|
||||
m_settings.m_centerFrequency,
|
||||
m_settings.m_sampleRate,
|
||||
m_settings.m_log2Interp);
|
||||
DSPSignalNotification *notif = new DSPSignalNotification(m_settings.m_sampleRate, m_settings.m_centerFrequency);
|
||||
auto *notif = new DSPSignalNotification((int) m_settings.m_sampleRate, m_settings.m_centerFrequency);
|
||||
m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif);
|
||||
}
|
||||
}
|
||||
@ -461,16 +455,16 @@ void FileOutput::webapiUpdateDeviceSettings(
|
||||
settings.m_reverseAPIAddress = *response.getFileOutputSettings()->getReverseApiAddress();
|
||||
}
|
||||
if (deviceSettingsKeys.contains("reverseAPIPort")) {
|
||||
settings.m_reverseAPIPort = response.getFileOutputSettings()->getReverseApiPort();
|
||||
settings.m_reverseAPIPort = (uint16_t) response.getFileOutputSettings()->getReverseApiPort();
|
||||
}
|
||||
if (deviceSettingsKeys.contains("reverseAPIDeviceIndex")) {
|
||||
settings.m_reverseAPIDeviceIndex = response.getFileOutputSettings()->getReverseApiDeviceIndex();
|
||||
settings.m_reverseAPIDeviceIndex = (uint16_t) response.getFileOutputSettings()->getReverseApiDeviceIndex();
|
||||
}
|
||||
}
|
||||
|
||||
void FileOutput::webapiReverseSendSettings(const QList<QString>& deviceSettingsKeys, const FileOutputSettings& settings, bool force)
|
||||
{
|
||||
SWGSDRangel::SWGDeviceSettings *swgDeviceSettings = new SWGSDRangel::SWGDeviceSettings();
|
||||
auto *swgDeviceSettings = new SWGSDRangel::SWGDeviceSettings();
|
||||
swgDeviceSettings->setDirection(1); // single Tx
|
||||
swgDeviceSettings->setOriginatorIndex(m_deviceAPI->getDeviceSetIndex());
|
||||
swgDeviceSettings->setDeviceHwType(new QString("FileOutput"));
|
||||
@ -499,8 +493,8 @@ void FileOutput::webapiReverseSendSettings(const QList<QString>& deviceSettingsK
|
||||
m_networkRequest.setUrl(QUrl(deviceSettingsURL));
|
||||
m_networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
|
||||
|
||||
QBuffer *buffer = new QBuffer();
|
||||
buffer->open((QBuffer::ReadWrite));
|
||||
auto *buffer = new QBuffer();
|
||||
buffer->open(QBuffer::ReadWrite);
|
||||
buffer->write(swgDeviceSettings->asJson().toUtf8());
|
||||
buffer->seek(0);
|
||||
|
||||
@ -513,7 +507,7 @@ void FileOutput::webapiReverseSendSettings(const QList<QString>& deviceSettingsK
|
||||
|
||||
void FileOutput::webapiReverseSendStartStop(bool start)
|
||||
{
|
||||
SWGSDRangel::SWGDeviceSettings *swgDeviceSettings = new SWGSDRangel::SWGDeviceSettings();
|
||||
auto *swgDeviceSettings = new SWGSDRangel::SWGDeviceSettings();
|
||||
swgDeviceSettings->setDirection(1); // single Tx
|
||||
swgDeviceSettings->setOriginatorIndex(m_deviceAPI->getDeviceSetIndex());
|
||||
swgDeviceSettings->setDeviceHwType(new QString("FileOutput"));
|
||||
@ -525,8 +519,8 @@ void FileOutput::webapiReverseSendStartStop(bool start)
|
||||
m_networkRequest.setUrl(QUrl(deviceSettingsURL));
|
||||
m_networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
|
||||
|
||||
QBuffer *buffer = new QBuffer();
|
||||
buffer->open((QBuffer::ReadWrite));
|
||||
auto *buffer = new QBuffer();
|
||||
buffer->open(QBuffer::ReadWrite);
|
||||
buffer->write(swgDeviceSettings->asJson().toUtf8());
|
||||
buffer->seek(0);
|
||||
QNetworkReply *reply;
|
||||
@ -541,7 +535,7 @@ void FileOutput::webapiReverseSendStartStop(bool start)
|
||||
delete swgDeviceSettings;
|
||||
}
|
||||
|
||||
void FileOutput::networkManagerFinished(QNetworkReply *reply)
|
||||
void FileOutput::networkManagerFinished(QNetworkReply *reply) const
|
||||
{
|
||||
QNetworkReply::NetworkError replyError = reply->error();
|
||||
|
||||
|
@ -76,10 +76,10 @@ public:
|
||||
return new MsgStartStop(startStop);
|
||||
}
|
||||
|
||||
protected:
|
||||
private:
|
||||
bool m_startStop;
|
||||
|
||||
MsgStartStop(bool startStop) :
|
||||
explicit MsgStartStop(bool startStop) :
|
||||
Message(),
|
||||
m_startStop(startStop)
|
||||
{ }
|
||||
@ -99,7 +99,7 @@ public:
|
||||
private:
|
||||
QString m_fileName;
|
||||
|
||||
MsgConfigureFileOutputName(const QString& fileName) :
|
||||
explicit MsgConfigureFileOutputName(const QString& fileName) :
|
||||
Message(),
|
||||
m_fileName(fileName)
|
||||
{ }
|
||||
@ -119,7 +119,7 @@ public:
|
||||
private:
|
||||
bool m_working;
|
||||
|
||||
MsgConfigureFileOutputWork(bool working) :
|
||||
explicit MsgConfigureFileOutputWork(bool working) :
|
||||
Message(),
|
||||
m_working(working)
|
||||
{ }
|
||||
@ -153,10 +153,10 @@ public:
|
||||
return new MsgReportFileOutputGeneration(acquisition);
|
||||
}
|
||||
|
||||
protected:
|
||||
private:
|
||||
bool m_acquisition;
|
||||
|
||||
MsgReportFileOutputGeneration(bool acquisition) :
|
||||
explicit MsgReportFileOutputGeneration(bool acquisition) :
|
||||
Message(),
|
||||
m_acquisition(acquisition)
|
||||
{ }
|
||||
@ -173,54 +173,54 @@ public:
|
||||
return new MsgReportFileOutputStreamTiming(samplesCount);
|
||||
}
|
||||
|
||||
protected:
|
||||
private:
|
||||
std::size_t m_samplesCount;
|
||||
|
||||
MsgReportFileOutputStreamTiming(std::size_t samplesCount) :
|
||||
explicit MsgReportFileOutputStreamTiming(std::size_t samplesCount) :
|
||||
Message(),
|
||||
m_samplesCount(samplesCount)
|
||||
{ }
|
||||
};
|
||||
|
||||
FileOutput(DeviceAPI *deviceAPI);
|
||||
virtual ~FileOutput();
|
||||
virtual void destroy();
|
||||
explicit FileOutput(DeviceAPI *deviceAPI);
|
||||
~FileOutput() final;
|
||||
void destroy() final;
|
||||
|
||||
virtual void init();
|
||||
virtual bool start();
|
||||
virtual void stop();
|
||||
void init() final;
|
||||
bool start() final;
|
||||
void stop() final;
|
||||
|
||||
virtual QByteArray serialize() const;
|
||||
virtual bool deserialize(const QByteArray& data);
|
||||
QByteArray serialize() const final;
|
||||
bool deserialize(const QByteArray& data) final;
|
||||
|
||||
virtual void setMessageQueueToGUI(MessageQueue *queue) { m_guiMessageQueue = queue; }
|
||||
virtual const QString& getDeviceDescription() const;
|
||||
virtual int getSampleRate() const;
|
||||
virtual void setSampleRate(int sampleRate) { (void) sampleRate; }
|
||||
virtual quint64 getCenterFrequency() const;
|
||||
virtual void setCenterFrequency(qint64 centerFrequency);
|
||||
void setMessageQueueToGUI(MessageQueue *queue) final { m_guiMessageQueue = queue; }
|
||||
const QString& getDeviceDescription() const final;
|
||||
int getSampleRate() const final;
|
||||
void setSampleRate(int sampleRate) final { (void) sampleRate; }
|
||||
quint64 getCenterFrequency() const final;
|
||||
void setCenterFrequency(qint64 centerFrequency) final;
|
||||
std::time_t getStartingTimeStamp() const;
|
||||
|
||||
virtual bool handleMessage(const Message& message);
|
||||
bool handleMessage(const Message& message) final;
|
||||
|
||||
virtual int webapiSettingsGet(
|
||||
SWGSDRangel::SWGDeviceSettings& response,
|
||||
QString& errorMessage);
|
||||
int webapiSettingsGet(
|
||||
SWGSDRangel::SWGDeviceSettings& response,
|
||||
QString& errorMessage) final;
|
||||
|
||||
virtual int webapiSettingsPutPatch(
|
||||
bool force,
|
||||
const QStringList& deviceSettingsKeys,
|
||||
SWGSDRangel::SWGDeviceSettings& response, // query + response
|
||||
QString& errorMessage);
|
||||
int webapiSettingsPutPatch(
|
||||
bool force,
|
||||
const QStringList& deviceSettingsKeys,
|
||||
SWGSDRangel::SWGDeviceSettings& response, // query + response
|
||||
QString& errorMessage) final;
|
||||
|
||||
virtual int webapiRunGet(
|
||||
SWGSDRangel::SWGDeviceState& response,
|
||||
QString& errorMessage);
|
||||
int webapiRunGet(
|
||||
SWGSDRangel::SWGDeviceState& response,
|
||||
QString& errorMessage) final;
|
||||
|
||||
virtual int webapiRun(
|
||||
bool run,
|
||||
SWGSDRangel::SWGDeviceState& response,
|
||||
QString& errorMessage);
|
||||
int webapiRun(
|
||||
bool run,
|
||||
SWGSDRangel::SWGDeviceState& response,
|
||||
QString& errorMessage) final;
|
||||
|
||||
static void webapiFormatDeviceSettings(
|
||||
SWGSDRangel::SWGDeviceSettings& response,
|
||||
@ -234,13 +234,13 @@ public:
|
||||
private:
|
||||
DeviceAPI *m_deviceAPI;
|
||||
QMutex m_mutex;
|
||||
bool m_running;
|
||||
bool m_running = false;
|
||||
FileOutputSettings m_settings;
|
||||
std::ofstream m_ofstream;
|
||||
FileOutputWorker* m_fileOutputWorker;
|
||||
FileOutputWorker* m_fileOutputWorker = nullptr;
|
||||
QThread m_fileOutputWorkerThread;
|
||||
QString m_deviceDescription;
|
||||
qint64 m_startingTimeStamp;
|
||||
qint64 m_startingTimeStamp = 0;
|
||||
const QTimer& m_masterTimer;
|
||||
QNetworkAccessManager *m_networkManager;
|
||||
QNetworkRequest m_networkRequest;
|
||||
@ -253,7 +253,7 @@ private:
|
||||
void webapiReverseSendStartStop(bool start);
|
||||
|
||||
private slots:
|
||||
void networkManagerFinished(QNetworkReply *reply);
|
||||
void networkManagerFinished(QNetworkReply *reply) const;
|
||||
};
|
||||
|
||||
#endif // INCLUDE_FILEOUTPUT_H
|
||||
|
@ -84,7 +84,7 @@ RemoteOutput::~RemoteOutput()
|
||||
this,
|
||||
&RemoteOutput::networkManagerFinished
|
||||
);
|
||||
stop();
|
||||
RemoteOutput::stop();
|
||||
delete m_networkManager;
|
||||
}
|
||||
|
||||
@ -211,21 +211,21 @@ bool RemoteOutput::handleMessage(const Message& message)
|
||||
if (MsgConfigureRemoteOutput::match(message))
|
||||
{
|
||||
qDebug() << "RemoteOutput::handleMessage:" << message.getIdentifier();
|
||||
MsgConfigureRemoteOutput& conf = (MsgConfigureRemoteOutput&) message;
|
||||
auto& conf = (const MsgConfigureRemoteOutput&) message;
|
||||
applySettings(conf.getSettings(), conf.getSettingsKeys(), conf.getForce());
|
||||
return true;
|
||||
}
|
||||
else if (MsgConfigureRemoteOutputWork::match(message))
|
||||
{
|
||||
MsgConfigureRemoteOutputWork& conf = (MsgConfigureRemoteOutputWork&) message;
|
||||
auto& conf = (const MsgConfigureRemoteOutputWork&) message;
|
||||
bool working = conf.isWorking();
|
||||
|
||||
if (m_remoteOutputWorker != nullptr)
|
||||
{
|
||||
if (working) {
|
||||
m_remoteOutputWorker->startWork();
|
||||
m_remoteOutputWorker->startWork();
|
||||
} else {
|
||||
m_remoteOutputWorker->stopWork();
|
||||
m_remoteOutputWorker->stopWork();
|
||||
}
|
||||
}
|
||||
|
||||
@ -233,7 +233,7 @@ bool RemoteOutput::handleMessage(const Message& message)
|
||||
}
|
||||
else if (MsgStartStop::match(message))
|
||||
{
|
||||
MsgStartStop& cmd = (MsgStartStop&) message;
|
||||
auto& cmd = (const MsgStartStop&) message;
|
||||
qDebug() << "RemoteOutput::handleMessage: MsgStartStop: " << (cmd.getStartStop() ? "start" : "stop");
|
||||
|
||||
if (cmd.getStartStop())
|
||||
@ -255,13 +255,13 @@ bool RemoteOutput::handleMessage(const Message& message)
|
||||
}
|
||||
else if (MsgConfigureRemoteOutputChunkCorrection::match(message))
|
||||
{
|
||||
MsgConfigureRemoteOutputChunkCorrection& conf = (MsgConfigureRemoteOutputChunkCorrection&) message;
|
||||
auto& conf = (const MsgConfigureRemoteOutputChunkCorrection&) message;
|
||||
|
||||
if (m_remoteOutputWorker != nullptr) {
|
||||
m_remoteOutputWorker->setChunkCorrection(conf.getChunkCorrection());
|
||||
if (m_remoteOutputWorker != nullptr) {
|
||||
m_remoteOutputWorker->setChunkCorrection(conf.getChunkCorrection());
|
||||
}
|
||||
|
||||
return true;
|
||||
return true;
|
||||
}
|
||||
else if (MsgRequestFixedData::match(message))
|
||||
{
|
||||
@ -287,30 +287,23 @@ void RemoteOutput::applySettings(const RemoteOutputSettings& settings, const QLi
|
||||
qDebug() << "RemoteOutput::applySettings: force:" << force << settings.getDebugString(settingsKeys, force);
|
||||
QMutexLocker mutexLocker(&m_mutex);
|
||||
|
||||
if (force ||
|
||||
if ((force ||
|
||||
settingsKeys.contains("dataAddress") ||
|
||||
settingsKeys.contains("dataPort"))
|
||||
settingsKeys.contains("dataPort")) && m_remoteOutputWorker)
|
||||
{
|
||||
if (m_remoteOutputWorker) {
|
||||
m_remoteOutputWorker->setDataAddress(settings.m_dataAddress, settings.m_dataPort);
|
||||
}
|
||||
m_remoteOutputWorker->setDataAddress(settings.m_dataAddress, settings.m_dataPort);
|
||||
}
|
||||
|
||||
if (force || settingsKeys.contains("nbFECBlocks"))
|
||||
if ((force || settingsKeys.contains("nbFECBlocks")) && m_remoteOutputWorker)
|
||||
{
|
||||
if (m_remoteOutputWorker) {
|
||||
m_remoteOutputWorker->setNbBlocksFEC(settings.m_nbFECBlocks);
|
||||
}
|
||||
m_remoteOutputWorker->setNbBlocksFEC(settings.m_nbFECBlocks);
|
||||
}
|
||||
|
||||
if (force || settingsKeys.contains("nbTxBytes"))
|
||||
if ((force || settingsKeys.contains("nbTxBytes")) && m_remoteOutputWorker)
|
||||
{
|
||||
if (m_remoteOutputWorker)
|
||||
{
|
||||
stopWorker();
|
||||
m_remoteOutputWorker->setNbTxBytes(settings.m_nbTxBytes);
|
||||
startWorker();
|
||||
}
|
||||
stopWorker();
|
||||
m_remoteOutputWorker->setNbTxBytes(settings.m_nbTxBytes);
|
||||
startWorker();
|
||||
}
|
||||
|
||||
mutexLocker.unlock();
|
||||
@ -333,7 +326,7 @@ void RemoteOutput::applySettings(const RemoteOutputSettings& settings, const QLi
|
||||
|
||||
void RemoteOutput::applyCenterFrequency()
|
||||
{
|
||||
DSPSignalNotification *notif = new DSPSignalNotification(m_sampleRate, m_centerFrequency);
|
||||
auto *notif = new DSPSignalNotification(m_sampleRate, m_centerFrequency);
|
||||
m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif);
|
||||
}
|
||||
|
||||
@ -344,10 +337,11 @@ void RemoteOutput::applySampleRate()
|
||||
}
|
||||
|
||||
m_tickMultiplier = 480000 / m_sampleRate;
|
||||
m_tickMultiplier = m_tickMultiplier < 1 ? 1 : m_tickMultiplier > 10 ? 10 : m_tickMultiplier;
|
||||
m_tickMultiplier = m_tickMultiplier < 1 ? 1 : m_tickMultiplier;
|
||||
m_tickMultiplier = m_tickMultiplier > 10 ? 10 : m_tickMultiplier;
|
||||
m_greaterTickCount = 0;
|
||||
|
||||
DSPSignalNotification *notif = new DSPSignalNotification(m_sampleRate, m_centerFrequency);
|
||||
auto *notif = new DSPSignalNotification(m_sampleRate, m_centerFrequency);
|
||||
m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif);
|
||||
}
|
||||
|
||||
@ -428,13 +422,13 @@ void RemoteOutput::webapiUpdateDeviceSettings(
|
||||
settings.m_apiAddress = *response.getRemoteOutputSettings()->getApiAddress();
|
||||
}
|
||||
if (deviceSettingsKeys.contains("apiPort")) {
|
||||
settings.m_apiPort = response.getRemoteOutputSettings()->getApiPort();
|
||||
settings.m_apiPort = (quint16) response.getRemoteOutputSettings()->getApiPort();
|
||||
}
|
||||
if (deviceSettingsKeys.contains("dataAddress")) {
|
||||
settings.m_dataAddress = *response.getRemoteOutputSettings()->getDataAddress();
|
||||
}
|
||||
if (deviceSettingsKeys.contains("dataPort")) {
|
||||
settings.m_dataPort = response.getRemoteOutputSettings()->getDataPort();
|
||||
settings.m_dataPort = (quint16) response.getRemoteOutputSettings()->getDataPort();
|
||||
}
|
||||
if (deviceSettingsKeys.contains("deviceIndex")) {
|
||||
settings.m_deviceIndex = response.getRemoteOutputSettings()->getDeviceIndex();
|
||||
@ -449,10 +443,10 @@ void RemoteOutput::webapiUpdateDeviceSettings(
|
||||
settings.m_reverseAPIAddress = *response.getRemoteOutputSettings()->getReverseApiAddress();
|
||||
}
|
||||
if (deviceSettingsKeys.contains("reverseAPIPort")) {
|
||||
settings.m_reverseAPIPort = response.getRemoteOutputSettings()->getReverseApiPort();
|
||||
settings.m_reverseAPIPort = (quint16) response.getRemoteOutputSettings()->getReverseApiPort();
|
||||
}
|
||||
if (deviceSettingsKeys.contains("reverseAPIDeviceIndex")) {
|
||||
settings.m_reverseAPIDeviceIndex = response.getRemoteOutputSettings()->getReverseApiDeviceIndex();
|
||||
settings.m_reverseAPIDeviceIndex = (uint16_t) response.getRemoteOutputSettings()->getReverseApiDeviceIndex();
|
||||
}
|
||||
}
|
||||
|
||||
@ -489,10 +483,10 @@ void RemoteOutput::webapiFormatDeviceSettings(SWGSDRangel::SWGDeviceSettings& re
|
||||
response.getRemoteOutputSettings()->setReverseApiDeviceIndex(settings.m_reverseAPIDeviceIndex);
|
||||
}
|
||||
|
||||
void RemoteOutput::webapiFormatDeviceReport(SWGSDRangel::SWGDeviceReport& response)
|
||||
void RemoteOutput::webapiFormatDeviceReport(SWGSDRangel::SWGDeviceReport& response) const
|
||||
{
|
||||
uint64_t nowus = TimeUtil::nowus();
|
||||
response.getRemoteOutputReport()->setTvSec(nowus / 1000000U);
|
||||
response.getRemoteOutputReport()->setTvSec((qint32) (nowus / 1000000U));
|
||||
response.getRemoteOutputReport()->setTvUSec(nowus % 1000000U);
|
||||
response.getRemoteOutputReport()->setCenterFrequency(m_centerFrequency);
|
||||
response.getRemoteOutputReport()->setSampleRate(m_sampleRate);
|
||||
@ -666,7 +660,7 @@ void RemoteOutput::queueLengthCompensation(
|
||||
|
||||
void RemoteOutput::webapiReverseSendSettings(const QList<QString>& deviceSettingsKeys, const RemoteOutputSettings& settings, bool force)
|
||||
{
|
||||
SWGSDRangel::SWGDeviceSettings *swgDeviceSettings = new SWGSDRangel::SWGDeviceSettings();
|
||||
auto *swgDeviceSettings = new SWGSDRangel::SWGDeviceSettings();
|
||||
swgDeviceSettings->setDirection(1); // single Tx
|
||||
swgDeviceSettings->setOriginatorIndex(m_deviceAPI->getDeviceSetIndex());
|
||||
swgDeviceSettings->setDeviceHwType(new QString("RemoteOutput"));
|
||||
@ -707,8 +701,8 @@ void RemoteOutput::webapiReverseSendSettings(const QList<QString>& deviceSetting
|
||||
m_networkRequest.setUrl(QUrl(deviceSettingsURL));
|
||||
m_networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
|
||||
|
||||
QBuffer *buffer = new QBuffer();
|
||||
buffer->open((QBuffer::ReadWrite));
|
||||
auto *buffer = new QBuffer();
|
||||
buffer->open(QBuffer::ReadWrite);
|
||||
buffer->write(swgDeviceSettings->asJson().toUtf8());
|
||||
buffer->seek(0);
|
||||
|
||||
@ -721,7 +715,7 @@ void RemoteOutput::webapiReverseSendSettings(const QList<QString>& deviceSetting
|
||||
|
||||
void RemoteOutput::webapiReverseSendStartStop(bool start)
|
||||
{
|
||||
SWGSDRangel::SWGDeviceSettings *swgDeviceSettings = new SWGSDRangel::SWGDeviceSettings();
|
||||
auto *swgDeviceSettings = new SWGSDRangel::SWGDeviceSettings();
|
||||
swgDeviceSettings->setDirection(1); // single Tx
|
||||
swgDeviceSettings->setOriginatorIndex(m_deviceAPI->getDeviceSetIndex());
|
||||
swgDeviceSettings->setDeviceHwType(new QString("RemoteOutput"));
|
||||
@ -733,8 +727,8 @@ void RemoteOutput::webapiReverseSendStartStop(bool start)
|
||||
m_networkRequest.setUrl(QUrl(deviceSettingsURL));
|
||||
m_networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
|
||||
|
||||
QBuffer *buffer = new QBuffer();
|
||||
buffer->open((QBuffer::ReadWrite));
|
||||
auto *buffer = new QBuffer();
|
||||
buffer->open(QBuffer::ReadWrite);
|
||||
buffer->write(swgDeviceSettings->asJson().toUtf8());
|
||||
buffer->seek(0);
|
||||
QNetworkReply *reply;
|
||||
|
@ -83,7 +83,7 @@ public:
|
||||
private:
|
||||
bool m_working;
|
||||
|
||||
MsgConfigureRemoteOutputWork(bool working) :
|
||||
explicit MsgConfigureRemoteOutputWork(bool working) :
|
||||
Message(),
|
||||
m_working(working)
|
||||
{ }
|
||||
@ -99,10 +99,10 @@ public:
|
||||
return new MsgStartStop(startStop);
|
||||
}
|
||||
|
||||
protected:
|
||||
private:
|
||||
bool m_startStop;
|
||||
|
||||
MsgStartStop(bool startStop) :
|
||||
explicit MsgStartStop(bool startStop) :
|
||||
Message(),
|
||||
m_startStop(startStop)
|
||||
{ }
|
||||
@ -122,7 +122,7 @@ public:
|
||||
private:
|
||||
int m_chunkCorrection;
|
||||
|
||||
MsgConfigureRemoteOutputChunkCorrection(int chunkCorrection) :
|
||||
explicit MsgConfigureRemoteOutputChunkCorrection(int chunkCorrection) :
|
||||
Message(),
|
||||
m_chunkCorrection(chunkCorrection)
|
||||
{ }
|
||||
@ -153,7 +153,7 @@ public:
|
||||
private:
|
||||
RemoteData m_remoteData;
|
||||
|
||||
MsgReportRemoteData(const RemoteData& remoteData) :
|
||||
explicit MsgReportRemoteData(const RemoteData& remoteData) :
|
||||
Message(),
|
||||
m_remoteData(remoteData)
|
||||
{}
|
||||
@ -182,7 +182,7 @@ public:
|
||||
private:
|
||||
RemoteData m_remoteData;
|
||||
|
||||
MsgReportRemoteFixedData(const RemoteData& remoteData) :
|
||||
explicit MsgReportRemoteFixedData(const RemoteData& remoteData) :
|
||||
Message(),
|
||||
m_remoteData(remoteData)
|
||||
{}
|
||||
@ -203,58 +203,58 @@ public:
|
||||
};
|
||||
|
||||
|
||||
RemoteOutput(DeviceAPI *deviceAPI);
|
||||
virtual ~RemoteOutput();
|
||||
virtual void destroy();
|
||||
explicit RemoteOutput(DeviceAPI *deviceAPI);
|
||||
~RemoteOutput() final;
|
||||
void destroy() final;
|
||||
|
||||
virtual void init();
|
||||
virtual bool start();
|
||||
virtual void stop();
|
||||
void init() final;
|
||||
bool start() final;
|
||||
void stop() final;
|
||||
|
||||
virtual QByteArray serialize() const;
|
||||
virtual bool deserialize(const QByteArray& data);
|
||||
QByteArray serialize() const final;
|
||||
bool deserialize(const QByteArray& data) final;
|
||||
|
||||
virtual void setMessageQueueToGUI(MessageQueue *queue) { m_guiMessageQueue = queue; }
|
||||
virtual const QString& getDeviceDescription() const;
|
||||
virtual int getSampleRate() const;
|
||||
virtual void setSampleRate(int sampleRate) { (void) sampleRate; }
|
||||
virtual quint64 getCenterFrequency() const;
|
||||
virtual void setCenterFrequency(qint64 centerFrequency) { (void) centerFrequency; }
|
||||
void setMessageQueueToGUI(MessageQueue *queue) final { m_guiMessageQueue = queue; }
|
||||
const QString& getDeviceDescription() const final;
|
||||
int getSampleRate() const final;
|
||||
void setSampleRate(int sampleRate) final { (void) sampleRate; }
|
||||
quint64 getCenterFrequency() const final;
|
||||
void setCenterFrequency(qint64 centerFrequency) final { (void) centerFrequency; }
|
||||
std::time_t getStartingTimeStamp() const;
|
||||
|
||||
virtual bool handleMessage(const Message& message);
|
||||
bool handleMessage(const Message& message) final;
|
||||
|
||||
virtual int webapiSettingsGet(
|
||||
SWGSDRangel::SWGDeviceSettings& response,
|
||||
QString& errorMessage);
|
||||
int webapiSettingsGet(
|
||||
SWGSDRangel::SWGDeviceSettings& response,
|
||||
QString& errorMessage) final;
|
||||
|
||||
virtual int webapiSettingsPutPatch(
|
||||
bool force,
|
||||
const QStringList& deviceSettingsKeys,
|
||||
SWGSDRangel::SWGDeviceSettings& response, // query + response
|
||||
QString& errorMessage);
|
||||
int webapiSettingsPutPatch(
|
||||
bool force,
|
||||
const QStringList& deviceSettingsKeys,
|
||||
SWGSDRangel::SWGDeviceSettings& response, // query + response
|
||||
QString& errorMessage) final;
|
||||
|
||||
virtual int webapiReportGet(
|
||||
SWGSDRangel::SWGDeviceReport& response,
|
||||
QString& errorMessage);
|
||||
int webapiReportGet(
|
||||
SWGSDRangel::SWGDeviceReport& response,
|
||||
QString& errorMessage) final;
|
||||
|
||||
virtual int webapiRunGet(
|
||||
SWGSDRangel::SWGDeviceState& response,
|
||||
QString& errorMessage);
|
||||
int webapiRunGet(
|
||||
SWGSDRangel::SWGDeviceState& response,
|
||||
QString& errorMessage) final;
|
||||
|
||||
virtual int webapiRun(
|
||||
bool run,
|
||||
SWGSDRangel::SWGDeviceState& response,
|
||||
QString& errorMessage);
|
||||
int webapiRun(
|
||||
bool run,
|
||||
SWGSDRangel::SWGDeviceState& response,
|
||||
QString& errorMessage) final;
|
||||
|
||||
static void webapiFormatDeviceSettings(
|
||||
SWGSDRangel::SWGDeviceSettings& response,
|
||||
const RemoteOutputSettings& settings);
|
||||
SWGSDRangel::SWGDeviceSettings& response,
|
||||
const RemoteOutputSettings& settings);
|
||||
|
||||
static void webapiUpdateDeviceSettings(
|
||||
RemoteOutputSettings& settings,
|
||||
const QStringList& deviceSettingsKeys,
|
||||
SWGSDRangel::SWGDeviceSettings& response);
|
||||
RemoteOutputSettings& settings,
|
||||
const QStringList& deviceSettingsKeys,
|
||||
SWGSDRangel::SWGDeviceSettings& response);
|
||||
|
||||
private:
|
||||
DeviceAPI *m_deviceAPI;
|
||||
@ -284,7 +284,7 @@ private:
|
||||
void applySettings(const RemoteOutputSettings& settings, const QList<QString>& settingsKeys, bool force = false);
|
||||
void applyCenterFrequency();
|
||||
void applySampleRate();
|
||||
void webapiFormatDeviceReport(SWGSDRangel::SWGDeviceReport& response);
|
||||
void webapiFormatDeviceReport(SWGSDRangel::SWGDeviceReport& response) const;
|
||||
|
||||
void analyzeApiReply(const QJsonObject& jsonObject, const QString& answer);
|
||||
void queueLengthCompensation(
|
||||
|
@ -40,7 +40,7 @@ MESSAGE_CLASS_DEFINITION(Bladerf1Input::MsgStartStop, Message)
|
||||
Bladerf1Input::Bladerf1Input(DeviceAPI *deviceAPI) :
|
||||
m_deviceAPI(deviceAPI),
|
||||
m_settings(),
|
||||
m_dev(0),
|
||||
m_dev(nullptr),
|
||||
m_bladerfThread(nullptr),
|
||||
m_deviceDescription("BladeRFInput"),
|
||||
m_running(false)
|
||||
@ -70,11 +70,11 @@ Bladerf1Input::~Bladerf1Input()
|
||||
delete m_networkManager;
|
||||
|
||||
if (m_running) {
|
||||
stop();
|
||||
Bladerf1Input::stop();
|
||||
}
|
||||
|
||||
closeDevice();
|
||||
m_deviceAPI->setBuddySharedPtr(0);
|
||||
m_deviceAPI->setBuddySharedPtr(nullptr);
|
||||
}
|
||||
|
||||
void Bladerf1Input::destroy()
|
||||
@ -84,7 +84,7 @@ void Bladerf1Input::destroy()
|
||||
|
||||
bool Bladerf1Input::openDevice()
|
||||
{
|
||||
if (m_dev != 0)
|
||||
if (m_dev != nullptr)
|
||||
{
|
||||
closeDevice();
|
||||
}
|
||||
@ -97,24 +97,24 @@ bool Bladerf1Input::openDevice()
|
||||
return false;
|
||||
}
|
||||
|
||||
if (m_deviceAPI->getSinkBuddies().size() > 0)
|
||||
if (!m_deviceAPI->getSinkBuddies().empty())
|
||||
{
|
||||
DeviceAPI *sinkBuddy = m_deviceAPI->getSinkBuddies()[0];
|
||||
DeviceBladeRF1Params *buddySharedParams = (DeviceBladeRF1Params *) sinkBuddy->getBuddySharedPtr();
|
||||
const DeviceAPI *sinkBuddy = m_deviceAPI->getSinkBuddies()[0];
|
||||
const DeviceBladeRF1Params *buddySharedParams = (DeviceBladeRF1Params *) sinkBuddy->getBuddySharedPtr();
|
||||
|
||||
if (buddySharedParams == 0)
|
||||
if (buddySharedParams == nullptr)
|
||||
{
|
||||
qCritical("BladerfInput::openDevice: could not get shared parameters from buddy");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (buddySharedParams->m_dev == 0) // device is not opened by buddy
|
||||
if (buddySharedParams->m_dev == nullptr) // device is not opened by buddy
|
||||
{
|
||||
qCritical("BladerfInput::openDevice: could not get BladeRF handle from buddy");
|
||||
return false;
|
||||
}
|
||||
|
||||
m_sharedParams = *(buddySharedParams); // copy parameters from buddy
|
||||
m_sharedParams = *buddySharedParams; // copy parameters from buddy
|
||||
m_dev = m_sharedParams.m_dev; // get BladeRF handle
|
||||
}
|
||||
else
|
||||
@ -128,7 +128,6 @@ bool Bladerf1Input::openDevice()
|
||||
m_sharedParams.m_dev = m_dev;
|
||||
}
|
||||
|
||||
// TODO: adjust USB transfer data according to sample rate
|
||||
if ((res = bladerf_sync_config(m_dev, BLADERF_RX_X1, BLADERF_FORMAT_SC16_Q11, 64, 8192, 32, 10000)) < 0)
|
||||
{
|
||||
qCritical("BladerfInput::start: bladerf_sync_config with return code %d", res);
|
||||
@ -182,7 +181,7 @@ void Bladerf1Input::closeDevice()
|
||||
{
|
||||
int res;
|
||||
|
||||
if (m_dev == 0) { // was never open
|
||||
if (m_dev == nullptr) { // was never open
|
||||
return;
|
||||
}
|
||||
|
||||
@ -191,7 +190,7 @@ void Bladerf1Input::closeDevice()
|
||||
qCritical("BladerfInput::stop: bladerf_enable_module with return code %d", res);
|
||||
}
|
||||
|
||||
if (m_deviceAPI->getSinkBuddies().size() == 0)
|
||||
if (m_deviceAPI->getSinkBuddies().empty())
|
||||
{
|
||||
qDebug("BladerfInput::closeDevice: closing device since Tx side is not open");
|
||||
|
||||
@ -286,7 +285,7 @@ bool Bladerf1Input::handleMessage(const Message& message)
|
||||
{
|
||||
if (MsgConfigureBladerf1::match(message))
|
||||
{
|
||||
MsgConfigureBladerf1& conf = (MsgConfigureBladerf1&) message;
|
||||
auto& conf = (const MsgConfigureBladerf1&) message;
|
||||
qDebug() << "Bladerf1Input::handleMessage: MsgConfigureBladerf1";
|
||||
|
||||
if (!applySettings(conf.getSettings(), conf.getSettingsKeys(), conf.getForce())) {
|
||||
@ -297,7 +296,7 @@ bool Bladerf1Input::handleMessage(const Message& message)
|
||||
}
|
||||
else if (MsgStartStop::match(message))
|
||||
{
|
||||
MsgStartStop& cmd = (MsgStartStop&) message;
|
||||
auto& cmd = (const MsgStartStop&) message;
|
||||
qDebug() << "BladerfInput::handleMessage: MsgStartStop: " << (cmd.getStartStop() ? "start" : "stop");
|
||||
|
||||
if (cmd.getStartStop())
|
||||
@ -326,126 +325,107 @@ bool Bladerf1Input::handleMessage(const Message& message)
|
||||
bool Bladerf1Input::applySettings(const BladeRF1InputSettings& settings, const QList<QString>& settingsKeys, bool force)
|
||||
{
|
||||
bool forwardChange = false;
|
||||
// QMutexLocker mutexLocker(&m_mutex);
|
||||
|
||||
qDebug() << "BladerfInput::applySettings: force: " << force << settings.getDebugString(settingsKeys, force);
|
||||
|
||||
if ((settingsKeys.contains("dcBlock")) ||
|
||||
settingsKeys.contains("iqCorrection") || force)
|
||||
settingsKeys.contains("iqCorrection") || force)
|
||||
{
|
||||
m_deviceAPI->configureCorrections(settings.m_dcBlock, settings.m_iqCorrection);
|
||||
}
|
||||
|
||||
if (settingsKeys.contains("lnaGain") || force)
|
||||
if ((m_dev != nullptr) && (settingsKeys.contains("lnaGain") || force))
|
||||
{
|
||||
if (m_dev != 0)
|
||||
{
|
||||
if(bladerf_set_lna_gain(m_dev, getLnaGain(settings.m_lnaGain)) != 0) {
|
||||
qDebug("BladerfInput::applySettings: bladerf_set_lna_gain() failed");
|
||||
} else {
|
||||
qDebug() << "BladerfInput::applySettings: LNA gain set to " << getLnaGain(settings.m_lnaGain);
|
||||
}
|
||||
}
|
||||
if(bladerf_set_lna_gain(m_dev, getLnaGain(settings.m_lnaGain)) != 0) {
|
||||
qDebug("BladerfInput::applySettings: bladerf_set_lna_gain() failed");
|
||||
} else {
|
||||
qDebug() << "BladerfInput::applySettings: LNA gain set to " << getLnaGain(settings.m_lnaGain);
|
||||
}
|
||||
}
|
||||
|
||||
if (settingsKeys.contains("vga1") || force)
|
||||
if ((m_dev != nullptr) && (settingsKeys.contains("vga1") || force))
|
||||
{
|
||||
if (m_dev != 0)
|
||||
{
|
||||
if(bladerf_set_rxvga1(m_dev, settings.m_vga1) != 0) {
|
||||
qDebug("BladerfInput::applySettings: bladerf_set_rxvga1() failed");
|
||||
} else {
|
||||
qDebug() << "BladerfInput::applySettings: VGA1 gain set to " << settings.m_vga1;
|
||||
}
|
||||
}
|
||||
if(bladerf_set_rxvga1(m_dev, settings.m_vga1) != 0) {
|
||||
qDebug("BladerfInput::applySettings: bladerf_set_rxvga1() failed");
|
||||
} else {
|
||||
qDebug() << "BladerfInput::applySettings: VGA1 gain set to " << settings.m_vga1;
|
||||
}
|
||||
}
|
||||
|
||||
if (settingsKeys.contains("vga2") || force)
|
||||
if ((m_dev != nullptr) && (settingsKeys.contains("vga2") || force))
|
||||
{
|
||||
if(m_dev != 0)
|
||||
{
|
||||
if(bladerf_set_rxvga2(m_dev, settings.m_vga2) != 0) {
|
||||
qDebug("BladerfInput::applySettings: bladerf_set_rxvga2() failed");
|
||||
} else {
|
||||
qDebug() << "BladerfInput::applySettings: VGA2 gain set to " << settings.m_vga2;
|
||||
}
|
||||
}
|
||||
if(bladerf_set_rxvga2(m_dev, settings.m_vga2) != 0) {
|
||||
qDebug("BladerfInput::applySettings: bladerf_set_rxvga2() failed");
|
||||
} else {
|
||||
qDebug() << "BladerfInput::applySettings: VGA2 gain set to " << settings.m_vga2;
|
||||
}
|
||||
}
|
||||
|
||||
if (settingsKeys.contains("xb200") || force)
|
||||
if ((m_dev != nullptr) && (settingsKeys.contains("xb200") || force))
|
||||
{
|
||||
if (m_dev != 0)
|
||||
{
|
||||
bool changeSettings;
|
||||
bool changeSettings;
|
||||
|
||||
if (m_deviceAPI->getSinkBuddies().size() > 0)
|
||||
{
|
||||
DeviceAPI *buddy = m_deviceAPI->getSinkBuddies()[0];
|
||||
if (!m_deviceAPI->getSinkBuddies().empty())
|
||||
{
|
||||
DeviceAPI *buddy = m_deviceAPI->getSinkBuddies()[0];
|
||||
|
||||
if (buddy->getDeviceSinkEngine()->state() == DSPDeviceSinkEngine::StRunning) { // Tx side running
|
||||
changeSettings = false;
|
||||
} else {
|
||||
changeSettings = true;
|
||||
}
|
||||
}
|
||||
else // No Tx open
|
||||
{
|
||||
if (buddy->getDeviceSinkEngine()->state() == DSPDeviceSinkEngine::State::StRunning) { // Tx side running
|
||||
changeSettings = false;
|
||||
} else {
|
||||
changeSettings = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else // No Tx open
|
||||
{
|
||||
changeSettings = true;
|
||||
}
|
||||
|
||||
if (changeSettings)
|
||||
{
|
||||
if (settings.m_xb200)
|
||||
{
|
||||
if (bladerf_expansion_attach(m_dev, BLADERF_XB_200) != 0) {
|
||||
qDebug("BladerfInput::applySettings: bladerf_expansion_attach(xb200) failed");
|
||||
} else {
|
||||
qDebug() << "BladerfInput::applySettings: Attach XB200";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (bladerf_expansion_attach(m_dev, BLADERF_XB_NONE) != 0) {
|
||||
qDebug("BladerfInput::applySettings: bladerf_expansion_attach(none) failed");
|
||||
} else {
|
||||
qDebug() << "BladerfInput::applySettings: Detach XB200";
|
||||
}
|
||||
}
|
||||
if (changeSettings)
|
||||
{
|
||||
if (settings.m_xb200)
|
||||
{
|
||||
if (bladerf_expansion_attach(m_dev, BLADERF_XB_200) != 0) {
|
||||
qDebug("BladerfInput::applySettings: bladerf_expansion_attach(xb200) failed");
|
||||
} else {
|
||||
qDebug() << "BladerfInput::applySettings: Attach XB200";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (bladerf_expansion_attach(m_dev, BLADERF_XB_NONE) != 0) {
|
||||
qDebug("BladerfInput::applySettings: bladerf_expansion_attach(none) failed");
|
||||
} else {
|
||||
qDebug() << "BladerfInput::applySettings: Detach XB200";
|
||||
}
|
||||
}
|
||||
|
||||
m_sharedParams.m_xb200Attached = settings.m_xb200;
|
||||
}
|
||||
}
|
||||
m_sharedParams.m_xb200Attached = settings.m_xb200;
|
||||
}
|
||||
}
|
||||
|
||||
if (settingsKeys.contains("xb200Path") || force)
|
||||
if ((m_dev != nullptr) && (settingsKeys.contains("xb200Path") || force))
|
||||
{
|
||||
if (m_dev != 0)
|
||||
{
|
||||
if(bladerf_xb200_set_path(m_dev, BLADERF_MODULE_RX, settings.m_xb200Path) != 0) {
|
||||
qDebug("BladerfInput::applySettings: bladerf_xb200_set_path(BLADERF_MODULE_RX) failed");
|
||||
} else {
|
||||
qDebug() << "BladerfInput::applySettings: set xb200 path to " << settings.m_xb200Path;
|
||||
}
|
||||
}
|
||||
if(bladerf_xb200_set_path(m_dev, BLADERF_MODULE_RX, settings.m_xb200Path) != 0) {
|
||||
qDebug("BladerfInput::applySettings: bladerf_xb200_set_path(BLADERF_MODULE_RX) failed");
|
||||
} else {
|
||||
qDebug() << "BladerfInput::applySettings: set xb200 path to " << settings.m_xb200Path;
|
||||
}
|
||||
}
|
||||
|
||||
if (settingsKeys.contains("xb200Filter") || force)
|
||||
if ((m_dev != nullptr) && (settingsKeys.contains("xb200Filter") || force))
|
||||
{
|
||||
if (m_dev != 0)
|
||||
{
|
||||
if(bladerf_xb200_set_filterbank(m_dev, BLADERF_MODULE_RX, settings.m_xb200Filter) != 0) {
|
||||
qDebug("BladerfInput::applySettings: bladerf_xb200_set_filterbank(BLADERF_MODULE_RX) failed");
|
||||
} else {
|
||||
qDebug() << "BladerfInput::applySettings: set xb200 filter to " << settings.m_xb200Filter;
|
||||
}
|
||||
}
|
||||
if(bladerf_xb200_set_filterbank(m_dev, BLADERF_MODULE_RX, settings.m_xb200Filter) != 0) {
|
||||
qDebug("BladerfInput::applySettings: bladerf_xb200_set_filterbank(BLADERF_MODULE_RX) failed");
|
||||
} else {
|
||||
qDebug() << "BladerfInput::applySettings: set xb200 filter to " << settings.m_xb200Filter;
|
||||
}
|
||||
}
|
||||
|
||||
if (settingsKeys.contains("devSampleRate") || force)
|
||||
{
|
||||
forwardChange = true;
|
||||
|
||||
if (m_dev != 0)
|
||||
if (m_dev != nullptr)
|
||||
{
|
||||
unsigned int actualSamplerate;
|
||||
|
||||
@ -457,27 +437,21 @@ bool Bladerf1Input::applySettings(const BladeRF1InputSettings& settings, const Q
|
||||
}
|
||||
}
|
||||
|
||||
if (settingsKeys.contains("bandwidth") || force)
|
||||
if ((m_dev != nullptr) && (settingsKeys.contains("bandwidth") || force))
|
||||
{
|
||||
if(m_dev != 0)
|
||||
{
|
||||
unsigned int actualBandwidth;
|
||||
unsigned int actualBandwidth;
|
||||
|
||||
if( bladerf_set_bandwidth(m_dev, BLADERF_MODULE_RX, settings.m_bandwidth, &actualBandwidth) < 0) {
|
||||
qCritical("BladerfInput::applySettings: could not set bandwidth: %d", settings.m_bandwidth);
|
||||
} else {
|
||||
qDebug() << "BladerfInput::applySettings: bladerf_set_bandwidth(BLADERF_MODULE_RX) actual bandwidth is " << actualBandwidth;
|
||||
}
|
||||
}
|
||||
if( bladerf_set_bandwidth(m_dev, BLADERF_MODULE_RX, settings.m_bandwidth, &actualBandwidth) < 0) {
|
||||
qCritical("BladerfInput::applySettings: could not set bandwidth: %d", settings.m_bandwidth);
|
||||
} else {
|
||||
qDebug() << "BladerfInput::applySettings: bladerf_set_bandwidth(BLADERF_MODULE_RX) actual bandwidth is " << actualBandwidth;
|
||||
}
|
||||
}
|
||||
|
||||
if (settingsKeys.contains("fcPos") || force)
|
||||
if (m_bladerfThread && (settingsKeys.contains("fcPos") || force))
|
||||
{
|
||||
if (m_bladerfThread)
|
||||
{
|
||||
m_bladerfThread->setFcPos((int) settings.m_fcPos);
|
||||
qDebug() << "BladerfInput::applySettings: set fc pos (enum) to " << (int) settings.m_fcPos;
|
||||
}
|
||||
m_bladerfThread->setFcPos((int) settings.m_fcPos);
|
||||
qDebug() << "BladerfInput::applySettings: set fc pos (enum) to " << (int) settings.m_fcPos;
|
||||
}
|
||||
|
||||
if (settingsKeys.contains("log2Decim") || force)
|
||||
@ -491,11 +465,9 @@ bool Bladerf1Input::applySettings(const BladeRF1InputSettings& settings, const Q
|
||||
}
|
||||
}
|
||||
|
||||
if (settingsKeys.contains("iqOrder") || force)
|
||||
if (m_bladerfThread && (settingsKeys.contains("iqOrder") || force))
|
||||
{
|
||||
if (m_bladerfThread) {
|
||||
m_bladerfThread->setIQOrder(settings.m_iqOrder);
|
||||
}
|
||||
m_bladerfThread->setIQOrder(settings.m_iqOrder);
|
||||
}
|
||||
|
||||
if (settingsKeys.contains("centerFrequency")
|
||||
@ -514,7 +486,7 @@ bool Bladerf1Input::applySettings(const BladeRF1InputSettings& settings, const Q
|
||||
|
||||
forwardChange = true;
|
||||
|
||||
if (m_dev != 0)
|
||||
if (m_dev != nullptr)
|
||||
{
|
||||
if (bladerf_set_frequency( m_dev, BLADERF_MODULE_RX, deviceCenterFrequency ) != 0) {
|
||||
qWarning("BladerfInput::applySettings: bladerf_set_frequency(%lld) failed", settings.m_centerFrequency);
|
||||
@ -527,7 +499,7 @@ bool Bladerf1Input::applySettings(const BladeRF1InputSettings& settings, const Q
|
||||
if (forwardChange)
|
||||
{
|
||||
int sampleRate = settings.m_devSampleRate/(1<<settings.m_log2Decim);
|
||||
DSPSignalNotification *notif = new DSPSignalNotification(sampleRate, settings.m_centerFrequency);
|
||||
auto *notif = new DSPSignalNotification(sampleRate, settings.m_centerFrequency);
|
||||
m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif);
|
||||
}
|
||||
|
||||
@ -549,7 +521,7 @@ bool Bladerf1Input::applySettings(const BladeRF1InputSettings& settings, const Q
|
||||
return true;
|
||||
}
|
||||
|
||||
bladerf_lna_gain Bladerf1Input::getLnaGain(int lnaGain)
|
||||
bladerf_lna_gain Bladerf1Input::getLnaGain(int lnaGain) const
|
||||
{
|
||||
if (lnaGain == 2) {
|
||||
return BLADERF_LNA_GAIN_MAX;
|
||||
@ -656,7 +628,7 @@ void Bladerf1Input::webapiUpdateDeviceSettings(
|
||||
settings.m_fcPos = static_cast<BladeRF1InputSettings::fcPos_t>(response.getBladeRf1InputSettings()->getFcPos());
|
||||
}
|
||||
if (deviceSettingsKeys.contains("xb200")) {
|
||||
settings.m_xb200 = response.getBladeRf1InputSettings()->getXb200() == 0 ? 0 : 1;
|
||||
settings.m_xb200 = response.getBladeRf1InputSettings()->getXb200() == 0 ? false : true;
|
||||
}
|
||||
if (deviceSettingsKeys.contains("xb200Path")) {
|
||||
settings.m_xb200Path = static_cast<bladerf_xb200_path>(response.getBladeRf1InputSettings()->getXb200Path());
|
||||
@ -677,10 +649,10 @@ void Bladerf1Input::webapiUpdateDeviceSettings(
|
||||
settings.m_reverseAPIAddress = *response.getBladeRf1InputSettings()->getReverseApiAddress();
|
||||
}
|
||||
if (deviceSettingsKeys.contains("reverseAPIPort")) {
|
||||
settings.m_reverseAPIPort = response.getBladeRf1InputSettings()->getReverseApiPort();
|
||||
settings.m_reverseAPIPort = (uint16_t) response.getBladeRf1InputSettings()->getReverseApiPort();
|
||||
}
|
||||
if (deviceSettingsKeys.contains("reverseAPIDeviceIndex")) {
|
||||
settings.m_reverseAPIDeviceIndex = response.getBladeRf1InputSettings()->getReverseApiDeviceIndex();
|
||||
settings.m_reverseAPIDeviceIndex = (uint16_t) response.getBladeRf1InputSettings()->getReverseApiDeviceIndex();
|
||||
}
|
||||
}
|
||||
|
||||
@ -714,7 +686,7 @@ int Bladerf1Input::webapiRun(
|
||||
|
||||
void Bladerf1Input::webapiReverseSendSettings(const QList<QString>& deviceSettingsKeys, const BladeRF1InputSettings& settings, bool force)
|
||||
{
|
||||
SWGSDRangel::SWGDeviceSettings *swgDeviceSettings = new SWGSDRangel::SWGDeviceSettings();
|
||||
auto *swgDeviceSettings = new SWGSDRangel::SWGDeviceSettings();
|
||||
swgDeviceSettings->setDirection(0); // single Rx
|
||||
swgDeviceSettings->setOriginatorIndex(m_deviceAPI->getDeviceSetIndex());
|
||||
swgDeviceSettings->setDeviceHwType(new QString("BladeRF1"));
|
||||
@ -773,8 +745,8 @@ void Bladerf1Input::webapiReverseSendSettings(const QList<QString>& deviceSettin
|
||||
m_networkRequest.setUrl(QUrl(deviceSettingsURL));
|
||||
m_networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
|
||||
|
||||
QBuffer *buffer = new QBuffer();
|
||||
buffer->open((QBuffer::ReadWrite));
|
||||
auto *buffer = new QBuffer();
|
||||
buffer->open(QBuffer::ReadWrite);
|
||||
buffer->write(swgDeviceSettings->asJson().toUtf8());
|
||||
buffer->seek(0);
|
||||
|
||||
@ -787,7 +759,7 @@ void Bladerf1Input::webapiReverseSendSettings(const QList<QString>& deviceSettin
|
||||
|
||||
void Bladerf1Input::webapiReverseSendStartStop(bool start)
|
||||
{
|
||||
SWGSDRangel::SWGDeviceSettings *swgDeviceSettings = new SWGSDRangel::SWGDeviceSettings();
|
||||
auto *swgDeviceSettings = new SWGSDRangel::SWGDeviceSettings();
|
||||
swgDeviceSettings->setDirection(0); // single Rx
|
||||
swgDeviceSettings->setOriginatorIndex(m_deviceAPI->getDeviceSetIndex());
|
||||
swgDeviceSettings->setDeviceHwType(new QString("BladeRF1"));
|
||||
@ -799,8 +771,8 @@ void Bladerf1Input::webapiReverseSendStartStop(bool start)
|
||||
m_networkRequest.setUrl(QUrl(deviceSettingsURL));
|
||||
m_networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
|
||||
|
||||
QBuffer *buffer = new QBuffer();
|
||||
buffer->open((QBuffer::ReadWrite));
|
||||
auto *buffer = new QBuffer();
|
||||
buffer->open(QBuffer::ReadWrite);
|
||||
buffer->write(swgDeviceSettings->asJson().toUtf8());
|
||||
buffer->seek(0);
|
||||
QNetworkReply *reply;
|
||||
@ -815,7 +787,7 @@ void Bladerf1Input::webapiReverseSendStartStop(bool start)
|
||||
delete swgDeviceSettings;
|
||||
}
|
||||
|
||||
void Bladerf1Input::networkManagerFinished(QNetworkReply *reply)
|
||||
void Bladerf1Input::networkManagerFinished(QNetworkReply *reply) const
|
||||
{
|
||||
QNetworkReply::NetworkError replyError = reply->error();
|
||||
|
||||
|
@ -76,62 +76,62 @@ public:
|
||||
return new MsgStartStop(startStop);
|
||||
}
|
||||
|
||||
protected:
|
||||
private:
|
||||
bool m_startStop;
|
||||
|
||||
MsgStartStop(bool startStop) :
|
||||
explicit MsgStartStop(bool startStop) :
|
||||
Message(),
|
||||
m_startStop(startStop)
|
||||
{ }
|
||||
};
|
||||
|
||||
Bladerf1Input(DeviceAPI *deviceAPI);
|
||||
virtual ~Bladerf1Input();
|
||||
virtual void destroy();
|
||||
explicit Bladerf1Input(DeviceAPI *deviceAPI);
|
||||
~Bladerf1Input() final;
|
||||
void destroy() final;
|
||||
|
||||
virtual void init();
|
||||
virtual bool start();
|
||||
virtual void stop();
|
||||
void init() final;
|
||||
bool start() final;
|
||||
void stop() final;
|
||||
|
||||
virtual QByteArray serialize() const;
|
||||
virtual bool deserialize(const QByteArray& data);
|
||||
QByteArray serialize() const final;
|
||||
bool deserialize(const QByteArray& data) final;
|
||||
|
||||
virtual void setMessageQueueToGUI(MessageQueue *queue) { m_guiMessageQueue = queue; }
|
||||
virtual const QString& getDeviceDescription() const;
|
||||
virtual int getSampleRate() const;
|
||||
virtual void setSampleRate(int sampleRate) { (void) sampleRate; }
|
||||
virtual quint64 getCenterFrequency() const;
|
||||
virtual void setCenterFrequency(qint64 centerFrequency);
|
||||
void setMessageQueueToGUI(MessageQueue *queue) final { m_guiMessageQueue = queue; }
|
||||
const QString& getDeviceDescription() const final;
|
||||
int getSampleRate() const final;
|
||||
void setSampleRate(int sampleRate) final { (void) sampleRate; }
|
||||
quint64 getCenterFrequency() const final;
|
||||
void setCenterFrequency(qint64 centerFrequency) final;
|
||||
|
||||
virtual bool handleMessage(const Message& message);
|
||||
bool handleMessage(const Message& message) final;
|
||||
|
||||
virtual int webapiSettingsGet(
|
||||
SWGSDRangel::SWGDeviceSettings& response,
|
||||
QString& errorMessage);
|
||||
int webapiSettingsGet(
|
||||
SWGSDRangel::SWGDeviceSettings& response,
|
||||
QString& errorMessage) final;
|
||||
|
||||
virtual int webapiSettingsPutPatch(
|
||||
bool force,
|
||||
const QStringList& deviceSettingsKeys,
|
||||
SWGSDRangel::SWGDeviceSettings& response, // query + response
|
||||
QString& errorMessage);
|
||||
int webapiSettingsPutPatch(
|
||||
bool force,
|
||||
const QStringList& deviceSettingsKeys,
|
||||
SWGSDRangel::SWGDeviceSettings& response, // query + response
|
||||
QString& errorMessage) final;
|
||||
|
||||
virtual int webapiRunGet(
|
||||
SWGSDRangel::SWGDeviceState& response,
|
||||
QString& errorMessage);
|
||||
int webapiRunGet(
|
||||
SWGSDRangel::SWGDeviceState& response,
|
||||
QString& errorMessage) final;
|
||||
|
||||
virtual int webapiRun(
|
||||
bool run,
|
||||
SWGSDRangel::SWGDeviceState& response,
|
||||
QString& errorMessage);
|
||||
int webapiRun(
|
||||
bool run,
|
||||
SWGSDRangel::SWGDeviceState& response,
|
||||
QString& errorMessage) final;
|
||||
|
||||
static void webapiFormatDeviceSettings(
|
||||
SWGSDRangel::SWGDeviceSettings& response,
|
||||
const BladeRF1InputSettings& settings);
|
||||
SWGSDRangel::SWGDeviceSettings& response,
|
||||
const BladeRF1InputSettings& settings);
|
||||
|
||||
static void webapiUpdateDeviceSettings(
|
||||
BladeRF1InputSettings& settings,
|
||||
const QStringList& deviceSettingsKeys,
|
||||
SWGSDRangel::SWGDeviceSettings& response);
|
||||
BladeRF1InputSettings& settings,
|
||||
const QStringList& deviceSettingsKeys,
|
||||
SWGSDRangel::SWGDeviceSettings& response);
|
||||
|
||||
private:
|
||||
DeviceAPI *m_deviceAPI;
|
||||
@ -148,12 +148,12 @@ private:
|
||||
bool openDevice();
|
||||
void closeDevice();
|
||||
bool applySettings(const BladeRF1InputSettings& settings, const QList<QString>& settingsKeys, bool force);
|
||||
bladerf_lna_gain getLnaGain(int lnaGain);
|
||||
bladerf_lna_gain getLnaGain(int lnaGain) const;
|
||||
void webapiReverseSendSettings(const QList<QString>& deviceSettingsKeys, const BladeRF1InputSettings& settings, bool force);
|
||||
void webapiReverseSendStartStop(bool start);
|
||||
|
||||
private slots:
|
||||
void networkManagerFinished(QNetworkReply *reply);
|
||||
void networkManagerFinished(QNetworkReply *reply) const;
|
||||
};
|
||||
|
||||
#endif // INCLUDE_BLADERFINPUT_H
|
||||
|
@ -61,21 +61,8 @@ MESSAGE_CLASS_DEFINITION(SigMFFileInput::MsgReportTotalSamplesCheck, Message)
|
||||
|
||||
SigMFFileInput::SigMFFileInput(DeviceAPI *deviceAPI) :
|
||||
m_deviceAPI(deviceAPI),
|
||||
m_running(false),
|
||||
m_settings(),
|
||||
m_trackMode(false),
|
||||
m_currentTrackIndex(0),
|
||||
m_recordOpen(false),
|
||||
m_crcAvailable(false),
|
||||
m_crcOK(false),
|
||||
m_recordLengthOK(false),
|
||||
m_fileInputWorker(nullptr),
|
||||
m_deviceDescription("SigMFFileInput"),
|
||||
m_sampleRate(48000),
|
||||
m_sampleBytes(1),
|
||||
m_centerFrequency(0),
|
||||
m_recordLength(0),
|
||||
m_startingTimeStamp(0)
|
||||
m_deviceDescription("SigMFFileInput")
|
||||
{
|
||||
m_sampleFifo.setLabel(m_deviceDescription);
|
||||
m_deviceAPI->setNbSourceStreams(1);
|
||||
@ -104,7 +91,7 @@ SigMFFileInput::~SigMFFileInput()
|
||||
);
|
||||
delete m_networkManager;
|
||||
|
||||
stop();
|
||||
SigMFFileInput::stop();
|
||||
}
|
||||
|
||||
void SigMFFileInput::destroy()
|
||||
@ -156,8 +143,8 @@ bool SigMFFileInput::openFileStreams(const QString& fileName)
|
||||
extractCaptures(&metaRecord);
|
||||
m_metaInfo.m_totalTimeMs = m_captures.back().m_cumulativeTime + ((m_captures.back().m_length * 1000)/m_captures.back().m_sampleRate);
|
||||
|
||||
uint64_t centerFrequency = (m_captures.size() > 0) ? m_captures.at(0).m_centerFrequency : 0;
|
||||
DSPSignalNotification *notif = new DSPSignalNotification(m_metaInfo.m_coreSampleRate, centerFrequency);
|
||||
uint64_t centerFrequency = (!m_captures.empty()) ? m_captures.at(0).m_centerFrequency : 0;
|
||||
auto *notif = new DSPSignalNotification((int) m_metaInfo.m_coreSampleRate, centerFrequency);
|
||||
m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif);
|
||||
|
||||
if (getMessageQueueToGUI())
|
||||
@ -244,14 +231,13 @@ void SigMFFileInput::extractMeta(
|
||||
m_metaInfo.m_arch = QString::fromStdString(metaRecord->global.access<sdrangel::GlobalT>().arch);
|
||||
m_metaInfo.m_os = QString::fromStdString(metaRecord->global.access<sdrangel::GlobalT>().os);
|
||||
// lists
|
||||
m_metaInfo.m_nbCaptures = metaRecord->captures.size();
|
||||
m_metaInfo.m_nbAnnotations = metaRecord->annotations.size();
|
||||
m_metaInfo.m_nbCaptures = (unsigned int) metaRecord->captures.size();
|
||||
m_metaInfo.m_nbAnnotations = (unsigned int) metaRecord->annotations.size();
|
||||
// correct sample bits if sdrangel
|
||||
if (m_metaInfo.m_sdrAngelVersion.size() > 0)
|
||||
if ((m_metaInfo.m_sdrAngelVersion.size() > 0)
|
||||
&& (m_metaInfo.m_dataType.m_sampleBits == 32))
|
||||
{
|
||||
if (m_metaInfo.m_dataType.m_sampleBits == 32) {
|
||||
m_metaInfo.m_dataType.m_sampleBits = 24;
|
||||
}
|
||||
m_metaInfo.m_dataType.m_sampleBits = 24;
|
||||
}
|
||||
// negative sample rate means inversion
|
||||
m_metaInfo.m_dataType.m_swapIQ = m_metaInfo.m_coreSampleRate < 0;
|
||||
@ -270,8 +256,7 @@ void SigMFFileInput::extractCaptures(
|
||||
std::regex datetime_reg("(\\d{4})-(\\d\\d)-(\\d\\d)T(\\d\\d):(\\d\\d):(\\d\\d)(\\.\\d+)?(([+-]\\d\\d:\\d\\d)|Z)?");
|
||||
std::smatch datetime_match;
|
||||
|
||||
sigmf::SigMFVector<sigmf::Capture<core::DescrT, sdrangel::DescrT>>::iterator it =
|
||||
metaRecord->captures.begin();
|
||||
auto it = metaRecord->captures.begin();
|
||||
uint64_t lastSampleStart = 0;
|
||||
unsigned int i = 0;
|
||||
uint64_t cumulativeTime = 0;
|
||||
@ -279,7 +264,7 @@ void SigMFFileInput::extractCaptures(
|
||||
for (; it != metaRecord->captures.end(); ++it, i++)
|
||||
{
|
||||
m_captures.push_back(SigMFFileCapture());
|
||||
m_captures.back().m_centerFrequency = it->get<core::DescrT>().frequency;
|
||||
m_captures.back().m_centerFrequency = (uint64_t) it->get<core::DescrT>().frequency;
|
||||
m_captures.back().m_sampleStart = it->get<core::DescrT>().sample_start;
|
||||
m_captureStarts.push_back(m_captures.back().m_sampleStart);
|
||||
m_captures.back().m_cumulativeTime = cumulativeTime;
|
||||
@ -287,7 +272,7 @@ void SigMFFileInput::extractCaptures(
|
||||
double globalSampleRate = metaRecord->global.access<core::GlobalT>().sample_rate;
|
||||
|
||||
if (sdrangelSampleRate == 0) {
|
||||
m_captures.back().m_sampleRate = globalSampleRate < 0 ? -globalSampleRate : globalSampleRate;
|
||||
m_captures.back().m_sampleRate = (unsigned int) (globalSampleRate < 0 ? -globalSampleRate : globalSampleRate);
|
||||
} else {
|
||||
m_captures.back().m_sampleRate = sdrangelSampleRate;
|
||||
}
|
||||
@ -326,7 +311,7 @@ void SigMFFileInput::extractCaptures(
|
||||
dateTime = QDateTime::currentDateTimeUtc();
|
||||
}
|
||||
|
||||
double seconds = dateTime.toSecsSinceEpoch();
|
||||
auto seconds = (double) dateTime.toSecsSinceEpoch();
|
||||
// the subsecond part can be milli (strict ISO-8601) or micro or nano (RFC-3339). This will take any width
|
||||
if (datetime_match.size() > 7)
|
||||
{
|
||||
@ -335,13 +320,13 @@ void SigMFFileInput::extractCaptures(
|
||||
double fractionalSecs = boost::lexical_cast<double>(datetime_match[7]);
|
||||
seconds += fractionalSecs;
|
||||
}
|
||||
catch (const boost::bad_lexical_cast &e)
|
||||
catch (const boost::bad_lexical_cast&)
|
||||
{
|
||||
qDebug("SigMFFileInput::extractCaptures: invalid fractional seconds");
|
||||
}
|
||||
}
|
||||
|
||||
m_captures.back().m_tsms = seconds * 1000.0;
|
||||
m_captures.back().m_tsms = (uint64_t) (seconds * 1000.0);
|
||||
}
|
||||
|
||||
m_captures.back().m_length = it->get<core::DescrT>().length;
|
||||
@ -390,7 +375,7 @@ void SigMFFileInput::analyzeDataType(const std::string& dataTypeString, SigMFFil
|
||||
{
|
||||
dataType.m_sampleBits = boost::lexical_cast<int>(dataType_match[3]);
|
||||
}
|
||||
catch(const boost::bad_lexical_cast &e)
|
||||
catch(const boost::bad_lexical_cast&)
|
||||
{
|
||||
qDebug("SigMFFileInput::analyzeDataType: invalid sample bits. Assume 32");
|
||||
dataType.m_sampleBits = 32;
|
||||
@ -414,7 +399,7 @@ uint64_t SigMFFileInput::getTrackSampleStart(unsigned int trackIndex)
|
||||
int SigMFFileInput::getTrackIndex(uint64_t sampleIndex)
|
||||
{
|
||||
auto it = std::upper_bound(m_captureStarts.begin(), m_captureStarts.end(), sampleIndex);
|
||||
return (it - m_captureStarts.begin()) - 1;
|
||||
return (int) ((it - m_captureStarts.begin()) - 1);
|
||||
}
|
||||
|
||||
void SigMFFileInput::seekFileStream(uint64_t sampleIndex)
|
||||
@ -441,7 +426,7 @@ void SigMFFileInput::seekFileMillis(int seekMillis)
|
||||
|
||||
void SigMFFileInput::init()
|
||||
{
|
||||
DSPSignalNotification *notif = new DSPSignalNotification(m_sampleRate, m_centerFrequency);
|
||||
auto *notif = new DSPSignalNotification(m_sampleRate, m_centerFrequency);
|
||||
m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif);
|
||||
}
|
||||
|
||||
@ -596,13 +581,13 @@ bool SigMFFileInput::handleMessage(const Message& message)
|
||||
{
|
||||
if (MsgConfigureSigMFFileInput::match(message))
|
||||
{
|
||||
MsgConfigureSigMFFileInput& conf = (MsgConfigureSigMFFileInput&) message;
|
||||
auto& conf = (const MsgConfigureSigMFFileInput&) message;
|
||||
applySettings(conf.getSettings(), conf.getSettingsKeys(), conf.getForce());
|
||||
return true;
|
||||
}
|
||||
else if (MsgConfigureTrackIndex::match(message))
|
||||
{
|
||||
MsgConfigureTrackIndex& conf = (MsgConfigureTrackIndex&) message;
|
||||
auto& conf = (const MsgConfigureTrackIndex&) message;
|
||||
m_currentTrackIndex = conf.getTrackIndex();
|
||||
qDebug("SigMFFileInput::handleMessage MsgConfigureTrackIndex: m_currentTrackIndex: %d", m_currentTrackIndex);
|
||||
seekTrackMillis(0);
|
||||
@ -623,7 +608,7 @@ bool SigMFFileInput::handleMessage(const Message& message)
|
||||
);
|
||||
|
||||
if (working) {
|
||||
startWorker();
|
||||
startWorker();
|
||||
}
|
||||
}
|
||||
|
||||
@ -631,7 +616,7 @@ bool SigMFFileInput::handleMessage(const Message& message)
|
||||
}
|
||||
else if (MsgConfigureTrackWork::match(message))
|
||||
{
|
||||
MsgConfigureTrackWork& conf = (MsgConfigureTrackWork&) message;
|
||||
auto& conf = (const MsgConfigureTrackWork&) message;
|
||||
bool working = conf.isWorking();
|
||||
m_trackMode = true;
|
||||
|
||||
@ -653,7 +638,7 @@ bool SigMFFileInput::handleMessage(const Message& message)
|
||||
}
|
||||
else if (MsgConfigureTrackSeek::match(message))
|
||||
{
|
||||
MsgConfigureTrackSeek& conf = (MsgConfigureTrackSeek&) message;
|
||||
auto& conf = (const MsgConfigureTrackSeek&) message;
|
||||
int seekMillis = conf.getMillis();
|
||||
seekTrackMillis(seekMillis);
|
||||
|
||||
@ -669,7 +654,7 @@ bool SigMFFileInput::handleMessage(const Message& message)
|
||||
m_captures[m_currentTrackIndex].m_sampleStart + ((m_captures[m_currentTrackIndex].m_length*seekMillis)/1000UL));
|
||||
|
||||
if (working) {
|
||||
startWorker();
|
||||
startWorker();
|
||||
}
|
||||
}
|
||||
|
||||
@ -677,7 +662,7 @@ bool SigMFFileInput::handleMessage(const Message& message)
|
||||
}
|
||||
else if (MsgConfigureFileSeek::match(message))
|
||||
{
|
||||
MsgConfigureFileSeek& conf = (MsgConfigureFileSeek&) message;
|
||||
auto& conf = (const MsgConfigureFileSeek&) message;
|
||||
int seekMillis = conf.getMillis();
|
||||
seekFileStream(seekMillis);
|
||||
uint64_t sampleCount = (m_metaInfo.m_totalSamples*seekMillis)/1000UL;
|
||||
@ -695,7 +680,7 @@ bool SigMFFileInput::handleMessage(const Message& message)
|
||||
m_fileInputWorker->setSamplesCount(sampleCount);
|
||||
|
||||
if (working) {
|
||||
startWorker();
|
||||
startWorker();
|
||||
}
|
||||
}
|
||||
|
||||
@ -703,7 +688,7 @@ bool SigMFFileInput::handleMessage(const Message& message)
|
||||
}
|
||||
else if (MsgConfigureFileWork::match(message))
|
||||
{
|
||||
MsgConfigureFileWork& conf = (MsgConfigureFileWork&) message;
|
||||
auto& conf = (const MsgConfigureFileWork&) message;
|
||||
bool working = conf.isWorking();
|
||||
m_trackMode = false;
|
||||
|
||||
@ -724,27 +709,24 @@ bool SigMFFileInput::handleMessage(const Message& message)
|
||||
}
|
||||
else if (MsgConfigureFileInputStreamTiming::match(message))
|
||||
{
|
||||
if (m_fileInputWorker)
|
||||
if (m_fileInputWorker && getMessageQueueToGUI())
|
||||
{
|
||||
if (getMessageQueueToGUI())
|
||||
{
|
||||
quint64 totalSamplesCount = m_fileInputWorker->getSamplesCount();
|
||||
quint64 trackSamplesCount = totalSamplesCount - m_captures[m_currentTrackIndex].m_sampleStart;
|
||||
MsgReportFileInputStreamTiming *report = MsgReportFileInputStreamTiming::create(
|
||||
totalSamplesCount,
|
||||
trackSamplesCount,
|
||||
m_captures[m_currentTrackIndex].m_cumulativeTime,
|
||||
m_currentTrackIndex
|
||||
);
|
||||
getMessageQueueToGUI()->push(report);
|
||||
}
|
||||
quint64 totalSamplesCount = m_fileInputWorker->getSamplesCount();
|
||||
quint64 trackSamplesCount = totalSamplesCount - m_captures[m_currentTrackIndex].m_sampleStart;
|
||||
MsgReportFileInputStreamTiming *report = MsgReportFileInputStreamTiming::create(
|
||||
totalSamplesCount,
|
||||
trackSamplesCount,
|
||||
m_captures[m_currentTrackIndex].m_cumulativeTime,
|
||||
m_currentTrackIndex
|
||||
);
|
||||
getMessageQueueToGUI()->push(report);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
else if (MsgStartStop::match(message))
|
||||
{
|
||||
MsgStartStop& cmd = (MsgStartStop&) message;
|
||||
auto& cmd = (const MsgStartStop&) message;
|
||||
qDebug() << "FileInput::handleMessage: MsgStartStop: " << (cmd.getStartStop() ? "start" : "stop");
|
||||
|
||||
if (cmd.getStartStop())
|
||||
@ -798,7 +780,7 @@ bool SigMFFileInput::handleMessage(const Message& message)
|
||||
}
|
||||
else if (SigMFFileInputWorker::MsgReportTrackChange::match(message))
|
||||
{
|
||||
SigMFFileInputWorker::MsgReportTrackChange& report = (SigMFFileInputWorker::MsgReportTrackChange&) message;
|
||||
auto& report = (const SigMFFileInputWorker::MsgReportTrackChange&) message;
|
||||
m_currentTrackIndex = report.getTrackIndex();
|
||||
qDebug("SigMFFileInput::handleMessage MsgReportTrackChange: m_currentTrackIndex: %d", m_currentTrackIndex);
|
||||
int sampleRate = m_captures.at(m_currentTrackIndex).m_sampleRate;
|
||||
@ -806,7 +788,7 @@ bool SigMFFileInput::handleMessage(const Message& message)
|
||||
|
||||
if ((m_sampleRate != sampleRate) || (m_centerFrequency != centerFrequency))
|
||||
{
|
||||
DSPSignalNotification *notif = new DSPSignalNotification(sampleRate, centerFrequency);
|
||||
auto *notif = new DSPSignalNotification(sampleRate, centerFrequency);
|
||||
m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif);
|
||||
|
||||
m_sampleRate = sampleRate;
|
||||
@ -831,18 +813,15 @@ bool SigMFFileInput::applySettings(const SigMFFileInputSettings& settings, const
|
||||
{
|
||||
qDebug() << "SigMFFileInput::applySettings: force: " << force << settings.getDebugString(settingsKeys, force);
|
||||
|
||||
if (settingsKeys.contains("accelerationFactor") || force)
|
||||
if (m_fileInputWorker && (settingsKeys.contains("accelerationFactor") || force))
|
||||
{
|
||||
if (m_fileInputWorker)
|
||||
{
|
||||
QMutexLocker mutexLocker(&m_mutex);
|
||||
if (!m_sampleFifo.setSize(m_settings.m_accelerationFactor * m_sampleRate * sizeof(Sample))) {
|
||||
qCritical("SigMFFileInput::applySettings: could not reallocate sample FIFO size to %lu",
|
||||
m_settings.m_accelerationFactor * m_sampleRate * sizeof(Sample));
|
||||
}
|
||||
|
||||
m_fileInputWorker->setAccelerationFactor(settings.m_accelerationFactor); // Fast Forward: 1 corresponds to live. 1/2 is half speed, 2 is double speed
|
||||
QMutexLocker mutexLocker(&m_mutex);
|
||||
if (!m_sampleFifo.setSize(m_settings.m_accelerationFactor * m_sampleRate * sizeof(Sample))) {
|
||||
qCritical("SigMFFileInput::applySettings: could not reallocate sample FIFO size to %lu",
|
||||
m_settings.m_accelerationFactor * m_sampleRate * sizeof(Sample));
|
||||
}
|
||||
|
||||
m_fileInputWorker->setAccelerationFactor(settings.m_accelerationFactor); // Fast Forward: 1 corresponds to live. 1/2 is half speed, 2 is double speed
|
||||
}
|
||||
|
||||
if (settingsKeys.contains("fileName")) {
|
||||
@ -925,10 +904,10 @@ void SigMFFileInput::webapiUpdateDeviceSettings(
|
||||
settings.m_reverseAPIAddress = *response.getSigMfFileInputSettings()->getReverseApiAddress();
|
||||
}
|
||||
if (deviceSettingsKeys.contains("reverseAPIPort")) {
|
||||
settings.m_reverseAPIPort = response.getSigMfFileInputSettings()->getReverseApiPort();
|
||||
settings.m_reverseAPIPort = (uint16_t) response.getSigMfFileInputSettings()->getReverseApiPort();
|
||||
}
|
||||
if (deviceSettingsKeys.contains("reverseAPIDeviceIndex")) {
|
||||
settings.m_reverseAPIDeviceIndex = response.getSigMfFileInputSettings()->getReverseApiDeviceIndex();
|
||||
settings.m_reverseAPIDeviceIndex = (uint16_t) response.getSigMfFileInputSettings()->getReverseApiDeviceIndex();
|
||||
}
|
||||
}
|
||||
|
||||
@ -1080,7 +1059,11 @@ void SigMFFileInput::webapiFormatDeviceReport(SWGSDRangel::SWGDeviceReport& resp
|
||||
response.getSigMfFileInputReport()->setSampleFormat(m_metaInfo.m_dataType.m_floatingPoint ? 1 : 0);
|
||||
response.getSigMfFileInputReport()->setSampleSigned(m_metaInfo.m_dataType.m_signed ? 1 : 0);
|
||||
response.getSigMfFileInputReport()->setSampleSwapIq(m_metaInfo.m_dataType.m_swapIQ ? 1 : 0);
|
||||
response.getSigMfFileInputReport()->setCrcStatus(!m_crcAvailable ? 0 : m_crcOK ? 1 : 2);
|
||||
if (!m_crcAvailable) {
|
||||
response.getSigMfFileInputReport()->setCrcStatus(0);
|
||||
} else {
|
||||
response.getSigMfFileInputReport()->setCrcStatus(m_crcOK ? 1 : 2);
|
||||
}
|
||||
response.getSigMfFileInputReport()->setTotalBytesStatus(m_recordLengthOK);
|
||||
response.getSigMfFileInputReport()->setTrackNumber(m_currentTrackIndex);
|
||||
QList<SigMFFileCapture>::const_iterator it = m_captures.begin();
|
||||
@ -1124,7 +1107,7 @@ void SigMFFileInput::webapiFormatDeviceReport(SWGSDRangel::SWGDeviceReport& resp
|
||||
posRatio = (float) totalSamplesCount / (float) m_metaInfo.m_totalSamples;
|
||||
response.getSigMfFileInputReport()->setRecordSamplesRatio(posRatio);
|
||||
|
||||
if (m_captures.size() > 0 )
|
||||
if (!m_captures.empty() )
|
||||
{
|
||||
uint64_t totalTimeMs = m_captures.back().m_cumulativeTime + ((m_captures.back().m_length * 1000) / m_captures.back().m_sampleRate);
|
||||
response.getSigMfFileInputReport()->setRecordDurationMs(totalTimeMs);
|
||||
@ -1137,7 +1120,7 @@ void SigMFFileInput::webapiFormatDeviceReport(SWGSDRangel::SWGDeviceReport& resp
|
||||
|
||||
void SigMFFileInput::webapiReverseSendSettings(const QList<QString>& deviceSettingsKeys, const SigMFFileInputSettings& settings, bool force)
|
||||
{
|
||||
SWGSDRangel::SWGDeviceSettings *swgDeviceSettings = new SWGSDRangel::SWGDeviceSettings();
|
||||
auto *swgDeviceSettings = new SWGSDRangel::SWGDeviceSettings();
|
||||
swgDeviceSettings->setDirection(0); // single Rx
|
||||
swgDeviceSettings->setOriginatorIndex(m_deviceAPI->getDeviceSetIndex());
|
||||
swgDeviceSettings->setDeviceHwType(new QString("SigMFFileInput"));
|
||||
@ -1166,8 +1149,8 @@ void SigMFFileInput::webapiReverseSendSettings(const QList<QString>& deviceSetti
|
||||
m_networkRequest.setUrl(QUrl(deviceSettingsURL));
|
||||
m_networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
|
||||
|
||||
QBuffer *buffer = new QBuffer();
|
||||
buffer->open((QBuffer::ReadWrite));
|
||||
auto *buffer = new QBuffer();
|
||||
buffer->open(QBuffer::ReadWrite);
|
||||
buffer->write(swgDeviceSettings->asJson().toUtf8());
|
||||
buffer->seek(0);
|
||||
|
||||
@ -1180,7 +1163,7 @@ void SigMFFileInput::webapiReverseSendSettings(const QList<QString>& deviceSetti
|
||||
|
||||
void SigMFFileInput::webapiReverseSendStartStop(bool start)
|
||||
{
|
||||
SWGSDRangel::SWGDeviceSettings *swgDeviceSettings = new SWGSDRangel::SWGDeviceSettings();
|
||||
auto *swgDeviceSettings = new SWGSDRangel::SWGDeviceSettings();
|
||||
swgDeviceSettings->setDirection(0); // single Rx
|
||||
swgDeviceSettings->setOriginatorIndex(m_deviceAPI->getDeviceSetIndex());
|
||||
swgDeviceSettings->setDeviceHwType(new QString("SigMFFileInput"));
|
||||
@ -1192,8 +1175,8 @@ void SigMFFileInput::webapiReverseSendStartStop(bool start)
|
||||
m_networkRequest.setUrl(QUrl(deviceSettingsURL));
|
||||
m_networkRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
|
||||
|
||||
QBuffer *buffer = new QBuffer();
|
||||
buffer->open((QBuffer::ReadWrite));
|
||||
auto *buffer = new QBuffer();
|
||||
buffer->open(QBuffer::ReadWrite);
|
||||
buffer->write(swgDeviceSettings->asJson().toUtf8());
|
||||
buffer->seek(0);
|
||||
QNetworkReply *reply;
|
||||
@ -1208,7 +1191,7 @@ void SigMFFileInput::webapiReverseSendStartStop(bool start)
|
||||
delete swgDeviceSettings;
|
||||
}
|
||||
|
||||
void SigMFFileInput::networkManagerFinished(QNetworkReply *reply)
|
||||
void SigMFFileInput::networkManagerFinished(QNetworkReply *reply) const
|
||||
{
|
||||
QNetworkReply::NetworkError replyError = reply->error();
|
||||
|
||||
|
@ -86,7 +86,7 @@ public:
|
||||
private:
|
||||
bool m_working;
|
||||
|
||||
MsgConfigureTrackWork(bool working) :
|
||||
explicit MsgConfigureTrackWork(bool working) :
|
||||
Message(),
|
||||
m_working(working)
|
||||
{ }
|
||||
@ -109,7 +109,7 @@ public:
|
||||
private:
|
||||
bool m_working;
|
||||
|
||||
MsgConfigureFileWork(bool working) :
|
||||
explicit MsgConfigureFileWork(bool working) :
|
||||
Message(),
|
||||
m_working(working)
|
||||
{ }
|
||||
@ -132,7 +132,7 @@ public:
|
||||
private:
|
||||
int m_trackIndex;
|
||||
|
||||
MsgConfigureTrackIndex(int trackIndex) :
|
||||
explicit MsgConfigureTrackIndex(int trackIndex) :
|
||||
Message(),
|
||||
m_trackIndex(trackIndex)
|
||||
{ }
|
||||
@ -152,10 +152,10 @@ public:
|
||||
return new MsgConfigureTrackSeek(seekMillis);
|
||||
}
|
||||
|
||||
protected:
|
||||
private:
|
||||
int m_seekMillis; //!< millis of seek position from the beginning 0..1000
|
||||
|
||||
MsgConfigureTrackSeek(int seekMillis) :
|
||||
explicit MsgConfigureTrackSeek(int seekMillis) :
|
||||
Message(),
|
||||
m_seekMillis(seekMillis)
|
||||
{ }
|
||||
@ -175,10 +175,10 @@ public:
|
||||
return new MsgConfigureFileSeek(seekMillis);
|
||||
}
|
||||
|
||||
protected:
|
||||
private:
|
||||
int m_seekMillis; //!< millis of seek position from the beginning 0..1000
|
||||
|
||||
MsgConfigureFileSeek(int seekMillis) :
|
||||
explicit MsgConfigureFileSeek(int seekMillis) :
|
||||
Message(),
|
||||
m_seekMillis(seekMillis)
|
||||
{ }
|
||||
@ -217,10 +217,10 @@ public:
|
||||
return new MsgStartStop(startStop);
|
||||
}
|
||||
|
||||
protected:
|
||||
private:
|
||||
bool m_startStop;
|
||||
|
||||
MsgStartStop(bool startStop) :
|
||||
explicit MsgStartStop(bool startStop) :
|
||||
Message(),
|
||||
m_startStop(startStop)
|
||||
{ }
|
||||
@ -240,10 +240,10 @@ public:
|
||||
return new MsgReportStartStop(startStop);
|
||||
}
|
||||
|
||||
protected:
|
||||
private:
|
||||
bool m_startStop;
|
||||
|
||||
MsgReportStartStop(bool startStop) :
|
||||
explicit MsgReportStartStop(bool startStop) :
|
||||
Message(),
|
||||
m_startStop(startStop)
|
||||
{ }
|
||||
@ -257,13 +257,13 @@ public:
|
||||
|
||||
public:
|
||||
const SigMFFileMetaInfo& getMetaInfo() const { return m_metaInfo; }
|
||||
const QList<SigMFFileCapture>& getCaptures() { return m_captures; }
|
||||
const QList<SigMFFileCapture>& getCaptures() const { return m_captures; }
|
||||
|
||||
static MsgReportMetaData* create(const SigMFFileMetaInfo& metaInfo, const QList<SigMFFileCapture>& captures) {
|
||||
return new MsgReportMetaData(metaInfo, captures);
|
||||
}
|
||||
|
||||
protected:
|
||||
private:
|
||||
SigMFFileMetaInfo m_metaInfo;
|
||||
QList<SigMFFileCapture> m_captures;
|
||||
|
||||
@ -288,7 +288,7 @@ public:
|
||||
|
||||
private:
|
||||
int m_trackIndex;
|
||||
MsgReportTrackChange(int trackIndex) :
|
||||
explicit MsgReportTrackChange(int trackIndex) :
|
||||
Message(),
|
||||
m_trackIndex(trackIndex)
|
||||
{ }
|
||||
@ -321,7 +321,7 @@ public:
|
||||
);
|
||||
}
|
||||
|
||||
protected:
|
||||
private:
|
||||
quint64 m_samplesCount;
|
||||
quint64 m_trackSamplesCount;
|
||||
quint64 m_trackTimeStart;
|
||||
@ -354,10 +354,10 @@ public:
|
||||
return new MsgReportCRC(ok);
|
||||
}
|
||||
|
||||
protected:
|
||||
private:
|
||||
bool m_ok;
|
||||
|
||||
MsgReportCRC(bool ok) :
|
||||
explicit MsgReportCRC(bool ok) :
|
||||
Message(),
|
||||
m_ok(ok)
|
||||
{ }
|
||||
@ -376,98 +376,98 @@ public:
|
||||
return new MsgReportTotalSamplesCheck(ok);
|
||||
}
|
||||
|
||||
protected:
|
||||
private:
|
||||
bool m_ok;
|
||||
|
||||
MsgReportTotalSamplesCheck(bool ok) :
|
||||
explicit MsgReportTotalSamplesCheck(bool ok) :
|
||||
Message(),
|
||||
m_ok(ok)
|
||||
{ }
|
||||
};
|
||||
|
||||
SigMFFileInput(DeviceAPI *deviceAPI);
|
||||
virtual ~SigMFFileInput();
|
||||
virtual void destroy();
|
||||
explicit SigMFFileInput(DeviceAPI *deviceAPI);
|
||||
~SigMFFileInput() final;
|
||||
void destroy() final;
|
||||
|
||||
virtual void init();
|
||||
virtual bool start();
|
||||
virtual void stop();
|
||||
void init() final;
|
||||
bool start() final;
|
||||
void stop() final;
|
||||
|
||||
virtual QByteArray serialize() const;
|
||||
virtual bool deserialize(const QByteArray& data);
|
||||
QByteArray serialize() const final;
|
||||
bool deserialize(const QByteArray& data) final;
|
||||
|
||||
virtual void setMessageQueueToGUI(MessageQueue *queue) { m_guiMessageQueue = queue; }
|
||||
virtual const QString& getDeviceDescription() const;
|
||||
virtual int getSampleRate() const;
|
||||
virtual void setSampleRate(int sampleRate) { (void) sampleRate; }
|
||||
virtual quint64 getCenterFrequency() const;
|
||||
virtual void setCenterFrequency(qint64 centerFrequency);
|
||||
void setMessageQueueToGUI(MessageQueue *queue) final { m_guiMessageQueue = queue; }
|
||||
const QString& getDeviceDescription() const final;
|
||||
int getSampleRate() const final;
|
||||
void setSampleRate(int sampleRate) final { (void) sampleRate; }
|
||||
quint64 getCenterFrequency() const final;
|
||||
void setCenterFrequency(qint64 centerFrequency) final;
|
||||
quint64 getStartingTimeStamp() const;
|
||||
|
||||
virtual bool handleMessage(const Message& message);
|
||||
bool handleMessage(const Message& message) final;
|
||||
|
||||
virtual int webapiSettingsGet(
|
||||
SWGSDRangel::SWGDeviceSettings& response,
|
||||
QString& errorMessage);
|
||||
int webapiSettingsGet(
|
||||
SWGSDRangel::SWGDeviceSettings& response,
|
||||
QString& errorMessage) final;
|
||||
|
||||
virtual int webapiSettingsPutPatch(
|
||||
bool force,
|
||||
const QStringList& deviceSettingsKeys,
|
||||
SWGSDRangel::SWGDeviceSettings& response, // query + response
|
||||
QString& errorMessage);
|
||||
int webapiSettingsPutPatch(
|
||||
bool force,
|
||||
const QStringList& deviceSettingsKeys,
|
||||
SWGSDRangel::SWGDeviceSettings& response, // query + response
|
||||
QString& errorMessage) final;
|
||||
|
||||
virtual int webapiRunGet(
|
||||
SWGSDRangel::SWGDeviceState& response,
|
||||
QString& errorMessage);
|
||||
int webapiRunGet(
|
||||
SWGSDRangel::SWGDeviceState& response,
|
||||
QString& errorMessage) final;
|
||||
|
||||
virtual int webapiActionsPost(
|
||||
const QStringList& deviceActionsKeys,
|
||||
SWGSDRangel::SWGDeviceActions& query,
|
||||
QString& errorMessage);
|
||||
int webapiActionsPost(
|
||||
const QStringList& deviceActionsKeys,
|
||||
SWGSDRangel::SWGDeviceActions& query,
|
||||
QString& errorMessage) final;
|
||||
|
||||
virtual int webapiRun(
|
||||
bool run,
|
||||
SWGSDRangel::SWGDeviceState& response,
|
||||
QString& errorMessage);
|
||||
int webapiRun(
|
||||
bool run,
|
||||
SWGSDRangel::SWGDeviceState& response,
|
||||
QString& errorMessage) final;
|
||||
|
||||
virtual int webapiReportGet(
|
||||
SWGSDRangel::SWGDeviceReport& response,
|
||||
QString& errorMessage);
|
||||
int webapiReportGet(
|
||||
SWGSDRangel::SWGDeviceReport& response,
|
||||
QString& errorMessage) final;
|
||||
|
||||
static void webapiFormatDeviceSettings(
|
||||
SWGSDRangel::SWGDeviceSettings& response,
|
||||
const SigMFFileInputSettings& settings);
|
||||
SWGSDRangel::SWGDeviceSettings& response,
|
||||
const SigMFFileInputSettings& settings);
|
||||
|
||||
static void webapiUpdateDeviceSettings(
|
||||
SigMFFileInputSettings& settings,
|
||||
const QStringList& deviceSettingsKeys,
|
||||
SWGSDRangel::SWGDeviceSettings& response);
|
||||
SigMFFileInputSettings& settings,
|
||||
const QStringList& deviceSettingsKeys,
|
||||
SWGSDRangel::SWGDeviceSettings& response);
|
||||
|
||||
private:
|
||||
DeviceAPI *m_deviceAPI;
|
||||
QMutex m_mutex;
|
||||
bool m_running;
|
||||
bool m_running = false;
|
||||
SigMFFileInputSettings m_settings;
|
||||
std::ifstream m_metaStream;
|
||||
std::ifstream m_dataStream;
|
||||
SigMFFileMetaInfo m_metaInfo;
|
||||
QList<SigMFFileCapture> m_captures;
|
||||
std::vector<uint64_t> m_captureStarts;
|
||||
bool m_trackMode;
|
||||
int m_currentTrackIndex;
|
||||
bool m_recordOpen;
|
||||
bool m_crcAvailable;
|
||||
bool m_crcOK;
|
||||
bool m_recordLengthOK;
|
||||
bool m_trackMode = false;
|
||||
int m_currentTrackIndex = 0;
|
||||
bool m_recordOpen = false;
|
||||
bool m_crcAvailable = false;
|
||||
bool m_crcOK = false;
|
||||
bool m_recordLengthOK = false;
|
||||
QString m_recordSummary;
|
||||
SigMFFileInputWorker* m_fileInputWorker;
|
||||
SigMFFileInputWorker* m_fileInputWorker = nullptr;
|
||||
QThread m_fileInputWorkerThread;
|
||||
QString m_deviceDescription;
|
||||
int m_sampleRate;
|
||||
unsigned int m_sampleBytes;
|
||||
quint64 m_centerFrequency;
|
||||
quint64 m_recordLength; //!< record length in seconds computed from file size
|
||||
quint64 m_startingTimeStamp;
|
||||
int m_sampleRate = 48000;
|
||||
unsigned int m_sampleBytes = 1;
|
||||
quint64 m_centerFrequency = 0;
|
||||
quint64 m_recordLength = 0; //!< record length in seconds computed from file size
|
||||
quint64 m_startingTimeStamp = 0;
|
||||
QTimer m_masterTimer;
|
||||
QNetworkAccessManager *m_networkManager;
|
||||
QNetworkRequest m_networkRequest;
|
||||
@ -498,7 +498,7 @@ private:
|
||||
void webapiReverseSendStartStop(bool start);
|
||||
|
||||
private slots:
|
||||
void networkManagerFinished(QNetworkReply *reply);
|
||||
void networkManagerFinished(QNetworkReply *reply) const;
|
||||
};
|
||||
|
||||
#endif // INCLUDE_SIGMFFILEINPUT_H
|
||||
|
@ -65,9 +65,7 @@ DeviceAPI::DeviceAPI(
|
||||
}
|
||||
}
|
||||
|
||||
DeviceAPI::~DeviceAPI()
|
||||
{
|
||||
}
|
||||
DeviceAPI::~DeviceAPI() = default;
|
||||
|
||||
void DeviceAPI::setSpectrumSinkInput(bool sourceElseSink, unsigned int index)
|
||||
{
|
||||
@ -269,7 +267,7 @@ DeviceAPI::EngineState DeviceAPI::state(int subsystemIndex) const
|
||||
}
|
||||
}
|
||||
|
||||
QString DeviceAPI::errorMessage(int subsystemIndex)
|
||||
QString DeviceAPI::errorMessage(int subsystemIndex) const
|
||||
{
|
||||
if (m_deviceSourceEngine) {
|
||||
return m_deviceSourceEngine->errorMessage();
|
||||
@ -360,28 +358,28 @@ void DeviceAPI::setDeviceItemIndex(uint32_t index)
|
||||
|
||||
void DeviceAPI::setSamplingDevicePluginInterface(PluginInterface *iface)
|
||||
{
|
||||
m_pluginInterface = iface;
|
||||
m_pluginInterface = iface;
|
||||
}
|
||||
|
||||
void DeviceAPI::getDeviceEngineStateStr(QString& state, int subsystemIndex)
|
||||
void DeviceAPI::getDeviceEngineStateStr(QString& state, int subsystemIndex) const
|
||||
{
|
||||
if (m_deviceSourceEngine)
|
||||
{
|
||||
switch(m_deviceSourceEngine->state())
|
||||
{
|
||||
case DSPDeviceSourceEngine::StNotStarted:
|
||||
case DSPDeviceSourceEngine::State::StNotStarted:
|
||||
state = "notStarted";
|
||||
break;
|
||||
case DSPDeviceSourceEngine::StIdle:
|
||||
case DSPDeviceSourceEngine::State::StIdle:
|
||||
state = "idle";
|
||||
break;
|
||||
case DSPDeviceSourceEngine::StReady:
|
||||
case DSPDeviceSourceEngine::State::StReady:
|
||||
state = "ready";
|
||||
break;
|
||||
case DSPDeviceSourceEngine::StRunning:
|
||||
case DSPDeviceSourceEngine::State::StRunning:
|
||||
state = "running";
|
||||
break;
|
||||
case DSPDeviceSourceEngine::StError:
|
||||
case DSPDeviceSourceEngine::State::StError:
|
||||
state = "error";
|
||||
break;
|
||||
default:
|
||||
@ -393,19 +391,19 @@ void DeviceAPI::getDeviceEngineStateStr(QString& state, int subsystemIndex)
|
||||
{
|
||||
switch(m_deviceSinkEngine->state())
|
||||
{
|
||||
case DSPDeviceSinkEngine::StNotStarted:
|
||||
case DSPDeviceSinkEngine::State::StNotStarted:
|
||||
state = "notStarted";
|
||||
break;
|
||||
case DSPDeviceSinkEngine::StIdle:
|
||||
case DSPDeviceSinkEngine::State::StIdle:
|
||||
state = "idle";
|
||||
break;
|
||||
case DSPDeviceSinkEngine::StReady:
|
||||
case DSPDeviceSinkEngine::State::StReady:
|
||||
state = "ready";
|
||||
break;
|
||||
case DSPDeviceSinkEngine::StRunning:
|
||||
case DSPDeviceSinkEngine::State::StRunning:
|
||||
state = "running";
|
||||
break;
|
||||
case DSPDeviceSinkEngine::StError:
|
||||
case DSPDeviceSinkEngine::State::StError:
|
||||
state = "error";
|
||||
break;
|
||||
default:
|
||||
@ -417,19 +415,19 @@ void DeviceAPI::getDeviceEngineStateStr(QString& state, int subsystemIndex)
|
||||
{
|
||||
switch(m_deviceMIMOEngine->state(subsystemIndex))
|
||||
{
|
||||
case DSPDeviceMIMOEngine::StNotStarted:
|
||||
case DSPDeviceMIMOEngine::State::StNotStarted:
|
||||
state = "notStarted";
|
||||
break;
|
||||
case DSPDeviceMIMOEngine::StIdle:
|
||||
case DSPDeviceMIMOEngine::State::StIdle:
|
||||
state = "idle";
|
||||
break;
|
||||
case DSPDeviceMIMOEngine::StReady:
|
||||
case DSPDeviceMIMOEngine::State::StReady:
|
||||
state = "ready";
|
||||
break;
|
||||
case DSPDeviceMIMOEngine::StRunning:
|
||||
case DSPDeviceMIMOEngine::State::StRunning:
|
||||
state = "running";
|
||||
break;
|
||||
case DSPDeviceMIMOEngine::StError:
|
||||
case DSPDeviceMIMOEngine::State::StError:
|
||||
state = "error";
|
||||
break;
|
||||
default:
|
||||
@ -546,26 +544,26 @@ bool DeviceAPI::deserialize(const QByteArray& data)
|
||||
|
||||
if (d.getVersion() == 1)
|
||||
{
|
||||
QByteArray data;
|
||||
QByteArray bdata;
|
||||
QList<quint64> centerFrequency;
|
||||
|
||||
if (m_deviceSourceEngine && m_deviceSourceEngine->getSource())
|
||||
{
|
||||
d.readBlob(1, &data);
|
||||
d.readBlob(1, &bdata);
|
||||
if (data.size() > 0) {
|
||||
m_deviceSourceEngine->getSource()->deserialize(data);
|
||||
}
|
||||
}
|
||||
if (m_deviceSinkEngine && m_deviceSinkEngine->getSink())
|
||||
{
|
||||
d.readBlob(2, &data);
|
||||
d.readBlob(2, &bdata);
|
||||
if (data.size() > 0) {
|
||||
m_deviceSinkEngine->getSink()->deserialize(data);
|
||||
}
|
||||
}
|
||||
if (m_deviceMIMOEngine && m_deviceMIMOEngine->getMIMO())
|
||||
{
|
||||
d.readBlob(3, &data);
|
||||
d.readBlob(3, &bdata);
|
||||
if (data.size() > 0) {
|
||||
m_deviceMIMOEngine->getMIMO()->deserialize(data);
|
||||
}
|
||||
@ -596,7 +594,7 @@ void DeviceAPI::loadSamplingDeviceSettings(const Preset* preset)
|
||||
qDebug("DeviceAPI::loadSamplingDeviceSettings: deserializing source %s[%d]: %s",
|
||||
qPrintable(m_samplingDeviceId), m_samplingDeviceSequence, qPrintable(m_samplingDeviceSerial));
|
||||
|
||||
if (m_deviceSourceEngine->getSource() != 0) // Server flavor
|
||||
if (m_deviceSourceEngine->getSource() != nullptr) // Server flavor
|
||||
{
|
||||
m_deviceSourceEngine->getSource()->deserialize(*sourceConfig);
|
||||
}
|
||||
@ -791,8 +789,8 @@ void DeviceAPI::removeBuddy(DeviceAPI* buddy)
|
||||
|
||||
void DeviceAPI::clearBuddiesLists()
|
||||
{
|
||||
std::vector<DeviceAPI*>::iterator itSource = m_sourceBuddies.begin();
|
||||
std::vector<DeviceAPI*>::iterator itSink = m_sinkBuddies.begin();
|
||||
auto itSource = m_sourceBuddies.begin();
|
||||
auto itSink = m_sinkBuddies.begin();
|
||||
bool leaderElected = false;
|
||||
|
||||
for (;itSource != m_sourceBuddies.end(); ++itSource)
|
||||
|
@ -65,7 +65,7 @@ public:
|
||||
DSPDeviceSinkEngine *deviceSinkEngine,
|
||||
DSPDeviceMIMOEngine *deviceMIMOEngine
|
||||
);
|
||||
~DeviceAPI();
|
||||
~DeviceAPI() override;
|
||||
|
||||
void setSpectrumSinkInput(bool sourceElseSink = true, unsigned int index = 0); //!< Used in the MIMO case to select which stream is used as input to main spectrum
|
||||
|
||||
@ -94,7 +94,7 @@ public:
|
||||
bool startDeviceEngine(int subsystemIndex = 0); //!< Start the device engine corresponding to the stream type
|
||||
void stopDeviceEngine(int subsystemIndex = 0); //!< Stop the device engine corresponding to the stream type
|
||||
EngineState state(int subsystemIndex = 0) const; //!< Return the state of the device engine corresponding to the stream type
|
||||
QString errorMessage(int subsystemIndex = 0); //!< Last error message from the device engine
|
||||
QString errorMessage(int subsystemIndex = 0) const; //!< Last error message from the device engine
|
||||
uint getDeviceUID() const; //!< Return the current device engine unique ID
|
||||
|
||||
MessageQueue *getDeviceEngineInputMessageQueue(); //!< Device engine message queue
|
||||
@ -131,7 +131,7 @@ public:
|
||||
void setDeviceSetIndex(int deviceSetIndex);
|
||||
PluginInterface *getPluginInterface() { return m_pluginInterface; }
|
||||
|
||||
void getDeviceEngineStateStr(QString& state, int subsystemIndex = 0);
|
||||
void getDeviceEngineStateStr(QString& state, int subsystemIndex = 0) const;
|
||||
|
||||
ChannelAPI *getChanelSinkAPIAt(int index);
|
||||
ChannelAPI *getChanelSourceAPIAt(int index);
|
||||
@ -142,11 +142,7 @@ public:
|
||||
int getNbMIMOChannels() const { return m_mimoChannelAPIs.size(); }
|
||||
|
||||
void loadSamplingDeviceSettings(const Preset* preset);
|
||||
// void loadSourceSettings(const Preset* preset);
|
||||
// void loadSinkSettings(const Preset* preset);
|
||||
void saveSamplingDeviceSettings(Preset* preset);
|
||||
// void saveSourceSettings(Preset* preset);
|
||||
// void saveSinkSettings(Preset* preset);
|
||||
|
||||
QByteArray serialize() const override;
|
||||
bool deserialize(const QByteArray& data) override;
|
||||
@ -176,7 +172,7 @@ public:
|
||||
|
||||
const QTimer& getMasterTimer() const { return m_masterTimer; } //!< This is the DSPEngine master timer
|
||||
|
||||
protected:
|
||||
private:
|
||||
// common
|
||||
|
||||
StreamType m_streamType;
|
||||
@ -217,7 +213,6 @@ protected:
|
||||
DSPDeviceMIMOEngine *m_deviceMIMOEngine;
|
||||
QList<ChannelAPI*> m_mimoChannelAPIs;
|
||||
|
||||
private:
|
||||
void renumerateChannels();
|
||||
|
||||
private slots:
|
||||
|
@ -43,14 +43,14 @@ MESSAGE_CLASS_DEFINITION(DSPDeviceMIMOEngine::SetSpectrumSinkInput, Message)
|
||||
DSPDeviceMIMOEngine::DSPDeviceMIMOEngine(uint32_t uid, QObject* parent) :
|
||||
QObject(parent),
|
||||
m_uid(uid),
|
||||
m_stateRx(StNotStarted),
|
||||
m_stateTx(StNotStarted),
|
||||
m_stateRx(State::StNotStarted),
|
||||
m_stateTx(State::StNotStarted),
|
||||
m_deviceSampleMIMO(nullptr),
|
||||
m_spectrumInputSourceElseSink(true),
|
||||
m_spectrumInputIndex(0)
|
||||
{
|
||||
setStateRx(StIdle);
|
||||
setStateTx(StIdle);
|
||||
setStateRx(State::StIdle);
|
||||
setStateTx(State::StIdle);
|
||||
connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection);
|
||||
}
|
||||
|
||||
@ -127,7 +127,7 @@ void DSPDeviceMIMOEngine::stopProcess(int subsystemIndex)
|
||||
}
|
||||
else if (subsystemIndex == 1) // Tx side
|
||||
{
|
||||
DSPGenerationStop *cmd = new DSPGenerationStop();
|
||||
auto *cmd = new DSPGenerationStop();
|
||||
getInputMessageQueue()->push(cmd);
|
||||
}
|
||||
}
|
||||
@ -255,11 +255,9 @@ void DSPDeviceMIMOEngine::workSampleSinkFifos()
|
||||
unsigned int iPart2Begin;
|
||||
unsigned int iPart2End;
|
||||
const std::vector<SampleVector>& data = sampleFifo->getData();
|
||||
//unsigned int samplesDone = 0;
|
||||
|
||||
while ((sampleFifo->fillSync() > 0) && (m_inputMessageQueue.size() == 0))
|
||||
{
|
||||
//unsigned int count = sampleFifo->readSync(sampleFifo->fillSync(), iPart1Begin, iPart1End, iPart2Begin, iPart2End);
|
||||
sampleFifo->readSync(iPart1Begin, iPart1End, iPart2Begin, iPart2End);
|
||||
|
||||
if (iPart1Begin != iPart1End)
|
||||
@ -288,7 +286,10 @@ void DSPDeviceMIMOEngine::workSampleSourceFifos()
|
||||
|
||||
std::vector<SampleVector::iterator> vbegin;
|
||||
std::vector<SampleVector>& data = sampleFifo->getData();
|
||||
unsigned int iPart1Begin, iPart1End, iPart2Begin, iPart2End;
|
||||
unsigned int iPart1Begin;
|
||||
unsigned int iPart1End;
|
||||
unsigned int iPart2Begin;
|
||||
unsigned int iPart2End;
|
||||
unsigned int remainder = sampleFifo->remainderSync();
|
||||
|
||||
while ((remainder > 0) && (m_inputMessageQueue.size() == 0))
|
||||
@ -331,7 +332,6 @@ void DSPDeviceMIMOEngine::workSampleSinkFifo(unsigned int streamIndex)
|
||||
|
||||
while ((sampleFifo->fillAsync(streamIndex) > 0) && (m_inputMessageQueue.size() == 0))
|
||||
{
|
||||
//unsigned int count = sampleFifo->readAsync(sampleFifo->fillAsync(stream), &part1begin, &part1end, &part2begin, &part2end, stream);
|
||||
sampleFifo->readAsync(&part1begin, &part1end, &part2begin, &part2end, streamIndex);
|
||||
|
||||
if (part1begin != part1end) { // first part of FIFO data
|
||||
@ -354,7 +354,10 @@ void DSPDeviceMIMOEngine::workSampleSourceFifo(unsigned int streamIndex)
|
||||
}
|
||||
|
||||
SampleVector& data = sampleFifo->getData(streamIndex);
|
||||
unsigned int iPart1Begin, iPart1End, iPart2Begin, iPart2End;
|
||||
unsigned int iPart1Begin;
|
||||
unsigned int iPart1End;
|
||||
unsigned int iPart2Begin;
|
||||
unsigned int iPart2End;
|
||||
unsigned int amount = sampleFifo->remainderAsync(streamIndex);
|
||||
|
||||
while ((amount > 0) && (m_inputMessageQueue.size() == 0))
|
||||
@ -382,11 +385,6 @@ void DSPDeviceMIMOEngine::workSamplesSink(const SampleVector::const_iterator& vb
|
||||
std::map<int, bool>::const_iterator rcIt = m_rxRealElseComplex.find(streamIndex);
|
||||
bool positiveOnly = (rcIt == m_rxRealElseComplex.end() ? false : rcIt->second);
|
||||
|
||||
// DC and IQ corrections
|
||||
// if (m_sourcesCorrections[streamIndex].m_dcOffsetCorrection) {
|
||||
// iqCorrections(vbegin, vend, streamIndex, m_sourcesCorrections[streamIndex].m_iqImbalanceCorrection);
|
||||
// }
|
||||
|
||||
// feed data to direct sinks
|
||||
if (streamIndex < m_basebandSampleSinks.size())
|
||||
{
|
||||
@ -396,7 +394,7 @@ void DSPDeviceMIMOEngine::workSamplesSink(const SampleVector::const_iterator& vb
|
||||
}
|
||||
|
||||
// possibly feed data to spectrum sink
|
||||
if ((m_spectrumSink) && (m_spectrumInputSourceElseSink) && (streamIndex == m_spectrumInputIndex)) {
|
||||
if (m_spectrumSink && m_spectrumInputSourceElseSink && (streamIndex == m_spectrumInputIndex)) {
|
||||
m_spectrumSink->feed(vbegin, vend, positiveOnly);
|
||||
}
|
||||
|
||||
@ -445,14 +443,14 @@ void DSPDeviceMIMOEngine::workSamplesSource(SampleVector& data, unsigned int iBe
|
||||
for (; srcIt != m_basebandSampleSources[streamIndex].end(); ++srcIt, m_sumIndex++)
|
||||
{
|
||||
sampleSource = *srcIt;
|
||||
SampleVector::iterator aBegin = m_sourceSampleBuffers[streamIndex].m_vector.begin();
|
||||
auto aBegin = m_sourceSampleBuffers[streamIndex].m_vector.begin();
|
||||
sampleSource->pull(aBegin, nbSamples);
|
||||
std::transform(
|
||||
aBegin,
|
||||
aBegin + nbSamples,
|
||||
begin,
|
||||
begin,
|
||||
[this](Sample& a, const Sample& b) -> Sample {
|
||||
[this](Sample const& a, const Sample& b) -> Sample {
|
||||
FixReal den = m_sumIndex + 1; // at each stage scale sum by n/n+1 and input by 1/n+1
|
||||
FixReal nom = m_sumIndex; // so that final sum is scaled by N (number of channels)
|
||||
FixReal x = a.real()/den + nom*(b.real()/den);
|
||||
@ -468,7 +466,7 @@ void DSPDeviceMIMOEngine::workSamplesSource(SampleVector& data, unsigned int iBe
|
||||
std::map<int, bool>::const_iterator rcIt = m_txRealElseComplex.find(streamIndex);
|
||||
bool positiveOnly = (rcIt == m_txRealElseComplex.end() ? false : rcIt->second);
|
||||
|
||||
if ((m_spectrumSink) && (!m_spectrumInputSourceElseSink) && (streamIndex == m_spectrumInputIndex)) {
|
||||
if (m_spectrumSink && (!m_spectrumInputSourceElseSink) && (streamIndex == m_spectrumInputIndex)) {
|
||||
m_spectrumSink->feed(begin, begin + nbSamples, positiveOnly);
|
||||
}
|
||||
}
|
||||
@ -482,21 +480,21 @@ DSPDeviceMIMOEngine::State DSPDeviceMIMOEngine::gotoIdle(int subsystemIndex)
|
||||
qDebug() << "DSPDeviceMIMOEngine::gotoIdle: subsystemIndex:" << subsystemIndex;
|
||||
|
||||
if (!m_deviceSampleMIMO) {
|
||||
return StIdle;
|
||||
return State::StIdle;
|
||||
}
|
||||
|
||||
if (subsystemIndex == 0) // Rx
|
||||
{
|
||||
switch (m_stateRx) {
|
||||
case StNotStarted:
|
||||
return StNotStarted;
|
||||
case State::StNotStarted:
|
||||
return State::StNotStarted;
|
||||
|
||||
case StIdle:
|
||||
case StError:
|
||||
return StIdle;
|
||||
case State::StIdle:
|
||||
case State::StError:
|
||||
return State::StIdle;
|
||||
|
||||
case StReady:
|
||||
case StRunning:
|
||||
case State::StReady:
|
||||
case State::StRunning:
|
||||
break;
|
||||
}
|
||||
|
||||
@ -506,7 +504,7 @@ DSPDeviceMIMOEngine::State DSPDeviceMIMOEngine::gotoIdle(int subsystemIndex)
|
||||
|
||||
for (; vbit != m_basebandSampleSinks.end(); ++vbit)
|
||||
{
|
||||
for (BasebandSampleSinks::const_iterator it = vbit->begin(); it != vbit->end(); ++it)
|
||||
for (auto it = vbit->begin(); it != vbit->end(); ++it)
|
||||
{
|
||||
qDebug() << "DSPDeviceMIMOEngine::gotoIdle: stopping BasebandSampleSink: " << (*it)->getSinkName().toStdString().c_str();
|
||||
(*it)->stop();
|
||||
@ -522,15 +520,15 @@ DSPDeviceMIMOEngine::State DSPDeviceMIMOEngine::gotoIdle(int subsystemIndex)
|
||||
else if (subsystemIndex == 1) // Tx
|
||||
{
|
||||
switch (m_stateTx) {
|
||||
case StNotStarted:
|
||||
return StNotStarted;
|
||||
case State::StNotStarted:
|
||||
return State::StNotStarted;
|
||||
|
||||
case StIdle:
|
||||
case StError:
|
||||
return StIdle;
|
||||
case State::StIdle:
|
||||
case State::StError:
|
||||
return State::StIdle;
|
||||
|
||||
case StReady:
|
||||
case StRunning:
|
||||
case State::StReady:
|
||||
case State::StRunning:
|
||||
break;
|
||||
}
|
||||
|
||||
@ -540,7 +538,7 @@ DSPDeviceMIMOEngine::State DSPDeviceMIMOEngine::gotoIdle(int subsystemIndex)
|
||||
|
||||
for (; vSourceIt != m_basebandSampleSources.end(); vSourceIt++)
|
||||
{
|
||||
for (BasebandSampleSources::const_iterator it = vSourceIt->begin(); it != vSourceIt->end(); ++it)
|
||||
for (auto it = vSourceIt->begin(); it != vSourceIt->end(); ++it)
|
||||
{
|
||||
qDebug() << "DSPDeviceMIMOEngine::gotoIdle: stopping BasebandSampleSource(" << (*it)->getSourceName().toStdString().c_str() << ")";
|
||||
(*it)->stop();
|
||||
@ -555,12 +553,12 @@ DSPDeviceMIMOEngine::State DSPDeviceMIMOEngine::gotoIdle(int subsystemIndex)
|
||||
}
|
||||
else
|
||||
{
|
||||
return StIdle;
|
||||
return State::StIdle;
|
||||
}
|
||||
|
||||
m_deviceDescription.clear();
|
||||
|
||||
return StIdle;
|
||||
return State::StIdle;
|
||||
}
|
||||
|
||||
DSPDeviceMIMOEngine::State DSPDeviceMIMOEngine::gotoInit(int subsystemIndex)
|
||||
@ -578,17 +576,17 @@ DSPDeviceMIMOEngine::State DSPDeviceMIMOEngine::gotoInit(int subsystemIndex)
|
||||
if (subsystemIndex == 0) // Rx
|
||||
{
|
||||
switch(m_stateRx) {
|
||||
case StNotStarted:
|
||||
return StNotStarted;
|
||||
case State::StNotStarted:
|
||||
return State::StNotStarted;
|
||||
|
||||
case StRunning: // FIXME: assumes it goes first through idle state. Could we get back to init from running directly?
|
||||
return StRunning;
|
||||
case State::StRunning:
|
||||
return State::StRunning;
|
||||
|
||||
case StReady:
|
||||
return StReady;
|
||||
case State::StReady:
|
||||
return State::StReady;
|
||||
|
||||
case StIdle:
|
||||
case StError:
|
||||
case State::StIdle:
|
||||
case State::StError:
|
||||
break;
|
||||
}
|
||||
|
||||
@ -624,17 +622,17 @@ DSPDeviceMIMOEngine::State DSPDeviceMIMOEngine::gotoInit(int subsystemIndex)
|
||||
else if (subsystemIndex == 1) // Tx
|
||||
{
|
||||
switch(m_stateTx) {
|
||||
case StNotStarted:
|
||||
return StNotStarted;
|
||||
case State::StNotStarted:
|
||||
return State::StNotStarted;
|
||||
|
||||
case StRunning: // FIXME: assumes it goes first through idle state. Could we get back to init from running directly?
|
||||
return StRunning;
|
||||
case State::StRunning:
|
||||
return State::StRunning;
|
||||
|
||||
case StReady:
|
||||
return StReady;
|
||||
case State::StReady:
|
||||
return State::StReady;
|
||||
|
||||
case StIdle:
|
||||
case StError:
|
||||
case State::StIdle:
|
||||
case State::StError:
|
||||
break;
|
||||
}
|
||||
|
||||
@ -659,7 +657,7 @@ DSPDeviceMIMOEngine::State DSPDeviceMIMOEngine::gotoInit(int subsystemIndex)
|
||||
}
|
||||
}
|
||||
|
||||
return StReady;
|
||||
return State::StReady;
|
||||
}
|
||||
|
||||
DSPDeviceMIMOEngine::State DSPDeviceMIMOEngine::gotoRunning(int subsystemIndex)
|
||||
@ -676,17 +674,17 @@ DSPDeviceMIMOEngine::State DSPDeviceMIMOEngine::gotoRunning(int subsystemIndex)
|
||||
{
|
||||
switch (m_stateRx)
|
||||
{
|
||||
case StNotStarted:
|
||||
return StNotStarted;
|
||||
case State::StNotStarted:
|
||||
return State::StNotStarted;
|
||||
|
||||
case StIdle:
|
||||
return StIdle;
|
||||
case State::StIdle:
|
||||
return State::StIdle;
|
||||
|
||||
case StRunning:
|
||||
return StRunning;
|
||||
case State::StRunning:
|
||||
return State::StRunning;
|
||||
|
||||
case StReady:
|
||||
case StError:
|
||||
case State::StReady:
|
||||
case State::StError:
|
||||
break;
|
||||
}
|
||||
|
||||
@ -698,7 +696,7 @@ DSPDeviceMIMOEngine::State DSPDeviceMIMOEngine::gotoRunning(int subsystemIndex)
|
||||
|
||||
for (; vbit != m_basebandSampleSinks.end(); ++vbit)
|
||||
{
|
||||
for (BasebandSampleSinks::const_iterator it = vbit->begin(); it != vbit->end(); ++it)
|
||||
for (auto it = vbit->begin(); it != vbit->end(); ++it)
|
||||
{
|
||||
qDebug() << "DSPDeviceMIMOEngine::gotoRunning: starting BasebandSampleSink: " << (*it)->getSinkName().toStdString().c_str();
|
||||
(*it)->start();
|
||||
@ -715,17 +713,17 @@ DSPDeviceMIMOEngine::State DSPDeviceMIMOEngine::gotoRunning(int subsystemIndex)
|
||||
{
|
||||
switch (m_stateTx)
|
||||
{
|
||||
case StNotStarted:
|
||||
return StNotStarted;
|
||||
case State::StNotStarted:
|
||||
return State::StNotStarted;
|
||||
|
||||
case StIdle:
|
||||
return StIdle;
|
||||
case State::StIdle:
|
||||
return State::StIdle;
|
||||
|
||||
case StRunning:
|
||||
return StRunning;
|
||||
case State::StRunning:
|
||||
return State::StRunning;
|
||||
|
||||
case StReady:
|
||||
case StError:
|
||||
case State::StReady:
|
||||
case State::StError:
|
||||
break;
|
||||
}
|
||||
|
||||
@ -737,7 +735,7 @@ DSPDeviceMIMOEngine::State DSPDeviceMIMOEngine::gotoRunning(int subsystemIndex)
|
||||
|
||||
for (; vSourceIt != m_basebandSampleSources.end(); vSourceIt++)
|
||||
{
|
||||
for (BasebandSampleSources::const_iterator it = vSourceIt->begin(); it != vSourceIt->end(); ++it)
|
||||
for (auto it = vSourceIt->begin(); it != vSourceIt->end(); ++it)
|
||||
{
|
||||
qDebug() << "DSPDeviceMIMOEngine::gotoRunning: starting BasebandSampleSource(" << (*it)->getSourceName().toStdString().c_str() << ")";
|
||||
(*it)->start();
|
||||
@ -753,7 +751,7 @@ DSPDeviceMIMOEngine::State DSPDeviceMIMOEngine::gotoRunning(int subsystemIndex)
|
||||
|
||||
qDebug() << "DSPDeviceMIMOEngine::gotoRunning:input message queue pending: " << m_inputMessageQueue.size();
|
||||
|
||||
return StRunning;
|
||||
return State::StRunning;
|
||||
}
|
||||
|
||||
DSPDeviceMIMOEngine::State DSPDeviceMIMOEngine::gotoError(int subsystemIndex, const QString& errorMessage)
|
||||
@ -765,42 +763,42 @@ DSPDeviceMIMOEngine::State DSPDeviceMIMOEngine::gotoError(int subsystemIndex, co
|
||||
|
||||
if (subsystemIndex == 0)
|
||||
{
|
||||
m_errorMessageRx = errorMessage;
|
||||
setStateRx(StError);
|
||||
m_errorMessageRx = errorMessage;
|
||||
setStateRx(State::StError);
|
||||
}
|
||||
else if (subsystemIndex == 1)
|
||||
{
|
||||
m_errorMessageTx = errorMessage;
|
||||
setStateTx(StError);
|
||||
m_errorMessageTx = errorMessage;
|
||||
setStateTx(State::StError);
|
||||
}
|
||||
|
||||
return StError;
|
||||
return State::StError;
|
||||
}
|
||||
|
||||
void DSPDeviceMIMOEngine::handleDataRxSync()
|
||||
{
|
||||
if (m_stateRx == StRunning) {
|
||||
if (m_stateRx == State::StRunning) {
|
||||
workSampleSinkFifos();
|
||||
}
|
||||
}
|
||||
|
||||
void DSPDeviceMIMOEngine::handleDataRxAsync(int streamIndex)
|
||||
{
|
||||
if (m_stateRx == StRunning) {
|
||||
if (m_stateRx == State::StRunning) {
|
||||
workSampleSinkFifo(streamIndex);
|
||||
}
|
||||
}
|
||||
|
||||
void DSPDeviceMIMOEngine::handleDataTxSync()
|
||||
{
|
||||
if (m_stateTx == StRunning) {
|
||||
if (m_stateTx == State::StRunning) {
|
||||
workSampleSourceFifos();
|
||||
}
|
||||
}
|
||||
|
||||
void DSPDeviceMIMOEngine::handleDataTxAsync(int streamIndex)
|
||||
{
|
||||
if (m_stateTx == StRunning) {
|
||||
if (m_stateTx == State::StRunning) {
|
||||
workSampleSourceFifo(streamIndex);
|
||||
}
|
||||
}
|
||||
@ -815,21 +813,20 @@ void DSPDeviceMIMOEngine::handleSetMIMO(DeviceSampleMIMO* mimo)
|
||||
|
||||
for (unsigned int i = 0; i < m_deviceSampleMIMO->getNbSinkFifos(); i++)
|
||||
{
|
||||
m_basebandSampleSinks.push_back(BasebandSampleSinks());
|
||||
m_sourcesCorrections.push_back(SourceCorrection());
|
||||
m_basebandSampleSinks.emplace_back();
|
||||
m_sourcesCorrections.emplace_back();
|
||||
}
|
||||
|
||||
for (unsigned int i = 0; i < m_deviceSampleMIMO->getNbSourceFifos(); i++)
|
||||
{
|
||||
m_basebandSampleSources.push_back(BasebandSampleSources());
|
||||
m_sourceSampleBuffers.push_back(IncrementalVector<Sample>());
|
||||
m_sourceZeroBuffers.push_back(IncrementalVector<Sample>());
|
||||
m_basebandSampleSources.emplace_back();
|
||||
m_sourceSampleBuffers.emplace_back();
|
||||
m_sourceZeroBuffers.emplace_back();
|
||||
}
|
||||
|
||||
if (m_deviceSampleMIMO->getMIMOType() == DeviceSampleMIMO::MIMOHalfSynchronous) // synchronous FIFOs on Rx and not with Tx
|
||||
{
|
||||
qDebug("DSPDeviceMIMOEngine::handleSetMIMO: synchronous sources set %s", qPrintable(mimo->getDeviceDescription()));
|
||||
// connect(m_deviceSampleMIMO->getSampleSinkFifo(m_sampleSinkConnectionIndexes[0]), SIGNAL(dataReady()), this, SLOT(handleData()), Qt::QueuedConnection);
|
||||
QObject::connect(
|
||||
m_deviceSampleMIMO->getSampleMIFifo(),
|
||||
&SampleMIFifo::dataSyncReady,
|
||||
@ -865,13 +862,6 @@ void DSPDeviceMIMOEngine::handleSetMIMO(DeviceSampleMIMO* mimo)
|
||||
&DSPDeviceMIMOEngine::handleDataTxAsync,
|
||||
Qt::QueuedConnection
|
||||
);
|
||||
// QObject::connect(
|
||||
// m_deviceSampleMIMO->getSampleSinkFifo(stream),
|
||||
// &SampleSinkFifo::dataReady,
|
||||
// this,
|
||||
// [=](){ this->handleDataRxAsync(stream); },
|
||||
// Qt::QueuedConnection
|
||||
// );
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -950,7 +940,7 @@ bool DSPDeviceMIMOEngine::handleMessage(const Message& message)
|
||||
{
|
||||
if (sourceElseSink)
|
||||
{
|
||||
if ((istream < m_deviceSampleMIMO->getNbSourceStreams()))
|
||||
if (istream < m_deviceSampleMIMO->getNbSourceStreams())
|
||||
{
|
||||
|
||||
// forward source changes to ancillary sinks
|
||||
@ -983,7 +973,7 @@ bool DSPDeviceMIMOEngine::handleMessage(const Message& message)
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((istream < m_deviceSampleMIMO->getNbSinkStreams()))
|
||||
if (istream < m_deviceSampleMIMO->getNbSinkStreams())
|
||||
{
|
||||
|
||||
// forward source changes to channel sources with immediate execution (no queuing)
|
||||
@ -1023,7 +1013,7 @@ bool DSPDeviceMIMOEngine::handleMessage(const Message& message)
|
||||
{
|
||||
setStateRx(gotoIdle(0));
|
||||
|
||||
if (m_stateRx == StIdle) {
|
||||
if (m_stateRx == State::StIdle) {
|
||||
setStateRx(gotoInit(0)); // State goes ready if init is performed
|
||||
}
|
||||
|
||||
@ -1031,7 +1021,7 @@ bool DSPDeviceMIMOEngine::handleMessage(const Message& message)
|
||||
}
|
||||
else if (DSPAcquisitionStart::match(message))
|
||||
{
|
||||
if (m_stateRx == StReady) {
|
||||
if (m_stateRx == State::StReady) {
|
||||
setStateRx(gotoRunning(0));
|
||||
}
|
||||
|
||||
@ -1046,7 +1036,7 @@ bool DSPDeviceMIMOEngine::handleMessage(const Message& message)
|
||||
{
|
||||
setStateTx(gotoIdle(1));
|
||||
|
||||
if (m_stateTx == StIdle) {
|
||||
if (m_stateTx == State::StIdle) {
|
||||
setStateTx(gotoInit(1)); // State goes ready if init is performed
|
||||
}
|
||||
|
||||
@ -1054,7 +1044,7 @@ bool DSPDeviceMIMOEngine::handleMessage(const Message& message)
|
||||
}
|
||||
else if (DSPGenerationStart::match(message))
|
||||
{
|
||||
if (m_stateTx == StReady) {
|
||||
if (m_stateTx == State::StReady) {
|
||||
setStateTx(gotoRunning(1));
|
||||
}
|
||||
|
||||
@ -1085,7 +1075,7 @@ bool DSPDeviceMIMOEngine::handleMessage(const Message& message)
|
||||
auto *msgToSink = new DSPSignalNotification(sourceStreamSampleRate, sourceCenterFrequency);
|
||||
sink->pushMessage(msgToSink);
|
||||
// start the sink:
|
||||
if (m_stateRx == StRunning) {
|
||||
if (m_stateRx == State::StRunning) {
|
||||
sink->start();
|
||||
}
|
||||
}
|
||||
@ -1100,7 +1090,7 @@ bool DSPDeviceMIMOEngine::handleMessage(const Message& message)
|
||||
|
||||
if (isource < m_basebandSampleSinks.size())
|
||||
{
|
||||
if (m_stateRx == StRunning) {
|
||||
if (m_stateRx == State::StRunning) {
|
||||
sink->stop();
|
||||
}
|
||||
|
||||
@ -1124,7 +1114,7 @@ bool DSPDeviceMIMOEngine::handleMessage(const Message& message)
|
||||
auto *msgToSource = new DSPSignalNotification(sinkStreamSampleRate, sinkCenterFrequency);
|
||||
sampleSource->pushMessage(msgToSource);
|
||||
// start the sink:
|
||||
if (m_stateTx == StRunning) {
|
||||
if (m_stateTx == State::StRunning) {
|
||||
sampleSource->start();
|
||||
}
|
||||
}
|
||||
@ -1173,11 +1163,11 @@ bool DSPDeviceMIMOEngine::handleMessage(const Message& message)
|
||||
channel->pushMessage(notif);
|
||||
}
|
||||
|
||||
if (m_stateRx == StRunning) {
|
||||
if (m_stateRx == State::StRunning) {
|
||||
channel->startSinks();
|
||||
}
|
||||
|
||||
if (m_stateTx == StRunning) {
|
||||
if (m_stateTx == State::StRunning) {
|
||||
channel->startSources();
|
||||
}
|
||||
|
||||
@ -1214,15 +1204,14 @@ bool DSPDeviceMIMOEngine::handleMessage(const Message& message)
|
||||
|
||||
if ((spectrumInputSourceElseSink != m_spectrumInputSourceElseSink) || (spectrumInputIndex != m_spectrumInputIndex))
|
||||
{
|
||||
if ((!spectrumInputSourceElseSink) && (spectrumInputIndex < m_deviceSampleMIMO->getNbSinkStreams())) // add the source listener
|
||||
if ((!spectrumInputSourceElseSink)
|
||||
&& (spectrumInputIndex < m_deviceSampleMIMO->getNbSinkStreams())
|
||||
&& m_spectrumSink) // add the source listener
|
||||
{
|
||||
if (m_spectrumSink)
|
||||
{
|
||||
auto *notif = new DSPSignalNotification(
|
||||
m_deviceSampleMIMO->getSinkSampleRate(spectrumInputIndex),
|
||||
m_deviceSampleMIMO->getSinkCenterFrequency(spectrumInputIndex));
|
||||
m_spectrumSink->pushMessage(notif);
|
||||
}
|
||||
auto *notif = new DSPSignalNotification(
|
||||
m_deviceSampleMIMO->getSinkSampleRate(spectrumInputIndex),
|
||||
m_deviceSampleMIMO->getSinkCenterFrequency(spectrumInputIndex));
|
||||
m_spectrumSink->pushMessage(notif);
|
||||
}
|
||||
|
||||
if (m_spectrumSink && spectrumInputSourceElseSink && (spectrumInputIndex < m_deviceSampleMIMO->getNbSinkFifos()))
|
||||
@ -1248,7 +1237,7 @@ void DSPDeviceMIMOEngine::handleInputMessages()
|
||||
{
|
||||
Message* message;
|
||||
|
||||
while ((message = m_inputMessageQueue.pop()) != 0)
|
||||
while ((message = m_inputMessageQueue.pop()) != nullptr)
|
||||
{
|
||||
qDebug("DSPDeviceMIMOEngine::handleInputMessages: message: %s", message->getIdentifier());
|
||||
|
||||
@ -1261,7 +1250,7 @@ void DSPDeviceMIMOEngine::handleInputMessages()
|
||||
void DSPDeviceMIMOEngine::configureCorrections(bool dcOffsetCorrection, bool iqImbalanceCorrection, int isource)
|
||||
{
|
||||
qDebug() << "DSPDeviceMIMOEngine::configureCorrections";
|
||||
ConfigureCorrection* cmd = new ConfigureCorrection(dcOffsetCorrection, iqImbalanceCorrection, isource);
|
||||
auto* cmd = new ConfigureCorrection(dcOffsetCorrection, iqImbalanceCorrection, isource);
|
||||
m_inputMessageQueue.push(cmd);
|
||||
}
|
||||
|
||||
@ -1313,8 +1302,8 @@ void DSPDeviceMIMOEngine::iqCorrections(SampleVector::iterator begin, SampleVect
|
||||
|
||||
#else
|
||||
// DC correction and conversion
|
||||
float xi = (it->m_real - (int32_t) m_sourcesCorrections[isource].m_iBeta) / SDR_RX_SCALEF;
|
||||
float xq = (it->m_imag - (int32_t) m_sourcesCorrections[isource].m_qBeta) / SDR_RX_SCALEF;
|
||||
float xi = (float) (it->m_real - (int32_t) m_sourcesCorrections[isource].m_iBeta) / SDR_RX_SCALEF;
|
||||
float xq = (float) (it->m_imag - (int32_t) m_sourcesCorrections[isource].m_qBeta) / SDR_RX_SCALEF;
|
||||
|
||||
// phase imbalance
|
||||
m_sourcesCorrections[isource].m_avgII(xi*xi); // <I", I">
|
||||
@ -1325,8 +1314,8 @@ void DSPDeviceMIMOEngine::iqCorrections(SampleVector::iterator begin, SampleVect
|
||||
m_sourcesCorrections[isource].m_avgPhi(m_sourcesCorrections[isource].m_avgIQ.asDouble()/m_sourcesCorrections[isource].m_avgII.asDouble());
|
||||
}
|
||||
|
||||
float& yi = xi; // the in phase remains the reference
|
||||
float yq = xq - m_sourcesCorrections[isource].m_avgPhi.asDouble()*xi;
|
||||
const float& yi = xi; // the in phase remains the reference
|
||||
float yq = xq - (float) m_sourcesCorrections[isource].m_avgPhi.asDouble()*xi;
|
||||
|
||||
// amplitude I/Q imbalance
|
||||
m_sourcesCorrections[isource].m_avgII2(yi*yi); // <I, I>
|
||||
@ -1337,12 +1326,12 @@ void DSPDeviceMIMOEngine::iqCorrections(SampleVector::iterator begin, SampleVect
|
||||
}
|
||||
|
||||
// final correction
|
||||
float& zi = yi; // the in phase remains the reference
|
||||
float zq = m_sourcesCorrections[isource].m_avgAmp.asDouble() * yq;
|
||||
const float& zi = yi; // the in phase remains the reference
|
||||
auto zq = (float) (m_sourcesCorrections[isource].m_avgAmp.asDouble() * yq);
|
||||
|
||||
// convert and store
|
||||
it->m_real = zi * SDR_RX_SCALEF;
|
||||
it->m_imag = zq * SDR_RX_SCALEF;
|
||||
it->m_real = (FixReal) (zi * SDR_RX_SCALEF);
|
||||
it->m_imag = (FixReal) (zq * SDR_RX_SCALEF);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
|
@ -40,7 +40,7 @@ public:
|
||||
class SetSampleMIMO : public Message {
|
||||
MESSAGE_CLASS_DECLARATION
|
||||
public:
|
||||
SetSampleMIMO(DeviceSampleMIMO* sampleMIMO) : Message(), m_sampleMIMO(sampleMIMO) { }
|
||||
explicit SetSampleMIMO(DeviceSampleMIMO* sampleMIMO) : Message(), m_sampleMIMO(sampleMIMO) { }
|
||||
DeviceSampleMIMO* getSampleMIMO() const { return m_sampleMIMO; }
|
||||
private:
|
||||
DeviceSampleMIMO* m_sampleMIMO;
|
||||
@ -80,7 +80,7 @@ public:
|
||||
class AddMIMOChannel : public Message {
|
||||
MESSAGE_CLASS_DECLARATION
|
||||
public:
|
||||
AddMIMOChannel(MIMOChannel* channel) :
|
||||
explicit AddMIMOChannel(MIMOChannel* channel) :
|
||||
Message(),
|
||||
m_channel(channel)
|
||||
{ }
|
||||
@ -92,7 +92,7 @@ public:
|
||||
class RemoveMIMOChannel : public Message {
|
||||
MESSAGE_CLASS_DECLARATION
|
||||
public:
|
||||
RemoveMIMOChannel(MIMOChannel* channel) :
|
||||
explicit RemoveMIMOChannel(MIMOChannel* channel) :
|
||||
Message(),
|
||||
m_channel(channel)
|
||||
{ }
|
||||
@ -134,7 +134,7 @@ public:
|
||||
class AddSpectrumSink : public Message {
|
||||
MESSAGE_CLASS_DECLARATION
|
||||
public:
|
||||
AddSpectrumSink(BasebandSampleSink* sampleSink) : Message(), m_sampleSink(sampleSink) { }
|
||||
explicit AddSpectrumSink(BasebandSampleSink* sampleSink) : Message(), m_sampleSink(sampleSink) { }
|
||||
BasebandSampleSink* getSampleSink() const { return m_sampleSink; }
|
||||
private:
|
||||
BasebandSampleSink* m_sampleSink;
|
||||
@ -143,7 +143,7 @@ public:
|
||||
class RemoveSpectrumSink : public Message {
|
||||
MESSAGE_CLASS_DECLARATION
|
||||
public:
|
||||
RemoveSpectrumSink(BasebandSampleSink* sampleSink) : Message(), m_sampleSink(sampleSink) { }
|
||||
explicit RemoveSpectrumSink(BasebandSampleSink* sampleSink) : Message(), m_sampleSink(sampleSink) { }
|
||||
BasebandSampleSink* getSampleSink() const { return m_sampleSink; }
|
||||
private:
|
||||
BasebandSampleSink* m_sampleSink;
|
||||
@ -152,7 +152,7 @@ public:
|
||||
class GetErrorMessage : public Message {
|
||||
MESSAGE_CLASS_DECLARATION
|
||||
public:
|
||||
GetErrorMessage(unsigned int subsystemIndex) :
|
||||
explicit GetErrorMessage(unsigned int subsystemIndex) :
|
||||
m_subsystemIndex(subsystemIndex)
|
||||
{}
|
||||
void setErrorMessage(const QString& text) { m_errorMessage = text; }
|
||||
@ -204,7 +204,7 @@ public:
|
||||
int m_index;
|
||||
};
|
||||
|
||||
enum State {
|
||||
enum class State {
|
||||
StNotStarted, //!< engine is before initialization
|
||||
StIdle, //!< engine is idle
|
||||
StReady, //!< engine is ready to run
|
||||
@ -244,7 +244,7 @@ public:
|
||||
} else if (subsystemIndex == 1) {
|
||||
return m_stateTx;
|
||||
} else {
|
||||
return StNotStarted;
|
||||
return State::StNotStarted;
|
||||
}
|
||||
}
|
||||
|
||||
@ -256,13 +256,13 @@ public:
|
||||
private:
|
||||
struct SourceCorrection
|
||||
{
|
||||
bool m_dcOffsetCorrection;
|
||||
bool m_iqImbalanceCorrection;
|
||||
double m_iOffset;
|
||||
double m_qOffset;
|
||||
int m_iRange;
|
||||
int m_qRange;
|
||||
int m_imbalance;
|
||||
bool m_dcOffsetCorrection = false;
|
||||
bool m_iqImbalanceCorrection = false;
|
||||
double m_iOffset = 0;
|
||||
double m_qOffset = 0;
|
||||
int m_iRange = 1 << 16;
|
||||
int m_qRange = 1 << 16;
|
||||
int m_imbalance = 65536;
|
||||
MovingAverageUtil<int32_t, int64_t, 1024> m_iBeta;
|
||||
MovingAverageUtil<int32_t, int64_t, 1024> m_qBeta;
|
||||
#if IMBALANCE_INT
|
||||
@ -284,13 +284,6 @@ private:
|
||||
#endif
|
||||
SourceCorrection()
|
||||
{
|
||||
m_dcOffsetCorrection = false;
|
||||
m_iqImbalanceCorrection = false;
|
||||
m_iOffset = 0;
|
||||
m_qOffset = 0;
|
||||
m_iRange = 1 << 16;
|
||||
m_qRange = 1 << 16;
|
||||
m_imbalance = 65536;
|
||||
m_iBeta.reset();
|
||||
m_qBeta.reset();
|
||||
m_avgAmp.reset();
|
||||
@ -317,17 +310,17 @@ private:
|
||||
|
||||
MessageQueue m_inputMessageQueue; //<! Input message queue. Post here.
|
||||
|
||||
typedef std::list<BasebandSampleSink*> BasebandSampleSinks;
|
||||
using BasebandSampleSinks = std::list<BasebandSampleSink *>;
|
||||
std::vector<BasebandSampleSinks> m_basebandSampleSinks; //!< ancillary sample sinks on main thread (per input stream)
|
||||
std::map<int, bool> m_rxRealElseComplex; //!< map of real else complex indicators for device sources (by input stream)
|
||||
typedef std::list<BasebandSampleSource*> BasebandSampleSources;
|
||||
using BasebandSampleSources = std::list<BasebandSampleSource *>;
|
||||
std::vector<BasebandSampleSources> m_basebandSampleSources; //!< channel sample sources (per output stream)
|
||||
std::map<int, bool> m_txRealElseComplex; //!< map of real else complex indicators for device sinks (by input stream)
|
||||
std::vector<IncrementalVector<Sample>> m_sourceSampleBuffers;
|
||||
std::vector<IncrementalVector<Sample>> m_sourceZeroBuffers;
|
||||
unsigned int m_sumIndex; //!< channel index when summing channels
|
||||
|
||||
typedef std::list<MIMOChannel*> MIMOChannels;
|
||||
using MIMOChannels = std::list<MIMOChannel *>;
|
||||
MIMOChannels m_mimoChannels; //!< MIMO channels
|
||||
|
||||
std::vector<SourceCorrection> m_sourcesCorrections;
|
||||
|
@ -30,7 +30,7 @@
|
||||
DSPDeviceSinkEngine::DSPDeviceSinkEngine(uint32_t uid, QObject* parent) :
|
||||
QObject(parent),
|
||||
m_uid(uid),
|
||||
m_state(StNotStarted),
|
||||
m_state(State::StNotStarted),
|
||||
m_deviceSampleSink(nullptr),
|
||||
m_sampleSinkSequence(0),
|
||||
m_basebandSampleSources(),
|
||||
@ -39,7 +39,7 @@ DSPDeviceSinkEngine::DSPDeviceSinkEngine(uint32_t uid, QObject* parent) :
|
||||
m_centerFrequency(0),
|
||||
m_realElseComplex(false)
|
||||
{
|
||||
setState(StIdle);
|
||||
setState(State::StIdle);
|
||||
connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection);
|
||||
}
|
||||
|
||||
@ -121,13 +121,13 @@ void DSPDeviceSinkEngine::removeSpectrumSink(BasebandSampleSink* spectrumSink)
|
||||
getInputMessageQueue()->push(cmd);
|
||||
}
|
||||
|
||||
QString DSPDeviceSinkEngine::errorMessage()
|
||||
QString DSPDeviceSinkEngine::errorMessage() const
|
||||
{
|
||||
qDebug() << "DSPDeviceSinkEngine::errorMessage";
|
||||
return m_errorMessage;
|
||||
}
|
||||
|
||||
QString DSPDeviceSinkEngine::sinkDeviceDescription()
|
||||
QString DSPDeviceSinkEngine::sinkDeviceDescription() const
|
||||
{
|
||||
qDebug() << "DSPDeviceSinkEngine::sinkDeviceDescription";
|
||||
return m_deviceDescription;
|
||||
@ -202,7 +202,7 @@ void DSPDeviceSinkEngine::workSamples(SampleVector& data, unsigned int iBegin, u
|
||||
sBegin + nbSamples,
|
||||
data.begin() + iBegin,
|
||||
data.begin() + iBegin,
|
||||
[this](Sample& a, const Sample& b) -> Sample {
|
||||
[this](const Sample& a, const Sample& b) -> Sample {
|
||||
FixReal den = m_sumIndex + 1; // at each stage scale sum by n/n+1 and input by 1/n+1
|
||||
FixReal nom = m_sumIndex; // so that final sum is scaled by N (number of channels)
|
||||
FixReal x = a.real()/den + nom*(b.real()/den);
|
||||
@ -228,20 +228,20 @@ DSPDeviceSinkEngine::State DSPDeviceSinkEngine::gotoIdle()
|
||||
qDebug() << "DSPDeviceSinkEngine::gotoIdle";
|
||||
|
||||
switch(m_state) {
|
||||
case StNotStarted:
|
||||
return StNotStarted;
|
||||
case State::StNotStarted:
|
||||
return State::StNotStarted;
|
||||
|
||||
case StIdle:
|
||||
case StError:
|
||||
return StIdle;
|
||||
case State::StIdle:
|
||||
case State::StError:
|
||||
return State::StIdle;
|
||||
|
||||
case StReady:
|
||||
case StRunning:
|
||||
case State::StReady:
|
||||
case State::StRunning:
|
||||
break;
|
||||
}
|
||||
|
||||
if (!m_deviceSampleSink) {
|
||||
return StIdle;
|
||||
return State::StIdle;
|
||||
}
|
||||
|
||||
// stop everything
|
||||
@ -256,23 +256,23 @@ DSPDeviceSinkEngine::State DSPDeviceSinkEngine::gotoIdle()
|
||||
m_deviceDescription.clear();
|
||||
m_sampleRate = 0;
|
||||
|
||||
return StIdle;
|
||||
return State::StIdle;
|
||||
}
|
||||
|
||||
DSPDeviceSinkEngine::State DSPDeviceSinkEngine::gotoInit()
|
||||
{
|
||||
switch(m_state) {
|
||||
case StNotStarted:
|
||||
return StNotStarted;
|
||||
case State::StNotStarted:
|
||||
return State::StNotStarted;
|
||||
|
||||
case StRunning: // FIXME: assumes it goes first through idle state. Could we get back to init from running directly?
|
||||
return StRunning;
|
||||
case State::StRunning:
|
||||
return State::StRunning;
|
||||
|
||||
case StReady:
|
||||
return StReady;
|
||||
case State::StReady:
|
||||
return State::StReady;
|
||||
|
||||
case StIdle:
|
||||
case StError:
|
||||
case State::StIdle:
|
||||
case State::StError:
|
||||
break;
|
||||
}
|
||||
|
||||
@ -310,7 +310,7 @@ DSPDeviceSinkEngine::State DSPDeviceSinkEngine::gotoInit()
|
||||
m_deviceSampleSink->getMessageQueueToGUI()->push(rep);
|
||||
}
|
||||
|
||||
return StReady;
|
||||
return State::StReady;
|
||||
}
|
||||
|
||||
DSPDeviceSinkEngine::State DSPDeviceSinkEngine::gotoRunning()
|
||||
@ -319,17 +319,17 @@ DSPDeviceSinkEngine::State DSPDeviceSinkEngine::gotoRunning()
|
||||
|
||||
switch(m_state)
|
||||
{
|
||||
case StNotStarted:
|
||||
return StNotStarted;
|
||||
case State::StNotStarted:
|
||||
return State::StNotStarted;
|
||||
|
||||
case StIdle:
|
||||
return StIdle;
|
||||
case State::StIdle:
|
||||
return State::StIdle;
|
||||
|
||||
case StRunning:
|
||||
return StRunning;
|
||||
case State::StRunning:
|
||||
return State::StRunning;
|
||||
|
||||
case StReady:
|
||||
case StError:
|
||||
case State::StReady:
|
||||
case State::StError:
|
||||
break;
|
||||
}
|
||||
|
||||
@ -358,7 +358,7 @@ DSPDeviceSinkEngine::State DSPDeviceSinkEngine::gotoRunning()
|
||||
|
||||
qDebug() << "DSPDeviceSinkEngine::gotoRunning: input message queue pending: " << m_inputMessageQueue.size();
|
||||
|
||||
return StRunning;
|
||||
return State::StRunning;
|
||||
}
|
||||
|
||||
DSPDeviceSinkEngine::State DSPDeviceSinkEngine::gotoError(const QString& errorMessage)
|
||||
@ -367,11 +367,11 @@ DSPDeviceSinkEngine::State DSPDeviceSinkEngine::gotoError(const QString& errorMe
|
||||
|
||||
m_errorMessage = errorMessage;
|
||||
m_deviceDescription.clear();
|
||||
setState(StError);
|
||||
return StError;
|
||||
setState(State::StError);
|
||||
return State::StError;
|
||||
}
|
||||
|
||||
void DSPDeviceSinkEngine::handleSetSink(DeviceSampleSink*)
|
||||
void DSPDeviceSinkEngine::handleSetSink(const DeviceSampleSink*)
|
||||
{
|
||||
if (!m_deviceSampleSink) { // Early leave
|
||||
return;
|
||||
@ -390,7 +390,7 @@ void DSPDeviceSinkEngine::handleSetSink(DeviceSampleSink*)
|
||||
|
||||
void DSPDeviceSinkEngine::handleData()
|
||||
{
|
||||
if (m_state == StRunning) {
|
||||
if (m_state == State::StRunning) {
|
||||
workSampleFifo();
|
||||
}
|
||||
}
|
||||
@ -441,7 +441,7 @@ bool DSPDeviceSinkEngine::handleMessage(const Message& message)
|
||||
{
|
||||
setState(gotoIdle());
|
||||
|
||||
if(m_state == StIdle) {
|
||||
if(m_state == State::StIdle) {
|
||||
setState(gotoInit()); // State goes ready if init is performed
|
||||
}
|
||||
|
||||
@ -449,7 +449,7 @@ bool DSPDeviceSinkEngine::handleMessage(const Message& message)
|
||||
}
|
||||
else if (DSPGenerationStart::match(message))
|
||||
{
|
||||
if(m_state == StReady) {
|
||||
if(m_state == State::StReady) {
|
||||
setState(gotoRunning());
|
||||
}
|
||||
|
||||
@ -462,7 +462,7 @@ bool DSPDeviceSinkEngine::handleMessage(const Message& message)
|
||||
}
|
||||
else if (DSPSetSink::match(message))
|
||||
{
|
||||
const DSPSetSink& cmd = (const DSPSetSink&) message;
|
||||
const auto& cmd = (const DSPSetSink&) message;
|
||||
handleSetSink(cmd.getSampleSink());
|
||||
return true;
|
||||
}
|
||||
@ -471,7 +471,7 @@ bool DSPDeviceSinkEngine::handleMessage(const Message& message)
|
||||
auto& cmd = (const DSPRemoveSpectrumSink&) message;
|
||||
BasebandSampleSink* spectrumSink = cmd.getSampleSink();
|
||||
|
||||
if(m_state == StRunning) {
|
||||
if(m_state == State::StRunning) {
|
||||
spectrumSink->stop();
|
||||
}
|
||||
|
||||
@ -486,7 +486,7 @@ bool DSPDeviceSinkEngine::handleMessage(const Message& message)
|
||||
auto *notif = new DSPSignalNotification(m_sampleRate, m_centerFrequency);
|
||||
source->pushMessage(notif);
|
||||
|
||||
if (m_state == StRunning) {
|
||||
if (m_state == State::StRunning) {
|
||||
source->start();
|
||||
}
|
||||
|
||||
@ -497,7 +497,7 @@ bool DSPDeviceSinkEngine::handleMessage(const Message& message)
|
||||
auto& cmd = (const DSPRemoveBasebandSampleSource&) message;
|
||||
BasebandSampleSource* source = cmd.getSampleSource();
|
||||
|
||||
if(m_state == StRunning) {
|
||||
if(m_state == State::StRunning) {
|
||||
source->stop();
|
||||
}
|
||||
|
||||
|
@ -44,7 +44,7 @@ class SDRBASE_API DSPDeviceSinkEngine : public QObject {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
enum State {
|
||||
enum class State {
|
||||
StNotStarted, //!< engine is before initialization
|
||||
StIdle, //!< engine is idle
|
||||
StReady, //!< engine is ready to run
|
||||
@ -53,7 +53,7 @@ public:
|
||||
};
|
||||
|
||||
DSPDeviceSinkEngine(uint32_t uid, QObject* parent = nullptr);
|
||||
~DSPDeviceSinkEngine();
|
||||
~DSPDeviceSinkEngine() final;
|
||||
|
||||
uint32_t getUID() const { return m_uid; }
|
||||
|
||||
@ -75,8 +75,8 @@ public:
|
||||
|
||||
State state() const { return m_state; } //!< Return DSP engine current state
|
||||
|
||||
QString errorMessage(); //!< Return the current error message
|
||||
QString sinkDeviceDescription(); //!< Return the sink device description
|
||||
QString errorMessage() const; //!< Return the current error message
|
||||
QString sinkDeviceDescription() const; //!< Return the sink device description
|
||||
|
||||
private:
|
||||
uint32_t m_uid; //!< unique ID
|
||||
@ -91,7 +91,7 @@ private:
|
||||
DeviceSampleSink* m_deviceSampleSink;
|
||||
int m_sampleSinkSequence;
|
||||
|
||||
typedef std::list<BasebandSampleSource*> BasebandSampleSources;
|
||||
using BasebandSampleSources = std::list<BasebandSampleSource *>;
|
||||
BasebandSampleSources m_basebandSampleSources; //!< baseband sample sources within main thread (usually file input)
|
||||
|
||||
BasebandSampleSink *m_spectrumSink;
|
||||
@ -112,7 +112,7 @@ private:
|
||||
State gotoError(const QString& errorMsg); //!< Go to an error state
|
||||
void setState(State state);
|
||||
|
||||
void handleSetSink(DeviceSampleSink* sink); //!< Manage sink setting
|
||||
void handleSetSink(const DeviceSampleSink* sink); //!< Manage sink setting
|
||||
bool handleMessage(const Message& cmd);
|
||||
|
||||
private slots:
|
||||
|
@ -31,7 +31,7 @@
|
||||
DSPDeviceSourceEngine::DSPDeviceSourceEngine(uint uid, QObject* parent) :
|
||||
QObject(parent),
|
||||
m_uid(uid),
|
||||
m_state(StNotStarted),
|
||||
m_state(State::StNotStarted),
|
||||
m_deviceSampleSource(nullptr),
|
||||
m_sampleSourceSequence(0),
|
||||
m_basebandSampleSinks(),
|
||||
@ -46,7 +46,7 @@ DSPDeviceSourceEngine::DSPDeviceSourceEngine(uint uid, QObject* parent) :
|
||||
m_qRange(1 << 16),
|
||||
m_imbalance(65536)
|
||||
{
|
||||
setState(StIdle);
|
||||
setState(State::StIdle);
|
||||
connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages()), Qt::QueuedConnection);
|
||||
}
|
||||
|
||||
@ -64,7 +64,7 @@ void DSPDeviceSourceEngine::setState(State state)
|
||||
}
|
||||
}
|
||||
|
||||
bool DSPDeviceSourceEngine::initAcquisition()
|
||||
bool DSPDeviceSourceEngine::initAcquisition() const
|
||||
{
|
||||
qDebug("DSPDeviceSourceEngine::initAcquisition (dummy)");
|
||||
return true;
|
||||
@ -195,8 +195,8 @@ void DSPDeviceSourceEngine::iqCorrections(SampleVector::iterator begin, SampleVe
|
||||
m_avgPhi(m_avgIQ.asDouble()/m_avgII.asDouble());
|
||||
}
|
||||
|
||||
float& yi = xi; // the in phase remains the reference
|
||||
float yq = xq - m_avgPhi.asDouble()*xi;
|
||||
const float& yi = xi; // the in phase remains the reference
|
||||
float yq = xq - (float) m_avgPhi.asDouble()*xi;
|
||||
|
||||
// amplitude I/Q imbalance
|
||||
m_avgII2(yi*yi); // <I, I>
|
||||
@ -207,12 +207,12 @@ void DSPDeviceSourceEngine::iqCorrections(SampleVector::iterator begin, SampleVe
|
||||
}
|
||||
|
||||
// final correction
|
||||
float& zi = yi; // the in phase remains the reference
|
||||
float zq = m_avgAmp.asDouble() * yq;
|
||||
const float& zi = yi; // the in phase remains the reference
|
||||
auto zq = (float) (m_avgAmp.asDouble() * yq);
|
||||
|
||||
// convert and store
|
||||
it->m_real = zi * SDR_RX_SCALEF;
|
||||
it->m_imag = zq * SDR_RX_SCALEF;
|
||||
it->m_real = (FixReal) (zi * SDR_RX_SCALEF);
|
||||
it->m_imag = (FixReal) (zq * SDR_RX_SCALEF);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
@ -345,20 +345,20 @@ DSPDeviceSourceEngine::State DSPDeviceSourceEngine::gotoIdle()
|
||||
qDebug("DSPDeviceSourceEngine::gotoIdle");
|
||||
|
||||
switch(m_state) {
|
||||
case StNotStarted:
|
||||
return StNotStarted;
|
||||
case State::StNotStarted:
|
||||
return State::StNotStarted;
|
||||
|
||||
case StIdle:
|
||||
case StError:
|
||||
return StIdle;
|
||||
case State::StIdle:
|
||||
case State::StError:
|
||||
return State::StIdle;
|
||||
|
||||
case StReady:
|
||||
case StRunning:
|
||||
case State::StReady:
|
||||
case State::StRunning:
|
||||
break;
|
||||
}
|
||||
|
||||
if (!m_deviceSampleSource) {
|
||||
return StIdle;
|
||||
return State::StIdle;
|
||||
}
|
||||
|
||||
// stop everything
|
||||
@ -372,23 +372,23 @@ DSPDeviceSourceEngine::State DSPDeviceSourceEngine::gotoIdle()
|
||||
m_deviceDescription.clear();
|
||||
m_sampleRate = 0;
|
||||
|
||||
return StIdle;
|
||||
return State::StIdle;
|
||||
}
|
||||
|
||||
DSPDeviceSourceEngine::State DSPDeviceSourceEngine::gotoInit()
|
||||
{
|
||||
switch(m_state) {
|
||||
case StNotStarted:
|
||||
return StNotStarted;
|
||||
case State::StNotStarted:
|
||||
return State::StNotStarted;
|
||||
|
||||
case StRunning: // FIXME: assumes it goes first through idle state. Could we get back to init from running directly?
|
||||
return StRunning;
|
||||
case State::StRunning:
|
||||
return State::StRunning;
|
||||
|
||||
case StReady:
|
||||
return StReady;
|
||||
case State::StReady:
|
||||
return State::StReady;
|
||||
|
||||
case StIdle:
|
||||
case StError:
|
||||
case State::StIdle:
|
||||
case State::StError:
|
||||
break;
|
||||
}
|
||||
|
||||
@ -427,7 +427,7 @@ DSPDeviceSourceEngine::State DSPDeviceSourceEngine::gotoInit()
|
||||
m_deviceSampleSource->getMessageQueueToGUI()->push(rep);
|
||||
}
|
||||
|
||||
return StReady;
|
||||
return State::StReady;
|
||||
}
|
||||
|
||||
DSPDeviceSourceEngine::State DSPDeviceSourceEngine::gotoRunning()
|
||||
@ -436,17 +436,17 @@ DSPDeviceSourceEngine::State DSPDeviceSourceEngine::gotoRunning()
|
||||
|
||||
switch(m_state)
|
||||
{
|
||||
case StNotStarted:
|
||||
return StNotStarted;
|
||||
case State::StNotStarted:
|
||||
return State::StNotStarted;
|
||||
|
||||
case StIdle:
|
||||
return StIdle;
|
||||
case State::StIdle:
|
||||
return State::StIdle;
|
||||
|
||||
case StRunning:
|
||||
return StRunning;
|
||||
case State::StRunning:
|
||||
return State::StRunning;
|
||||
|
||||
case StReady:
|
||||
case StError:
|
||||
case State::StReady:
|
||||
case State::StError:
|
||||
break;
|
||||
}
|
||||
|
||||
@ -470,7 +470,7 @@ DSPDeviceSourceEngine::State DSPDeviceSourceEngine::gotoRunning()
|
||||
|
||||
qDebug() << "DSPDeviceSourceEngine::gotoRunning:input message queue pending: " << m_inputMessageQueue.size();
|
||||
|
||||
return StRunning;
|
||||
return State::StRunning;
|
||||
}
|
||||
|
||||
DSPDeviceSourceEngine::State DSPDeviceSourceEngine::gotoError(const QString& errorMessage)
|
||||
@ -479,8 +479,8 @@ DSPDeviceSourceEngine::State DSPDeviceSourceEngine::gotoError(const QString& err
|
||||
|
||||
m_errorMessage = errorMessage;
|
||||
m_deviceDescription.clear();
|
||||
setState(StError);
|
||||
return StError;
|
||||
setState(State::StError);
|
||||
return State::StError;
|
||||
}
|
||||
|
||||
void DSPDeviceSourceEngine::handleSetSource(DeviceSampleSource* source)
|
||||
@ -502,7 +502,7 @@ void DSPDeviceSourceEngine::handleSetSource(DeviceSampleSource* source)
|
||||
|
||||
void DSPDeviceSourceEngine::handleData()
|
||||
{
|
||||
if(m_state == StRunning)
|
||||
if(m_state == State::StRunning)
|
||||
{
|
||||
work();
|
||||
}
|
||||
@ -588,11 +588,11 @@ bool DSPDeviceSourceEngine::handleMessage(const Message& message)
|
||||
{
|
||||
setState(gotoIdle());
|
||||
|
||||
if(m_state == StIdle) {
|
||||
if(m_state == State::StIdle) {
|
||||
setState(gotoInit()); // State goes ready if init is performed
|
||||
}
|
||||
|
||||
if(m_state == StReady) {
|
||||
if(m_state == State::StReady) {
|
||||
setState(gotoRunning());
|
||||
}
|
||||
|
||||
@ -617,7 +617,7 @@ bool DSPDeviceSourceEngine::handleMessage(const Message& message)
|
||||
auto *msg = new DSPSignalNotification(m_sampleRate, m_centerFrequency);
|
||||
sink->pushMessage(msg);
|
||||
// start the sink:
|
||||
if(m_state == StRunning) {
|
||||
if(m_state == State::StRunning) {
|
||||
sink->start();
|
||||
}
|
||||
}
|
||||
@ -626,7 +626,7 @@ bool DSPDeviceSourceEngine::handleMessage(const Message& message)
|
||||
auto cmd = (const DSPRemoveBasebandSampleSink&) message;
|
||||
BasebandSampleSink* sink = cmd.getSampleSink();
|
||||
|
||||
if(m_state == StRunning) {
|
||||
if(m_state == State::StRunning) {
|
||||
sink->stop();
|
||||
}
|
||||
|
||||
|
@ -38,7 +38,7 @@ class SDRBASE_API DSPDeviceSourceEngine : public QObject {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
enum State {
|
||||
enum class State {
|
||||
StNotStarted, //!< engine is before initialization
|
||||
StIdle, //!< engine is idle
|
||||
StReady, //!< engine is ready to run
|
||||
@ -47,13 +47,13 @@ public:
|
||||
};
|
||||
|
||||
DSPDeviceSourceEngine(uint uid, QObject* parent = nullptr);
|
||||
~DSPDeviceSourceEngine();
|
||||
~DSPDeviceSourceEngine() final;
|
||||
|
||||
uint getUID() const { return m_uid; }
|
||||
|
||||
MessageQueue* getInputMessageQueue() { return &m_inputMessageQueue; }
|
||||
|
||||
bool initAcquisition(); //!< Initialize acquisition sequence
|
||||
bool initAcquisition() const; //!< Initialize acquisition sequence
|
||||
bool startAcquisition(); //!< Start acquisition sequence
|
||||
void stopAcquistion(); //!< Stop acquisition sequence
|
||||
|
||||
|
@ -84,8 +84,8 @@ public:
|
||||
StreamType streamType; //!< This is the type of stream supported
|
||||
int deviceNbItems; //!< Number of items (or streams) in the device. >1 for composite devices.
|
||||
int deviceItemIndex; //!< For composite devices this is the Rx or Tx stream index. -1 if not initialized
|
||||
int claimed; //!< This is the device set index if claimed else -1
|
||||
bool removed; //!< Set if device has been removed
|
||||
int claimed = -1; //!< This is the device set index if claimed else -1
|
||||
bool removed = false; //!< Set if device has been removed
|
||||
|
||||
SamplingDevice(const QString& _displayedName,
|
||||
const QString& _hardwareId,
|
||||
@ -104,9 +104,7 @@ public:
|
||||
type(_type),
|
||||
streamType(_streamType),
|
||||
deviceNbItems(_deviceNbItems),
|
||||
deviceItemIndex(_deviceItemIndex),
|
||||
claimed(-1),
|
||||
removed(false)
|
||||
deviceItemIndex(_deviceItemIndex)
|
||||
{ }
|
||||
|
||||
bool operator==(const SamplingDevice& rhs) const
|
||||
@ -117,7 +115,7 @@ public:
|
||||
&& serial == rhs.serial;
|
||||
}
|
||||
};
|
||||
typedef QList<SamplingDevice> SamplingDevices;
|
||||
using SamplingDevices = QList<SamplingDevice>;
|
||||
|
||||
/** This is the device from which the sampling devices are derived. For physical devices this represents
|
||||
* a single physical unit (a LimeSDR, HackRF, BladeRF, RTL-SDR dongle, ...) that is enumerated once and
|
||||
@ -148,9 +146,9 @@ public:
|
||||
nbTxStreams(_nbTxStreams)
|
||||
{}
|
||||
};
|
||||
typedef QList<OriginDevice> OriginDevices;
|
||||
using OriginDevices = QList<OriginDevice>;
|
||||
|
||||
virtual ~PluginInterface() { }
|
||||
virtual ~PluginInterface() = default;
|
||||
|
||||
virtual const PluginDescriptor& getPluginDescriptor() const = 0;
|
||||
virtual void initPlugin(PluginAPI* pluginAPI) = 0;
|
||||
|
@ -78,10 +78,7 @@ DeviceUISet::DeviceUISet(int deviceSetIndex, DeviceSet *deviceSet)
|
||||
|
||||
DeviceUISet::~DeviceUISet()
|
||||
{
|
||||
// delete m_channelWindow;
|
||||
delete m_mainSpectrumGUI;
|
||||
// delete m_spectrumGUI; // done above
|
||||
// delete m_spectrum;
|
||||
}
|
||||
|
||||
void DeviceUISet::setIndex(int deviceSetIndex)
|
||||
@ -119,7 +116,7 @@ void DeviceUISet::registerRxChannelInstance(ChannelAPI *channelAPI, ChannelGUI*
|
||||
channelGUI,
|
||||
&ChannelGUI::closing,
|
||||
this,
|
||||
[=](){ this->handleChannelGUIClosing(channelGUI); },
|
||||
[this, channelGUI](){ this->handleChannelGUIClosing(channelGUI); },
|
||||
Qt::QueuedConnection
|
||||
);
|
||||
}
|
||||
@ -132,7 +129,7 @@ void DeviceUISet::registerTxChannelInstance(ChannelAPI *channelAPI, ChannelGUI*
|
||||
channelGUI,
|
||||
&ChannelGUI::closing,
|
||||
this,
|
||||
[=](){ this->handleChannelGUIClosing(channelGUI); },
|
||||
[this, channelGUI](){ this->handleChannelGUIClosing(channelGUI); },
|
||||
Qt::QueuedConnection
|
||||
);
|
||||
}
|
||||
@ -145,7 +142,7 @@ void DeviceUISet::registerChannelInstance(ChannelAPI *channelAPI, ChannelGUI* ch
|
||||
channelGUI,
|
||||
&ChannelGUI::closing,
|
||||
this,
|
||||
[=](){ this->handleChannelGUIClosing(channelGUI); },
|
||||
[this, channelGUI](){ this->handleChannelGUIClosing(channelGUI); },
|
||||
Qt::QueuedConnection
|
||||
);
|
||||
}
|
||||
@ -226,14 +223,14 @@ bool DeviceUISet::deserialize(const QByteArray& data)
|
||||
|
||||
if (d.getVersion() == 1)
|
||||
{
|
||||
QByteArray data;
|
||||
QByteArray bdata;
|
||||
|
||||
d.readBlob(1, &data);
|
||||
m_deviceAPI->deserialize(data);
|
||||
d.readBlob(2, &data);
|
||||
m_deviceGUI->deserialize(data);
|
||||
d.readBlob(3, &data);
|
||||
m_spectrumGUI->deserialize(data);
|
||||
d.readBlob(1, &bdata);
|
||||
m_deviceAPI->deserialize(bdata);
|
||||
d.readBlob(2, &bdata);
|
||||
m_deviceGUI->deserialize(bdata);
|
||||
d.readBlob(3, &bdata);
|
||||
m_spectrumGUI->deserialize(bdata);
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -331,9 +328,9 @@ void DeviceUISet::loadRxChannelSettings(const Preset *preset, PluginAPI *pluginA
|
||||
m_deviceSet->clearChannels();
|
||||
qDebug("DeviceUISet::loadRxChannelSettings: %d channel(s) in preset", preset->getChannelCount());
|
||||
|
||||
for (int i = 0; i < preset->getChannelCount(); i++)
|
||||
for (int j = 0; j < preset->getChannelCount(); j++)
|
||||
{
|
||||
const Preset::ChannelConfig& channelConfig = preset->getChannelConfig(i);
|
||||
const Preset::ChannelConfig& channelConfig = preset->getChannelConfig(j);
|
||||
ChannelGUI *rxChannelGUI = nullptr;
|
||||
ChannelAPI *channelAPI = nullptr;
|
||||
|
||||
@ -348,7 +345,7 @@ void DeviceUISet::loadRxChannelSettings(const Preset *preset, PluginAPI *pluginA
|
||||
qPrintable((*channelRegistrations)[i].m_channelIdURI),
|
||||
qPrintable(channelConfig.m_channelIdURI));
|
||||
BasebandSampleSink *rxChannel = nullptr;
|
||||
PluginInterface *pluginInterface = (*channelRegistrations)[i].m_plugin;
|
||||
const PluginInterface *pluginInterface = (*channelRegistrations)[i].m_plugin;
|
||||
pluginInterface->createRxChannel(m_deviceAPI, &rxChannel, &channelAPI);
|
||||
rxChannelGUI = pluginInterface->createRxChannelGUI(this, rxChannel);
|
||||
rxChannelGUI->setDisplayedame(pluginInterface->getPluginDescriptor().displayedName);
|
||||
@ -357,7 +354,7 @@ void DeviceUISet::loadRxChannelSettings(const Preset *preset, PluginAPI *pluginA
|
||||
rxChannelGUI,
|
||||
&ChannelGUI::closing,
|
||||
this,
|
||||
[=](){ this->handleChannelGUIClosing(rxChannelGUI); },
|
||||
[this, rxChannelGUI](){ this->handleChannelGUIClosing(rxChannelGUI); },
|
||||
Qt::QueuedConnection
|
||||
);
|
||||
break;
|
||||
@ -370,7 +367,7 @@ void DeviceUISet::loadRxChannelSettings(const Preset *preset, PluginAPI *pluginA
|
||||
rxChannelGUI->deserialize(channelConfig.m_config);
|
||||
int originalWorkspaceIndex = rxChannelGUI->getWorkspaceIndex();
|
||||
|
||||
if (workspaces && (workspaces->size() > 0) && (originalWorkspaceIndex < workspaces->size())) // restore in original workspace
|
||||
if (workspaces && (!workspaces->empty()) && (originalWorkspaceIndex < workspaces->size())) // restore in original workspace
|
||||
{
|
||||
(*workspaces)[originalWorkspaceIndex]->addToMdiArea((QMdiSubWindow*) rxChannelGUI);
|
||||
}
|
||||
@ -395,19 +392,19 @@ void DeviceUISet::loadRxChannelSettings(const Preset *preset, PluginAPI *pluginA
|
||||
rxChannelGUI,
|
||||
&ChannelGUI::moveToWorkspace,
|
||||
this,
|
||||
[=](int wsIndexDest){ MainWindow::getInstance()->channelMove(rxChannelGUI, wsIndexDest); }
|
||||
[rxChannelGUI](int wsIndexDest){ MainWindow::getInstance()->channelMove(rxChannelGUI, wsIndexDest); }
|
||||
);
|
||||
QObject::connect(
|
||||
rxChannelGUI,
|
||||
&ChannelGUI::duplicateChannelEmitted,
|
||||
this,
|
||||
[=](){ MainWindow::getInstance()->channelDuplicate(rxChannelGUI); }
|
||||
[rxChannelGUI](){ MainWindow::getInstance()->channelDuplicate(rxChannelGUI); }
|
||||
);
|
||||
QObject::connect(
|
||||
rxChannelGUI,
|
||||
&ChannelGUI::moveToDeviceSet,
|
||||
this,
|
||||
[=](int dsIndexDest){ MainWindow::getInstance()->channelMoveToDeviceSet(rxChannelGUI, dsIndexDest); }
|
||||
[rxChannelGUI](int dsIndexDest){ MainWindow::getInstance()->channelMoveToDeviceSet(rxChannelGUI, dsIndexDest); }
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -460,9 +457,9 @@ void DeviceUISet::loadTxChannelSettings(const Preset *preset, PluginAPI *pluginA
|
||||
m_deviceSet->clearChannels();
|
||||
qDebug("DeviceUISet::loadTxChannelSettings: %d channel(s) in preset", preset->getChannelCount());
|
||||
|
||||
for (int i = 0; i < preset->getChannelCount(); i++)
|
||||
for (int j = 0; j < preset->getChannelCount(); j++)
|
||||
{
|
||||
const Preset::ChannelConfig& channelConfig = preset->getChannelConfig(i);
|
||||
const Preset::ChannelConfig& channelConfig = preset->getChannelConfig(j);
|
||||
ChannelGUI *txChannelGUI = nullptr;
|
||||
ChannelAPI *channelAPI = nullptr;
|
||||
|
||||
@ -475,8 +472,8 @@ void DeviceUISet::loadTxChannelSettings(const Preset *preset, PluginAPI *pluginA
|
||||
qDebug("DeviceUISet::loadTxChannelSettings: creating new channel [%s] from config [%s]",
|
||||
qPrintable((*channelRegistrations)[i].m_channelIdURI),
|
||||
qPrintable(channelConfig.m_channelIdURI));
|
||||
BasebandSampleSource *txChannel;
|
||||
PluginInterface *pluginInterface = (*channelRegistrations)[i].m_plugin;
|
||||
BasebandSampleSource *txChannel = nullptr;
|
||||
const PluginInterface *pluginInterface = (*channelRegistrations)[i].m_plugin;
|
||||
pluginInterface->createTxChannel(m_deviceAPI, &txChannel, &channelAPI);
|
||||
txChannelGUI = pluginInterface->createTxChannelGUI(this, txChannel);
|
||||
txChannelGUI->setDisplayedame(pluginInterface->getPluginDescriptor().displayedName);
|
||||
@ -485,7 +482,7 @@ void DeviceUISet::loadTxChannelSettings(const Preset *preset, PluginAPI *pluginA
|
||||
txChannelGUI,
|
||||
&ChannelGUI::closing,
|
||||
this,
|
||||
[=](){ this->handleChannelGUIClosing(txChannelGUI); },
|
||||
[this, txChannelGUI](){ this->handleChannelGUIClosing(txChannelGUI); },
|
||||
Qt::QueuedConnection
|
||||
);
|
||||
break;
|
||||
@ -498,7 +495,7 @@ void DeviceUISet::loadTxChannelSettings(const Preset *preset, PluginAPI *pluginA
|
||||
txChannelGUI->deserialize(channelConfig.m_config);
|
||||
int originalWorkspaceIndex = txChannelGUI->getWorkspaceIndex();
|
||||
|
||||
if (workspaces && (workspaces->size() > 0) && (originalWorkspaceIndex < workspaces->size())) // restore in original workspace
|
||||
if (workspaces && (!workspaces->empty()) && (originalWorkspaceIndex < workspaces->size())) // restore in original workspace
|
||||
{
|
||||
(*workspaces)[originalWorkspaceIndex]->addToMdiArea((QMdiSubWindow*) txChannelGUI);
|
||||
}
|
||||
@ -523,19 +520,19 @@ void DeviceUISet::loadTxChannelSettings(const Preset *preset, PluginAPI *pluginA
|
||||
txChannelGUI,
|
||||
&ChannelGUI::moveToWorkspace,
|
||||
this,
|
||||
[=](int wsIndexDest){ MainWindow::getInstance()->channelMove(txChannelGUI, wsIndexDest); }
|
||||
[txChannelGUI](int wsIndexDest){ MainWindow::getInstance()->channelMove(txChannelGUI, wsIndexDest); }
|
||||
);
|
||||
QObject::connect(
|
||||
txChannelGUI,
|
||||
&ChannelGUI::duplicateChannelEmitted,
|
||||
this,
|
||||
[=](){ MainWindow::getInstance()->channelDuplicate(txChannelGUI); }
|
||||
[txChannelGUI](){ MainWindow::getInstance()->channelDuplicate(txChannelGUI); }
|
||||
);
|
||||
QObject::connect(
|
||||
txChannelGUI,
|
||||
&ChannelGUI::moveToDeviceSet,
|
||||
this,
|
||||
[=](int dsIndexDest){ MainWindow::getInstance()->channelMoveToDeviceSet(txChannelGUI, dsIndexDest); }
|
||||
[txChannelGUI](int dsIndexDest){ MainWindow::getInstance()->channelMoveToDeviceSet(txChannelGUI, dsIndexDest); }
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -586,9 +583,9 @@ void DeviceUISet::loadMIMOChannelSettings(const Preset *preset, PluginAPI *plugi
|
||||
m_deviceSet->clearChannels();
|
||||
qDebug("DeviceUISet::loadMIMOChannelSettings: %d channel(s) in preset", preset->getChannelCount());
|
||||
|
||||
for (int i = 0; i < preset->getChannelCount(); i++)
|
||||
for (int j = 0; j < preset->getChannelCount(); j++)
|
||||
{
|
||||
const Preset::ChannelConfig& channelConfig = preset->getChannelConfig(i);
|
||||
const Preset::ChannelConfig& channelConfig = preset->getChannelConfig(j);
|
||||
ChannelGUI *channelGUI = nullptr;
|
||||
ChannelAPI *channelAPI = nullptr;
|
||||
|
||||
@ -602,8 +599,8 @@ void DeviceUISet::loadMIMOChannelSettings(const Preset *preset, PluginAPI *plugi
|
||||
qDebug("DeviceUISet::loadMIMOChannelSettings: creating new MIMO channel [%s] from config [%s]",
|
||||
qPrintable((*channelMIMORegistrations)[i].m_channelIdURI),
|
||||
qPrintable(channelConfig.m_channelIdURI));
|
||||
MIMOChannel *mimoChannel;
|
||||
PluginInterface *pluginInterface = (*channelMIMORegistrations)[i].m_plugin;
|
||||
MIMOChannel *mimoChannel = nullptr;
|
||||
const PluginInterface *pluginInterface = (*channelMIMORegistrations)[i].m_plugin;
|
||||
pluginInterface->createMIMOChannel(m_deviceAPI, &mimoChannel, &channelAPI);
|
||||
channelGUI = pluginInterface->createMIMOChannelGUI(this, mimoChannel);
|
||||
channelGUI->setDisplayedame(pluginInterface->getPluginDescriptor().displayedName);
|
||||
@ -612,7 +609,7 @@ void DeviceUISet::loadMIMOChannelSettings(const Preset *preset, PluginAPI *plugi
|
||||
channelGUI,
|
||||
&ChannelGUI::closing,
|
||||
this,
|
||||
[=](){ this->handleChannelGUIClosing(channelGUI); },
|
||||
[this, channelGUI](){ this->handleChannelGUIClosing(channelGUI); },
|
||||
Qt::QueuedConnection
|
||||
);
|
||||
break;
|
||||
@ -629,8 +626,8 @@ void DeviceUISet::loadMIMOChannelSettings(const Preset *preset, PluginAPI *plugi
|
||||
qDebug("DeviceUISet::loadMIMOChannelSettings: creating new Rx channel [%s] from config [%s]",
|
||||
qPrintable((*channelRxRegistrations)[i].m_channelIdURI),
|
||||
qPrintable(channelConfig.m_channelIdURI));
|
||||
BasebandSampleSink *rxChannel;
|
||||
PluginInterface *pluginInterface = (*channelRxRegistrations)[i].m_plugin;
|
||||
BasebandSampleSink *rxChannel = nullptr;
|
||||
const PluginInterface *pluginInterface = (*channelRxRegistrations)[i].m_plugin;
|
||||
pluginInterface->createRxChannel(m_deviceAPI, &rxChannel, &channelAPI);
|
||||
channelGUI = pluginInterface->createRxChannelGUI(this, rxChannel);
|
||||
channelGUI->setDisplayedame(pluginInterface->getPluginDescriptor().displayedName);
|
||||
@ -639,7 +636,7 @@ void DeviceUISet::loadMIMOChannelSettings(const Preset *preset, PluginAPI *plugi
|
||||
channelGUI,
|
||||
&ChannelGUI::closing,
|
||||
this,
|
||||
[=](){ this->handleChannelGUIClosing(channelGUI); },
|
||||
[this, channelGUI](){ this->handleChannelGUIClosing(channelGUI); },
|
||||
Qt::QueuedConnection
|
||||
);
|
||||
break;
|
||||
@ -656,8 +653,8 @@ void DeviceUISet::loadMIMOChannelSettings(const Preset *preset, PluginAPI *plugi
|
||||
qDebug("DeviceUISet::loadMIMOChannelSettings: creating new Tx channel [%s] from config [%s]",
|
||||
qPrintable((*channelTxRegistrations)[i].m_channelIdURI),
|
||||
qPrintable(channelConfig.m_channelIdURI));
|
||||
BasebandSampleSource *txChannel;
|
||||
PluginInterface *pluginInterface = (*channelTxRegistrations)[i].m_plugin;
|
||||
BasebandSampleSource *txChannel = nullptr;
|
||||
const PluginInterface *pluginInterface = (*channelTxRegistrations)[i].m_plugin;
|
||||
pluginInterface->createTxChannel(m_deviceAPI, &txChannel, &channelAPI);
|
||||
channelGUI = pluginInterface->createTxChannelGUI(this, txChannel);
|
||||
channelGUI->setDisplayedame(pluginInterface->getPluginDescriptor().displayedName);
|
||||
@ -672,7 +669,7 @@ void DeviceUISet::loadMIMOChannelSettings(const Preset *preset, PluginAPI *plugi
|
||||
channelGUI->deserialize(channelConfig.m_config);
|
||||
int originalWorkspaceIndex = channelGUI->getWorkspaceIndex();
|
||||
|
||||
if (workspaces && (workspaces->size() > 0) && (originalWorkspaceIndex < workspaces->size())) // restore in original workspace
|
||||
if (workspaces && (!workspaces->empty()) && (originalWorkspaceIndex < workspaces->size())) // restore in original workspace
|
||||
{
|
||||
(*workspaces)[originalWorkspaceIndex]->addToMdiArea((QMdiSubWindow*) channelGUI);
|
||||
}
|
||||
@ -697,26 +694,26 @@ void DeviceUISet::loadMIMOChannelSettings(const Preset *preset, PluginAPI *plugi
|
||||
channelGUI,
|
||||
&ChannelGUI::closing,
|
||||
this,
|
||||
[=](){ this->handleChannelGUIClosing(channelGUI); },
|
||||
[this, channelGUI](){ this->handleChannelGUIClosing(channelGUI); },
|
||||
Qt::QueuedConnection
|
||||
);
|
||||
QObject::connect(
|
||||
channelGUI,
|
||||
&ChannelGUI::moveToWorkspace,
|
||||
this,
|
||||
[=](int wsIndexDest){ MainWindow::getInstance()->channelMove(channelGUI, wsIndexDest); }
|
||||
[channelGUI](int wsIndexDest){ MainWindow::getInstance()->channelMove(channelGUI, wsIndexDest); }
|
||||
);
|
||||
QObject::connect(
|
||||
channelGUI,
|
||||
&ChannelGUI::duplicateChannelEmitted,
|
||||
this,
|
||||
[=](){ MainWindow::getInstance()->channelDuplicate(channelGUI); }
|
||||
[channelGUI](){ MainWindow::getInstance()->channelDuplicate(channelGUI); }
|
||||
);
|
||||
QObject::connect(
|
||||
channelGUI,
|
||||
&ChannelGUI::moveToDeviceSet,
|
||||
this,
|
||||
[=](int dsIndexDest){ MainWindow::getInstance()->channelMoveToDeviceSet(channelGUI, dsIndexDest); }
|
||||
[channelGUI](int dsIndexDest){ MainWindow::getInstance()->channelMoveToDeviceSet(channelGUI, dsIndexDest); }
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -766,11 +763,11 @@ bool DeviceUISet::ChannelInstanceRegistration::operator<(const ChannelInstanceRe
|
||||
}
|
||||
}
|
||||
|
||||
void DeviceUISet::handleChannelGUIClosing(ChannelGUI* channelGUI)
|
||||
void DeviceUISet::handleChannelGUIClosing(const ChannelGUI* channelGUI)
|
||||
{
|
||||
qDebug("DeviceUISet::handleChannelGUIClosing: %s: %d", qPrintable(channelGUI->getTitle()), channelGUI->getIndex());
|
||||
|
||||
for (ChannelInstanceRegistrations::iterator it = m_channelInstanceRegistrations.begin(); it != m_channelInstanceRegistrations.end(); ++it)
|
||||
for (auto it = m_channelInstanceRegistrations.begin(); it != m_channelInstanceRegistrations.end(); ++it)
|
||||
{
|
||||
if (it->m_gui == channelGUI)
|
||||
{
|
||||
@ -793,7 +790,7 @@ void DeviceUISet::handleChannelGUIClosing(ChannelGUI* channelGUI)
|
||||
}
|
||||
}
|
||||
|
||||
void DeviceUISet::handleDeleteChannel(ChannelAPI *channelAPI)
|
||||
void DeviceUISet::handleDeleteChannel(ChannelAPI *channelAPI) const
|
||||
{
|
||||
channelAPI->destroy();
|
||||
}
|
||||
|
@ -33,7 +33,6 @@ class SpectrumVis;
|
||||
class GLSpectrum;
|
||||
class GLSpectrumGUI;
|
||||
class MainSpectrumGUI;
|
||||
// class ChannelWindow;
|
||||
class DeviceAPI;
|
||||
class DeviceSet;
|
||||
class DSPDeviceSourceEngine;
|
||||
@ -61,7 +60,6 @@ public:
|
||||
GLSpectrum *m_spectrum;
|
||||
GLSpectrumGUI *m_spectrumGUI;
|
||||
MainSpectrumGUI *m_mainSpectrumGUI;
|
||||
// ChannelWindow *m_channelWindow;
|
||||
DeviceAPI *m_deviceAPI;
|
||||
DeviceGUI *m_deviceGUI;
|
||||
DSPDeviceSourceEngine *m_deviceSourceEngine;
|
||||
@ -74,7 +72,7 @@ public:
|
||||
int m_selectedDeviceItemImdex;
|
||||
|
||||
DeviceUISet(int deviceSetIndex, DeviceSet *deviceSet);
|
||||
~DeviceUISet();
|
||||
~DeviceUISet() final;
|
||||
|
||||
void setIndex(int deviceSetIndex);
|
||||
int getIndex() const { return m_deviceSetIndex; }
|
||||
@ -146,10 +144,8 @@ private:
|
||||
bool operator<(const ChannelInstanceRegistration& other) const;
|
||||
};
|
||||
|
||||
typedef QList<ChannelInstanceRegistration> ChannelInstanceRegistrations;
|
||||
using ChannelInstanceRegistrations = QList<ChannelInstanceRegistration>;
|
||||
|
||||
// ChannelInstanceRegistrations m_rxChannelInstanceRegistrations;
|
||||
// ChannelInstanceRegistrations m_txChannelInstanceRegistrations;
|
||||
ChannelInstanceRegistrations m_channelInstanceRegistrations;
|
||||
int m_deviceSetIndex;
|
||||
DeviceSet *m_deviceSet;
|
||||
@ -165,8 +161,8 @@ private:
|
||||
void saveMIMOChannelSettings(Preset* preset) const;
|
||||
|
||||
private slots:
|
||||
void handleChannelGUIClosing(ChannelGUI* channelGUI);
|
||||
void handleDeleteChannel(ChannelAPI *channelAPI);
|
||||
void handleChannelGUIClosing(const ChannelGUI* channelGUI);
|
||||
void handleDeleteChannel(ChannelAPI *channelAPI) const;
|
||||
void onTimeSelected(int deviceSetIndex, float time);
|
||||
};
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -69,27 +69,23 @@ class SerializableInterface;
|
||||
class QMenuBar;
|
||||
class Workspace;
|
||||
|
||||
// namespace Ui {
|
||||
// class MainWindow;
|
||||
// }
|
||||
|
||||
class SDRGUI_API MainWindow : public QMainWindow {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit MainWindow(qtwebapp::LoggerWithFile *logger, const MainParser& parser, QWidget* parent = nullptr);
|
||||
~MainWindow();
|
||||
~MainWindow() final;
|
||||
static MainWindow *getInstance() { return m_instance; } // Main Window is de facto a singleton so this just returns its reference
|
||||
MessageQueue* getInputMessageQueue() { return &m_inputMessageQueue; }
|
||||
const PluginManager *getPluginManager() const { return m_pluginManager; }
|
||||
std::vector<DeviceUISet*>& getDeviceUISets() { return m_deviceUIs; }
|
||||
void commandKeysConnect(QObject *object, const char *slot);
|
||||
void commandKeysDisconnect(QObject *object, const char *slot);
|
||||
void commandKeysConnect(const QObject *object, const char *slot);
|
||||
void commandKeysDisconnect(const QObject *object, const char *slot) const;
|
||||
int getNumberOfWorkspaces() const { return m_workspaces.size(); }
|
||||
|
||||
public slots:
|
||||
void channelMove(ChannelGUI *gui, int wsIndexDestination);
|
||||
void channelDuplicate(ChannelGUI *gui);
|
||||
void channelDuplicate(const ChannelGUI *gui);
|
||||
void channelMoveToDeviceSet(ChannelGUI *gui, int dsIndexDestination);
|
||||
|
||||
private:
|
||||
@ -101,14 +97,13 @@ private:
|
||||
struct DeviceWidgetTabData
|
||||
{
|
||||
QWidget *gui;
|
||||
QString displayName;
|
||||
QString tabName;
|
||||
QString displayName;
|
||||
QString tabName;
|
||||
};
|
||||
|
||||
static MainWindow *m_instance;
|
||||
QList<Workspace*> m_workspaces;
|
||||
Workspace *m_currentWorkspace;
|
||||
// Ui::MainWindow* ui;
|
||||
MessageQueue m_inputMessageQueue;
|
||||
MainCore *m_mainCore;
|
||||
std::vector<DeviceUISet*> m_deviceUIs;
|
||||
@ -143,10 +138,10 @@ private:
|
||||
void loadFeatureSetPresetSettings(const FeatureSetPreset* preset, int featureSetIndex, Workspace *workspace);
|
||||
void saveFeatureSetPresetSettings(FeatureSetPreset* preset, int featureSetIndex);
|
||||
|
||||
QString openGLVersion();
|
||||
void createMenuBar(QToolButton *button);
|
||||
QString openGLVersion() const;
|
||||
void createMenuBar(QToolButton *button) const;
|
||||
void createStatusBar();
|
||||
void closeEvent(QCloseEvent*);
|
||||
void closeEvent(QCloseEvent*) final;
|
||||
void applySettings();
|
||||
|
||||
void removeDeviceSet(int deviceSetIndex);
|
||||
@ -155,7 +150,7 @@ private:
|
||||
void removeFeatureSet(unsigned int featureSetIndex);
|
||||
void removeAllFeatureSets();
|
||||
void deleteChannel(int deviceSetIndex, int channelIndex);
|
||||
void channelDuplicateToDeviceSet(ChannelGUI *sourceChannelGUI, int dsIndexDestination);
|
||||
void channelDuplicateToDeviceSet(const ChannelGUI *sourceChannelGUI, int dsIndexDestination);
|
||||
void sampleDeviceChange(int deviceType, int deviceSetIndex, int newDeviceIndex, Workspace *workspace);
|
||||
void sampleSourceChange(int deviceSetIndex, int newDeviceIndex, Workspace *workspace);
|
||||
void sampleSinkChange(int deviceSetIndex, int newDeviceIndex, Workspace *workspace);
|
||||
@ -181,7 +176,7 @@ private:
|
||||
bool handleMessage(const Message& cmd);
|
||||
|
||||
protected:
|
||||
virtual void keyPressEvent(QKeyEvent* event) override;
|
||||
void keyPressEvent(QKeyEvent* event) override;
|
||||
|
||||
private slots:
|
||||
void handleMessages();
|
||||
@ -202,39 +197,39 @@ private slots:
|
||||
void on_action_My_Position_triggered();
|
||||
void on_action_DeviceUserArguments_triggered();
|
||||
void on_action_commands_triggered();
|
||||
void on_action_Quick_Start_triggered();
|
||||
void on_action_Main_Window_triggered();
|
||||
void on_action_Quick_Start_triggered() const;
|
||||
void on_action_Main_Window_triggered() const;
|
||||
void on_action_Loaded_Plugins_triggered();
|
||||
void on_action_About_triggered();
|
||||
|
||||
void updateStatus();
|
||||
void addWorkspace();
|
||||
void viewAllWorkspaces();
|
||||
void viewAllWorkspaces() const;
|
||||
void removeEmptyWorkspaces();
|
||||
void openConfigurationDialog(bool openOnly);
|
||||
void loadDefaultConfigurations();
|
||||
void loadDefaultConfigurations() const;
|
||||
void loadConfiguration(const Configuration *configuration, bool fromDialog = false);
|
||||
void saveConfiguration(Configuration *configuration);
|
||||
void sampleSourceAdd(Workspace *deviceWorkspace, Workspace *spectrumWorkspace, int deviceIndex);
|
||||
void sampleSinkAdd(Workspace *workspace, Workspace *spectrumWorkspace, int deviceIndex);
|
||||
void sampleMIMOAdd(Workspace *workspace, Workspace *spectrumWorkspace, int deviceIndex);
|
||||
void samplingDeviceChangeHandler(DeviceGUI *deviceGUI, int newDeviceIndex);
|
||||
void samplingDeviceChangeHandler(const DeviceGUI *deviceGUI, int newDeviceIndex);
|
||||
void channelAddClicked(Workspace *workspace, int deviceSetIndex, int channelPluginIndex);
|
||||
void featureAddClicked(Workspace *workspace, int featureIndex);
|
||||
void featureMove(FeatureGUI *gui, int wsIndexDestnation);
|
||||
void deviceStateChanged(DeviceAPI *deviceAPI);
|
||||
void openFeaturePresetsDialog(QPoint p, Workspace *workspace);
|
||||
void startAllDevices(Workspace *workspace);
|
||||
void stopAllDevices(Workspace *workspace);
|
||||
void startAllDevices(const Workspace *workspace) const;
|
||||
void stopAllDevices(const Workspace *workspace) const;
|
||||
void deviceMove(DeviceGUI *gui, int wsIndexDestnation);
|
||||
void mainSpectrumMove(MainSpectrumGUI *gui, int wsIndexDestnation);
|
||||
void mainSpectrumShow(int deviceSetIndex);
|
||||
void mainSpectrumRequestDeviceCenterFrequency(int deviceSetIndex, qint64 deviceCenterFrequency);
|
||||
void showAllChannels(int deviceSetIndex);
|
||||
void openDeviceSetPresetsDialog(QPoint p, DeviceGUI *deviceGUI);
|
||||
void commandKeyPressed(Qt::Key key, Qt::KeyboardModifiers keyModifiers, bool release);
|
||||
void openDeviceSetPresetsDialog(QPoint p, const DeviceGUI *deviceGUI);
|
||||
void commandKeyPressed(Qt::Key key, Qt::KeyboardModifiers keyModifiers, bool release) const;
|
||||
void fftWisdomProcessFinished(int exitCode, QProcess::ExitStatus exitStatus);
|
||||
void orientationChanged(Qt::ScreenOrientation orientation);
|
||||
void orientationChanged(Qt::ScreenOrientation orientation) const;
|
||||
};
|
||||
|
||||
#endif // INCLUDE_MAINWINDOW_H
|
||||
|
@ -43,7 +43,7 @@
|
||||
#include "mainparser.h"
|
||||
#include "mainserver.h"
|
||||
|
||||
MainServer *MainServer::m_instance = 0;
|
||||
MainServer *MainServer::m_instance = nullptr;
|
||||
|
||||
MainServer::MainServer(qtwebapp::LoggerWithFile *logger, const MainParser& parser, QObject *parent) :
|
||||
QObject(parent),
|
||||
@ -74,7 +74,7 @@ MainServer::MainServer(qtwebapp::LoggerWithFile *logger, const MainParser& parse
|
||||
loadSettings();
|
||||
|
||||
qDebug() << "MainServer::MainServer: finishing...";
|
||||
QString applicationDirPath = QCoreApplication::instance()->applicationDirPath();
|
||||
QString applicationDirPath = QCoreApplication::applicationDirPath();
|
||||
|
||||
m_apiAdapter = new WebAPIAdapter();
|
||||
m_requestMapper = new WebAPIRequestMapper(this);
|
||||
@ -89,7 +89,7 @@ MainServer::MainServer(qtwebapp::LoggerWithFile *logger, const MainParser& parse
|
||||
|
||||
MainServer::~MainServer()
|
||||
{
|
||||
while (m_mainCore->m_deviceSets.size() > 0) {
|
||||
while (!m_mainCore->m_deviceSets.empty()) {
|
||||
removeLastDevice();
|
||||
}
|
||||
|
||||
@ -108,7 +108,7 @@ bool MainServer::handleMessage(const Message& cmd)
|
||||
{
|
||||
if (MainCore::MsgDeleteInstance::match(cmd))
|
||||
{
|
||||
while (m_mainCore->m_deviceSets.size() > 0)
|
||||
while (!m_mainCore->m_deviceSets.empty())
|
||||
{
|
||||
removeLastDevice();
|
||||
}
|
||||
@ -118,13 +118,13 @@ bool MainServer::handleMessage(const Message& cmd)
|
||||
}
|
||||
else if (MainCore::MsgLoadPreset::match(cmd))
|
||||
{
|
||||
MainCore::MsgLoadPreset& notif = (MainCore::MsgLoadPreset&) cmd;
|
||||
auto& notif = (const MainCore::MsgLoadPreset&) cmd;
|
||||
loadPresetSettings(notif.getPreset(), notif.getDeviceSetIndex());
|
||||
return true;
|
||||
}
|
||||
else if (MainCore::MsgSavePreset::match(cmd))
|
||||
{
|
||||
MainCore::MsgSavePreset& notif = (MainCore::MsgSavePreset&) cmd;
|
||||
auto& notif = (const MainCore::MsgSavePreset&) cmd;
|
||||
savePresetSettings(notif.getPreset(), notif.getDeviceSetIndex());
|
||||
m_mainCore->m_settings.sortPresets();
|
||||
m_mainCore->m_settings.save();
|
||||
@ -132,7 +132,7 @@ bool MainServer::handleMessage(const Message& cmd)
|
||||
}
|
||||
else if (MainCore::MsgDeletePreset::match(cmd))
|
||||
{
|
||||
MainCore::MsgDeletePreset& notif = (MainCore::MsgDeletePreset&) cmd;
|
||||
auto& notif = (const MainCore::MsgDeletePreset&) cmd;
|
||||
const Preset *presetToDelete = notif.getPreset();
|
||||
// remove preset from settings
|
||||
m_mainCore->m_settings.deletePreset(presetToDelete);
|
||||
@ -140,7 +140,7 @@ bool MainServer::handleMessage(const Message& cmd)
|
||||
}
|
||||
else if (MainCore::MsgDeleteConfiguration::match(cmd))
|
||||
{
|
||||
MainCore::MsgDeleteConfiguration& notif = (MainCore::MsgDeleteConfiguration&) cmd;
|
||||
auto& notif = (const MainCore::MsgDeleteConfiguration&) cmd;
|
||||
const Configuration *configuationToDelete = notif.getConfiguration();
|
||||
// remove configuration from settings
|
||||
m_mainCore->m_settings.deleteConfiguration(configuationToDelete);
|
||||
@ -148,13 +148,13 @@ bool MainServer::handleMessage(const Message& cmd)
|
||||
}
|
||||
else if (MainCore::MsgLoadFeatureSetPreset::match(cmd))
|
||||
{
|
||||
MainCore::MsgLoadFeatureSetPreset& notif = (MainCore::MsgLoadFeatureSetPreset&) cmd;
|
||||
auto& notif = (const MainCore::MsgLoadFeatureSetPreset&) cmd;
|
||||
loadFeatureSetPresetSettings(notif.getPreset(), notif.getFeatureSetIndex());
|
||||
return true;
|
||||
}
|
||||
else if (MainCore::MsgSaveFeatureSetPreset::match(cmd))
|
||||
{
|
||||
MainCore::MsgSaveFeatureSetPreset& notif = (MainCore::MsgSaveFeatureSetPreset&) cmd;
|
||||
auto& notif = (const MainCore::MsgSaveFeatureSetPreset&) cmd;
|
||||
saveFeatureSetPresetSettings(notif.getPreset(), notif.getFeatureSetIndex());
|
||||
m_mainCore->m_settings.sortPresets();
|
||||
m_mainCore->m_settings.save();
|
||||
@ -162,7 +162,7 @@ bool MainServer::handleMessage(const Message& cmd)
|
||||
}
|
||||
else if (MainCore::MsgDeleteFeatureSetPreset::match(cmd))
|
||||
{
|
||||
MainCore::MsgDeleteFeatureSetPreset& notif = (MainCore::MsgDeleteFeatureSetPreset&) cmd;
|
||||
auto& notif = (const MainCore::MsgDeleteFeatureSetPreset&) cmd;
|
||||
const FeatureSetPreset *presetToDelete = notif.getPreset();
|
||||
// remove preset from settings
|
||||
m_mainCore->m_settings.deleteFeatureSetPreset(presetToDelete);
|
||||
@ -170,7 +170,7 @@ bool MainServer::handleMessage(const Message& cmd)
|
||||
}
|
||||
else if (MainCore::MsgAddDeviceSet::match(cmd))
|
||||
{
|
||||
MainCore::MsgAddDeviceSet& notif = (MainCore::MsgAddDeviceSet&) cmd;
|
||||
auto& notif = (const MainCore::MsgAddDeviceSet&) cmd;
|
||||
int direction = notif.getDirection();
|
||||
|
||||
if (direction == 1) { // Single stream Tx
|
||||
@ -185,7 +185,7 @@ bool MainServer::handleMessage(const Message& cmd)
|
||||
}
|
||||
else if (MainCore::MsgRemoveLastDeviceSet::match(cmd))
|
||||
{
|
||||
if (m_mainCore->m_deviceSets.size() > 0) {
|
||||
if (!m_mainCore->m_deviceSets.empty()) {
|
||||
removeLastDevice();
|
||||
}
|
||||
|
||||
@ -193,7 +193,7 @@ bool MainServer::handleMessage(const Message& cmd)
|
||||
}
|
||||
else if (MainCore::MsgSetDevice::match(cmd))
|
||||
{
|
||||
MainCore::MsgSetDevice& notif = (MainCore::MsgSetDevice&) cmd;
|
||||
auto& notif = (const MainCore::MsgSetDevice&) cmd;
|
||||
|
||||
if (notif.getDeviceType() == 1) {
|
||||
changeSampleSink(notif.getDeviceSetIndex(), notif.getDeviceIndex());
|
||||
@ -206,26 +206,26 @@ bool MainServer::handleMessage(const Message& cmd)
|
||||
}
|
||||
else if (MainCore::MsgAddChannel::match(cmd))
|
||||
{
|
||||
MainCore::MsgAddChannel& notif = (MainCore::MsgAddChannel&) cmd;
|
||||
auto& notif = (const MainCore::MsgAddChannel&) cmd;
|
||||
addChannel(notif.getDeviceSetIndex(), notif.getChannelRegistrationIndex());
|
||||
return true;
|
||||
}
|
||||
else if (MainCore::MsgDeleteChannel::match(cmd))
|
||||
{
|
||||
MainCore::MsgDeleteChannel& notif = (MainCore::MsgDeleteChannel&) cmd;
|
||||
auto& notif = (const MainCore::MsgDeleteChannel&) cmd;
|
||||
deleteChannel(notif.getDeviceSetIndex(), notif.getChannelIndex());
|
||||
return true;
|
||||
}
|
||||
else if (MainCore::MsgAddFeature::match(cmd))
|
||||
{
|
||||
MainCore::MsgAddFeature& notif = (MainCore::MsgAddFeature&) cmd;
|
||||
auto& notif = (const MainCore::MsgAddFeature&) cmd;
|
||||
addFeature(0, notif.getFeatureRegistrationIndex());
|
||||
|
||||
return true;
|
||||
}
|
||||
else if (MainCore::MsgDeleteFeature::match(cmd))
|
||||
{
|
||||
MainCore::MsgDeleteFeature& notif = (MainCore::MsgDeleteFeature&) cmd;
|
||||
auto& notif = (const MainCore::MsgDeleteFeature&) cmd;
|
||||
deleteFeature(0, notif.getFeatureIndex());
|
||||
return true;
|
||||
}
|
||||
@ -244,7 +244,7 @@ void MainServer::handleMessages()
|
||||
{
|
||||
Message* message;
|
||||
|
||||
while ((message = m_inputMessageQueue.pop()) != 0)
|
||||
while ((message = m_inputMessageQueue.pop()) != nullptr)
|
||||
{
|
||||
qDebug("MainServer::handleMessages: message: %s", message->getIdentifier());
|
||||
handleMessage(*message);
|
||||
@ -271,21 +271,14 @@ void MainServer::addSinkDevice()
|
||||
{
|
||||
DSPDeviceSinkEngine *dspDeviceSinkEngine = m_dspEngine->addDeviceSinkEngine();
|
||||
|
||||
uint dspDeviceSinkEngineUID = dspDeviceSinkEngine->getUID();
|
||||
char uidCStr[16];
|
||||
sprintf(uidCStr, "UID:%d", dspDeviceSinkEngineUID);
|
||||
|
||||
int deviceTabIndex = m_mainCore->m_deviceSets.size();
|
||||
auto deviceTabIndex = (int) m_mainCore->m_deviceSets.size();
|
||||
m_mainCore->m_deviceSets.push_back(new DeviceSet(deviceTabIndex, 1));
|
||||
m_mainCore->m_deviceSets.back()->m_deviceSourceEngine = nullptr;
|
||||
m_mainCore->m_deviceSets.back()->m_deviceSinkEngine = dspDeviceSinkEngine;
|
||||
m_mainCore->m_deviceSets.back()->m_deviceMIMOEngine = nullptr;
|
||||
dspDeviceSinkEngine->addSpectrumSink(m_mainCore->m_deviceSets.back()->m_spectrumVis);
|
||||
|
||||
char tabNameCStr[16];
|
||||
sprintf(tabNameCStr, "T%d", deviceTabIndex);
|
||||
|
||||
DeviceAPI *deviceAPI = new DeviceAPI(DeviceAPI::StreamSingleTx, deviceTabIndex, nullptr, dspDeviceSinkEngine, nullptr);
|
||||
auto *deviceAPI = new DeviceAPI(DeviceAPI::StreamSingleTx, deviceTabIndex, nullptr, dspDeviceSinkEngine, nullptr);
|
||||
|
||||
m_mainCore->m_deviceSets.back()->m_deviceAPI = deviceAPI;
|
||||
QList<QString> channelNames;
|
||||
@ -318,14 +311,14 @@ void MainServer::addSourceDevice()
|
||||
{
|
||||
DSPDeviceSourceEngine *dspDeviceSourceEngine = m_dspEngine->addDeviceSourceEngine();
|
||||
|
||||
int deviceTabIndex = m_mainCore->m_deviceSets.size();
|
||||
auto deviceTabIndex = (int) m_mainCore->m_deviceSets.size();
|
||||
m_mainCore->m_deviceSets.push_back(new DeviceSet(deviceTabIndex, 0));
|
||||
m_mainCore->m_deviceSets.back()->m_deviceSourceEngine = dspDeviceSourceEngine;
|
||||
m_mainCore->m_deviceSets.back()->m_deviceSinkEngine = nullptr;
|
||||
m_mainCore->m_deviceSets.back()->m_deviceMIMOEngine = nullptr;
|
||||
dspDeviceSourceEngine->addSink(m_mainCore->m_deviceSets.back()->m_spectrumVis);
|
||||
|
||||
DeviceAPI *deviceAPI = new DeviceAPI(DeviceAPI::StreamSingleRx, deviceTabIndex, dspDeviceSourceEngine, nullptr, nullptr);
|
||||
auto *deviceAPI = new DeviceAPI(DeviceAPI::StreamSingleRx, deviceTabIndex, dspDeviceSourceEngine, nullptr, nullptr);
|
||||
|
||||
m_mainCore->m_deviceSets.back()->m_deviceAPI = deviceAPI;
|
||||
|
||||
@ -357,14 +350,14 @@ void MainServer::addMIMODevice()
|
||||
{
|
||||
DSPDeviceMIMOEngine *dspDeviceMIMOEngine = m_dspEngine->addDeviceMIMOEngine();
|
||||
|
||||
int deviceTabIndex = m_mainCore->m_deviceSets.size();
|
||||
auto deviceTabIndex = (int) m_mainCore->m_deviceSets.size();
|
||||
m_mainCore->m_deviceSets.push_back(new DeviceSet(deviceTabIndex, 2));
|
||||
m_mainCore->m_deviceSets.back()->m_deviceSourceEngine = nullptr;
|
||||
m_mainCore->m_deviceSets.back()->m_deviceSinkEngine = nullptr;
|
||||
m_mainCore->m_deviceSets.back()->m_deviceMIMOEngine = dspDeviceMIMOEngine;
|
||||
dspDeviceMIMOEngine->addSpectrumSink(m_mainCore->m_deviceSets.back()->m_spectrumVis);
|
||||
|
||||
DeviceAPI *deviceAPI = new DeviceAPI(DeviceAPI::StreamMIMO, deviceTabIndex, nullptr, nullptr, dspDeviceMIMOEngine);
|
||||
auto *deviceAPI = new DeviceAPI(DeviceAPI::StreamMIMO, deviceTabIndex, nullptr, nullptr, dspDeviceMIMOEngine);
|
||||
|
||||
// create a test MIMO by default
|
||||
int testMIMODeviceIndex = DeviceEnumerator::instance()->getTestMIMODeviceIndex();
|
||||
@ -392,12 +385,10 @@ void MainServer::addMIMODevice()
|
||||
|
||||
void MainServer::removeLastDevice()
|
||||
{
|
||||
int removedTabIndex = m_mainCore->m_deviceSets.size() - 1;
|
||||
auto removedTabIndex = (int) (m_mainCore->m_deviceSets.size() - 1);
|
||||
|
||||
if (m_mainCore->m_deviceSets.back()->m_deviceSourceEngine) // source set
|
||||
{
|
||||
DSPDeviceSourceEngine *lastDeviceEngine = m_mainCore->m_deviceSets.back()->m_deviceSourceEngine;
|
||||
|
||||
// deletes old UI and input object
|
||||
m_mainCore->m_deviceSets.back()->freeChannels(); // destroys the channel instances
|
||||
m_mainCore->m_deviceSets.back()->m_deviceAPI->resetSamplingDeviceId();
|
||||
@ -412,8 +403,6 @@ void MainServer::removeLastDevice()
|
||||
}
|
||||
else if (m_mainCore->m_deviceSets.back()->m_deviceSinkEngine) // sink set
|
||||
{
|
||||
DSPDeviceSinkEngine *lastDeviceEngine = m_mainCore->m_deviceSets.back()->m_deviceSinkEngine;
|
||||
|
||||
// deletes old UI and output object
|
||||
m_mainCore->m_deviceSets.back()->freeChannels();
|
||||
m_mainCore->m_deviceSets.back()->m_deviceAPI->resetSamplingDeviceId();
|
||||
@ -428,8 +417,6 @@ void MainServer::removeLastDevice()
|
||||
}
|
||||
else if (m_mainCore->m_deviceSets.back()->m_deviceMIMOEngine) // MIMO set
|
||||
{
|
||||
DSPDeviceMIMOEngine *lastDeviceEngine = m_mainCore->m_deviceSets.back()->m_deviceMIMOEngine;
|
||||
|
||||
m_mainCore->m_deviceSets.back()->freeChannels();
|
||||
m_mainCore->m_deviceSets.back()->m_deviceAPI->resetSamplingDeviceId();
|
||||
|
||||
@ -486,19 +473,17 @@ void MainServer::changeSampleSource(int deviceSetIndex, int selectedDeviceIndex)
|
||||
}
|
||||
|
||||
// add to buddies list
|
||||
std::vector<DeviceSet*>::iterator it = m_mainCore->m_deviceSets.begin();
|
||||
auto it = m_mainCore->m_deviceSets.begin();
|
||||
int nbOfBuddies = 0;
|
||||
|
||||
for (; it != m_mainCore->m_deviceSets.end(); ++it)
|
||||
{
|
||||
if (*it != deviceSet) // do not add to itself
|
||||
if ((*it != deviceSet) && // do not add to itself
|
||||
(deviceSet->m_deviceAPI->getHardwareId() == (*it)->m_deviceAPI->getHardwareId()) &&
|
||||
(deviceSet->m_deviceAPI->getSamplingDeviceSerial() == (*it)->m_deviceAPI->getSamplingDeviceSerial()))
|
||||
{
|
||||
if ((deviceSet->m_deviceAPI->getHardwareId() == (*it)->m_deviceAPI->getHardwareId()) &&
|
||||
(deviceSet->m_deviceAPI->getSamplingDeviceSerial() == (*it)->m_deviceAPI->getSamplingDeviceSerial()))
|
||||
{
|
||||
(*it)->m_deviceAPI->addBuddy(deviceSet->m_deviceAPI);
|
||||
nbOfBuddies++;
|
||||
}
|
||||
(*it)->m_deviceAPI->addBuddy(deviceSet->m_deviceAPI);
|
||||
nbOfBuddies++;
|
||||
}
|
||||
}
|
||||
|
||||
@ -547,7 +532,7 @@ void MainServer::changeSampleSink(int deviceSetIndex, int selectedDeviceIndex)
|
||||
{
|
||||
qDebug("MainServer::changeSampleSink: non existent device replaced by File Sink");
|
||||
int fileSinkDeviceIndex = DeviceEnumerator::instance()->getFileOutputDeviceIndex();
|
||||
const PluginInterface::SamplingDevice *samplingDevice = DeviceEnumerator::instance()->getTxSamplingDevice(fileSinkDeviceIndex);
|
||||
samplingDevice = DeviceEnumerator::instance()->getTxSamplingDevice(fileSinkDeviceIndex);
|
||||
deviceSet->m_deviceAPI->setSamplingDeviceSequence(samplingDevice->sequence);
|
||||
deviceSet->m_deviceAPI->setDeviceNbItems(samplingDevice->deviceNbItems);
|
||||
deviceSet->m_deviceAPI->setDeviceItemIndex(samplingDevice->deviceItemIndex);
|
||||
@ -559,19 +544,17 @@ void MainServer::changeSampleSink(int deviceSetIndex, int selectedDeviceIndex)
|
||||
}
|
||||
|
||||
// add to buddies list
|
||||
std::vector<DeviceSet*>::iterator it = m_mainCore->m_deviceSets.begin();
|
||||
auto it = m_mainCore->m_deviceSets.begin();
|
||||
int nbOfBuddies = 0;
|
||||
|
||||
for (; it != m_mainCore->m_deviceSets.end(); ++it)
|
||||
{
|
||||
if (*it != deviceSet) // do not add to itself
|
||||
if ((deviceSet->m_deviceAPI->getHardwareId() == (*it)->m_deviceAPI->getHardwareId()) &&
|
||||
(deviceSet->m_deviceAPI->getSamplingDeviceSerial() == (*it)->m_deviceAPI->getSamplingDeviceSerial()) &&
|
||||
(*it != deviceSet)) // do not add to itself
|
||||
{
|
||||
if ((deviceSet->m_deviceAPI->getHardwareId() == (*it)->m_deviceAPI->getHardwareId()) &&
|
||||
(deviceSet->m_deviceAPI->getSamplingDeviceSerial() == (*it)->m_deviceAPI->getSamplingDeviceSerial()))
|
||||
{
|
||||
(*it)->m_deviceAPI->addBuddy(deviceSet->m_deviceAPI);
|
||||
nbOfBuddies++;
|
||||
}
|
||||
(*it)->m_deviceAPI->addBuddy(deviceSet->m_deviceAPI);
|
||||
nbOfBuddies++;
|
||||
}
|
||||
}
|
||||
|
||||
@ -616,7 +599,7 @@ void MainServer::changeSampleMIMO(int deviceSetIndex, int selectedDeviceIndex)
|
||||
{
|
||||
qDebug("MainServer::changeSampleMIMO: non existent device replaced by Test MIMO");
|
||||
int testMIMODeviceIndex = DeviceEnumerator::instance()->getTestMIMODeviceIndex();
|
||||
const PluginInterface::SamplingDevice *samplingDevice = DeviceEnumerator::instance()->getMIMOSamplingDevice(testMIMODeviceIndex);
|
||||
samplingDevice = DeviceEnumerator::instance()->getMIMOSamplingDevice(testMIMODeviceIndex);
|
||||
deviceSet->m_deviceAPI->setSamplingDeviceSequence(samplingDevice->sequence);
|
||||
deviceSet->m_deviceAPI->setDeviceNbItems(samplingDevice->deviceNbItems);
|
||||
deviceSet->m_deviceAPI->setDeviceItemIndex(samplingDevice->deviceItemIndex);
|
||||
@ -671,7 +654,7 @@ void MainServer::deleteChannel(int deviceSetIndex, int channelIndex)
|
||||
void MainServer::addFeatureSet()
|
||||
{
|
||||
m_mainCore->appendFeatureSet();
|
||||
emit m_mainCore->featureSetAdded(m_mainCore->getFeatureeSets().size() - 1);
|
||||
emit m_mainCore->featureSetAdded((int) (m_mainCore->getFeatureeSets().size() - 1));
|
||||
}
|
||||
|
||||
void MainServer::removeFeatureSet(unsigned int featureSetIndex)
|
||||
|
Loading…
Reference in New Issue
Block a user