mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-10-25 01:50:21 -04:00 
			
		
		
		
	
		
			
	
	
		
			311 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			311 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
|  | #include "osmosdrgui.h"
 | ||
|  | #include "ui_osmosdrgui.h"
 | ||
|  | #include "plugin/pluginapi.h"
 | ||
|  | 
 | ||
|  | OsmoSDRGui::OsmoSDRGui(PluginAPI* pluginAPI, QWidget* parent) : | ||
|  | 	QWidget(parent), | ||
|  | 	ui(new Ui::OsmoSDRGui), | ||
|  | 	m_pluginAPI(pluginAPI), | ||
|  | 	m_settings(), | ||
|  | 	m_sampleSource(NULL) | ||
|  | { | ||
|  | 	ui->setupUi(this); | ||
|  | 	ui->centerFrequency->setValueRange(7, 20000U, 2200000U); | ||
|  | 	connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware())); | ||
|  | 	displaySettings(); | ||
|  | 
 | ||
|  | 	m_sampleSource = new OsmoSDRInput(m_pluginAPI->getMainWindowMessageQueue()); | ||
|  | 	m_pluginAPI->setSampleSource(m_sampleSource); | ||
|  | } | ||
|  | 
 | ||
|  | OsmoSDRGui::~OsmoSDRGui() | ||
|  | { | ||
|  | 	delete ui; | ||
|  | } | ||
|  | 
 | ||
|  | void OsmoSDRGui::destroy() | ||
|  | { | ||
|  | 	delete this; | ||
|  | } | ||
|  | 
 | ||
|  | void OsmoSDRGui::setName(const QString& name) | ||
|  | { | ||
|  | 	setObjectName(name); | ||
|  | } | ||
|  | 
 | ||
|  | void OsmoSDRGui::resetToDefaults() | ||
|  | { | ||
|  | 	m_generalSettings.resetToDefaults(); | ||
|  | 	m_settings.resetToDefaults(); | ||
|  | 	displaySettings(); | ||
|  | 	sendSettings(); | ||
|  | } | ||
|  | 
 | ||
|  | QByteArray OsmoSDRGui::serializeGeneral() const | ||
|  | { | ||
|  | 	return m_generalSettings.serialize(); | ||
|  | } | ||
|  | 
 | ||
