1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2026-06-07 08:24:43 -04:00

Metis MISO: implemented transverter mode

This commit is contained in:
f4exb
2020-09-08 15:18:50 +02:00
parent d4410a003f
commit 2f737b77e2
14 changed files with 435 additions and 46 deletions
+79 -9
View File
@@ -289,15 +289,20 @@ bool MetisMISO::applySettings(const MetisMISOSettings& settings, bool force)
<< " 8:" << settings.m_rxCenterFrequencies[7]
<< " ] m_txCenterFrequency:" << settings.m_txCenterFrequency
<< " m_rxSubsamplingIndexes: ["
<< " 1:"<< settings.m_rxSubsamplingIndexes[0]
<< " 2:"<< settings.m_rxSubsamplingIndexes[1]
<< " 3:"<< settings.m_rxSubsamplingIndexes[2]
<< " 4:"<< settings.m_rxSubsamplingIndexes[3]
<< " 5:"<< settings.m_rxSubsamplingIndexes[4]
<< " 6:"<< settings.m_rxSubsamplingIndexes[5]
<< " 7:"<< settings.m_rxSubsamplingIndexes[6]
<< " 8:"<< settings.m_rxSubsamplingIndexes[7]
<< " ] m_sampleRateIndex:" << settings.m_sampleRateIndex
<< " 1:" << settings.m_rxSubsamplingIndexes[0]
<< " 2:" << settings.m_rxSubsamplingIndexes[1]
<< " 3:" << settings.m_rxSubsamplingIndexes[2]
<< " 4:" << settings.m_rxSubsamplingIndexes[3]
<< " 5:" << settings.m_rxSubsamplingIndexes[4]
<< " 6:" << settings.m_rxSubsamplingIndexes[5]
<< " 7:" << settings.m_rxSubsamplingIndexes[6]
<< " 8:" << settings.m_rxSubsamplingIndexes[7]
<< " ] m_rxTransverterMode:" << settings.m_rxTransverterMode
<< " m_rxTransverterDeltaFrequency:" << settings.m_rxTransverterDeltaFrequency
<< " m_txTransverterMode:" << settings.m_txTransverterMode
<< " m_txTransverterDeltaFrequency:" << settings.m_txTransverterDeltaFrequency
<< " m_iqOrder:" << settings.m_iqOrder
<< " m_sampleRateIndex:" << settings.m_sampleRateIndex
<< " m_log2Decim:" << settings.m_log2Decim
<< " m_preamp:" << settings.m_preamp
<< " m_random:" << settings.m_random
@@ -346,6 +351,36 @@ bool MetisMISO::applySettings(const MetisMISOSettings& settings, bool force)
propagateSettings = true;
}
if ((m_settings.m_rxTransverterMode != settings.m_rxTransverterMode) || force)
{
reverseAPIKeys.append("rxTransverterMode");
propagateSettings = true;
}
if ((m_settings.m_rxTransverterDeltaFrequency != settings.m_rxTransverterDeltaFrequency) || force)
{
reverseAPIKeys.append("rxTransverterDeltaFrequency");
propagateSettings = true;
}
if ((m_settings.m_txTransverterMode != settings.m_txTransverterMode) || force)
{
reverseAPIKeys.append("txTransverterMode");
propagateSettings = true;
}
if ((m_settings.m_txTransverterDeltaFrequency != settings.m_txTransverterDeltaFrequency) || force)
{
reverseAPIKeys.append("txTransverterDeltaFrequency");
propagateSettings = true;
}
if ((m_settings.m_iqOrder != settings.m_iqOrder) || force)
{
reverseAPIKeys.append("iqOrder");
propagateSettings = true;
}
if ((m_settings.m_sampleRateIndex != settings.m_sampleRateIndex) || force)
{
reverseAPIKeys.append("sampleRateIndex");
@@ -526,6 +561,21 @@ void MetisMISO::webapiUpdateDeviceSettings(
if (deviceSettingsKeys.contains("txCenterFrequency")) {
settings.m_txCenterFrequency = response.getMetisMisoSettings()->getTxCenterFrequency();
}
if (deviceSettingsKeys.contains("rxTransverterMode")) {
settings.m_rxTransverterMode = response.getMetisMisoSettings()->getRxTransverterMode() != 0;
}
if (deviceSettingsKeys.contains("rxTransverterDeltaFrequency")) {
settings.m_rxTransverterDeltaFrequency = response.getMetisMisoSettings()->getRxTransverterDeltaFrequency();
}
if (deviceSettingsKeys.contains("txTransverterMode")) {
settings.m_txTransverterMode = response.getMetisMisoSettings()->getTxTransverterMode() != 0;
}
if (deviceSettingsKeys.contains("txTransverterDeltaFrequency")) {
settings.m_txTransverterDeltaFrequency = response.getMetisMisoSettings()->getTxTransverterDeltaFrequency();
}
if (deviceSettingsKeys.contains("iqOrder")) {
settings.m_iqOrder = response.getMetisMisoSettings()->getIqOrder() != 0;
}
if (deviceSettingsKeys.contains("sampleRateIndex")) {
settings.m_sampleRateIndex = response.getMetisMisoSettings()->getSampleRateIndex();
}
@@ -580,6 +630,11 @@ void MetisMISO::webapiFormatDeviceSettings(SWGSDRangel::SWGDeviceSettings& respo
}
response.getMetisMisoSettings()->setTxCenterFrequency(settings.m_txCenterFrequency);
response.getMetisMisoSettings()->setRxTransverterMode(settings.m_rxTransverterMode ? 1 : 0);
response.getMetisMisoSettings()->setRxTransverterDeltaFrequency(settings.m_rxTransverterDeltaFrequency);
response.getMetisMisoSettings()->setTxTransverterMode(settings.m_txTransverterMode ? 1 : 0);
response.getMetisMisoSettings()->setTxTransverterDeltaFrequency(settings.m_txTransverterDeltaFrequency);
response.getMetisMisoSettings()->setIqOrder(settings.m_iqOrder ? 1 : 0);
response.getMetisMisoSettings()->setSampleRateIndex(settings.m_sampleRateIndex);
response.getMetisMisoSettings()->setLog2Decim(settings.m_log2Decim);
response.getMetisMisoSettings()->setLOppmTenths(settings.m_LOppmTenths);
@@ -630,6 +685,21 @@ void MetisMISO::webapiReverseSendSettings(const QList<QString>& deviceSettingsKe
if (deviceSettingsKeys.contains("txCenterFrequency") || force) {
swgMetisMISOSettings->setTxCenterFrequency(settings.m_txCenterFrequency);
}
if (deviceSettingsKeys.contains("rxTransverterMode") || force) {
swgMetisMISOSettings->setRxTransverterMode(settings.m_rxTransverterMode ? 1 : 0);
}
if (deviceSettingsKeys.contains("rxTransverterDeltaFrequency") || force) {
swgMetisMISOSettings->setRxTransverterDeltaFrequency(settings.m_rxTransverterDeltaFrequency);
}
if (deviceSettingsKeys.contains("txTransverterMode") || force) {
swgMetisMISOSettings->setTxTransverterMode(settings.m_txTransverterMode ? 1 : 0);
}
if (deviceSettingsKeys.contains("txTransverterDeltaFrequency") || force) {
swgMetisMISOSettings->setTxTransverterDeltaFrequency(settings.m_txTransverterDeltaFrequency);
}
if (deviceSettingsKeys.contains("iqOrder") || force) {
swgMetisMISOSettings->setIqOrder(settings.m_iqOrder ? 1 : 0);
}
if (deviceSettingsKeys.contains("sampleRateIndex") || force) {
swgMetisMISOSettings->setSampleRateIndex(settings.m_sampleRateIndex);
}
+30 -3
View File
@@ -260,6 +260,7 @@ void MetisMISOGui::on_subsamplingIndex_currentIndexChanged(int index)
ui->subsamplingIndex->setToolTip(tr("Subsampling band index [%1 - %2 MHz]")
.arg(index*61.44).arg((index+1)*61.44));
displayFrequency();
setCenterFrequency(ui->centerFrequency->getValueNew() * 1000);
sendSettings();
}
}
@@ -276,6 +277,27 @@ void MetisMISOGui::on_iqCorrection_toggled(bool checked)
sendSettings();
}
void MetisMISOGui::on_transverter_clicked()
{
if (m_streamIndex < MetisMISOSettings::m_maxReceivers)
{
m_settings.m_rxTransverterMode = ui->transverter->getDeltaFrequencyAcive();
m_settings.m_rxTransverterDeltaFrequency = ui->transverter->getDeltaFrequency();
m_settings.m_iqOrder = ui->transverter->getIQOrder();
qDebug("MetisMISOGui::on_transverter_clicked: Rx: %lld Hz %s", m_settings.m_rxTransverterDeltaFrequency, m_settings.m_rxTransverterMode ? "on" : "off");
}
else
{
m_settings.m_txTransverterMode = ui->transverter->getDeltaFrequencyAcive();
m_settings.m_txTransverterDeltaFrequency = ui->transverter->getDeltaFrequency();
qDebug("MetisMISOGui::on_transverter_clicked: Tx: %lld Hz %s", m_settings.m_txTransverterDeltaFrequency, m_settings.m_txTransverterMode ? "on" : "off");
}
displayFrequency();
setCenterFrequency(ui->centerFrequency->getValueNew() * 1000);
sendSettings();
}
void MetisMISOGui::on_preamp_toggled(bool checked)
{
m_settings.m_preamp = checked;
@@ -472,24 +494,29 @@ void MetisMISOGui::handleInputMessages()
void MetisMISOGui::displayFrequency()
{
qint64 centerFrequency;
qint64 fBaseLow, fBaseHigh;
if (m_streamIndex < MetisMISOSettings::m_maxReceivers)
{
int subsamplingIndex = m_settings.m_rxSubsamplingIndexes[m_streamIndex];
centerFrequency = m_settings.m_rxCenterFrequencies[m_streamIndex];
ui->centerFrequency->setValueRange(7, subsamplingIndex*61440, (subsamplingIndex+1)*61440);
fBaseLow = subsamplingIndex*61440;
fBaseHigh = (subsamplingIndex+1)*61440;
}
else if (m_streamIndex == MetisMISOSettings::m_maxReceivers)
{
centerFrequency = m_settings.m_txCenterFrequency;
ui->centerFrequency->setValueRange(7, 0, 61440);
fBaseLow = 0;
fBaseHigh = 61440;
}
else
{
fBaseLow = 0;
fBaseHigh = 61440;
centerFrequency = 0;
ui->centerFrequency->setValueRange(7, 0, 61440);
}
ui->centerFrequency->setValueRange(7, fBaseLow, fBaseHigh);
ui->centerFrequency->setValue(centerFrequency / 1000);
}
@@ -93,6 +93,7 @@ private slots:
void on_subsamplingIndex_currentIndexChanged(int index);
void on_dcBlock_toggled(bool checked);
void on_iqCorrection_toggled(bool checked);
void on_transverter_clicked();
void on_preamp_toggled(bool checked);
void on_random_toggled(bool checked);
void on_dither_toggled(bool checked);
@@ -727,6 +727,22 @@
</property>
</widget>
</item>
<item>
<widget class="TransverterButton" name="transverter">
<property name="maximumSize">
<size>
<width>24</width>
<height>24</height>
</size>
</property>
<property name="toolTip">
<string>Transverter frequency translation dialog</string>
</property>
<property name="text">
<string>X</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
@@ -812,6 +828,11 @@
<extends>QToolButton</extends>
<header>gui/buttonswitch.h</header>
</customwidget>
<customwidget>
<class>TransverterButton</class>
<extends>QPushButton</extends>
<header>gui/transverterbutton.h</header>
</customwidget>
</customwidgets>
<resources>
<include location="../../../sdrgui/resources/res.qrc"/>
@@ -31,6 +31,11 @@ MetisMISOSettings::MetisMISOSettings(const MetisMISOSettings& other)
std::copy(other.m_rxCenterFrequencies, other.m_rxCenterFrequencies + m_maxReceivers, m_rxCenterFrequencies);
std::copy(other.m_rxSubsamplingIndexes, other.m_rxSubsamplingIndexes + m_maxReceivers, m_rxSubsamplingIndexes);
m_txCenterFrequency = other.m_txCenterFrequency;
m_rxTransverterMode = other.m_rxTransverterMode;
m_rxTransverterDeltaFrequency = other.m_rxTransverterDeltaFrequency;
m_txTransverterMode = other.m_txTransverterMode;
m_txTransverterDeltaFrequency = other.m_txTransverterDeltaFrequency;
m_iqOrder = other.m_iqOrder;
m_sampleRateIndex = other.m_sampleRateIndex;
m_log2Decim = other.m_log2Decim;
m_LOppmTenths = other.m_LOppmTenths;
@@ -54,6 +59,11 @@ void MetisMISOSettings::resetToDefaults()
std::fill(m_rxCenterFrequencies, m_rxCenterFrequencies + m_maxReceivers, 7074000);
std::fill(m_rxSubsamplingIndexes, m_rxSubsamplingIndexes + m_maxReceivers, 0);
m_txCenterFrequency = 7074000;
m_rxTransverterMode = false;
m_rxTransverterDeltaFrequency = 0;
m_txTransverterMode = false;
m_txTransverterDeltaFrequency = 0;
m_iqOrder = true;
m_sampleRateIndex = 0; // 48000 kS/s
m_log2Decim = 0;
m_LOppmTenths = 0;
@@ -77,20 +87,25 @@ QByteArray MetisMISOSettings::serialize() const
s.writeU32(1, m_nbReceivers);
s.writeBool(2, m_txEnable);
s.writeU64(3, m_txCenterFrequency);
s.writeU32(4, m_sampleRateIndex);
s.writeU32(5, m_log2Decim);
s.writeS32(6, m_LOppmTenths);
s.writeBool(7, m_preamp);
s.writeBool(8, m_random);
s.writeBool(9, m_dither);
s.writeBool(10, m_duplex);
s.writeBool(11, m_dcBlock);
s.writeBool(12, m_iqCorrection);
s.writeU32(13, m_txDrive);
s.writeBool(14, m_useReverseAPI);
s.writeString(15, m_reverseAPIAddress);
s.writeU32(16, m_reverseAPIPort);
s.writeU32(17, m_reverseAPIDeviceIndex);
s.writeBool(4, m_rxTransverterMode);
s.writeS64(5, m_rxTransverterDeltaFrequency);
s.writeBool(6, m_txTransverterMode);
s.writeS64(7, m_txTransverterDeltaFrequency);
s.writeBool(8, m_iqOrder);
s.writeU32(9, m_sampleRateIndex);
s.writeU32(10, m_log2Decim);
s.writeS32(11, m_LOppmTenths);
s.writeBool(12, m_preamp);
s.writeBool(13, m_random);
s.writeBool(14, m_dither);
s.writeBool(15, m_duplex);
s.writeBool(16, m_dcBlock);
s.writeBool(17, m_iqCorrection);
s.writeU32(18, m_txDrive);
s.writeBool(19, m_useReverseAPI);
s.writeString(20, m_reverseAPIAddress);
s.writeU32(21, m_reverseAPIPort);
s.writeU32(22, m_reverseAPIDeviceIndex);
for (int i = 0; i < m_maxReceivers; i++)
{
@@ -119,19 +134,24 @@ bool MetisMISOSettings::deserialize(const QByteArray& data)
d.readU32(1, &m_nbReceivers, 1);
d.readBool(2, &m_txEnable, false);
d.readU64(3, &m_txCenterFrequency, 7074000);
d.readU32(4, &m_sampleRateIndex, 0);
d.readU32(5, &m_log2Decim, 0);
d.readS32(6, &m_LOppmTenths, 0);
d.readBool(7, &m_preamp, false);
d.readBool(8, &m_random, false);
d.readBool(9, &m_dither, false);
d.readBool(10, &m_duplex, false);
d.readBool(11, &m_dcBlock, false);
d.readBool(12, &m_iqCorrection, false);
d.readU32(13, &m_txDrive, 15);
d.readBool(14, &m_useReverseAPI, false);
d.readString(15, &m_reverseAPIAddress, "127.0.0.1");
d.readU32(16, &utmp, 0);
d.readBool(4, &m_rxTransverterMode, false);
d.readS64(5, &m_rxTransverterDeltaFrequency, 0);
d.readBool(6, &m_txTransverterMode, false);
d.readS64(7, &m_txTransverterDeltaFrequency, 0);
d.readBool(8, &m_iqOrder, true);
d.readU32(9, &m_sampleRateIndex, 0);
d.readU32(10, &m_log2Decim, 0);
d.readS32(11, &m_LOppmTenths, 0);
d.readBool(12, &m_preamp, false);
d.readBool(13, &m_random, false);
d.readBool(14, &m_dither, false);
d.readBool(15, &m_duplex, false);
d.readBool(16, &m_dcBlock, false);
d.readBool(17, &m_iqCorrection, false);
d.readU32(18, &m_txDrive, 15);
d.readBool(19, &m_useReverseAPI, false);
d.readString(20, &m_reverseAPIAddress, "127.0.0.1");
d.readU32(21, &utmp, 0);
if ((utmp > 1023) && (utmp < 65535)) {
m_reverseAPIPort = utmp;
@@ -139,7 +159,7 @@ bool MetisMISOSettings::deserialize(const QByteArray& data)
m_reverseAPIPort = 8888;
}
d.readU32(17, &utmp, 0);
d.readU32(22, &utmp, 0);
m_reverseAPIDeviceIndex = utmp > 99 ? 99 : utmp;
for (int i = 0; i < m_maxReceivers; i++)
@@ -27,6 +27,11 @@ struct MetisMISOSettings {
quint64 m_rxCenterFrequencies[m_maxReceivers];
unsigned int m_rxSubsamplingIndexes[m_maxReceivers];
quint64 m_txCenterFrequency;
bool m_rxTransverterMode;
qint64 m_rxTransverterDeltaFrequency;
bool m_txTransverterMode;
qint64 m_txTransverterDeltaFrequency;
bool m_iqOrder;
unsigned int m_sampleRateIndex;
unsigned int m_log2Decim;
int m_LOppmTenths;
@@ -402,7 +402,7 @@ int MetisMISOUDPHandler::getCommandValue(int commandIndex)
}
else if (commandIndex == 2)
{
return m_settings.m_txCenterFrequency;
return getTxCenterFrequency();
}
else if (commandIndex == 4)
{
@@ -451,11 +451,14 @@ quint64 MetisMISOUDPHandler::getRxCenterFrequency(int index)
{
qint64 deviceCenterFrequency;
qint64 loHalfFrequency = 61440000LL - ((m_settings.m_LOppmTenths * 122880000LL) / 20000000LL);
qint64 requiredRxFrequency = m_settings.m_rxCenterFrequencies[index]
- (m_settings.m_rxTransverterMode ? m_settings.m_rxTransverterDeltaFrequency : 0);
requiredRxFrequency = requiredRxFrequency < 0 ? 0 : requiredRxFrequency;
if (m_settings.m_rxSubsamplingIndexes[index] % 2 == 0) {
deviceCenterFrequency = m_settings.m_rxCenterFrequencies[index] - m_settings.m_rxSubsamplingIndexes[index]*loHalfFrequency;
deviceCenterFrequency = requiredRxFrequency - m_settings.m_rxSubsamplingIndexes[index]*loHalfFrequency;
} else {
deviceCenterFrequency = (m_settings.m_rxSubsamplingIndexes[index] + 1)*loHalfFrequency - m_settings.m_rxCenterFrequencies[index];
deviceCenterFrequency = (m_settings.m_rxSubsamplingIndexes[index] + 1)*loHalfFrequency - requiredRxFrequency;
}
qint64 df = ((qint64)deviceCenterFrequency * m_settings.m_LOppmTenths) / 10000000LL;
@@ -464,9 +467,17 @@ quint64 MetisMISOUDPHandler::getRxCenterFrequency(int index)
return deviceCenterFrequency < 0 ? 0 : deviceCenterFrequency > 61440000 ? 61440000 : deviceCenterFrequency;
}
quint64 MetisMISOUDPHandler::getTxCenterFrequency()
{
qint64 requiredTxFrequency = m_settings.m_txCenterFrequency;
- (m_settings.m_txTransverterMode ? m_settings.m_txTransverterDeltaFrequency : 0);
requiredTxFrequency = requiredTxFrequency < 0 ? 0 : requiredTxFrequency;
return requiredTxFrequency;
}
bool MetisMISOUDPHandler::getRxIQInversion(int index)
{
return (m_settings.m_rxSubsamplingIndexes[index] % 2) == 1;
return ((m_settings.m_rxSubsamplingIndexes[index] % 2) == 1) ^ !m_settings.m_iqOrder;
}
void MetisMISOUDPHandler::processIQBuffer(unsigned char* buffer)
@@ -127,6 +127,7 @@ private:
int getCommandValue(int commandIndex);
void processIQBuffer(unsigned char* buffer);
quint64 getRxCenterFrequency(int index);
quint64 getTxCenterFrequency();
bool getRxIQInversion(int index);
private slots: