diff --git a/sdrbase/CMakeLists.txt b/sdrbase/CMakeLists.txt index f82565a6a..116496169 100644 --- a/sdrbase/CMakeLists.txt +++ b/sdrbase/CMakeLists.txt @@ -91,6 +91,7 @@ set(sdrbase_SOURCES dsp/hbfilterchainconverter.cpp dsp/hbfiltertraits.cpp dsp/lowpass.cpp + dsp/mimochannel.cpp dsp/nco.cpp dsp/ncof.cpp dsp/phaselock.cpp @@ -224,6 +225,7 @@ set(sdrbase_HEADERS dsp/kissfft.h dsp/kissengine.h dsp/lowpass.h + dsp/mimochannel.h dsp/misc.h dsp/movingaverage.h dsp/nco.h diff --git a/sdrbase/dsp/mimochannel.cpp b/sdrbase/dsp/mimochannel.cpp new file mode 100644 index 000000000..c12a2fc79 --- /dev/null +++ b/sdrbase/dsp/mimochannel.cpp @@ -0,0 +1,40 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2019 F4EXB // +// written by Edouard Griffiths // +// // +// 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 // +// (at your option) any later version. // +// // +// 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 . // +/////////////////////////////////////////////////////////////////////////////////// + +#include "mimochannel.h" + +MIMOChannel::MIMOChannel() +{ + connect(&m_inputMessageQueue, SIGNAL(messageEnqueued()), this, SLOT(handleInputMessages())); +} + +MIMOChannel::~MIMOChannel() +{ +} + +void MIMOChannel::handleInputMessages() +{ + Message* message; + + while ((message = m_inputMessageQueue.pop()) != 0) + { + if (handleMessage(*message)) { + delete message; + } + } +} diff --git a/sdrbase/dsp/mimochannel.h b/sdrbase/dsp/mimochannel.h new file mode 100644 index 000000000..48264e5dd --- /dev/null +++ b/sdrbase/dsp/mimochannel.h @@ -0,0 +1,51 @@ +/////////////////////////////////////////////////////////////////////////////////// +// Copyright (C) 2019 F4EXB // +// written by Edouard Griffiths // +// // +// 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 // +// (at your option) any later version. // +// // +// 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 . // +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef SDRBASE_MIMOCHANNEL_H +#define SDRBASE_MIMOCHANNEL_H + +#include + +#include "export.h" +#include "dsp/dsptypes.h" +#include "util/messagequeue.h" +#include "util/message.h" + + +class SDRBASE_API MIMOChannel : public QObject { + Q_OBJECT +public: + MIMOChannel(); + virtual ~MIMOChannel(); + + virtual void start() = 0; + virtual void stop() = 0; + virtual void feed(const SampleVector::const_iterator& begin, const SampleVector::const_iterator& end, unsigned int sinkIndex) = 0; + virtual void pull(Sample& sample, unsigned int sourceIndex) = 0; + virtual bool handleMessage(const Message& cmd) = 0; //!< Processing of a message. Returns true if message has actually been processed + + MessageQueue *getInputMessageQueue() { return &m_inputMessageQueue; } //!< Get the queue for asynchronous inbound communication + +protected: + MessageQueue m_inputMessageQueue; //!< Queue for asynchronous inbound communication + +protected slots: + void handleInputMessages(); +}; + +#endif // SDRBASE_MIMOCHANNEL_H \ No newline at end of file diff --git a/sdrbase/plugin/plugininterface.h b/sdrbase/plugin/plugininterface.h index 5f9337905..c94cd20b8 100644 --- a/sdrbase/plugin/plugininterface.h +++ b/sdrbase/plugin/plugininterface.h @@ -26,7 +26,7 @@ class DeviceSampleSink; class DeviceSampleMIMO; class BasebandSampleSink; class BasebandSampleSource; -class MIMOSampleSink; +class MIMOChannel; class ChannelAPI; class ChannelWebAPIAdapter; class DeviceWebAPIAdapter; @@ -137,14 +137,14 @@ public: virtual PluginInstanceGUI* createMIMOChannelGUI( DeviceUISet *deviceUISet, - MIMOSampleSink *mimoChannel) const + MIMOChannel *mimoChannel) const { (void) deviceUISet; (void) mimoChannel; return nullptr; } - virtual MIMOSampleSink* createMIMOChannelBS(DeviceAPI *deviceAPI) const + virtual MIMOChannel* createMIMOChannelBS(DeviceAPI *deviceAPI) const { (void) deviceAPI; return nullptr; diff --git a/sdrbase/plugin/pluginmanager.cpp b/sdrbase/plugin/pluginmanager.cpp index e04718162..ceafcbe98 100644 --- a/sdrbase/plugin/pluginmanager.cpp +++ b/sdrbase/plugin/pluginmanager.cpp @@ -263,7 +263,7 @@ void PluginManager::createMIMOChannelInstance(int channelPluginIndex, DeviceUISe if (channelPluginIndex < m_mimoChannelRegistrations.size()) { PluginInterface *pluginInterface = m_mimoChannelRegistrations[channelPluginIndex].m_plugin; - MIMOSampleSink *mimoChannel = pluginInterface->createMIMOChannelBS(deviceAPI); + MIMOChannel *mimoChannel = pluginInterface->createMIMOChannelBS(deviceAPI); pluginInterface->createMIMOChannelGUI(deviceUISet, mimoChannel); } }