Added signals to SampleSinkFifo including samples timings. Implements #1143 and part of #1139

This commit is contained in:
f4exb 2022-03-15 22:21:06 +01:00
parent a1babc9706
commit 09599e145e
5 changed files with 60 additions and 2 deletions

View File

@ -100,6 +100,8 @@ bool RTLSDRInput::openDevice()
return false;
}
m_sampleFifo.setWrittenSignalRateDivider(32);
int device;
if ((device = rtlsdr_get_index_by_serial(qPrintable(m_deviceAPI->getSamplingDeviceSerial()))) < 0)

View File

@ -16,6 +16,7 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
#include "maincore.h"
#include "samplesinkfifo.h"
//#define MIN(x, y) (((x) < (y)) ? (x) : (y))
@ -42,6 +43,9 @@ void SampleSinkFifo::reset()
SampleSinkFifo::SampleSinkFifo(QObject* parent) :
QObject(parent),
m_data(),
m_total(0),
m_writtenSignalCount(0),
m_writtenSignalRateDivider(1),
m_mutex(QMutex::Recursive)
{
m_suppressed = -1;
@ -54,6 +58,9 @@ SampleSinkFifo::SampleSinkFifo(QObject* parent) :
SampleSinkFifo::SampleSinkFifo(int size, QObject* parent) :
QObject(parent),
m_data(),
m_total(0),
m_writtenSignalCount(0),
m_writtenSignalRateDivider(1),
m_mutex(QMutex::Recursive)
{
m_suppressed = -1;
@ -63,6 +70,9 @@ SampleSinkFifo::SampleSinkFifo(int size, QObject* parent) :
SampleSinkFifo::SampleSinkFifo(const SampleSinkFifo& other) :
QObject(other.parent()),
m_data(other.m_data),
m_total(0),
m_writtenSignalCount(0),
m_writtenSignalRateDivider(1),
m_mutex(QMutex::Recursive)
{
m_suppressed = -1;
@ -85,6 +95,12 @@ bool SampleSinkFifo::setSize(int size)
return m_data.size() == (unsigned int)size;
}
void SampleSinkFifo::setWrittenSignalRateDivider(unsigned int divider)
{
QMutexLocker mutexLocker(&m_mutex);
m_writtenSignalRateDivider = divider;
}
unsigned int SampleSinkFifo::write(const quint8* data, unsigned int count)
{
QMutexLocker mutexLocker(&m_mutex);
@ -108,6 +124,7 @@ unsigned int SampleSinkFifo::write(const quint8* data, unsigned int count)
m_suppressed = 0;
m_msgRateTimer.start();
qCritical("SampleSinkFifo::write: overflow - dropping %u samples", count - total);
emit overflow(count - total);
}
else
{
@ -115,6 +132,7 @@ unsigned int SampleSinkFifo::write(const quint8* data, unsigned int count)
{
qCritical("SampleSinkFifo::write: %u messages dropped", m_suppressed);
qCritical("SampleSinkFifo::write: overflow - dropping %u samples", count - total);
emit overflow(count - total);
m_suppressed = -1;
}
else
@ -141,6 +159,15 @@ unsigned int SampleSinkFifo::write(const quint8* data, unsigned int count)
emit dataReady();
}
m_total += total;
if (++m_writtenSignalCount >= m_writtenSignalRateDivider)
{
emit written(m_total, MainCore::instance()->getElapsedNsecs());
m_total = 0;
m_writtenSignalCount = 0;
}
return total;
}
@ -166,6 +193,7 @@ unsigned int SampleSinkFifo::write(SampleVector::const_iterator begin, SampleVec
m_suppressed = 0;
m_msgRateTimer.start();
qCritical("SampleSinkFifo::write: overflow - dropping %u samples", count - total);
emit overflow(count - total);
}
else
{
@ -173,6 +201,7 @@ unsigned int SampleSinkFifo::write(SampleVector::const_iterator begin, SampleVec
{
qCritical("SampleSinkFifo::write: %u messages dropped", m_suppressed);
qCritical("SampleSinkFifo::write: overflow - dropping %u samples", count - total);
emit overflow(count - total);
m_suppressed = -1;
}
else
@ -199,6 +228,15 @@ unsigned int SampleSinkFifo::write(SampleVector::const_iterator begin, SampleVec
emit dataReady();
}
m_total += total;
if (++m_writtenSignalCount >= m_writtenSignalRateDivider)
{
emit written(m_total, MainCore::instance()->getElapsedNsecs());
m_total = 0;
m_writtenSignalCount = 0;
}
return total;
}
@ -217,8 +255,10 @@ unsigned int SampleSinkFifo::read(SampleVector::iterator begin, SampleVector::it
total = std::min(count, m_fill);
if (total < count) {
if (total < count)
{
qCritical("SampleSinkFifo::read: underflow - missing %u samples", count - total);
emit underflow(count - total);
}
remaining = total;
@ -254,8 +294,10 @@ unsigned int SampleSinkFifo::readBegin(unsigned int count,
total = std::min(count, m_fill);
if (total < count) {
if (total < count)
{
qCritical("SampleSinkFifo::readBegin: underflow - missing %u samples", count - total);
emit underflow(count - total);
}
remaining = total;

View File

@ -32,6 +32,9 @@ private:
QElapsedTimer m_msgRateTimer;
int m_suppressed;
SampleVector m_data;
int m_total;
unsigned int m_writtenSignalCount;
unsigned int m_writtenSignalRateDivider;
QMutex m_mutex;
unsigned int m_size;
@ -49,6 +52,7 @@ public:
bool setSize(int size);
void reset();
void setWrittenSignalRateDivider(unsigned int divider);
inline unsigned int size() { QMutexLocker mutexLocker(&m_mutex); unsigned int size = m_size; return size; }
inline unsigned int fill() { QMutexLocker mutexLocker(&m_mutex); unsigned int fill = m_fill; return fill; }
@ -65,6 +69,9 @@ public:
signals:
void dataReady();
void written(int nsamples, qint64 timestamp);
void overflow(int nsamples);
void underflow(int nsamples);
};
#endif // INCLUDE_SAMPLEFIFO_H

View File

@ -62,6 +62,8 @@ MainCore::MainCore()
{
m_masterTimer.setTimerType(Qt::PreciseTimer);
m_masterTimer.start(50);
m_startMsecsSinceEpoch = QDateTime::currentMSecsSinceEpoch();
m_masterElapsedTimer.start();
}
MainCore::~MainCore()

View File

@ -22,6 +22,7 @@
#include <QMap>
#include <QTimer>
#include <QElapsedTimer>
#include <QDateTime>
#include <QObject>
@ -706,6 +707,8 @@ public:
static MainCore *instance();
const QTimer& getMasterTimer() const { return m_masterTimer; }
qint64 getElapsedNsecs() const { return m_masterElapsedTimer.nsecsElapsed(); } //!< Elapsed nanoseconds since main core construction
qint64 getStartMsecsSinceEpoch() const { return m_startMsecsSinceEpoch; } //!< Epoch timestamp in millisecodns close to elapsed timer start
const MainSettings& getSettings() const { return m_settings; }
MessageQueue *getMainMessageQueue() { return m_mainMessageQueue; }
const PluginManager *getPluginManager() const { return m_pluginManager; }
@ -760,6 +763,8 @@ private:
MessageQueue *m_mainMessageQueue;
int m_masterTabIndex;
QTimer m_masterTimer;
QElapsedTimer m_masterElapsedTimer;
qint64 m_startMsecsSinceEpoch;
std::vector<DeviceSet*> m_deviceSets;
std::vector<FeatureSet*> m_featureSets;
QMap<DeviceSet*, int> m_deviceSetsMap; //!< Device set instance to device set index map