AudioCATSISO: fixed transverter processing

This commit is contained in:
f4exb 2024-04-28 01:15:36 +02:00
parent 956d1e6c07
commit 217c900609
5 changed files with 109 additions and 8 deletions

View File

@ -144,9 +144,6 @@ bool AudioCATSISO::startRx()
m_inputWorker->startWork();
m_inputWorkerThread->start();
qDebug("AudioCATSISO::startRx: started");
m_rxRunning = true;
qDebug() << "AudioCATSISO::startRx: start CAT";
m_catWorkerThread = new QThread();
@ -162,6 +159,12 @@ bool AudioCATSISO::startRx()
m_catWorker->startWork();
m_catWorkerThread->start();
qDebug("AudioCATSISO::startRx: started");
m_rxRunning = true;
AudioCATSISOCATWorker::MsgSetRxSampleRate *msgSetRxSampleRate = AudioCATSISOCATWorker::MsgSetRxSampleRate::create(m_rxSampleRate);
m_catWorker->getInputMessageQueue()->push(msgSetRxSampleRate);
AudioCATSISOCATWorker::MsgConfigureAudioCATSISOCATWorker *msgToCAT = AudioCATSISOCATWorker::MsgConfigureAudioCATSISOCATWorker::create(
m_settings, QList<QString>(), true
);
@ -470,6 +473,8 @@ void AudioCATSISO::applySettings(const AudioCATSISOSettings& settings, const QLi
{
audioDeviceManager->removeAudioSource(&m_inputFifo);
audioDeviceManager->addAudioSource(&m_inputFifo, getInputMessageQueue(), m_rxAudioDeviceIndex);
AudioCATSISOCATWorker::MsgSetRxSampleRate *msgSetRxSampleRate = AudioCATSISOCATWorker::MsgSetRxSampleRate::create(m_rxSampleRate);
m_catWorker->getInputMessageQueue()->push(msgSetRxSampleRate);
}
}

View File

