mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-11-03 21:20:31 -05:00 
			
		
		
		
	Fallback of sample sink vector in test MI source and device MIMO engine
This commit is contained in:
		
							parent
							
								
									7a1fa085c5
								
							
						
					
					
						commit
						0a03c5d587
					
				@ -50,7 +50,9 @@ TestMI::TestMI(DeviceAPI *deviceAPI) :
 | 
			
		||||
	m_masterTimer(deviceAPI->getMasterTimer())
 | 
			
		||||
{
 | 
			
		||||
    m_mimoType = MIMOAsynchronous;
 | 
			
		||||
    m_sampleSinkFifos.resize(2);
 | 
			
		||||
    m_sampleSinkFifos.push_back(SampleSinkFifo(96000 * 4));
 | 
			
		||||
    m_sampleSinkFifos.push_back(SampleSinkFifo(96000 * 4));
 | 
			
		||||
    //m_sampleSinkVectors.resize(2);
 | 
			
		||||
    m_deviceAPI->setNbSourceStreams(2);
 | 
			
		||||
    m_networkManager = new QNetworkAccessManager();
 | 
			
		||||
    connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(networkManagerFinished(QNetworkReply*)));
 | 
			
		||||
 | 
			
		||||
@ -28,7 +28,7 @@
 | 
			
		||||
 | 
			
		||||
MESSAGE_CLASS_DEFINITION(TestMIThread::MsgStartStop, Message)
 | 
			
		||||
 | 
			
		||||
TestMIThread::TestMIThread(SampleSinkVector* sampleFifo, int streamIndex, QObject* parent) :
 | 
			
		||||
TestMIThread::TestMIThread(SampleSinkFifo* sampleFifo, int streamIndex, QObject* parent) :
 | 
			
		||||
	QThread(parent),
 | 
			
		||||
	m_running(false),
 | 
			
		||||
    m_buf(0),
 | 
			
		||||
 | 
			
		||||
@ -25,7 +25,6 @@
 | 
			
		||||
#include <QElapsedTimer>
 | 
			
		||||
#include <QDebug>
 | 
			
		||||
 | 
			
		||||
#include "dsp/samplesinkvector.h"
 | 
			
		||||
#include "dsp/decimators.h"
 | 
			
		||||
#include "dsp/ncof.h"
 | 
			
		||||
#include "util/message.h"
 | 
			
		||||
@ -35,6 +34,8 @@
 | 
			
		||||
 | 
			
		||||
#define TESTMI_THROTTLE_MS 50
 | 
			
		||||
 | 
			
		||||
class SampleSinkFifo;
 | 
			
		||||
 | 
			
		||||
class TestMIThread : public QThread {
 | 
			
		||||
	Q_OBJECT
 | 
			
		||||
 | 
			
		||||
@ -58,7 +59,7 @@ public:
 | 
			
		||||
        { }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
	TestMIThread(SampleSinkVector* sampleFifo, int streamIndex, QObject* parent = 0);
 | 
			
		||||
	TestMIThread(SampleSinkFifo* sampleFifo, int streamIndex, QObject* parent = 0);
 | 
			
		||||
	~TestMIThread();
 | 
			
		||||
 | 
			
		||||
    void startStop(bool start);
 | 
			
		||||
@ -89,7 +90,7 @@ private:
 | 
			
		||||
    quint32 m_bufsize;
 | 
			
		||||
    quint32 m_chunksize;
 | 
			
		||||
	SampleVector m_convertBuffer;
 | 
			
		||||
	SampleSinkVector* m_sampleFifo;
 | 
			
		||||
    SampleSinkFifo* m_sampleFifo;
 | 
			
		||||
    int m_streamIndex;
 | 
			
		||||
	NCOF m_nco;
 | 
			
		||||
    NCOF m_toneNco;
 | 
			
		||||
 | 
			
		||||
@ -52,7 +52,7 @@ SampleSourceFifo* DeviceSampleMIMO::getSampleSourceFifo(unsigned int index)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
SampleSinkVector* DeviceSampleMIMO::getSampleSinkFifo(unsigned int index)
 | 
			
		||||
SampleSinkFifo* DeviceSampleMIMO::getSampleSinkFifo(unsigned int index)
 | 
			
