mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-10-31 04:50:29 -04:00 
			
		
		
		
	USB Template.
This commit is contained in:
		
							parent
							
								
									cb8026b957
								
							
						
					
					
						commit
						f51044931b
					
				| @ -3,4 +3,5 @@ project(demod) | |||||||
| add_subdirectory(nfm) | add_subdirectory(nfm) | ||||||
| add_subdirectory(tcpsrc) | add_subdirectory(tcpsrc) | ||||||
| add_subdirectory(ssb) | add_subdirectory(ssb) | ||||||
|  | add_subdirectory(usb) | ||||||
| #add_subdirectory(tetra) | #add_subdirectory(tetra) | ||||||
|  | |||||||
							
								
								
									
										47
									
								
								plugins/channel/usb/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								plugins/channel/usb/CMakeLists.txt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,47 @@ | |||||||
|  | project(usb) | ||||||
|  | 
 | ||||||
|  | set(usb_SOURCES | ||||||
|  | 	usbdemod.cpp | ||||||
|  | 	usbdemodgui.cpp | ||||||
|  | 	usbplugin.cpp | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | set(usb_HEADERS | ||||||
|  | 	usbdemod.h | ||||||
|  | 	usbdemodgui.h | ||||||
|  | 	usbplugin.h | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | set(usb_FORMS | ||||||
|  | 	usbdemodgui.ui | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | include_directories( | ||||||
|  | 	. | ||||||
|  | 	${CMAKE_CURRENT_BINARY_DIR} | ||||||
|  | 	${CMAKE_SOURCE_DIR}/include | ||||||
|  | 	${CMAKE_SOURCE_DIR}/include-gpl | ||||||
|  | 	${OPENGL_INCLUDE_DIR} | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | #include(${QT_USE_FILE}) | ||||||
|  | add_definitions(${QT_DEFINITIONS}) | ||||||
|  | add_definitions(-DQT_PLUGIN) | ||||||
|  | add_definitions(-DQT_SHARED) | ||||||
|  | 
 | ||||||
|  | #qt5_wrap_cpp(usb_HEADERS_MOC ${usb_HEADERS}) | ||||||
|  | qt5_wrap_ui(usb_FORMS_HEADERS ${usb_FORMS}) | ||||||
|  | 
 | ||||||
|  | add_library(demodusb SHARED | ||||||
|  | 	${usb_SOURCES} | ||||||
|  | 	${usb_HEADERS_MOC} | ||||||
|  | 	${usb_FORMS_HEADERS} | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | target_link_libraries(demodusb | ||||||
|  | 	${QT_LIBRARIES} | ||||||
|  | 	${OPENGL_LIBRARIES} | ||||||
|  | 	sdrbase | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | qt5_use_modules(demodusb Core Widgets OpenGL Multimedia) | ||||||
							
								
								
									
										128
									
								
								plugins/channel/usb/usbdemod.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								plugins/channel/usb/usbdemod.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,128 @@ | |||||||
|  | ///////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  | // Copyright (C) 2012 maintech GmbH, Otto-Hahn-Str. 15, 97204 Hoechberg, Germany //
 | ||||||
|  | // written by Christian Daniel                                                   //
 | ||||||
|  | // (c) 2014 Modified by John Greb
 | ||||||
|  | //                                                                               //
 | ||||||
|  | // This program is free software; you can redistribute it and/or modify          //
 | ||||||
|  | // it under the terms of the GNU General Public License as published by          //
 | ||||||
|  | // the Free Software Foundation as version 3 of the License, or                  //
 | ||||||
|  | //                                                                               //
 | ||||||
|  | // This program is distributed in the hope that it will be useful,               //
 | ||||||
|  | // but WITHOUT ANY WARRANTY; without even the implied warranty of                //
 | ||||||
|  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the                  //
 | ||||||
|  | // GNU General Public License V3 for more details.                               //
 | ||||||
|  | //                                                                               //
 | ||||||
|  | // You should have received a copy of the GNU General Public License             //
 | ||||||
|  | // along with this program. If not, see <http://www.gnu.org/licenses/>.          //
 | ||||||
|  | ///////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  | 
 | ||||||
|  | #include <QTime> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include "usbdemod.h" | ||||||
|  | #include "audio/audiooutput.h" | ||||||
|  | #include "dsp/dspcommands.h" | ||||||
|  | 
 | ||||||
|  | MESSAGE_CLASS_DEFINITION(USBDemod::MsgConfigureUSBDemod, Message) | ||||||
|  | 
 | ||||||
|  | USBDemod::USBDemod(AudioFifo* audioFifo, SampleSink* sampleSink) : | ||||||
|  | 	m_sampleSink(sampleSink), | ||||||
|  | 	m_audioFifo(audioFifo) | ||||||
|  | { | ||||||
|  | 	m_Bandwidth = 5000; | ||||||
|  | 	m_volume = 2.0; | ||||||
|  | 	m_sampleRate = 96000; | ||||||
|  | 	m_frequency = 0; | ||||||
|  | 	m_nco.setFreq(m_frequency, m_sampleRate); | ||||||
|  | 	m_interpolator.create(16, m_sampleRate, 5000); | ||||||
|  | 	m_sampleDistanceRemain = (Real)m_sampleRate / 48000.0; | ||||||
|  | 
 | ||||||
|  | 	m_lowpass.create(21, 48000, 5000); | ||||||
|  | 
 | ||||||
|  | 	m_audioBuffer.resize(512); | ||||||
|  | 	m_audioBufferFill = 0; | ||||||
|  | 	m_undersampleCount = 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | USBDemod::~USBDemod() | ||||||
|  | { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void USBDemod::configure(MessageQueue* messageQueue, Real Bandwidth, Real volume) | ||||||
|  | { | ||||||
|  | 	Message* cmd = MsgConfigureUSBDemod::create(Bandwidth, volume); | ||||||
|  | 	cmd->submit(messageQueue, this); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void USBDemod::feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly) | ||||||
|  | { | ||||||
|  | 	Complex ci; | ||||||
|  | 	bool consumed; | ||||||
|  | 
 | ||||||
|  | 	for(SampleVector::const_iterator it = begin; it < end; ++it) { | ||||||
|  | 		Complex c(it->real() / 32768.0, it->imag() / 32768.0); | ||||||
|  | 		c *= m_nco.nextIQ(); | ||||||
|  | 
 | ||||||
|  | 		consumed = false; | ||||||
|  | 		// could squelch audio if RTL_SDR samplerate is not being fully decimated.
 | ||||||
|  | 		if(m_interpolator.interpolate(&m_sampleDistanceRemain, c, &consumed, &ci)) { | ||||||
|  | 			Real demod = ci.imag() + ci.real(); | ||||||
|  | 			demod = 32768.0 * m_lowpass.filter(demod * 0.7); | ||||||
|  | 
 | ||||||
|  | 			// Downsample by 4x for audio display
 | ||||||
|  | 			if (!(m_undersampleCount++ & 3)) | ||||||
|  | 				m_sampleBuffer.push_back(Sample(demod, 0.0)); | ||||||
|  | 
 | ||||||
|  | 			qint16 sample = (qint16)(demod * m_volume); | ||||||
|  | 			m_audioBuffer[m_audioBufferFill].l = sample; | ||||||
|  | 			m_audioBuffer[m_audioBufferFill].r = sample; | ||||||
|  | 			++m_audioBufferFill; | ||||||
|  | 			if(m_audioBufferFill >= m_audioBuffer.size()) { | ||||||
|  | 				uint res = m_audioFifo->write((const quint8*)&m_audioBuffer[0], m_audioBufferFill, 1); | ||||||
|  | 				m_audioBufferFill = 0; | ||||||
|  | 			} | ||||||
|  | 			m_sampleDistanceRemain += (Real)m_sampleRate / 48000.0; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	if(m_audioFifo->write((const quint8*)&m_audioBuffer[0], m_audioBufferFill, 0) != m_audioBufferFill) | ||||||
|  | 		;//qDebug("lost samples");
 | ||||||
|  | 	m_audioBufferFill = 0; | ||||||
|  | 
 | ||||||
|  | 	if(m_sampleSink != NULL) | ||||||
|  | 		m_sampleSink->feed(m_sampleBuffer.begin(), m_sampleBuffer.end(), true); | ||||||
|  | 	m_sampleBuffer.clear(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void USBDemod::start() | ||||||
|  | { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void USBDemod::stop() | ||||||
|  | { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool USBDemod::handleMessage(Message* cmd) | ||||||
|  | { | ||||||
|  | 	if(DSPSignalNotification::match(cmd)) { | ||||||
|  | 		DSPSignalNotification* signal = (DSPSignalNotification*)cmd; | ||||||
|  | 		qDebug("%d samples/sec, %lld Hz offset", signal->getSampleRate(), signal->getFrequencyOffset()); | ||||||
|  | 		m_sampleRate = signal->getSampleRate(); | ||||||
|  | 		m_nco.setFreq(-signal->getFrequencyOffset(), m_sampleRate); | ||||||
|  | 		m_interpolator.create(16, m_sampleRate, m_Bandwidth); | ||||||
|  | 		m_sampleDistanceRemain = m_sampleRate / 48000.0; | ||||||
|  | 		cmd->completed(); | ||||||
|  | 		return true; | ||||||
|  | 	} else if(MsgConfigureUSBDemod::match(cmd)) { | ||||||
|  | 		MsgConfigureUSBDemod* cfg = (MsgConfigureUSBDemod*)cmd; | ||||||
|  | 		m_Bandwidth = cfg->getBandwidth(); | ||||||
|  | 		m_interpolator.create(16, m_sampleRate, m_Bandwidth); | ||||||
|  | 		m_lowpass.create(21, 48000, cfg->getBandwidth()); | ||||||
|  | 		m_volume = cfg->getVolume(); | ||||||
|  | 		m_volume *= m_volume * 0.1; | ||||||
|  | 		cmd->completed(); | ||||||
|  | 		return true; | ||||||
|  | 	} else { | ||||||
|  | 		if(m_sampleSink != NULL) | ||||||
|  | 		   return m_sampleSink->handleMessage(cmd); | ||||||
|  | 		else return false; | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										92
									
								
								plugins/channel/usb/usbdemod.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								plugins/channel/usb/usbdemod.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,92 @@ | |||||||
|  | ///////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  | // Copyright (C) 2012 maintech GmbH, Otto-Hahn-Str. 15, 97204 Hoechberg, Germany //
 | ||||||
|  | // written by Christian Daniel                                                   //
 | ||||||
|  | //                                                                               //
 | ||||||
|  | // This program is free software; you can redistribute it and/or modify          //
 | ||||||
|  | // it under the terms of the GNU General Public License as published by          //
 | ||||||
|  | // the Free Software Foundation as version 3 of the License, or                  //
 | ||||||
|  | //                                                                               //
 | ||||||
|  | // This program is distributed in the hope that it will be useful,               //
 | ||||||
|  | // but WITHOUT ANY WARRANTY; without even the implied warranty of                //
 | ||||||
|  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the                  //
 | ||||||
|  | // GNU General Public License V3 for more details.                               //
 | ||||||
|  | //                                                                               //
 | ||||||
|  | // You should have received a copy of the GNU General Public License             //
 | ||||||
|  | // along with this program. If not, see <http://www.gnu.org/licenses/>.          //
 | ||||||
|  | ///////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  | 
 | ||||||
|  | #ifndef INCLUDE_USBDEMOD_H | ||||||
|  | #define INCLUDE_USBDEMOD_H | ||||||
|  | 
 | ||||||
|  | #include <vector> | ||||||
|  | #include "dsp/samplesink.h" | ||||||
|  | #include "dsp/nco.h" | ||||||
|  | #include "dsp/interpolator.h" | ||||||
|  | #include "dsp/lowpass.h" | ||||||
|  | #include "audio/audiofifo.h" | ||||||
|  | #include "util/message.h" | ||||||
|  | 
 | ||||||
|  | class AudioFifo; | ||||||
|  | 
 | ||||||
|  | class USBDemod : public SampleSink { | ||||||
|  | public: | ||||||
|  | 	USBDemod(AudioFifo* audioFifo, SampleSink* sampleSink); | ||||||
|  | 	~USBDemod(); | ||||||
|  | 
 | ||||||
|  | 	void configure(MessageQueue* messageQueue, Real Bandwidth, Real volume); | ||||||
|  | 
 | ||||||
|  | 	void feed(SampleVector::const_iterator begin, SampleVector::const_iterator end, bool positiveOnly); | ||||||
|  | 	void start(); | ||||||
|  | 	void stop(); | ||||||
|  | 	bool handleMessage(Message* cmd); | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  | 	class MsgConfigureUSBDemod : public Message { | ||||||
|  | 		MESSAGE_CLASS_DECLARATION | ||||||
|  | 
 | ||||||
|  | 	public: | ||||||
|  | 		Real getBandwidth() const { return m_Bandwidth; } | ||||||
|  | 		Real getVolume() const { return m_volume; } | ||||||
|  | 
 | ||||||
|  | 		static MsgConfigureUSBDemod* create(Real Bandwidth, Real volume) | ||||||
|  | 		{ | ||||||
|  | 			return new MsgConfigureUSBDemod(Bandwidth, volume); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 	private: | ||||||
|  | 		Real m_Bandwidth; | ||||||
|  | 		Real m_volume; | ||||||
|  | 
 | ||||||
|  | 		MsgConfigureUSBDemod(Real Bandwidth, Real volume) : | ||||||
|  | 			Message(), | ||||||
|  | 			m_Bandwidth(Bandwidth), | ||||||
|  | 			m_volume(volume) | ||||||
|  | 		{ } | ||||||
|  | 	}; | ||||||
|  | 
 | ||||||
|  | 	struct AudioSample { | ||||||
|  | 		qint16 l; | ||||||
|  | 		qint16 r; | ||||||
|  | 	}; | ||||||
|  | 	typedef std::vector<AudioSample> AudioVector; | ||||||
|  | 
 | ||||||
|  | 	Real m_Bandwidth; | ||||||
|  | 	Real m_volume; | ||||||
|  | 	int m_undersampleCount; | ||||||
|  | 	int m_sampleRate; | ||||||
|  | 	int m_frequency; | ||||||
|  | 
 | ||||||
|  | 	NCO m_nco; | ||||||
|  | 	Interpolator m_interpolator; | ||||||
|  | 	Real m_sampleDistanceRemain; | ||||||
|  | 	Lowpass<Real> m_lowpass; | ||||||
|  | 
 | ||||||
|  | 	AudioVector m_audioBuffer; | ||||||
|  | 	uint m_audioBufferFill; | ||||||
|  | 	AudioFifo* m_audioFifo; | ||||||
|  | 
 | ||||||
|  | 	SampleSink* m_sampleSink; | ||||||
|  | 	SampleVector m_sampleBuffer; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #endif // INCLUDE_USBDEMOD_H
 | ||||||
							
								
								
									
										179
									
								
								plugins/channel/usb/usbdemodgui.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										179
									
								
								plugins/channel/usb/usbdemodgui.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,179 @@ | |||||||
|  | #include <QDockWidget> | ||||||
|  | #include <QMainWindow> | ||||||
|  | #include "usbdemodgui.h" | ||||||
|  | #include "ui_usbdemodgui.h" | ||||||
|  | #include "dsp/threadedsamplesink.h" | ||||||
|  | #include "dsp/channelizer.h" | ||||||
|  | #include "usbdemod.h" | ||||||
|  | #include "dsp/spectrumvis.h" | ||||||
|  | #include "gui/glspectrum.h" | ||||||
|  | #include "plugin/pluginapi.h" | ||||||
|  | #include "util/simpleserializer.h" | ||||||
|  | #include "gui/basicchannelsettingswidget.h" | ||||||
|  | 
 | ||||||
|  | USBDemodGUI* USBDemodGUI::create(PluginAPI* pluginAPI) | ||||||
|  | { | ||||||
|  | 	USBDemodGUI* gui = new USBDemodGUI(pluginAPI); | ||||||
|  | 	return gui; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void USBDemodGUI::destroy() | ||||||
|  | { | ||||||
|  | 	delete this; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void USBDemodGUI::setName(const QString& name) | ||||||
|  | { | ||||||
|  | 	setObjectName(name); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void USBDemodGUI::resetToDefaults() | ||||||
|  | { | ||||||
|  | 	ui->BW->setValue(3); | ||||||
|  | 	ui->volume->setValue(4); | ||||||
|  | 	applySettings(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | QByteArray USBDemodGUI::serialize() const | ||||||
|  | { | ||||||
|  | 	SimpleSerializer s(1); | ||||||
|  | 	s.writeS32(1, m_channelMarker->getCenterFrequency()); | ||||||
|  | 	s.writeS32(2, ui->BW->value()); | ||||||
|  | 	s.writeS32(3, ui->volume->value()); | ||||||
|  | 	s.writeBlob(4, ui->spectrumGUI->serialize()); | ||||||
|  | 	s.writeU32(5, m_channelMarker->getColor().rgb()); | ||||||
|  | 	return s.final(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool USBDemodGUI::deserialize(const QByteArray& data) | ||||||
|  | { | ||||||
|  | 	SimpleDeserializer d(data); | ||||||
|  | 
 | ||||||
|  | 	if(!d.isValid()) { | ||||||
|  | 		resetToDefaults(); | ||||||
|  | 		return false; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if(d.getVersion() == 1) { | ||||||
|  | 		QByteArray bytetmp; | ||||||
|  | 		quint32 u32tmp; | ||||||
|  | 		qint32 tmp; | ||||||
|  | 		d.readS32(1, &tmp, 0); | ||||||
|  | 		m_channelMarker->setCenterFrequency(tmp); | ||||||
|  | 		d.readS32(2, &tmp, 3); | ||||||
|  | 		ui->BW->setValue(tmp); | ||||||
|  | 		d.readS32(3, &tmp, 20); | ||||||
|  | 		ui->volume->setValue(tmp); | ||||||
|  | 		d.readBlob(4, &bytetmp); | ||||||
|  | 		ui->spectrumGUI->deserialize(bytetmp); | ||||||
|  | 		if(d.readU32(5, &u32tmp)) | ||||||
|  | 			m_channelMarker->setColor(u32tmp); | ||||||
|  | 		applySettings(); | ||||||
|  | 		return true; | ||||||
|  | 	} else { | ||||||
|  | 		resetToDefaults(); | ||||||
|  | 		return false; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | bool USBDemodGUI::handleMessage(Message* message) | ||||||
|  | { | ||||||
|  | 	return false; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void USBDemodGUI::viewChanged() | ||||||
|  | { | ||||||
|  | 	applySettings(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void USBDemodGUI::on_BW_valueChanged(int value) | ||||||
|  | { | ||||||
|  | 	ui->BWText->setText(QString("%1 kHz").arg(value)); | ||||||
|  | 	m_channelMarker->setBandwidth(value * 1000 * 2); | ||||||
|  | 	applySettings(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void USBDemodGUI::on_volume_valueChanged(int value) | ||||||
|  | { | ||||||
|  | 	ui->volumeText->setText(QString("%1").arg(value / 10.0, 0, 'f', 1)); | ||||||
|  | 	applySettings(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void USBDemodGUI::onWidgetRolled(QWidget* widget, bool rollDown) | ||||||
|  | { | ||||||
|  | 	/*
 | ||||||
|  | 	if((widget == ui->spectrumContainer) && (m_usbDemod != NULL)) | ||||||
|  | 		m_usbDemod->setSpectrum(m_threadedSampleSink->getMessageQueue(), rollDown); | ||||||
|  | 	*/ | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void USBDemodGUI::onMenuDoubleClicked() | ||||||
|  | { | ||||||
|  | 	if(!m_basicSettingsShown) { | ||||||
|  | 		m_basicSettingsShown = true; | ||||||
|  | 		BasicChannelSettingsWidget* bcsw = new BasicChannelSettingsWidget(m_channelMarker, this); | ||||||
|  | 		bcsw->show(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | USBDemodGUI::USBDemodGUI(PluginAPI* pluginAPI, QWidget* parent) : | ||||||
|  | 	RollupWidget(parent), | ||||||
|  | 	ui(new Ui::USBDemodGUI), | ||||||
|  | 	m_pluginAPI(pluginAPI), | ||||||
|  | 	m_basicSettingsShown(false) | ||||||
|  | { | ||||||
|  | 	ui->setupUi(this); | ||||||
|  | 	setAttribute(Qt::WA_DeleteOnClose, true); | ||||||
|  | 	connect(this, SIGNAL(widgetRolled(QWidget*,bool)), this, SLOT(onWidgetRolled(QWidget*,bool))); | ||||||
|  | 	connect(this, SIGNAL(menuDoubleClickEvent()), this, SLOT(onMenuDoubleClicked())); | ||||||
|  | 
 | ||||||
|  | 	m_audioFifo = new AudioFifo(4, 48000 / 4); | ||||||
|  | 	m_spectrumVis = new SpectrumVis(ui->glSpectrum); | ||||||
|  | 	m_usbDemod = new USBDemod(m_audioFifo, m_spectrumVis); | ||||||
|  | 	m_channelizer = new Channelizer(m_usbDemod); | ||||||
|  | 	m_threadedSampleSink = new ThreadedSampleSink(m_channelizer); | ||||||
|  | 	m_pluginAPI->addAudioSource(m_audioFifo); | ||||||
|  | 	m_pluginAPI->addSampleSink(m_threadedSampleSink); | ||||||
|  | 
 | ||||||
|  | 	ui->glSpectrum->setCenterFrequency(3000); | ||||||
|  | 	ui->glSpectrum->setSampleRate(6000); | ||||||
|  | 	ui->glSpectrum->setDisplayWaterfall(true); | ||||||
|  | 	ui->glSpectrum->setDisplayMaxHold(true); | ||||||
|  | 
 | ||||||
|  | 	m_channelMarker = new ChannelMarker(this); | ||||||
|  | 	m_channelMarker->setColor(Qt::blue); | ||||||
|  | 	m_channelMarker->setBandwidth(8000); | ||||||
|  | 	m_channelMarker->setCenterFrequency(0); | ||||||
|  | 	m_channelMarker->setVisible(true); | ||||||
|  | 	connect(m_channelMarker, SIGNAL(changed()), this, SLOT(viewChanged())); | ||||||
|  | 	m_pluginAPI->addChannelMarker(m_channelMarker); | ||||||
|  | 
 | ||||||
|  | 	ui->spectrumGUI->setBuddies(m_threadedSampleSink->getMessageQueue(), m_spectrumVis, ui->glSpectrum); | ||||||
|  | 
 | ||||||
|  | 	applySettings(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | USBDemodGUI::~USBDemodGUI() | ||||||
|  | { | ||||||
|  | 	m_pluginAPI->removeChannelInstance(this); | ||||||
|  | 	m_pluginAPI->removeAudioSource(m_audioFifo); | ||||||
|  | 	m_pluginAPI->removeSampleSink(m_threadedSampleSink); | ||||||
|  | 	delete m_threadedSampleSink; | ||||||
|  | 	delete m_channelizer; | ||||||
|  | 	delete m_usbDemod; | ||||||
|  | 	delete m_spectrumVis; | ||||||
|  | 	delete m_audioFifo; | ||||||
|  | 	delete m_channelMarker; | ||||||
|  | 	delete ui; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void USBDemodGUI::applySettings() | ||||||
|  | { | ||||||
|  | 	setTitleColor(m_channelMarker->getColor()); | ||||||
|  | 	m_channelizer->configure(m_threadedSampleSink->getMessageQueue(), | ||||||
|  | 		48000, | ||||||
|  | 		m_channelMarker->getCenterFrequency()); | ||||||
|  | 	m_usbDemod->configure(m_threadedSampleSink->getMessageQueue(), | ||||||
|  | 		ui->BW->value() * 1000.0, | ||||||
|  | 		ui->volume->value() / 10.0 ); | ||||||
|  | } | ||||||
							
								
								
									
										60
									
								
								plugins/channel/usb/usbdemodgui.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								plugins/channel/usb/usbdemodgui.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,60 @@ | |||||||
|  | #ifndef INCLUDE_USBDEMODGUI_H | ||||||
|  | #define INCLUDE_USBDEMODGUI_H | ||||||
|  | 
 | ||||||
|  | #include "gui/rollupwidget.h" | ||||||
|  | #include "plugin/plugingui.h" | ||||||
|  | 
 | ||||||
|  | class PluginAPI; | ||||||
|  | class ChannelMarker; | ||||||
|  | 
 | ||||||
|  | class AudioFifo; | ||||||
|  | class ThreadedSampleSink; | ||||||
|  | class Channelizer; | ||||||
|  | class USBDemod; | ||||||
|  | class SpectrumVis; | ||||||
|  | 
 | ||||||
|  | namespace Ui { | ||||||
|  | 	class USBDemodGUI; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | class USBDemodGUI : public RollupWidget, public PluginGUI { | ||||||
|  | 	Q_OBJECT | ||||||
|  | 
 | ||||||
|  | public: | ||||||
|  | 	static USBDemodGUI* create(PluginAPI* pluginAPI); | ||||||
|  | 	void destroy(); | ||||||
|  | 
 | ||||||
|  | 	void setName(const QString& name); | ||||||
|  | 
 | ||||||
|  | 	void resetToDefaults(); | ||||||
|  | 	QByteArray serialize() const; | ||||||
|  | 	bool deserialize(const QByteArray& data); | ||||||
|  | 
 | ||||||
|  | 	bool handleMessage(Message* message); | ||||||
|  | 
 | ||||||
|  | private slots: | ||||||
|  | 	void viewChanged(); | ||||||
|  | 	void on_BW_valueChanged(int value); | ||||||
|  | 	void on_volume_valueChanged(int value); | ||||||
|  | 	void onWidgetRolled(QWidget* widget, bool rollDown); | ||||||
|  | 	void onMenuDoubleClicked(); | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  | 	Ui::USBDemodGUI* ui; | ||||||
|  | 	PluginAPI* m_pluginAPI; | ||||||
|  | 	ChannelMarker* m_channelMarker; | ||||||
|  | 	bool m_basicSettingsShown; | ||||||
|  | 
 | ||||||
|  | 	AudioFifo* m_audioFifo; | ||||||
|  | 	ThreadedSampleSink* m_threadedSampleSink; | ||||||
|  | 	Channelizer* m_channelizer; | ||||||
|  | 	USBDemod* m_usbDemod; | ||||||
|  | 	SpectrumVis* m_spectrumVis; | ||||||
|  | 
 | ||||||
|  | 	explicit USBDemodGUI(PluginAPI* pluginAPI, QWidget* parent = NULL); | ||||||
|  | 	~USBDemodGUI(); | ||||||
|  | 
 | ||||||
|  | 	void applySettings(); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #endif // INCLUDE_USBDEMODGUI_H
 | ||||||
							
								
								
									
										172
									
								
								plugins/channel/usb/usbdemodgui.ui
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										172
									
								
								plugins/channel/usb/usbdemodgui.ui
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,172 @@ | |||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <ui version="4.0"> | ||||||
|  |  <class>USBDemodGUI</class> | ||||||
|  |  <widget class="RollupWidget" name="USBDemodGUI"> | ||||||
|  |   <property name="geometry"> | ||||||
|  |    <rect> | ||||||
|  |     <x>0</x> | ||||||
|  |     <y>0</y> | ||||||
|  |     <width>302</width> | ||||||
|  |     <height>410</height> | ||||||
|  |    </rect> | ||||||
|  |   </property> | ||||||
|  |   <property name="windowTitle"> | ||||||
|  |    <string>USB Demodulator</string> | ||||||
|  |   </property> | ||||||
|  |   <widget class="QWidget" name="settingsContainer" native="true"> | ||||||
|  |    <property name="geometry"> | ||||||
|  |     <rect> | ||||||
|  |      <x>35</x> | ||||||
|  |      <y>35</y> | ||||||
|  |      <width>242</width> | ||||||
|  |      <height>96</height> | ||||||
|  |     </rect> | ||||||
|  |    </property> | ||||||
|  |    <property name="windowTitle"> | ||||||
|  |     <string>Settings</string> | ||||||
|  |    </property> | ||||||
|  |    <layout class="QGridLayout" name="gridLayout"> | ||||||
|  |     <property name="margin"> | ||||||
|  |      <number>2</number> | ||||||
|  |     </property> | ||||||
|  |     <property name="spacing"> | ||||||
|  |      <number>3</number> | ||||||
|  |     </property> | ||||||
|  |     <item row="0" column="0"> | ||||||
|  |      <widget class="QLabel" name="label"> | ||||||
|  |       <property name="text"> | ||||||
|  |        <string>Bandwidth</string> | ||||||
|  |       </property> | ||||||
|  |      </widget> | ||||||
|  |     </item> | ||||||
|  |     <item row="0" column="1"> | ||||||
|  |      <widget class="QSlider" name="BW"> | ||||||
|  |       <property name="minimum"> | ||||||
|  |        <number>1</number> | ||||||
|  |       </property> | ||||||
|  |       <property name="maximum"> | ||||||
|  |        <number>20</number> | ||||||
|  |       </property> | ||||||
|  |       <property name="pageStep"> | ||||||
|  |        <number>1</number> | ||||||
|  |       </property> | ||||||
|  |       <property name="value"> | ||||||
|  |        <number>3</number> | ||||||
|  |       </property> | ||||||
|  |       <property name="orientation"> | ||||||
|  |        <enum>Qt::Horizontal</enum> | ||||||
|  |       </property> | ||||||
|  |      </widget> | ||||||
|  |     </item> | ||||||
|  |     <item row="0" column="2"> | ||||||
|  |      <widget class="QLabel" name="BWText"> | ||||||
|  |       <property name="minimumSize"> | ||||||
|  |        <size> | ||||||
|  |         <width>50</width> | ||||||
|  |         <height>0</height> | ||||||
|  |        </size> | ||||||
|  |       </property> | ||||||
|  |       <property name="text"> | ||||||
|  |        <string>3 kHz</string> | ||||||
|  |       </property> | ||||||
|  |       <property name="alignment"> | ||||||
|  |        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> | ||||||
|  |       </property> | ||||||
|  |      </widget> | ||||||
|  |     </item> | ||||||
|  |     <item row="1" column="0"> | ||||||
|  |      <widget class="QLabel" name="label_2"> | ||||||
|  |       <property name="text"> | ||||||
|  |        <string>Volume</string> | ||||||
|  |       </property> | ||||||
|  |      </widget> | ||||||
|  |     </item> | ||||||
|  |     <item row="1" column="1"> | ||||||
|  |      <widget class="QSlider" name="volume"> | ||||||
|  |       <property name="maximum"> | ||||||
|  |        <number>100</number> | ||||||
|  |       </property> | ||||||
|  |       <property name="value"> | ||||||
|  |        <number>20</number> | ||||||
|  |       </property> | ||||||
|  |       <property name="orientation"> | ||||||
|  |        <enum>Qt::Horizontal</enum> | ||||||
|  |       </property> | ||||||
|  |      </widget> | ||||||
|  |     </item> | ||||||
|  |     <item row="1" column="2"> | ||||||
|  |      <widget class="QLabel" name="volumeText"> | ||||||
|  |       <property name="minimumSize"> | ||||||
|  |        <size> | ||||||
|  |         <width>50</width> | ||||||
|  |         <height>0</height> | ||||||
|  |        </size> | ||||||
|  |       </property> | ||||||
|  |       <property name="text"> | ||||||
|  |        <string>2.0</string> | ||||||
|  |       </property> | ||||||
|  |       <property name="alignment"> | ||||||
|  |        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> | ||||||
|  |       </property> | ||||||
|  |      </widget> | ||||||
|  |     </item> | ||||||
|  |    </layout> | ||||||
|  |   </widget> | ||||||
|  |   <widget class="QWidget" name="spectrumContainer" native="true"> | ||||||
|  |    <property name="geometry"> | ||||||
|  |     <rect> | ||||||
|  |      <x>40</x> | ||||||
|  |      <y>140</y> | ||||||
|  |      <width>218</width> | ||||||
|  |      <height>184</height> | ||||||
|  |     </rect> | ||||||
|  |    </property> | ||||||
|  |    <property name="windowTitle"> | ||||||
|  |     <string>Channel Spectrum</string> | ||||||
|  |    </property> | ||||||
|  |    <layout class="QVBoxLayout" name="verticalLayout"> | ||||||
|  |     <property name="spacing"> | ||||||
|  |      <number>2</number> | ||||||
|  |     </property> | ||||||
|  |     <property name="margin"> | ||||||
|  |      <number>3</number> | ||||||
|  |     </property> | ||||||
|  |     <item> | ||||||
|  |      <widget class="GLSpectrum" name="glSpectrum" native="true"> | ||||||
|  |       <property name="minimumSize"> | ||||||
|  |        <size> | ||||||
|  |         <width>200</width> | ||||||
|  |         <height>150</height> | ||||||
|  |        </size> | ||||||
|  |       </property> | ||||||
|  |      </widget> | ||||||
|  |     </item> | ||||||
|  |     <item> | ||||||
|  |      <widget class="GLSpectrumGUI" name="spectrumGUI" native="true"/> | ||||||
|  |     </item> | ||||||
|  |    </layout> | ||||||
|  |   </widget> | ||||||
|  |  </widget> | ||||||
|  |  <customwidgets> | ||||||
|  |   <customwidget> | ||||||
|  |    <class>GLSpectrum</class> | ||||||
|  |    <extends>QWidget</extends> | ||||||
|  |    <header>gui/glspectrum.h</header> | ||||||
|  |    <container>1</container> | ||||||
|  |   </customwidget> | ||||||
|  |   <customwidget> | ||||||
|  |    <class>GLSpectrumGUI</class> | ||||||
|  |    <extends>QWidget</extends> | ||||||
|  |    <header>gui/glspectrumgui.h</header> | ||||||
|  |    <container>1</container> | ||||||
|  |   </customwidget> | ||||||
|  |   <customwidget> | ||||||
|  |    <class>RollupWidget</class> | ||||||
|  |    <extends>QWidget</extends> | ||||||
|  |    <header>gui/rollupwidget.h</header> | ||||||
|  |    <container>1</container> | ||||||
|  |   </customwidget> | ||||||
|  |  </customwidgets> | ||||||
|  |  <resources/> | ||||||
|  |  <connections/> | ||||||
|  | </ui> | ||||||
							
								
								
									
										53
									
								
								plugins/channel/usb/usbplugin.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								plugins/channel/usb/usbplugin.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,53 @@ | |||||||
|  | #include <QtPlugin> | ||||||
|  | #include <QAction> | ||||||
|  | #include "plugin/pluginapi.h" | ||||||
|  | #include "usbplugin.h" | ||||||
|  | #include "usbdemodgui.h" | ||||||
|  | 
 | ||||||
|  | const PluginDescriptor USBPlugin::m_pluginDescriptor = { | ||||||
|  | 	QString("USB Demodulator"), | ||||||
|  | 	QString("---"), | ||||||
|  | 	QString("(c) maintech GmbH (rewritten by John Greb)"), | ||||||
|  | 	QString("http://www.maintech.de"), | ||||||
|  | 	true, | ||||||
|  | 	QString("http://www.maintech.de") | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | USBPlugin::USBPlugin(QObject* parent) : | ||||||
|  | 	QObject(parent) | ||||||
|  | { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | const PluginDescriptor& USBPlugin::getPluginDescriptor() const | ||||||
|  | { | ||||||
|  | 	return m_pluginDescriptor; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void USBPlugin::initPlugin(PluginAPI* pluginAPI) | ||||||
|  | { | ||||||
|  | 	m_pluginAPI = pluginAPI; | ||||||
|  | 
 | ||||||
|  | 	// register demodulator
 | ||||||
|  | 	QAction* action = new QAction(tr("&USB Demodulator"), this); | ||||||
|  | 	connect(action, SIGNAL(triggered()), this, SLOT(createInstanceUSB())); | ||||||
|  | 	m_pluginAPI->registerChannel("de.maintech.sdrangelove.channel.usb", this, action); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | PluginGUI* USBPlugin::createChannel(const QString& channelName) | ||||||
|  | { | ||||||
|  | 	if(channelName == "de.maintech.sdrangelove.channel.usb") { | ||||||
|  | 		USBDemodGUI* gui = USBDemodGUI::create(m_pluginAPI); | ||||||
|  | 		m_pluginAPI->registerChannelInstance("de.maintech.sdrangelove.channel.usb", gui); | ||||||
|  | 		m_pluginAPI->addChannelRollup(gui); | ||||||
|  | 		return gui; | ||||||
|  | 	} else { | ||||||
|  | 		return NULL; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void USBPlugin::createInstanceUSB() | ||||||
|  | { | ||||||
|  | 	USBDemodGUI* gui = USBDemodGUI::create(m_pluginAPI); | ||||||
|  | 	m_pluginAPI->registerChannelInstance("de.maintech.sdrangelove.channel.usb", gui); | ||||||
|  | 	m_pluginAPI->addChannelRollup(gui); | ||||||
|  | } | ||||||
							
								
								
									
										29
									
								
								plugins/channel/usb/usbplugin.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								plugins/channel/usb/usbplugin.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | |||||||
|  | #ifndef INCLUDE_USBPLUGIN_H | ||||||
|  | #define INCLUDE_USBPLUGIN_H | ||||||
|  | 
 | ||||||
|  | #include <QObject> | ||||||
|  | #include "plugin/plugininterface.h" | ||||||
|  | 
 | ||||||
|  | class USBPlugin : public QObject, PluginInterface { | ||||||
|  | 	Q_OBJECT | ||||||
|  | 	Q_INTERFACES(PluginInterface) | ||||||
|  | 	Q_PLUGIN_METADATA(IID "de.maintech.sdrangelove.channel.usb") | ||||||
|  | 
 | ||||||
|  | public: | ||||||
|  | 	explicit USBPlugin(QObject* parent = NULL); | ||||||
|  | 
 | ||||||
|  | 	const PluginDescriptor& getPluginDescriptor() const; | ||||||
|  | 	void initPlugin(PluginAPI* pluginAPI); | ||||||
|  | 
 | ||||||
|  | 	PluginGUI* createChannel(const QString& channelName); | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  | 	static const PluginDescriptor m_pluginDescriptor; | ||||||
|  | 
 | ||||||
|  | 	PluginAPI* m_pluginAPI; | ||||||
|  | 
 | ||||||
|  | private slots: | ||||||
|  | 	void createInstanceUSB(); | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #endif // INCLUDE_USBPLUGIN_H
 | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user