@ -18,6 +18,7 @@
#include <QDebug>
#include <QTimer>
#include "dsp/devicesamplesource.h"
#include "audiocatsisocatworker.h"
// Compatibility with all versions of Hamlib
@ -27,6 +28,7 @@
MESSAGE_CLASS_DEFINITION(AudioCATSISOCATWorker::MsgConfigureAudioCATSISOCATWorker, Message)
MESSAGE_CLASS_DEFINITION(AudioCATSISOCATWorker::MsgPollTimerConnect, Message)
MESSAGE_CLASS_DEFINITION(AudioCATSISOCATWorker::MsgSetRxSampleRate, Message)
MESSAGE_CLASS_DEFINITION(AudioCATSISOCATWorker::MsgReportFrequency, Message)
AudioCATSISOCATWorker::AudioCATSISOCATWorker(QObject* parent) :
@ -77,17 +79,38 @@ void AudioCATSISOCATWorker::applySettings(const AudioCATSISOSettings& settings,
<< " force:" << force
<< settings.getDebugString(settingsKeys, force);
if (settingsKeys.contains("rxCenterFrequency") || force)
qint64 rxXlatedDeviceCenterFrequency = settings.m_rxCenterFrequency;
rxXlatedDeviceCenterFrequency -= settings.m_transverterMode ? settings.m_transverterDeltaFrequency : 0;
rxXlatedDeviceCenterFrequency = rxXlatedDeviceCenterFrequency < 0 ? 0 : rxXlatedDeviceCenterFrequency;
qint64 txXlatedDeviceCenterFrequency = settings.m_txCenterFrequency;
txXlatedDeviceCenterFrequency -= settings.m_transverterMode ? settings.m_transverterDeltaFrequency : 0;
txXlatedDeviceCenterFrequency = txXlatedDeviceCenterFrequency < 0 ? 0 : txXlatedDeviceCenterFrequency;
if (settingsKeys.contains("rxCenterFrequency") ||
settingsKeys.contains("transverterMode") ||
settingsKeys.contains("transverterDeltaFrequency") || force)
{
if (!m_ptt) {
catSetFrequency(settings.m_rxCenterFrequency);
if (!m_ptt)
{
qint64 deviceCenterFrequency = DeviceSampleSource::calculateDeviceCenterFrequency(
rxXlatedDeviceCenterFrequency,
0,
settings.m_log2Decim,
(DeviceSampleSource::fcPos_t) settings.m_fcPosRx,
m_rxSampleRate,
DeviceSampleSource::FrequencyShiftScheme::FSHIFT_STD,
false);
catSetFrequency(deviceCenterFrequency);
}
}
if (settingsKeys.contains("txCenterFrequency") || force)
if (settingsKeys.contains("txCenterFrequency") ||
settingsKeys.contains("transverterMode") ||
settingsKeys.contains("transverterDeltaFrequency") || force)
{
if (m_ptt) {
catSetFrequency(settings.m_txCenterFrequency);
catSetFrequency(txXlatedDeviceCenterFrequency);
}
}
@ -143,6 +166,30 @@ bool AudioCATSISOCATWorker::handleMessage(const Message& message)
return true;
}
else if (MsgSetRxSampleRate::match(message))
{
MsgSetRxSampleRate& cmd = (MsgSetRxSampleRate&) message;
m_rxSampleRate = cmd.getSampleRate();
qDebug("AudioCATSISOCATWorker::handleMessage: MsgSetRxSampleRate: %d", m_rxSampleRate);
if (m_settings.m_transverterMode && !m_ptt)
{
qint64 rxXlatedDeviceCenterFrequency = m_settings.m_rxCenterFrequency;
rxXlatedDeviceCenterFrequency -= m_settings.m_transverterMode ? m_settings.m_transverterDeltaFrequency : 0;
rxXlatedDeviceCenterFrequency = rxXlatedDeviceCenterFrequency < 0 ? 0 : rxXlatedDeviceCenterFrequency;
qint64 deviceCenterFrequency = DeviceSampleSource::calculateDeviceCenterFrequency(
rxXlatedDeviceCenterFrequency,
0,
m_settings.m_log2Decim,
(DeviceSampleSource::fcPos_t) m_settings.m_fcPosRx,
m_rxSampleRate,
DeviceSampleSource::FrequencyShiftScheme::FSHIFT_STD,
false);
catSetFrequency(deviceCenterFrequency);
}
return true;
}
return false;
}
@ -296,6 +343,10 @@ void AudioCATSISOCATWorker::pollingTick()
freq_t freq; // double
int retcode = rig_get_freq(m_rig, RIG_VFO_CURR, &freq);
if (m_settings.m_transverterMode) {
freq += m_settings.m_transverterDeltaFrequency;
}
if (retcode == RIG_OK)
{
// qDebug("AudioCATSISOCATWorker::pollingTick: %f %lu", freq, m_frequency);

View File

@ -71,6 +71,25 @@ public:
{ }
};
class MsgSetRxSampleRate : public Message {
MESSAGE_CLASS_DECLARATION
public:
int getSampleRate() const { return m_sampleRate; }
static MsgSetRxSampleRate* create(int sampleRate) {
return new MsgSetRxSampleRate(sampleRate);
}
protected:
int m_sampleRate;
MsgSetRxSampleRate(int sampleRate) :
Message(),
m_sampleRate(sampleRate)
{ }
};
class MsgReportFrequency : public Message {
MESSAGE_CLASS_DECLARATION
@ -117,6 +136,7 @@ private:
QTimer *m_pollTimer;
bool m_ptt;
uint64_t m_frequency;
int m_rxSampleRate;
private slots:
void handleInputMessages();

View File

@ -424,6 +424,9 @@ void AudioCATSISOGUI::displaySettings()
{
blockApplySettings(true);
ui->transverter->setDeltaFrequency(m_settings.m_transverterDeltaFrequency);
ui->transverter->setDeltaFrequencyActive(m_settings.m_transverterMode);
ui->transverter->setIQOrder(m_settings.m_iqOrder);
ui->rxDeviceLabel->setText(m_settings.m_rxDeviceName);
ui->txDeviceLabel->setText(m_settings.m_txDeviceName);
ui->dcBlock->setChecked(m_settings.m_dcBlock);

View File

@ -73,6 +73,8 @@ void AudioCATSISOSettings::resetToDefaults()
m_pttSpectrumLink = true;
m_rxCenterFrequency = 14200000;
m_txCenterFrequency = 14200000;
m_transverterMode = false;
m_transverterDeltaFrequency = 0;
m_rxDeviceName = "";
m_rxVolume = 1.0f;
m_log2Decim = 0;
@ -106,6 +108,8 @@ AudioCATSISOSettings::AudioCATSISOSettings(const AudioCATSISOSettings& other)
m_pttSpectrumLink = other.m_pttSpectrumLink;
m_rxCenterFrequency = other.m_rxCenterFrequency;
m_txCenterFrequency = other.m_txCenterFrequency;
m_transverterMode = other.m_transverterMode;
m_transverterDeltaFrequency = other.m_transverterDeltaFrequency;
m_rxDeviceName = other.m_rxDeviceName;
m_rxVolume = other.m_rxVolume;
m_log2Decim = other.m_log2Decim;
@ -144,6 +148,8 @@ QByteArray AudioCATSISOSettings::serialize() const
s.writeBool(6, m_dcBlock);
s.writeBool(7, m_iqCorrection);
s.writeS32(8, (int) m_fcPosRx);
s.writeBool(9, m_transverterMode);
s.writeS64(10, m_transverterDeltaFrequency);
s.writeString(21, m_txDeviceName);
s.writeU64(22, m_txCenterFrequency);
@ -195,6 +201,8 @@ bool AudioCATSISOSettings::deserialize(const QByteArray& data)
d.readBool(7, &m_iqCorrection, false);
d.readS32(8, &intval, 2);
m_fcPosRx = (fcPos_t) intval;
d.readBool(9, &m_transverterMode, false);
d.readS64(10, &m_transverterDeltaFrequency, 0);
d.readString(21, &m_txDeviceName, "");
d.readU64(22, &m_txCenterFrequency, 14200000);
@ -239,6 +247,13 @@ bool AudioCATSISOSettings::deserialize(const QByteArray& data)
void AudioCATSISOSettings::applySettings(const QStringList& settingsKeys, const AudioCATSISOSettings& settings)
{
if (settingsKeys.contains("transverterMode")) {
m_transverterMode = settings.m_transverterMode;
}
if (settingsKeys.contains("transverterDeltaFrequency")) {
m_transverterDeltaFrequency = settings.m_transverterDeltaFrequency;
}
if (settingsKeys.contains("rxDeviceName")) {
m_rxDeviceName = settings.m_rxDeviceName;
}
@ -332,6 +347,13 @@ QString AudioCATSISOSettings::getDebugString(const QStringList& settingsKeys, bo
{
std::ostringstream ostr;
if (settingsKeys.contains("transverterMode") || force) {
ostr << " m_transverterMode: " << m_transverterMode;
}
if (settingsKeys.contains("transverterDeltaFrequency") || force) {
ostr << " m_transverterDeltaFrequency: " << m_transverterDeltaFrequency;
}
if (settingsKeys.contains("rxDeviceName") || force) {
ostr << " m_rxDeviceName: " << m_rxDeviceName.toStdString();
}