		||||
{
 | 
			
		||||
    if (index >= m_sampleSinkFifos.size()) {
 | 
			
		||||
        return nullptr;
 | 
			
		||||
@ -60,3 +60,12 @@ SampleSinkVector* DeviceSampleMIMO::getSampleSinkFifo(unsigned int index)
 | 
			
		||||
        return &m_sampleSinkFifos[index];
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
SampleSinkVector* DeviceSampleMIMO::getSampleSinkVector(unsigned int index)
 | 
			
		||||
{
 | 
			
		||||
    if (index >= m_sampleSinkVectors.size()) {
 | 
			
		||||
        return nullptr;
 | 
			
		||||
    } else {
 | 
			
		||||
        return &m_sampleSinkVectors[index];
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -22,6 +22,7 @@
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
#include "samplesourcefifo.h"
 | 
			
		||||
#include "samplesinkfifo.h"
 | 
			
		||||
#include "samplesinkvector.h"
 | 
			
		||||
#include "util/message.h"
 | 
			
		||||
#include "util/messagequeue.h"
 | 
			
		||||
@ -133,7 +134,8 @@ public:
 | 
			
		||||
    unsigned int getNbSourceFifos() const { return m_sampleSourceFifos.size(); } //!< Get the number of Tx FIFOs
 | 
			
		||||
    unsigned int getNbSinkFifos() const { return m_sampleSinkFifos.size(); }     //!< Get the number of Rx FIFOs
 | 
			
		||||
	SampleSourceFifo* getSampleSourceFifo(unsigned int index); //!< Get Tx FIFO at index
 | 
			
		||||
    SampleSinkVector* getSampleSinkFifo(unsigned int index);   //!< Get Rx FIFO at index
 | 
			
		||||
    SampleSinkFifo* getSampleSinkFifo(unsigned int index);   //!< Get Rx FIFO at index
 | 
			
		||||
    SampleSinkVector* getSampleSinkVector(unsigned int index); //!< Get Rx vector buffer at index (TODO: remove if not used)
 | 
			
		||||
    // Streams and FIFOs are in opposed source/sink type whick makes it confusing when stream direction is involved:
 | 
			
		||||
    //   Rx: source stream -> sink FIFO    -> channel sinks
 | 
			
		||||
    //   Tx: sink stream   <- source FIFO  <- channel sources
 | 
			
		||||
@ -146,7 +148,8 @@ protected slots:
 | 
			
		||||
protected:
 | 
			
		||||
    MIMOType m_mimoType;
 | 
			
		||||
    std::vector<SampleSourceFifo> m_sampleSourceFifos; //!< Tx FIFOs
 | 
			
		||||
    std::vector<SampleSinkVector> m_sampleSinkFifos;   //!< Rx FIFOs
 | 
			
		||||
    std::vector<SampleSinkFifo> m_sampleSinkFifos;   //!< Rx FIFOs
 | 
			
		||||
    std::vector<SampleSinkVector> m_sampleSinkVectors; //!< Rx vector buffer (TODO: remove if not used)
 | 
			
		||||
	MessageQueue m_inputMessageQueue; //!< Input queue to the sink
 | 
			
		||||
    MessageQueue *m_guiMessageQueue;  //!< Input message queue to the GUI
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@ -267,18 +267,59 @@ QString DSPDeviceMIMOEngine::deviceDescription()
 | 
			
		||||
	return cmd.getDeviceDescription();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void DSPDeviceMIMOEngine::workSampleSinkVector(unsigned int sinkIndex)
 | 
			
		||||
{
 | 
			
		||||
	SampleSinkVector* sampleFifo = m_deviceSampleMIMO->getSampleSinkVector(sinkIndex);
 | 
			
		||||
 | 
			
		||||
    if (!sampleFifo) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    SampleVector::iterator vbegin;
 | 
			
		||||
    SampleVector::iterator vend;
 | 
			
		||||
    sampleFifo->read(vbegin, vend);
 | 
			
		||||
 | 
			
		||||
    workSamplePart(vbegin, vend, sinkIndex);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void DSPDeviceMIMOEngine::workSampleSinkFifo(unsigned int sinkIndex)
 | 
			
		||||
{
 | 
			
		||||
    SampleSinkFifo* sampleFifo = m_deviceSampleMIMO->getSampleSinkFifo(sinkIndex);
 | 
			
		||||
    int samplesDone = 0;
 | 
			
		||||
 | 
			
		||||
    if (!sampleFifo) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    while ((sampleFifo->fill() > 0) && (m_inputMessageQueue.size() == 0) && (samplesDone < m_deviceSampleMIMO->getSourceSampleRate(sinkIndex)))
 | 
			
		||||
    {
 | 
			
		||||
		SampleVector::iterator part1begin;
 | 
			
		||||
		SampleVector::iterator part1end;
 | 
			
		||||
		SampleVector::iterator part2begin;
 | 
			
		||||
		SampleVector::iterator part2end;
 | 
			
		||||
 | 
			
		||||
        std::size_t count = sampleFifo->readBegin(sampleFifo->fill(), &part1begin, &part1end, &part2begin, &part2end);
 | 
			
		||||
 | 
			
		||||
        if (part1begin != part1end) { // first part of FIFO data
 | 
			
		||||
            workSamplePart(part1begin, part1end, sinkIndex);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (part2begin != part2end) { // second part of FIFO data (used when block wraps around)
 | 
			
		||||
            workSamplePart(part1begin, part1end, sinkIndex);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        sampleFifo->readCommit((unsigned int) count); // adjust FIFO pointers
 | 
			
		||||
        samplesDone += count;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Routes samples from device source FIFO to sink channels that are registered for the FIFO
 | 
			
		||||
 * Routes samples from source channels registered for the FIFO to the device sink FIFO
 | 
			
		||||
 */
 | 
			
		||||
void DSPDeviceMIMOEngine::workSampleSink(unsigned int sinkIndex)
 | 
			
		||||
void DSPDeviceMIMOEngine::workSamplePart(const SampleVector::iterator& vbegin, const SampleVector::iterator& vend, unsigned int sinkIndex)
 | 
			
		||||
{
 | 
			
		||||
	SampleSinkVector* sampleFifo = m_deviceSampleMIMO->getSampleSinkFifo(sinkIndex);
 | 
			
		||||
    SampleVector::iterator vbegin;
 | 
			
		||||
    SampleVector::iterator vend;
 | 
			
		||||
	bool positiveOnly = false;
 | 
			
		||||
    sampleFifo->read(vbegin, vend);
 | 
			
		||||
 | 
			
		||||
    // DC and IQ corrections
 | 
			
		||||
    if (m_sourcesCorrections[sinkIndex].m_dcOffsetCorrection) {
 | 
			
		||||
        iqCorrections(vbegin, vend, sinkIndex, m_sourcesCorrections[sinkIndex].m_iqImbalanceCorrection);
 | 
			
		||||
@ -558,9 +599,8 @@ void DSPDeviceMIMOEngine::handleDataRxSync()
 | 
			
		||||
{
 | 
			
		||||
	if (m_state == StRunning)
 | 
			
		||||
    {
 | 
			
		||||
        // Sources (move their samples into sinks)
 | 
			
		||||
        for (unsigned int isource = 0; isource < m_deviceSampleMIMO->getNbSourceStreams(); isource++) {
 | 
			
		||||
            workSampleSink(isource);
 | 
			
		||||
        for (unsigned int isink = 0; isink < m_deviceSampleMIMO->getNbSinkFifos(); isink++) {
 | 
			
		||||
            workSampleSinkFifo(isink);
 | 
			
		||||
        }
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@ -568,7 +608,7 @@ void DSPDeviceMIMOEngine::handleDataRxSync()
 | 
			
		||||
void DSPDeviceMIMOEngine::handleDataRxAsync(unsigned int sinkIndex)
 | 
			
		||||
{
 | 
			
		||||
	if (m_state == StRunning) {
 | 
			
		||||
		workSampleSink(sinkIndex);
 | 
			
		||||
		workSampleSinkFifo(sinkIndex);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -601,7 +641,7 @@ void DSPDeviceMIMOEngine::handleSetMIMO(DeviceSampleMIMO* mimo)
 | 
			
		||||
                qPrintable(mimo->getDeviceDescription()), isink);
 | 
			
		||||
            QObject::connect(
 | 
			
		||||
                m_deviceSampleMIMO->getSampleSinkFifo(isink),
 | 
			
		||||
                &SampleSinkVector::dataReady,
 | 
			
		||||
                &SampleSinkFifo::dataReady,
 | 
			
		||||
                this,
 | 
			
		||||
                [=](){ this->handleDataRxSync(); }, // lambda function is not strictly needed here
 | 
			
		||||
                Qt::QueuedConnection
 | 
			
		||||
@ -617,7 +657,7 @@ void DSPDeviceMIMOEngine::handleSetMIMO(DeviceSampleMIMO* mimo)
 | 
			
		||||
                qPrintable(mimo->getDeviceDescription()), isink);
 | 
			
		||||
            QObject::connect(
 | 
			
		||||
                m_deviceSampleMIMO->getSampleSinkFifo(isink),
 | 
			
		||||
                &SampleSinkVector::dataReady,
 | 
			
		||||
                &SampleSinkFifo::dataReady,
 | 
			
		||||
                this,
 | 
			
		||||
                [=](){ this->handleDataRxAsync(isink); },
 | 
			
		||||
                Qt::QueuedConnection
 | 
			
		||||
 | 
			
		||||
@ -379,7 +379,9 @@ private:
 | 
			
		||||
    unsigned int m_spectrumInputIndex;  //!< Index of the stream to be used as spectrum sink input
 | 
			
		||||
 | 
			
		||||
  	void run();
 | 
			
		||||
    void workSampleSink(unsigned int sinkIndex); //!< transfer samples of one sink (asynchronously)
 | 
			
		||||
    void workSampleSinkFifo(unsigned int sinkIndex); //!< transfer samples of one sink (asynchronously)
 | 
			
		||||
    void workSampleSinkVector(unsigned int sinkIndex); //!< same but sample sink vector flavor (TODO: remove if unused)
 | 
			
		||||
    void workSamplePart(const SampleVector::iterator& vbegin, const SampleVector::iterator& vend, unsigned int sinkIndex);
 | 
			
		||||
 | 
			
		||||
	State gotoIdle();     //!< Go to the idle state
 | 
			
		||||
	State gotoInit();     //!< Go to the acquisition init state from idle
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user