|  | bool OsmoSDRGui::deserializeGeneral(const QByteArray&data) | ||
|  | { | ||
|  | 	if(m_generalSettings.deserialize(data)) { | ||
|  | 		displaySettings(); | ||
|  | 		sendSettings(); | ||
|  | 		return true; | ||
|  | 	} else { | ||
|  | 		resetToDefaults(); | ||
|  | 		return false; | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | quint64 OsmoSDRGui::getCenterFrequency() const | ||
|  | { | ||
|  | 	return m_generalSettings.m_centerFrequency; | ||
|  | } | ||
|  | 
 | ||
|  | QByteArray OsmoSDRGui::serialize() const | ||
|  | { | ||
|  | 	return m_settings.serialize(); | ||
|  | } | ||
|  | 
 | ||
|  | bool OsmoSDRGui::deserialize(const QByteArray& data) | ||
|  | { | ||
|  | 	if(m_settings.deserialize(data)) { | ||
|  | 		displaySettings(); | ||
|  | 		sendSettings(); | ||
|  | 		return true; | ||
|  | 	} else { | ||
|  | 		resetToDefaults(); | ||
|  | 		return false; | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | bool OsmoSDRGui::handleMessage(Message* message) | ||
|  | { | ||
|  | 	return false; | ||
|  | 	/*
 | ||
|  | 	if(message->id() == OsmoSDRInput::MsgReportOsmoSDR::ID()) { | ||
|  | 		m_gains = ((RTLSDRInput::MsgReportRTLSDR*)message)->getGains(); | ||
|  | 		displaySettings(); | ||
|  | 		message->completed(); | ||
|  | 		return true; | ||
|  | 	} else { | ||
|  | 		return false; | ||
|  | 	}*/ | ||
|  | } | ||
|  | #if 0
 | ||
|  | 
 | ||
|  | OsmoSDRGui::OsmoSDRGui(MessageQueue* msgQueue, QWidget* parent) : | ||
|  | 	SampleSourceGUI(parent), | ||
|  | 	ui(new Ui::OsmoSDRGui), | ||
|  | 	m_msgQueue(msgQueue), | ||
|  | 	m_settings() | ||
|  | { | ||
|  | 	ui->setupUi(this); | ||
|  | 	ui->centerFrequency->setValueRange(7, 20000U, 2200000U); | ||
|  | 	connect(&m_updateTimer, SIGNAL(timeout()), this, SLOT(updateHardware())); | ||
|  | 	displaySettings(); | ||
|  | } | ||
|  | 
 | ||
|  | OsmoSDRGui::~OsmoSDRGui() | ||
|  | { | ||
|  | 	delete ui; | ||
|  | } | ||
|  | 
 | ||
|  | QString OsmoSDRGui::serializeSettings() const | ||
|  | { | ||
|  | 	return m_settings.serialize(); | ||
|  | } | ||
|  | 
 | ||
|  | bool OsmoSDRGui::deserializeSettings(const QString& settings) | ||
|  | { | ||
|  | 	if(m_settings.deserialize(settings)) { | ||
|  | 		displaySettings(); | ||
|  | 		sendSettings(); | ||
|  | 		return true; | ||
|  | 	} else { | ||
|  | 		return false; | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | bool OsmoSDRGui::handleSourceMessage(DSPCmdSourceToGUI* cmd) | ||
|  | { | ||
|  | 	return false; | ||
|  | } | ||
|  | #endif
 | ||
|  | 
 | ||
|  | void OsmoSDRGui::displaySettings() | ||
|  | { | ||
|  | 	ui->centerFrequency->setValue(m_generalSettings.m_centerFrequency / 1000); | ||
|  | 	ui->iqSwap->setChecked(m_settings.m_swapIQ); | ||
|  | 	ui->decimation->setValue(m_settings.m_decimation); | ||
|  | 	ui->e4000LNAGain->setValue(e4kLNAGainToIdx(m_settings.m_lnaGain)); | ||
|  | 
 | ||
|  | 	ui->e4000MixerGain->setCurrentIndex((m_settings.m_mixerGain - 40) / 80); | ||
|  | 	if(m_settings.m_mixerEnhancement == 0) | ||
|  | 		ui->e4000MixerEnh->setCurrentIndex(0); | ||
|  | 	else ui->e4000MixerEnh->setCurrentIndex((m_settings.m_mixerEnhancement + 10) / 20); | ||
|  | 
 | ||
|  | 	ui->e4000if1->setCurrentIndex((m_settings.m_if1gain + 30) / 90); | ||
|  | 	ui->e4000if2->setCurrentIndex(m_settings.m_if2gain / 30); | ||
|  | 	ui->e4000if3->setCurrentIndex(m_settings.m_if3gain / 30); | ||
|  | 	ui->e4000if4->setCurrentIndex(m_settings.m_if4gain / 10); | ||
|  | 	ui->e4000if5->setCurrentIndex(m_settings.m_if5gain / 30 - 1); | ||
|  | 	ui->e4000if6->setCurrentIndex(m_settings.m_if6gain / 30 - 1); | ||
|  | 	ui->filterI1->setValue(m_settings.m_opAmpI1); | ||
|  | 	ui->filterI2->setValue(m_settings.m_opAmpI2); | ||
|  | 	ui->filterQ1->setValue(m_settings.m_opAmpQ1); | ||
|  | 	ui->filterQ2->setValue(m_settings.m_opAmpQ2); | ||
|  | 
 | ||
|  | 	ui->e4kI->setValue(m_settings.m_dcOfsI); | ||
|  | 	ui->e4kQ->setValue(m_settings.m_dcOfsQ); | ||
|  | } | ||
|  | 
 | ||
|  | void OsmoSDRGui::sendSettings() | ||
|  | { | ||
|  | 	if(!m_updateTimer.isActive()) | ||
|  | 		m_updateTimer.start(100); | ||
|  | } | ||
|  | 
 | ||
|  | int OsmoSDRGui::e4kLNAGainToIdx(int gain) const | ||
|  | { | ||
|  | 	static const quint32 gainList[13] = { | ||
|  | 		-50, -25, 0, 25, 50, 75, 100, 125, 150, 175, 200, 250, 300 | ||
|  | 	}; | ||
|  | 	for(int i = 0; i < 13; i++) { | ||
|  | 		if(gainList[i] == gain) | ||
|  | 			return i; | ||
|  | 	} | ||
|  | 	return 0; | ||
|  | } | ||
|  | 
 | ||
|  | int OsmoSDRGui::e4kIdxToLNAGain(int idx) const | ||
|  | { | ||
|  | 	static const quint32 gainList[13] = { | ||
|  | 		-50, -25, 0, 25, 50, 75, 100, 125, 150, 175, 200, 250, 300 | ||
|  | 	}; | ||
|  | 	if((idx < 0) || (idx >= 13)) | ||
|  | 		return -50; | ||
|  | 	else return gainList[idx]; | ||
|  | } | ||
|  | 
 | ||
|  | void OsmoSDRGui::on_iqSwap_toggled(bool checked) | ||
|  | { | ||
|  | 	m_settings.m_swapIQ = checked; | ||
|  | 	sendSettings(); | ||
|  | } | ||
|  | 
 | ||
|  | void OsmoSDRGui::on_e4000MixerGain_currentIndexChanged(int index) | ||
|  | { | ||
|  | 	m_settings.m_mixerGain = index * 80 + 40; | ||
|  | 	sendSettings(); | ||
|  | } | ||
|  | 
 | ||
|  | void OsmoSDRGui::on_e4000MixerEnh_currentIndexChanged(int index) | ||
|  | { | ||
|  | 	if(index == 0) | ||
|  | 		m_settings.m_mixerEnhancement = 0; | ||
|  | 	else m_settings.m_mixerEnhancement = index * 20 - 10; | ||
|  | 	sendSettings(); | ||
|  | } | ||
|  | 
 | ||
|  | void OsmoSDRGui::on_e4000if1_currentIndexChanged(int index) | ||
|  | { | ||
|  | 	m_settings.m_if1gain = index * 90 - 30; | ||
|  | 	sendSettings(); | ||
|  | } | ||
|  | 
 | ||
|  | void OsmoSDRGui::on_e4000if2_currentIndexChanged(int index) | ||
|  | { | ||
|  | 	m_settings.m_if2gain = index * 30; | ||
|  | 	sendSettings(); | ||
|  | } | ||
|  | 
 | ||
|  | void OsmoSDRGui::on_e4000if3_currentIndexChanged(int index) | ||
|  | { | ||
|  | 	m_settings.m_if3gain = index * 30; | ||
|  | 	sendSettings(); | ||
|  | } | ||
|  | 
 | ||
|  | void OsmoSDRGui::on_e4000if4_currentIndexChanged(int index) | ||
|  | { | ||
|  | 	m_settings.m_if4gain = index * 10; | ||
|  | 	sendSettings(); | ||
|  | } | ||
|  | 
 | ||
|  | void OsmoSDRGui::on_e4000if5_currentIndexChanged(int index) | ||
|  | { | ||
|  | 	m_settings.m_if5gain = (index + 1) * 30; | ||
|  | 	sendSettings(); | ||
|  | } | ||
|  | 
 | ||
|  | void OsmoSDRGui::on_e4000if6_currentIndexChanged(int index) | ||
|  | { | ||
|  | 	m_settings.m_if6gain = (index + 1) * 30; | ||
|  | 	sendSettings(); | ||
|  | } | ||
|  | 
 | ||
|  | void OsmoSDRGui::on_centerFrequency_changed(quint64 value) | ||
|  | { | ||
|  | 	m_generalSettings.m_centerFrequency = value * 1000; | ||
|  | 	sendSettings(); | ||
|  | } | ||
|  | 
 | ||
|  | void OsmoSDRGui::on_filterI1_valueChanged(int value) | ||
|  | { | ||
|  | 	m_settings.m_opAmpI1 = value; | ||
|  | 	sendSettings(); | ||
|  | } | ||
|  | 
 | ||
|  | void OsmoSDRGui::on_filterI2_valueChanged(int value) | ||
|  | { | ||
|  | 	m_settings.m_opAmpI2 = value; | ||
|  | 	sendSettings(); | ||
|  | } | ||
|  | 
 | ||
|  | void OsmoSDRGui::on_filterQ1_valueChanged(int value) | ||
|  | { | ||
|  | 	m_settings.m_opAmpQ1 = value; | ||
|  | 	sendSettings(); | ||
|  | } | ||
|  | 
 | ||
|  | void OsmoSDRGui::on_filterQ2_valueChanged(int value) | ||
|  | { | ||
|  | 	m_settings.m_opAmpQ2 = value; | ||
|  | 	sendSettings(); | ||
|  | } | ||
|  | 
 | ||
|  | void OsmoSDRGui::on_decimation_valueChanged(int value) | ||
|  | { | ||
|  | 	ui->decimationDisplay->setText(tr("1:%1").arg(1 << value)); | ||
|  | 	m_settings.m_decimation = value; | ||
|  | 	sendSettings(); | ||
|  | } | ||
|  | 
 | ||
|  | void OsmoSDRGui::on_e4000LNAGain_valueChanged(int value) | ||
|  | { | ||
|  | 	int gain = e4kIdxToLNAGain(value); | ||
|  | 	ui->e4000LNAGainDisplay->setText(tr("%1.%2").arg(gain / 10).arg(abs(gain % 10))); | ||
|  | 	m_settings.m_lnaGain = gain; | ||
|  | 	sendSettings(); | ||
|  | } | ||
|  | 
 | ||
|  | void OsmoSDRGui::on_e4kI_valueChanged(int value) | ||
|  | { | ||
|  | 	m_settings.m_dcOfsI = value; | ||
|  | 	sendSettings(); | ||
|  | } | ||
|  | 
 | ||
|  | void OsmoSDRGui::on_e4kQ_valueChanged(int value) | ||
|  | { | ||
|  | 	m_settings.m_dcOfsQ = value; | ||
|  | 	sendSettings(); | ||
|  | } | ||
|  | 
 | ||
|  | void OsmoSDRGui::updateHardware() | ||
|  | { | ||
|  | 	m_updateTimer.stop(); | ||
|  | 	Message* msg = OsmoSDRInput::MsgConfigureOsmoSDR::create(m_generalSettings, m_settings); | ||
|  | 	msg->submit(m_pluginAPI->getDSPEngineMessageQueue()); | ||
|  | } |